1*fb1b10abSAndroid Build Coastguard Worker /* 2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2021 The WebM project authors. All Rights Reserved. 3*fb1b10abSAndroid Build Coastguard Worker * 4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*fb1b10abSAndroid Build Coastguard Worker */ 10*fb1b10abSAndroid Build Coastguard Worker 11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VP8_RATECTRL_RTC_H_ 12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VP8_RATECTRL_RTC_H_ 13*fb1b10abSAndroid Build Coastguard Worker 14*fb1b10abSAndroid Build Coastguard Worker #include <cstdint> 15*fb1b10abSAndroid Build Coastguard Worker #include <cstring> 16*fb1b10abSAndroid Build Coastguard Worker #include <memory> 17*fb1b10abSAndroid Build Coastguard Worker 18*fb1b10abSAndroid Build Coastguard Worker #include "vpx/internal/vpx_ratectrl_rtc.h" 19*fb1b10abSAndroid Build Coastguard Worker 20*fb1b10abSAndroid Build Coastguard Worker struct VP8_COMP; 21*fb1b10abSAndroid Build Coastguard Worker 22*fb1b10abSAndroid Build Coastguard Worker namespace libvpx { 23*fb1b10abSAndroid Build Coastguard Worker struct VP8RateControlRtcConfig : public VpxRateControlRtcConfig { VP8RateControlRtcConfigVP8RateControlRtcConfig24*fb1b10abSAndroid Build Coastguard Worker VP8RateControlRtcConfig() { 25*fb1b10abSAndroid Build Coastguard Worker memset(&layer_target_bitrate, 0, sizeof(layer_target_bitrate)); 26*fb1b10abSAndroid Build Coastguard Worker memset(&ts_rate_decimator, 0, sizeof(ts_rate_decimator)); 27*fb1b10abSAndroid Build Coastguard Worker } 28*fb1b10abSAndroid Build Coastguard Worker }; 29*fb1b10abSAndroid Build Coastguard Worker 30*fb1b10abSAndroid Build Coastguard Worker struct VP8FrameParamsQpRTC { 31*fb1b10abSAndroid Build Coastguard Worker RcFrameType frame_type; 32*fb1b10abSAndroid Build Coastguard Worker int temporal_layer_id; 33*fb1b10abSAndroid Build Coastguard Worker }; 34*fb1b10abSAndroid Build Coastguard Worker 35*fb1b10abSAndroid Build Coastguard Worker class VP8RateControlRTC { 36*fb1b10abSAndroid Build Coastguard Worker public: 37*fb1b10abSAndroid Build Coastguard Worker static std::unique_ptr<VP8RateControlRTC> Create( 38*fb1b10abSAndroid Build Coastguard Worker const VP8RateControlRtcConfig &cfg); 39*fb1b10abSAndroid Build Coastguard Worker ~VP8RateControlRTC(); 40*fb1b10abSAndroid Build Coastguard Worker 41*fb1b10abSAndroid Build Coastguard Worker bool UpdateRateControl(const VP8RateControlRtcConfig &rc_cfg); 42*fb1b10abSAndroid Build Coastguard Worker // GetQP() needs to be called after ComputeQP() to get the latest QP 43*fb1b10abSAndroid Build Coastguard Worker int GetQP() const; 44*fb1b10abSAndroid Build Coastguard Worker // GetUVDeltaQP() needs to be called after ComputeQP() to get the latest 45*fb1b10abSAndroid Build Coastguard Worker // delta QP for UV. 46*fb1b10abSAndroid Build Coastguard Worker UVDeltaQP GetUVDeltaQP() const; 47*fb1b10abSAndroid Build Coastguard Worker // GetLoopfilterLevel() needs to be called after ComputeQP() since loopfilter 48*fb1b10abSAndroid Build Coastguard Worker // level is calculated from frame qp. 49*fb1b10abSAndroid Build Coastguard Worker int GetLoopfilterLevel() const; 50*fb1b10abSAndroid Build Coastguard Worker // ComputeQP computes the QP if the frame is not dropped (kOk return), 51*fb1b10abSAndroid Build Coastguard Worker // otherwise it returns kDrop and subsequent GetQP and PostEncodeUpdate 52*fb1b10abSAndroid Build Coastguard Worker // are not to be called. 53*fb1b10abSAndroid Build Coastguard Worker FrameDropDecision ComputeQP(const VP8FrameParamsQpRTC &frame_params); 54*fb1b10abSAndroid Build Coastguard Worker // Feedback to rate control with the size of current encoded frame 55*fb1b10abSAndroid Build Coastguard Worker void PostEncodeUpdate(uint64_t encoded_frame_size); 56*fb1b10abSAndroid Build Coastguard Worker 57*fb1b10abSAndroid Build Coastguard Worker private: 58*fb1b10abSAndroid Build Coastguard Worker VP8RateControlRTC() = default; 59*fb1b10abSAndroid Build Coastguard Worker bool InitRateControl(const VP8RateControlRtcConfig &cfg); 60*fb1b10abSAndroid Build Coastguard Worker struct VP8_COMP *cpi_ = nullptr; 61*fb1b10abSAndroid Build Coastguard Worker int q_ = -1; 62*fb1b10abSAndroid Build Coastguard Worker }; 63*fb1b10abSAndroid Build Coastguard Worker 64*fb1b10abSAndroid Build Coastguard Worker } // namespace libvpx 65*fb1b10abSAndroid Build Coastguard Worker 66*fb1b10abSAndroid Build Coastguard Worker #endif // VPX_VP8_RATECTRL_RTC_H_ 67