/* * Copyright (c) 2021, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ #ifndef AOM_AV1_RATECTRL_RTC_H_ #define AOM_AV1_RATECTRL_RTC_H_ #include #include struct AV1_COMP; namespace aom { // These constants come from AV1 spec. static constexpr size_t kAV1MaxLayers = 32; static constexpr size_t kAV1MaxTemporalLayers = 8; static constexpr size_t kAV1MaxSpatialLayers = 4; enum FrameType { kKeyFrame, kInterFrame }; struct AV1RateControlRtcConfig { public: AV1RateControlRtcConfig(); int width; int height; // 0-63 int max_quantizer; int min_quantizer; int64_t target_bandwidth; int64_t buf_initial_sz; int64_t buf_optimal_sz; int64_t buf_sz; int undershoot_pct; int overshoot_pct; int max_intra_bitrate_pct; int max_inter_bitrate_pct; double framerate; int layer_target_bitrate[kAV1MaxLayers]; int ts_rate_decimator[kAV1MaxTemporalLayers]; int aq_mode; // Number of spatial layers int ss_number_layers; // Number of temporal layers int ts_number_layers; int max_quantizers[kAV1MaxLayers]; int min_quantizers[kAV1MaxLayers]; int scaling_factor_num[kAV1MaxSpatialLayers]; int scaling_factor_den[kAV1MaxSpatialLayers]; }; struct AV1FrameParamsRTC { FrameType frame_type; int spatial_layer_id; int temporal_layer_id; }; class AV1RateControlRTC { public: static std::unique_ptr Create( const AV1RateControlRtcConfig &cfg); ~AV1RateControlRTC(); void UpdateRateControl(const AV1RateControlRtcConfig &rc_cfg); // GetQP() needs to be called after ComputeQP() to get the latest QP int GetQP() const; signed char *GetCyclicRefreshMap() const; int *GetDeltaQ() const; void ComputeQP(const AV1FrameParamsRTC &frame_params); // Feedback to rate control with the size of current encoded frame void PostEncodeUpdate(uint64_t encoded_frame_size); private: AV1RateControlRTC() = default; void InitRateControl(const AV1RateControlRtcConfig &cfg); AV1_COMP *cpi_; int initial_width_; int initial_height_; }; } // namespace aom #endif // AOM_AV1_RATECTRL_RTC_H_