summaryrefslogtreecommitdiff
path: root/vp9
diff options
context:
space:
mode:
authorJerome Jiang <jianj@google.com>2021-06-18 23:25:53 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2021-06-18 23:25:53 +0000
commit4546b5db4749c5753f48f199f32bbfcbd6778574 (patch)
treeef3ad19347b7b9f783ceb1c0478821acda741ba6 /vp9
parent2380e13da8a5bba3e8afdb14e0aa61fd980a49c9 (diff)
parent1f45e7b07ec839dae7a90455e00c3b2d553ea772 (diff)
downloadlibvpx-4546b5db4749c5753f48f199f32bbfcbd6778574.tar
libvpx-4546b5db4749c5753f48f199f32bbfcbd6778574.tar.gz
libvpx-4546b5db4749c5753f48f199f32bbfcbd6778574.tar.bz2
libvpx-4546b5db4749c5753f48f199f32bbfcbd6778574.zip
Merge "vp9 rc: add vbr to rtc rate control library" into main
Diffstat (limited to 'vp9')
-rw-r--r--vp9/encoder/vp9_ratectrl.c3
-rw-r--r--vp9/encoder/vp9_ratectrl.h3
-rw-r--r--vp9/ratectrl_rtc.cc31
-rw-r--r--vp9/ratectrl_rtc.h4
4 files changed, 31 insertions, 10 deletions
diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c
index 51fb2aab8..18ba04581 100644
--- a/vp9/encoder/vp9_ratectrl.c
+++ b/vp9/encoder/vp9_ratectrl.c
@@ -39,9 +39,6 @@
#define MAX_MB_RATE 250
#define MAXRATE_1080P 4000000
-#define DEFAULT_KF_BOOST 2000
-#define DEFAULT_GF_BOOST 2000
-
#define LIMIT_QRANGE_FOR_ALTREF_AND_KEY 1
#define MIN_BPB_FACTOR 0.005
diff --git a/vp9/encoder/vp9_ratectrl.h b/vp9/encoder/vp9_ratectrl.h
index 8ef10c94a..bdddd2df8 100644
--- a/vp9/encoder/vp9_ratectrl.h
+++ b/vp9/encoder/vp9_ratectrl.h
@@ -27,6 +27,9 @@ extern "C" {
// Bits Per MB at different Q (Multiplied by 512)
#define BPER_MB_NORMBITS 9
+#define DEFAULT_KF_BOOST 2000
+#define DEFAULT_GF_BOOST 2000
+
#define MIN_GF_INTERVAL 4
#define MAX_GF_INTERVAL 16
#define FIXED_GF_INTERVAL 8 // Used in some testing modes only
diff --git a/vp9/ratectrl_rtc.cc b/vp9/ratectrl_rtc.cc
index 8f77fc842..8455ca9a3 100644
--- a/vp9/ratectrl_rtc.cc
+++ b/vp9/ratectrl_rtc.cc
@@ -38,13 +38,16 @@ void VP9RateControlRTC::InitRateControl(const VP9RateControlRtcConfig &rc_cfg) {
cm->profile = PROFILE_0;
cm->bit_depth = VPX_BITS_8;
cm->show_frame = 1;
- oxcf->rc_mode = VPX_CBR;
oxcf->profile = cm->profile;
oxcf->bit_depth = cm->bit_depth;
+ oxcf->rc_mode = rc_cfg.rc_mode;
oxcf->pass = 0;
oxcf->aq_mode = NO_AQ;
oxcf->content = VP9E_CONTENT_DEFAULT;
oxcf->drop_frames_water_mark = 0;
+ cm->current_video_frame = 0;
+ oxcf->key_freq = rc_cfg.key_freq;
+ rc->kf_boost = DEFAULT_KF_BOOST;
UpdateRateControl(rc_cfg);
@@ -57,8 +60,8 @@ void VP9RateControlRTC::InitRateControl(const VP9RateControlRtcConfig &rc_cfg) {
rc->rc_2_frame = 0;
vp9_rc_init_minq_luts();
vp9_rc_init(oxcf, 0, rc);
+ rc->frames_to_key = oxcf->key_freq;
cpi_->sf.use_nonrd_pick_mode = 1;
- cm->current_video_frame = 0;
}
void VP9RateControlRTC::UpdateRateControl(
@@ -75,6 +78,7 @@ void VP9RateControlRTC::UpdateRateControl(
oxcf->best_allowed_q = vp9_quantizer_to_qindex(rc_cfg.min_quantizer);
rc->worst_quality = oxcf->worst_allowed_q;
rc->best_quality = oxcf->best_allowed_q;
+ oxcf->init_framerate = rc_cfg.framerate;
oxcf->target_bandwidth = 1000 * rc_cfg.target_bandwidth;
oxcf->starting_buffer_level_ms = rc_cfg.buf_initial_sz;
oxcf->optimal_buffer_level_ms = rc_cfg.buf_optimal_sz;
@@ -140,11 +144,24 @@ void VP9RateControlRTC::ComputeQP(const VP9FrameParamsQpRTC &frame_params) {
cpi_->sf.use_nonrd_pick_mode = 1;
if (cpi_->svc.number_spatial_layers == 1 &&
cpi_->svc.number_temporal_layers == 1) {
- int target;
- if (frame_is_intra_only(cm))
- target = vp9_calc_iframe_target_size_one_pass_cbr(cpi_);
- else
- target = vp9_calc_pframe_target_size_one_pass_cbr(cpi_);
+ int target = 0;
+ if (cpi_->oxcf.rc_mode == VPX_CBR) {
+ if (frame_is_intra_only(cm))
+ target = vp9_calc_iframe_target_size_one_pass_cbr(cpi_);
+ else
+ target = vp9_calc_pframe_target_size_one_pass_cbr(cpi_);
+ } else if (cpi_->oxcf.rc_mode == VPX_VBR) {
+ if (cm->frame_type == KEY_FRAME) {
+ cpi_->rc.this_key_frame_forced =
+ cm->current_video_frame != 0 && cpi_->rc.frames_to_key == 0;
+ cpi_->rc.frames_to_key = cpi_->oxcf.key_freq;
+ }
+ vp9_set_gf_update_one_pass_vbr(cpi_);
+ if (frame_is_intra_only(cm))
+ target = vp9_calc_iframe_target_size_one_pass_vbr(cpi_);
+ else
+ target = vp9_calc_pframe_target_size_one_pass_vbr(cpi_);
+ }
vp9_rc_set_frame_target(cpi_, target);
vp9_update_buffer_level_preencode(cpi_);
} else {
diff --git a/vp9/ratectrl_rtc.h b/vp9/ratectrl_rtc.h
index 72ea40fd6..a1f276712 100644
--- a/vp9/ratectrl_rtc.h
+++ b/vp9/ratectrl_rtc.h
@@ -49,6 +49,10 @@ struct VP9RateControlRtcConfig {
int scaling_factor_den[VPX_SS_MAX_LAYERS];
int layer_target_bitrate[VPX_MAX_LAYERS];
int ts_rate_decimator[VPX_TS_MAX_LAYERS];
+ // vbr, cbr
+ enum vpx_rc_mode rc_mode;
+ // key frame frequency
+ int key_freq;
};
struct VP9FrameParamsQpRTC {