1 /* 2 * Copyright (c) 2021, Alliance for Open Media. All rights reserved 3 * 4 * This source code is subject to the terms of the BSD 2 Clause License and 5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License 6 * was not distributed with this source code in the LICENSE file, you can 7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open 8 * Media Patent License 1.0 was not distributed with this source code in the 9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent. 10 */ 11 12 #ifndef AOM_AV1_RATECTRL_RTC_H_ 13 #define AOM_AV1_RATECTRL_RTC_H_ 14 15 #include <cstdint> 16 #include <memory> 17 18 struct AV1_COMP; 19 20 namespace aom { 21 22 // These constants come from AV1 spec. 23 static constexpr size_t kAV1MaxLayers = 32; 24 static constexpr size_t kAV1MaxTemporalLayers = 8; 25 static constexpr size_t kAV1MaxSpatialLayers = 4; 26 27 enum FrameType { kKeyFrame, kInterFrame }; 28 29 struct AV1RateControlRtcConfig { 30 public: 31 AV1RateControlRtcConfig(); 32 33 int width; 34 int height; 35 // 0-63 36 int max_quantizer; 37 int min_quantizer; 38 int64_t target_bandwidth; 39 int64_t buf_initial_sz; 40 int64_t buf_optimal_sz; 41 int64_t buf_sz; 42 int undershoot_pct; 43 int overshoot_pct; 44 int max_intra_bitrate_pct; 45 int max_inter_bitrate_pct; 46 double framerate; 47 int layer_target_bitrate[kAV1MaxLayers]; 48 int ts_rate_decimator[kAV1MaxTemporalLayers]; 49 int aq_mode; 50 // Number of spatial layers 51 int ss_number_layers; 52 // Number of temporal layers 53 int ts_number_layers; 54 int max_quantizers[kAV1MaxLayers]; 55 int min_quantizers[kAV1MaxLayers]; 56 int scaling_factor_num[kAV1MaxSpatialLayers]; 57 int scaling_factor_den[kAV1MaxSpatialLayers]; 58 }; 59 60 struct AV1FrameParamsRTC { 61 FrameType frame_type; 62 int spatial_layer_id; 63 int temporal_layer_id; 64 }; 65 66 class AV1RateControlRTC { 67 public: 68 static std::unique_ptr<AV1RateControlRTC> Create( 69 const AV1RateControlRtcConfig &cfg); 70 ~AV1RateControlRTC(); 71 72 void UpdateRateControl(const AV1RateControlRtcConfig &rc_cfg); 73 // GetQP() needs to be called after ComputeQP() to get the latest QP 74 int GetQP() const; 75 signed char *GetCyclicRefreshMap() const; 76 int *GetDeltaQ() const; 77 void ComputeQP(const AV1FrameParamsRTC &frame_params); 78 // Feedback to rate control with the size of current encoded frame 79 void PostEncodeUpdate(uint64_t encoded_frame_size); 80 81 private: 82 AV1RateControlRTC() = default; 83 void InitRateControl(const AV1RateControlRtcConfig &cfg); 84 AV1_COMP *cpi_; 85 int initial_width_; 86 int initial_height_; 87 }; 88 89 } // namespace aom 90 91 #endif // AOM_AV1_RATECTRL_RTC_H_ 92