142 lines
5.4 KiB
C
142 lines
5.4 KiB
C
|
|
/*
|
||
|
|
* 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_
|