From eda7d538bf0dbc73bd39c29cc2922497997334a3 Mon Sep 17 00:00:00 2001 From: Paul Wilkins Date: Thu, 13 Jan 2011 12:45:00 +0000 Subject: [PATCH] One pass rate control correction. Fixed discrepancy cpi->ni_frames vs cm->current_video_frame > 150. Make one pass path explicit. There is still scope for some odd behaviour around the transition point at cpi->ni_frames > 150. Change-Id: Icdee130fe6e2a832206d30e45bf65963edd7a74d --- vp8/encoder/onyx_if.c | 68 ++++++++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index 65925d9f..470a9ac8 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -3793,49 +3793,56 @@ static void encode_frame_to_data_rate } // Set an active best quality and if necessary active worst quality - if (cpi->pass == 2 || (cm->current_video_frame > 150)) + // There is some odd behaviour for one pass here that needs attention. + if ( (cpi->pass == 2) || (cpi->ni_frames > 150)) { - int Q; - //int tmp; - vp8_clear_system_state(); Q = cpi->active_worst_quality; - if ((cm->frame_type == KEY_FRAME) || cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame) + if ( cm->frame_type == KEY_FRAME ) { - if (cm->frame_type != KEY_FRAME) + // 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 minimize the risk + // of popping + if ( cpi->this_key_frame_forced ) { - if (cpi->avg_frame_qindex < cpi->active_worst_quality) - Q = cpi->avg_frame_qindex; + cpi->active_worst_quality = cpi->avg_frame_qindex * 7/8; + cpi->active_best_quality = cpi->avg_frame_qindex * 2/3; + } + else + { + if ( cpi->pass == 2 ) + { + if (cpi->gfu_boost > 600) + cpi->active_best_quality = kf_low_motion_minq[Q]; + else + cpi->active_best_quality = kf_high_motion_minq[Q]; + } + // One pass more conservative + else + cpi->active_best_quality = kf_high_motion_minq[Q]; + } + } - if ( cpi->gfu_boost > 1000 ) + else if (cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame) + { + if (cpi->avg_frame_qindex < cpi->active_worst_quality) + Q = cpi->avg_frame_qindex; + + if ( cpi->pass == 2 ) + { + if ( cpi->gfu_boost > 1000 ) cpi->active_best_quality = gf_low_motion_minq[Q]; else if ( cpi->gfu_boost < 400 ) cpi->active_best_quality = gf_high_motion_minq[Q]; else cpi->active_best_quality = gf_mid_motion_minq[Q]; - } - // KEY FRAMES - else - { - // 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]; - } - } + } + // One pass more conservative + else + cpi->active_best_quality = gf_high_motion_minq[Q]; } else { @@ -3865,7 +3872,6 @@ static void encode_frame_to_data_rate cpi->active_best_quality -= min_qadjustment; } - } } -- 2.11.4.GIT