Merge "Change rc undershoot/overshoot semantics"
This commit is contained in:
Коммит
cfbfd39de8
|
@ -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;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче