| /* |
| * 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_ |
| |
| #ifdef __cplusplus |
| #include <cstddef> |
| #include <cstdint> |
| #include <memory> |
| #else |
| #include <stddef.h> |
| #include <stdint.h> |
| #include <stdbool.h> |
| #endif // __cplusplus |
| |
| struct AV1_COMP; |
| |
| struct AV1LoopfilterLevel { |
| int filter_level[2]; |
| int filter_level_u; |
| int filter_level_v; |
| }; |
| |
| struct AV1CdefInfo { |
| int cdef_strength_y; |
| int cdef_strength_uv; |
| int damping; |
| }; |
| |
| struct AV1SegmentationData { |
| const uint8_t *segmentation_map; |
| size_t segmentation_map_size; |
| const int *delta_q; |
| size_t delta_q_size; |
| }; |
| |
| enum FrameType { kKeyFrame, kInterFrame }; |
| |
| struct AomAV1FrameParamsRTC { |
| enum FrameType frame_type; |
| int spatial_layer_id; |
| int temporal_layer_id; |
| }; |
| |
| #ifdef __cplusplus |
| enum class FrameDropDecision { |
| kOk, // Frame is encoded. |
| kDrop, // Frame is dropped. |
| }; |
| // These constants come from AV1 spec. |
| static constexpr size_t kAV1MaxLayers = 32; |
| static constexpr size_t kAV1MaxTemporalLayers = 8; |
| static constexpr size_t kAV1MaxSpatialLayers = 4; |
| #else |
| enum FrameDropDecision { |
| kFrameDropDecisionOk, // Frame is encoded. |
| kFrameDropDecisionDrop, // Frame is dropped. |
| }; |
| // These constants come from AV1 spec. |
| #define kAV1MaxLayers 32 |
| #define kAV1MaxTemporalLayers 8 |
| #define kAV1MaxSpatialLayers 4 |
| #endif // __cplusplus |
| |
| struct AomAV1RateControlRtcConfig { |
| #ifdef __cplusplus |
| AomAV1RateControlRtcConfig(); |
| #endif |
| |
| int width; |
| int height; |
| // Flag indicating if the content is screen or not. |
| bool is_screen; |
| // 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; |
| int frame_drop_thresh; |
| int max_consec_drop_ms; |
| 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]; |
| }; |
| |
| #ifdef __cplusplus |
| namespace aom { |
| |
| using AV1FrameParamsRTC = AomAV1FrameParamsRTC; |
| using AV1RateControlRtcConfig = AomAV1RateControlRtcConfig; |
| |
| class AV1RateControlRTC { |
| public: |
| static std::unique_ptr<AV1RateControlRTC> Create( |
| const AV1RateControlRtcConfig &cfg); |
| ~AV1RateControlRTC(); |
| |
| 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; |
| // GetCdefInfo() needs to be called after ComputeQP() |
| AV1CdefInfo GetCdefInfo() const; |
| // Returns the segmentation map used for cyclic refresh, based on 4x4 blocks. |
| bool GetSegmentationData(AV1SegmentationData *segmentation_data) const; |
| // ComputeQP returns the QP if the frame is not dropped (kOk return), |
| // otherwise it returns kDrop and subsequent GetQP and PostEncodeUpdate |
| // are not to be called (av1_rc_postencode_update_drop_frame is already |
| // called via ComputeQP if drop is decided). |
| FrameDropDecision 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; |
| bool InitRateControl(const AV1RateControlRtcConfig &cfg); |
| AV1_COMP *cpi_; |
| int initial_width_; |
| int initial_height_; |
| }; |
| } // namespace aom |
| #endif // __cplusplus |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| void *av1_ratecontrol_rtc_create( |
| const struct AomAV1RateControlRtcConfig *rc_cfg); |
| void av1_ratecontrol_rtc_destroy(void *controller); |
| bool av1_ratecontrol_rtc_update( |
| void *controller, const struct AomAV1RateControlRtcConfig *rc_cfg); |
| int av1_ratecontrol_rtc_get_qp(void *controller); |
| |
| struct AV1LoopfilterLevel av1_ratecontrol_rtc_get_loop_filter_level( |
| void *controller); |
| enum FrameDropDecision av1_ratecontrol_rtc_compute_qp( |
| void *controller, const struct AomAV1FrameParamsRTC *frame_params); |
| |
| void av1_ratecontrol_rtc_post_encode_update(void *controller, |
| uint64_t encoded_frame_size); |
| |
| bool av1_ratecontrol_rtc_get_segmentation( |
| void *controller, struct AV1SegmentationData *segmentation_data); |
| |
| struct AV1CdefInfo av1_ratecontrol_rtc_get_cdef_info(void *controller); |
| |
| void av1_ratecontrol_rtc_init_ratecontrol_config( |
| struct AomAV1RateControlRtcConfig *config); |
| #ifdef __cplusplus |
| } // extern "C" |
| #endif |
| |
| #endif // AOM_AV1_RATECTRL_RTC_H_ |