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