| /* | |
| * Copyright (c) 2022, 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_QMODE_INTERFACE_H_ | |
| #define AOM_AV1_RATECTRL_QMODE_INTERFACE_H_ | |
| #include <array> | |
| #include <vector> | |
| #include "av1/encoder/firstpass.h" | |
| namespace aom { | |
| constexpr int kBlockRefCount = 2; | |
| constexpr int kRefFrameTableSize = 8; | |
| struct MotionVector { | |
| int row; // subpel row | |
| int col; // subpel col | |
| int subpel_bits; // number of fractional bits used by row/col | |
| }; | |
| struct RateControlParam { | |
| int max_gop_show_frame_count; | |
| int min_gop_show_frame_count; | |
| int max_ref_frames; | |
| int base_q_index; | |
| }; | |
| struct TplBlockStats { | |
| int height; // pixel height | |
| int width; // pixel width | |
| int row; // pixel row of the top left corner | |
| int col; // pixel col of the top lef corner | |
| int64_t intra_cost; | |
| int64_t inter_cost; | |
| std::array<MotionVector, kBlockRefCount> mv; | |
| std::array<int, kBlockRefCount> ref_frame_index; | |
| }; | |
| enum class EncodeRefMode { | |
| kRegular, | |
| kOverlay, | |
| kShowExisting, | |
| }; | |
| struct GopFrame { | |
| // basic info | |
| bool is_valid; | |
| int order_idx; // Index in display order in a GOP | |
| int coding_idx; // Index in coding order in a GOP | |
| int global_order_idx; // Index in display order in the whole video chunk | |
| int global_coding_idx; // Index in coding order in the whole video chunk | |
| bool is_key_frame; // If this is key frame, reset reference buffers are | |
| // required | |
| bool is_arf_frame; // Is this a forward frame, a frame with order_idx | |
| // higher than the current display order | |
| bool is_show_frame; // Is this frame a show frame after coding | |
| bool is_golden_frame; // Is this a high quality frame | |
| // reference frame info | |
| EncodeRefMode encode_ref_mode; | |
| int colocated_ref_idx; // colocated_ref_idx == -1 when encode_ref_mode == | |
| // EncodeRefMode::kRegular | |
| int update_ref_idx; // The reference index that this frame should be updated | |
| // to. update_ref_idx == -1 when this frame will not | |
| // serve as a reference frame | |
| std::vector<int> | |
| ref_idx_list; // The indices of reference frames. | |
| // The size should be less or equal to max_ref_frames. | |
| int layer_depth; // Layer depth in the GOP structure | |
| int primary_ref_idx; // We will use the primary reference to update current | |
| // frame's initial probability model | |
| }; | |
| struct GopStruct { | |
| int show_frame_count; | |
| std::vector<GopFrame> gop_frame_list; | |
| }; | |
| using GopStructList = std::vector<GopStruct>; | |
| struct FrameEncodeParameters { | |
| int q_index; | |
| int rdmult; | |
| }; | |
| using FirstpassInfo = std::vector<FIRSTPASS_STATS>; | |
| using RefFrameTable = std::array<GopFrame, kRefFrameTableSize>; | |
| struct GopEncodeInfo { | |
| std::vector<FrameEncodeParameters> param_list; | |
| RefFrameTable final_snapshot; // RefFrameTable snapshot after coding this GOP | |
| }; | |
| struct TplFrameStats { | |
| int min_block_size; | |
| int frame_width; | |
| int frame_height; | |
| std::vector<TplBlockStats> block_stats_list; | |
| }; | |
| struct TplGopStats { | |
| std::vector<TplFrameStats> frame_stats_list; | |
| }; | |
| class AV1RateControlQModeInterface { | |
| public: | |
| AV1RateControlQModeInterface(); | |
| virtual ~AV1RateControlQModeInterface(); | |
| virtual void SetRcParam(const RateControlParam &rc_param) = 0; | |
| virtual GopStructList DetermineGopInfo( | |
| const FirstpassInfo &firstpass_stats_list) = 0; | |
| // Accept firstpass and tpl info from the encoder and return q index and | |
| // rdmult. This needs to be called with consecutive GOPs as returned by | |
| // DetermineGopInfo. | |
| virtual GopEncodeInfo GetGopEncodeInfo( | |
| const GopStruct &gop_struct, const TplGopStats &tpl_gop_stats, | |
| const RefFrameTable &ref_frame_table_snapshot_init) = 0; | |
| }; // class AV1RateCtrlQMode | |
| } // namespace aom | |
| #endif // AOM_AV1_RATECTRL_QMODE_INTERFACE_H_ |