}
vp8_initialize_rd_consts(cpi, vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q));
- //vp8_initialize_rd_consts( cpi, vp8_dc_quant(cpi->avg_frame_qindex, cm->y1dc_delta_q) );
vp8cx_initialize_me_consts(cpi, cm->base_qindex);
- //vp8cx_initialize_me_consts( cpi, cpi->avg_frame_qindex);
// Copy data over into macro block data sturctures.
// what level of boost is appropriate for the GF or ARF that will be coded with the group
i = 0;
- while (((i < cpi->max_gf_interval) || ((cpi->frames_to_key - i) < MIN_GF_INTERVAL)) && (i < cpi->frames_to_key))
+ while (((i < cpi->static_scene_max_gf_interval) || ((cpi->frames_to_key - i) < MIN_GF_INTERVAL)) && (i < cpi->frames_to_key))
{
double r;
double this_frame_mvr_ratio;
boost_score += (decay_accumulator * r);
// Break out conditions.
- if ( /* i>4 || */
+ if ( /* i>4 || */
+ // Break at cpi->max_gf_interval unless almost totally static
+ (i >= cpi->max_gf_interval && (loop_decay_rate < 0.99)) ||
(
- (i > MIN_GF_INTERVAL) && // Dont break out with a very short interval
- ((cpi->frames_to_key - i) >= MIN_GF_INTERVAL) && // Dont break out very close to a key frame
+ // Dont break out with a very short interval
+ (i > MIN_GF_INTERVAL) &&
+ // Dont break out very close to a key frame
+ ((cpi->frames_to_key - i) >= MIN_GF_INTERVAL) &&
((boost_score > 20.0) || (next_frame.pcnt_inter < 0.75)) &&
((mv_ratio_accumulator > 100.0) ||
(abs_mv_in_out_accumulator > 3.0) ||
(mv_in_out_accumulator < -2.0) ||
- ((boost_score - old_boost_score) < 2.0)
- )
- )
- )
+ ((boost_score - old_boost_score) < 2.0))
+ ) )
{
boost_score = old_boost_score;
break;
cpi->per_frame_bandwidth = (int)(cpi->oxcf.target_bandwidth / cpi->output_frame_rate);
cpi->av_per_frame_bandwidth = (int)(cpi->oxcf.target_bandwidth / cpi->output_frame_rate);
cpi->min_frame_bandwidth = (int)(cpi->av_per_frame_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100);
- cpi->max_gf_interval = (int)(cpi->output_frame_rate / 2) + 2;
- //cpi->max_gf_interval = (int)(cpi->output_frame_rate * 2 / 3) + 1;
- //cpi->max_gf_interval = 24;
+ // Set Maximum gf/arf interval
+ cpi->max_gf_interval = max(((int)(cpi->output_frame_rate / 2.0) + 2), 12);
- if (cpi->max_gf_interval < 12)
- cpi->max_gf_interval = 12;
+ // Extended interval for genuinely static scenes
+ cpi->static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
-
- // Special conditions when altr ref frame enabled in lagged compress mode
+ // Special conditions when altr ref frame enabled in lagged compress mode
if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames)
{
if (cpi->max_gf_interval > cpi->oxcf.lag_in_frames - 1)
cpi->max_gf_interval = cpi->oxcf.lag_in_frames - 1;
+
+ if (cpi->static_scene_max_gf_interval > cpi->oxcf.lag_in_frames - 1)
+ cpi->static_scene_max_gf_interval = cpi->oxcf.lag_in_frames - 1;
}
+
+ if ( cpi->max_gf_interval > cpi->static_scene_max_gf_interval )
+ cpi->max_gf_interval = cpi->static_scene_max_gf_interval;
}
else if (cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame)
{
- if (cpi->avg_frame_qindex < cpi->active_worst_quality)
+ // Use the lower of cpi->active_worst_quality and recent
+ // average Q as basis for GF/ARF Q limit unless last frame was
+ // a key frame.
+ if ( (cpi->frames_since_key > 1) &&
+ (cpi->avg_frame_qindex < cpi->active_worst_quality) )
+ {
Q = cpi->avg_frame_qindex;
+ if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
+ (Q < cpi->oxcf.cq_level) )
+ {
+ Q = cpi->oxcf.cq_level;
+ }
+ }
+
if ( cpi->pass == 2 )
{
if ( cpi->gfu_boost > 1000 )
}
// Keep a record of ambient average Q.
- if (cm->frame_type == KEY_FRAME)
- cpi->avg_frame_qindex = cm->base_qindex;
- else
+ if (cm->frame_type != KEY_FRAME)
cpi->avg_frame_qindex = (2 + 3 * cpi->avg_frame_qindex + cm->base_qindex) >> 2;
// Keep a record from which we can calculate the average Q excluding GF updates and key frames