From 55acda98f7f9d4e745e8b6ab02848d6da015b65b Mon Sep 17 00:00:00 2001 From: Paul Wilkins Date: Wed, 12 Jan 2011 17:08:42 +0000 Subject: [PATCH] Limit key frame quantizer for forced key frames. Where a key frame occurs because of a minimum interval selected by the user, then these forced key frames ideally need to be more closely matched in quality to the surrounding frame. Change-Id: Ia55b1f047e77dc7fbd78379c45869554f25b3df7 --- vp8/encoder/firstpass.c | 11 +++++++++-- vp8/encoder/onyx_if.c | 22 ++++++++++++++++++---- vp8/encoder/onyx_int.h | 3 ++- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/vp8/encoder/firstpass.c b/vp8/encoder/firstpass.c index 75502ccc9..c59613838 100644 --- a/vp8/encoder/firstpass.c +++ b/vp8/encoder/firstpass.c @@ -980,10 +980,10 @@ static int estimate_max_q(VP8_COMP *cpi, double section_err, int section_target_ // Restriction on active max q for constrained quality mode. if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) && (Q < cpi->cq_target_quality) ) - //(Q < cpi->oxcf.cq_target_quality) ) + //(Q < cpi->oxcf.cq_level;) ) { Q = cpi->cq_target_quality; - //Q = cpi->oxcf.cq_target_quality; + //Q = cpi->oxcf.cq_level; } // Adjust maxq_min_limit and maxq_max_limit limits based on @@ -2286,6 +2286,9 @@ void vp8_find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) cpi->common.frame_type = KEY_FRAME; + // is this a forced key frame by interval + cpi->this_key_frame_forced = cpi->next_key_frame_forced; + // Clear the alt ref active flag as this can never be active on a key frame cpi->source_alt_ref_active = FALSE; @@ -2348,7 +2351,11 @@ void vp8_find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) kf_group_err /= 2.0; kf_group_intra_err /= 2.0; kf_group_coded_err /= 2.0; + + cpi->next_key_frame_forced = TRUE; } + else + cpi->next_key_frame_forced = FALSE; // Special case for the last frame of the file if (cpi->stats_in >= cpi->stats_in_end) diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index 1284a2aa8..65925d9f9 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -2272,6 +2272,8 @@ VP8_PTR vp8_create_compressor(VP8_CONFIG *oxcf) cpi->frames_since_key = 8; // Give a sensible default for the first frame. cpi->key_frame_frequency = cpi->oxcf.key_freq; + cpi->this_key_frame_forced = FALSE; + cpi->next_key_frame_forced = FALSE; cpi->source_alt_ref_pending = FALSE; cpi->source_alt_ref_active = FALSE; @@ -3817,10 +3819,22 @@ static void encode_frame_to_data_rate // KEY FRAMES else { - if (cpi->gfu_boost > 600) - cpi->active_best_quality = kf_low_motion_minq[Q]; - else - cpi->active_best_quality = kf_high_motion_minq[Q]; + // Special case for key frames forced because we have reached + // the maximum key frame interval. Here force the Q to a range + // close to but just below the ambient Q to reduce the risk + // of popping + if ( cpi->this_key_frame_forced ) + { + cpi->active_worst_quality = cpi->avg_frame_qindex * 7/8; + cpi->active_best_quality = cpi->avg_frame_qindex * 2/3; + } + else + { + if (cpi->gfu_boost > 600) + cpi->active_best_quality = kf_low_motion_minq[Q]; + else + cpi->active_best_quality = kf_high_motion_minq[Q]; + } } } else diff --git a/vp8/encoder/onyx_int.h b/vp8/encoder/onyx_int.h index 6bffd982f..6b07e2f22 100644 --- a/vp8/encoder/onyx_int.h +++ b/vp8/encoder/onyx_int.h @@ -317,7 +317,8 @@ typedef struct unsigned int frames_since_key; unsigned int key_frame_frequency; - unsigned int next_key; + unsigned int this_key_frame_forced; + unsigned int next_key_frame_forced; unsigned int mode_check_freq[MAX_MODES]; unsigned int mode_test_hit_counts[MAX_MODES]; -- 2.40.0