blob: c6c2e3304d941e42583d6aef274a0a8867e8efd2 [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
Yaowu Xuf883b422016-08-30 14:01:10 -070012#ifndef AV1_ENCODER_BLOCK_H_
13#define AV1_ENCODER_BLOCK_H_
Yaowu Xuc27fc142016-08-22 16:08:15 -070014
15#include "av1/common/entropymv.h"
16#include "av1/common/entropy.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070017#include "av1/common/mvref_common.h"
Hui Su1ddf2312017-08-19 15:21:34 -070018#include "av1/encoder/hash.h"
Yushin Cho55104332017-08-14 16:15:43 -070019#if CONFIG_DIST_8X8
20#include "aom/aomcx.h"
21#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -070022
23#ifdef __cplusplus
24extern "C" {
25#endif
26
27typedef struct {
28 unsigned int sse;
29 int sum;
30 unsigned int var;
Urvang Joshi454280d2016-10-14 16:51:44 -070031} DIFF;
Yaowu Xuc27fc142016-08-22 16:08:15 -070032
33typedef struct macroblock_plane {
34 DECLARE_ALIGNED(16, int16_t, src_diff[MAX_SB_SQUARE]);
35 tran_low_t *qcoeff;
36 tran_low_t *coeff;
37 uint16_t *eobs;
Angie Chiang74e23072017-03-24 14:54:23 -070038#if CONFIG_LV_MAP
39 uint8_t *txb_entropy_ctx;
40#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -070041 struct buf_2d src;
42
43 // Quantizer setings
44 const int16_t *quant_fp;
45 const int16_t *round_fp;
46 const int16_t *quant;
47 const int16_t *quant_shift;
48 const int16_t *zbin;
49 const int16_t *round;
50#if CONFIG_NEW_QUANT
51 const cuml_bins_type_nuq *cuml_bins_nuq[QUANT_PROFILES];
52#endif // CONFIG_NEW_QUANT
Yaowu Xuc27fc142016-08-22 16:08:15 -070053} MACROBLOCK_PLANE;
54
hui suc0cf71d2017-07-20 16:38:50 -070055typedef int av1_coeff_cost[PLANE_TYPES][REF_TYPES][COEF_BANDS][COEFF_CONTEXTS]
56 [TAIL_TOKENS];
Yaowu Xuc27fc142016-08-22 16:08:15 -070057
Jingning Handfd72322017-08-09 14:04:12 -070058#if CONFIG_LV_MAP
59typedef struct {
60 int txb_skip_cost[TXB_SKIP_CONTEXTS][2];
61 int nz_map_cost[SIG_COEF_CONTEXTS][2];
62 int eob_cost[EOB_COEF_CONTEXTS][2];
Angie Chiang7ab884e2017-10-18 15:57:12 -070063 int eob_extra_cost[EOB_COEF_CONTEXTS][2];
Jingning Handfd72322017-08-09 14:04:12 -070064 int dc_sign_cost[DC_SIGN_CONTEXTS][2];
65 int base_cost[NUM_BASE_LEVELS][COEFF_BASE_CONTEXTS][2];
Angie Chiang26d3e452017-09-29 17:40:02 -070066 int lps_cost[LEVEL_CONTEXTS][COEFF_BASE_RANGE + 1];
Jingning Han87b01b52017-08-31 12:07:20 -070067 int br_cost[BASE_RANGE_SETS][LEVEL_CONTEXTS][2];
Angie Chiangf12cc4a2017-08-28 15:42:33 -070068#if CONFIG_CTX1D
69 int eob_mode_cost[TX_CLASSES][2];
70 int empty_line_cost[TX_CLASSES][EMPTY_LINE_CONTEXTS][2];
71 int hv_eob_cost[TX_CLASSES][HV_EOB_CONTEXTS][2];
72#endif
Jingning Handfd72322017-08-09 14:04:12 -070073} LV_MAP_COEFF_COST;
Jingning Hanf5a4d3b2017-08-27 23:01:19 -070074
75typedef struct {
76 tran_low_t tcoeff[MAX_MB_PLANE][MAX_SB_SQUARE];
77 uint16_t eobs[MAX_MB_PLANE][MAX_SB_SQUARE / (TX_SIZE_W_MIN * TX_SIZE_H_MIN)];
78 uint8_t txb_skip_ctx[MAX_MB_PLANE]
79 [MAX_SB_SQUARE / (TX_SIZE_W_MIN * TX_SIZE_H_MIN)];
80 int dc_sign_ctx[MAX_MB_PLANE]
81 [MAX_SB_SQUARE / (TX_SIZE_W_MIN * TX_SIZE_H_MIN)];
82} CB_COEFF_BUFFER;
Jingning Handfd72322017-08-09 14:04:12 -070083#endif
84
Yaowu Xuc27fc142016-08-22 16:08:15 -070085typedef struct {
86 int_mv ref_mvs[MODE_CTX_REF_FRAMES][MAX_MV_REF_CANDIDATES];
87 int16_t mode_context[MODE_CTX_REF_FRAMES];
Angie Chiangf0fbf9d2017-03-15 15:01:22 -070088#if CONFIG_LV_MAP
Angie Chiangc484abe2017-03-20 15:43:11 -070089 // TODO(angiebird): Reduce the buffer size according to sb_type
Jingning Hanf5a4d3b2017-08-27 23:01:19 -070090 tran_low_t *tcoeff[MAX_MB_PLANE];
91 uint16_t *eobs[MAX_MB_PLANE];
92 uint8_t *txb_skip_ctx[MAX_MB_PLANE];
93 int *dc_sign_ctx[MAX_MB_PLANE];
Angie Chiangf0fbf9d2017-03-15 15:01:22 -070094#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -070095 uint8_t ref_mv_count[MODE_CTX_REF_FRAMES];
96 CANDIDATE_MV ref_mv_stack[MODE_CTX_REF_FRAMES][MAX_REF_MV_STACK_SIZE];
Yaowu Xuc27fc142016-08-22 16:08:15 -070097 int16_t compound_mode_context[MODE_CTX_REF_FRAMES];
Yaowu Xuc27fc142016-08-22 16:08:15 -070098} MB_MODE_INFO_EXT;
99
Alex Converse0fa0f422017-04-24 12:51:14 -0700100typedef struct {
101 int col_min;
102 int col_max;
103 int row_min;
104 int row_max;
105} MvLimits;
106
Yaowu Xuc27fc142016-08-22 16:08:15 -0700107typedef struct {
108 uint8_t best_palette_color_map[MAX_SB_SQUARE];
109 float kmeans_data_buf[2 * MAX_SB_SQUARE];
110} PALETTE_BUFFER;
111
Hui Su1ddf2312017-08-19 15:21:34 -0700112typedef struct {
113 TX_TYPE tx_type;
114 TX_SIZE tx_size;
Hui Su1ddf2312017-08-19 15:21:34 -0700115 TX_SIZE min_tx_size;
116 TX_SIZE inter_tx_size[MAX_MIB_SIZE][MAX_MIB_SIZE];
117 uint8_t blk_skip[MAX_MIB_SIZE * MAX_MIB_SIZE * 8];
Hui Su1ddf2312017-08-19 15:21:34 -0700118#if CONFIG_TXK_SEL
119 TX_TYPE txk_type[MAX_SB_SQUARE / (TX_SIZE_W_MIN * TX_SIZE_H_MIN)];
120#endif // CONFIG_TXK_SEL
121 RD_STATS rd_stats;
122 uint32_t hash_value;
123} TX_RD_INFO;
124
125#define RD_RECORD_BUFFER_LEN 8
126typedef struct {
127 TX_RD_INFO tx_rd_info[RD_RECORD_BUFFER_LEN]; // Circular buffer.
128 int index_start;
129 int num;
130 CRC_CALCULATOR crc_calculator; // Hash function.
131} TX_RD_RECORD;
132
Yaowu Xuc27fc142016-08-22 16:08:15 -0700133typedef struct macroblock MACROBLOCK;
134struct macroblock {
135 struct macroblock_plane plane[MAX_MB_PLANE];
136
Hui Su1ddf2312017-08-19 15:21:34 -0700137 // Save the transform RD search info.
138 TX_RD_RECORD tx_rd_record;
139
Yaowu Xuc27fc142016-08-22 16:08:15 -0700140 MACROBLOCKD e_mbd;
141 MB_MODE_INFO_EXT *mbmi_ext;
142 int skip_block;
David Barkerd7d78c82016-10-24 10:55:35 +0100143 int qindex;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700144
145 // The equivalent error at the current rdmult of one whole bit (not one
146 // bitcost unit).
147 int errorperbit;
148 // The equivalend SAD error of one (whole) bit at the current quantizer
149 // for large blocks.
150 int sadperbit16;
151 // The equivalend SAD error of one (whole) bit at the current quantizer
152 // for sub-8x8 blocks.
153 int sadperbit4;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700154 int rdmult;
155 int mb_energy;
156 int *m_search_count_ptr;
157 int *ex_search_count_ptr;
158
Jingning Han9777afc2016-10-20 15:17:43 -0700159 unsigned int txb_split_count;
Jingning Han9777afc2016-10-20 15:17:43 -0700160
Yaowu Xuc27fc142016-08-22 16:08:15 -0700161 // These are set to their default values at the beginning, and then adjusted
162 // further in the encoding process.
163 BLOCK_SIZE min_partition_size;
164 BLOCK_SIZE max_partition_size;
165
166 int mv_best_ref_index[TOTAL_REFS_PER_FRAME];
167 unsigned int max_mv_context[TOTAL_REFS_PER_FRAME];
168 unsigned int source_variance;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700169 unsigned int pred_sse[TOTAL_REFS_PER_FRAME];
170 int pred_mv_sad[TOTAL_REFS_PER_FRAME];
171
Yaowu Xuc27fc142016-08-22 16:08:15 -0700172 int *nmvjointcost;
173 int nmv_vec_cost[NMV_CONTEXTS][MV_JOINTS];
174 int *nmvcost[NMV_CONTEXTS][2];
175 int *nmvcost_hp[NMV_CONTEXTS][2];
176 int **mv_cost_stack[NMV_CONTEXTS];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700177 int **mvcost;
Alex Conversea127a792017-05-23 15:27:21 -0700178
Yue Chene9638cc2016-10-10 12:37:54 -0700179 int32_t *wsrc_buf;
180 int32_t *mask_buf;
Jingning Hand064cf02017-06-01 10:00:39 -0700181 uint8_t *above_pred_buf;
182 uint8_t *left_pred_buf;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700183
184 PALETTE_BUFFER *palette_buffer;
185
186 // These define limits to motion vector components to prevent them
187 // from extending outside the UMV borders
Alex Converse0fa0f422017-04-24 12:51:14 -0700188 MvLimits mv_limits;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700189
Jingning Han9ca05b72017-01-03 14:41:36 -0800190 uint8_t blk_skip[MAX_MB_PLANE][MAX_MIB_SIZE * MAX_MIB_SIZE * 8];
Jingning Han9ca05b72017-01-03 14:41:36 -0800191 uint8_t blk_skip_drl[MAX_MB_PLANE][MAX_MIB_SIZE * MAX_MIB_SIZE * 8];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700192
193 int skip;
Jingning Han8efdbc82017-02-19 14:40:03 -0800194 int skip_chroma_rd;
Zoe Liu1eed2df2017-10-16 17:13:15 -0700195 int skip_cost[SKIP_CONTEXTS][2];
196
Jingning Handfd72322017-08-09 14:04:12 -0700197#if CONFIG_LV_MAP
198 LV_MAP_COEFF_COST coeff_costs[TX_SIZES][PLANE_TYPES];
Jingning Hanf5a4d3b2017-08-27 23:01:19 -0700199 uint16_t cb_offset;
Jingning Handfd72322017-08-09 14:04:12 -0700200#endif
201
hui suc0cf71d2017-07-20 16:38:50 -0700202 av1_coeff_cost token_head_costs[TX_SIZES];
203 av1_coeff_cost token_tail_costs[TX_SIZES];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700204
Yue Chenb23d00a2017-07-28 17:01:21 -0700205 // mode costs
Yue Chen170678a2017-10-17 13:43:10 -0700206 int intra_inter_cost[INTRA_INTER_CONTEXTS][2];
207
Yue Chenb23d00a2017-07-28 17:01:21 -0700208 int mbmode_cost[BLOCK_SIZE_GROUPS][INTRA_MODES];
209 int newmv_mode_cost[NEWMV_MODE_CONTEXTS][2];
210 int zeromv_mode_cost[ZEROMV_MODE_CONTEXTS][2];
211 int refmv_mode_cost[REFMV_MODE_CONTEXTS][2];
212 int drl_mode_cost0[DRL_MODE_CONTEXTS][2];
213
Yue Chenb23d00a2017-07-28 17:01:21 -0700214 int inter_compound_mode_cost[INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES];
Yue Chena4245512017-08-31 11:58:08 -0700215 int compound_type_cost[BLOCK_SIZES_ALL][COMPOUND_TYPES];
Yue Chenb23d00a2017-07-28 17:01:21 -0700216#if CONFIG_COMPOUND_SINGLEREF
217 int inter_singleref_comp_mode_cost[INTER_MODE_CONTEXTS]
218 [INTER_SINGLEREF_COMP_MODES];
219#endif // CONFIG_COMPOUND_SINGLEREF
Yue Cheneaf128a2017-10-16 17:01:36 -0700220 int interintra_cost[BLOCK_SIZE_GROUPS][2];
221 int wedge_interintra_cost[BLOCK_SIZES_ALL][2];
Yue Chenb23d00a2017-07-28 17:01:21 -0700222 int interintra_mode_cost[BLOCK_SIZE_GROUPS][INTERINTRA_MODES];
Yue Chenb23d00a2017-07-28 17:01:21 -0700223 int motion_mode_cost[BLOCK_SIZES_ALL][MOTION_MODES];
Yue Chenb23d00a2017-07-28 17:01:21 -0700224 int motion_mode_cost1[BLOCK_SIZES_ALL][2];
Wei-Ting Lin07ed3ab2017-08-28 17:50:25 -0700225#if CONFIG_NCOBMC_ADAPT_WEIGHT
226 int motion_mode_cost2[BLOCK_SIZES_ALL][OBMC_FAMILY_MODES];
227#endif
Sebastien Alaiwan1bc94fc2017-10-31 10:25:17 +0100228#if CONFIG_NCOBMC_ADAPT_WEIGHT
Yue Chenb23d00a2017-07-28 17:01:21 -0700229 int ncobmc_mode_cost[ADAPT_OVERLAP_BLOCKS][MAX_NCOBMC_MODES];
Sebastien Alaiwan1bc94fc2017-10-31 10:25:17 +0100230#endif // CONFIG_NCOBMC_ADAPT_WEIGHT
Yue Chenb23d00a2017-07-28 17:01:21 -0700231 int intra_uv_mode_cost[INTRA_MODES][UV_INTRA_MODES];
232 int y_mode_costs[INTRA_MODES][INTRA_MODES][INTRA_MODES];
Yue Chen63ce36f2017-10-10 23:37:31 -0700233#if CONFIG_FILTER_INTRA
234 int filter_intra_mode_cost[PLANE_TYPES][FILTER_INTRA_MODES];
235#endif
Yue Chenb23d00a2017-07-28 17:01:21 -0700236 int switchable_interp_costs[SWITCHABLE_FILTER_CONTEXTS][SWITCHABLE_FILTERS];
237#if CONFIG_EXT_PARTITION_TYPES
238 int partition_cost[PARTITION_CONTEXTS + CONFIG_UNPOISON_PARTITION_CTX]
239 [EXT_PARTITION_TYPES];
240#else
241 int partition_cost[PARTITION_CONTEXTS + CONFIG_UNPOISON_PARTITION_CTX]
242 [PARTITION_TYPES];
243#endif // CONFIG_EXT_PARTITION_TYPES
Sarah Parker5c6744b2017-08-25 17:27:45 -0700244#if CONFIG_MRC_TX
245 int mrc_mask_inter_cost[PALETTE_SIZES][PALETTE_COLOR_INDEX_CONTEXTS]
246 [PALETTE_COLORS];
247 int mrc_mask_intra_cost[PALETTE_SIZES][PALETTE_COLOR_INDEX_CONTEXTS]
248 [PALETTE_COLORS];
249#endif // CONFIG_MRC_TX
Yue Chenb23d00a2017-07-28 17:01:21 -0700250 int palette_y_size_cost[PALETTE_BLOCK_SIZES][PALETTE_SIZES];
251 int palette_uv_size_cost[PALETTE_BLOCK_SIZES][PALETTE_SIZES];
252 int palette_y_color_cost[PALETTE_SIZES][PALETTE_COLOR_INDEX_CONTEXTS]
253 [PALETTE_COLORS];
254 int palette_uv_color_cost[PALETTE_SIZES][PALETTE_COLOR_INDEX_CONTEXTS]
255 [PALETTE_COLORS];
Yue Chendab2ca92017-10-16 17:48:48 -0700256 int palette_y_mode_cost[PALETTE_BLOCK_SIZES][PALETTE_Y_MODE_CONTEXTS][2];
257 int palette_uv_mode_cost[PALETTE_UV_MODE_CONTEXTS][2];
David Michael Barr38e560c2017-08-16 21:46:37 +0900258#if CONFIG_CFL
259 // The rate associated with each alpha codeword
260 int cfl_cost[CFL_JOINT_SIGNS][CFL_PRED_PLANES][CFL_ALPHABET_SIZE];
261#endif // CONFIG_CFL
Yue Chenb23d00a2017-07-28 17:01:21 -0700262 int tx_size_cost[TX_SIZES - 1][TX_SIZE_CONTEXTS][TX_SIZES];
Sebastien Alaiwanfb838772017-10-24 12:02:54 +0200263#if CONFIG_RECT_TX_EXT
Yue Chen3dd03e32017-10-17 15:39:52 -0700264 int quarter_tx_size_cost[2];
265#endif
Yue Chen171c17d2017-10-16 18:08:22 -0700266 int txfm_partition_cost[TXFM_PARTITION_CONTEXTS][2];
Yue Chenb23d00a2017-07-28 17:01:21 -0700267#if CONFIG_EXT_TX
Lester Lu432012f2017-08-17 14:39:29 -0700268#if CONFIG_LGT_FROM_PRED
269 int intra_lgt_cost[LGT_SIZES][INTRA_MODES][2];
270 int inter_lgt_cost[LGT_SIZES][2];
271#endif
Yue Chenb23d00a2017-07-28 17:01:21 -0700272 int inter_tx_type_costs[EXT_TX_SETS_INTER][EXT_TX_SIZES][TX_TYPES];
273 int intra_tx_type_costs[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES]
274 [TX_TYPES];
275#else
276 int intra_tx_type_costs[EXT_TX_SIZES][TX_TYPES][TX_TYPES];
277 int inter_tx_type_costs[EXT_TX_SIZES][TX_TYPES];
278#endif // CONFIG_EXT_TX
Joe Young3ca43bf2017-10-06 15:12:46 -0700279#if CONFIG_EXT_INTRA && CONFIG_EXT_INTRA_MOD
280 int angle_delta_cost[DIRECTIONAL_MODES][2 * MAX_ANGLE_DELTA + 1];
281#endif // CONFIG_EXT_INTRA && CONFIG_EXT_INTRA_MOD
Yue Chenb23d00a2017-07-28 17:01:21 -0700282#if CONFIG_LOOP_RESTORATION
283 int switchable_restore_cost[RESTORE_SWITCHABLE_TYPES];
Debargha Mukherjeebc732ef2017-10-12 12:40:25 -0700284 int wiener_restore_cost[2];
285 int sgrproj_restore_cost[2];
Yue Chenb23d00a2017-07-28 17:01:21 -0700286#endif // CONFIG_LOOP_RESTORATION
Hui Su6c8584f2017-09-14 15:37:02 -0700287#if CONFIG_INTRABC
288 int intrabc_cost[2];
289#endif // CONFIG_INTRABC
Yue Chenb23d00a2017-07-28 17:01:21 -0700290
Yaowu Xuc27fc142016-08-22 16:08:15 -0700291 int optimize;
292
Yaowu Xuc27fc142016-08-22 16:08:15 -0700293 // Used to store sub partition's choices.
294 MV pred_mv[TOTAL_REFS_PER_FRAME];
295
296 // Store the best motion vector during motion search
297 int_mv best_mv;
298 // Store the second best motion vector during full-pixel motion search
299 int_mv second_best_mv;
300
Yaowu Xuc27fc142016-08-22 16:08:15 -0700301 // use default transform and skip transform type search for intra modes
302 int use_default_intra_tx_type;
303 // use default transform and skip transform type search for inter modes
304 int use_default_inter_tx_type;
Yushin Chob7b60c52017-07-14 16:18:52 -0700305#if CONFIG_DIST_8X8
Yushin Cho55104332017-08-14 16:15:43 -0700306 int using_dist_8x8;
307 aom_tune_metric tune_metric;
Yushin Cho8ab875d2017-06-23 14:47:21 -0700308#if CONFIG_HIGHBITDEPTH
309 DECLARE_ALIGNED(16, uint16_t, decoded_8x8[8 * 8]);
310#else
Yushin Cho63927c42017-05-23 15:41:05 -0700311 DECLARE_ALIGNED(16, uint8_t, decoded_8x8[8 * 8]);
Yushin Cho8ab875d2017-06-23 14:47:21 -0700312#endif
Yushin Chob7b60c52017-07-14 16:18:52 -0700313#endif // CONFIG_DIST_8X8
Yaowu Xuc27fc142016-08-22 16:08:15 -0700314};
315
316#ifdef __cplusplus
317} // extern "C"
318#endif
319
Yaowu Xuf883b422016-08-30 14:01:10 -0700320#endif // AV1_ENCODER_BLOCK_H_