Loop filter search resets on overlay frame.

This patch fixes a bug that causes the loop filter search to reset to
a low value or zero after each arf overlay frame. We expect the overlay
frames to need little or no loop filtering but this should not propagate.

Change-Id: I895b28474cf200f20d82793f3de40b60b19579fd
This commit is contained in:
paulwilkins 2016-01-18 15:31:42 +00:00
Родитель c0307e6cea
Коммит 733bbab53a
3 изменённых файлов: 18 добавлений и 5 удалений

Просмотреть файл

@ -69,6 +69,7 @@ typedef struct {
struct loopfilter { struct loopfilter {
int filter_level; int filter_level;
int last_filt_level;
int sharpness_level; int sharpness_level;
int last_sharpness_level; int last_sharpness_level;

Просмотреть файл

@ -2822,6 +2822,7 @@ static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) {
if (xd->lossless) { if (xd->lossless) {
lf->filter_level = 0; lf->filter_level = 0;
lf->last_filt_level = 0;
} else { } else {
struct vpx_usec_timer timer; struct vpx_usec_timer timer;
@ -2829,7 +2830,16 @@ static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) {
vpx_usec_timer_start(&timer); vpx_usec_timer_start(&timer);
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); 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); vpx_usec_timer_mark(&timer);
cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer); cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
@ -3022,7 +3032,7 @@ static void output_frame_level_debug_stats(VP9_COMP *cpi) {
"%7.2lf %7.2lf %7.2lf %7.2lf %7.2lf" "%7.2lf %7.2lf %7.2lf %7.2lf %7.2lf"
"%6d %6d %5d %5d %5d " "%6d %6d %5d %5d %5d "
"%10"PRId64" %10.3lf" "%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, cpi->common.current_video_frame,
cm->width, cm->height, cm->width, cm->height,
cpi->td.rd_counts.m_search_count, cpi->td.rd_counts.m_search_count,
@ -3054,7 +3064,8 @@ static void output_frame_level_debug_stats(VP9_COMP *cpi) {
(1 + cpi->twopass.total_left_stats.coded_error), (1 + cpi->twopass.total_left_stats.coded_error),
cpi->tot_recode_hits, recon_err, cpi->rc.kf_boost, cpi->tot_recode_hits, recon_err, cpi->rc.kf_boost,
cpi->twopass.kf_zeromotion_pct, cpi->twopass.kf_zeromotion_pct,
cpi->twopass.fr_content_type); cpi->twopass.fr_content_type,
cm->lf.filter_level);
fclose(f); fclose(f);
@ -4312,7 +4323,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; cpi->svc.layer_context[cpi->svc.spatial_layer_id].has_alt_frame = 1;
#endif #endif
if (oxcf->arnr_max_frames > 0) { if ((oxcf->arnr_max_frames > 0) && (oxcf->arnr_strength > 0)) {
// Produce the filtered ARF frame. // Produce the filtered ARF frame.
vp9_temporal_filter(cpi, arf_src_index); vp9_temporal_filter(cpi, arf_src_index);
vpx_extend_frame_borders(&cpi->alt_ref_buffer); vpx_extend_frame_borders(&cpi->alt_ref_buffer);

Просмотреть файл

@ -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 // Start the search at the previous frame filter level unless it is now out of
// range. // 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; int filter_step = filt_mid < 16 ? 4 : filt_mid / 4;
// Sum squared error at each filter level // Sum squared error at each filter level
int64_t ss_err[MAX_LOOP_FILTER + 1]; int64_t ss_err[MAX_LOOP_FILTER + 1];