ih264d_defs.h revision 251b007eccf5a0ddac897ce27de88d3901bc5d00
1/****************************************************************************** 2 * 3 * Copyright (C) 2015 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19*/ 20#ifndef _IH264D_DEFS_H_ 21#define _IH264D_DEFS_H_ 22 23/** 24 ************************************************************************ 25 * \file ih264d_defs.h 26 * 27 * \brief 28 * Type definitions used in the code 29 * 30 * \date 31 * 19/11/2002 32 * 33 * \author Sriram Sethuraman 34 * 35 ************************************************************************ 36 */ 37#define H264_MAX_FRAME_WIDTH 3840 38#define H264_MAX_FRAME_HEIGHT 2176 39 40#define H264_MIN_FRAME_WIDTH 16 41#define H264_MIN_FRAME_HEIGHT 16 42 43#define FMT_CONV_NUM_ROWS 16 44 45/** Bit manipulation macros */ 46#define CHECKBIT(a,i) ((a) & (1 << i)) 47#define CLEARBIT(a,i) ((a) &= ~(1 << i)) 48 49/** Macro to convert a integer to a boolean value */ 50#define BOOLEAN(x) (!!(x)) 51 52/** Arithmetic operations */ 53#define MOD(x,y) ((x)%(y)) 54#define DIV(x,y) ((x)/(y)) 55#define MUL(x,y) ((x)*(y)) 56#define SIGN_POW2_DIV(x, y) (((x) < 0) ? (-((-(x)) >> (y))) : ((x) >> (y))) 57 58#define MB_ENABLE_FILTERING 0x00 59#define MB_DISABLE_FILTERING 0x01 60#define MB_DISABLE_TOP_EDGE 0x02 61#define MB_DISABLE_LEFT_EDGE 0x04 62 63/** Maximum number of reference pics */ 64#define MAX_REF_BUFS 32 65#define MAX_DISP_BUFS_NEW 64 66#define MAX_FRAMES 16 67 68#define INVALID_FRAME_NUM 0x0fffffff 69#define GAP_FRAME_NUM 0x1fffffff 70 71/** macros for reference picture lists, refIdx to POC mapping */ 72// 1 extra entry into reference picture lists for refIdx = -1. 73// this entry is always 0. this saves conditional checks in 74// FillBs modules. 75#define POC_LIST_L0_TO_L1_DIFF (( 2*MAX_FRAMES) + 1) 76#define POC_LIST_L0_TO_L1_DIFF_1 ((MAX_FRAMES) + 1) 77 78#define FRM_LIST_L0 0 //0 79#define FRM_LIST_L1 1 * POC_LIST_L0_TO_L1_DIFF//FRM_LIST_L0 + POC_LIST_L0_TO_L1_DIFF //0+33 //(1 * POC_LIST_L0_TO_L1_DIFF) 80#define TOP_LIST_FLD_L0 2 * POC_LIST_L0_TO_L1_DIFF//FRM_LIST_L1 + POC_LIST_L0_TO_L1_DIFF //0+33+33 //(2 * POC_LIST_L0_TO_L1_DIFF) 81#define TOP_LIST_FLD_L1 3 * POC_LIST_L0_TO_L1_DIFF//TOP_LIST_FLD_L0 + POC_LIST_L0_TO_L1_DIFF_1 //0+33+33+17 //(3 * POC_LIST_L0_TO_L1_DIFF) 82#define BOT_LIST_FLD_L0 4 * POC_LIST_L0_TO_L1_DIFF//TOP_LIST_FLD_L1 + POC_LIST_L0_TO_L1_DIFF_1 //0+33+33+17+17 83#define BOT_LIST_FLD_L1 5 * POC_LIST_L0_TO_L1_DIFF//BOT_LIST_FLD_L0 + POC_LIST_L0_TO_L1_DIFF_1 //0+33+33+17+17+17 84#define TOTAL_LIST_ENTRIES 6 * POC_LIST_L0_TO_L1_DIFF//BOT_LIST_FLD_L1 + POC_LIST_L0_TO_L1_DIFF_1 //0+33+33+17+17+17+17 85#define PAD_MV_BANK_ROW 64 86#define OFFSET_MV_BANK_ROW ((PAD_MV_BANK_ROW)>>1) 87#define PAD_PUC_CURNNZ 32 88#define OFFSET_PUC_CURNNZ (PAD_PUC_CURNNZ) 89#define PAD_MAP_IDX_POC (1) 90#define OFFSET_MAP_IDX_POC (1) 91 92#define OFFSET_MAP_IDX_POC (1) 93 94#define NAL_REF_IDC(nal_first_byte) ((nal_first_byte >> 5) & 0x3) 95#define NAL_FORBIDDEN_BIT(nal_first_byte) (nal_first_byte>>7) 96#define NAL_UNIT_TYPE(nal_first_byte) (nal_first_byte & 0x1F) 97 98#define INT_PIC_TYPE_I (0x00) 99 100#define YIELD_CNT_THRESHOLD 8 101 102 103#define OK 0 104#define END 1 105#define NOT_OK -1 106 107/* For 420SP */ 108#define YUV420SP_FACTOR 2 109 110 111/** 112 *************************************************************************** 113 * Enum to hold various mem records being request 114 **************************************************************************** 115 */ 116enum 117{ 118 /** 119 * Codec Object at API level 120 */ 121 MEM_REC_IV_OBJ, 122 123 /** 124 * Codec context 125 */ 126 MEM_REC_CODEC, 127 128 /** 129 * Bitstream buffer which holds emulation prevention removed bytes 130 */ 131 MEM_REC_BITSBUF, 132 133 /** 134 * Buffer to hold coeff data 135 */ 136 MEM_REC_COEFF_DATA, 137 138 /** 139 * Motion vector bank 140 */ 141 MEM_REC_MVBANK, 142 143 /** 144 * Holds mem records passed to the codec. 145 */ 146 MEM_REC_BACKUP, 147 148 /** 149 * Holds SPS 150 */ 151 MEM_REC_SPS, 152 153 /** 154 * Holds PPS 155 */ 156 MEM_REC_PPS, 157 158 /** 159 * Holds Slice Headers 160 */ 161 MEM_REC_SLICE_HDR, 162 163 /** 164 * Holds thread handles 165 */ 166 MEM_REC_THREAD_HANDLE, 167 168 /** 169 * Contains i4_status map indicating parse i4_status per MB basis 170 */ 171 MEM_REC_PARSE_MAP, 172 173 /** 174 * Contains i4_status map indicating processing i4_status per MB basis 175 */ 176 MEM_REC_PROC_MAP, 177 178 /** 179 * Contains slice number info for each MB 180 */ 181 182 MEM_REC_SLICE_NUM_MAP, 183 184 /** 185 * Holds dpb manager context 186 */ 187 MEM_REC_DPB_MGR, 188 189 /** 190 * Holds neighbors' info 191 */ 192 MEM_REC_NEIGHBOR_INFO, 193 194 /** 195 * Holds neighbors' info 196 */ 197 MEM_REC_PRED_INFO, 198 199 200 /** 201 * Holds inter pred inforamation on packed format info 202 */ 203 MEM_REC_PRED_INFO_PKD, 204 /** 205 * Holds neighbors' info 206 */ 207 MEM_REC_MB_INFO, 208 209 /** 210 * Holds deblock Mb info structure frame level) 211 */ 212 MEM_REC_DEBLK_MB_INFO, 213 214 /** 215 * Holds reference picture buffers in non-shared mode 216 */ 217 MEM_REC_REF_PIC, 218 219 /** 220 * Holds some misc intermediate_buffers 221 */ 222 MEM_REC_EXTRA_MEM, 223 224 /** 225 * Holds some misc intermediate_buffers 226 */ 227 MEM_REC_INTERNAL_SCRATCH, 228 229 /** 230 * Holds some misc intermediate_buffers 231 */ 232 MEM_REC_INTERNAL_PERSIST, 233 234 /* holds structures related to picture buffer manager*/ 235 MEM_REC_PIC_BUF_MGR, 236 237 /*holds structure related to MV buffer manager*/ 238 MEM_REC_MV_BUF_MGR, 239 240 /** 241 * Place holder to compute number of memory records. 242 */ 243 MEM_REC_CNT 244/* Do not add anything below */ 245}; 246 247#ifdef DEBLOCK_THREAD 248#define H264_MUTEX_LOCK(lock) ithread_mutex_lock(lock) 249#define H264_MUTEX_UNLOCK(lock) ithread_mutex_unlock(lock) 250#else //DEBLOCK_THREAD 251#define H264_MUTEX_LOCK(lock) 252#define H264_MUTEX_UNLOCK(lock) 253 254#define DEBUG_THREADS_PRINTF(...) 255#define DEBUG_PERF_PRINTF(...) 256 257/** Profile Types*/ 258#define BASE_PROFILE_IDC 66 259#define MAIN_PROFILE_IDC 77 260#define HIGH_PROFILE_IDC 100 261 262 263#define MB_SIZE 16 264#define BLK8x8SIZE 8 265#define BLK_SIZE 4 266#define NUM_BLKS_PER_MB 24 267#define NUM_LUM_BLKS_PER_MB 16 268#define LUM_BLK 0 269#define CHROM_BLK 1 270#define NUM_PELS_IN_MB 64 271 272/* Level Types */ 273#define H264_LEVEL_1_0 10 274#define H264_LEVEL_1_1 11 275#define H264_LEVEL_1_2 12 276#define H264_LEVEL_1_3 13 277#define H264_LEVEL_2_0 20 278#define H264_LEVEL_2_1 21 279#define H264_LEVEL_2_2 22 280#define H264_LEVEL_3_0 30 281#define H264_LEVEL_3_1 31 282#define H264_LEVEL_3_2 32 283#define H264_LEVEL_4_0 40 284#define H264_LEVEL_4_1 41 285#define H264_LEVEL_4_2 42 286#define H264_LEVEL_5_0 50 287#define H264_LEVEL_5_1 51 288 289#define MAX_MBS_LEVEL_51 36864 290#define MAX_MBS_LEVEL_50 22080 291#define MAX_MBS_LEVEL_42 8704 292#define MAX_MBS_LEVEL_41 8192 293#define MAX_MBS_LEVEL_40 8192 294#define MAX_MBS_LEVEL_32 5120 295#define MAX_MBS_LEVEL_31 3600 296#define MAX_MBS_LEVEL_30 1620 297#define MAX_MBS_LEVEL_22 1620 298#define MAX_MBS_LEVEL_21 792 299#define MAX_MBS_LEVEL_20 396 300#define MAX_MBS_LEVEL_13 396 301#define MAX_MBS_LEVEL_12 396 302#define MAX_MBS_LEVEL_11 396 303#define MAX_MBS_LEVEL_10 99 304 305/** NAL Types */ 306#define SLICE_NAL 1 307#define SLICE_DATA_PARTITION_A_NAL 2 308#define SLICE_DATA_PARTITION_B_NAL 3 309#define SLICE_DATA_PARTITION_C_NAL 4 310#define IDR_SLICE_NAL 5 311#define SEI_NAL 6 312#define SEQ_PARAM_NAL 7 313#define PIC_PARAM_NAL 8 314#define ACCESS_UNIT_DELIMITER_RBSP 9 315#define END_OF_SEQ_RBSP 10 316#define END_OF_STREAM_RBSP 11 317#define FILLER_DATA_NAL 12 318 319/** Entropy coding modes */ 320#define CAVLC 0 321#define CABAC 1 322 323/** Picture Types */ 324#define I_PIC 0 325#define IP_PIC 1 326#define IPB_PIC 2 327#define SI_PIC 3 328#define SIP_PIC 4 329#define ISI_PIC 5 330#define ISI_PSP_PIC 6 331#define ALL_PIC 7 332 333/* Frame or field picture type */ 334#define FRM_PIC 0x00 335#define TOP_FLD 0x01 336#define BOT_FLD 0x02 337#define COMP_FLD_PAIR 0x03 /* TOP_FLD | BOT_FLD */ 338#define AFRM_PIC 0x04 339#define TOP_REF 0x08 340#define BOT_REF 0x10 341#define PIC_MASK 0x03 342#define NON_EXISTING 0xff 343 344/* field picture type for display */ 345#define DISP_TOP_FLD 0x00 346#define DISP_BOT_FLD 0x01 347 348/** Slice Types */ 349#define P_SLICE 0 350#define B_SLICE 1 351#define I_SLICE 2 352#define SP_SLICE 3 353#define SI_SLICE 4 354 355/* Definition for picture skip */ 356#define SKIP_NONE (0x0) 357#define I_SLC_BIT (0x1) 358#define P_SLC_BIT (0x2) 359#define B_SLC_BIT (0x4) 360 361/** Macros used for Deblocking */ 362#define D_INTER_MB 0 363#define D_INTRA_MB 1 364#define D_PRED_NON_16x16 2 365#define D_B_SLICE 4 366#define D_B_SUBMB 6 //D_B_SLICE | D_PRED_NON_16x16 | D_INTER_MB 367#define D_FLD_MB 0x80 368 369/** Macros for Cabac checks */ 370/** MbType */ 371/** |x|x|I_PCM|SKIP| 372 |S|Inter/Intra|P/B|NON-BD16x16/BD16x16,I16x16/I4x4| */ 373#define CAB_INTRA 0x00 /* 0000 00xx */ 374#define CAB_INTER 0x04 /* 0000 01xx */ 375#define CAB_I4x4 0x00 /* 0000 00x0 */ 376#define CAB_I16x16 0x01 /* 0000 00x1 */ 377#define CAB_BD16x16 0x04 /* 0000 0100 */ 378#define CAB_NON_BD16x16 0x05 /* 0000 0101 */ 379#define CAB_P 0x07 /* 0000 0111 */ 380#define CAB_SI4x4 0x08 /* 0000 10x0 */ 381#define CAB_SI16x16 0x09 /* 0000 10x1 */ 382#define CAB_SKIP_MASK 0x10 /* 0001 0000 */ 383#define CAB_SKIP 0x10 /* 0001 0000 */ 384#define CAB_P_SKIP 0x16 /* 0001 x11x */ 385#define CAB_B_SKIP 0x14 /* 0001 x100 */ 386#define CAB_BD16x16_MASK 0x07 /* 0000 0111 */ 387#define CAB_INTRA_MASK 0x04 /* 0000 0100 */ 388#define CAB_I_PCM 0x20 /* 001x xxxx */ 389 390/**< Binarization types for CABAC */ 391/* |x|x|x|x|MSB_FIRST_FLC|FLC|TUNARY|UNARY| */ 392#define UNARY 1 393#define TUNARY 2 394#define FLC 4 395#define MSB_FIRST_FLC 12 396 397/** Macroblock Types */ 398#define I_4x4_MB 0 399#define I_16x16_MB 1 400#define P_MB 2 401#define B_MB 3 402#define SI_MB 4 403#define SP_MB 5 404#define I_PCM_MB 6 405 406#define SI4x4_MB 0xFF 407 408/** Intra luma 16x16 and chroma 8x8 prediction modes */ 409#define NUM_INTRA_PRED_MODES 4 410#define VERT 0 411#define HORIZ 1 412#define DC 2 413#define PLANE 3 414#define NOT_VALID -1 415#define DC_DC_DC_DC 0x02020202 /*packed 4 bytes used in Decode Intra Mb*/ 416 417/** Intra luma 4x4 prediction modes */ 418#define NUM_INTRA4x4_PRED_MODES 9 419 420/** VERT, HORIZ, DC are applicable to 4x4 as well */ 421/** D - Down; U - Up; L - Left; R - Right */ 422#define DIAG_DL 3 423#define DIAG_DR 4 424#define VERT_R 5 425#define HORIZ_D 6 426#define VERT_L 7 427#define HORIZ_U 8 428 429/** P_MB prediction modes */ 430#define NUM_INTER_MB_PRED_MODES 5 431#define PRED_16x16 0 432#define PRED_16x8 1 433#define PRED_8x16 2 434#define PRED_8x8 3 435#define PRED_8x8R0 4 436#define MAGIC_16x16 5 437#define MB_SKIP 255 438 439/* P_MB submb modes */ 440#define P_L0_8x8 0 441#define P_L0_8x4 1 442#define P_L0_4x8 2 443#define P_L0_4x4 3 444 445/* B_MB submb modes */ 446#define B_DIRECT_8x8 0 447#define B_L0_8x8 1 448#define B_L1_8x8 2 449#define B_BI_8x8 3 450#define B_L0_8x4 4 451#define B_L0_4x8 5 452#define B_L1_8x4 6 453#define B_L1_4x8 7 454#define B_BI_8x4 8 455#define B_BI_4x8 9 456#define B_L0_4x4 10 457#define B_L1_4x4 11 458#define B_BI_4x4 12 459 460/** B_MB prediction modes */ 461#define B_8x8 22 462#define PRED_INVALID -1 463#define B_DIRECT 0 464#define PRED_L0 1 465#define PRED_L1 2 466#define BI_PRED 3 467#define B_DIRECT_BI_PRED 23 468#define B_DIRECT_PRED_L0 24 469#define B_DIRECT_PRED_L1 25 470#define B_DIRECT_SPATIAL 26 471 472#define B_DIRECT8x8_BI_PRED 13 473#define B_DIRECT8x8_PRED_L0 14 474#define B_DIRECT8x8_PRED_L1 15 475 476#define ONE_TO_ONE 0 477#define FRM_TO_FLD 1 478#define FLD_TO_FRM 2 479 480/** Inter Sub MB Pred modes */ 481#define NUM_INTER_SUBMB_PRED_MODES 4 482#define SUBMB_8x8 0 483#define SUBMB_8x4 1 484#define SUBMB_4x8 2 485#define SUBMB_4x4 3 486 487/** Coded Block Pattern - Chroma */ 488#define CBPC_ALLZERO 0 489#define CBPC_ACZERO 1 490#define CBPC_NONZERO 2 491 492/** Index for accessing the left MB in the MV predictor array */ 493#define LEFT 0 494/** Index for accessing the top MB in the MV predictor array */ 495#define TOP 1 496/** Index for accessing the top right MB in the MV predictor array */ 497#define TOP_R 2 498/** Index for accessing the top Left MB in the MV predictor array */ 499#define TOP_L 3 500 501/** Maximum number of Sequence Parameter sets */ 502#define MAX_NUM_SEQ_PARAMS 32 503 504/** Maximum number of Picture Parameter sets */ 505#define MAX_NUM_PIC_PARAMS 256 506 507#define MASK_ERR_SEQ_SET_ID (0xFFFFFFE0) 508#define MASK_ERR_PIC_SET_ID (0xFFFFFF00) 509 510#define MAX_PIC_ORDER_CNT_TYPE 2 511 512#define MAX_BITS_IN_FRAME_NUM 16 513#define MAX_BITS_IN_POC_LSB 16 514 515#define H264_MAX_REF_PICS 16 516#define H264_MAX_REF_IDX 32 517#define MAX_WEIGHT_BIPRED_IDC 2 518#define MAX_CABAC_INIT_IDC 2 519 520#define H264_DEFAULT_NUM_CORES 1 521#define DEFAULT_SEPARATE_PARSE (H264_DEFAULT_NUM_CORES == 2)? 1 :0 522 523/** Maximum number of Slice groups */ 524#define MAX_NUM_SLICE_GROUPS 8 525#define MAX_NUM_REF_FRAMES_OFFSET 255 526 527/** Deblocking modes for a slice */ 528#define SLICE_BOUNDARY_DBLK_DISABLED 2 529#define DBLK_DISABLED 1 530#define DBLK_ENABLED 0 531#define MIN_DBLK_FIL_OFF -12 532#define MAX_DBLK_FIL_OFF 12 533 534/** Width of the predictor buffers used for MC */ 535#define MB_SIZE 16 536#define BLK8x8SIZE 8 537#define BLK_SIZE 4 538#define NUM_BLKS_PER_MB 24 539#define NUM_LUM_BLKS_PER_MB 16 540 541#define SUB_BLK_WIDTH 4 542#define SUB_SUB_BLK_SIZE 4 /* 2x2 pixel i4_size */ 543#define SUB_BLK_SIZE ((SUB_BLK_WIDTH) * (SUB_BLK_WIDTH)) 544#define MB_LUM_SIZE 256 545#define MB_CHROM_SIZE 64 546 547/**< Width to pad the luminance frame buff */ 548/**< Height to pad the luminance frame buff */ 549/**< Width to pad the chrominance frame buff */ 550/**< Height to pad the chrominance frame buff */ 551 552#define PAD_LEN_Y_H 32 553#define PAD_LEN_Y_V 20 554#define PAD_LEN_UV_H 16 555#define PAD_LEN_UV_V 8 556 557#define PAD_MV_BANK_ROW 64 558 559/**< Maimum u4_ofst by which the Mvs could point outside the frame buffers 560 horizontally in the left and vertically in the top direction */ 561#define MAX_OFFSET_OUTSIDE_X_FRM -20 562#define MAX_OFFSET_OUTSIDE_Y_FRM -20 563#define MAX_OFFSET_OUTSIDE_UV_FRM -8 564 565/** UVLC parsing macros */ 566#define UEV 1 567#define SEV 2 568#define TEV 3 569 570/** Defines for Boolean values */ 571#ifndef TRUE 572#define TRUE 1 573#define FALSE 0 574#endif 575 576#define UNUSED_FOR_REF 0 577#define IS_SHORT_TERM 1 578#define IS_LONG_TERM 2 579 580/** Defines for which field gets displayed first */ 581#define MAX_FRAMES 16 582#define INVALID_FRAME_NUM 0x0fffffff 583#define DO_NOT_DISP 254 584#define DISP_FLD_FIRST_UNDEF 0 585#define DISP_TOP_FLD_FIRST 1 586#define DISP_BOT_FLD_FIRST 2 587 588/** Misc error resilience requirements*/ 589#define MASK_LOG2_WEIGHT_DENOM 0xFFFFFFF8 590#define MASK_PRED_WEIGHT_OFFSET 0xFFFFFF00 591#define MAX_REDUNDANT_PIC_CNT 127 592 593 594 595#endif //DEBLOCK_THREAD 596 597#define NUM_COEFFS_IN_4x4BLK 16 598 599 600#define MEMSET_16BYTES(pu4_start,value) \ 601{ \ 602 memset(pu4_start,value,16); \ 603} 604 605#define MEMCPY_16BYTES(dst,src) \ 606{ \ 607 memcpy(dst,src,16); \ 608} 609 610 611#endif /*_IH264D_DEFS_H_*/ 612