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