Merge "Change rc undershoot/overshoot semantics"

This commit is contained in:
John Koleszar 2011-04-25 10:49:32 -07:00 коммит произвёл Code Review
Родитель ef86bad0d1 c99f9d7abf
Коммит cfbfd39de8
4 изменённых файлов: 52 добавлений и 42 удалений

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

@ -140,8 +140,9 @@ extern "C"
int end_usage; // vbr or cbr
// shoot to keep buffer full at all times by undershooting a bit 95 recommended
// buffer targeting aggressiveness
int under_shoot_pct;
int over_shoot_pct;
// buffering parameters
int starting_buffer_level; // in seconds

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

@ -817,11 +817,6 @@ void vp8_calc_pframe_target_size(VP8_COMP *cpi)
}
}
// Set a reduced data rate target for our initial Q calculation.
// This should help to save bits during earier sections.
if ((cpi->oxcf.under_shoot_pct > 0) && (cpi->oxcf.under_shoot_pct <= 100))
cpi->this_frame_target = (cpi->this_frame_target * cpi->oxcf.under_shoot_pct) / 100;
// Sanity check that the total sum of adjustments is not above the maximum allowed
// That is that having allowed for KF and GF penalties we have not pushed the
// current interframe target to low. If the adjustment we apply here is not capable of recovering
@ -858,11 +853,6 @@ void vp8_calc_pframe_target_size(VP8_COMP *cpi)
percent_low =
(cpi->oxcf.optimal_buffer_level - cpi->buffer_level) /
one_percent_bits;
if (percent_low > 100)
percent_low = 100;
else if (percent_low < 0)
percent_low = 0;
}
// Are we overshooting the long term clip data rate...
else if (cpi->bits_off_target < 0)
@ -870,16 +860,16 @@ void vp8_calc_pframe_target_size(VP8_COMP *cpi)
// Adjust per frame data target downwards to compensate.
percent_low = (int)(100 * -cpi->bits_off_target /
(cpi->total_byte_count * 8));
if (percent_low > 100)
percent_low = 100;
else if (percent_low < 0)
percent_low = 0;
}
if (percent_low > cpi->oxcf.under_shoot_pct)
percent_low = cpi->oxcf.under_shoot_pct;
else if (percent_low < 0)
percent_low = 0;
// lower the target bandwidth for this frame.
cpi->this_frame_target =
(cpi->this_frame_target * (100 - (percent_low / 2))) / 100;
cpi->this_frame_target -= (cpi->this_frame_target * percent_low)
/ 200;
// Are we using allowing control of active_worst_allowed_q
// according to buffer level.
@ -950,20 +940,29 @@ void vp8_calc_pframe_target_size(VP8_COMP *cpi)
}
else
{
int percent_high;
int percent_high = 0;
if (cpi->bits_off_target > cpi->oxcf.optimal_buffer_level)
if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
&& (cpi->buffer_level > cpi->oxcf.optimal_buffer_level))
{
percent_high = (int)(100 * (cpi->bits_off_target - cpi->oxcf.optimal_buffer_level) / (cpi->total_byte_count * 8));
if (percent_high > 100)
percent_high = 100;
else if (percent_high < 0)
percent_high = 0;
cpi->this_frame_target = (cpi->this_frame_target * (100 + (percent_high / 2))) / 100;
percent_high = (cpi->buffer_level
- cpi->oxcf.optimal_buffer_level)
/ one_percent_bits;
}
else if (cpi->bits_off_target > cpi->oxcf.optimal_buffer_level)
{
percent_high = (int)((100 * cpi->bits_off_target)
/ (cpi->total_byte_count * 8));
}
if (percent_high > cpi->oxcf.over_shoot_pct)
percent_high = cpi->oxcf.over_shoot_pct;
else if (percent_high < 0)
percent_high = 0;
cpi->this_frame_target += (cpi->this_frame_target *
percent_high) / 200;
// Are we allowing control of active_worst_allowed_q according to bufferl level.
if (cpi->auto_worst_q)
@ -1538,7 +1537,7 @@ void vp8_adjust_key_frame_context(VP8_COMP *cpi)
cpi->key_frame_count++;
}
void vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit, int *frame_over_shoot_limit)
void vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit, int *frame_over_shoot_limit)
{
// Set-up bounds on acceptable frame size:

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

@ -151,7 +151,8 @@ static vpx_codec_err_t validate_config(vpx_codec_alg_priv_t *ctx,
RANGE_CHECK_HI(cfg, g_lag_in_frames, 0);
#endif
RANGE_CHECK(cfg, rc_end_usage, VPX_VBR, VPX_CQ);
RANGE_CHECK_HI(cfg, rc_undershoot_pct, 100);
RANGE_CHECK_HI(cfg, rc_undershoot_pct, 1000);
RANGE_CHECK_HI(cfg, rc_overshoot_pct, 1000);
RANGE_CHECK_HI(cfg, rc_2pass_vbr_bias_pct, 100);
RANGE_CHECK(cfg, kf_mode, VPX_KF_DISABLED, VPX_KF_AUTO);
//RANGE_CHECK_BOOL(cfg, g_delete_firstpassfile);
@ -312,7 +313,7 @@ static vpx_codec_err_t set_vp8e_config(VP8_CONFIG *oxcf,
oxcf->fixed_q = -1;
oxcf->under_shoot_pct = cfg.rc_undershoot_pct;
//oxcf->over_shoot_pct = cfg.rc_overshoot_pct;
oxcf->over_shoot_pct = cfg.rc_overshoot_pct;
oxcf->maximum_buffer_size = cfg.rc_buf_sz;
oxcf->starting_buffer_level = cfg.rc_buf_initial_sz;
@ -358,6 +359,7 @@ static vpx_codec_err_t set_vp8e_config(VP8_CONFIG *oxcf,
printf("key_freq: %d\n", oxcf->key_freq);
printf("end_usage: %d\n", oxcf->end_usage);
printf("under_shoot_pct: %d\n", oxcf->under_shoot_pct);
printf("over_shoot_pct: %d\n", oxcf->over_shoot_pct);
printf("starting_buffer_level: %d\n", oxcf->starting_buffer_level);
printf("optimal_buffer_level: %d\n", oxcf->optimal_buffer_level);
printf("maximum_buffer_size: %d\n", oxcf->maximum_buffer_size);
@ -1087,8 +1089,8 @@ static vpx_codec_enc_cfg_map_t vp8e_usage_cfg_map[] =
0, /* rc_max_intra_bitrate_pct */
4, /* rc_min_quantizer */
63, /* rc_max_quantizer */
95, /* rc_undershoot_pct */
200, /* rc_overshoot_pct */
100, /* rc_undershoot_pct */
100, /* rc_overshoot_pct */
6000, /* rc_max_buffer_size */
4000, /* rc_buffer_initial_size; */

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

@ -445,20 +445,28 @@ extern "C" {
*/
/*!\brief Rate control undershoot tolerance
/*!\brief Rate control adaptation undershoot control
*
* This value, expressed as a percentage of the target bitrate, describes
* the target bitrate for easier frames, allowing bits to be saved for
* harder frames. Set to zero to use the codec default.
* This value, expressed as a percentage of the target bitrate,
* controls the maximum allowed adaptation speed of the codec.
* This factor controls the maximum amount of bits that can
* be subtracted from the target bitrate in order to compensate
* for prior overshoot.
*
* Valid values in the range 0-1000.
*/
unsigned int rc_undershoot_pct;
/*!\brief Rate control overshoot tolerance
/*!\brief Rate control adaptation overshoot control
*
* This value, expressed as a percentage of the target bitrate, describes
* the maximum allowed bitrate for a given frame. Set to zero to use the
* codec default.
* This value, expressed as a percentage of the target bitrate,
* controls the maximum allowed adaptation speed of the codec.
* This factor controls the maximum amount of bits that can
* be added to the target bitrate in order to compensate for
* prior undershoot.
*
* Valid values in the range 0-1000.
*/
unsigned int rc_overshoot_pct;