blob: 3ecc3fb12efc737b89619af08e912aede94dd3c6 [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 intra winner modes kept
Cherma Rajan Ad71ace62019-11-25 12:58:37 +053040#define MAX_WINNER_MODE_COUNT_INTRA 3
chiyotsaic2f38412020-06-10 16:07:21 -070041//! Number of inter winner modes kept
Cherma Rajan Ad71ace62019-11-25 12:58:37 +053042#define MAX_WINNER_MODE_COUNT_INTER 1
chiyotsaic2f38412020-06-10 16:07:21 -070043//! Number of txfm hash records kept for the partition block.
44#define RD_RECORD_BUFFER_LEN 8
45//! Number of txfm hash records kept for the txfm block.
46#define TX_SIZE_RD_RECORD_BUFFER_LEN 256
chiyotsaiff73c532020-04-21 12:50:12 -070047
S Hamsalekhab7a5b232021-08-06 13:11:33 +053048/*! Maximum value taken by transform type probabilities */
49#define MAX_TX_TYPE_PROB 1024
chiyotsaic2f38412020-06-10 16:07:21 -070050/*! \brief Superblock level encoder info
51 *
52 * SuperblockEnc stores superblock level information used by the encoder for
53 * more efficient encoding. Currently this is mostly used to store TPL data
54 * for the current superblock.
55 */
chiyotsaiff73c532020-04-21 12:50:12 -070056typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -070057 //! Maximum partition size for the sb.
chiyotsai68eefbe2020-05-01 15:07:58 -070058 BLOCK_SIZE min_partition_size;
chiyotsaic2f38412020-06-10 16:07:21 -070059 //! Minimum partition size for the sb.
chiyotsai68eefbe2020-05-01 15:07:58 -070060 BLOCK_SIZE max_partition_size;
61
chiyotsaic2f38412020-06-10 16:07:21 -070062 /*****************************************************************************
63 * \name TPL Info
64 *
Yunqing Wangb17bfa42020-08-14 14:50:33 -070065 * Information gathered from tpl_model at tpl block precision for the
chiyotsaic2f38412020-06-10 16:07:21 -070066 * superblock to speed up the encoding process..
67 ****************************************************************************/
68 /**@{*/
69 //! Number of TPL blocks in this superblock.
chiyotsaiff73c532020-04-21 12:50:12 -070070 int tpl_data_count;
chiyotsaic2f38412020-06-10 16:07:21 -070071 //! TPL's estimate of inter cost for each tpl block.
Yunqing Wangb17bfa42020-08-14 14:50:33 -070072 int64_t tpl_inter_cost[MAX_TPL_BLK_IN_SB * MAX_TPL_BLK_IN_SB];
chiyotsaic2f38412020-06-10 16:07:21 -070073 //! TPL's estimate of tpl cost for each tpl block.
Yunqing Wangb17bfa42020-08-14 14:50:33 -070074 int64_t tpl_intra_cost[MAX_TPL_BLK_IN_SB * MAX_TPL_BLK_IN_SB];
chiyotsaic2f38412020-06-10 16:07:21 -070075 //! Motion vectors found by TPL model for each tpl block.
Yunqing Wangb17bfa42020-08-14 14:50:33 -070076 int_mv tpl_mv[MAX_TPL_BLK_IN_SB * MAX_TPL_BLK_IN_SB][INTER_REFS_PER_FRAME];
chiyotsaic2f38412020-06-10 16:07:21 -070077 //! TPL's stride for the arrays in this struct.
chiyotsaiff73c532020-04-21 12:50:12 -070078 int tpl_stride;
chiyotsaic2f38412020-06-10 16:07:21 -070079 /**@}*/
chiyotsaiff73c532020-04-21 12:50:12 -070080} SuperBlockEnc;
81
chiyotsaic2f38412020-06-10 16:07:21 -070082/*! \brief Stores the best performing modes.
83 */
Cherma Rajan A835f7a62019-09-25 11:04:39 +053084typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -070085 //! The mbmi used to reconstruct the winner mode.
Cherma Rajan A835f7a62019-09-25 11:04:39 +053086 MB_MODE_INFO mbmi;
chiyotsaic2f38412020-06-10 16:07:21 -070087 //! Rdstats of the winner mode.
Cherma Rajan Ad71ace62019-11-25 12:58:37 +053088 RD_STATS rd_cost;
chiyotsaic2f38412020-06-10 16:07:21 -070089 //! Rdcost of the winner mode
Cherma Rajan A835f7a62019-09-25 11:04:39 +053090 int64_t rd;
chiyotsaic2f38412020-06-10 16:07:21 -070091 //! Luma rate of the winner mode.
Cherma Rajan Ad71ace62019-11-25 12:58:37 +053092 int rate_y;
chiyotsaic2f38412020-06-10 16:07:21 -070093 //! Chroma rate of the winner mode.
Cherma Rajan Ad71ace62019-11-25 12:58:37 +053094 int rate_uv;
chiyotsaic2f38412020-06-10 16:07:21 -070095 //! The color map needed to reconstruct palette mode.
96 uint8_t color_index_map[MAX_SB_SQUARE];
97 //! The current winner mode.
Cherma Rajan Ad71ace62019-11-25 12:58:37 +053098 THR_MODES mode_index;
Cherma Rajan A835f7a62019-09-25 11:04:39 +053099} WinnerModeStats;
Yue Chenbd934232019-08-05 14:23:39 -0700100
chiyotsaic2f38412020-06-10 16:07:21 -0700101/*! \brief Each source plane of the current macroblock
102 *
103 * This struct also stores the txfm buffers and quantizer settings.
104 */
Yaowu Xuc27fc142016-08-22 16:08:15 -0700105typedef struct macroblock_plane {
chiyotsaic2f38412020-06-10 16:07:21 -0700106 //! Stores source - pred so the txfm can be computed later
Chethan Kumar R Ea494e2b2021-03-18 17:19:44 +0530107 int16_t *src_diff;
chiyotsaic2f38412020-06-10 16:07:21 -0700108 //! Dequantized coefficients
Urvang Joshi9543ad72020-04-17 16:59:46 -0700109 tran_low_t *dqcoeff;
chiyotsaic2f38412020-06-10 16:07:21 -0700110 //! Quantized coefficients
Yaowu Xuc27fc142016-08-22 16:08:15 -0700111 tran_low_t *qcoeff;
chiyotsaic2f38412020-06-10 16:07:21 -0700112 //! Transformed coefficients
Yaowu Xuc27fc142016-08-22 16:08:15 -0700113 tran_low_t *coeff;
chiyotsaic2f38412020-06-10 16:07:21 -0700114 //! Location of the end of qcoeff (end of block).
Yaowu Xuc27fc142016-08-22 16:08:15 -0700115 uint16_t *eobs;
chiyotsaic2f38412020-06-10 16:07:21 -0700116 //! Contexts used to code the transform coefficients.
Angie Chiang74e23072017-03-24 14:54:23 -0700117 uint8_t *txb_entropy_ctx;
chiyotsaic2f38412020-06-10 16:07:21 -0700118 //! A buffer containing the source frame.
Yaowu Xuc27fc142016-08-22 16:08:15 -0700119 struct buf_2d src;
120
chiyotsaic2f38412020-06-10 16:07:21 -0700121 /*! \name Quantizer Settings
122 *
123 * \attention These are used/accessed only in the quantization process.
124 * RDO does not and *must not* depend on any of these values.
125 * All values below share the coefficient scale/shift used in TX.
126 */
127 /**@{*/
128 //! Quantization step size used by AV1_XFORM_QUANT_FP.
Monty Montgomery125c0fc2017-10-26 00:44:35 -0400129 const int16_t *quant_fp_QTX;
chiyotsaic2f38412020-06-10 16:07:21 -0700130 //! Offset used for rounding in the quantizer process by AV1_XFORM_QUANT_FP.
Monty Montgomery125c0fc2017-10-26 00:44:35 -0400131 const int16_t *round_fp_QTX;
chiyotsaic2f38412020-06-10 16:07:21 -0700132 //! Quantization step size used by AV1_XFORM_QUANT_B.
Monty Montgomery125c0fc2017-10-26 00:44:35 -0400133 const int16_t *quant_QTX;
chiyotsaic2f38412020-06-10 16:07:21 -0700134 //! Offset used for rounding in the quantizer process by AV1_XFORM_QUANT_B.
Monty Montgomery125c0fc2017-10-26 00:44:35 -0400135 const int16_t *round_QTX;
chiyotsaic2f38412020-06-10 16:07:21 -0700136 //! Scale factor to shift coefficients toward zero. Only used by QUANT_B.
137 const int16_t *quant_shift_QTX;
138 //! Size of the quantization bin around 0. Only Used by QUANT_B
139 const int16_t *zbin_QTX;
140 //! Dequantizer
Monty Montgomery125c0fc2017-10-26 00:44:35 -0400141 const int16_t *dequant_QTX;
chiyotsaic2f38412020-06-10 16:07:21 -0700142 /**@}*/
Yaowu Xuc27fc142016-08-22 16:08:15 -0700143} MACROBLOCK_PLANE;
144
chiyotsaic2f38412020-06-10 16:07:21 -0700145/*! \brief Costs for encoding the coefficients within a level.
146 *
147 * Covers everything including txb_skip, eob, dc_sign,
148 */
Jingning Handfd72322017-08-09 14:04:12 -0700149typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700150 //! Cost to skip txfm for the current txfm block.
Jingning Handfd72322017-08-09 14:04:12 -0700151 int txb_skip_cost[TXB_SKIP_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700152 /*! \brief Cost for encoding the base_eob of a level.
153 *
154 * Decoder uses base_eob to derive the base_level as base_eob := base_eob+1.
155 */
Dake He3fe369c2017-11-16 17:56:44 -0800156 int base_eob_cost[SIG_COEF_CONTEXTS_EOB][3];
chiyotsaic2f38412020-06-10 16:07:21 -0700157 /*! \brief Cost for encoding the base level of a coefficient.
158 *
159 * Decoder derives coeff_base as coeff_base := base_eob + 1.
160 */
Wenyao Liuf7e53752019-01-22 17:34:44 +0800161 int base_cost[SIG_COEF_CONTEXTS][8];
chiyotsaic2f38412020-06-10 16:07:21 -0700162 /*! \brief Cost for encoding the last non-zero coefficient.
163 *
164 * Eob is derived from eob_extra at the decoder as eob := eob_extra + 1
165 */
Angie Chiang7ab884e2017-10-18 15:57:12 -0700166 int eob_extra_cost[EOB_COEF_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700167 //! Cost for encoding the dc_sign
Jingning Handfd72322017-08-09 14:04:12 -0700168 int dc_sign_cost[DC_SIGN_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700169 //! Cost for encoding an increment to the coefficient
Wenyao Liuf7e53752019-01-22 17:34:44 +0800170 int lps_cost[LEVEL_CONTEXTS][COEFF_BASE_RANGE + 1 + COEFF_BASE_RANGE + 1];
Jingning Handfd72322017-08-09 14:04:12 -0700171} LV_MAP_COEFF_COST;
Jingning Hanf5a4d3b2017-08-27 23:01:19 -0700172
chiyotsaic2f38412020-06-10 16:07:21 -0700173/*! \brief Costs for encoding the eob.
174 */
Johannb0ef6ff2018-02-08 14:32:21 -0800175typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700176 //! eob_cost.
Johannb0ef6ff2018-02-08 14:32:21 -0800177 int eob_cost[2][11];
178} LV_MAP_EOB_COST;
Dake He0db7d0e2017-12-21 15:23:20 -0800179
chiyotsaic2f38412020-06-10 16:07:21 -0700180/*! \brief Stores the transforms coefficients for the whole superblock.
181 */
Jingning Hanf5a4d3b2017-08-27 23:01:19 -0700182typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700183 //! The transformed coefficients.
Jayasanker J2350ca32020-09-10 23:49:00 +0530184 tran_low_t *tcoeff[MAX_MB_PLANE];
chiyotsaic2f38412020-06-10 16:07:21 -0700185 //! Where the transformed coefficients end.
Jayasanker J2350ca32020-09-10 23:49:00 +0530186 uint16_t *eobs[MAX_MB_PLANE];
chiyotsaic2f38412020-06-10 16:07:21 -0700187 /*! \brief Transform block entropy contexts.
188 *
189 * Each element is used as a bit field.
190 * - Bits 0~3: txb_skip_ctx
191 * - Bits 4~5: dc_sign_ctx.
192 */
Jayasanker J2350ca32020-09-10 23:49:00 +0530193 uint8_t *entropy_ctx[MAX_MB_PLANE];
Jingning Hanf5a4d3b2017-08-27 23:01:19 -0700194} CB_COEFF_BUFFER;
Jingning Handfd72322017-08-09 14:04:12 -0700195
chiyotsaic2f38412020-06-10 16:07:21 -0700196/*! \brief Extended mode info derived from mbmi.
197 */
Yaowu Xuc27fc142016-08-22 16:08:15 -0700198typedef struct {
Angie Chiangc484abe2017-03-20 15:43:11 -0700199 // TODO(angiebird): Reduce the buffer size according to sb_type
chiyotsaic2f38412020-06-10 16:07:21 -0700200 //! The reference mv list for the current block.
Ravi Chaudharyfa73e202019-08-19 12:41:26 +0530201 CANDIDATE_MV ref_mv_stack[MODE_CTX_REF_FRAMES][USABLE_REF_MV_STACK_SIZE];
chiyotsaic2f38412020-06-10 16:07:21 -0700202 //! The weights used to compute the ref mvs.
Ravi Chaudharyfa73e202019-08-19 12:41:26 +0530203 uint16_t weight[MODE_CTX_REF_FRAMES][USABLE_REF_MV_STACK_SIZE];
chiyotsaic2f38412020-06-10 16:07:21 -0700204 //! Number of ref mvs in the drl.
Satish Kumar Suman69e93292018-11-28 16:05:33 +0530205 uint8_t ref_mv_count[MODE_CTX_REF_FRAMES];
chiyotsaic2f38412020-06-10 16:07:21 -0700206 //! Global mvs
207 int_mv global_mvs[REF_FRAMES];
208 //! Context used to encode the current mode.
209 int16_t mode_context[MODE_CTX_REF_FRAMES];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700210} MB_MODE_INFO_EXT;
211
chiyotsaic2f38412020-06-10 16:07:21 -0700212/*! \brief Stores best extended mode information at frame level.
213 *
214 * The frame level in here is used in bitstream preparation stage. The
215 * information in \ref MB_MODE_INFO_EXT are copied to this struct to save
216 * memory.
217 */
Remya0cce44c2019-08-16 11:57:24 +0530218typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700219 //! \copydoc MB_MODE_INFO_EXT::ref_mv_stack
Ravi Chaudharyfa73e202019-08-19 12:41:26 +0530220 CANDIDATE_MV ref_mv_stack[USABLE_REF_MV_STACK_SIZE];
chiyotsaic2f38412020-06-10 16:07:21 -0700221 //! \copydoc MB_MODE_INFO_EXT::weight
Ravi Chaudharyfa73e202019-08-19 12:41:26 +0530222 uint16_t weight[USABLE_REF_MV_STACK_SIZE];
chiyotsaic2f38412020-06-10 16:07:21 -0700223 //! \copydoc MB_MODE_INFO_EXT::ref_mv_count
Remya0cce44c2019-08-16 11:57:24 +0530224 uint8_t ref_mv_count;
chiyotsaic2f38412020-06-10 16:07:21 -0700225 // TODO(Ravi/Remya): Reduce the buffer size of global_mvs
226 //! \copydoc MB_MODE_INFO_EXT::global_mvs
227 int_mv global_mvs[REF_FRAMES];
228 //! \copydoc MB_MODE_INFO_EXT::mode_context
229 int16_t mode_context;
230 //! Offset of current coding block's coeff buffer relative to the sb.
Jayasanker J2350ca32020-09-10 23:49:00 +0530231 uint16_t cb_offset[PLANE_TYPES];
Remya0cce44c2019-08-16 11:57:24 +0530232} MB_MODE_INFO_EXT_FRAME;
233
chiyotsaic2f38412020-06-10 16:07:21 -0700234/*! \brief Txfm search results for a partition
235 */
Alex Converse0fa0f422017-04-24 12:51:14 -0700236typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700237 //! Txfm size used if the current mode is intra mode.
Hui Su1ddf2312017-08-19 15:21:34 -0700238 TX_SIZE tx_size;
chiyotsaic2f38412020-06-10 16:07:21 -0700239 //! Txfm sizes used if the current mode is inter mode.
Hui Su7167d952018-02-01 16:33:12 -0800240 TX_SIZE inter_tx_size[INTER_TX_SIZE_BUF_LEN];
chiyotsaic2f38412020-06-10 16:07:21 -0700241 //! Map showing which txfm block skips the txfm process.
Hui Suf4b79c72018-03-22 13:14:36 -0700242 uint8_t blk_skip[MAX_MIB_SIZE * MAX_MIB_SIZE];
Sarah Parkerf492c1f2021-03-02 21:01:56 -0800243 //! Map showing the txfm types for each block.
Hui Su52b7ddc2019-10-10 16:27:16 -0700244 uint8_t tx_type_map[MAX_MIB_SIZE * MAX_MIB_SIZE];
chiyotsaic2f38412020-06-10 16:07:21 -0700245 //! Rd_stats for the whole partition block.
Hui Su1ddf2312017-08-19 15:21:34 -0700246 RD_STATS rd_stats;
chiyotsaic2f38412020-06-10 16:07:21 -0700247 //! Hash value of the current record.
Hui Su1ddf2312017-08-19 15:21:34 -0700248 uint32_t hash_value;
Hui Su6cb17c12018-03-09 12:56:20 -0800249} MB_RD_INFO;
Hui Su1ddf2312017-08-19 15:21:34 -0700250
chiyotsaic2f38412020-06-10 16:07:21 -0700251/*! \brief Hash records of txfm search results for the partition block.
252 */
Hui Su1ddf2312017-08-19 15:21:34 -0700253typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700254 //! Circular buffer that stores the txfm search results.
Hui Su6cb17c12018-03-09 12:56:20 -0800255 MB_RD_INFO tx_rd_info[RD_RECORD_BUFFER_LEN]; // Circular buffer.
chiyotsaic2f38412020-06-10 16:07:21 -0700256 //! Index to insert the newest \ref TXB_RD_INFO.
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/*! \brief Txfm search results for a tx block.
265 */
Alexander Bokovc5ddf062017-10-17 16:41:46 -0700266typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700267 //! Distortion after the txfm process
Alexander Bokovc5ddf062017-10-17 16:41:46 -0700268 int64_t dist;
chiyotsaic2f38412020-06-10 16:07:21 -0700269 //! SSE of the prediction before the txfm process
Jingning Han73bc2aa2018-02-02 14:31:39 -0800270 int64_t sse;
chiyotsaic2f38412020-06-10 16:07:21 -0700271 //! Rate used to encode the txfm.
Alexander Bokovc5ddf062017-10-17 16:41:46 -0700272 int rate;
chiyotsaic2f38412020-06-10 16:07:21 -0700273 //! Location of the end of non-zero entries.
Hui Su8c2b9132017-12-09 10:40:15 -0800274 uint16_t eob;
chiyotsaic2f38412020-06-10 16:07:21 -0700275 //! Transform type used on the current block.
Jingning Han73bc2aa2018-02-02 14:31:39 -0800276 TX_TYPE tx_type;
chiyotsaic2f38412020-06-10 16:07:21 -0700277 //! Unknown usage
Jingning Han45027c62017-12-11 11:47:15 -0800278 uint16_t entropy_context;
chiyotsaic2f38412020-06-10 16:07:21 -0700279 //! Context used to code the coefficients.
Jingning Hand7e99112017-12-13 09:47:45 -0800280 uint8_t txb_entropy_ctx;
chiyotsaic2f38412020-06-10 16:07:21 -0700281 //! Whether the current info block contains valid info
Alexander Bokovc5ddf062017-10-17 16:41:46 -0700282 uint8_t valid;
chiyotsaic2f38412020-06-10 16:07:21 -0700283 //! Unused
284 uint8_t fast;
285 //! Whether trellis optimization is done.
Sachin Kumar Garg4ec28cb2019-06-06 19:33:58 +0530286 uint8_t perform_block_coeff_opt;
Hui Su6cb17c12018-03-09 12:56:20 -0800287} TXB_RD_INFO;
Alexander Bokovc5ddf062017-10-17 16:41:46 -0700288
chiyotsaic2f38412020-06-10 16:07:21 -0700289/*! \brief Hash records of txfm search result for each tx block.
290 */
Alexander Bokovc5ddf062017-10-17 16:41:46 -0700291typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700292 //! The hash values.
Alexander Bokovc5ddf062017-10-17 16:41:46 -0700293 uint32_t hash_vals[TX_SIZE_RD_RECORD_BUFFER_LEN];
chiyotsaic2f38412020-06-10 16:07:21 -0700294 //! The txfm search results
Hui Su6cb17c12018-03-09 12:56:20 -0800295 TXB_RD_INFO tx_rd_info[TX_SIZE_RD_RECORD_BUFFER_LEN];
chiyotsaic2f38412020-06-10 16:07:21 -0700296 //! Index to insert the newest \ref TXB_RD_INFO.
Alexander Bokovc5ddf062017-10-17 16:41:46 -0700297 int index_start;
chiyotsaic2f38412020-06-10 16:07:21 -0700298 //! Number of info stored in this record.
Alexander Bokovc5ddf062017-10-17 16:41:46 -0700299 int num;
Hui Su6cb17c12018-03-09 12:56:20 -0800300} TXB_RD_RECORD;
Alexander Bokovc5ddf062017-10-17 16:41:46 -0700301
chiyotsaic2f38412020-06-10 16:07:21 -0700302//! Number of compound rd stats
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530303#define MAX_COMP_RD_STATS 64
chiyotsaic2f38412020-06-10 16:07:21 -0700304/*! \brief Rdcost stats in compound mode.
305 */
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530306typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700307 //! Rate of the compound modes.
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530308 int32_t rate[COMPOUND_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700309 //! Distortion of the compound modes.
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530310 int64_t dist[COMPOUND_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700311 //! Estimated rate of the compound modes.
Venkat457e32e2019-12-19 17:44:05 +0530312 int32_t model_rate[COMPOUND_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700313 //! Estimated distortion of the compound modes.
Venkat457e32e2019-12-19 17:44:05 +0530314 int64_t model_dist[COMPOUND_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700315 //! Rate need to send the mask type.
venkat sanampudic88148e2020-01-03 12:57:28 +0530316 int comp_rs2[COMPOUND_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700317 //! Motion vector for each predictor.
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530318 int_mv mv[2];
chiyotsaic2f38412020-06-10 16:07:21 -0700319 //! Ref frame for each predictor.
Hui Sud06ff662019-01-23 16:53:05 -0800320 MV_REFERENCE_FRAME ref_frames[2];
chiyotsaic2f38412020-06-10 16:07:21 -0700321 //! Current prediction mode.
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530322 PREDICTION_MODE mode;
chiyotsaic2f38412020-06-10 16:07:21 -0700323 //! Current interpolation filter.
Ravi Chaudhary1e4f94b2019-06-20 16:19:49 +0530324 int_interpfilters filter;
chiyotsaic2f38412020-06-10 16:07:21 -0700325 //! Refmv index in the drl.
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530326 int ref_mv_idx;
chiyotsaic2f38412020-06-10 16:07:21 -0700327 //! Whether the predictors are GLOBALMV.
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530328 int is_global[2];
chiyotsaic2f38412020-06-10 16:07:21 -0700329 //! Current parameters for interinter mode.
venkat sanampudic88148e2020-01-03 12:57:28 +0530330 INTERINTER_COMPOUND_DATA interinter_comp;
Ranjit Kumar Tulabandua1ebb572018-12-24 12:13:54 +0530331} COMP_RD_STATS;
332
chiyotsaic2f38412020-06-10 16:07:21 -0700333/*! \brief Contains buffers used to speed up rdopt for obmc.
334 *
335 * See the comments for calc_target_weighted_pred for details.
336 */
Hui Su38711e72019-06-11 10:49:47 -0700337typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700338 /*! \brief A new source weighted with the above and left predictors.
339 *
340 * Used to efficiently construct multiple obmc predictors during rdopt.
341 */
chiyotsaid2b12212020-04-28 20:57:19 -0700342 int32_t *wsrc;
chiyotsaic2f38412020-06-10 16:07:21 -0700343 /*! \brief A new mask constructed from the original horz/vert mask.
344 *
345 * \copydetails wsrc
346 */
chiyotsaid2b12212020-04-28 20:57:19 -0700347 int32_t *mask;
chiyotsaic2f38412020-06-10 16:07:21 -0700348 /*! \brief Prediction from the up predictor.
349 *
350 * Used to build the obmc predictor.
351 */
chiyotsaid2b12212020-04-28 20:57:19 -0700352 uint8_t *above_pred;
chiyotsaic2f38412020-06-10 16:07:21 -0700353 /*! \brief Prediction from the up predictor.
354 *
355 * \copydetails above_pred
356 */
chiyotsaid2b12212020-04-28 20:57:19 -0700357 uint8_t *left_pred;
358} OBMCBuffer;
359
chiyotsaic2f38412020-06-10 16:07:21 -0700360/*! \brief Contains color maps used in palette mode.
361 */
362typedef struct {
363 //! The best color map found.
364 uint8_t best_palette_color_map[MAX_PALETTE_SQUARE];
365 //! A temporary buffer used for k-means clustering.
366 int kmeans_data_buf[2 * MAX_PALETTE_SQUARE];
367} PALETTE_BUFFER;
368
369/*! \brief Contains buffers used by av1_compound_type_rd()
370 *
371 * For sizes and alignment of these arrays, refer to
372 * alloc_compound_type_rd_buffers() function.
373 */
374typedef struct {
375 //! First prediction.
376 uint8_t *pred0;
377 //! Second prediction.
378 uint8_t *pred1;
379 //! Source - first prediction.
380 int16_t *residual1;
381 //! Second prediction - first prediction.
382 int16_t *diff10;
383 //! Backup of the best segmentation mask.
384 uint8_t *tmp_best_mask_buf;
385} CompoundTypeRdBuffers;
386
387/*! \brief Holds some parameters related to partitioning schemes in AV1.
388 */
chiyotsai68eefbe2020-05-01 15:07:58 -0700389// TODO(chiyotsai@google.com): Consolidate this with SIMPLE_MOTION_DATA_TREE
390typedef struct {
391#if !CONFIG_REALTIME_ONLY
392 // The following 4 parameters are used for cnn-based partitioning on intra
393 // frame.
chiyotsaic2f38412020-06-10 16:07:21 -0700394 /*! \brief Current index on the partition block quad tree.
395 *
396 * Used to index into the cnn buffer for partition decision.
397 */
chiyotsai68eefbe2020-05-01 15:07:58 -0700398 int quad_tree_idx;
chiyotsaic2f38412020-06-10 16:07:21 -0700399 //! Whether the CNN buffer contains valid output.
chiyotsai68eefbe2020-05-01 15:07:58 -0700400 int cnn_output_valid;
chiyotsaic2f38412020-06-10 16:07:21 -0700401 //! A buffer used by our segmentation CNN for intra-frame partitioning.
chiyotsai68eefbe2020-05-01 15:07:58 -0700402 float cnn_buffer[CNN_OUT_BUF_SIZE];
chiyotsaic2f38412020-06-10 16:07:21 -0700403 //! log of the quantization parameter of the ancestor BLOCK_64X64.
chiyotsai68eefbe2020-05-01 15:07:58 -0700404 float log_q;
405#endif
406
chiyotsaic2f38412020-06-10 16:07:21 -0700407 /*! \brief Variance of the subblocks in the superblock.
408 *
409 * This is used by rt mode for variance based partitioning.
410 * The indices corresponds to the following block sizes:
411 * - 0 - 128x128
412 * - 1-2 - 128x64
413 * - 3-4 - 64x128
414 * - 5-8 - 64x64
415 * - 9-16 - 64x32
416 * - 17-24 - 32x64
417 * - 25-40 - 32x32
418 * - 41-104 - 16x16
419 */
chiyotsai68eefbe2020-05-01 15:07:58 -0700420 uint8_t variance_low[105];
421} PartitionSearchInfo;
422
chiyotsaic2f38412020-06-10 16:07:21 -0700423/*! \brief Defines the parameters used to perform txfm search.
424 *
425 * For the most part, this determines how various speed features are used.
426 */
chiyotsaia36d9002020-04-29 16:48:21 -0700427typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700428 /*! \brief Whether to limit the intra txfm search type to the default txfm.
429 *
430 * This could either be a result of either sequence parameter or speed
431 * features.
432 */
chiyotsaia36d9002020-04-29 16:48:21 -0700433 int use_default_intra_tx_type;
chiyotsaic2f38412020-06-10 16:07:21 -0700434 /*! \brief Whether to limit the inter txfm search type to the default txfm.
435 *
436 * \copydetails use_default_intra_tx_type
437 */
chiyotsaia36d9002020-04-29 16:48:21 -0700438 int use_default_inter_tx_type;
S Hamsalekhab7a5b232021-08-06 13:11:33 +0530439 /*! Probability threshold used for conditionally forcing tx type*/
440 int default_inter_tx_type_prob_thresh;
chiyotsaia36d9002020-04-29 16:48:21 -0700441
chiyotsaic2f38412020-06-10 16:07:21 -0700442 //! Whether to prune 2d transforms based on 1d transform results.
chiyotsaia36d9002020-04-29 16:48:21 -0700443 int prune_2d_txfm_mode;
444
chiyotsaic2f38412020-06-10 16:07:21 -0700445 /*! \brief Variable from \ref WinnerModeParams based on current eval mode.
446 *
447 * See the documentation for \ref WinnerModeParams for more detail.
448 */
Akshata Jadhavbd0eb432021-01-13 14:33:47 +0530449 unsigned int coeff_opt_thresholds[2];
450 /*! \copydoc coeff_opt_thresholds */
chiyotsaia36d9002020-04-29 16:48:21 -0700451 unsigned int tx_domain_dist_threshold;
Akshata Jadhavbd0eb432021-01-13 14:33:47 +0530452 /*! \copydoc coeff_opt_thresholds */
chiyotsaia36d9002020-04-29 16:48:21 -0700453 TX_SIZE_SEARCH_METHOD tx_size_search_method;
Akshata Jadhavbd0eb432021-01-13 14:33:47 +0530454 /*! \copydoc coeff_opt_thresholds */
chiyotsaia36d9002020-04-29 16:48:21 -0700455 unsigned int use_transform_domain_distortion;
Akshata Jadhavbd0eb432021-01-13 14:33:47 +0530456 /*! \copydoc coeff_opt_thresholds */
chiyotsaia36d9002020-04-29 16:48:21 -0700457 unsigned int skip_txfm_level;
458
chiyotsaic2f38412020-06-10 16:07:21 -0700459 /*! \brief How to search for the optimal tx_size
460 *
461 * If ONLY_4X4, use TX_4X4; if TX_MODE_LARGEST, use the largest tx_size for
462 * the current partition block; if TX_MODE_SELECT, search through the whole
463 * tree.
464 *
465 * \attention
466 * Although this looks suspicious similar to a bitstream element, this
467 * tx_mode_search_type is only used internally by the encoder, and is *not*
468 * written to the bitstream. It determines what kind of tx_mode would be
469 * searched. For example, we might set it to TX_MODE_LARGEST to find a good
470 * candidate, then code it as TX_MODE_SELECT.
471 */
chiyotsaia36d9002020-04-29 16:48:21 -0700472 TX_MODE tx_mode_search_type;
Ravi Chaudhary6eaea622020-08-28 10:28:24 +0530473
474 /*!
475 * Flag to enable/disable DC block prediction.
476 */
477 unsigned int predict_dc_level;
chiyotsaia36d9002020-04-29 16:48:21 -0700478} TxfmSearchParams;
479
chiyotsaic2f38412020-06-10 16:07:21 -0700480/*!\cond */
chiyotsai4c1e5c62020-04-30 17:54:14 -0700481#define MAX_NUM_8X8_TXBS ((MAX_MIB_SIZE >> 1) * (MAX_MIB_SIZE >> 1))
482#define MAX_NUM_16X16_TXBS ((MAX_MIB_SIZE >> 2) * (MAX_MIB_SIZE >> 2))
483#define MAX_NUM_32X32_TXBS ((MAX_MIB_SIZE >> 3) * (MAX_MIB_SIZE >> 3))
484#define MAX_NUM_64X64_TXBS ((MAX_MIB_SIZE >> 4) * (MAX_MIB_SIZE >> 4))
chiyotsaic2f38412020-06-10 16:07:21 -0700485/*!\endcond */
chiyotsai4c1e5c62020-04-30 17:54:14 -0700486
Fyodor Kyslov677cc012021-01-27 18:35:07 -0800487/*! \brief Txfm hash records
488 *
489 * Hash records of the transform search results based on the residue. There
490 * are two main types here:
491 * - MB_RD_RECORD: records a whole *partition block*'s inter-mode txfm result.
492 * Since this operates on the partition block level, this can give us a
493 * whole txfm partition tree.
Sarah Parkera0c45782021-03-01 20:28:55 -0800494 * - TXB_RD_RECORD: records a txfm search result within a transform block
Sarah Parkerf492c1f2021-03-02 21:01:56 -0800495 * itself. This operates on txb level only and only applies to square
Fyodor Kyslov677cc012021-01-27 18:35:07 -0800496 * txfms.
497 */
498typedef struct {
499 /*****************************************************************************
500 * \name TXB RD Record
501 ****************************************************************************/
502 /**@{*/
503 //! Txfm hash record for the whole coding block.
504 MB_RD_RECORD mb_rd_record;
505
506 //! Inter mode txfm hash record for TX_8X8 blocks.
507 TXB_RD_RECORD txb_rd_record_8X8[MAX_NUM_8X8_TXBS];
508 //! Inter mode txfm hash record for TX_16X16 blocks.
509 TXB_RD_RECORD txb_rd_record_16X16[MAX_NUM_16X16_TXBS];
510 //! Inter mode txfm hash record for TX_32X32 blocks.
511 TXB_RD_RECORD txb_rd_record_32X32[MAX_NUM_32X32_TXBS];
512 //! Inter mode txfm hash record for TX_64X64 blocks.
513 TXB_RD_RECORD txb_rd_record_64X64[MAX_NUM_64X64_TXBS];
514 //! Intra mode txfm hash record for square tx blocks.
515 TXB_RD_RECORD txb_rd_record_intra;
516 /**@}*/
517} TxbRdRecords;
518
chiyotsaic2f38412020-06-10 16:07:21 -0700519/*! \brief Stores various encoding/search decisions related to txfm search.
520 *
521 * This struct contains a cache of previous txfm results, and some buffers for
522 * the current txfm decision.
523 */
chiyotsai4c1e5c62020-04-30 17:54:14 -0700524typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700525 //! Whether to skip transform and quantization on a partition block level.
chiyotsai4c1e5c62020-04-30 17:54:14 -0700526 int skip_txfm;
527
chiyotsaic2f38412020-06-10 16:07:21 -0700528 /*! \brief Whether to skip transform and quantization on a txfm block level.
529 *
530 * Skips transform and quantization on a transform block level inside the
531 * current partition block. Each element of this array is used as a bit-field.
532 * So for example, the we are skipping on the luma plane, then the last bit
533 * would be set to 1.
534 */
chiyotsai4c1e5c62020-04-30 17:54:14 -0700535 uint8_t blk_skip[MAX_MIB_SIZE * MAX_MIB_SIZE];
536
chiyotsaic2f38412020-06-10 16:07:21 -0700537 /*! \brief Transform types inside the partition block
538 *
539 * Keeps a record of what kind of transform to use for each of the transform
540 * block inside the partition block.
541 * \attention The buffer here is *never* directly used. Instead, this just
542 * allocates the memory for MACROBLOCKD::tx_type_map during rdopt on the
543 * partition block. So if we need to save memory, we could move the allocation
544 * to pick_sb_mode instead.
545 */
chiyotsai4c1e5c62020-04-30 17:54:14 -0700546 uint8_t tx_type_map_[MAX_MIB_SIZE * MAX_MIB_SIZE];
547
Fyodor Kyslov677cc012021-01-27 18:35:07 -0800548 /*! \brief Txfm hash records
549 *
chiyotsaic2f38412020-06-10 16:07:21 -0700550 * Hash records of the transform search results based on the residue. There
551 * are two main types here:
552 * - MB_RD_RECORD: records a whole *partition block*'s inter-mode txfm result.
553 * Since this operates on the partition block level, this can give us a
554 * whole txfm partition tree.
Sarah Parkerf492c1f2021-03-02 21:01:56 -0800555 * - TXB_RD_RECORD: records a txfm search result within a transform block
556 * itself. This operates on txb level only and only applies to square
chiyotsaic2f38412020-06-10 16:07:21 -0700557 * txfms.
558 */
Fyodor Kyslov677cc012021-01-27 18:35:07 -0800559 TxbRdRecords *txb_rd_records;
chiyotsai4c1e5c62020-04-30 17:54:14 -0700560
chiyotsaic2f38412020-06-10 16:07:21 -0700561 /*! \brief Number of txb splits.
562 *
563 * Keep track of how many times we've used split tx partition for transform
564 * blocks. Somewhat misleadingly, this parameter doesn't actually keep track
565 * of the count of the current block. Instead, it's a cumulative count across
566 * of the whole frame. The main usage is that if txb_split_count is zero, then
567 * we can signal TX_MODE_LARGEST at frame level.
568 */
chiyotsai4c1e5c62020-04-30 17:54:14 -0700569 // TODO(chiyotsai@google.com): Move this to a more appropriate location such
570 // as ThreadData.
571 unsigned int txb_split_count;
572#if CONFIG_SPEED_STATS
chiyotsaic2f38412020-06-10 16:07:21 -0700573 //! For debugging. Used to check how many txfm searches we are doing.
chiyotsai4c1e5c62020-04-30 17:54:14 -0700574 unsigned int tx_search_count;
575#endif // CONFIG_SPEED_STATS
576} TxfmSearchInfo;
chiyotsaic2f38412020-06-10 16:07:21 -0700577#undef MAX_NUM_8X8_TXBS
578#undef MAX_NUM_16X16_TXBS
579#undef MAX_NUM_32X32_TXBS
580#undef MAX_NUM_64X64_TXBS
chiyotsai4c1e5c62020-04-30 17:54:14 -0700581
chiyotsaic2f38412020-06-10 16:07:21 -0700582/*! \brief Holds the entropy costs for various modes sent to the bitstream.
583 *
584 * \attention This does not include the costs for mv and transformed
585 * coefficients.
586 */
chiyotsai9a06d182020-05-01 17:12:12 -0700587typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700588 /*****************************************************************************
589 * \name Partition Costs
590 ****************************************************************************/
591 /**@{*/
592 //! Cost for coding the partition.
chiyotsai9a06d182020-05-01 17:12:12 -0700593 int partition_cost[PARTITION_CONTEXTS][EXT_PARTITION_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700594 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700595
chiyotsaic2f38412020-06-10 16:07:21 -0700596 /*****************************************************************************
597 * \name Intra Costs: General
598 ****************************************************************************/
599 /**@{*/
600 //! Luma mode cost for inter frame.
601 int mbmode_cost[BLOCK_SIZE_GROUPS][INTRA_MODES];
602 //! Luma mode cost for intra frame.
603 int y_mode_costs[INTRA_MODES][INTRA_MODES][INTRA_MODES];
604 //! Chroma mode cost
chiyotsai9a06d182020-05-01 17:12:12 -0700605 int intra_uv_mode_cost[CFL_ALLOWED_TYPES][INTRA_MODES][UV_INTRA_MODES];
chiyotsaic2f38412020-06-10 16:07:21 -0700606 //! filter_intra_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700607 int filter_intra_cost[BLOCK_SIZES_ALL][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700608 //! filter_intra_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700609 int filter_intra_mode_cost[FILTER_INTRA_MODES];
chiyotsaic2f38412020-06-10 16:07:21 -0700610 //! angle_delta_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700611 int angle_delta_cost[DIRECTIONAL_MODES][2 * MAX_ANGLE_DELTA + 1];
612
chiyotsaic2f38412020-06-10 16:07:21 -0700613 //! Rate rate associated with each alpha codeword
614 int cfl_cost[CFL_JOINT_SIGNS][CFL_PRED_PLANES][CFL_ALPHABET_SIZE];
615 /**@}*/
616
617 /*****************************************************************************
618 * \name Intra Costs: Screen Contents
619 ****************************************************************************/
620 /**@{*/
621 //! intrabc_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700622 int intrabc_cost[2];
623
chiyotsaic2f38412020-06-10 16:07:21 -0700624 //! palette_y_size_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700625 int palette_y_size_cost[PALATTE_BSIZE_CTXS][PALETTE_SIZES];
chiyotsaic2f38412020-06-10 16:07:21 -0700626 //! palette_uv_size_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700627 int palette_uv_size_cost[PALATTE_BSIZE_CTXS][PALETTE_SIZES];
chiyotsaic2f38412020-06-10 16:07:21 -0700628 //! palette_y_color_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700629 int palette_y_color_cost[PALETTE_SIZES][PALETTE_COLOR_INDEX_CONTEXTS]
630 [PALETTE_COLORS];
chiyotsaic2f38412020-06-10 16:07:21 -0700631 //! palette_uv_color_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700632 int palette_uv_color_cost[PALETTE_SIZES][PALETTE_COLOR_INDEX_CONTEXTS]
633 [PALETTE_COLORS];
chiyotsaic2f38412020-06-10 16:07:21 -0700634 //! palette_y_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700635 int palette_y_mode_cost[PALATTE_BSIZE_CTXS][PALETTE_Y_MODE_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700636 //! palette_uv_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700637 int palette_uv_mode_cost[PALETTE_UV_MODE_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: MV Modes
642 ****************************************************************************/
643 /**@{*/
644 //! skip_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700645 int skip_mode_cost[SKIP_MODE_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700646 //! newmv_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700647 int newmv_mode_cost[NEWMV_MODE_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700648 //! zeromv_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700649 int zeromv_mode_cost[GLOBALMV_MODE_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700650 //! refmv_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700651 int refmv_mode_cost[REFMV_MODE_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700652 //! drl_mode_cost0
chiyotsai9a06d182020-05-01 17:12:12 -0700653 int drl_mode_cost0[DRL_MODE_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700654 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700655
chiyotsaic2f38412020-06-10 16:07:21 -0700656 /*****************************************************************************
657 * \name Inter Costs: Ref Frame Types
658 ****************************************************************************/
659 /**@{*/
660 //! single_ref_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700661 int single_ref_cost[REF_CONTEXTS][SINGLE_REFS - 1][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700662 //! comp_inter_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700663 int comp_inter_cost[COMP_INTER_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700664 //! comp_ref_type_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700665 int comp_ref_type_cost[COMP_REF_TYPE_CONTEXTS]
666 [CDF_SIZE(COMP_REFERENCE_TYPES)];
chiyotsaic2f38412020-06-10 16:07:21 -0700667 //! uni_comp_ref_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700668 int uni_comp_ref_cost[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1]
669 [CDF_SIZE(2)];
chiyotsaic2f38412020-06-10 16:07:21 -0700670 /*! \brief Cost for signaling ref_frame[0] in bidir-comp mode
671 *
672 * Includes LAST_FRAME, LAST2_FRAME, LAST3_FRAME, and GOLDEN_FRAME.
673 */
chiyotsai9a06d182020-05-01 17:12:12 -0700674 int comp_ref_cost[REF_CONTEXTS][FWD_REFS - 1][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700675 /*! \brief Cost for signaling ref_frame[1] in bidir-comp mode
676 *
677 * Includes ALTREF_FRAME, ALTREF2_FRAME, and BWDREF_FRAME.
678 */
chiyotsai9a06d182020-05-01 17:12:12 -0700679 int comp_bwdref_cost[REF_CONTEXTS][BWD_REFS - 1][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700680 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700681
chiyotsaic2f38412020-06-10 16:07:21 -0700682 /*****************************************************************************
683 * \name Inter Costs: Compound Types
684 ****************************************************************************/
685 /**@{*/
686 //! intra_inter_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700687 int intra_inter_cost[INTRA_INTER_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700688 //! inter_compound_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700689 int inter_compound_mode_cost[INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES];
chiyotsaic2f38412020-06-10 16:07:21 -0700690 //! compound_type_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700691 int compound_type_cost[BLOCK_SIZES_ALL][MASKED_COMPOUND_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700692 //! wedge_idx_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700693 int wedge_idx_cost[BLOCK_SIZES_ALL][16];
chiyotsaic2f38412020-06-10 16:07:21 -0700694 //! interintra_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700695 int interintra_cost[BLOCK_SIZE_GROUPS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700696 //! wedge_interintra_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700697 int wedge_interintra_cost[BLOCK_SIZES_ALL][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700698 //! interintra_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700699 int interintra_mode_cost[BLOCK_SIZE_GROUPS][INTERINTRA_MODES];
chiyotsaic2f38412020-06-10 16:07:21 -0700700 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700701
chiyotsaic2f38412020-06-10 16:07:21 -0700702 /*****************************************************************************
703 * \name Inter Costs: Compound Masks
704 ****************************************************************************/
705 /**@{*/
706 //! comp_idx_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700707 int comp_idx_cost[COMP_INDEX_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700708 //! comp_group_idx_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700709 int comp_group_idx_cost[COMP_GROUP_IDX_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700710 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700711
chiyotsaic2f38412020-06-10 16:07:21 -0700712 /*****************************************************************************
713 * \name Inter Costs: Motion Modes/Filters
714 ****************************************************************************/
715 /**@{*/
716 //! motion_mode_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700717 int motion_mode_cost[BLOCK_SIZES_ALL][MOTION_MODES];
chiyotsaic2f38412020-06-10 16:07:21 -0700718 //! motion_mode_cost1
chiyotsai9a06d182020-05-01 17:12:12 -0700719 int motion_mode_cost1[BLOCK_SIZES_ALL][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700720 //! switchable_interp_costs
chiyotsai9a06d182020-05-01 17:12:12 -0700721 int switchable_interp_costs[SWITCHABLE_FILTER_CONTEXTS][SWITCHABLE_FILTERS];
chiyotsaic2f38412020-06-10 16:07:21 -0700722 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700723
chiyotsaic2f38412020-06-10 16:07:21 -0700724 /*****************************************************************************
725 * \name Txfm Mode Costs
726 ****************************************************************************/
727 /**@{*/
728 //! skip_txfm_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700729 int skip_txfm_cost[SKIP_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700730 //! tx_size_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700731 int tx_size_cost[TX_SIZES - 1][TX_SIZE_CONTEXTS][TX_SIZES];
chiyotsaic2f38412020-06-10 16:07:21 -0700732 //! txfm_partition_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700733 int txfm_partition_cost[TXFM_PARTITION_CONTEXTS][2];
chiyotsaic2f38412020-06-10 16:07:21 -0700734 //! inter_tx_type_costs
chiyotsai9a06d182020-05-01 17:12:12 -0700735 int inter_tx_type_costs[EXT_TX_SETS_INTER][EXT_TX_SIZES][TX_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700736 //! intra_tx_type_costs
chiyotsai9a06d182020-05-01 17:12:12 -0700737 int intra_tx_type_costs[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES]
738 [TX_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700739 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700740
chiyotsaic2f38412020-06-10 16:07:21 -0700741 /*****************************************************************************
742 * \name Restoration Mode Costs
743 ****************************************************************************/
744 /**@{*/
745 //! switchable_restore_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700746 int switchable_restore_cost[RESTORE_SWITCHABLE_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700747 //! wiener_restore_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700748 int wiener_restore_cost[2];
chiyotsaic2f38412020-06-10 16:07:21 -0700749 //! sgrproj_restore_cost
chiyotsai9a06d182020-05-01 17:12:12 -0700750 int sgrproj_restore_cost[2];
chiyotsaic2f38412020-06-10 16:07:21 -0700751 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700752} ModeCosts;
753
chiyotsaic2f38412020-06-10 16:07:21 -0700754/*! \brief Holds mv costs for encoding and motion search.
755 */
chiyotsai9a06d182020-05-01 17:12:12 -0700756typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700757 /*****************************************************************************
chiyotsaic2f38412020-06-10 16:07:21 -0700758 * \name Encoding Costs
759 * Here are the entropy costs needed to encode a given mv.
760 * \ref nmv_cost_alloc and \ref nmv_cost_hp_alloc are two arrays that holds
761 * the memory for holding the mv cost. But since the motion vectors can be
762 * negative, we shift them to the middle and store the resulting pointer in
763 * \ref nmv_cost and \ref nmv_cost_hp for easier referencing. Finally, \ref
764 * mv_cost_stack points to the \ref nmv_cost with the mv precision we are
765 * currently working with. In essence, only \ref mv_cost_stack is needed for
766 * motion search, the other can be considered private.
767 ****************************************************************************/
768 /**@{*/
769 //! Costs for coding the zero components.
chiyotsai9a06d182020-05-01 17:12:12 -0700770 int nmv_joint_cost[MV_JOINTS];
771
chiyotsaic2f38412020-06-10 16:07:21 -0700772 //! Allocates memory for 1/4-pel motion vector costs.
chiyotsai9a06d182020-05-01 17:12:12 -0700773 int nmv_cost_alloc[2][MV_VALS];
chiyotsaic2f38412020-06-10 16:07:21 -0700774 //! Allocates memory for 1/8-pel motion vector costs.
chiyotsai9a06d182020-05-01 17:12:12 -0700775 int nmv_cost_hp_alloc[2][MV_VALS];
chiyotsaic2f38412020-06-10 16:07:21 -0700776 //! Points to the middle of \ref nmv_cost_alloc
chiyotsai9a06d182020-05-01 17:12:12 -0700777 int *nmv_cost[2];
chiyotsaic2f38412020-06-10 16:07:21 -0700778 //! Points to the middle of \ref nmv_cost_hp_alloc
chiyotsai9a06d182020-05-01 17:12:12 -0700779 int *nmv_cost_hp[2];
chiyotsaic2f38412020-06-10 16:07:21 -0700780 //! Points to the nmv_cost_hp in use.
chiyotsai9a06d182020-05-01 17:12:12 -0700781 int **mv_cost_stack;
chiyotsaic2f38412020-06-10 16:07:21 -0700782 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700783} MvCosts;
784
chiyotsai41fd15c2021-03-15 14:12:02 -0700785/*! \brief Holds mv costs for intrabc.
786 */
787typedef struct {
788 /*! Costs for coding the joint mv. */
789 int joint_mv[MV_JOINTS];
790
791 /*! \brief Cost of transmitting the actual motion vector.
chiyotsaiad4d3ea2021-03-17 13:53:01 -0700792 * dv_costs_alloc[0][i] is the cost of motion vector with horizontal
793 * component (mv_row) equal to i - MV_MAX. dv_costs_alloc[1][i] is the cost of
chiyotsai41fd15c2021-03-15 14:12:02 -0700794 * motion vector with vertical component (mv_col) equal to i - MV_MAX.
795 */
796 int dv_costs_alloc[2][MV_VALS];
797
798 /*! Points to the middle of \ref dv_costs_alloc. */
799 int *dv_costs[2];
800} IntraBCMVCosts;
801
chiyotsaic2f38412020-06-10 16:07:21 -0700802/*! \brief Holds the costs needed to encode the coefficients
803 */
chiyotsai9a06d182020-05-01 17:12:12 -0700804typedef struct {
chiyotsaic2f38412020-06-10 16:07:21 -0700805 //! Costs for coding the coefficients.
chiyotsai9a06d182020-05-01 17:12:12 -0700806 LV_MAP_COEFF_COST coeff_costs[TX_SIZES][PLANE_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -0700807 //! Costs for coding the eobs.
chiyotsai9a06d182020-05-01 17:12:12 -0700808 LV_MAP_EOB_COST eob_costs[7][2];
809} CoeffCosts;
810
chiyotsaic2f38412020-06-10 16:07:21 -0700811/*!\cond */
812// 4: NEAREST, NEW, NEAR, GLOBAL
813#define SINGLE_REF_MODES ((REF_FRAMES - 1) * 4)
814/*!\endcond */
Ravi Chaudhary5d970f42018-09-25 11:25:32 +0530815struct inter_modes_info;
chiyotsaic2f38412020-06-10 16:07:21 -0700816
Hui Su69af3f52020-10-06 16:28:57 -0700817/*! \brief Holds the motion samples for warp motion model estimation
818 */
819typedef struct {
820 //! Number of samples.
821 int num;
822 //! Sample locations in current frame.
823 int pts[16];
824 //! Sample location in the reference frame.
825 int pts_inref[16];
826} WARP_SAMPLE_INFO;
827
Marco Paniconi988b34a2020-11-09 12:41:13 -0800828/*!\cond */
829typedef enum {
830 kInvalid = 0,
831 kLowSad = 1,
832 kMedSad = 2,
833 kHighSad = 3
834} SOURCE_SAD;
835
836typedef struct {
837 SOURCE_SAD source_sad;
838 int lighting_change;
839 int low_sumdiff;
840} CONTENT_STATE_SB;
Jayasanker J759b3202021-03-24 19:12:32 +0530841
842// Structure to hold pixel level gradient info.
843typedef struct {
844 uint16_t abs_dx_abs_dy_sum;
845 int8_t hist_bin_idx;
846 bool is_dx_zero;
847} PixelLevelGradientInfo;
848
Marco Paniconi988b34a2020-11-09 12:41:13 -0800849/*!\endcond */
850
chiyotsaic2f38412020-06-10 16:07:21 -0700851/*! \brief Encoder's parameters related to the current coding block.
852 *
853 * This struct contains most of the information the encoder needs to encode the
854 * current coding block. This includes the src and pred buffer, a copy of the
855 * decoder's view of the current block, the txfm coefficients. This struct also
856 * contains various buffers and data used to speed up the encoding process.
857 */
858typedef struct macroblock {
859 /*****************************************************************************
860 * \name Source, Buffers and Decoder
861 ****************************************************************************/
862 /**@{*/
863 /*! \brief Each of the encoding plane.
864 *
865 * An array holding the src buffer for each of plane of the current block. It
866 * also contains the txfm and quantized txfm coefficients.
867 */
Yaowu Xuc27fc142016-08-22 16:08:15 -0700868 struct macroblock_plane plane[MAX_MB_PLANE];
869
chiyotsaic2f38412020-06-10 16:07:21 -0700870 /*! \brief Decoder's view of current coding block.
871 *
872 * Contains the encoder's copy of what the decoder sees in the current block.
873 * Most importantly, this struct contains pointers to mbmi that is used in
874 * final bitstream packing.
875 */
Yaowu Xuc27fc142016-08-22 16:08:15 -0700876 MACROBLOCKD e_mbd;
chiyotsai85d715a2020-05-02 15:10:33 -0700877
chiyotsaic2f38412020-06-10 16:07:21 -0700878 /*! \brief Derived coding information.
879 *
880 * Contains extra information not transmitted in the bitstream but are
881 * derived. For example, this contains the stack of ref_mvs.
882 */
chiyotsai0b90c412020-09-29 14:48:16 -0700883 MB_MODE_INFO_EXT mbmi_ext;
chiyotsai85d715a2020-05-02 15:10:33 -0700884
chiyotsaic2f38412020-06-10 16:07:21 -0700885 /*! \brief Finalized mbmi_ext for the whole frame.
886 *
887 * Contains the finalized info in mbmi_ext that gets used at the frame level
888 * for bitstream packing.
889 */
Remya0cce44c2019-08-16 11:57:24 +0530890 MB_MODE_INFO_EXT_FRAME *mbmi_ext_frame;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700891
chiyotsaic2f38412020-06-10 16:07:21 -0700892 //! Entropy context for the current row.
chiyotsai85d715a2020-05-02 15:10:33 -0700893 FRAME_CONTEXT *row_ctx;
chiyotsaic2f38412020-06-10 16:07:21 -0700894 /*! \brief Entropy context for the current tile.
895 *
896 * This context will be used to update color_map_cdf pointer which would be
897 * used during pack bitstream. For single thread and tile-multithreading case
898 * this pointer will be same as xd->tile_ctx, but for the case of row-mt:
899 * xd->tile_ctx will point to a temporary context while tile_pb_ctx will point
900 * to the accurate tile context.
901 */
chiyotsai85d715a2020-05-02 15:10:33 -0700902 FRAME_CONTEXT *tile_pb_ctx;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700903
chiyotsaic2f38412020-06-10 16:07:21 -0700904 /*! \brief Buffer of transformed coefficients
905 *
906 * Points to cb_coef_buff in the AV1_COMP struct, which contains the finalized
907 * coefficients. This is here to conveniently copy the best coefficients to
908 * frame level for bitstream packing. Since CB_COEFF_BUFFER is allocated on a
909 * superblock level, we need to combine it with cb_offset to get the proper
910 * position for the current coding block.
911 */
chiyotsai85d715a2020-05-02 15:10:33 -0700912 CB_COEFF_BUFFER *cb_coef_buff;
chiyotsaic2f38412020-06-10 16:07:21 -0700913 //! Offset of current coding block's coeff buffer relative to the sb.
Jayasanker J2350ca32020-09-10 23:49:00 +0530914 uint16_t cb_offset[PLANE_TYPES];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700915
chiyotsaic2f38412020-06-10 16:07:21 -0700916 //! Modified source and masks used for fast OBMC search.
chiyotsaid2b12212020-04-28 20:57:19 -0700917 OBMCBuffer obmc_buffer;
chiyotsaic2f38412020-06-10 16:07:21 -0700918 //! Buffer to store the best palette map.
Yaowu Xuc27fc142016-08-22 16:08:15 -0700919 PALETTE_BUFFER *palette_buffer;
chiyotsaic2f38412020-06-10 16:07:21 -0700920 //! Buffer used for compound_type_rd().
Hui Su38711e72019-06-11 10:49:47 -0700921 CompoundTypeRdBuffers comp_rd_buffer;
chiyotsaic2f38412020-06-10 16:07:21 -0700922 //! Buffer to store convolution during averaging process in compound mode.
Urvang Joshi0a4cfad2018-09-07 11:10:39 -0700923 CONV_BUF_TYPE *tmp_conv_dst;
chiyotsai2a897eb2020-04-28 19:22:13 -0700924
chiyotsaic2f38412020-06-10 16:07:21 -0700925 /*! \brief Temporary buffer to hold prediction.
926 *
927 * Points to a buffer that is used to hold temporary prediction results. This
928 * is used in two ways:
Sarah Parkerf492c1f2021-03-02 21:01:56 -0800929 * - This is a temporary buffer used to ping-pong the prediction in
chiyotsaic2f38412020-06-10 16:07:21 -0700930 * handle_inter_mode.
931 * - xd->tmp_obmc_bufs also points to this buffer, and is used in ombc
932 * prediction.
933 */
chiyotsai2a897eb2020-04-28 19:22:13 -0700934 uint8_t *tmp_pred_bufs[2];
chiyotsaic2f38412020-06-10 16:07:21 -0700935 /**@}*/
Urvang Joshi0a4cfad2018-09-07 11:10:39 -0700936
chiyotsaic2f38412020-06-10 16:07:21 -0700937 /*****************************************************************************
938 * \name Rdopt Costs
939 ****************************************************************************/
940 /**@{*/
941 /*! \brief Quantization index for the current partition block.
942 *
943 * This is used to as the index to find quantization parameter for luma and
944 * chroma transformed coefficients.
945 */
chiyotsai9a06d182020-05-01 17:12:12 -0700946 int qindex;
947
chiyotsaic2f38412020-06-10 16:07:21 -0700948 /*! \brief Difference between frame-level qindex and current qindex.
949 *
950 * This is used to track whether a non-zero delta for qindex is used at least
951 * once in the current frame.
952 */
chiyotsai9a06d182020-05-01 17:12:12 -0700953 int delta_qindex;
954
chiyotsaic2f38412020-06-10 16:07:21 -0700955 /*! \brief Rate-distortion multiplier.
956 *
957 * The rd multiplier used to determine the rate-distortion trade-off. This is
958 * roughly proportional to the inverse of q-index for a given frame, but this
959 * can be manipulated for better rate-control. For example, in tune_ssim
960 * mode, this is scaled by a factor related to the variance of the current
961 * block.
962 */
chiyotsai9a06d182020-05-01 17:12:12 -0700963 int rdmult;
964
chiyotsaic2f38412020-06-10 16:07:21 -0700965 //! Energy in the current source coding block. Used to calculate \ref rdmult
chiyotsai85d715a2020-05-02 15:10:33 -0700966 int mb_energy;
chiyotsaic2f38412020-06-10 16:07:21 -0700967 //! Energy in the current source superblock. Used to calculate \ref rdmult
chiyotsai85d715a2020-05-02 15:10:33 -0700968 int sb_energy_level;
969
chiyotsaic2f38412020-06-10 16:07:21 -0700970 //! The rate needed to signal a mode to the bitstream.
chiyotsai9a06d182020-05-01 17:12:12 -0700971 ModeCosts mode_costs;
972
chiyotsaic2f38412020-06-10 16:07:21 -0700973 //! The rate needed to encode a new motion vector to the bitstream and some
974 //! multipliers for motion search.
Fyodor Kyslov648c6502021-02-02 18:41:10 -0800975 MvCosts *mv_costs;
chiyotsai9a06d182020-05-01 17:12:12 -0700976
chiyotsai41fd15c2021-03-15 14:12:02 -0700977 /*! The rate needed to encode a new motion vector to the bitstream in intrabc
978 * mode.
979 */
980 IntraBCMVCosts *dv_costs;
981
chiyotsaic2f38412020-06-10 16:07:21 -0700982 //! The rate needed to signal the txfm coefficients to the bitstream.
chiyotsai9a06d182020-05-01 17:12:12 -0700983 CoeffCosts coeff_costs;
chiyotsaic2f38412020-06-10 16:07:21 -0700984 /**@}*/
chiyotsai9a06d182020-05-01 17:12:12 -0700985
Fyodor Kyslov648c6502021-02-02 18:41:10 -0800986 /*****************************************************************************
987 * \name Rate to Distortion Multipliers
988 ****************************************************************************/
989 /**@{*/
990 //! A multiplier that converts mv cost to l2 error.
991 int errorperbit;
992 //! A multiplier that converts mv cost to l1 error.
993 int sadperbit;
994 /**@}*/
995
chiyotsaic2f38412020-06-10 16:07:21 -0700996 /******************************************************************************
997 * \name Segmentation
998 *****************************************************************************/
999 /**@{*/
1000 /*! \brief Skip mode for the segment
1001 *
1002 * A syntax element of the segmentation mode. In skip_block mode, all mvs are
1003 * set 0 and all txfms are skipped.
1004 */
chiyotsai85d715a2020-05-02 15:10:33 -07001005 int seg_skip_block;
Cherma Rajan Ad27a1472021-02-19 11:35:40 +05301006
1007 /*! \brief Number of segment 1 blocks
1008 * Actual number of (4x4) blocks that were applied delta-q,
1009 * for segment 1.
1010 */
1011 int actual_num_seg1_blocks;
1012
1013 /*!\brief Number of segment 2 blocks
1014 * Actual number of (4x4) blocks that were applied delta-q,
1015 * for segment 2.
1016 */
1017 int actual_num_seg2_blocks;
1018
1019 /*!\brief Number of zero motion vectors
1020 */
1021 int cnt_zeromv;
chiyotsaic2f38412020-06-10 16:07:21 -07001022 /**@}*/
chiyotsai85d715a2020-05-02 15:10:33 -07001023
chiyotsaic2f38412020-06-10 16:07:21 -07001024 /*****************************************************************************
1025 * \name Superblock
1026 ****************************************************************************/
1027 /**@{*/
1028 //! Information on a whole superblock level.
chiyotsai85d715a2020-05-02 15:10:33 -07001029 // TODO(chiyotsai@google.com): Refactor this out of macroblock
1030 SuperBlockEnc sb_enc;
1031
chiyotsaic2f38412020-06-10 16:07:21 -07001032 /*! \brief Characteristics of the current superblock.
1033 *
1034 * Characteristics like whether the block has high sad, low sad, etc. This is
1035 * only used by av1 realtime mode.
1036 */
Marco Paniconi988b34a2020-11-09 12:41:13 -08001037 CONTENT_STATE_SB content_state_sb;
chiyotsaic2f38412020-06-10 16:07:21 -07001038 /**@}*/
chiyotsai85d715a2020-05-02 15:10:33 -07001039
chiyotsaic2f38412020-06-10 16:07:21 -07001040 /*****************************************************************************
chiyotsai3afb03e2020-09-08 13:30:12 -07001041 * \name Reference Frame Search
chiyotsaic2f38412020-06-10 16:07:21 -07001042 ****************************************************************************/
1043 /**@{*/
1044 /*! \brief Sum absolute distortion of the predicted mv for each ref frame.
1045 *
1046 * This is used to measure how viable a reference frame is.
1047 */
chiyotsai85d715a2020-05-02 15:10:33 -07001048 int pred_mv_sad[REF_FRAMES];
chiyotsaic2f38412020-06-10 16:07:21 -07001049 //! The minimum of \ref pred_mv_sad.
chiyotsai85d715a2020-05-02 15:10:33 -07001050 int best_pred_mv_sad;
Marco Paniconiaaf2c562021-06-07 14:22:11 -07001051 //! The sad of the 1st mv ref (nearest).
Marco Paniconi737820e2021-05-24 11:03:38 -07001052 int pred_mv0_sad[REF_FRAMES];
Marco Paniconiaaf2c562021-06-07 14:22:11 -07001053 //! The sad of the 2nd mv ref (near).
Marco Paniconi737820e2021-05-24 11:03:38 -07001054 int pred_mv1_sad[REF_FRAMES];
chiyotsai85d715a2020-05-02 15:10:33 -07001055
chiyotsaic2f38412020-06-10 16:07:21 -07001056 /*! \brief Disables certain ref frame pruning based on tpl.
1057 *
1058 * Determines whether a given ref frame is "good" based on data from the TPL
1059 * model. If so, this stops selective_ref frame from pruning the given ref
1060 * frame at block level.
1061 */
chiyotsai85d715a2020-05-02 15:10:33 -07001062 uint8_t tpl_keep_ref_frame[REF_FRAMES];
1063
Hui Su69af3f52020-10-06 16:28:57 -07001064 /*! \brief Warp motion samples buffer.
1065 *
1066 * Store the motion samples used for warp motion.
1067 */
1068 WARP_SAMPLE_INFO warp_sample_info[REF_FRAMES];
1069
chiyotsaic2f38412020-06-10 16:07:21 -07001070 /*! \brief Reference frames picked by the square subblocks in a superblock.
1071 *
1072 * Keeps track of ref frames that are selected by square partition blocks
1073 * within a superblock, in MI resolution. They can be used to prune ref frames
1074 * for rectangular blocks.
1075 */
chiyotsai85d715a2020-05-02 15:10:33 -07001076 int picked_ref_frames_mask[MAX_MIB_SIZE * MAX_MIB_SIZE];
1077
chiyotsaic2f38412020-06-10 16:07:21 -07001078 /*! \brief Prune ref frames in real-time mode.
1079 *
1080 * Determines whether to prune reference frames in real-time mode. For the
1081 * most part, this is the same as nonrd_prune_ref_frame_search in
1082 * cpi->sf.rt_sf.nonrd_prune_ref_frame_search, but this can be selectively
1083 * turned off if the only frame available is GOLDEN_FRAME.
1084 */
chiyotsai85d715a2020-05-02 15:10:33 -07001085 int nonrd_prune_ref_frame_search;
chiyotsaic2f38412020-06-10 16:07:21 -07001086 /**@}*/
chiyotsai85d715a2020-05-02 15:10:33 -07001087
chiyotsaic2f38412020-06-10 16:07:21 -07001088 /*****************************************************************************
1089 * \name Partition Search
1090 ****************************************************************************/
1091 /**@{*/
1092 //! Stores some partition-search related buffers.
chiyotsai68eefbe2020-05-01 15:07:58 -07001093 PartitionSearchInfo part_search_info;
1094
chiyotsaic2f38412020-06-10 16:07:21 -07001095 /*! \brief Whether to disable some features to force a mode in current block.
1096 *
1097 * In some cases, our speed features can be overly aggressive and remove all
1098 * modes search in the superblock. When this happens, we set
1099 * must_find_valid_partition to 1 to reduce the number of speed features, and
1100 * recode the superblock again.
1101 */
chiyotsai85d715a2020-05-02 15:10:33 -07001102 int must_find_valid_partition;
chiyotsaic2f38412020-06-10 16:07:21 -07001103 /**@}*/
chiyotsai85d715a2020-05-02 15:10:33 -07001104
chiyotsaic2f38412020-06-10 16:07:21 -07001105 /*****************************************************************************
1106 * \name Prediction Mode Search
1107 ****************************************************************************/
1108 /**@{*/
1109 /*! \brief Inter skip mode.
1110 *
1111 * Skip mode tries to use the closest forward and backward references for
1112 * inter prediction. Skip here means to skip transmitting the reference
1113 * frames, not to be confused with skip_txfm.
1114 */
chiyotsai85d715a2020-05-02 15:10:33 -07001115 int skip_mode;
1116
chiyotsaic2f38412020-06-10 16:07:21 -07001117 /*! \brief Factors used for rd-thresholding.
1118 *
1119 * Determines a rd threshold to determine whether to continue searching the
1120 * current mode. If the current best rd is already <= threshold, then we skip
1121 * the current mode.
1122 */
chiyotsai85d715a2020-05-02 15:10:33 -07001123 int thresh_freq_fact[BLOCK_SIZES_ALL][MAX_MODES];
1124
chiyotsaic2f38412020-06-10 16:07:21 -07001125 /*! \brief Tracks the winner modes in the current coding block.
1126 *
1127 * Winner mode is a two-pass strategy to find the best prediction mode. In the
1128 * first pass, we search the prediction modes with a limited set of txfm
1129 * options, and keep the top modes. These modes are called the winner modes.
1130 * In the second pass, we retry the winner modes with more thorough txfm
1131 * options.
1132 */
Chethan Kumar R Ea494e2b2021-03-18 17:19:44 +05301133 WinnerModeStats *winner_mode_stats;
chiyotsaic2f38412020-06-10 16:07:21 -07001134 //! Tracks how many winner modes there are.
chiyotsai85d715a2020-05-02 15:10:33 -07001135 int winner_mode_count;
1136
chiyotsaic2f38412020-06-10 16:07:21 -07001137 /*! \brief The model used for rd-estimation to avoid txfm
1138 *
1139 * These are for inter_mode_rd_model_estimation, which is another two pass
1140 * approach. In this speed feature, we collect data in the first couple frames
1141 * to build an rd model to estimate the rdcost of a prediction model based on
1142 * the residue error. Once enough data is collected, this speed feature uses
1143 * the estimated rdcost to find the most performant prediction mode. Then we
1144 * follow up with a second pass find the best transform for the mode.
1145 * Determines if one would go with reduced complexity transform block
1146 * search model to select prediction modes, or full complexity model
1147 * to select transform kernel.
1148 */
chiyotsai85d715a2020-05-02 15:10:33 -07001149 TXFM_RD_MODEL rd_model;
1150
chiyotsaic2f38412020-06-10 16:07:21 -07001151 /*! \brief Stores the inter mode information needed to build an rd model.
1152 *
1153 * These are for inter_mode_rd_model_estimation, which is another two pass
1154 * approach. In this speed feature, we collect data in the first couple frames
1155 * to build an rd model to estimate the rdcost of a prediction model based on
1156 * the residue error. Once enough data is collected, this speed feature uses
1157 * the estimated rdcost to find the most performant prediction mode. Then we
1158 * follow up with a second pass find the best transform for the mode.
1159 */
chiyotsai85d715a2020-05-02 15:10:33 -07001160 // TODO(any): try to consolidate this speed feature with winner mode
1161 // processing.
1162 struct inter_modes_info *inter_modes_info;
1163
chiyotsaic2f38412020-06-10 16:07:21 -07001164 //! How to blend the compound predictions.
chiyotsai85d715a2020-05-02 15:10:33 -07001165 uint8_t compound_idx;
1166
chiyotsaic2f38412020-06-10 16:07:21 -07001167 //! A caches of results of compound type search so they can be reused later.
chiyotsai85d715a2020-05-02 15:10:33 -07001168 COMP_RD_STATS comp_rd_stats[MAX_COMP_RD_STATS];
chiyotsaic2f38412020-06-10 16:07:21 -07001169 //! The idx for the latest compound mode in the cache \ref comp_rd_stats.
chiyotsai85d715a2020-05-02 15:10:33 -07001170 int comp_rd_stats_idx;
1171
chiyotsaic2f38412020-06-10 16:07:21 -07001172 /*! \brief Whether to recompute the luma prediction.
1173 *
1174 * In interpolation search, we can usually skip recalculating the luma
1175 * prediction because it is already calculated by a previous predictor. This
1176 * flag signifies that some modes might have been skipped, so we need to
1177 * rebuild the prediction.
1178 */
chiyotsai85d715a2020-05-02 15:10:33 -07001179 int recalc_luma_mc_data;
1180
chiyotsaic2f38412020-06-10 16:07:21 -07001181 /*! \brief Data structure to speed up intrabc search.
1182 *
1183 * Contains the hash table, hash function, and buffer used for intrabc.
1184 */
1185 IntraBCHashInfo intrabc_hash_info;
chiyotsai3afb03e2020-09-08 13:30:12 -07001186
Aniket Wanareb69e9902021-03-09 14:01:33 +05301187 /*! \brief Whether to reuse the mode stored in mb_mode_cache. */
1188 int use_mb_mode_cache;
1189 /*! \brief The mode to reuse during \ref av1_rd_pick_intra_mode_sb and
1190 * \ref av1_rd_pick_inter_mode. */
1191 const MB_MODE_INFO *mb_mode_cache;
Jayasanker J759b3202021-03-24 19:12:32 +05301192 /*! \brief Pointer to the buffer which caches gradient information.
1193 *
1194 * Pointer to the array of structures to store gradient information of each
1195 * pixel in a superblock. The buffer constitutes of MAX_SB_SQUARE pixel level
1196 * structures for each of the plane types (PLANE_TYPE_Y and PLANE_TYPE_UV).
1197 */
1198 PixelLevelGradientInfo *pixel_gradient_info;
1199 /*! \brief Flags indicating the availability of cached gradient info. */
1200 bool is_sb_gradient_cached[PLANE_TYPES];
chiyotsaic2f38412020-06-10 16:07:21 -07001201 /**@}*/
1202
1203 /*****************************************************************************
1204 * \name MV Search
1205 ****************************************************************************/
1206 /**@{*/
1207 /*! \brief Context used to determine the initial step size in motion search.
1208 *
1209 * This context is defined as the \f$l_\inf\f$ norm of the best ref_mvs for
1210 * each frame.
1211 */
1212 unsigned int max_mv_context[REF_FRAMES];
1213
1214 /*! \brief Limit for the range of motion vectors.
1215 *
1216 * These define limits to motion vector components to prevent them from
1217 * extending outside the UMV borders
1218 */
1219 FullMvLimits mv_limits;
1220 /**@}*/
1221
1222 /*****************************************************************************
1223 * \name Txfm Search
1224 ****************************************************************************/
1225 /**@{*/
1226 /*! \brief Parameters that control how motion search is done.
1227 *
1228 * Stores various txfm search related parameters such as txfm_type, txfm_size,
1229 * trellis eob search, etc.
1230 */
chiyotsaia36d9002020-04-29 16:48:21 -07001231 TxfmSearchParams txfm_search_params;
Nithya V Sd0276ac2019-10-24 11:31:06 +05301232
chiyotsaic2f38412020-06-10 16:07:21 -07001233 /*! \brief Results of the txfm searches that have been done.
1234 *
1235 * Caches old txfm search results and keeps the current txfm decisions to
1236 * facilitate rdopt.
1237 */
chiyotsai4c1e5c62020-04-30 17:54:14 -07001238 TxfmSearchInfo txfm_search_info;
1239
chiyotsaic2f38412020-06-10 16:07:21 -07001240 /*! \brief Whether there is a strong color activity.
1241 *
1242 * Used in REALTIME coding mode to enhance the visual quality at the boundary
1243 * of moving color objects.
1244 */
Marco Paniconi737820e2021-05-24 11:03:38 -07001245 uint8_t color_sensitivity_sb[2];
Marco Paniconiaaf2c562021-06-07 14:22:11 -07001246 //! Color sensitivity flag for the coding block.
chiyotsai85d715a2020-05-02 15:10:33 -07001247 uint8_t color_sensitivity[2];
chiyotsaic2f38412020-06-10 16:07:21 -07001248 /**@}*/
Jingning Han185d23b2020-03-04 09:12:05 -08001249
chiyotsaic2f38412020-06-10 16:07:21 -07001250 /*****************************************************************************
1251 * \name Misc
1252 ****************************************************************************/
1253 /**@{*/
1254 //! Variance of the source frame.
chiyotsai85d715a2020-05-02 15:10:33 -07001255 unsigned int source_variance;
chiyotsaic2f38412020-06-10 16:07:21 -07001256 //! SSE of the current predictor.
chiyotsai85d715a2020-05-02 15:10:33 -07001257 unsigned int pred_sse[REF_FRAMES];
Fyodor Kyslov28af7872020-09-25 18:41:45 -07001258 //! Prediction for ML based partition.
Fyodor Kyslov2c528682021-01-25 11:03:31 -08001259#if CONFIG_RT_ML_PARTITIONING
Fyodor Kyslov28af7872020-09-25 18:41:45 -07001260 DECLARE_ALIGNED(16, uint8_t, est_pred[128 * 128]);
Fyodor Kyslov2c528682021-01-25 11:03:31 -08001261#endif
chiyotsaic2f38412020-06-10 16:07:21 -07001262 /**@}*/
chiyotsaic2f38412020-06-10 16:07:21 -07001263} MACROBLOCK;
1264#undef SINGLE_REF_MODES
Yaowu Xuc27fc142016-08-22 16:08:15 -07001265
chiyotsaic2f38412020-06-10 16:07:21 -07001266/*!\cond */
Vincent Rabaud5a44b622021-06-29 12:07:14 +02001267// Zeroes out 'n_stats' elements in the array x->winner_mode_stats.
1268// It only zeroes out what is necessary in 'color_index_map' (just the block
1269// size, not the whole array).
1270static INLINE void zero_winner_mode_stats(BLOCK_SIZE bsize, int n_stats,
1271 WinnerModeStats *stats) {
1272 const int block_height = block_size_high[bsize];
1273 const int block_width = block_size_wide[bsize];
1274 for (int i = 0; i < n_stats; ++i) {
1275 WinnerModeStats *const stat = &stats[i];
1276 memset(&stat->mbmi, 0, sizeof(stat->mbmi));
1277 memset(&stat->rd_cost, 0, sizeof(stat->rd_cost));
1278 memset(&stat->rd, 0, sizeof(stat->rd));
1279 memset(&stat->rate_y, 0, sizeof(stat->rate_y));
1280 memset(&stat->rate_uv, 0, sizeof(stat->rate_uv));
1281 // Do not reset the whole array as it is CPU intensive.
1282 memset(&stat->color_index_map, 0,
1283 block_width * block_height * sizeof(stat->color_index_map[0]));
1284 memset(&stat->mode_index, 0, sizeof(stat->mode_index));
1285 }
1286}
1287
Frederic Barbier0f191da2018-01-03 17:29:26 +01001288static INLINE int is_rect_tx_allowed_bsize(BLOCK_SIZE bsize) {
1289 static const char LUT[BLOCK_SIZES_ALL] = {
1290 0, // BLOCK_4X4
1291 1, // BLOCK_4X8
1292 1, // BLOCK_8X4
1293 0, // BLOCK_8X8
1294 1, // BLOCK_8X16
1295 1, // BLOCK_16X8
1296 0, // BLOCK_16X16
1297 1, // BLOCK_16X32
1298 1, // BLOCK_32X16
1299 0, // BLOCK_32X32
1300 1, // BLOCK_32X64
1301 1, // BLOCK_64X32
1302 0, // BLOCK_64X64
Frederic Barbier0f191da2018-01-03 17:29:26 +01001303 0, // BLOCK_64X128
1304 0, // BLOCK_128X64
1305 0, // BLOCK_128X128
Frederic Barbier0f191da2018-01-03 17:29:26 +01001306 1, // BLOCK_4X16
1307 1, // BLOCK_16X4
1308 1, // BLOCK_8X32
1309 1, // BLOCK_32X8
1310 1, // BLOCK_16X64
1311 1, // BLOCK_64X16
Frederic Barbier0f191da2018-01-03 17:29:26 +01001312 };
1313
1314 return LUT[bsize];
1315}
1316
1317static INLINE int is_rect_tx_allowed(const MACROBLOCKD *xd,
1318 const MB_MODE_INFO *mbmi) {
chiyotsai0f5cd052020-08-27 14:37:44 -07001319 return is_rect_tx_allowed_bsize(mbmi->bsize) &&
Frederic Barbier0f191da2018-01-03 17:29:26 +01001320 !xd->lossless[mbmi->segment_id];
1321}
1322
Frederic Barbier4b56b102018-03-30 16:09:34 +02001323static INLINE int tx_size_to_depth(TX_SIZE tx_size, BLOCK_SIZE bsize) {
Urvang Joshidd0376f2018-05-02 16:37:25 -07001324 TX_SIZE ctx_size = max_txsize_rect_lookup[bsize];
Frederic Barbier0f191da2018-01-03 17:29:26 +01001325 int depth = 0;
1326 while (tx_size != ctx_size) {
1327 depth++;
Frederic Barbier4b56b102018-03-30 16:09:34 +02001328 ctx_size = sub_tx_size_map[ctx_size];
Frederic Barbier0f191da2018-01-03 17:29:26 +01001329 assert(depth <= MAX_TX_DEPTH);
1330 }
1331 return depth;
1332}
1333
chiyotsai4c1e5c62020-04-30 17:54:14 -07001334static INLINE void set_blk_skip(uint8_t txb_skip[], int plane, int blk_idx,
Grant Hsu39248c32018-09-18 10:38:44 +08001335 int skip) {
1336 if (skip)
chiyotsai4c1e5c62020-04-30 17:54:14 -07001337 txb_skip[blk_idx] |= 1UL << plane;
Grant Hsu39248c32018-09-18 10:38:44 +08001338 else
chiyotsai4c1e5c62020-04-30 17:54:14 -07001339 txb_skip[blk_idx] &= ~(1UL << plane);
Grant Hsu39248c32018-09-18 10:38:44 +08001340#ifndef NDEBUG
1341 // Set chroma planes to uninitialized states when luma is set to check if
1342 // it will be set later
1343 if (plane == 0) {
chiyotsai4c1e5c62020-04-30 17:54:14 -07001344 txb_skip[blk_idx] |= 1UL << (1 + 4);
1345 txb_skip[blk_idx] |= 1UL << (2 + 4);
Grant Hsu39248c32018-09-18 10:38:44 +08001346 }
1347
1348 // Clear the initialization checking bit
chiyotsai4c1e5c62020-04-30 17:54:14 -07001349 txb_skip[blk_idx] &= ~(1UL << (plane + 4));
Grant Hsu39248c32018-09-18 10:38:44 +08001350#endif
1351}
1352
chiyotsai4c1e5c62020-04-30 17:54:14 -07001353static INLINE int is_blk_skip(uint8_t *txb_skip, int plane, int blk_idx) {
Grant Hsu39248c32018-09-18 10:38:44 +08001354#ifndef NDEBUG
1355 // Check if this is initialized
chiyotsai4c1e5c62020-04-30 17:54:14 -07001356 assert(!(txb_skip[blk_idx] & (1UL << (plane + 4))));
Grant Hsu39248c32018-09-18 10:38:44 +08001357
1358 // The magic number is 0x77, this is to test if there is garbage data
chiyotsai4c1e5c62020-04-30 17:54:14 -07001359 assert((txb_skip[blk_idx] & 0x88) == 0);
Grant Hsu39248c32018-09-18 10:38:44 +08001360#endif
chiyotsai4c1e5c62020-04-30 17:54:14 -07001361 return (txb_skip[blk_idx] >> plane) & 1;
Grant Hsu39248c32018-09-18 10:38:44 +08001362}
1363
chiyotsaic2f38412020-06-10 16:07:21 -07001364/*!\endcond */
1365
Yaowu Xuc27fc142016-08-22 16:08:15 -07001366#ifdef __cplusplus
1367} // extern "C"
1368#endif
1369
James Zerne1cbb132018-08-22 14:10:36 -07001370#endif // AOM_AV1_ENCODER_BLOCK_H_