blob: d073fd129d6a32781fcfb98df438fa16b3e77200 [file] [log] [blame]
Yaowu Xuc27fc142016-08-22 16:08:15 -07001/*
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07002 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Yaowu Xuc27fc142016-08-22 16:08:15 -07003 *
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07004 * 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.
Yaowu Xuc27fc142016-08-22 16:08:15 -070010 */
11
chiyotsaic2f38412020-06-10 16:07:21 -070012/*! \file
13 * Declares various structs used to encode the current partition block.
14 */
James Zerne1cbb132018-08-22 14:10:36 -070015#ifndef AOM_AV1_ENCODER_BLOCK_H_
16#define AOM_AV1_ENCODER_BLOCK_H_
Yaowu Xuc27fc142016-08-22 16:08:15 -070017
chiyotsai681e4942020-09-30 11:08:17 -070018#include "av1/common/blockd.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070019#include "av1/common/entropymv.h"
20#include "av1/common/entropy.h"
chiyotsai85d715a2020-05-02 15:10:33 -070021#include "av1/common/enums.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070022#include "av1/common/mvref_common.h"
chiyotsai36035d12019-06-19 17:39:48 -070023
Ravi Chaudharyb61cdea2019-07-05 15:01:20 +053024#include "av1/encoder/enc_enums.h"
chiyotsai36035d12019-06-19 17:39:48 -070025#if !CONFIG_REALTIME_ONLY
26#include "av1/encoder/partition_cnn_weights.h"
27#endif
28
Vincent Rabaud0d7608b2021-06-22 16:07:23 +020029#include "av1/encoder/hash_motion.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070030
31#ifdef __cplusplus
32extern "C" {
33#endif
34
Yunqing Wangb17bfa42020-08-14 14:50:33 -070035//! Minimum linear dimension of a tpl block
36#define MIN_TPL_BSIZE_1D 16
37//! Maximum number of tpl block in a super block
38#define MAX_TPL_BLK_IN_SB (MAX_SB_SIZE / MIN_TPL_BSIZE_1D)
chiyotsaic2f38412020-06-10 16:07:21 -070039//! Number of txfm hash records kept for the partition block.
40#define RD_RECORD_BUFFER_LEN 8
chiyotsaiff73c532020-04-21 12:50:12 -070041
S Hamsalekhab7a5b232021-08-06 13:11:33 +053042/*! Maximum value taken by transform type probabilities */
43#define MAX_TX_TYPE_PROB 1024
chiyotsaic2f38412020-06-10 16:07:21 -070044/*! \brief Superblock level encoder info
45 *
46 * SuperblockEnc stores superblock level information used by the encoder for
47 * more efficient encoding. Currently this is mostly used to store TPL data
48 * for the current superblock.
49 */
chiyotsaiff73c532020-04-21 12:50:12 -070050typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -070051 //! Maximum partition size for the sb.
chiyotsai68eefbe2020-05-01 15:07:58 -070052 BLOCK_SIZE min_partition_size;
chiyotsaic2f38412020-06-10 16:07:21 -070053 //! Minimum partition size for the sb.
chiyotsai68eefbe2020-05-01 15:07:58 -070054 BLOCK_SIZE max_partition_size;
55
chiyotsaic2f38412020-06-10 16:07:21 -070056 /*****************************************************************************
57 * \name TPL Info
58 *
Yunqing Wangb17bfa42020-08-14 14:50:33 -070059 * Information gathered from tpl_model at tpl block precision for the
chiyotsaic2f38412020-06-10 16:07:21 -070060 * superblock to speed up the encoding process..
61 ****************************************************************************/
62 /**@{*/
63 //! Number of TPL blocks in this superblock.
chiyotsaiff73c532020-04-21 12:50:12 -070064 int tpl_data_count;
chiyotsaic2f38412020-06-10 16:07:21 -070065 //! TPL's estimate of inter cost for each tpl block.
Yunqing Wangb17bfa42020-08-14 14:50:33 -070066 int64_t tpl_inter_cost[MAX_TPL_BLK_IN_SB * MAX_TPL_BLK_IN_SB];
chiyotsaic2f38412020-06-10 16:07:21 -070067 //! TPL's estimate of tpl cost for each tpl block.
Yunqing Wangb17bfa42020-08-14 14:50:33 -070068 int64_t tpl_intra_cost[MAX_TPL_BLK_IN_SB * MAX_TPL_BLK_IN_SB];
chiyotsaic2f38412020-06-10 16:07:21 -070069 //! Motion vectors found by TPL model for each tpl block.
Yunqing Wangb17bfa42020-08-14 14:50:33 -070070 int_mv tpl_mv[MAX_TPL_BLK_IN_SB * MAX_TPL_BLK_IN_SB][INTER_REFS_PER_FRAME];
chiyotsaic2f38412020-06-10 16:07:21 -070071 //! TPL's stride for the arrays in this struct.
chiyotsaiff73c532020-04-21 12:50:12 -070072 int tpl_stride;
chiyotsaic2f38412020-06-10 16:07:21 -070073 /**@}*/
chiyotsaiff73c532020-04-21 12:50:12 -070074} SuperBlockEnc;
75
chiyotsaic2f38412020-06-10 16:07:21 -070076/*! \brief Stores the best performing modes.
77 */
Cherma Rajan A835f7a62019-09-25 11:04:39 +053078typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -070079 //! The mbmi used to reconstruct the winner mode.
Cherma Rajan A835f7a62019-09-25 11:04:39 +053080 MB_MODE_INFO mbmi;
chiyotsaic2f38412020-06-10 16:07:21 -070081 //! Rdstats of the winner mode.
Cherma Rajan Ad71ace62019-11-25 12:58:37 +053082 RD_STATS rd_cost;
chiyotsaic2f38412020-06-10 16:07:21 -070083 //! Rdcost of the winner mode
Cherma Rajan A835f7a62019-09-25 11:04:39 +053084 int64_t rd;
chiyotsaic2f38412020-06-10 16:07:21 -070085 //! Luma rate of the winner mode.
Cherma Rajan Ad71ace62019-11-25 12:58:37 +053086 int rate_y;
chiyotsaic2f38412020-06-10 16:07:21 -070087 //! Chroma rate of the winner mode.
Cherma Rajan Ad71ace62019-11-25 12:58:37 +053088 int rate_uv;
chiyotsaic2f38412020-06-10 16:07:21 -070089 //! The color map needed to reconstruct palette mode.
90 uint8_t color_index_map[MAX_SB_SQUARE];
91 //! The current winner mode.
Cherma Rajan Ad71ace62019-11-25 12:58:37 +053092 THR_MODES mode_index;
Cherma Rajan A835f7a62019-09-25 11:04:39 +053093} WinnerModeStats;
Yue Chenbd934232019-08-05 14:23:39 -070094
chiyotsaic2f38412020-06-10 16:07:21 -070095/*! \brief Each source plane of the current macroblock
96 *
97 * This struct also stores the txfm buffers and quantizer settings.
98 */
Yaowu Xuc27fc142016-08-22 16:08:15 -070099typedef struct macroblock_plane {
chiyotsaic2f38412020-06-10 16:07:21 -0700100 //! Stores source - pred so the txfm can be computed later
Chethan Kumar R Ea494e2b2021-03-18 17:19:44 +0530101 int16_t *src_diff;
chiyotsaic2f38412020-06-10 16:07:21 -0700102 //! Dequantized coefficients
Urvang Joshi9543ad72020-04-17 16:59:46 -0700103 tran_low_t *dqcoeff;
chiyotsaic2f38412020-06-10 16:07:21 -0700104 //! Quantized coefficients
Yaowu Xuc27fc142016-08-22 16:08:15 -0700105 tran_low_t *qcoeff;
chiyotsaic2f38412020-06-10 16:07:21 -0700106 //! Transformed coefficients
Yaowu Xuc27fc142016-08-22 16:08:15 -0700107 tran_low_t *coeff;
chiyotsaic2f38412020-06-10 16:07:21 -0700108 //! Location of the end of qcoeff (end of block).
Yaowu Xuc27fc142016-08-22 16:08:15 -0700109 uint16_t *eobs;
chiyotsaic2f38412020-06-10 16:07:21 -0700110 //! Contexts used to code the transform coefficients.
Angie Chiang74e23072017-03-24 14:54:23 -0700111 uint8_t *txb_entropy_ctx;
chiyotsaic2f38412020-06-10 16:07:21 -0700112 //! A buffer containing the source frame.
Yaowu Xuc27fc142016-08-22 16:08:15 -0700113 struct buf_2d src;
114
chiyotsaic2f38412020-06-10 16:07:21 -0700115 /*! \name Quantizer Settings
116 *
117 * \attention These are used/accessed only in the quantization process.
118 * RDO does not and *must not* depend on any of these values.
119 * All values below share the coefficient scale/shift used in TX.
120 */
121 /**@{*/
122 //! Quantization step size used by AV1_XFORM_QUANT_FP.
Monty Montgomery125c0fc2017-10-26 00:44:35 -0400123 const int16_t *quant_fp_QTX;
chiyotsaic2f38412020-06-10 16:07:21 -0700124 //! Offset used for rounding in the quantizer process by AV1_XFORM_QUANT_FP.
Monty Montgomery125c0fc2017-10-26 00:44:35 -0400125 const int16_t *round_fp_QTX;
chiyotsaic2f38412020-06-10 16:07:21 -0700126 //! Quantization step size used by AV1_XFORM_QUANT_B.
Monty Montgomery125c0fc2017-10-26 00:44:35 -0400127 const int16_t *quant_QTX;
chiyotsaic2f38412020-06-10 16:07:21 -0700128 //! Offset used for rounding in the quantizer process by AV1_XFORM_QUANT_B.
Monty Montgomery125c0fc2017-10-26 00:44:35 -0400129 const int16_t *round_QTX;
chiyotsaic2f38412020-06-10 16:07:21 -0700130 //! Scale factor to shift coefficients toward zero. Only used by QUANT_B.
131 const int16_t *quant_shift_QTX;
132 //! Size of the quantization bin around 0. Only Used by QUANT_B
133 const int16_t *zbin_QTX;
134 //! Dequantizer
Monty Montgomery125c0fc2017-10-26 00:44:35 -0400135 const int16_t *dequant_QTX;
chiyotsaic2f38412020-06-10 16:07:21 -0700136 /**@}*/
Yaowu Xuc27fc142016-08-22 16:08:15 -0700137} MACROBLOCK_PLANE;
138
chiyotsaic2f38412020-06-10 16:07:21 -0700139/*! \brief Costs for encoding the coefficients within a level.
140 *
141 * Covers everything including txb_skip, eob, dc_sign,
142 */
Jingning Handfd72322017-08-09 14:04:12 -0700143typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700144 //! Cost to skip txfm for the current txfm block.
Jingning Handfd72322017-08-09 14:04:12 -0700145 int txb_skip_cost[TXB_SKIP_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700146 /*! \brief Cost for encoding the base_eob of a level.
147 *
148 * Decoder uses base_eob to derive the base_level as base_eob := base_eob+1.
149 */
Dake He3fe369c2017-11-16 17:56:44 -0800150 int base_eob_cost[SIG_COEF_CONTEXTS_EOB][3];
chiyotsaic2f38412020-06-10 16:07:21 -0700151 /*! \brief Cost for encoding the base level of a coefficient.
152 *
153 * Decoder derives coeff_base as coeff_base := base_eob + 1.
154 */
Wenyao Liuf7e53752019-01-22 17:34:44 +0800155 int base_cost[SIG_COEF_CONTEXTS][8];
chiyotsaic2f38412020-06-10 16:07:21 -0700156 /*! \brief Cost for encoding the last non-zero coefficient.
157 *
158 * Eob is derived from eob_extra at the decoder as eob := eob_extra + 1
159 */
Angie Chiang7ab884e2017-10-18 15:57:12 -0700160 int eob_extra_cost[EOB_COEF_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700161 //! Cost for encoding the dc_sign
Jingning Handfd72322017-08-09 14:04:12 -0700162 int dc_sign_cost[DC_SIGN_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700163 //! Cost for encoding an increment to the coefficient
Wenyao Liuf7e53752019-01-22 17:34:44 +0800164 int lps_cost[LEVEL_CONTEXTS][COEFF_BASE_RANGE + 1 + COEFF_BASE_RANGE + 1];
Jingning Handfd72322017-08-09 14:04:12 -0700165} LV_MAP_COEFF_COST;
Jingning Hanf5a4d3b2017-08-27 23:01:19 -0700166
chiyotsaic2f38412020-06-10 16:07:21 -0700167/*! \brief Costs for encoding the eob.
168 */
Johannb0ef6ff2018-02-08 14:32:21 -0800169typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700170 //! eob_cost.
Johannb0ef6ff2018-02-08 14:32:21 -0800171 int eob_cost[2][11];
172} LV_MAP_EOB_COST;
Dake He0db7d0e2017-12-21 15:23:20 -0800173
chiyotsaic2f38412020-06-10 16:07:21 -0700174/*! \brief Stores the transforms coefficients for the whole superblock.
175 */
Jingning Hanf5a4d3b2017-08-27 23:01:19 -0700176typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700177 //! The transformed coefficients.
Jayasanker J2350ca32020-09-10 23:49:00 +0530178 tran_low_t *tcoeff[MAX_MB_PLANE];
chiyotsaic2f38412020-06-10 16:07:21 -0700179 //! Where the transformed coefficients end.
Jayasanker J2350ca32020-09-10 23:49:00 +0530180 uint16_t *eobs[MAX_MB_PLANE];
chiyotsaic2f38412020-06-10 16:07:21 -0700181 /*! \brief Transform block entropy contexts.
182 *
183 * Each element is used as a bit field.
184 * - Bits 0~3: txb_skip_ctx
185 * - Bits 4~5: dc_sign_ctx.
186 */
Jayasanker J2350ca32020-09-10 23:49:00 +0530187 uint8_t *entropy_ctx[MAX_MB_PLANE];
Jingning Hanf5a4d3b2017-08-27 23:01:19 -0700188} CB_COEFF_BUFFER;
Jingning Handfd72322017-08-09 14:04:12 -0700189
chiyotsaic2f38412020-06-10 16:07:21 -0700190/*! \brief Extended mode info derived from mbmi.
191 */
Yaowu Xuc27fc142016-08-22 16:08:15 -0700192typedef struct {
Angie Chiangc484abe2017-03-20 15:43:11 -0700193 // TODO(angiebird): Reduce the buffer size according to sb_type
chiyotsaic2f38412020-06-10 16:07:21 -0700194 //! The reference mv list for the current block.
Ravi Chaudharyfa73e202019-08-19 12:41:26 +0530195 CANDIDATE_MV ref_mv_stack[MODE_CTX_REF_FRAMES][USABLE_REF_MV_STACK_SIZE];
chiyotsaic2f38412020-06-10 16:07:21 -0700196 //! The weights used to compute the ref mvs.
Ravi Chaudharyfa73e202019-08-19 12:41:26 +0530197 uint16_t weight[MODE_CTX_REF_FRAMES][USABLE_REF_MV_STACK_SIZE];
chiyotsaic2f38412020-06-10 16:07:21 -0700198 //! Number of ref mvs in the drl.
Satish Kumar Suman69e93292018-11-28 16:05:33 +0530199 uint8_t ref_mv_count[MODE_CTX_REF_FRAMES];
chiyotsaic2f38412020-06-10 16:07:21 -0700200 //! Global mvs
201 int_mv global_mvs[REF_FRAMES];
202 //! Context used to encode the current mode.
203 int16_t mode_context[MODE_CTX_REF_FRAMES];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700204} MB_MODE_INFO_EXT;
205
chiyotsaic2f38412020-06-10 16:07:21 -0700206/*! \brief Stores best extended mode information at frame level.
207 *
208 * The frame level in here is used in bitstream preparation stage. The
209 * information in \ref MB_MODE_INFO_EXT are copied to this struct to save
210 * memory.
211 */
Remya0cce44c2019-08-16 11:57:24 +0530212typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700213 //! \copydoc MB_MODE_INFO_EXT::ref_mv_stack
Ravi Chaudharyfa73e202019-08-19 12:41:26 +0530214 CANDIDATE_MV ref_mv_stack[USABLE_REF_MV_STACK_SIZE];
chiyotsaic2f38412020-06-10 16:07:21 -0700215 //! \copydoc MB_MODE_INFO_EXT::weight
Ravi Chaudharyfa73e202019-08-19 12:41:26 +0530216 uint16_t weight[USABLE_REF_MV_STACK_SIZE];
chiyotsaic2f38412020-06-10 16:07:21 -0700217 //! \copydoc MB_MODE_INFO_EXT::ref_mv_count
Remya0cce44c2019-08-16 11:57:24 +0530218 uint8_t ref_mv_count;
chiyotsaic2f38412020-06-10 16:07:21 -0700219 // TODO(Ravi/Remya): Reduce the buffer size of global_mvs
220 //! \copydoc MB_MODE_INFO_EXT::global_mvs
221 int_mv global_mvs[REF_FRAMES];
222 //! \copydoc MB_MODE_INFO_EXT::mode_context
223 int16_t mode_context;
224 //! Offset of current coding block's coeff buffer relative to the sb.
Jayasanker J2350ca32020-09-10 23:49:00 +0530225 uint16_t cb_offset[PLANE_TYPES];
Remya0cce44c2019-08-16 11:57:24 +0530226} MB_MODE_INFO_EXT_FRAME;
227
venkat sanampudi4dad14a2021-10-21 20:26:18 +0530228/*! \brief Inter-mode txfm results for a partition block.
chiyotsaic2f38412020-06-10 16:07:21 -0700229 */
Alex Converse0fa0f422017-04-24 12:51:14 -0700230typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700231 //! Txfm size used if the current mode is intra mode.
Hui Su1ddf2312017-08-19 15:21:34 -0700232 TX_SIZE tx_size;
chiyotsaic2f38412020-06-10 16:07:21 -0700233 //! Txfm sizes used if the current mode is inter mode.
Hui Su7167d952018-02-01 16:33:12 -0800234 TX_SIZE inter_tx_size[INTER_TX_SIZE_BUF_LEN];
chiyotsaic2f38412020-06-10 16:07:21 -0700235 //! Map showing which txfm block skips the txfm process.
Hui Suf4b79c72018-03-22 13:14:36 -0700236 uint8_t blk_skip[MAX_MIB_SIZE * MAX_MIB_SIZE];
Sarah Parkerf492c1f2021-03-02 21:01:56 -0800237 //! Map showing the txfm types for each block.
Hui Su52b7ddc2019-10-10 16:27:16 -0700238 uint8_t tx_type_map[MAX_MIB_SIZE * MAX_MIB_SIZE];
chiyotsaic2f38412020-06-10 16:07:21 -0700239 //! Rd_stats for the whole partition block.
Hui Su1ddf2312017-08-19 15:21:34 -0700240 RD_STATS rd_stats;
chiyotsaic2f38412020-06-10 16:07:21 -0700241 //! Hash value of the current record.
Hui Su1ddf2312017-08-19 15:21:34 -0700242 uint32_t hash_value;
Hui Su6cb17c12018-03-09 12:56:20 -0800243} MB_RD_INFO;
Hui Su1ddf2312017-08-19 15:21:34 -0700244
venkat sanampudi4dad14a2021-10-21 20:26:18 +0530245/*! \brief Hash records of the inter-mode transform results
246 *
247 * Hash records of the inter-mode transform results for a whole partition block
248 * based on the residue. Since this operates on the partition block level, this
249 * can give us a whole txfm partition tree.
chiyotsaic2f38412020-06-10 16:07:21 -0700250 */
Hui Su1ddf2312017-08-19 15:21:34 -0700251typedef struct {
venkat sanampudi4dad14a2021-10-21 20:26:18 +0530252 /*! Circular buffer that stores the inter-mode txfm results of a partition
253 * block.
254 */
255 MB_RD_INFO mb_rd_info[RD_RECORD_BUFFER_LEN];
Jingning Han0ecc39c2021-09-22 16:07:06 -0700256 //! Index to insert the newest rd record.
Hui Su1ddf2312017-08-19 15:21:34 -0700257 int index_start;
chiyotsaic2f38412020-06-10 16:07:21 -0700258 //! Number of info stored in this record.
Hui Su1ddf2312017-08-19 15:21:34 -0700259 int num;
chiyotsaic2f38412020-06-10 16:07:21 -0700260 //! Hash function
261 CRC32C crc_calculator;
Hui Su6cb17c12018-03-09 12:56:20 -0800262} MB_RD_RECORD;
Hui Su1ddf2312017-08-19 15:21:34 -0700263
chiyotsaic2f38412020-06-10 16:07:21 -0700264//! Number of compound rd stats
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530265#define MAX_COMP_RD_STATS 64
chiyotsaic2f38412020-06-10 16:07:21 -0700266/*! \brief Rdcost stats in compound mode.
267 */
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530268typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700269 //! Rate of the compound modes.
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530270 int32_t rate[COMPOUND_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700271 //! Distortion of the compound modes.
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530272 int64_t dist[COMPOUND_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700273 //! Estimated rate of the compound modes.
Venkat457e32e2019-12-19 17:44:05 +0530274 int32_t model_rate[COMPOUND_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700275 //! Estimated distortion of the compound modes.
Venkat457e32e2019-12-19 17:44:05 +0530276 int64_t model_dist[COMPOUND_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700277 //! Rate need to send the mask type.
venkat sanampudic88148e2020-01-03 12:57:28 +0530278 int comp_rs2[COMPOUND_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700279 //! Motion vector for each predictor.
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530280 int_mv mv[2];
chiyotsaic2f38412020-06-10 16:07:21 -0700281 //! Ref frame for each predictor.
Hui Sud06ff662019-01-23 16:53:05 -0800282 MV_REFERENCE_FRAME ref_frames[2];
chiyotsaic2f38412020-06-10 16:07:21 -0700283 //! Current prediction mode.
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530284 PREDICTION_MODE mode;
chiyotsaic2f38412020-06-10 16:07:21 -0700285 //! Current interpolation filter.
Ravi Chaudhary1e4f94b2019-06-20 16:19:49 +0530286 int_interpfilters filter;
chiyotsaic2f38412020-06-10 16:07:21 -0700287 //! Refmv index in the drl.
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530288 int ref_mv_idx;
chiyotsaic2f38412020-06-10 16:07:21 -0700289 //! Whether the predictors are GLOBALMV.
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530290 int is_global[2];
chiyotsaic2f38412020-06-10 16:07:21 -0700291 //! Current parameters for interinter mode.
venkat sanampudic88148e2020-01-03 12:57:28 +0530292 INTERINTER_COMPOUND_DATA interinter_comp;
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530293} COMP_RD_STATS;
294
chiyotsaic2f38412020-06-10 16:07:21 -0700295/*! \brief Contains buffers used to speed up rdopt for obmc.
296 *
297 * See the comments for calc_target_weighted_pred for details.
298 */
Hui Su38711e72019-06-11 10:49:47 -0700299typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700300 /*! \brief A new source weighted with the above and left predictors.
301 *
302 * Used to efficiently construct multiple obmc predictors during rdopt.
303 */
chiyotsaid2b12212020-04-28 20:57:19 -0700304 int32_t *wsrc;
chiyotsaic2f38412020-06-10 16:07:21 -0700305 /*! \brief A new mask constructed from the original horz/vert mask.
306 *
307 * \copydetails wsrc
308 */
chiyotsaid2b12212020-04-28 20:57:19 -0700309 int32_t *mask;
chiyotsaic2f38412020-06-10 16:07:21 -0700310 /*! \brief Prediction from the up predictor.
311 *
312 * Used to build the obmc predictor.
313 */
chiyotsaid2b12212020-04-28 20:57:19 -0700314 uint8_t *above_pred;
chiyotsaic2f38412020-06-10 16:07:21 -0700315 /*! \brief Prediction from the up predictor.
316 *
317 * \copydetails above_pred
318 */
chiyotsaid2b12212020-04-28 20:57:19 -0700319 uint8_t *left_pred;
320} OBMCBuffer;
321
chiyotsaic2f38412020-06-10 16:07:21 -0700322/*! \brief Contains color maps used in palette mode.
323 */
324typedef struct {
325 //! The best color map found.
326 uint8_t best_palette_color_map[MAX_PALETTE_SQUARE];
327 //! A temporary buffer used for k-means clustering.
328 int kmeans_data_buf[2 * MAX_PALETTE_SQUARE];
329} PALETTE_BUFFER;
330
331/*! \brief Contains buffers used by av1_compound_type_rd()
332 *
333 * For sizes and alignment of these arrays, refer to
334 * alloc_compound_type_rd_buffers() function.
335 */
336typedef struct {
337 //! First prediction.
338 uint8_t *pred0;
339 //! Second prediction.
340 uint8_t *pred1;
341 //! Source - first prediction.
342 int16_t *residual1;
343 //! Second prediction - first prediction.
344 int16_t *diff10;
345 //! Backup of the best segmentation mask.
346 uint8_t *tmp_best_mask_buf;
347} CompoundTypeRdBuffers;
348
349/*! \brief Holds some parameters related to partitioning schemes in AV1.
350 */
chiyotsai68eefbe2020-05-01 15:07:58 -0700351// TODO(chiyotsai@google.com): Consolidate this with SIMPLE_MOTION_DATA_TREE
352typedef struct {
353#if !CONFIG_REALTIME_ONLY
354 // The following 4 parameters are used for cnn-based partitioning on intra
355 // frame.
chiyotsaic2f38412020-06-10 16:07:21 -0700356 /*! \brief Current index on the partition block quad tree.
357 *
358 * Used to index into the cnn buffer for partition decision.
359 */
chiyotsai68eefbe2020-05-01 15:07:58 -0700360 int quad_tree_idx;
chiyotsaic2f38412020-06-10 16:07:21 -0700361 //! Whether the CNN buffer contains valid output.
chiyotsai68eefbe2020-05-01 15:07:58 -0700362 int cnn_output_valid;
chiyotsaic2f38412020-06-10 16:07:21 -0700363 //! A buffer used by our segmentation CNN for intra-frame partitioning.
chiyotsai68eefbe2020-05-01 15:07:58 -0700364 float cnn_buffer[CNN_OUT_BUF_SIZE];
chiyotsaic2f38412020-06-10 16:07:21 -0700365 //! log of the quantization parameter of the ancestor BLOCK_64X64.
chiyotsai68eefbe2020-05-01 15:07:58 -0700366 float log_q;
367#endif
368
chiyotsaic2f38412020-06-10 16:07:21 -0700369 /*! \brief Variance of the subblocks in the superblock.
370 *
371 * This is used by rt mode for variance based partitioning.
372 * The indices corresponds to the following block sizes:
373 * - 0 - 128x128
374 * - 1-2 - 128x64
375 * - 3-4 - 64x128
376 * - 5-8 - 64x64
377 * - 9-16 - 64x32
378 * - 17-24 - 32x64
379 * - 25-40 - 32x32
380 * - 41-104 - 16x16
381 */
chiyotsai68eefbe2020-05-01 15:07:58 -0700382 uint8_t variance_low[105];
383} PartitionSearchInfo;
384
chiyotsaic2f38412020-06-10 16:07:21 -0700385/*! \brief Defines the parameters used to perform txfm search.
386 *
387 * For the most part, this determines how various speed features are used.
388 */
chiyotsaia36d9002020-04-29 16:48:21 -0700389typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700390 /*! \brief Whether to limit the intra txfm search type to the default txfm.
391 *
392 * This could either be a result of either sequence parameter or speed
393 * features.
394 */
chiyotsaia36d9002020-04-29 16:48:21 -0700395 int use_default_intra_tx_type;
S Hamsalekhaf48f5302021-08-10 16:51:42 +0530396
S Hamsalekhab7a5b232021-08-06 13:11:33 +0530397 /*! Probability threshold used for conditionally forcing tx type*/
398 int default_inter_tx_type_prob_thresh;
chiyotsaia36d9002020-04-29 16:48:21 -0700399
chiyotsaic2f38412020-06-10 16:07:21 -0700400 //! Whether to prune 2d transforms based on 1d transform results.
chiyotsaia36d9002020-04-29 16:48:21 -0700401 int prune_2d_txfm_mode;
402
chiyotsaic2f38412020-06-10 16:07:21 -0700403 /*! \brief Variable from \ref WinnerModeParams based on current eval mode.
404 *
405 * See the documentation for \ref WinnerModeParams for more detail.
406 */
Akshata Jadhavbd0eb432021-01-13 14:33:47 +0530407 unsigned int coeff_opt_thresholds[2];
408 /*! \copydoc coeff_opt_thresholds */
chiyotsaia36d9002020-04-29 16:48:21 -0700409 unsigned int tx_domain_dist_threshold;
Akshata Jadhavbd0eb432021-01-13 14:33:47 +0530410 /*! \copydoc coeff_opt_thresholds */
chiyotsaia36d9002020-04-29 16:48:21 -0700411 TX_SIZE_SEARCH_METHOD tx_size_search_method;
Akshata Jadhavbd0eb432021-01-13 14:33:47 +0530412 /*! \copydoc coeff_opt_thresholds */
chiyotsaia36d9002020-04-29 16:48:21 -0700413 unsigned int use_transform_domain_distortion;
Akshata Jadhavbd0eb432021-01-13 14:33:47 +0530414 /*! \copydoc coeff_opt_thresholds */
chiyotsaia36d9002020-04-29 16:48:21 -0700415 unsigned int skip_txfm_level;
416
chiyotsaic2f38412020-06-10 16:07:21 -0700417 /*! \brief How to search for the optimal tx_size
418 *
419 * If ONLY_4X4, use TX_4X4; if TX_MODE_LARGEST, use the largest tx_size for
420 * the current partition block; if TX_MODE_SELECT, search through the whole
421 * tree.
422 *
423 * \attention
424 * Although this looks suspicious similar to a bitstream element, this
425 * tx_mode_search_type is only used internally by the encoder, and is *not*
426 * written to the bitstream. It determines what kind of tx_mode would be
427 * searched. For example, we might set it to TX_MODE_LARGEST to find a good
428 * candidate, then code it as TX_MODE_SELECT.
429 */
chiyotsaia36d9002020-04-29 16:48:21 -0700430 TX_MODE tx_mode_search_type;
Ravi Chaudhary6eaea622020-08-28 10:28:24 +0530431
432 /*!
433 * Flag to enable/disable DC block prediction.
434 */
435 unsigned int predict_dc_level;
Luca Versari6807a7f2021-12-20 21:41:20 +0100436
437 /*!
438 * Whether or not we should use the quantization matrix as weights for PSNR
439 * during RD search.
440 */
441 int use_qm_dist_metric;
venkat sanampudi7b82db52022-04-26 22:44:41 +0530442
443 /*!
444 * Keep track of previous mode evaluation stage type. This will be used to
445 * reset mb rd hash record when mode evaluation type changes.
446 */
447 int mode_eval_type;
chiyotsaia36d9002020-04-29 16:48:21 -0700448} TxfmSearchParams;
449
chiyotsaic2f38412020-06-10 16:07:21 -0700450/*!\cond */
chiyotsai4c1e5c62020-04-30 17:54:14 -0700451#define MAX_NUM_8X8_TXBS ((MAX_MIB_SIZE >> 1) * (MAX_MIB_SIZE >> 1))
452#define MAX_NUM_16X16_TXBS ((MAX_MIB_SIZE >> 2) * (MAX_MIB_SIZE >> 2))
453#define MAX_NUM_32X32_TXBS ((MAX_MIB_SIZE >> 3) * (MAX_MIB_SIZE >> 3))
454#define MAX_NUM_64X64_TXBS ((MAX_MIB_SIZE >> 4) * (MAX_MIB_SIZE >> 4))
chiyotsaic2f38412020-06-10 16:07:21 -0700455/*!\endcond */
chiyotsai4c1e5c62020-04-30 17:54:14 -0700456
chiyotsaic2f38412020-06-10 16:07:21 -0700457/*! \brief Stores various encoding/search decisions related to txfm search.
458 *
459 * This struct contains a cache of previous txfm results, and some buffers for
460 * the current txfm decision.
461 */
chiyotsai4c1e5c62020-04-30 17:54:14 -0700462typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700463 //! Whether to skip transform and quantization on a partition block level.
chiyotsai4c1e5c62020-04-30 17:54:14 -0700464 int skip_txfm;
465
chiyotsaic2f38412020-06-10 16:07:21 -0700466 /*! \brief Whether to skip transform and quantization on a txfm block level.
467 *
468 * Skips transform and quantization on a transform block level inside the
469 * current partition block. Each element of this array is used as a bit-field.
470 * So for example, the we are skipping on the luma plane, then the last bit
471 * would be set to 1.
472 */
chiyotsai4c1e5c62020-04-30 17:54:14 -0700473 uint8_t blk_skip[MAX_MIB_SIZE * MAX_MIB_SIZE];
474
chiyotsaic2f38412020-06-10 16:07:21 -0700475 /*! \brief Transform types inside the partition block
476 *
477 * Keeps a record of what kind of transform to use for each of the transform
478 * block inside the partition block.
479 * \attention The buffer here is *never* directly used. Instead, this just
480 * allocates the memory for MACROBLOCKD::tx_type_map during rdopt on the
481 * partition block. So if we need to save memory, we could move the allocation
482 * to pick_sb_mode instead.
483 */
chiyotsai4c1e5c62020-04-30 17:54:14 -0700484 uint8_t tx_type_map_[MAX_MIB_SIZE * MAX_MIB_SIZE];
485
venkat sanampudi4dad14a2021-10-21 20:26:18 +0530486 //! Txfm hash records of inter-modes.
venkat sanampudie61793d2021-10-13 14:26:05 +0530487 MB_RD_RECORD *mb_rd_record;
chiyotsai4c1e5c62020-04-30 17:54:14 -0700488
chiyotsaic2f38412020-06-10 16:07:21 -0700489 /*! \brief Number of txb splits.
490 *
491 * Keep track of how many times we've used split tx partition for transform
492 * blocks. Somewhat misleadingly, this parameter doesn't actually keep track
493 * of the count of the current block. Instead, it's a cumulative count across
494 * of the whole frame. The main usage is that if txb_split_count is zero, then
495 * we can signal TX_MODE_LARGEST at frame level.
496 */
chiyotsai4c1e5c62020-04-30 17:54:14 -0700497 // TODO(chiyotsai@google.com): Move this to a more appropriate location such
498 // as ThreadData.
499 unsigned int txb_split_count;
500#if CONFIG_SPEED_STATS
chiyotsaic2f38412020-06-10 16:07:21 -0700501 //! For debugging. Used to check how many txfm searches we are doing.
chiyotsai4c1e5c62020-04-30 17:54:14 -0700502 unsigned int tx_search_count;
503#endif // CONFIG_SPEED_STATS
504} TxfmSearchInfo;
chiyotsaic2f38412020-06-10 16:07:21 -0700505#undef MAX_NUM_8X8_TXBS
506#undef MAX_NUM_16X16_TXBS
507#undef MAX_NUM_32X32_TXBS
508#undef MAX_NUM_64X64_TXBS
chiyotsai4c1e5c62020-04-30 17:54:14 -0700509
chiyotsaic2f38412020-06-10 16:07:21 -0700510/*! \brief Holds the entropy costs for various modes sent to the bitstream.
511 *
512 * \attention This does not include the costs for mv and transformed
513 * coefficients.
514 */
chiyotsai9a06d182020-05-01 17:12:12 -0700515typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700516 /*****************************************************************************
517 * \name Partition Costs
518 ****************************************************************************/
519 /**@{*/
520 //! Cost for coding the partition.
chiyotsai9a06d182020-05-01 17:12:12 -0700521 int partition_cost[PARTITION_CONTEXTS][EXT_PARTITION_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700522 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700523
chiyotsaic2f38412020-06-10 16:07:21 -0700524 /*****************************************************************************
525 * \name Intra Costs: General
526 ****************************************************************************/
527 /**@{*/
528 //! Luma mode cost for inter frame.
529 int mbmode_cost[BLOCK_SIZE_GROUPS][INTRA_MODES];
530 //! Luma mode cost for intra frame.
531 int y_mode_costs[INTRA_MODES][INTRA_MODES][INTRA_MODES];
532 //! Chroma mode cost
chiyotsai9a06d182020-05-01 17:12:12 -0700533 int intra_uv_mode_cost[CFL_ALLOWED_TYPES][INTRA_MODES][UV_INTRA_MODES];
chiyotsaic2f38412020-06-10 16:07:21 -0700534 //! filter_intra_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700535 int filter_intra_cost[BLOCK_SIZES_ALL][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700536 //! filter_intra_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700537 int filter_intra_mode_cost[FILTER_INTRA_MODES];
chiyotsaic2f38412020-06-10 16:07:21 -0700538 //! angle_delta_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700539 int angle_delta_cost[DIRECTIONAL_MODES][2 * MAX_ANGLE_DELTA + 1];
540
chiyotsaic2f38412020-06-10 16:07:21 -0700541 //! Rate rate associated with each alpha codeword
542 int cfl_cost[CFL_JOINT_SIGNS][CFL_PRED_PLANES][CFL_ALPHABET_SIZE];
543 /**@}*/
544
545 /*****************************************************************************
546 * \name Intra Costs: Screen Contents
547 ****************************************************************************/
548 /**@{*/
549 //! intrabc_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700550 int intrabc_cost[2];
551
chiyotsaic2f38412020-06-10 16:07:21 -0700552 //! palette_y_size_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700553 int palette_y_size_cost[PALATTE_BSIZE_CTXS][PALETTE_SIZES];
chiyotsaic2f38412020-06-10 16:07:21 -0700554 //! palette_uv_size_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700555 int palette_uv_size_cost[PALATTE_BSIZE_CTXS][PALETTE_SIZES];
chiyotsaic2f38412020-06-10 16:07:21 -0700556 //! palette_y_color_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700557 int palette_y_color_cost[PALETTE_SIZES][PALETTE_COLOR_INDEX_CONTEXTS]
558 [PALETTE_COLORS];
chiyotsaic2f38412020-06-10 16:07:21 -0700559 //! palette_uv_color_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700560 int palette_uv_color_cost[PALETTE_SIZES][PALETTE_COLOR_INDEX_CONTEXTS]
561 [PALETTE_COLORS];
chiyotsaic2f38412020-06-10 16:07:21 -0700562 //! palette_y_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700563 int palette_y_mode_cost[PALATTE_BSIZE_CTXS][PALETTE_Y_MODE_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700564 //! palette_uv_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700565 int palette_uv_mode_cost[PALETTE_UV_MODE_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700566 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700567
chiyotsaic2f38412020-06-10 16:07:21 -0700568 /*****************************************************************************
569 * \name Inter Costs: MV Modes
570 ****************************************************************************/
571 /**@{*/
572 //! skip_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700573 int skip_mode_cost[SKIP_MODE_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700574 //! newmv_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700575 int newmv_mode_cost[NEWMV_MODE_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700576 //! zeromv_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700577 int zeromv_mode_cost[GLOBALMV_MODE_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700578 //! refmv_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700579 int refmv_mode_cost[REFMV_MODE_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700580 //! drl_mode_cost0
chiyotsai9a06d182020-05-01 17:12:12 -0700581 int drl_mode_cost0[DRL_MODE_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700582 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700583
chiyotsaic2f38412020-06-10 16:07:21 -0700584 /*****************************************************************************
585 * \name Inter Costs: Ref Frame Types
586 ****************************************************************************/
587 /**@{*/
588 //! single_ref_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700589 int single_ref_cost[REF_CONTEXTS][SINGLE_REFS - 1][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700590 //! comp_inter_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700591 int comp_inter_cost[COMP_INTER_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700592 //! comp_ref_type_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700593 int comp_ref_type_cost[COMP_REF_TYPE_CONTEXTS]
594 [CDF_SIZE(COMP_REFERENCE_TYPES)];
chiyotsaic2f38412020-06-10 16:07:21 -0700595 //! uni_comp_ref_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700596 int uni_comp_ref_cost[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1]
597 [CDF_SIZE(2)];
chiyotsaic2f38412020-06-10 16:07:21 -0700598 /*! \brief Cost for signaling ref_frame[0] in bidir-comp mode
599 *
600 * Includes LAST_FRAME, LAST2_FRAME, LAST3_FRAME, and GOLDEN_FRAME.
601 */
chiyotsai9a06d182020-05-01 17:12:12 -0700602 int comp_ref_cost[REF_CONTEXTS][FWD_REFS - 1][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700603 /*! \brief Cost for signaling ref_frame[1] in bidir-comp mode
604 *
605 * Includes ALTREF_FRAME, ALTREF2_FRAME, and BWDREF_FRAME.
606 */
chiyotsai9a06d182020-05-01 17:12:12 -0700607 int comp_bwdref_cost[REF_CONTEXTS][BWD_REFS - 1][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700608 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700609
chiyotsaic2f38412020-06-10 16:07:21 -0700610 /*****************************************************************************
611 * \name Inter Costs: Compound Types
612 ****************************************************************************/
613 /**@{*/
614 //! intra_inter_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700615 int intra_inter_cost[INTRA_INTER_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700616 //! inter_compound_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700617 int inter_compound_mode_cost[INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES];
chiyotsaic2f38412020-06-10 16:07:21 -0700618 //! compound_type_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700619 int compound_type_cost[BLOCK_SIZES_ALL][MASKED_COMPOUND_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700620 //! wedge_idx_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700621 int wedge_idx_cost[BLOCK_SIZES_ALL][16];
chiyotsaic2f38412020-06-10 16:07:21 -0700622 //! interintra_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700623 int interintra_cost[BLOCK_SIZE_GROUPS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700624 //! wedge_interintra_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700625 int wedge_interintra_cost[BLOCK_SIZES_ALL][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700626 //! interintra_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700627 int interintra_mode_cost[BLOCK_SIZE_GROUPS][INTERINTRA_MODES];
chiyotsaic2f38412020-06-10 16:07:21 -0700628 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700629
chiyotsaic2f38412020-06-10 16:07:21 -0700630 /*****************************************************************************
631 * \name Inter Costs: Compound Masks
632 ****************************************************************************/
633 /**@{*/
634 //! comp_idx_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700635 int comp_idx_cost[COMP_INDEX_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700636 //! comp_group_idx_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700637 int comp_group_idx_cost[COMP_GROUP_IDX_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700638 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700639
chiyotsaic2f38412020-06-10 16:07:21 -0700640 /*****************************************************************************
641 * \name Inter Costs: Motion Modes/Filters
642 ****************************************************************************/
643 /**@{*/
644 //! motion_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700645 int motion_mode_cost[BLOCK_SIZES_ALL][MOTION_MODES];
chiyotsaic2f38412020-06-10 16:07:21 -0700646 //! motion_mode_cost1
chiyotsai9a06d182020-05-01 17:12:12 -0700647 int motion_mode_cost1[BLOCK_SIZES_ALL][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700648 //! switchable_interp_costs
chiyotsai9a06d182020-05-01 17:12:12 -0700649 int switchable_interp_costs[SWITCHABLE_FILTER_CONTEXTS][SWITCHABLE_FILTERS];
chiyotsaic2f38412020-06-10 16:07:21 -0700650 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700651
chiyotsaic2f38412020-06-10 16:07:21 -0700652 /*****************************************************************************
653 * \name Txfm Mode Costs
654 ****************************************************************************/
655 /**@{*/
656 //! skip_txfm_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700657 int skip_txfm_cost[SKIP_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700658 //! tx_size_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700659 int tx_size_cost[TX_SIZES - 1][TX_SIZE_CONTEXTS][TX_SIZES];
chiyotsaic2f38412020-06-10 16:07:21 -0700660 //! txfm_partition_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700661 int txfm_partition_cost[TXFM_PARTITION_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700662 //! inter_tx_type_costs
chiyotsai9a06d182020-05-01 17:12:12 -0700663 int inter_tx_type_costs[EXT_TX_SETS_INTER][EXT_TX_SIZES][TX_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700664 //! intra_tx_type_costs
chiyotsai9a06d182020-05-01 17:12:12 -0700665 int intra_tx_type_costs[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES]
666 [TX_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700667 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700668
chiyotsaic2f38412020-06-10 16:07:21 -0700669 /*****************************************************************************
670 * \name Restoration Mode Costs
671 ****************************************************************************/
672 /**@{*/
673 //! switchable_restore_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700674 int switchable_restore_cost[RESTORE_SWITCHABLE_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700675 //! wiener_restore_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700676 int wiener_restore_cost[2];
chiyotsaic2f38412020-06-10 16:07:21 -0700677 //! sgrproj_restore_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700678 int sgrproj_restore_cost[2];
chiyotsaic2f38412020-06-10 16:07:21 -0700679 /**@}*/
Jingning Han564fe2c2022-03-08 23:35:01 -0800680
681 /*****************************************************************************
682 * \name Segmentation Mode Costs
683 ****************************************************************************/
684 /**@{*/
685 //! tmp_pred_cost
686 int tmp_pred_cost[SEG_TEMPORAL_PRED_CTXS][2];
687 //! spatial_pred_cost
688 int spatial_pred_cost[SPATIAL_PREDICTION_PROBS][MAX_SEGMENTS];
689 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700690} ModeCosts;
691
chiyotsaic2f38412020-06-10 16:07:21 -0700692/*! \brief Holds mv costs for encoding and motion search.
693 */
chiyotsai9a06d182020-05-01 17:12:12 -0700694typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700695 /*****************************************************************************
chiyotsaic2f38412020-06-10 16:07:21 -0700696 * \name Encoding Costs
697 * Here are the entropy costs needed to encode a given mv.
698 * \ref nmv_cost_alloc and \ref nmv_cost_hp_alloc are two arrays that holds
699 * the memory for holding the mv cost. But since the motion vectors can be
700 * negative, we shift them to the middle and store the resulting pointer in
701 * \ref nmv_cost and \ref nmv_cost_hp for easier referencing. Finally, \ref
702 * mv_cost_stack points to the \ref nmv_cost with the mv precision we are
703 * currently working with. In essence, only \ref mv_cost_stack is needed for
704 * motion search, the other can be considered private.
705 ****************************************************************************/
706 /**@{*/
707 //! Costs for coding the zero components.
chiyotsai9a06d182020-05-01 17:12:12 -0700708 int nmv_joint_cost[MV_JOINTS];
709
chiyotsaic2f38412020-06-10 16:07:21 -0700710 //! Allocates memory for 1/4-pel motion vector costs.
chiyotsai9a06d182020-05-01 17:12:12 -0700711 int nmv_cost_alloc[2][MV_VALS];
chiyotsaic2f38412020-06-10 16:07:21 -0700712 //! Allocates memory for 1/8-pel motion vector costs.
chiyotsai9a06d182020-05-01 17:12:12 -0700713 int nmv_cost_hp_alloc[2][MV_VALS];
chiyotsaic2f38412020-06-10 16:07:21 -0700714 //! Points to the middle of \ref nmv_cost_alloc
chiyotsai9a06d182020-05-01 17:12:12 -0700715 int *nmv_cost[2];
chiyotsaic2f38412020-06-10 16:07:21 -0700716 //! Points to the middle of \ref nmv_cost_hp_alloc
chiyotsai9a06d182020-05-01 17:12:12 -0700717 int *nmv_cost_hp[2];
chiyotsaic2f38412020-06-10 16:07:21 -0700718 //! Points to the nmv_cost_hp in use.
chiyotsai9a06d182020-05-01 17:12:12 -0700719 int **mv_cost_stack;
chiyotsaic2f38412020-06-10 16:07:21 -0700720 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700721} MvCosts;
722
chiyotsai41fd15c2021-03-15 14:12:02 -0700723/*! \brief Holds mv costs for intrabc.
724 */
725typedef struct {
726 /*! Costs for coding the joint mv. */
727 int joint_mv[MV_JOINTS];
728
729 /*! \brief Cost of transmitting the actual motion vector.
chiyotsaiad4d3ea2021-03-17 13:53:01 -0700730 * dv_costs_alloc[0][i] is the cost of motion vector with horizontal
731 * component (mv_row) equal to i - MV_MAX. dv_costs_alloc[1][i] is the cost of
chiyotsai41fd15c2021-03-15 14:12:02 -0700732 * motion vector with vertical component (mv_col) equal to i - MV_MAX.
733 */
734 int dv_costs_alloc[2][MV_VALS];
735
736 /*! Points to the middle of \ref dv_costs_alloc. */
737 int *dv_costs[2];
738} IntraBCMVCosts;
739
chiyotsaic2f38412020-06-10 16:07:21 -0700740/*! \brief Holds the costs needed to encode the coefficients
741 */
chiyotsai9a06d182020-05-01 17:12:12 -0700742typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700743 //! Costs for coding the coefficients.
chiyotsai9a06d182020-05-01 17:12:12 -0700744 LV_MAP_COEFF_COST coeff_costs[TX_SIZES][PLANE_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700745 //! Costs for coding the eobs.
chiyotsai9a06d182020-05-01 17:12:12 -0700746 LV_MAP_EOB_COST eob_costs[7][2];
747} CoeffCosts;
748
chiyotsaic2f38412020-06-10 16:07:21 -0700749/*!\cond */
750// 4: NEAREST, NEW, NEAR, GLOBAL
751#define SINGLE_REF_MODES ((REF_FRAMES - 1) * 4)
752/*!\endcond */
Ravi Chaudhary5d970f42018-09-25 11:25:32 +0530753struct inter_modes_info;
chiyotsaic2f38412020-06-10 16:07:21 -0700754
Hui Su69af3f52020-10-06 16:28:57 -0700755/*! \brief Holds the motion samples for warp motion model estimation
756 */
757typedef struct {
758 //! Number of samples.
759 int num;
760 //! Sample locations in current frame.
761 int pts[16];
762 //! Sample location in the reference frame.
763 int pts_inref[16];
764} WARP_SAMPLE_INFO;
765
Marco Paniconi988b34a2020-11-09 12:41:13 -0800766/*!\cond */
767typedef enum {
Marco Paniconifa924c52022-01-11 14:57:41 -0800768 kZeroSad = 0,
Marco Paniconi988b34a2020-11-09 12:41:13 -0800769 kLowSad = 1,
770 kMedSad = 2,
771 kHighSad = 3
772} SOURCE_SAD;
773
774typedef struct {
Neeraj Gadgilb538d632022-04-13 15:18:02 +0530775 //! SAD levels in non-rd path for var-based part and inter-mode search
776 SOURCE_SAD source_sad_nonrd;
777 //! SAD levels in rd-path for var-based part qindex thresholds
778 SOURCE_SAD source_sad_rd;
Marco Paniconi988b34a2020-11-09 12:41:13 -0800779 int lighting_change;
780 int low_sumdiff;
781} CONTENT_STATE_SB;
Jayasanker J759b3202021-03-24 19:12:32 +0530782
783// Structure to hold pixel level gradient info.
784typedef struct {
785 uint16_t abs_dx_abs_dy_sum;
786 int8_t hist_bin_idx;
787 bool is_dx_zero;
788} PixelLevelGradientInfo;
789
Mudassir Galagnathad268362021-12-27 10:57:44 +0530790// Structure to hold the variance and log(1 + variance) for 4x4 sub-blocks.
791typedef struct {
792 double log_var;
793 int var;
794} Block4x4VarInfo;
795
chiyotsaid2c9d9d2022-04-28 14:23:33 -0700796#ifndef NDEBUG
797typedef struct SetOffsetsLoc {
798 int mi_row;
799 int mi_col;
800 BLOCK_SIZE bsize;
801} SetOffsetsLoc;
802#endif // NDEBUG
803
Marco Paniconi988b34a2020-11-09 12:41:13 -0800804/*!\endcond */
805
chiyotsaic2f38412020-06-10 16:07:21 -0700806/*! \brief Encoder's parameters related to the current coding block.
807 *
808 * This struct contains most of the information the encoder needs to encode the
809 * current coding block. This includes the src and pred buffer, a copy of the
810 * decoder's view of the current block, the txfm coefficients. This struct also
811 * contains various buffers and data used to speed up the encoding process.
812 */
813typedef struct macroblock {
814 /*****************************************************************************
815 * \name Source, Buffers and Decoder
816 ****************************************************************************/
817 /**@{*/
818 /*! \brief Each of the encoding plane.
819 *
820 * An array holding the src buffer for each of plane of the current block. It
821 * also contains the txfm and quantized txfm coefficients.
822 */
Yaowu Xuc27fc142016-08-22 16:08:15 -0700823 struct macroblock_plane plane[MAX_MB_PLANE];
824
chiyotsaic2f38412020-06-10 16:07:21 -0700825 /*! \brief Decoder's view of current coding block.
826 *
827 * Contains the encoder's copy of what the decoder sees in the current block.
828 * Most importantly, this struct contains pointers to mbmi that is used in
829 * final bitstream packing.
830 */
Yaowu Xuc27fc142016-08-22 16:08:15 -0700831 MACROBLOCKD e_mbd;
chiyotsai85d715a2020-05-02 15:10:33 -0700832
chiyotsaic2f38412020-06-10 16:07:21 -0700833 /*! \brief Derived coding information.
834 *
835 * Contains extra information not transmitted in the bitstream but are
836 * derived. For example, this contains the stack of ref_mvs.
837 */
chiyotsai0b90c412020-09-29 14:48:16 -0700838 MB_MODE_INFO_EXT mbmi_ext;
chiyotsai85d715a2020-05-02 15:10:33 -0700839
chiyotsaic2f38412020-06-10 16:07:21 -0700840 /*! \brief Finalized mbmi_ext for the whole frame.
841 *
842 * Contains the finalized info in mbmi_ext that gets used at the frame level
843 * for bitstream packing.
844 */
Remya0cce44c2019-08-16 11:57:24 +0530845 MB_MODE_INFO_EXT_FRAME *mbmi_ext_frame;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700846
chiyotsaic2f38412020-06-10 16:07:21 -0700847 //! Entropy context for the current row.
chiyotsai85d715a2020-05-02 15:10:33 -0700848 FRAME_CONTEXT *row_ctx;
chiyotsaic2f38412020-06-10 16:07:21 -0700849 /*! \brief Entropy context for the current tile.
850 *
851 * This context will be used to update color_map_cdf pointer which would be
852 * used during pack bitstream. For single thread and tile-multithreading case
853 * this pointer will be same as xd->tile_ctx, but for the case of row-mt:
854 * xd->tile_ctx will point to a temporary context while tile_pb_ctx will point
855 * to the accurate tile context.
856 */
chiyotsai85d715a2020-05-02 15:10:33 -0700857 FRAME_CONTEXT *tile_pb_ctx;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700858
chiyotsaic2f38412020-06-10 16:07:21 -0700859 /*! \brief Buffer of transformed coefficients
860 *
861 * Points to cb_coef_buff in the AV1_COMP struct, which contains the finalized
862 * coefficients. This is here to conveniently copy the best coefficients to
863 * frame level for bitstream packing. Since CB_COEFF_BUFFER is allocated on a
864 * superblock level, we need to combine it with cb_offset to get the proper
865 * position for the current coding block.
866 */
chiyotsai85d715a2020-05-02 15:10:33 -0700867 CB_COEFF_BUFFER *cb_coef_buff;
chiyotsaic2f38412020-06-10 16:07:21 -0700868 //! Offset of current coding block's coeff buffer relative to the sb.
Jayasanker J2350ca32020-09-10 23:49:00 +0530869 uint16_t cb_offset[PLANE_TYPES];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700870
chiyotsaic2f38412020-06-10 16:07:21 -0700871 //! Modified source and masks used for fast OBMC search.
chiyotsaid2b12212020-04-28 20:57:19 -0700872 OBMCBuffer obmc_buffer;
chiyotsaic2f38412020-06-10 16:07:21 -0700873 //! Buffer to store the best palette map.
Yaowu Xuc27fc142016-08-22 16:08:15 -0700874 PALETTE_BUFFER *palette_buffer;
chiyotsaic2f38412020-06-10 16:07:21 -0700875 //! Buffer used for compound_type_rd().
Hui Su38711e72019-06-11 10:49:47 -0700876 CompoundTypeRdBuffers comp_rd_buffer;
chiyotsaic2f38412020-06-10 16:07:21 -0700877 //! Buffer to store convolution during averaging process in compound mode.
Urvang Joshi0a4cfad2018-09-07 11:10:39 -0700878 CONV_BUF_TYPE *tmp_conv_dst;
chiyotsai2a897eb2020-04-28 19:22:13 -0700879
chiyotsaic2f38412020-06-10 16:07:21 -0700880 /*! \brief Temporary buffer to hold prediction.
881 *
882 * Points to a buffer that is used to hold temporary prediction results. This
883 * is used in two ways:
Sarah Parkerf492c1f2021-03-02 21:01:56 -0800884 * - This is a temporary buffer used to ping-pong the prediction in
chiyotsaic2f38412020-06-10 16:07:21 -0700885 * handle_inter_mode.
886 * - xd->tmp_obmc_bufs also points to this buffer, and is used in ombc
887 * prediction.
888 */
chiyotsai2a897eb2020-04-28 19:22:13 -0700889 uint8_t *tmp_pred_bufs[2];
chiyotsaic2f38412020-06-10 16:07:21 -0700890 /**@}*/
Urvang Joshi0a4cfad2018-09-07 11:10:39 -0700891
chiyotsaic2f38412020-06-10 16:07:21 -0700892 /*****************************************************************************
893 * \name Rdopt Costs
894 ****************************************************************************/
895 /**@{*/
896 /*! \brief Quantization index for the current partition block.
897 *
898 * This is used to as the index to find quantization parameter for luma and
899 * chroma transformed coefficients.
900 */
chiyotsai9a06d182020-05-01 17:12:12 -0700901 int qindex;
902
chiyotsaic2f38412020-06-10 16:07:21 -0700903 /*! \brief Difference between frame-level qindex and current qindex.
904 *
905 * This is used to track whether a non-zero delta for qindex is used at least
906 * once in the current frame.
907 */
chiyotsai9a06d182020-05-01 17:12:12 -0700908 int delta_qindex;
909
chiyotsaic2f38412020-06-10 16:07:21 -0700910 /*! \brief Rate-distortion multiplier.
911 *
912 * The rd multiplier used to determine the rate-distortion trade-off. This is
913 * roughly proportional to the inverse of q-index for a given frame, but this
914 * can be manipulated for better rate-control. For example, in tune_ssim
915 * mode, this is scaled by a factor related to the variance of the current
916 * block.
917 */
chiyotsai9a06d182020-05-01 17:12:12 -0700918 int rdmult;
919
James Zernf8caf012022-03-03 16:11:01 -0800920 //! Intra only, per sb rd adjustment.
Paul Wilkinsc19e09e2022-02-08 14:46:39 +0000921 int intra_sb_rdmult_modifier;
922
Jingning Han3b96bb32021-11-18 15:05:42 -0800923 //! Superblock level distortion propagation factor.
924 double rb;
925
chiyotsaic2f38412020-06-10 16:07:21 -0700926 //! Energy in the current source coding block. Used to calculate \ref rdmult
chiyotsai85d715a2020-05-02 15:10:33 -0700927 int mb_energy;
chiyotsaic2f38412020-06-10 16:07:21 -0700928 //! Energy in the current source superblock. Used to calculate \ref rdmult
chiyotsai85d715a2020-05-02 15:10:33 -0700929 int sb_energy_level;
930
chiyotsaic2f38412020-06-10 16:07:21 -0700931 //! The rate needed to signal a mode to the bitstream.
chiyotsai9a06d182020-05-01 17:12:12 -0700932 ModeCosts mode_costs;
933
chiyotsaic2f38412020-06-10 16:07:21 -0700934 //! The rate needed to encode a new motion vector to the bitstream and some
935 //! multipliers for motion search.
Fyodor Kyslov648c6502021-02-02 18:41:10 -0800936 MvCosts *mv_costs;
chiyotsai9a06d182020-05-01 17:12:12 -0700937
chiyotsai41fd15c2021-03-15 14:12:02 -0700938 /*! The rate needed to encode a new motion vector to the bitstream in intrabc
939 * mode.
940 */
941 IntraBCMVCosts *dv_costs;
942
chiyotsaic2f38412020-06-10 16:07:21 -0700943 //! The rate needed to signal the txfm coefficients to the bitstream.
chiyotsai9a06d182020-05-01 17:12:12 -0700944 CoeffCosts coeff_costs;
chiyotsaic2f38412020-06-10 16:07:21 -0700945 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700946
Fyodor Kyslov648c6502021-02-02 18:41:10 -0800947 /*****************************************************************************
948 * \name Rate to Distortion Multipliers
949 ****************************************************************************/
950 /**@{*/
951 //! A multiplier that converts mv cost to l2 error.
952 int errorperbit;
953 //! A multiplier that converts mv cost to l1 error.
954 int sadperbit;
955 /**@}*/
956
chiyotsaic2f38412020-06-10 16:07:21 -0700957 /******************************************************************************
958 * \name Segmentation
959 *****************************************************************************/
960 /**@{*/
961 /*! \brief Skip mode for the segment
962 *
963 * A syntax element of the segmentation mode. In skip_block mode, all mvs are
964 * set 0 and all txfms are skipped.
965 */
chiyotsai85d715a2020-05-02 15:10:33 -0700966 int seg_skip_block;
Cherma Rajan Ad27a1472021-02-19 11:35:40 +0530967
968 /*! \brief Number of segment 1 blocks
969 * Actual number of (4x4) blocks that were applied delta-q,
970 * for segment 1.
971 */
972 int actual_num_seg1_blocks;
973
974 /*!\brief Number of segment 2 blocks
975 * Actual number of (4x4) blocks that were applied delta-q,
976 * for segment 2.
977 */
978 int actual_num_seg2_blocks;
979
980 /*!\brief Number of zero motion vectors
981 */
982 int cnt_zeromv;
Marco Paniconi7ae16352022-03-08 00:19:24 -0800983
984 /*!\brief Flag to force zeromv-skip block, for nonrd path.
985 */
986 int force_zeromv_skip;
Nithya V S8bb0c792022-03-14 15:48:24 +0530987
988 /*! \brief Previous segment id for which qmatrices were updated.
989 * This is used to bypass setting of qmatrices if no change in qindex.
990 */
991 int prev_segment_id;
chiyotsaic2f38412020-06-10 16:07:21 -0700992 /**@}*/
chiyotsai85d715a2020-05-02 15:10:33 -0700993
chiyotsaic2f38412020-06-10 16:07:21 -0700994 /*****************************************************************************
995 * \name Superblock
996 ****************************************************************************/
997 /**@{*/
998 //! Information on a whole superblock level.
chiyotsai85d715a2020-05-02 15:10:33 -0700999 // TODO(chiyotsai@google.com): Refactor this out of macroblock
1000 SuperBlockEnc sb_enc;
1001
chiyotsaic2f38412020-06-10 16:07:21 -07001002 /*! \brief Characteristics of the current superblock.
1003 *
1004 * Characteristics like whether the block has high sad, low sad, etc. This is
1005 * only used by av1 realtime mode.
1006 */
Marco Paniconi988b34a2020-11-09 12:41:13 -08001007 CONTENT_STATE_SB content_state_sb;
chiyotsaic2f38412020-06-10 16:07:21 -07001008 /**@}*/
chiyotsai85d715a2020-05-02 15:10:33 -07001009
chiyotsaic2f38412020-06-10 16:07:21 -07001010 /*****************************************************************************
chiyotsai3afb03e2020-09-08 13:30:12 -07001011 * \name Reference Frame Search
chiyotsaic2f38412020-06-10 16:07:21 -07001012 ****************************************************************************/
1013 /**@{*/
1014 /*! \brief Sum absolute distortion of the predicted mv for each ref frame.
1015 *
1016 * This is used to measure how viable a reference frame is.
1017 */
chiyotsai85d715a2020-05-02 15:10:33 -07001018 int pred_mv_sad[REF_FRAMES];
Deepa K G9f7fe722022-04-28 12:33:31 +05301019 /*! \brief The minimum of \ref pred_mv_sad.
1020 *
1021 * Index 0 stores the minimum \ref pred_mv_sad across past reference frames.
1022 * Index 1 stores the minimum \ref pred_mv_sad across future reference frames.
1023 */
1024 int best_pred_mv_sad[2];
Marco Paniconiaaf2c562021-06-07 14:22:11 -07001025 //! The sad of the 1st mv ref (nearest).
Marco Paniconi737820e2021-05-24 11:03:38 -07001026 int pred_mv0_sad[REF_FRAMES];
Marco Paniconiaaf2c562021-06-07 14:22:11 -07001027 //! The sad of the 2nd mv ref (near).
Marco Paniconi737820e2021-05-24 11:03:38 -07001028 int pred_mv1_sad[REF_FRAMES];
chiyotsai85d715a2020-05-02 15:10:33 -07001029
chiyotsaic2f38412020-06-10 16:07:21 -07001030 /*! \brief Disables certain ref frame pruning based on tpl.
1031 *
1032 * Determines whether a given ref frame is "good" based on data from the TPL
1033 * model. If so, this stops selective_ref frame from pruning the given ref
1034 * frame at block level.
1035 */
chiyotsai85d715a2020-05-02 15:10:33 -07001036 uint8_t tpl_keep_ref_frame[REF_FRAMES];
1037
Hui Su69af3f52020-10-06 16:28:57 -07001038 /*! \brief Warp motion samples buffer.
1039 *
1040 * Store the motion samples used for warp motion.
1041 */
1042 WARP_SAMPLE_INFO warp_sample_info[REF_FRAMES];
1043
chiyotsaic2f38412020-06-10 16:07:21 -07001044 /*! \brief Reference frames picked by the square subblocks in a superblock.
1045 *
1046 * Keeps track of ref frames that are selected by square partition blocks
1047 * within a superblock, in MI resolution. They can be used to prune ref frames
1048 * for rectangular blocks.
1049 */
chiyotsai85d715a2020-05-02 15:10:33 -07001050 int picked_ref_frames_mask[MAX_MIB_SIZE * MAX_MIB_SIZE];
1051
chiyotsaic2f38412020-06-10 16:07:21 -07001052 /*! \brief Prune ref frames in real-time mode.
1053 *
1054 * Determines whether to prune reference frames in real-time mode. For the
1055 * most part, this is the same as nonrd_prune_ref_frame_search in
1056 * cpi->sf.rt_sf.nonrd_prune_ref_frame_search, but this can be selectively
1057 * turned off if the only frame available is GOLDEN_FRAME.
1058 */
chiyotsai85d715a2020-05-02 15:10:33 -07001059 int nonrd_prune_ref_frame_search;
chiyotsaic2f38412020-06-10 16:07:21 -07001060 /**@}*/
chiyotsai85d715a2020-05-02 15:10:33 -07001061
chiyotsaic2f38412020-06-10 16:07:21 -07001062 /*****************************************************************************
1063 * \name Partition Search
1064 ****************************************************************************/
1065 /**@{*/
1066 //! Stores some partition-search related buffers.
chiyotsai68eefbe2020-05-01 15:07:58 -07001067 PartitionSearchInfo part_search_info;
1068
chiyotsaic2f38412020-06-10 16:07:21 -07001069 /*! \brief Whether to disable some features to force a mode in current block.
1070 *
1071 * In some cases, our speed features can be overly aggressive and remove all
1072 * modes search in the superblock. When this happens, we set
1073 * must_find_valid_partition to 1 to reduce the number of speed features, and
1074 * recode the superblock again.
1075 */
chiyotsai85d715a2020-05-02 15:10:33 -07001076 int must_find_valid_partition;
chiyotsaic2f38412020-06-10 16:07:21 -07001077 /**@}*/
chiyotsai85d715a2020-05-02 15:10:33 -07001078
chiyotsaic2f38412020-06-10 16:07:21 -07001079 /*****************************************************************************
1080 * \name Prediction Mode Search
1081 ****************************************************************************/
1082 /**@{*/
1083 /*! \brief Inter skip mode.
1084 *
1085 * Skip mode tries to use the closest forward and backward references for
1086 * inter prediction. Skip here means to skip transmitting the reference
1087 * frames, not to be confused with skip_txfm.
1088 */
chiyotsai85d715a2020-05-02 15:10:33 -07001089 int skip_mode;
1090
chiyotsaic2f38412020-06-10 16:07:21 -07001091 /*! \brief Factors used for rd-thresholding.
1092 *
1093 * Determines a rd threshold to determine whether to continue searching the
1094 * current mode. If the current best rd is already <= threshold, then we skip
1095 * the current mode.
1096 */
chiyotsai85d715a2020-05-02 15:10:33 -07001097 int thresh_freq_fact[BLOCK_SIZES_ALL][MAX_MODES];
1098
chiyotsaic2f38412020-06-10 16:07:21 -07001099 /*! \brief Tracks the winner modes in the current coding block.
1100 *
1101 * Winner mode is a two-pass strategy to find the best prediction mode. In the
1102 * first pass, we search the prediction modes with a limited set of txfm
1103 * options, and keep the top modes. These modes are called the winner modes.
1104 * In the second pass, we retry the winner modes with more thorough txfm
1105 * options.
1106 */
Chethan Kumar R Ea494e2b2021-03-18 17:19:44 +05301107 WinnerModeStats *winner_mode_stats;
chiyotsaic2f38412020-06-10 16:07:21 -07001108 //! Tracks how many winner modes there are.
chiyotsai85d715a2020-05-02 15:10:33 -07001109 int winner_mode_count;
1110
chiyotsaic2f38412020-06-10 16:07:21 -07001111 /*! \brief The model used for rd-estimation to avoid txfm
1112 *
1113 * These are for inter_mode_rd_model_estimation, which is another two pass
1114 * approach. In this speed feature, we collect data in the first couple frames
1115 * to build an rd model to estimate the rdcost of a prediction model based on
1116 * the residue error. Once enough data is collected, this speed feature uses
1117 * the estimated rdcost to find the most performant prediction mode. Then we
1118 * follow up with a second pass find the best transform for the mode.
1119 * Determines if one would go with reduced complexity transform block
1120 * search model to select prediction modes, or full complexity model
1121 * to select transform kernel.
1122 */
chiyotsai85d715a2020-05-02 15:10:33 -07001123 TXFM_RD_MODEL rd_model;
1124
chiyotsaic2f38412020-06-10 16:07:21 -07001125 /*! \brief Stores the inter mode information needed to build an rd model.
1126 *
1127 * These are for inter_mode_rd_model_estimation, which is another two pass
1128 * approach. In this speed feature, we collect data in the first couple frames
1129 * to build an rd model to estimate the rdcost of a prediction model based on
1130 * the residue error. Once enough data is collected, this speed feature uses
1131 * the estimated rdcost to find the most performant prediction mode. Then we
1132 * follow up with a second pass find the best transform for the mode.
1133 */
chiyotsai85d715a2020-05-02 15:10:33 -07001134 // TODO(any): try to consolidate this speed feature with winner mode
1135 // processing.
1136 struct inter_modes_info *inter_modes_info;
1137
chiyotsaic2f38412020-06-10 16:07:21 -07001138 //! How to blend the compound predictions.
chiyotsai85d715a2020-05-02 15:10:33 -07001139 uint8_t compound_idx;
1140
chiyotsaic2f38412020-06-10 16:07:21 -07001141 //! A caches of results of compound type search so they can be reused later.
chiyotsai85d715a2020-05-02 15:10:33 -07001142 COMP_RD_STATS comp_rd_stats[MAX_COMP_RD_STATS];
chiyotsaic2f38412020-06-10 16:07:21 -07001143 //! The idx for the latest compound mode in the cache \ref comp_rd_stats.
chiyotsai85d715a2020-05-02 15:10:33 -07001144 int comp_rd_stats_idx;
1145
chiyotsaic2f38412020-06-10 16:07:21 -07001146 /*! \brief Whether to recompute the luma prediction.
1147 *
1148 * In interpolation search, we can usually skip recalculating the luma
1149 * prediction because it is already calculated by a previous predictor. This
1150 * flag signifies that some modes might have been skipped, so we need to
1151 * rebuild the prediction.
1152 */
chiyotsai85d715a2020-05-02 15:10:33 -07001153 int recalc_luma_mc_data;
1154
chiyotsaic2f38412020-06-10 16:07:21 -07001155 /*! \brief Data structure to speed up intrabc search.
1156 *
1157 * Contains the hash table, hash function, and buffer used for intrabc.
1158 */
1159 IntraBCHashInfo intrabc_hash_info;
chiyotsai3afb03e2020-09-08 13:30:12 -07001160
Aniket Wanareb69e9902021-03-09 14:01:33 +05301161 /*! \brief Whether to reuse the mode stored in mb_mode_cache. */
1162 int use_mb_mode_cache;
1163 /*! \brief The mode to reuse during \ref av1_rd_pick_intra_mode_sb and
1164 * \ref av1_rd_pick_inter_mode. */
1165 const MB_MODE_INFO *mb_mode_cache;
Jayasanker J759b3202021-03-24 19:12:32 +05301166 /*! \brief Pointer to the buffer which caches gradient information.
1167 *
1168 * Pointer to the array of structures to store gradient information of each
1169 * pixel in a superblock. The buffer constitutes of MAX_SB_SQUARE pixel level
1170 * structures for each of the plane types (PLANE_TYPE_Y and PLANE_TYPE_UV).
1171 */
1172 PixelLevelGradientInfo *pixel_gradient_info;
1173 /*! \brief Flags indicating the availability of cached gradient info. */
1174 bool is_sb_gradient_cached[PLANE_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -07001175 /**@}*/
1176
1177 /*****************************************************************************
1178 * \name MV Search
1179 ****************************************************************************/
1180 /**@{*/
1181 /*! \brief Context used to determine the initial step size in motion search.
1182 *
1183 * This context is defined as the \f$l_\inf\f$ norm of the best ref_mvs for
1184 * each frame.
1185 */
1186 unsigned int max_mv_context[REF_FRAMES];
1187
1188 /*! \brief Limit for the range of motion vectors.
1189 *
1190 * These define limits to motion vector components to prevent them from
1191 * extending outside the UMV borders
1192 */
1193 FullMvLimits mv_limits;
1194 /**@}*/
1195
1196 /*****************************************************************************
1197 * \name Txfm Search
1198 ****************************************************************************/
1199 /**@{*/
1200 /*! \brief Parameters that control how motion search is done.
1201 *
1202 * Stores various txfm search related parameters such as txfm_type, txfm_size,
1203 * trellis eob search, etc.
1204 */
chiyotsaia36d9002020-04-29 16:48:21 -07001205 TxfmSearchParams txfm_search_params;
Nithya V Sd0276ac2019-10-24 11:31:06 +05301206
chiyotsaic2f38412020-06-10 16:07:21 -07001207 /*! \brief Results of the txfm searches that have been done.
1208 *
1209 * Caches old txfm search results and keeps the current txfm decisions to
1210 * facilitate rdopt.
1211 */
chiyotsai4c1e5c62020-04-30 17:54:14 -07001212 TxfmSearchInfo txfm_search_info;
1213
chiyotsaic2f38412020-06-10 16:07:21 -07001214 /*! \brief Whether there is a strong color activity.
1215 *
1216 * Used in REALTIME coding mode to enhance the visual quality at the boundary
1217 * of moving color objects.
1218 */
Marco Paniconi737820e2021-05-24 11:03:38 -07001219 uint8_t color_sensitivity_sb[2];
Marco Paniconiaaf2c562021-06-07 14:22:11 -07001220 //! Color sensitivity flag for the coding block.
chiyotsai85d715a2020-05-02 15:10:33 -07001221 uint8_t color_sensitivity[2];
chiyotsaic2f38412020-06-10 16:07:21 -07001222 /**@}*/
Jingning Han185d23b2020-03-04 09:12:05 -08001223
chiyotsaic2f38412020-06-10 16:07:21 -07001224 /*****************************************************************************
1225 * \name Misc
1226 ****************************************************************************/
1227 /**@{*/
1228 //! Variance of the source frame.
chiyotsai85d715a2020-05-02 15:10:33 -07001229 unsigned int source_variance;
chiyotsaic2f38412020-06-10 16:07:21 -07001230 //! SSE of the current predictor.
chiyotsai85d715a2020-05-02 15:10:33 -07001231 unsigned int pred_sse[REF_FRAMES];
Fyodor Kyslov28af7872020-09-25 18:41:45 -07001232 //! Prediction for ML based partition.
Fyodor Kyslov2c528682021-01-25 11:03:31 -08001233#if CONFIG_RT_ML_PARTITIONING
Fyodor Kyslov28af7872020-09-25 18:41:45 -07001234 DECLARE_ALIGNED(16, uint8_t, est_pred[128 * 128]);
Fyodor Kyslov2c528682021-01-25 11:03:31 -08001235#endif
chiyotsaic2f38412020-06-10 16:07:21 -07001236 /**@}*/
Vishnu Teja Manyam6ee38272021-08-12 10:33:44 +05301237
1238 /*! \brief NONE partition evaluated for merge.
1239 *
1240 * In variance based partitioning scheme, NONE & SPLIT partitions are
1241 * evaluated to check the SPLIT can be merged as NONE. This flag signifies the
1242 * partition is evaluated in the scheme.
1243 */
1244 int try_merge_partition;
Mudassir Galagnathad268362021-12-27 10:57:44 +05301245
1246 /*! \brief Pointer to buffer which caches sub-block variances in a superblock.
1247 *
1248 * Pointer to the array of structures to store source variance information of
1249 * each 4x4 sub-block in a superblock. Block4x4VarInfo structure is used to
Paul Wilkins2c8db512022-03-02 14:35:08 +00001250 * store source variance and log of source variance of each 4x4 sub-block.
Mudassir Galagnathad268362021-12-27 10:57:44 +05301251 */
1252 Block4x4VarInfo *src_var_info_of_4x4_sub_blocks;
chiyotsaid2c9d9d2022-04-28 14:23:33 -07001253#ifndef NDEBUG
1254 /*! \brief A hash to make sure av1_set_offsets is called */
1255 SetOffsetsLoc last_set_offsets_loc;
1256#endif // NDEBUG
chiyotsaic2f38412020-06-10 16:07:21 -07001257} MACROBLOCK;
1258#undef SINGLE_REF_MODES
Yaowu Xuc27fc142016-08-22 16:08:15 -07001259
chiyotsaic2f38412020-06-10 16:07:21 -07001260/*!\cond */
Vincent Rabaud5a44b622021-06-29 12:07:14 +02001261// Zeroes out 'n_stats' elements in the array x->winner_mode_stats.
1262// It only zeroes out what is necessary in 'color_index_map' (just the block
1263// size, not the whole array).
1264static INLINE void zero_winner_mode_stats(BLOCK_SIZE bsize, int n_stats,
1265 WinnerModeStats *stats) {
Mudassir Galagnathb9bdc592022-03-30 22:05:27 +05301266 // When winner mode stats are not required, the memory allocation is avoided
1267 // for x->winner_mode_stats. The stats pointer will be NULL in such cases.
1268 if (stats == NULL) return;
1269
Vincent Rabaud5a44b622021-06-29 12:07:14 +02001270 const int block_height = block_size_high[bsize];
1271 const int block_width = block_size_wide[bsize];
1272 for (int i = 0; i < n_stats; ++i) {
1273 WinnerModeStats *const stat = &stats[i];
1274 memset(&stat->mbmi, 0, sizeof(stat->mbmi));
1275 memset(&stat->rd_cost, 0, sizeof(stat->rd_cost));
1276 memset(&stat->rd, 0, sizeof(stat->rd));
1277 memset(&stat->rate_y, 0, sizeof(stat->rate_y));
1278 memset(&stat->rate_uv, 0, sizeof(stat->rate_uv));
1279 // Do not reset the whole array as it is CPU intensive.
1280 memset(&stat->color_index_map, 0,
1281 block_width * block_height * sizeof(stat->color_index_map[0]));
1282 memset(&stat->mode_index, 0, sizeof(stat->mode_index));
1283 }
1284}
1285
Frederic Barbier0f191da2018-01-03 17:29:26 +01001286static INLINE int is_rect_tx_allowed_bsize(BLOCK_SIZE bsize) {
1287 static const char LUT[BLOCK_SIZES_ALL] = {
1288 0, // BLOCK_4X4
1289 1, // BLOCK_4X8
1290 1, // BLOCK_8X4
1291 0, // BLOCK_8X8
1292 1, // BLOCK_8X16
1293 1, // BLOCK_16X8
1294 0, // BLOCK_16X16
1295 1, // BLOCK_16X32
1296 1, // BLOCK_32X16
1297 0, // BLOCK_32X32
1298 1, // BLOCK_32X64
1299 1, // BLOCK_64X32
1300 0, // BLOCK_64X64
Frederic Barbier0f191da2018-01-03 17:29:26 +01001301 0, // BLOCK_64X128
1302 0, // BLOCK_128X64
1303 0, // BLOCK_128X128
Frederic Barbier0f191da2018-01-03 17:29:26 +01001304 1, // BLOCK_4X16
1305 1, // BLOCK_16X4
1306 1, // BLOCK_8X32
1307 1, // BLOCK_32X8
1308 1, // BLOCK_16X64
1309 1, // BLOCK_64X16
Frederic Barbier0f191da2018-01-03 17:29:26 +01001310 };
1311
1312 return LUT[bsize];
1313}
1314
1315static INLINE int is_rect_tx_allowed(const MACROBLOCKD *xd,
1316 const MB_MODE_INFO *mbmi) {
chiyotsai0f5cd052020-08-27 14:37:44 -07001317 return is_rect_tx_allowed_bsize(mbmi->bsize) &&
Frederic Barbier0f191da2018-01-03 17:29:26 +01001318 !xd->lossless[mbmi->segment_id];
1319}
1320
Frederic Barbier4b56b102018-03-30 16:09:34 +02001321static INLINE int tx_size_to_depth(TX_SIZE tx_size, BLOCK_SIZE bsize) {
Urvang Joshidd0376f2018-05-02 16:37:25 -07001322 TX_SIZE ctx_size = max_txsize_rect_lookup[bsize];
Frederic Barbier0f191da2018-01-03 17:29:26 +01001323 int depth = 0;
1324 while (tx_size != ctx_size) {
1325 depth++;
Frederic Barbier4b56b102018-03-30 16:09:34 +02001326 ctx_size = sub_tx_size_map[ctx_size];
Frederic Barbier0f191da2018-01-03 17:29:26 +01001327 assert(depth <= MAX_TX_DEPTH);
1328 }
1329 return depth;
1330}
1331
chiyotsai4c1e5c62020-04-30 17:54:14 -07001332static INLINE void set_blk_skip(uint8_t txb_skip[], int plane, int blk_idx,
Grant Hsu39248c32018-09-18 10:38:44 +08001333 int skip) {
1334 if (skip)
chiyotsai4c1e5c62020-04-30 17:54:14 -07001335 txb_skip[blk_idx] |= 1UL << plane;
Grant Hsu39248c32018-09-18 10:38:44 +08001336 else
chiyotsai4c1e5c62020-04-30 17:54:14 -07001337 txb_skip[blk_idx] &= ~(1UL << plane);
Grant Hsu39248c32018-09-18 10:38:44 +08001338#ifndef NDEBUG
1339 // Set chroma planes to uninitialized states when luma is set to check if
1340 // it will be set later
1341 if (plane == 0) {
chiyotsai4c1e5c62020-04-30 17:54:14 -07001342 txb_skip[blk_idx] |= 1UL << (1 + 4);
1343 txb_skip[blk_idx] |= 1UL << (2 + 4);
Grant Hsu39248c32018-09-18 10:38:44 +08001344 }
1345
1346 // Clear the initialization checking bit
chiyotsai4c1e5c62020-04-30 17:54:14 -07001347 txb_skip[blk_idx] &= ~(1UL << (plane + 4));
Grant Hsu39248c32018-09-18 10:38:44 +08001348#endif
1349}
1350
chiyotsai4c1e5c62020-04-30 17:54:14 -07001351static INLINE int is_blk_skip(uint8_t *txb_skip, int plane, int blk_idx) {
Grant Hsu39248c32018-09-18 10:38:44 +08001352#ifndef NDEBUG
1353 // Check if this is initialized
chiyotsai4c1e5c62020-04-30 17:54:14 -07001354 assert(!(txb_skip[blk_idx] & (1UL << (plane + 4))));
Grant Hsu39248c32018-09-18 10:38:44 +08001355
1356 // The magic number is 0x77, this is to test if there is garbage data
chiyotsai4c1e5c62020-04-30 17:54:14 -07001357 assert((txb_skip[blk_idx] & 0x88) == 0);
Grant Hsu39248c32018-09-18 10:38:44 +08001358#endif
chiyotsai4c1e5c62020-04-30 17:54:14 -07001359 return (txb_skip[blk_idx] >> plane) & 1;
Grant Hsu39248c32018-09-18 10:38:44 +08001360}
1361
chiyotsaic2f38412020-06-10 16:07:21 -07001362/*!\endcond */
1363
Yaowu Xuc27fc142016-08-22 16:08:15 -07001364#ifdef __cplusplus
1365} // extern "C"
1366#endif
1367
James Zerne1cbb132018-08-22 14:10:36 -07001368#endif // AOM_AV1_ENCODER_BLOCK_H_