1 /* 2 * Copyright (c) 2019, Alliance for Open Media. All rights reserved 3 * 4 * This source code is subject to the terms of the BSD 2 Clause License and 5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License 6 * was not distributed with this source code in the LICENSE file, you can 7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open 8 * Media Patent License 1.0 was not distributed with this source code in the 9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent. 10 */ 11 12 #ifndef AOM_AV1_ENCODER_PASS2_STRATEGY_H_ 13 #define AOM_AV1_ENCODER_PASS2_STRATEGY_H_ 14 15 #ifdef __cplusplus 16 extern "C" { 17 #endif 18 19 struct AV1_COMP; 20 struct EncodeFrameParams; 21 22 #include "av1/encoder/encoder.h" 23 24 /*! 25 * \brief accumulated stats and features in a gf group 26 */ 27 typedef struct { 28 /*!\cond */ 29 double gf_group_err; 30 double gf_group_raw_error; 31 double gf_group_skip_pct; 32 double gf_group_inactive_zone_rows; 33 34 double mv_ratio_accumulator; 35 double decay_accumulator; 36 double zero_motion_accumulator; 37 double loop_decay_rate; 38 double last_loop_decay_rate; 39 double this_frame_mv_in_out; 40 double mv_in_out_accumulator; 41 double abs_mv_in_out_accumulator; 42 43 double avg_sr_coded_error; 44 double avg_pcnt_second_ref; 45 double avg_new_mv_count; 46 double avg_wavelet_energy; 47 double avg_raw_err_stdev; 48 int non_zero_stdev_count; 49 /*!\endcond */ 50 } GF_GROUP_STATS; 51 52 /*! 53 * \brief accumulated stats and features for a frame 54 */ 55 typedef struct { 56 /*!\cond */ 57 double frame_err; 58 double frame_coded_error; 59 double frame_sr_coded_error; 60 /*!\endcond */ 61 } GF_FRAME_STATS; 62 /*!\cond */ 63 64 void av1_init_second_pass(struct AV1_COMP *cpi); 65 66 void av1_init_single_pass_lap(AV1_COMP *cpi); 67 68 /*!\endcond */ 69 /*!\brief Main per frame entry point for second pass of two pass encode 70 * 71 *\ingroup rate_control 72 * 73 * This function is called for each frame in the second pass of a two pass 74 * encode. It checks the frame type and if a new KF or GF/ARF is due. 75 * When a KF is due it calls find_next_key_frame() to work out how long 76 * this key frame group will be and assign bits to the key frame. 77 * At the start of a new GF/ARF group it calls calculate_gf_length() 78 * and define_gf_group() which are the main functions responsible for 79 * defining the size and structure of the new GF/ARF group. 80 * 81 * \param[in] cpi Top - level encoder instance structure 82 * \param[in] frame_params Per frame encoding parameters 83 * \param[in] frame_flags Frame type and coding flags 84 * 85 * \remark No return but analyses first pass stats and assigns a target 86 * number of bits to the current frame and a target Q range. 87 */ 88 void av1_get_second_pass_params(struct AV1_COMP *cpi, 89 struct EncodeFrameParams *const frame_params, 90 unsigned int frame_flags); 91 92 /*!\brief Adjustments to two pass and rate control after each frame. 93 * 94 *\ingroup rate_control 95 * 96 * This function is called after each frame to make adjustments to 97 * heuristics and data structures that relate to rate control. 98 * 99 * \param[in] cpi Top - level encoder instance structure 100 * 101 * \remark No return value but this function updates various rate control 102 * related data structures that for example track overshoot and 103 * undershoot. 104 */ 105 void av1_twopass_postencode_update(struct AV1_COMP *cpi); 106 107 /*!\brief Distributes bits to frames in a group 108 * 109 *\ingroup rate_control 110 * 111 * This function decides on the allocation of bits between the different 112 * frames and types of frame in a GF/ARF group. 113 * 114 * \param[in] cpi Top - level encoder instance structure 115 * \param[in] rc Rate control data 116 * \param[in] gf_group GF/ARF group data structure 117 * \param[in] is_key_frame Indicates if the first frame in the group is 118 * also a key frame. 119 * \param[in] use_arf Are ARF frames enabled or is this a GF only 120 * uni-directional group. 121 * \param[in] gf_group_bits Bits available to be allocated. 122 * 123 * \remark No return but updates the rate control and group data structures 124 * to reflect the allocation of bits. 125 */ 126 void av1_gop_bit_allocation(const AV1_COMP *cpi, RATE_CONTROL *const rc, 127 GF_GROUP *gf_group, int is_key_frame, int use_arf, 128 int64_t gf_group_bits); 129 130 int av1_calc_arf_boost(const TWO_PASS *twopass, 131 const TWO_PASS_FRAME *twopass_frame, 132 const PRIMARY_RATE_CONTROL *p_rc, FRAME_INFO *frame_info, 133 int offset, int f_frames, int b_frames, 134 int *num_fpstats_used, int *num_fpstats_required, 135 int project_gfu_boost); 136 137 void av1_accumulate_next_frame_stats(const FIRSTPASS_STATS *stats, 138 const int flash_detected, 139 const int frames_since_key, 140 const int cur_idx, 141 GF_GROUP_STATS *gf_stats, int f_w, 142 int f_h); 143 // Identify stable and unstable regions from first pass stats. 144 // stats_start points to the first frame to analyze. 145 // |offset| is the offset from the current frame to the frame stats_start is 146 // pointing to. 147 void av1_identify_regions(const FIRSTPASS_STATS *const stats_start, 148 int total_frames, int offset, REGIONS *regions, 149 int *total_regions); 150 151 void av1_mark_flashes(FIRSTPASS_STATS *first_stats, 152 FIRSTPASS_STATS *last_stats); 153 void av1_estimate_noise(FIRSTPASS_STATS *first_stats, 154 FIRSTPASS_STATS *last_stats); 155 void av1_estimate_coeff(FIRSTPASS_STATS *first_stats, 156 FIRSTPASS_STATS *last_stats); 157 158 #ifdef __cplusplus 159 } // extern "C" 160 #endif 161 162 #endif // AOM_AV1_ENCODER_PASS2_STRATEGY_H_ 163