summaryrefslogtreecommitdiff
path: root/vp9/ratectrl_rtc.cc
diff options
context:
space:
mode:
authorJerome Jiang <jianj@google.com>2021-06-29 14:48:35 -0700
committerJerome Jiang <jianj@google.com>2021-07-21 10:38:06 -0700
commitcd260eba10b9155f6e6086c999bd4c9d3ca6c706 (patch)
tree78e45d4207fff36b2ca6c9115ea0acbb65c4b201 /vp9/ratectrl_rtc.cc
parent0702d5ab27723162d0167006ef93010649c94895 (diff)
downloadlibvpx-cd260eba10b9155f6e6086c999bd4c9d3ca6c706.tar.gz
Add cyclic refresh to vp9 rtc external ratecontrol
Change-Id: Ia2a881399aa31ca0f34481b975362ddd4ad87f1c
Diffstat (limited to 'vp9/ratectrl_rtc.cc')
-rw-r--r--vp9/ratectrl_rtc.cc27
1 files changed, 26 insertions, 1 deletions
diff --git a/vp9/ratectrl_rtc.cc b/vp9/ratectrl_rtc.cc
index b38a0db9c..0f56e67e8 100644
--- a/vp9/ratectrl_rtc.cc
+++ b/vp9/ratectrl_rtc.cc
@@ -11,6 +11,7 @@
#include <new>
+#include "vp9/common/vp9_common.h"
#include "vp9/encoder/vp9_encoder.h"
#include "vp9/encoder/vp9_picklpf.h"
#include "vpx/vp8cx.h"
@@ -28,6 +29,15 @@ std::unique_ptr<VP9RateControlRTC> VP9RateControlRTC::Create(
return nullptr;
}
rc_api->InitRateControl(cfg);
+ if (cfg.aq_mode) {
+ VP9_COMP *const cpi = rc_api->cpi_;
+ cpi->segmentation_map = static_cast<uint8_t *>(
+ vpx_calloc(cpi->common.mi_rows * cpi->common.mi_cols,
+ sizeof(*cpi->segmentation_map)));
+ cpi->cyclic_refresh =
+ vp9_cyclic_refresh_alloc(cpi->common.mi_rows, cpi->common.mi_cols);
+ cpi->cyclic_refresh->content_mode = 0;
+ }
return rc_api;
}
@@ -42,13 +52,14 @@ void VP9RateControlRTC::InitRateControl(const VP9RateControlRtcConfig &rc_cfg) {
oxcf->bit_depth = cm->bit_depth;
oxcf->rc_mode = rc_cfg.rc_mode;
oxcf->pass = 0;
- oxcf->aq_mode = NO_AQ;
+ oxcf->aq_mode = rc_cfg.aq_mode ? CYCLIC_REFRESH_AQ : NO_AQ;
oxcf->content = VP9E_CONTENT_DEFAULT;
oxcf->drop_frames_water_mark = 0;
cm->current_video_frame = 0;
rc->kf_boost = DEFAULT_KF_BOOST;
UpdateRateControl(rc_cfg);
+ vp9_set_mb_mi(cm, cm->width, cm->height);
cpi_->use_svc = (cpi_->svc.number_spatial_layers > 1 ||
cpi_->svc.number_temporal_layers > 1)
@@ -146,6 +157,8 @@ void VP9RateControlRTC::ComputeQP(const VP9FrameParamsQpRTC &frame_params) {
cpi_->svc.number_temporal_layers == 1) {
int target = 0;
if (cpi_->oxcf.rc_mode == VPX_CBR) {
+ if (cpi_->oxcf.aq_mode == CYCLIC_REFRESH_AQ)
+ vp9_cyclic_refresh_update_parameters(cpi_);
if (frame_is_intra_only(cm))
target = vp9_calc_iframe_target_size_one_pass_cbr(cpi_);
else
@@ -156,6 +169,8 @@ void VP9RateControlRTC::ComputeQP(const VP9FrameParamsQpRTC &frame_params) {
cpi_->rc.frames_to_key = cpi_->oxcf.key_freq;
}
vp9_set_gf_update_one_pass_vbr(cpi_);
+ if (cpi_->oxcf.aq_mode == CYCLIC_REFRESH_AQ)
+ vp9_cyclic_refresh_update_parameters(cpi_);
if (frame_is_intra_only(cm))
target = vp9_calc_iframe_target_size_one_pass_vbr(cpi_);
else
@@ -171,6 +186,8 @@ void VP9RateControlRTC::ComputeQP(const VP9FrameParamsQpRTC &frame_params) {
int bottom_index, top_index;
cpi_->common.base_qindex =
vp9_rc_pick_q_and_bounds(cpi_, &bottom_index, &top_index);
+
+ if (cpi_->oxcf.aq_mode == CYCLIC_REFRESH_AQ) vp9_cyclic_refresh_setup(cpi_);
}
int VP9RateControlRTC::GetQP() const { return cpi_->common.base_qindex; }
@@ -181,6 +198,14 @@ int VP9RateControlRTC::GetLoopfilterLevel() const {
return lf->filter_level;
}
+signed char *VP9RateControlRTC::GetCyclicRefreshMap() const {
+ return cpi_->cyclic_refresh->map;
+}
+
+int *VP9RateControlRTC::GetDeltaQ() const {
+ return cpi_->cyclic_refresh->qindex_delta;
+}
+
void VP9RateControlRTC::PostEncodeUpdate(uint64_t encoded_frame_size) {
vp9_rc_postencode_update(cpi_, encoded_frame_size);
if (cpi_->svc.number_spatial_layers > 1 ||