diff options
Diffstat (limited to 'vp9')
-rw-r--r-- | vp9/common/vp9_loopfilter.h | 1 | ||||
-rw-r--r-- | vp9/encoder/vp9_encoder.c | 19 | ||||
-rw-r--r-- | vp9/encoder/vp9_mcomp.c | 9 | ||||
-rw-r--r-- | vp9/encoder/vp9_picklpf.c | 3 |
4 files changed, 24 insertions, 8 deletions
diff --git a/vp9/common/vp9_loopfilter.h b/vp9/common/vp9_loopfilter.h index b2893a451..fca8830fa 100644 --- a/vp9/common/vp9_loopfilter.h +++ b/vp9/common/vp9_loopfilter.h @@ -69,6 +69,7 @@ typedef struct { struct loopfilter { int filter_level; + int last_filt_level; int sharpness_level; int last_sharpness_level; diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 5341c9444..1d081fdd4 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -2823,6 +2823,7 @@ static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) { if (xd->lossless) { lf->filter_level = 0; + lf->last_filt_level = 0; } else { struct vpx_usec_timer timer; @@ -2830,7 +2831,16 @@ static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) { vpx_usec_timer_start(&timer); - vp9_pick_filter_level(cpi->Source, cpi, cpi->sf.lpf_pick); + if (!cpi->rc.is_src_frame_alt_ref) { + if ((cpi->common.frame_type == KEY_FRAME) && + (!cpi->rc.this_key_frame_forced)) { + lf->last_filt_level = 0; + } + vp9_pick_filter_level(cpi->Source, cpi, cpi->sf.lpf_pick); + lf->last_filt_level = lf->filter_level; + } else { + lf->filter_level = 0; + } vpx_usec_timer_mark(&timer); cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer); @@ -3023,7 +3033,7 @@ static void output_frame_level_debug_stats(VP9_COMP *cpi) { "%7.2lf %7.2lf %7.2lf %7.2lf %7.2lf" "%6d %6d %5d %5d %5d " "%10"PRId64" %10.3lf" - "%10lf %8u %10"PRId64" %10d %10d %10d\n", + "%10lf %8u %10"PRId64" %10d %10d %10d %10d\n", cpi->common.current_video_frame, cm->width, cm->height, cpi->td.rd_counts.m_search_count, @@ -3055,7 +3065,8 @@ static void output_frame_level_debug_stats(VP9_COMP *cpi) { (1 + cpi->twopass.total_left_stats.coded_error), cpi->tot_recode_hits, recon_err, cpi->rc.kf_boost, cpi->twopass.kf_zeromotion_pct, - cpi->twopass.fr_content_type); + cpi->twopass.fr_content_type, + cm->lf.filter_level); fclose(f); @@ -4326,7 +4337,7 @@ int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags, cpi->svc.layer_context[cpi->svc.spatial_layer_id].has_alt_frame = 1; #endif - if (oxcf->arnr_max_frames > 0) { + if ((oxcf->arnr_max_frames > 0) && (oxcf->arnr_strength > 0)) { // Produce the filtered ARF frame. vp9_temporal_filter(cpi, arf_src_index); vpx_extend_frame_borders(&cpi->alt_ref_buffer); diff --git a/vp9/encoder/vp9_mcomp.c b/vp9/encoder/vp9_mcomp.c index 84ef1b43e..4004dd3db 100644 --- a/vp9/encoder/vp9_mcomp.c +++ b/vp9/encoder/vp9_mcomp.c @@ -86,7 +86,9 @@ static int mv_err_cost(const MV *mv, const MV *ref, if (mvcost) { const MV diff = { mv->row - ref->row, mv->col - ref->col }; - return ROUND_POWER_OF_TWO(mv_cost(&diff, mvjcost, mvcost) * + // TODO(aconverse): See if this shift needs to be tied to + // VP9_PROB_COST_SHIFT. + return ROUND_POWER_OF_TWO((unsigned)mv_cost(&diff, mvjcost, mvcost) * error_per_bit, 13); } return 0; @@ -96,8 +98,9 @@ static int mvsad_err_cost(const MACROBLOCK *x, const MV *mv, const MV *ref, int error_per_bit) { const MV diff = { mv->row - ref->row, mv->col - ref->col }; - return ROUND_POWER_OF_TWO(mv_cost(&diff, x->nmvjointsadcost, - x->nmvsadcost) * error_per_bit, 8); + // TODO(aconverse): See if this shift needs to be tied to VP9_PROB_COST_SHIFT. + return ROUND_POWER_OF_TWO((unsigned)mv_cost(&diff, x->nmvjointsadcost, + x->nmvsadcost) * error_per_bit, 8); } void vp9_init_dsmotion_compensation(search_site_config *cfg, int stride) { diff --git a/vp9/encoder/vp9_picklpf.c b/vp9/encoder/vp9_picklpf.c index 5444bc89f..f6b1dfcd5 100644 --- a/vp9/encoder/vp9_picklpf.c +++ b/vp9/encoder/vp9_picklpf.c @@ -78,7 +78,8 @@ static int search_filter_level(const YV12_BUFFER_CONFIG *sd, VP9_COMP *cpi, // Start the search at the previous frame filter level unless it is now out of // range. - int filt_mid = clamp(lf->filter_level, min_filter_level, max_filter_level); + int filt_mid = + clamp(lf->last_filt_level, min_filter_level, max_filter_level); int filter_step = filt_mid < 16 ? 4 : filt_mid / 4; // Sum squared error at each filter level int64_t ss_err[MAX_LOOP_FILTER + 1]; |