1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright 2021 Rockchip Electronics Co. LTD 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License"); 5*4882a593Smuzhiyun * you may not use this file except in compliance with the License. 6*4882a593Smuzhiyun * You may obtain a copy of the License at 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * http://www.apache.org/licenses/LICENSE-2.0 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Unless required by applicable law or agreed to in writing, software 11*4882a593Smuzhiyun * distributed under the License is distributed on an "AS IS" BASIS, 12*4882a593Smuzhiyun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4882a593Smuzhiyun * See the License for the specific language governing permissions and 14*4882a593Smuzhiyun * limitations under the License. 15*4882a593Smuzhiyun */ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #ifndef __AV1D_COMMON_H__ 18*4882a593Smuzhiyun #define __AV1D_COMMON_H__ 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #include "mpp_common.h" 21*4882a593Smuzhiyun // #include "hal_av1d_common.h" 22*4882a593Smuzhiyun #define AV1_REF_SCALE_SHIFT 14 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define NUM_REF_FRAMES 8 25*4882a593Smuzhiyun #define NUM_REF_FRAMES_LG2 3 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun // Max tiles for AV1 (custom size) for Level <= 6.x 28*4882a593Smuzhiyun #define AV1_MAX_TILES 128 29*4882a593Smuzhiyun #define AV1_MAX_TILE_COL 64 30*4882a593Smuzhiyun #define AV1_MAX_TILE_ROW 64 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define AV1_MIN_COMP_BASIS 8 33*4882a593Smuzhiyun #define AV1_MAX_CODED_FRAME_SIZE \ 34*4882a593Smuzhiyun (8192 * 4352 * 10 * 6 / 32 / AV1_MIN_COMP_BASIS) /* approx 8 MB */ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #define ALLOWED_REFS_PER_FRAME_EX 7 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #define NUM_FRAME_CONTEXTS_LG2_EX 3 39*4882a593Smuzhiyun #define NUM_FRAME_CONTEXTS_EX (1 << NUM_FRAME_CONTEXTS_LG2_EX) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #define MIN_TILE_WIDTH 256 42*4882a593Smuzhiyun #define MAX_TILE_WIDTH 4096 43*4882a593Smuzhiyun #define MIN_TILE_WIDTH_SBS (MIN_TILE_WIDTH >> 6) 44*4882a593Smuzhiyun #define MAX_TILE_WIDTH_SBS (MAX_TILE_WIDTH >> 6) 45*4882a593Smuzhiyun #define FRAME_OFFSET_BITS 5 46*4882a593Smuzhiyun #define MAX_TILE_AREA (4096 * 2304) 47*4882a593Smuzhiyun // #define AV1_MAX_TILE_COLS 64 48*4882a593Smuzhiyun // #define AV1_MAX_TILE_ROWS 64 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #define ALLOWED_REFS_PER_FRAME 3 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun #define NUM_FRAME_CONTEXTS_LG2 2 53*4882a593Smuzhiyun #define NUM_FRAME_CONTEXTS (1 << NUM_FRAME_CONTEXTS_LG2) 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define DCPREDSIMTHRESH 0 56*4882a593Smuzhiyun #define DCPREDCNTTHRESH 3 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define PREDICTION_PROBS 3 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define DEFAULT_PRED_PROB_0 120 61*4882a593Smuzhiyun #define DEFAULT_PRED_PROB_1 80 62*4882a593Smuzhiyun #define DEFAULT_PRED_PROB_2 40 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun #define AV1_DEF_UPDATE_PROB 252 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun #define MBSKIP_CONTEXTS 3 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define MAX_MB_SEGMENTS 8 69*4882a593Smuzhiyun #define MB_SEG_TREE_PROBS (MAX_MB_SEGMENTS - 1) 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun #define MAX_REF_LF_DELTAS_EX 8 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun #define MAX_REF_LF_DELTAS 4 74*4882a593Smuzhiyun #define MAX_MODE_LF_DELTAS 2 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* Segment Feature Masks */ 77*4882a593Smuzhiyun #define SEGMENT_DELTADATA 0 78*4882a593Smuzhiyun #define SEGMENT_ABSDATA 1 79*4882a593Smuzhiyun #define MAX_MV_REFS 9 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #define AV1_SWITCHABLE_FILTERS 3 /* number of switchable filters */ 82*4882a593Smuzhiyun #define SWITCHABLE_FILTER_CONTEXTS ((AV1_SWITCHABLE_FILTERS + 1) * 4) 83*4882a593Smuzhiyun #ifdef DUAL_FILTER 84*4882a593Smuzhiyun #define AV1_SWITCHABLE_EXT_FILTERS 4 /* number of switchable filters */ 85*4882a593Smuzhiyun #endif 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #define COMP_PRED_CONTEXTS 2 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun #define COEF_UPDATE_PROB 252 90*4882a593Smuzhiyun #define AV1_PROB_HALF 128 91*4882a593Smuzhiyun #define AV1_NMV_UPDATE_PROB 252 92*4882a593Smuzhiyun #define AV1_MV_UPDATE_PRECISION 7 93*4882a593Smuzhiyun #define MV_JOINTS 4 94*4882a593Smuzhiyun #define MV_FP_SIZE 4 95*4882a593Smuzhiyun #define MV_CLASSES 11 96*4882a593Smuzhiyun #define CLASS0_BITS 1 97*4882a593Smuzhiyun #define CLASS0_SIZE (1 << CLASS0_BITS) 98*4882a593Smuzhiyun #define MV_OFFSET_BITS (MV_CLASSES + CLASS0_BITS - 2) 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun #define MV_MAX_BITS (MV_CLASSES + CLASS0_BITS + 2) 101*4882a593Smuzhiyun #define MV_MAX ((1 << MV_MAX_BITS) - 1) 102*4882a593Smuzhiyun #define MV_VALS ((MV_MAX << 1) + 1) 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun #define MAX_ENTROPY_TOKENS 12 105*4882a593Smuzhiyun #define ENTROPY_NODES 11 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun /* The first nodes of the entropy probs are unconstrained, the rest are 108*4882a593Smuzhiyun * modeled with statistic distribution. */ 109*4882a593Smuzhiyun #define UNCONSTRAINED_NODES 3 110*4882a593Smuzhiyun #define MODEL_NODES (ENTROPY_NODES - UNCONSTRAINED_NODES) 111*4882a593Smuzhiyun #define PIVOT_NODE 2 // which node is pivot 112*4882a593Smuzhiyun #define COEFPROB_MODELS 128 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun /* Entropy nodes above is divided in two parts, first three probs in part1 115*4882a593Smuzhiyun * and the modeled probs in part2. Part1 is padded so that tables align with 116*4882a593Smuzhiyun * 32 byte addresses, so there is four bytes for each table. */ 117*4882a593Smuzhiyun #define ENTROPY_NODES_PART1 4 118*4882a593Smuzhiyun #define ENTROPY_NODES_PART2 8 119*4882a593Smuzhiyun #define INTER_MODE_CONTEXTS 7 120*4882a593Smuzhiyun #define AV1_INTER_MODE_CONTEXTS 15 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun #define CFL_JOINT_SIGNS 8 123*4882a593Smuzhiyun #define CFL_ALPHA_CONTEXTS 6 124*4882a593Smuzhiyun #define CFL_ALPHABET_SIZE 16 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun #define NEWMV_MODE_CONTEXTS 6 127*4882a593Smuzhiyun #define ZEROMV_MODE_CONTEXTS 2 128*4882a593Smuzhiyun #define GLOBALMV_MODE_CONTEXTS 2 129*4882a593Smuzhiyun #define REFMV_MODE_CONTEXTS 9 130*4882a593Smuzhiyun #define DRL_MODE_CONTEXTS 3 131*4882a593Smuzhiyun #define NMV_CONTEXTS 3 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun #define INTRA_INTER_CONTEXTS 4 134*4882a593Smuzhiyun #define COMP_INTER_CONTEXTS 5 135*4882a593Smuzhiyun #define REF_CONTEXTS 5 136*4882a593Smuzhiyun #define AV1_REF_CONTEXTS 3 137*4882a593Smuzhiyun #define FWD_REFS 4 138*4882a593Smuzhiyun #define BWD_REFS 3 139*4882a593Smuzhiyun #define SINGLE_REFS 7 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun #define BLOCK_TYPES 2 142*4882a593Smuzhiyun #define REF_TYPES 2 // intra=0, inter=1 143*4882a593Smuzhiyun #define COEF_BANDS 6 144*4882a593Smuzhiyun #define PREV_COEF_CONTEXTS 6 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun #define MODULUS_PARAM 13 /* Modulus parameter */ 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #define ACTIVE_HT 110 // quantization stepsize threshold 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #define MAX_MV_REF_CANDIDATES 2 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun /* Coefficient token alphabet */ 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun #define ZERO_TOKEN 0 /* 0 Extra Bits 0+0 */ 155*4882a593Smuzhiyun #define ONE_TOKEN 1 /* 1 Extra Bits 0+1 */ 156*4882a593Smuzhiyun #define TWO_TOKEN 2 /* 2 Extra Bits 0+1 */ 157*4882a593Smuzhiyun #define THREE_TOKEN 3 /* 3 Extra Bits 0+1 */ 158*4882a593Smuzhiyun #define FOUR_TOKEN 4 /* 4 Extra Bits 0+1 */ 159*4882a593Smuzhiyun #define DCT_VAL_CATEGORY1 5 /* 5-6 Extra Bits 1+1 */ 160*4882a593Smuzhiyun #define DCT_VAL_CATEGORY2 6 /* 7-10 Extra Bits 2+1 */ 161*4882a593Smuzhiyun #define DCT_VAL_CATEGORY3 7 /* 11-18 Extra Bits 3+1 */ 162*4882a593Smuzhiyun #define DCT_VAL_CATEGORY4 8 /* 19-34 Extra Bits 4+1 */ 163*4882a593Smuzhiyun #define DCT_VAL_CATEGORY5 9 /* 35-66 Extra Bits 5+1 */ 164*4882a593Smuzhiyun #define DCT_VAL_CATEGORY6 10 /* 67+ Extra Bits 13+1 */ 165*4882a593Smuzhiyun #define DCT_EOB_TOKEN 11 /* EOB Extra Bits 0+0 */ 166*4882a593Smuzhiyun #define MAX_ENTROPY_TOKENS 12 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun #define INTERINTRA_MODES 4 169*4882a593Smuzhiyun #define INTER_COMPOUND_MODES 8 170*4882a593Smuzhiyun #define COMPOUND_TYPES 3 171*4882a593Smuzhiyun #define HEAD_TOKENS 5 172*4882a593Smuzhiyun #define TAIL_TOKENS 9 173*4882a593Smuzhiyun #define ONE_TOKEN_EOB 1 174*4882a593Smuzhiyun #define ONE_TOKEN_NEOB 2 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun #define MULTICORE_LEFT_TILE 1 177*4882a593Smuzhiyun #define MULTICORE_INNER_TILE 2 178*4882a593Smuzhiyun #define MULTICORE_RIGHT_TILE 3 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun #define DCT_EOB_MODEL_TOKEN 3 /* EOB Extra Bits 0+0 */ 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun typedef RK_U32 av1_coeff_count[REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] 183*4882a593Smuzhiyun [UNCONSTRAINED_NODES + 1]; 184*4882a593Smuzhiyun typedef RK_U8 av1_coeff_probs[REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] 185*4882a593Smuzhiyun [UNCONSTRAINED_NODES]; 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun #define BLOCK_SIZE_GROUPS 4 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun // AV1 extended transforms (ext_tx) 190*4882a593Smuzhiyun #define EXT_TX_SETS_INTER 4 // Sets of transform selections for INTER 191*4882a593Smuzhiyun #define EXT_TX_SETS_INTRA 3 // Sets of transform selections for INTRA 192*4882a593Smuzhiyun #define EXTTX_SIZES 4 // ext_tx experiment tx sizes 193*4882a593Smuzhiyun #define EXT_TX_TYPES 16 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun #define EXT_TX_SIZES 3 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun #define TX_TYPES 4 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun #define ROUND_POWER_OF_TWO(value, n) (((value) + (1 << ((n)-1))) >> (n)) 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun /* Shift down with rounding for use when n >= 0, value >= 0 for (64 bit) */ 202*4882a593Smuzhiyun #define ROUND_POWER_OF_TWO_64(value, n) \ 203*4882a593Smuzhiyun (((value) + ((((int64)1 << (n)) >> 1))) >> (n)) 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun /* Shift down with rounding for signed integers, for use when n >= 0 (64 bit) */ 206*4882a593Smuzhiyun #define ROUND_POWER_OF_TWO_SIGNED_64(value, n) \ 207*4882a593Smuzhiyun (((value) < 0) ? -ROUND_POWER_OF_TWO_64(-(value), (n)) \ 208*4882a593Smuzhiyun : ROUND_POWER_OF_TWO_64((value), (n))) 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun /* Shift down with rounding for signed integers, for use when n >= 0 */ 211*4882a593Smuzhiyun #define ROUND_POWER_OF_TWO_SIGNED(value, n) \ 212*4882a593Smuzhiyun (((value) < 0) ? -ROUND_POWER_OF_TWO(-(value), (n)) \ 213*4882a593Smuzhiyun : ROUND_POWER_OF_TWO((value), (n))) 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun typedef RK_U16 av1_cdf; 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun #define MAX_MB_SEGMENTS 8 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun enum Av1SegLevelFeatures { 220*4882a593Smuzhiyun SEG_AV1_LVL_ALT_Q, // Use alternate Quantizer .... 221*4882a593Smuzhiyun SEG_AV1_LVL_ALT_LF_Y_V, // Use alternate loop filter value on y plane 222*4882a593Smuzhiyun // vertical 223*4882a593Smuzhiyun SEG_AV1_LVL_ALT_LF_Y_H, // Use alternate loop filter value on y plane 224*4882a593Smuzhiyun // horizontal 225*4882a593Smuzhiyun SEG_AV1_LVL_ALT_LF_U, // Use alternate loop filter value on u plane 226*4882a593Smuzhiyun SEG_AV1_LVL_ALT_LF_V, // Use alternate loop filter value on v plane 227*4882a593Smuzhiyun SEG_AV1_LVL_REF_FRAME, // Optional Segment reference frame 228*4882a593Smuzhiyun SEG_AV1_LVL_SKIP, // Optional Segment (0,0) + skip mode 229*4882a593Smuzhiyun SEG_AV1_LVL_GLOBALMV, 230*4882a593Smuzhiyun SEG_AV1_LVL_MAX 231*4882a593Smuzhiyun }; 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun #define AV1_ACTIVE_REFS 3 234*4882a593Smuzhiyun #define AV1_ACTIVE_REFS_EX 7 235*4882a593Smuzhiyun #define AV1_REF_LIST_SIZE 8 236*4882a593Smuzhiyun #define AV1_REF_SCALE_SHIFT 14 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun enum MvReferenceFrame { 239*4882a593Smuzhiyun NONE = -1, 240*4882a593Smuzhiyun INTRA_FRAME = 0, 241*4882a593Smuzhiyun LAST_FRAME = 1, 242*4882a593Smuzhiyun LAST2_FRAME_EX = 2, 243*4882a593Smuzhiyun LAST3_FRAME_EX = 3, 244*4882a593Smuzhiyun GOLDEN_FRAME_EX = 4, 245*4882a593Smuzhiyun BWDREF_FRAME_EX = 5, 246*4882a593Smuzhiyun ALTREF2_FRAME_EX = 6, 247*4882a593Smuzhiyun ALTREF_FRAME_EX = 7, 248*4882a593Smuzhiyun MAX_REF_FRAMES_EX = 8, 249*4882a593Smuzhiyun GOLDEN_FRAME = 2, 250*4882a593Smuzhiyun ALTREF_FRAME = 3, 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun MAX_REF_FRAMES = 4 253*4882a593Smuzhiyun }; 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun enum BlockSizeType { 256*4882a593Smuzhiyun BLOCK_SIZE_AB4X4, 257*4882a593Smuzhiyun BLOCK_SIZE_SB4X8, 258*4882a593Smuzhiyun BLOCK_SIZE_SB8X4, 259*4882a593Smuzhiyun BLOCK_SIZE_SB8X8, 260*4882a593Smuzhiyun BLOCK_SIZE_SB8X16, 261*4882a593Smuzhiyun BLOCK_SIZE_SB16X8, 262*4882a593Smuzhiyun BLOCK_SIZE_MB16X16, 263*4882a593Smuzhiyun BLOCK_SIZE_SB16X32, 264*4882a593Smuzhiyun BLOCK_SIZE_SB32X16, 265*4882a593Smuzhiyun BLOCK_SIZE_SB32X32, 266*4882a593Smuzhiyun BLOCK_SIZE_SB32X64, 267*4882a593Smuzhiyun BLOCK_SIZE_SB64X32, 268*4882a593Smuzhiyun BLOCK_SIZE_SB64X64, 269*4882a593Smuzhiyun BLOCK_SIZE_SB64X128, 270*4882a593Smuzhiyun BLOCK_SIZE_SB128X64, 271*4882a593Smuzhiyun BLOCK_SIZE_SB128X128, 272*4882a593Smuzhiyun BLOCK_SIZE_SB4X16, 273*4882a593Smuzhiyun BLOCK_SIZE_SB16X4, 274*4882a593Smuzhiyun BLOCK_SIZE_SB8X32, 275*4882a593Smuzhiyun BLOCK_SIZE_SB32X8, 276*4882a593Smuzhiyun BLOCK_SIZE_SB16X64, 277*4882a593Smuzhiyun BLOCK_SIZE_SB64X16, 278*4882a593Smuzhiyun BLOCK_SIZE_TYPES, 279*4882a593Smuzhiyun BLOCK_SIZES_ALL = BLOCK_SIZE_TYPES 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun }; 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun enum PartitionType { 284*4882a593Smuzhiyun PARTITION_NONE, 285*4882a593Smuzhiyun PARTITION_HORZ, 286*4882a593Smuzhiyun PARTITION_VERT, 287*4882a593Smuzhiyun PARTITION_SPLIT, 288*4882a593Smuzhiyun /* 289*4882a593Smuzhiyun PARTITION_HORZ_A, 290*4882a593Smuzhiyun PARTITION_HORZ_B, 291*4882a593Smuzhiyun PARTITION_VERT_A, 292*4882a593Smuzhiyun PARTITION_VERT_B, 293*4882a593Smuzhiyun PARTITION_HORZ_4, 294*4882a593Smuzhiyun PARTITION_VERT_4, 295*4882a593Smuzhiyun */ 296*4882a593Smuzhiyun PARTITION_TYPES 297*4882a593Smuzhiyun }; 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun #define PARTITION_PLOFFSET 4 // number of probability models per block size 300*4882a593Smuzhiyun #define NUM_PARTITION_CONTEXTS (4 * PARTITION_PLOFFSET) 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun enum FrameType { 303*4882a593Smuzhiyun KEY_FRAME = 0, 304*4882a593Smuzhiyun INTER_FRAME = 1, 305*4882a593Smuzhiyun NUM_FRAME_TYPES, 306*4882a593Smuzhiyun }; 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun enum MbPredictionMode { 309*4882a593Smuzhiyun DC_PRED, /* average of above and left pixels */ 310*4882a593Smuzhiyun V_PRED, /* vertical prediction */ 311*4882a593Smuzhiyun H_PRED, /* horizontal prediction */ 312*4882a593Smuzhiyun D45_PRED, /* Directional 45 deg prediction [anti-clockwise from 0 deg hor] */ 313*4882a593Smuzhiyun D135_PRED, /* Directional 135 deg prediction [anti-clockwise from 0 deg hor] 314*4882a593Smuzhiyun */ 315*4882a593Smuzhiyun D117_PRED, /* Directional 112 deg prediction [anti-clockwise from 0 deg hor] 316*4882a593Smuzhiyun */ 317*4882a593Smuzhiyun D153_PRED, /* Directional 157 deg prediction [anti-clockwise from 0 deg hor] 318*4882a593Smuzhiyun */ 319*4882a593Smuzhiyun D27_PRED, /* Directional 22 deg prediction [anti-clockwise from 0 deg hor] */ 320*4882a593Smuzhiyun D63_PRED, /* Directional 67 deg prediction [anti-clockwise from 0 deg hor] */ 321*4882a593Smuzhiyun SMOOTH_PRED, 322*4882a593Smuzhiyun TM_PRED_AV1 = SMOOTH_PRED, 323*4882a593Smuzhiyun SMOOTH_V_PRED, // Vertical interpolation 324*4882a593Smuzhiyun SMOOTH_H_PRED, // Horizontal interpolation 325*4882a593Smuzhiyun TM_PRED, /* Truemotion prediction */ 326*4882a593Smuzhiyun PAETH_PRED = TM_PRED, 327*4882a593Smuzhiyun NEARESTMV, 328*4882a593Smuzhiyun NEARMV, 329*4882a593Smuzhiyun ZEROMV, 330*4882a593Smuzhiyun NEWMV, 331*4882a593Smuzhiyun NEAREST_NEARESTMV, 332*4882a593Smuzhiyun NEAR_NEARMV, 333*4882a593Smuzhiyun NEAREST_NEWMV, 334*4882a593Smuzhiyun NEW_NEARESTMV, 335*4882a593Smuzhiyun NEAR_NEWMV, 336*4882a593Smuzhiyun NEW_NEARMV, 337*4882a593Smuzhiyun ZERO_ZEROMV, 338*4882a593Smuzhiyun NEW_NEWMV, 339*4882a593Smuzhiyun SPLITMV, 340*4882a593Smuzhiyun MB_MODE_COUNT 341*4882a593Smuzhiyun }; 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun // Must match hardware/src/include/common_defs.h 344*4882a593Smuzhiyun #define AV1_INTRA_MODES 13 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun #define MAX_INTRA_MODES AV1_INTRA_MODES 347*4882a593Smuzhiyun 348*4882a593Smuzhiyun #define MAX_INTRA_MODES_DRAM_ALIGNED ((MAX_INTRA_MODES + 15) & (~15)) 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun #define AV1_INTER_MODES (1 + NEWMV - NEARESTMV) 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun #define MOTION_MODE_CONTEXTS 10 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun #define DIRECTIONAL_MODES 8 355*4882a593Smuzhiyun #define MAX_ANGLE_DELTA 3 356*4882a593Smuzhiyun 357*4882a593Smuzhiyun enum FilterIntraModeType { 358*4882a593Smuzhiyun FILTER_DC_PRED, 359*4882a593Smuzhiyun FILTER_V_PRED, 360*4882a593Smuzhiyun FILTER_H_PRED, 361*4882a593Smuzhiyun FILTER_D153_PRED, 362*4882a593Smuzhiyun FILTER_PAETH_PRED, 363*4882a593Smuzhiyun FILTER_INTRA_MODES, 364*4882a593Smuzhiyun FILTER_INTRA_UNUSED = 7 365*4882a593Smuzhiyun }; 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun #define FILTER_INTRA_SIZES 19 368*4882a593Smuzhiyun 369*4882a593Smuzhiyun enum { SIMPLE_TRANSLATION, OBMC_CAUSAL, MOTION_MODE_COUNT }; 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun #define SUBMVREF_COUNT 5 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun /* Integer pel reference mv threshold for use of high-precision 1/8 mv */ 374*4882a593Smuzhiyun #define COMPANDED_MVREF_THRESH 8 375*4882a593Smuzhiyun 376*4882a593Smuzhiyun #define TX_SIZE_CONTEXTS 2 377*4882a593Smuzhiyun #define AV1_TX_SIZE_CONTEXTS 3 378*4882a593Smuzhiyun #define VARTX_PART_CONTEXTS 22 379*4882a593Smuzhiyun #define TXFM_PARTITION_CONTEXTS 22 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun enum InterpolationFilterType { 382*4882a593Smuzhiyun EIGHTTAP_SMOOTH, 383*4882a593Smuzhiyun EIGHTTAP, 384*4882a593Smuzhiyun EIGHTTAP_SHARP, 385*4882a593Smuzhiyun #ifdef DUAL_FILTER 386*4882a593Smuzhiyun EIGHTTAP_SMOOTH2, 387*4882a593Smuzhiyun BILINEAR, 388*4882a593Smuzhiyun SWITCHABLE, /* should be the last one */ 389*4882a593Smuzhiyun #else 390*4882a593Smuzhiyun BILINEAR, 391*4882a593Smuzhiyun SWITCHABLE, /* should be the last one */ 392*4882a593Smuzhiyun #endif 393*4882a593Smuzhiyun MULTITAP_SHARP = EIGHTTAP_SHARP 394*4882a593Smuzhiyun }; 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun static const int av1_literal_to_filter[4] = {EIGHTTAP_SMOOTH, EIGHTTAP, 397*4882a593Smuzhiyun EIGHTTAP_SHARP, BILINEAR 398*4882a593Smuzhiyun }; 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun extern const enum InterpolationFilterType 401*4882a593Smuzhiyun av1hwd_switchable_interp[AV1_SWITCHABLE_FILTERS]; 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun enum CompPredModeType { 404*4882a593Smuzhiyun SINGLE_PREDICTION_ONLY = 0, 405*4882a593Smuzhiyun COMP_PREDICTION_ONLY = 1, 406*4882a593Smuzhiyun HYBRID_PREDICTION = 2, 407*4882a593Smuzhiyun NB_PREDICTION_TYPES = 3, 408*4882a593Smuzhiyun }; 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun enum TxfmMode { 411*4882a593Smuzhiyun ONLY_4X4 = 0, 412*4882a593Smuzhiyun ALLOW_8X8 = 1, 413*4882a593Smuzhiyun ALLOW_16X16 = 2, 414*4882a593Smuzhiyun ALLOW_32X32 = 3, 415*4882a593Smuzhiyun TX_MODE_LARGEST = ALLOW_32X32, // AV1 416*4882a593Smuzhiyun TX_MODE_SELECT = 4, 417*4882a593Smuzhiyun NB_TXFM_MODES = 5, 418*4882a593Smuzhiyun }; 419*4882a593Smuzhiyun 420*4882a593Smuzhiyun enum SegLevelFeatures { 421*4882a593Smuzhiyun SEG_LVL_ALT_Q = 0, 422*4882a593Smuzhiyun SEG_LVL_ALT_LF = 1, 423*4882a593Smuzhiyun SEG_LVL_REF_FRAME = 2, 424*4882a593Smuzhiyun SEG_LVL_SKIP = 3, 425*4882a593Smuzhiyun SEG_LVL_MAX = 4 426*4882a593Smuzhiyun }; 427*4882a593Smuzhiyun 428*4882a593Smuzhiyun enum { AV1_SEG_FEATURE_DELTA, AV1_SEG_FEATURE_ABS }; 429*4882a593Smuzhiyun 430*4882a593Smuzhiyun static const int av1_seg_feature_data_signed[SEG_AV1_LVL_MAX] = {1, 1, 1, 1, 431*4882a593Smuzhiyun 1, 0, 0 432*4882a593Smuzhiyun }; 433*4882a593Smuzhiyun static const int av1_seg_feature_data_max[SEG_AV1_LVL_MAX] = {255, 63, 63, 63, 434*4882a593Smuzhiyun 63, 7, 0 435*4882a593Smuzhiyun }; 436*4882a593Smuzhiyun static const int av1_seg_feature_data_bits[SEG_AV1_LVL_MAX] = {8, 6, 6, 6, 437*4882a593Smuzhiyun 6, 3, 0 438*4882a593Smuzhiyun }; 439*4882a593Smuzhiyun 440*4882a593Smuzhiyun enum TxSize { 441*4882a593Smuzhiyun TX_4X4 = 0, 442*4882a593Smuzhiyun TX_8X8 = 1, 443*4882a593Smuzhiyun TX_16X16 = 2, 444*4882a593Smuzhiyun TX_32X32 = 3, 445*4882a593Smuzhiyun TX_SIZE_MAX_SB, 446*4882a593Smuzhiyun }; 447*4882a593Smuzhiyun #define MAX_TX_DEPTH 2 448*4882a593Smuzhiyun 449*4882a593Smuzhiyun enum TxType { DCT_DCT = 0, ADST_DCT = 1, DCT_ADST = 2, ADST_ADST = 3 }; 450*4882a593Smuzhiyun 451*4882a593Smuzhiyun enum SplitMvPartitioningType { 452*4882a593Smuzhiyun PARTITIONING_16X8 = 0, 453*4882a593Smuzhiyun PARTITIONING_8X16, 454*4882a593Smuzhiyun PARTITIONING_8X8, 455*4882a593Smuzhiyun PARTITIONING_4X4, 456*4882a593Smuzhiyun NB_PARTITIONINGS, 457*4882a593Smuzhiyun }; 458*4882a593Smuzhiyun 459*4882a593Smuzhiyun enum PredId { 460*4882a593Smuzhiyun PRED_SEG_ID = 0, 461*4882a593Smuzhiyun PRED_MBSKIP = 1, 462*4882a593Smuzhiyun PRED_SWITCHABLE_INTERP = 2, 463*4882a593Smuzhiyun PRED_INTRA_INTER = 3, 464*4882a593Smuzhiyun PRED_COMP_INTER_INTER = 4, 465*4882a593Smuzhiyun PRED_SINGLE_REF_P1 = 5, 466*4882a593Smuzhiyun PRED_SINGLE_REF_P2 = 6, 467*4882a593Smuzhiyun PRED_COMP_REF_P = 7, 468*4882a593Smuzhiyun PRED_TX_SIZE = 8 469*4882a593Smuzhiyun }; 470*4882a593Smuzhiyun 471*4882a593Smuzhiyun /* Symbols for coding which components are zero jointly */ 472*4882a593Smuzhiyun enum MvJointType { 473*4882a593Smuzhiyun MV_JOINT_ZERO = 0, /* Zero vector */ 474*4882a593Smuzhiyun MV_JOINT_HNZVZ = 1, /* Vert zero, hor nonzero */ 475*4882a593Smuzhiyun MV_JOINT_HZVNZ = 2, /* Hor zero, vert nonzero */ 476*4882a593Smuzhiyun MV_JOINT_HNZVNZ = 3, /* Both components nonzero */ 477*4882a593Smuzhiyun }; 478*4882a593Smuzhiyun 479*4882a593Smuzhiyun /* Symbols for coding magnitude class of nonzero components */ 480*4882a593Smuzhiyun enum MvClassType { 481*4882a593Smuzhiyun MV_CLASS_0 = 0, /* (0, 2] integer pel */ 482*4882a593Smuzhiyun MV_CLASS_1 = 1, /* (2, 4] integer pel */ 483*4882a593Smuzhiyun MV_CLASS_2 = 2, /* (4, 8] integer pel */ 484*4882a593Smuzhiyun MV_CLASS_3 = 3, /* (8, 16] integer pel */ 485*4882a593Smuzhiyun MV_CLASS_4 = 4, /* (16, 32] integer pel */ 486*4882a593Smuzhiyun MV_CLASS_5 = 5, /* (32, 64] integer pel */ 487*4882a593Smuzhiyun MV_CLASS_6 = 6, /* (64, 128] integer pel */ 488*4882a593Smuzhiyun MV_CLASS_7 = 7, /* (128, 256] integer pel */ 489*4882a593Smuzhiyun MV_CLASS_8 = 8, /* (256, 512] integer pel */ 490*4882a593Smuzhiyun MV_CLASS_9 = 9, /* (512, 1024] integer pel */ 491*4882a593Smuzhiyun MV_CLASS_10 = 10, /* (1024,2048] integer pel */ 492*4882a593Smuzhiyun }; 493*4882a593Smuzhiyun 494*4882a593Smuzhiyun enum RefreshFrameContextModeAv1 { 495*4882a593Smuzhiyun /** 496*4882a593Smuzhiyun * AV1 Only, no refresh 497*4882a593Smuzhiyun */ 498*4882a593Smuzhiyun AV1_REFRESH_FRAME_CONTEXT_NONE, 499*4882a593Smuzhiyun /** 500*4882a593Smuzhiyun * Update frame context to values resulting from backward probability 501*4882a593Smuzhiyun * updates based on entropy/counts in the decoded frame 502*4882a593Smuzhiyun */ 503*4882a593Smuzhiyun AV1_REFRESH_FRAME_CONTEXT_BACKWARD 504*4882a593Smuzhiyun }; 505*4882a593Smuzhiyun 506*4882a593Smuzhiyun // 75B 507*4882a593Smuzhiyun struct NmvContext { 508*4882a593Smuzhiyun // Start at +27B offset 509*4882a593Smuzhiyun RK_U8 joints[MV_JOINTS - 1]; // 3B 510*4882a593Smuzhiyun RK_U8 sign[2]; // 2B 511*4882a593Smuzhiyun 512*4882a593Smuzhiyun // A+1 513*4882a593Smuzhiyun RK_U8 class0[2][CLASS0_SIZE - 1]; // 2B 514*4882a593Smuzhiyun RK_U8 fp[2][MV_FP_SIZE - 1]; // 6B 515*4882a593Smuzhiyun RK_U8 class0_hp[2]; // 2B 516*4882a593Smuzhiyun RK_U8 hp[2]; // 2B 517*4882a593Smuzhiyun RK_U8 classes[2][MV_CLASSES - 1]; // 20B 518*4882a593Smuzhiyun 519*4882a593Smuzhiyun // A+2 520*4882a593Smuzhiyun RK_U8 class0_fp[2][CLASS0_SIZE][MV_FP_SIZE - 1]; // 12B 521*4882a593Smuzhiyun RK_U8 bits[2][MV_OFFSET_BITS]; // 20B 522*4882a593Smuzhiyun }; 523*4882a593Smuzhiyun 524*4882a593Smuzhiyun struct NmvContextCounts { 525*4882a593Smuzhiyun // 8dw (u32) / DRAM word (u256) 526*4882a593Smuzhiyun RK_U32 joints[MV_JOINTS]; 527*4882a593Smuzhiyun RK_U32 sign[2][2]; 528*4882a593Smuzhiyun RK_U32 classes[2][MV_CLASSES]; 529*4882a593Smuzhiyun RK_U32 class0[2][CLASS0_SIZE]; 530*4882a593Smuzhiyun RK_U32 bits[2][MV_OFFSET_BITS][2]; 531*4882a593Smuzhiyun RK_U32 class0_fp[2][CLASS0_SIZE][4]; 532*4882a593Smuzhiyun RK_U32 fp[2][4]; 533*4882a593Smuzhiyun RK_U32 class0_hp[2][2]; 534*4882a593Smuzhiyun RK_U32 hp[2][2]; 535*4882a593Smuzhiyun }; 536*4882a593Smuzhiyun 537*4882a593Smuzhiyun typedef RK_U8 av1_prob; 538*4882a593Smuzhiyun 539*4882a593Smuzhiyun #define ICDF(x) (32768U - (x)) 540*4882a593Smuzhiyun #define CDF_SIZE(x) ((x)-1) 541*4882a593Smuzhiyun 542*4882a593Smuzhiyun #define AV1HWPAD(x, y) RK_U8 x[y] 543*4882a593Smuzhiyun 544*4882a593Smuzhiyun struct NmvJointSign { 545*4882a593Smuzhiyun RK_U8 joints[MV_JOINTS - 1]; // 3B 546*4882a593Smuzhiyun RK_U8 sign[2]; // 2B 547*4882a593Smuzhiyun }; 548*4882a593Smuzhiyun struct NmvMagnitude { 549*4882a593Smuzhiyun RK_U8 class0[2][CLASS0_SIZE - 1]; 550*4882a593Smuzhiyun RK_U8 fp[2][MV_FP_SIZE - 1]; 551*4882a593Smuzhiyun RK_U8 class0_hp[2]; 552*4882a593Smuzhiyun RK_U8 hp[2]; 553*4882a593Smuzhiyun RK_U8 classes[2][MV_CLASSES - 1]; 554*4882a593Smuzhiyun RK_U8 class0_fp[2][CLASS0_SIZE][MV_FP_SIZE - 1]; 555*4882a593Smuzhiyun RK_U8 bits[2][MV_OFFSET_BITS]; 556*4882a593Smuzhiyun }; 557*4882a593Smuzhiyun 558*4882a593Smuzhiyun struct RefMvNmvContext { 559*4882a593Smuzhiyun // Starts at +4B offset (for mbskip) 560*4882a593Smuzhiyun struct NmvJointSign joints_sign[NMV_CONTEXTS]; // 15B 561*4882a593Smuzhiyun AV1HWPAD(pad1, 13); 562*4882a593Smuzhiyun 563*4882a593Smuzhiyun // A+1 564*4882a593Smuzhiyun struct NmvMagnitude magnitude[NMV_CONTEXTS]; 565*4882a593Smuzhiyun }; 566*4882a593Smuzhiyun 567*4882a593Smuzhiyun /* Adaptive entropy contexts, padding elements are added to have 568*4882a593Smuzhiyun * 256 bit aligned tables for HW access. 569*4882a593Smuzhiyun * Compile with TRACE_PROB_TABLES to print bases for each table. */ 570*4882a593Smuzhiyun struct Av1AdaptiveEntropyProbs { 571*4882a593Smuzhiyun // address A (56) 572*4882a593Smuzhiyun 573*4882a593Smuzhiyun // Address A+0 574*4882a593Smuzhiyun RK_U8 inter_mode_prob[INTER_MODE_CONTEXTS][4]; // 7*4 = 28B 575*4882a593Smuzhiyun RK_U8 intra_inter_prob[INTRA_INTER_CONTEXTS]; // 4B 576*4882a593Smuzhiyun 577*4882a593Smuzhiyun // Address A+1 578*4882a593Smuzhiyun RK_U8 uv_mode_prob[MAX_INTRA_MODES] 579*4882a593Smuzhiyun [MAX_INTRA_MODES_DRAM_ALIGNED]; // 10*16/32 = 5 addrs 580*4882a593Smuzhiyun 581*4882a593Smuzhiyun #if ((MAX_INTRA_MODES * MAX_INTRA_MODES_DRAM_ALIGNED) % 32) 582*4882a593Smuzhiyun AV1HWPAD(pad1, 583*4882a593Smuzhiyun ((MAX_INTRA_MODES * MAX_INTRA_MODES_DRAM_ALIGNED) % 32 == 0) 584*4882a593Smuzhiyun ? 0 585*4882a593Smuzhiyun : 32 - (MAX_INTRA_MODES * MAX_INTRA_MODES_DRAM_ALIGNED) % 32); 586*4882a593Smuzhiyun #endif 587*4882a593Smuzhiyun 588*4882a593Smuzhiyun // Address A+6 589*4882a593Smuzhiyun RK_U8 tx8x8_prob[TX_SIZE_CONTEXTS][TX_SIZE_MAX_SB - 3]; // 2*(4-3) = 2B 590*4882a593Smuzhiyun RK_U8 tx16x16_prob[TX_SIZE_CONTEXTS][TX_SIZE_MAX_SB - 2]; // 2*(4-2) = 4B 591*4882a593Smuzhiyun RK_U8 tx32x32_prob[TX_SIZE_CONTEXTS][TX_SIZE_MAX_SB - 1]; // 2*(4-1) = 6B 592*4882a593Smuzhiyun 593*4882a593Smuzhiyun RK_U8 switchable_interp_prob[AV1_SWITCHABLE_FILTERS + 1] 594*4882a593Smuzhiyun [AV1_SWITCHABLE_FILTERS - 1]; // 8B 595*4882a593Smuzhiyun RK_U8 comp_inter_prob[COMP_INTER_CONTEXTS]; // 5B 596*4882a593Smuzhiyun 597*4882a593Smuzhiyun AV1HWPAD(pad6, 7); 598*4882a593Smuzhiyun 599*4882a593Smuzhiyun // Address A+7 600*4882a593Smuzhiyun RK_U8 sb_ymode_prob[BLOCK_SIZE_GROUPS] 601*4882a593Smuzhiyun [MAX_INTRA_MODES_DRAM_ALIGNED]; // 4*16/32 = 2 addrs 602*4882a593Smuzhiyun 603*4882a593Smuzhiyun // Address A+9 604*4882a593Smuzhiyun RK_U8 partition_prob[NUM_FRAME_TYPES][NUM_PARTITION_CONTEXTS] 605*4882a593Smuzhiyun [PARTITION_TYPES]; // 2*16*4 = 4 addrs 606*4882a593Smuzhiyun 607*4882a593Smuzhiyun // Address A+13 608*4882a593Smuzhiyun AV1HWPAD(pad13, 24); 609*4882a593Smuzhiyun RK_U8 mbskip_probs[MBSKIP_CONTEXTS]; // 3B 610*4882a593Smuzhiyun struct NmvContext nmvc; 611*4882a593Smuzhiyun 612*4882a593Smuzhiyun // Address A+16 613*4882a593Smuzhiyun RK_U8 single_ref_prob[REF_CONTEXTS][2]; // 10B 614*4882a593Smuzhiyun RK_U8 comp_ref_prob[REF_CONTEXTS]; // 5B 615*4882a593Smuzhiyun RK_U8 mb_segment_tree_probs[MB_SEG_TREE_PROBS]; // 7B 616*4882a593Smuzhiyun RK_U8 segment_pred_probs[PREDICTION_PROBS]; // 3B 617*4882a593Smuzhiyun AV1HWPAD(pad16, 7); 618*4882a593Smuzhiyun 619*4882a593Smuzhiyun // Address A+17 620*4882a593Smuzhiyun RK_U8 prob_coeffs[BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] 621*4882a593Smuzhiyun [ENTROPY_NODES_PART1]; // 18 addrs 622*4882a593Smuzhiyun RK_U8 prob_coeffs8x8[BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] 623*4882a593Smuzhiyun [ENTROPY_NODES_PART1]; 624*4882a593Smuzhiyun RK_U8 prob_coeffs16x16[BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] 625*4882a593Smuzhiyun [ENTROPY_NODES_PART1]; 626*4882a593Smuzhiyun RK_U8 prob_coeffs32x32[BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] 627*4882a593Smuzhiyun [ENTROPY_NODES_PART1]; 628*4882a593Smuzhiyun }; 629*4882a593Smuzhiyun 630*4882a593Smuzhiyun /* Entropy contexts */ 631*4882a593Smuzhiyun struct Av1EntropyProbs { 632*4882a593Smuzhiyun /* Default keyframe probs */ 633*4882a593Smuzhiyun /* Table formatted for 256b memory, probs 0to7 for all tables followed by 634*4882a593Smuzhiyun * probs 8toN for all tables. 635*4882a593Smuzhiyun * Compile with TRACE_PROB_TABLES to print bases for each table. */ 636*4882a593Smuzhiyun 637*4882a593Smuzhiyun // In AOM code, this table is [M][M][M-1]; we pad to 16B so each entry is 1/2 638*4882a593Smuzhiyun // DRAM word. 639*4882a593Smuzhiyun RK_U8 kf_bmode_prob[MAX_INTRA_MODES][MAX_INTRA_MODES] 640*4882a593Smuzhiyun [MAX_INTRA_MODES_DRAM_ALIGNED]; 641*4882a593Smuzhiyun 642*4882a593Smuzhiyun #if ((MAX_INTRA_MODES * MAX_INTRA_MODES * MAX_INTRA_MODES_DRAM_ALIGNED) % 32) 643*4882a593Smuzhiyun AV1HWPAD(pad0, (((MAX_INTRA_MODES * MAX_INTRA_MODES * 644*4882a593Smuzhiyun MAX_INTRA_MODES_DRAM_ALIGNED) % 645*4882a593Smuzhiyun 32) == 0) 646*4882a593Smuzhiyun ? 0 647*4882a593Smuzhiyun : 32 - ((MAX_INTRA_MODES * MAX_INTRA_MODES * 648*4882a593Smuzhiyun MAX_INTRA_MODES_DRAM_ALIGNED) % 649*4882a593Smuzhiyun 32)); 650*4882a593Smuzhiyun #endif 651*4882a593Smuzhiyun 652*4882a593Smuzhiyun // Address 50 653*4882a593Smuzhiyun AV1HWPAD(unused_bytes, 4); // 4B of padding to maintain the old alignments. 654*4882a593Smuzhiyun RK_U8 ref_pred_probs[PREDICTION_PROBS]; // 3B 655*4882a593Smuzhiyun RK_U8 ref_scores[MAX_REF_FRAMES]; // 4B 656*4882a593Smuzhiyun RK_U8 prob_comppred[COMP_PRED_CONTEXTS]; // 2B 657*4882a593Smuzhiyun 658*4882a593Smuzhiyun AV1HWPAD(pad1, 19); 659*4882a593Smuzhiyun 660*4882a593Smuzhiyun // Address 51 661*4882a593Smuzhiyun RK_U8 kf_uv_mode_prob[MAX_INTRA_MODES][MAX_INTRA_MODES_DRAM_ALIGNED]; 662*4882a593Smuzhiyun 663*4882a593Smuzhiyun #if ((MAX_INTRA_MODES * MAX_INTRA_MODES_DRAM_ALIGNED) % 32) 664*4882a593Smuzhiyun AV1HWPAD(pad51, 665*4882a593Smuzhiyun ((MAX_INTRA_MODES * MAX_INTRA_MODES_DRAM_ALIGNED) % 32 == 0) 666*4882a593Smuzhiyun ? 0 667*4882a593Smuzhiyun : 32 - (MAX_INTRA_MODES * MAX_INTRA_MODES_DRAM_ALIGNED) % 32); 668*4882a593Smuzhiyun #endif 669*4882a593Smuzhiyun 670*4882a593Smuzhiyun // Address 56 671*4882a593Smuzhiyun struct Av1AdaptiveEntropyProbs a; // Probs with backward adaptation 672*4882a593Smuzhiyun }; 673*4882a593Smuzhiyun 674*4882a593Smuzhiyun /* Counters for adaptive entropy contexts */ 675*4882a593Smuzhiyun struct Av1EntropyCounts { 676*4882a593Smuzhiyun RK_U32 inter_mode_counts[INTER_MODE_CONTEXTS][AV1_INTER_MODES - 1][2]; 677*4882a593Smuzhiyun RK_U32 sb_ymode_counts[BLOCK_SIZE_GROUPS][MAX_INTRA_MODES]; 678*4882a593Smuzhiyun RK_U32 uv_mode_counts[MAX_INTRA_MODES][MAX_INTRA_MODES]; 679*4882a593Smuzhiyun RK_U32 partition_counts[NUM_PARTITION_CONTEXTS][PARTITION_TYPES]; 680*4882a593Smuzhiyun RK_U32 switchable_interp_counts[AV1_SWITCHABLE_FILTERS + 1] 681*4882a593Smuzhiyun [AV1_SWITCHABLE_FILTERS]; 682*4882a593Smuzhiyun RK_U32 intra_inter_count[INTRA_INTER_CONTEXTS][2]; 683*4882a593Smuzhiyun RK_U32 comp_inter_count[COMP_INTER_CONTEXTS][2]; 684*4882a593Smuzhiyun RK_U32 single_ref_count[REF_CONTEXTS][2][2]; 685*4882a593Smuzhiyun RK_U32 comp_ref_count[REF_CONTEXTS][2]; 686*4882a593Smuzhiyun RK_U32 tx32x32_count[TX_SIZE_CONTEXTS][TX_SIZE_MAX_SB]; 687*4882a593Smuzhiyun RK_U32 tx16x16_count[TX_SIZE_CONTEXTS][TX_SIZE_MAX_SB - 1]; 688*4882a593Smuzhiyun RK_U32 tx8x8_count[TX_SIZE_CONTEXTS][TX_SIZE_MAX_SB - 2]; 689*4882a593Smuzhiyun RK_U32 mbskip_count[MBSKIP_CONTEXTS][2]; 690*4882a593Smuzhiyun 691*4882a593Smuzhiyun struct NmvContextCounts nmvcount; 692*4882a593Smuzhiyun 693*4882a593Smuzhiyun RK_U32 count_coeffs[BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] 694*4882a593Smuzhiyun [UNCONSTRAINED_NODES + 1]; 695*4882a593Smuzhiyun RK_U32 count_coeffs8x8[BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] 696*4882a593Smuzhiyun [UNCONSTRAINED_NODES + 1]; 697*4882a593Smuzhiyun RK_U32 count_coeffs16x16[BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] 698*4882a593Smuzhiyun [UNCONSTRAINED_NODES + 1]; 699*4882a593Smuzhiyun RK_U32 count_coeffs32x32[BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] 700*4882a593Smuzhiyun [UNCONSTRAINED_NODES + 1]; 701*4882a593Smuzhiyun 702*4882a593Smuzhiyun RK_U32 count_eobs[TX_SIZE_MAX_SB][BLOCK_TYPES][REF_TYPES][COEF_BANDS] 703*4882a593Smuzhiyun [PREV_COEF_CONTEXTS]; 704*4882a593Smuzhiyun }; 705*4882a593Smuzhiyun 706*4882a593Smuzhiyun struct CoeffHeadCDFModel { 707*4882a593Smuzhiyun RK_U16 band0[3][5]; 708*4882a593Smuzhiyun RK_U16 bands[5][6][4]; 709*4882a593Smuzhiyun }; 710*4882a593Smuzhiyun 711*4882a593Smuzhiyun struct CoeffTailCDFModel { 712*4882a593Smuzhiyun RK_U16 band0[3][9]; 713*4882a593Smuzhiyun RK_U16 bands[5][6][9]; 714*4882a593Smuzhiyun }; 715*4882a593Smuzhiyun 716*4882a593Smuzhiyun // 135 717*4882a593Smuzhiyun typedef struct CoeffHeadCDFModel coeff_head_cdf_model[BLOCK_TYPES][REF_TYPES]; 718*4882a593Smuzhiyun // 297 719*4882a593Smuzhiyun typedef struct CoeffTailCDFModel coeff_tail_cdf_model[BLOCK_TYPES][REF_TYPES]; 720*4882a593Smuzhiyun 721*4882a593Smuzhiyun //#define PALETTE_BLOCK_SIZES (BLOCK_SIZE_SB64X64 - BLOCK_SIZE_SB8X8 + 1) 722*4882a593Smuzhiyun #define PALETTE_BLOCK_SIZES 7 723*4882a593Smuzhiyun #define PALETTE_SIZES 7 724*4882a593Smuzhiyun #define PALETTE_Y_MODE_CONTEXTS 3 725*4882a593Smuzhiyun #define PALETTE_UV_MODE_CONTEXTS 2 726*4882a593Smuzhiyun #define PALETTE_COLOR_INDEX_CONTEXTS 5 727*4882a593Smuzhiyun #define PALETTE_IDX_CONTEXTS 18 728*4882a593Smuzhiyun #define PALETTE_COLORS 8 729*4882a593Smuzhiyun #define KF_MODE_CONTEXTS 5 730*4882a593Smuzhiyun 731*4882a593Smuzhiyun #define PLANE_TYPES 2 732*4882a593Smuzhiyun #define TX_SIZES 5 733*4882a593Smuzhiyun #define TXB_SKIP_CONTEXTS 13 734*4882a593Smuzhiyun #define DC_SIGN_CONTEXTS 3 735*4882a593Smuzhiyun #define SIG_COEF_CONTEXTS_EOB 4 736*4882a593Smuzhiyun #define SIG_COEF_CONTEXTS 42 737*4882a593Smuzhiyun #define COEFF_BASE_CONTEXTS 42 738*4882a593Smuzhiyun #define EOB_COEF_CONTEXTS 9 739*4882a593Smuzhiyun #define LEVEL_CONTEXTS 21 740*4882a593Smuzhiyun #define NUM_BASE_LEVELS 2 741*4882a593Smuzhiyun #define BR_CDF_SIZE 4 742*4882a593Smuzhiyun #define MOTION_MODES 3 743*4882a593Smuzhiyun #define DELTA_Q_PROBS 3 744*4882a593Smuzhiyun #define COMP_REF_TYPE_CONTEXTS 5 745*4882a593Smuzhiyun #define UNI_COMP_REF_CONTEXTS 3 746*4882a593Smuzhiyun #define UNIDIR_COMP_REFS 4 747*4882a593Smuzhiyun //#define FILTER_INTRA_MODES 5 748*4882a593Smuzhiyun #define SKIP_MODE_CONTEXTS 3 749*4882a593Smuzhiyun #define SKIP_CONTEXTS 3 750*4882a593Smuzhiyun #define COMP_INDEX_CONTEXTS 6 751*4882a593Smuzhiyun #define COMP_GROUP_IDX_CONTEXTS 7 752*4882a593Smuzhiyun #define MAX_TX_CATS 4 753*4882a593Smuzhiyun #define CFL_ALLOWED_TYPES 2 754*4882a593Smuzhiyun #define UV_INTRA_MODES 14 755*4882a593Smuzhiyun #define EXT_PARTITION_TYPES 10 756*4882a593Smuzhiyun #define AV1_PARTITION_CONTEXTS (5 * PARTITION_PLOFFSET) 757*4882a593Smuzhiyun 758*4882a593Smuzhiyun #define RESTORE_SWITCHABLE_TYPES 3 759*4882a593Smuzhiyun #define DELTA_LF_PROBS 3 760*4882a593Smuzhiyun #define FRAME_LF_COUNT 4 761*4882a593Smuzhiyun #define MAX_SEGMENTS 8 762*4882a593Smuzhiyun #define TOKEN_CDF_Q_CTXS 4 763*4882a593Smuzhiyun #define SEG_TEMPORAL_PRED_CTXS 3 764*4882a593Smuzhiyun #define SPATIAL_PREDICTION_PROBS 3 765*4882a593Smuzhiyun 766*4882a593Smuzhiyun typedef RK_U16 aom_cdf_prob; 767*4882a593Smuzhiyun 768*4882a593Smuzhiyun typedef struct { 769*4882a593Smuzhiyun RK_U16 joint_cdf[3]; 770*4882a593Smuzhiyun RK_U16 sign_cdf[2]; 771*4882a593Smuzhiyun RK_U16 clsss_cdf[2][10]; 772*4882a593Smuzhiyun RK_U16 clsss0_fp_cdf[2][2][3]; 773*4882a593Smuzhiyun RK_U16 fp_cdf[2][3]; 774*4882a593Smuzhiyun RK_U16 class0_hp_cdf[2]; 775*4882a593Smuzhiyun RK_U16 hp_cdf[2]; 776*4882a593Smuzhiyun RK_U16 class0_cdf[2]; 777*4882a593Smuzhiyun RK_U16 bits_cdf[2][10]; 778*4882a593Smuzhiyun } MvCDFs; 779*4882a593Smuzhiyun 780*4882a593Smuzhiyun typedef struct { 781*4882a593Smuzhiyun RK_U16 partition_cdf[13][16]; 782*4882a593Smuzhiyun // 64 783*4882a593Smuzhiyun RK_U16 kf_ymode_cdf[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS][AV1_INTRA_MODES - 1]; 784*4882a593Smuzhiyun RK_U16 segment_pred_cdf[PREDICTION_PROBS]; 785*4882a593Smuzhiyun RK_U16 spatial_pred_seg_tree_cdf[SPATIAL_PREDICTION_PROBS][MAX_MB_SEGMENTS - 1]; 786*4882a593Smuzhiyun RK_U16 mbskip_cdf[MBSKIP_CONTEXTS]; 787*4882a593Smuzhiyun RK_U16 delta_q_cdf[DELTA_Q_PROBS]; 788*4882a593Smuzhiyun RK_U16 delta_lf_multi_cdf[FRAME_LF_COUNT][DELTA_LF_PROBS]; 789*4882a593Smuzhiyun RK_U16 delta_lf_cdf[DELTA_LF_PROBS]; 790*4882a593Smuzhiyun RK_U16 skip_mode_cdf[SKIP_MODE_CONTEXTS]; 791*4882a593Smuzhiyun RK_U16 vartx_part_cdf[VARTX_PART_CONTEXTS][1]; 792*4882a593Smuzhiyun RK_U16 tx_size_cdf[MAX_TX_CATS][AV1_TX_SIZE_CONTEXTS][MAX_TX_DEPTH]; 793*4882a593Smuzhiyun RK_U16 if_ymode_cdf[BLOCK_SIZE_GROUPS][AV1_INTRA_MODES - 1]; 794*4882a593Smuzhiyun RK_U16 uv_mode_cdf[2][AV1_INTRA_MODES][AV1_INTRA_MODES - 1 + 1]; 795*4882a593Smuzhiyun RK_U16 intra_inter_cdf[INTRA_INTER_CONTEXTS]; 796*4882a593Smuzhiyun RK_U16 comp_inter_cdf[COMP_INTER_CONTEXTS]; 797*4882a593Smuzhiyun RK_U16 single_ref_cdf[AV1_REF_CONTEXTS][SINGLE_REFS - 1]; 798*4882a593Smuzhiyun RK_U16 comp_ref_type_cdf[COMP_REF_TYPE_CONTEXTS][1]; 799*4882a593Smuzhiyun RK_U16 uni_comp_ref_cdf[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1][1]; 800*4882a593Smuzhiyun RK_U16 comp_ref_cdf[AV1_REF_CONTEXTS][FWD_REFS - 1]; 801*4882a593Smuzhiyun RK_U16 comp_bwdref_cdf[AV1_REF_CONTEXTS][BWD_REFS - 1]; 802*4882a593Smuzhiyun RK_U16 newmv_cdf[NEWMV_MODE_CONTEXTS]; 803*4882a593Smuzhiyun RK_U16 zeromv_cdf[ZEROMV_MODE_CONTEXTS]; 804*4882a593Smuzhiyun RK_U16 refmv_cdf[REFMV_MODE_CONTEXTS]; 805*4882a593Smuzhiyun RK_U16 drl_cdf[DRL_MODE_CONTEXTS]; 806*4882a593Smuzhiyun RK_U16 interp_filter_cdf[SWITCHABLE_FILTER_CONTEXTS][AV1_SWITCHABLE_FILTERS - 1]; 807*4882a593Smuzhiyun 808*4882a593Smuzhiyun MvCDFs mv_cdf; 809*4882a593Smuzhiyun 810*4882a593Smuzhiyun RK_U16 obmc_cdf[BLOCK_SIZE_TYPES]; 811*4882a593Smuzhiyun RK_U16 motion_mode_cdf[BLOCK_SIZE_TYPES][2]; 812*4882a593Smuzhiyun 813*4882a593Smuzhiyun RK_U16 inter_compound_mode_cdf[AV1_INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES - 1]; 814*4882a593Smuzhiyun RK_U16 compound_type_cdf[BLOCK_SIZE_TYPES][CDF_SIZE(COMPOUND_TYPES - 1)]; 815*4882a593Smuzhiyun RK_U16 interintra_cdf[BLOCK_SIZE_GROUPS]; 816*4882a593Smuzhiyun RK_U16 interintra_mode_cdf[BLOCK_SIZE_GROUPS][INTERINTRA_MODES - 1]; 817*4882a593Smuzhiyun RK_U16 wedge_interintra_cdf[BLOCK_SIZE_TYPES]; 818*4882a593Smuzhiyun RK_U16 wedge_idx_cdf[BLOCK_SIZE_TYPES][CDF_SIZE(16)]; 819*4882a593Smuzhiyun 820*4882a593Smuzhiyun RK_U16 palette_y_mode_cdf[PALETTE_BLOCK_SIZES][PALETTE_Y_MODE_CONTEXTS][1]; 821*4882a593Smuzhiyun RK_U16 palette_uv_mode_cdf[PALETTE_UV_MODE_CONTEXTS][1]; 822*4882a593Smuzhiyun RK_U16 palette_y_size_cdf[PALETTE_BLOCK_SIZES][PALETTE_SIZES - 1]; 823*4882a593Smuzhiyun RK_U16 palette_uv_size_cdf[PALETTE_BLOCK_SIZES][PALETTE_SIZES - 1]; 824*4882a593Smuzhiyun 825*4882a593Smuzhiyun RK_U16 cfl_sign_cdf[CFL_JOINT_SIGNS - 1]; 826*4882a593Smuzhiyun RK_U16 cfl_alpha_cdf[CFL_ALPHA_CONTEXTS][CFL_ALPHABET_SIZE - 1]; 827*4882a593Smuzhiyun 828*4882a593Smuzhiyun RK_U16 intrabc_cdf[1]; 829*4882a593Smuzhiyun RK_U16 angle_delta_cdf[DIRECTIONAL_MODES][6]; 830*4882a593Smuzhiyun 831*4882a593Smuzhiyun RK_U16 filter_intra_mode_cdf[FILTER_INTRA_MODES - 1]; 832*4882a593Smuzhiyun RK_U16 filter_intra_cdf[BLOCK_SIZES_ALL]; 833*4882a593Smuzhiyun RK_U16 comp_group_idx_cdf[COMP_GROUP_IDX_CONTEXTS][CDF_SIZE(2)]; 834*4882a593Smuzhiyun RK_U16 compound_idx_cdf[COMP_INDEX_CONTEXTS][CDF_SIZE(2)]; 835*4882a593Smuzhiyun 836*4882a593Smuzhiyun RK_U16 dummy0[14]; 837*4882a593Smuzhiyun 838*4882a593Smuzhiyun // Palette index contexts; sizes 1/7, 2/6, 3/5 packed together 839*4882a593Smuzhiyun RK_U16 palette_y_color_index_cdf[PALETTE_IDX_CONTEXTS][8]; 840*4882a593Smuzhiyun RK_U16 palette_uv_color_index_cdf[PALETTE_IDX_CONTEXTS][8]; 841*4882a593Smuzhiyun // RK_U16 dummy1[0]; 842*4882a593Smuzhiyun 843*4882a593Smuzhiyun // Note: cdf space can be optimized (most sets have fewer than EXT_TX_TYPES 844*4882a593Smuzhiyun // symbols) 845*4882a593Smuzhiyun RK_U16 tx_type_intra0_cdf[EXTTX_SIZES][AV1_INTRA_MODES][8]; 846*4882a593Smuzhiyun RK_U16 tx_type_intra1_cdf[EXTTX_SIZES][AV1_INTRA_MODES][4]; 847*4882a593Smuzhiyun RK_U16 tx_type_inter_cdf[2][EXTTX_SIZES][EXT_TX_TYPES]; 848*4882a593Smuzhiyun 849*4882a593Smuzhiyun aom_cdf_prob txb_skip_cdf[TX_SIZES][TXB_SKIP_CONTEXTS][CDF_SIZE(2)]; 850*4882a593Smuzhiyun aom_cdf_prob eob_extra_cdf[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS][CDF_SIZE(2)]; 851*4882a593Smuzhiyun RK_U16 dummy_[5]; 852*4882a593Smuzhiyun 853*4882a593Smuzhiyun aom_cdf_prob eob_flag_cdf16[PLANE_TYPES][2][4]; 854*4882a593Smuzhiyun aom_cdf_prob eob_flag_cdf32[PLANE_TYPES][2][8]; 855*4882a593Smuzhiyun aom_cdf_prob eob_flag_cdf64[PLANE_TYPES][2][8]; 856*4882a593Smuzhiyun aom_cdf_prob eob_flag_cdf128[PLANE_TYPES][2][8]; 857*4882a593Smuzhiyun aom_cdf_prob eob_flag_cdf256[PLANE_TYPES][2][8]; 858*4882a593Smuzhiyun aom_cdf_prob eob_flag_cdf512[PLANE_TYPES][2][16]; 859*4882a593Smuzhiyun aom_cdf_prob eob_flag_cdf1024[PLANE_TYPES][2][16]; 860*4882a593Smuzhiyun aom_cdf_prob coeff_base_eob_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS_EOB][CDF_SIZE(3)]; 861*4882a593Smuzhiyun aom_cdf_prob coeff_base_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS][CDF_SIZE(4) + 1]; 862*4882a593Smuzhiyun aom_cdf_prob dc_sign_cdf[PLANE_TYPES][DC_SIGN_CONTEXTS][CDF_SIZE(2)]; 863*4882a593Smuzhiyun RK_U16 dummy_2[2]; 864*4882a593Smuzhiyun aom_cdf_prob coeff_br_cdf[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS][CDF_SIZE(BR_CDF_SIZE) + 1]; 865*4882a593Smuzhiyun RK_U16 dummy2[16]; 866*4882a593Smuzhiyun } AV1CDFs; 867*4882a593Smuzhiyun 868*4882a593Smuzhiyun typedef struct { 869*4882a593Smuzhiyun RK_U8 scaling_lut_y[256]; 870*4882a593Smuzhiyun RK_U8 scaling_lut_cb[256]; 871*4882a593Smuzhiyun RK_U8 scaling_lut_cr[256]; 872*4882a593Smuzhiyun RK_S16 cropped_luma_grain_block[4096]; 873*4882a593Smuzhiyun RK_S16 cropped_chroma_grain_block[1024 * 2]; 874*4882a593Smuzhiyun } AV1FilmGrainMemory; 875*4882a593Smuzhiyun 876*4882a593Smuzhiyun #endif // __AV1COMMONDEC_H__ 877