Add AV1RateControlRTC::GetLoopfilterLevel
Bug: b/278162842
Change-Id: Iecd85c7bd6bae4c32cb831454b6b44e6c77cfd97
diff --git a/av1/ratectrl_rtc.cc b/av1/ratectrl_rtc.cc
index 7aa2cd8..e1470e6 100644
--- a/av1/ratectrl_rtc.cc
+++ b/av1/ratectrl_rtc.cc
@@ -19,6 +19,7 @@
#include "aom_mem/aom_mem.h"
#include "av1/encoder/encoder.h"
#include "av1/encoder/encoder_utils.h"
+#include "av1/encoder/picklpf.h"
#include "av1/encoder/ratectrl.h"
#include "av1/encoder/rc_utils.h"
#include "av1/encoder/svc_layercontext.h"
@@ -125,6 +126,7 @@
oxcf->rc_cfg.drop_frames_water_mark = 0;
oxcf->tool_cfg.bit_depth = AOM_BITS_8;
oxcf->tool_cfg.superblock_size = AOM_SUPERBLOCK_SIZE_DYNAMIC;
+ oxcf->algo_cfg.loopfilter_control = LOOPFILTER_ALL;
cm->current_frame.frame_number = 0;
cpi_->ppi->p_rc.kf_boost = DEFAULT_KF_BOOST_RT;
for (auto &lvl_idx : oxcf->target_seq_level_idx) lvl_idx = SEQ_LEVEL_MAX;
@@ -303,6 +305,17 @@
return cpi_->common.quant_params.base_qindex;
}
+AV1LoopfilterLevel AV1RateControlRTC::GetLoopfilterLevel() const {
+ av1_pick_filter_level(nullptr, cpi_, LPF_PICK_FROM_Q);
+ AV1LoopfilterLevel lpf_level;
+ lpf_level.filter_level[0] = cpi_->common.lf.filter_level[0];
+ lpf_level.filter_level[1] = cpi_->common.lf.filter_level[1];
+ lpf_level.filter_level_u = cpi_->common.lf.filter_level_u;
+ lpf_level.filter_level_v = cpi_->common.lf.filter_level_v;
+
+ return lpf_level;
+}
+
signed char *AV1RateControlRTC::GetCyclicRefreshMap() const {
return cpi_->cyclic_refresh->map;
}
diff --git a/av1/ratectrl_rtc.h b/av1/ratectrl_rtc.h
index 2d06ee3..c5d0caa 100644
--- a/av1/ratectrl_rtc.h
+++ b/av1/ratectrl_rtc.h
@@ -63,6 +63,12 @@
int temporal_layer_id;
};
+struct AV1LoopfilterLevel {
+ int filter_level[2];
+ int filter_level_u;
+ int filter_level_v;
+};
+
class AV1RateControlRTC {
public:
static std::unique_ptr<AV1RateControlRTC> Create(
@@ -72,6 +78,8 @@
bool UpdateRateControl(const AV1RateControlRtcConfig &rc_cfg);
// GetQP() needs to be called after ComputeQP() to get the latest QP
int GetQP() const;
+ // GetLoopfilterLevel() needs to be called after ComputeQP()
+ AV1LoopfilterLevel GetLoopfilterLevel() const;
signed char *GetCyclicRefreshMap() const;
int *GetDeltaQ() const;
void ComputeQP(const AV1FrameParamsRTC &frame_params);
diff --git a/test/ratectrl_rtc_test.cc b/test/ratectrl_rtc_test.cc
index 74c114e..1357983 100644
--- a/test/ratectrl_rtc_test.cc
+++ b/test/ratectrl_rtc_test.cc
@@ -146,6 +146,10 @@
encoder->Control(AOME_GET_LAST_QUANTIZER, &qp);
rc_api_->ComputeQP(frame_params_);
ASSERT_EQ(rc_api_->GetQP(), qp);
+ int encoder_lpf_level;
+ encoder->Control(AOME_GET_LOOPFILTER_LEVEL, &encoder_lpf_level);
+ aom::AV1LoopfilterLevel loopfilter_level = rc_api_->GetLoopfilterLevel();
+ ASSERT_EQ(loopfilter_level.filter_level[0], encoder_lpf_level);
}
void FramePktHook(const aom_codec_cx_pkt_t *pkt) override {