| /* | |
| * 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_QMODE_RC_RATECTRL_QMODE_H_ | |
| #define AOM_AV1_QMODE_RC_RATECTRL_QMODE_H_ | |
| #include <deque> | |
| #include <queue> | |
| #include <unordered_map> | |
| #include <vector> | |
| #include "av1/encoder/firstpass.h" | |
| #include "av1/qmode_rc/ratectrl_qmode_interface.h" | |
| #include "av1/qmode_rc/reference_manager.h" | |
| namespace aom { | |
| constexpr int kLayerDepthOffset = 1; | |
| constexpr int kMinIntervalToAddArf = 3; | |
| constexpr int kMinArfInterval = (kMinIntervalToAddArf + 1) / 2; | |
| struct TplUnitDepStats { | |
| double propagation_cost; | |
| double intra_cost; | |
| double inter_cost; | |
| std::array<MotionVector, kBlockRefCount> mv; | |
| std::array<int, kBlockRefCount> ref_frame_index; | |
| }; | |
| struct TplFrameDepStats { | |
| int unit_size; // equivalent to min_block_size | |
| double rdcost; // overall rate-distortion cost | |
| std::vector<std::vector<TplUnitDepStats>> unit_stats; | |
| }; | |
| struct TplGopDepStats { | |
| std::vector<TplFrameDepStats> frame_dep_stats_list; | |
| }; | |
| GopFrame GopFrameInvalid(); | |
| // Set up is_key_frame, is_arf_frame, is_show_frame, is_golden_frame and | |
| // encode_ref_mode in GopFrame based on gop_frame_type | |
| void SetGopFrameByType(GopFrameType gop_frame_type, GopFrame *gop_frame); | |
| GopFrame GopFrameBasic(int global_coding_idx_offset, | |
| int global_order_idx_offset, int coding_idx, | |
| int order_idx, int depth, int display_idx, | |
| GopFrameType gop_frame_type); | |
| GopStruct ConstructGop(RefFrameManager *ref_frame_manager, int show_frame_count, | |
| bool has_key_frame, int global_coding_idx_offset, | |
| int global_order_idx_offset); | |
| // Creates a TplFrameDepStats containing an 2D array of default-initialized | |
| // TplUnitDepStats, with dimensions of | |
| // ceil(frame_height / min_block_size) x ceil(frame_width / min_block_size). | |
| // i.e., there will be one entry for each square block of size min_block_size, | |
| // and blocks along the bottom or right edge of the frame may extend beyond the | |
| // edges of the frame. | |
| TplFrameDepStats CreateTplFrameDepStats(int frame_height, int frame_width, | |
| int min_block_size); | |
| TplUnitDepStats TplBlockStatsToDepStats(const TplBlockStats &block_stats, | |
| int unit_count); | |
| StatusOr<TplFrameDepStats> CreateTplFrameDepStatsWithoutPropagation( | |
| const TplFrameStats &frame_stats); | |
| std::vector<int> GetKeyFrameList(const FirstpassInfo &first_pass_info); | |
| double TplFrameDepStatsAccumulateIntraCost( | |
| const TplFrameDepStats &frame_dep_stats); | |
| double TplFrameDepStatsAccumulateInterCost( | |
| const TplFrameDepStats &frame_dep_stats); | |
| double TplFrameDepStatsAccumulate(const TplFrameDepStats &frame_dep_stats); | |
| void TplFrameDepStatsPropagate(int coding_idx, | |
| const RefFrameTable &ref_frame_table, | |
| TplGopDepStats *tpl_gop_dep_stats); | |
| int GetBlockOverlapArea(int r0, int c0, int r1, int c1, int size); | |
| namespace internal { | |
| std::unordered_map<int, int> KMeans(std::vector<uint8_t> qindices, int k); | |
| } | |
| StatusOr<TplGopDepStats> ComputeTplGopDepStats( | |
| const TplGopStats &tpl_gop_stats, | |
| const std::vector<LookaheadStats> &lookahead_stats, | |
| const std::vector<RefFrameTable> &ref_frame_table_list); | |
| class AV1RateControlQMode : public AV1RateControlQModeInterface { | |
| public: | |
| Status SetRcParam(const RateControlParam &rc_param) override; | |
| StatusOr<GopStructList> DetermineGopInfo( | |
| const FirstpassInfo &firstpass_info) override; | |
| StatusOr<GopEncodeInfo> GetGopEncodeInfo( | |
| const GopStruct &gop_struct, const TplGopStats &tpl_gop_stats, | |
| const std::vector<LookaheadStats> &lookahead_stats, | |
| const FirstpassInfo &firstpass_info, | |
| const RefFrameTable &ref_frame_table_snapshot) override; | |
| StatusOr<GopEncodeInfo> GetTplPassGopEncodeInfo( | |
| const GopStruct &gop_struct, | |
| const FirstpassInfo &firstpass_info) override; | |
| // Public for testing only. | |
| // Returns snapshots of the ref frame before and after each frame in | |
| // gop_struct. The returned list will have n+1 entries for n frames. | |
| // If this is first GOP, ref_frame_table is ignored and all refs are assumed | |
| // invalid; otherwise ref_frame_table is used as the initial state. | |
| std::vector<RefFrameTable> GetRefFrameTableList( | |
| const GopStruct &gop_struct, | |
| const std::vector<LookaheadStats> &lookahead_stats, | |
| RefFrameTable ref_frame_table); | |
| private: | |
| RateControlParam rc_param_; | |
| // Private methods to determine GOP encode info with different stats | |
| StatusOr<GopEncodeInfo> GetGopEncodeInfoWithNoStats( | |
| const GopStruct &gop_struct); | |
| StatusOr<GopEncodeInfo> GetGopEncodeInfoWithFp( | |
| const GopStruct &gop_struct, const FirstpassInfo &firstpass_info); | |
| StatusOr<GopEncodeInfo> GetGopEncodeInfoWithTpl( | |
| const GopStruct &gop_struct, const TplGopStats &tpl_gop_stats, | |
| const std::vector<LookaheadStats> &lookahead_stats, | |
| const RefFrameTable &ref_frame_table_snapshot_init); | |
| }; | |
| } // namespace aom | |
| #endif // AOM_AV1_QMODE_RC_RATECTRL_QMODE_H_ |