blob: 09cd6bd1e9cd94b466659a7b66a092ee068136d9 [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
James Zerne1cbb132018-08-22 14:10:36 -070012#ifndef AOM_AV1_COMMON_ENTROPYMODE_H_
13#define AOM_AV1_COMMON_ENTROPYMODE_H_
Yaowu Xuc27fc142016-08-22 16:08:15 -070014
15#include "av1/common/entropy.h"
16#include "av1/common/entropymv.h"
17#include "av1/common/filter.h"
18#include "av1/common/seg_common.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070019
20#ifdef __cplusplus
21extern "C" {
22#endif
23
24#define BLOCK_SIZE_GROUPS 4
25
Jingning Han02384572018-02-21 11:28:59 -080026#define TX_SIZE_CONTEXTS 3
Yaowu Xuc27fc142016-08-22 16:08:15 -070027
28#define INTER_OFFSET(mode) ((mode)-NEARESTMV)
Jingning Han673b5dd2018-03-12 11:10:51 -070029#define INTER_COMPOUND_OFFSET(mode) (uint8_t)((mode)-NEAREST_NEARESTMV)
Yaowu Xuc27fc142016-08-22 16:08:15 -070030
Urvang Joshi23a61112017-01-30 14:59:27 -080031// Number of possible contexts for a color index.
32// As can be seen from av1_get_palette_color_index_context(), the possible
33// contexts are (2,0,0), (2,2,1), (3,2,0), (4,1,0), (5,0,0). These are mapped to
Wan-Teh Change49f9832022-11-25 15:09:32 -080034// a value from 0 to 4 using 'av1_palette_color_index_context_lookup' table.
Urvang Joshi23a61112017-01-30 14:59:27 -080035#define PALETTE_COLOR_INDEX_CONTEXTS 5
36
Urvang Joshi23a61112017-01-30 14:59:27 -080037// Palette Y mode context for a block is determined by number of neighboring
38// blocks (top and/or left) using a palette for Y plane. So, possible Y mode'
39// context values are:
40// 0 if neither left nor top block uses palette for Y plane,
41// 1 if exactly one of left or top block uses palette for Y plane, and
42// 2 if both left and top blocks use palette for Y plane.
Yaowu Xuc27fc142016-08-22 16:08:15 -070043#define PALETTE_Y_MODE_CONTEXTS 3
Urvang Joshi23a61112017-01-30 14:59:27 -080044
45// Palette UV mode context for a block is determined by whether this block uses
46// palette for the Y plane. So, possible values are:
47// 0 if this block doesn't use palette for Y plane.
48// 1 if this block uses palette for Y plane (i.e. Y palette size > 0).
49#define PALETTE_UV_MODE_CONTEXTS 2
50
Hui Su8b618f62017-12-20 12:03:35 -080051// Map the number of pixels in a block size to a context
Hui Su476f0b52018-04-16 15:51:44 -070052// 64(BLOCK_8X8, BLOCK_4x16, BLOCK_16X4) -> 0
53// 128(BLOCK_8X16, BLOCK_16x8) -> 1
Hui Su8b618f62017-12-20 12:03:35 -080054// ...
Hui Su476f0b52018-04-16 15:51:44 -070055// 4096(BLOCK_64X64) -> 6
56#define PALATTE_BSIZE_CTXS 7
Hui Su8b618f62017-12-20 12:03:35 -080057
chiyotsai8adab752022-11-17 14:33:16 -080058#define MAX_COLOR_CONTEXT_HASH 8
59
60#define NUM_PALETTE_NEIGHBORS 3 // left, top-left and top.
61
Jingning Hana45d8422017-10-05 09:57:38 -070062#define KF_MODE_CONTEXTS 5
Jingning Hana45d8422017-10-05 09:57:38 -070063
Yaowu Xuf883b422016-08-30 14:01:10 -070064struct AV1Common;
Yaowu Xuc27fc142016-08-22 16:08:15 -070065
Angie Chiang37fb8ed2016-10-20 09:50:32 -070066typedef struct {
67 const int16_t *scan;
68 const int16_t *iscan;
Angie Chiang37fb8ed2016-10-20 09:50:32 -070069} SCAN_ORDER;
70
Yaowu Xuc27fc142016-08-22 16:08:15 -070071typedef struct frame_contexts {
Jingning Hanfdaa55e2017-08-18 16:21:36 -070072 aom_cdf_prob txb_skip_cdf[TX_SIZES][TXB_SKIP_CONTEXTS][CDF_SIZE(2)];
Angie Chiang7ab884e2017-10-18 15:57:12 -070073 aom_cdf_prob eob_extra_cdf[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS]
74 [CDF_SIZE(2)];
Jingning Hanfdaa55e2017-08-18 16:21:36 -070075 aom_cdf_prob dc_sign_cdf[PLANE_TYPES][DC_SIGN_CONTEXTS][CDF_SIZE(2)];
Dake He0db7d0e2017-12-21 15:23:20 -080076 aom_cdf_prob eob_flag_cdf16[PLANE_TYPES][2][CDF_SIZE(5)];
77 aom_cdf_prob eob_flag_cdf32[PLANE_TYPES][2][CDF_SIZE(6)];
78 aom_cdf_prob eob_flag_cdf64[PLANE_TYPES][2][CDF_SIZE(7)];
79 aom_cdf_prob eob_flag_cdf128[PLANE_TYPES][2][CDF_SIZE(8)];
80 aom_cdf_prob eob_flag_cdf256[PLANE_TYPES][2][CDF_SIZE(9)];
81 aom_cdf_prob eob_flag_cdf512[PLANE_TYPES][2][CDF_SIZE(10)];
82 aom_cdf_prob eob_flag_cdf1024[PLANE_TYPES][2][CDF_SIZE(11)];
Dake He3fe369c2017-11-16 17:56:44 -080083 aom_cdf_prob coeff_base_eob_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS_EOB]
84 [CDF_SIZE(3)];
Ola Hugossone72a2092017-11-12 09:11:53 +010085 aom_cdf_prob coeff_base_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS]
86 [CDF_SIZE(4)];
87 aom_cdf_prob coeff_br_cdf[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS]
88 [CDF_SIZE(BR_CDF_SIZE)];
Angie Chiangbd57fc52017-02-24 11:29:27 -080089
Thomas Davies149eda52017-06-12 18:11:55 +010090 aom_cdf_prob newmv_cdf[NEWMV_MODE_CONTEXTS][CDF_SIZE(2)];
Sarah Parker2b9ec2e2017-10-30 17:34:08 -070091 aom_cdf_prob zeromv_cdf[GLOBALMV_MODE_CONTEXTS][CDF_SIZE(2)];
Thomas Davies149eda52017-06-12 18:11:55 +010092 aom_cdf_prob refmv_cdf[REFMV_MODE_CONTEXTS][CDF_SIZE(2)];
93 aom_cdf_prob drl_cdf[DRL_MODE_CONTEXTS][CDF_SIZE(2)];
Yaowu Xuc27fc142016-08-22 16:08:15 -070094
Thomas Davies8c08a332017-06-26 17:30:34 +010095 aom_cdf_prob inter_compound_mode_cdf[INTER_MODE_CONTEXTS]
96 [CDF_SIZE(INTER_COMPOUND_MODES)];
Debargha Mukherjee54eabb52019-02-01 16:54:33 -080097 aom_cdf_prob compound_type_cdf[BLOCK_SIZES_ALL]
98 [CDF_SIZE(MASKED_COMPOUND_TYPES)];
Yue Chen73335fa2017-12-20 23:33:41 -080099 aom_cdf_prob wedge_idx_cdf[BLOCK_SIZES_ALL][CDF_SIZE(16)];
Thomas Daviescff91712017-07-07 11:49:55 +0100100 aom_cdf_prob interintra_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(2)];
Rupert Swarbrick93c39e92017-07-12 11:11:02 +0100101 aom_cdf_prob wedge_interintra_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)];
Thomas Davies299ff042017-06-27 13:41:59 +0100102 aom_cdf_prob interintra_mode_cdf[BLOCK_SIZE_GROUPS]
103 [CDF_SIZE(INTERINTRA_MODES)];
Rupert Swarbrick93c39e92017-07-12 11:11:02 +0100104 aom_cdf_prob motion_mode_cdf[BLOCK_SIZES_ALL][CDF_SIZE(MOTION_MODES)];
Rupert Swarbrick93c39e92017-07-12 11:11:02 +0100105 aom_cdf_prob obmc_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)];
Hui Suc1f411b2017-12-19 15:58:28 -0800106 aom_cdf_prob palette_y_size_cdf[PALATTE_BSIZE_CTXS][CDF_SIZE(PALETTE_SIZES)];
107 aom_cdf_prob palette_uv_size_cdf[PALATTE_BSIZE_CTXS][CDF_SIZE(PALETTE_SIZES)];
Thomas Daviesce7272d2017-07-04 16:11:08 +0100108 aom_cdf_prob palette_y_color_index_cdf[PALETTE_SIZES]
109 [PALETTE_COLOR_INDEX_CONTEXTS]
110 [CDF_SIZE(PALETTE_COLORS)];
111 aom_cdf_prob palette_uv_color_index_cdf[PALETTE_SIZES]
112 [PALETTE_COLOR_INDEX_CONTEXTS]
113 [CDF_SIZE(PALETTE_COLORS)];
Hui Suc1f411b2017-12-19 15:58:28 -0800114 aom_cdf_prob palette_y_mode_cdf[PALATTE_BSIZE_CTXS][PALETTE_Y_MODE_CONTEXTS]
Thomas Davies59f92312017-08-23 00:33:12 +0100115 [CDF_SIZE(2)];
116 aom_cdf_prob palette_uv_mode_cdf[PALETTE_UV_MODE_CONTEXTS][CDF_SIZE(2)];
Thomas Davies860def62017-06-14 10:00:03 +0100117 aom_cdf_prob comp_inter_cdf[COMP_INTER_CONTEXTS][CDF_SIZE(2)];
Thomas Davies315f5782017-06-14 15:14:55 +0100118 aom_cdf_prob single_ref_cdf[REF_CONTEXTS][SINGLE_REFS - 1][CDF_SIZE(2)];
Zoe Liufcf5fa22017-06-26 16:00:38 -0700119 aom_cdf_prob comp_ref_type_cdf[COMP_REF_TYPE_CONTEXTS][CDF_SIZE(2)];
120 aom_cdf_prob uni_comp_ref_cdf[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1]
121 [CDF_SIZE(2)];
Zoe Liu3b353472018-02-12 13:58:22 -0800122 aom_cdf_prob comp_ref_cdf[REF_CONTEXTS][FWD_REFS - 1][CDF_SIZE(2)];
123 aom_cdf_prob comp_bwdref_cdf[REF_CONTEXTS][BWD_REFS - 1][CDF_SIZE(2)];
Thomas Davies985bfc32017-06-27 16:51:26 +0100124 aom_cdf_prob txfm_partition_cdf[TXFM_PARTITION_CONTEXTS][CDF_SIZE(2)];
Cheng Chen46970612017-10-24 14:53:36 -0700125 aom_cdf_prob compound_index_cdf[COMP_INDEX_CONTEXTS][CDF_SIZE(2)];
Cheng Chen33a13d92017-11-28 16:49:59 -0800126 aom_cdf_prob comp_group_idx_cdf[COMP_GROUP_IDX_CONTEXTS][CDF_SIZE(2)];
chiyotsai8c004e12020-04-17 15:52:08 -0700127 aom_cdf_prob skip_mode_cdfs[SKIP_MODE_CONTEXTS][CDF_SIZE(2)];
128 aom_cdf_prob skip_txfm_cdfs[SKIP_CONTEXTS][CDF_SIZE(2)];
Thomas Daviesf6ad9352017-04-19 11:38:06 +0100129 aom_cdf_prob intra_inter_cdf[INTRA_INTER_CONTEXTS][CDF_SIZE(2)];
Jingning Hanf050fc12018-03-09 14:53:33 -0800130 nmv_context nmvc;
Alex Converse28744302017-04-13 14:46:22 -0700131 nmv_context ndvc;
Hui Su6c8584f2017-09-14 15:37:02 -0700132 aom_cdf_prob intrabc_cdf[CDF_SIZE(2)];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700133 struct segmentation_probs seg;
Yue Chen45dfb792018-03-01 13:02:40 -0800134 aom_cdf_prob filter_intra_cdfs[BLOCK_SIZES_ALL][CDF_SIZE(2)];
Yue Chen994dba22017-12-19 15:27:26 -0800135 aom_cdf_prob filter_intra_mode_cdf[CDF_SIZE(FILTER_INTRA_MODES)];
Debargha Mukherjeebc732ef2017-10-12 12:40:25 -0700136 aom_cdf_prob switchable_restore_cdf[CDF_SIZE(RESTORE_SWITCHABLE_TYPES)];
Debargha Mukherjeebc732ef2017-10-12 12:40:25 -0700137 aom_cdf_prob wiener_restore_cdf[CDF_SIZE(2)];
138 aom_cdf_prob sgrproj_restore_cdf[CDF_SIZE(2)];
Thomas Daviesf3eb8402017-02-20 18:20:20 +0000139 aom_cdf_prob y_mode_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(INTRA_MODES)];
David Michael Barrcb3a8ef2018-01-06 15:48:49 +0900140 aom_cdf_prob uv_mode_cdf[CFL_ALLOWED_TYPES][INTRA_MODES]
141 [CDF_SIZE(UV_INTRA_MODES)];
Alex Converse57795a42017-03-14 12:18:25 -0700142 aom_cdf_prob partition_cdf[PARTITION_CONTEXTS][CDF_SIZE(EXT_PARTITION_TYPES)];
Nathan E. Egge00b33312016-11-16 09:44:26 -0500143 aom_cdf_prob switchable_interp_cdf[SWITCHABLE_FILTER_CONTEXTS]
Thomas Daviesf3eb8402017-02-20 18:20:20 +0000144 [CDF_SIZE(SWITCHABLE_FILTERS)];
Hui Su717ce092018-01-29 11:32:44 -0800145 /* kf_y_cdf is discarded after use, so does not require persistent storage.
146 However, we keep it with the other CDFs in this struct since it needs to
147 be copied to each tile to support parallelism just like the others.
148 */
Jingning Hana45d8422017-10-05 09:57:38 -0700149 aom_cdf_prob kf_y_cdf[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS]
150 [CDF_SIZE(INTRA_MODES)];
Joe Young3ca43bf2017-10-06 15:12:46 -0700151
Joe Young3ca43bf2017-10-06 15:12:46 -0700152 aom_cdf_prob angle_delta_cdf[DIRECTIONAL_MODES]
153 [CDF_SIZE(2 * MAX_ANGLE_DELTA + 1)];
Joe Young3ca43bf2017-10-06 15:12:46 -0700154
Debargha Mukherjee6147b1b2017-11-08 08:31:09 -0800155 aom_cdf_prob tx_size_cdf[MAX_TX_CATS][TX_SIZE_CONTEXTS]
Thomas Daviesf3eb8402017-02-20 18:20:20 +0000156 [CDF_SIZE(MAX_TX_DEPTH + 1)];
Thomas Daviesd6ee8a82017-03-02 14:42:50 +0000157 aom_cdf_prob delta_q_cdf[CDF_SIZE(DELTA_Q_PROBS + 1)];
Cheng Chen880166a2017-10-02 17:48:48 -0700158 aom_cdf_prob delta_lf_multi_cdf[FRAME_LF_COUNT][CDF_SIZE(DELTA_LF_PROBS + 1)];
Cheng Chen880166a2017-10-02 17:48:48 -0700159 aom_cdf_prob delta_lf_cdf[CDF_SIZE(DELTA_LF_PROBS + 1)];
Thomas Daviesb1bedf52017-03-17 14:03:28 +0000160 aom_cdf_prob intra_ext_tx_cdf[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES]
161 [CDF_SIZE(TX_TYPES)];
162 aom_cdf_prob inter_ext_tx_cdf[EXT_TX_SETS_INTER][EXT_TX_SIZES]
163 [CDF_SIZE(TX_TYPES)];
David Michael Barrf6eaa152017-07-19 19:42:28 +0900164 aom_cdf_prob cfl_sign_cdf[CDF_SIZE(CFL_JOINT_SIGNS)];
165 aom_cdf_prob cfl_alpha_cdf[CFL_ALPHA_CONTEXTS][CDF_SIZE(CFL_ALPHABET_SIZE)];
Hui Sudc54be62018-03-14 19:14:28 -0700166 int initialized;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700167} FRAME_CONTEXT;
168
Hui Su0d9888b2017-10-03 10:17:20 -0700169static const int av1_ext_tx_ind[EXT_TX_SET_TYPES][TX_TYPES] = {
Johann6b41d4d2018-02-08 14:32:53 -0800170 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
171 { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
172 { 1, 3, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
173 { 1, 5, 6, 4, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0 },
Johann6b41d4d2018-02-08 14:32:53 -0800174 { 3, 4, 5, 8, 6, 7, 9, 10, 11, 0, 1, 2, 0, 0, 0, 0 },
175 { 7, 8, 9, 12, 10, 11, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6 },
Hui Su0d9888b2017-10-03 10:17:20 -0700176};
177
178static const int av1_ext_tx_inv[EXT_TX_SET_TYPES][TX_TYPES] = {
Johann6b41d4d2018-02-08 14:32:53 -0800179 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
180 { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
181 { 9, 0, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
182 { 9, 0, 10, 11, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
Johann6b41d4d2018-02-08 14:32:53 -0800183 { 9, 10, 11, 0, 1, 2, 4, 5, 3, 6, 7, 8, 0, 0, 0, 0 },
184 { 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 4, 5, 3, 6, 7, 8 },
Hui Su0d9888b2017-10-03 10:17:20 -0700185};
Thomas Daviesb1bedf52017-03-17 14:03:28 +0000186
Cheng Chen7d089ae2018-03-15 19:11:03 -0700187void av1_set_default_ref_deltas(int8_t *ref_deltas);
188void av1_set_default_mode_deltas(int8_t *mode_deltas);
Hui Su3694c832017-11-10 14:15:58 -0800189void av1_setup_frame_contexts(struct AV1Common *cm);
Yaowu Xuf883b422016-08-30 14:01:10 -0700190void av1_setup_past_independence(struct AV1Common *cm);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700191
Wan-Teh Changfdeefec2018-07-31 17:23:38 -0700192// Returns (int)ceil(log2(n)).
Yaowu Xuf883b422016-08-30 14:01:10 -0700193static INLINE int av1_ceil_log2(int n) {
Hui Suff3b2fb2018-03-16 13:00:30 -0700194 if (n < 2) return 0;
Harish Mahendrakar8a657a62023-10-07 03:18:46 +0000195 int i = 1;
196 unsigned int p = 2;
197 while (p < (unsigned int)n) {
Yaowu Xuc27fc142016-08-22 16:08:15 -0700198 i++;
199 p = p << 1;
200 }
201 return i;
202}
203
Urvang Joshi56ba91b2017-01-10 13:22:09 -0800204// Returns the context for palette color index at row 'r' and column 'c',
205// along with the 'color_order' of neighbors and the 'color_idx'.
Urvang Joshi199a2f42017-01-23 15:02:07 -0800206// The 'color_map' is a 2D array with the given 'stride'.
Urvang Joshi23a61112017-01-30 14:59:27 -0800207int av1_get_palette_color_index_context(const uint8_t *color_map, int stride,
208 int r, int c, int palette_size,
209 uint8_t *color_order, int *color_idx);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700210
Wan-Teh Change49f9832022-11-25 15:09:32 -0800211extern const int
212 av1_palette_color_index_context_lookup[MAX_COLOR_CONTEXT_HASH + 1];
chiyotsaib0d24082020-04-16 17:51:27 -0700213
Yaowu Xuc27fc142016-08-22 16:08:15 -0700214#ifdef __cplusplus
215} // extern "C"
216#endif
217
James Zerne1cbb132018-08-22 14:10:36 -0700218#endif // AOM_AV1_COMMON_ENTROPYMODE_H_