xref: /aosp_15_r20/external/libvpx/vp8/vp8_ratectrl_rtc.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
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