diff options
author | Dmitry Kovalev <dkovalev@google.com> | 2014-08-19 11:23:33 -0700 |
---|---|---|
committer | Dmitry Kovalev <dkovalev@google.com> | 2014-08-19 11:33:36 -0700 |
commit | 87ee09611798a85bcb604efac37b13984baac995 (patch) | |
tree | dd13ee82ffa2fc76b21903f28ca064a5697c1763 | |
parent | 86533dc72dc40cea88b47e2db5cbe99ce3987bce (diff) | |
download | libvpx-87ee09611798a85bcb604efac37b13984baac995.tar libvpx-87ee09611798a85bcb604efac37b13984baac995.tar.gz libvpx-87ee09611798a85bcb604efac37b13984baac995.tar.bz2 libvpx-87ee09611798a85bcb604efac37b13984baac995.zip |
Adding set_rc_buffer_sizes().
Change-Id: I76aab1e4f56a790597104b5c9b0d3543d6982eae
-rw-r--r-- | vp9/encoder/vp9_encoder.c | 36 | ||||
-rw-r--r-- | vp9/vp9_cx_iface.c | 7 |
2 files changed, 19 insertions, 24 deletions
diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 60f20c12d..445608a3d 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -541,6 +541,20 @@ static void init_config(struct VP9_COMP *cpi, VP9EncoderConfig *oxcf) { set_tile_limits(cpi); } +static void set_rc_buffer_sizes(RATE_CONTROL *rc, + const VP9EncoderConfig *oxcf) { + const int64_t bandwidth = oxcf->target_bandwidth; + const int64_t starting = oxcf->starting_buffer_level_ms; + const int64_t optimal = oxcf->optimal_buffer_level_ms; + const int64_t maximum = oxcf->maximum_buffer_size_ms; + + rc->starting_buffer_level = starting * bandwidth / 1000; + rc->optimal_buffer_level = (optimal == 0) ? bandwidth / 8 + : optimal * bandwidth / 1000; + rc->maximum_buffer_size = (maximum == 0) ? bandwidth / 8 + : maximum * bandwidth / 1000; +} + void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) { VP9_COMMON *const cm = &cpi->common; RATE_CONTROL *const rc = &cpi->rc; @@ -574,28 +588,8 @@ void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) { } cpi->encode_breakout = cpi->oxcf.encode_breakout; - // local file playback mode == really big buffer - if (cpi->oxcf.rc_mode == VPX_VBR) { - cpi->oxcf.starting_buffer_level_ms = 60000; - cpi->oxcf.optimal_buffer_level_ms = 60000; - cpi->oxcf.maximum_buffer_size_ms = 240000; - } - - rc->starting_buffer_level = cpi->oxcf.starting_buffer_level_ms * - cpi->oxcf.target_bandwidth / 1000; - - // Set or reset optimal and maximum buffer levels. - if (cpi->oxcf.optimal_buffer_level_ms == 0) - rc->optimal_buffer_level = cpi->oxcf.target_bandwidth / 8; - else - rc->optimal_buffer_level = cpi->oxcf.optimal_buffer_level_ms * - cpi->oxcf.target_bandwidth / 1000; + set_rc_buffer_sizes(rc, &cpi->oxcf); - if (cpi->oxcf.maximum_buffer_size_ms == 0) - rc->maximum_buffer_size = cpi->oxcf.target_bandwidth / 8; - else - rc->maximum_buffer_size = cpi->oxcf.maximum_buffer_size_ms * - cpi->oxcf.target_bandwidth / 1000; // Under a configuration change, where maximum_buffer_size may change, // keep buffer level clipped to the maximum allowed buffer size. rc->bits_off_target = MIN(rc->bits_off_target, rc->maximum_buffer_size); diff --git a/vp9/vp9_cx_iface.c b/vp9/vp9_cx_iface.c index cdbb69b2d..553fec731 100644 --- a/vp9/vp9_cx_iface.c +++ b/vp9/vp9_cx_iface.c @@ -325,6 +325,7 @@ static vpx_codec_err_t set_encoder_config( VP9EncoderConfig *oxcf, const vpx_codec_enc_cfg_t *cfg, const struct vp9_extracfg *extra_cfg) { + const int is_vbr = cfg->rc_end_usage == VPX_VBR; oxcf->profile = cfg->g_profile; oxcf->width = cfg->g_w; oxcf->height = cfg->g_h; @@ -371,9 +372,9 @@ static vpx_codec_err_t set_encoder_config( oxcf->scaled_frame_width = cfg->rc_scaled_width; oxcf->scaled_frame_height = cfg->rc_scaled_height; - oxcf->maximum_buffer_size_ms = cfg->rc_buf_sz; - oxcf->starting_buffer_level_ms = cfg->rc_buf_initial_sz; - oxcf->optimal_buffer_level_ms = cfg->rc_buf_optimal_sz; + oxcf->maximum_buffer_size_ms = is_vbr ? 240000 : cfg->rc_buf_sz; + oxcf->starting_buffer_level_ms = is_vbr ? 60000 : cfg->rc_buf_initial_sz; + oxcf->optimal_buffer_level_ms = is_vbr ? 60000 : cfg->rc_buf_optimal_sz; oxcf->drop_frames_water_mark = cfg->rc_dropframe_thresh; |