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
This commit is contained in:
Paul Wilkins 2011-01-13 12:45:00 +00:00
parent 55acda98f7
commit eda7d538bf

View File

@ -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;
}
}
}