1 /****************************************************************************** 2 * 3 * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore 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 /** 19 ******************************************************************************* 20 * @file 21 * ihevcd_defs.h 22 * 23 * @brief 24 * Definitions used in the decoder 25 * 26 * @author 27 * Harish 28 * 29 * @par List of Functions: 30 * 31 * @remarks 32 * None 33 * 34 ******************************************************************************* 35 */ 36 37 #ifndef _IHEVCD_DEFS_H_ 38 #define _IHEVCD_DEFS_H_ 39 40 41 /*****************************************************************************/ 42 /* Width and height restrictions */ 43 /*****************************************************************************/ 44 /** 45 * Minimum width supported by codec 46 */ 47 #define MIN_WD 64 48 49 /** 50 * Maximum width supported by codec 51 */ 52 53 #define MAX_WD 8448 54 55 /** 56 * Minimum height supported by codec 57 */ 58 #define MIN_HT 64 59 60 /** 61 * Maximum height supported by codec 62 */ 63 64 #define MAX_HT 4320 65 66 /*****************************************************************************/ 67 /* Padding sizes */ 68 /*****************************************************************************/ 69 /** 70 * Padding used for top of the frame 71 */ 72 #define PAD_TOP 80 73 74 /** 75 * Padding used for bottom of the frame 76 */ 77 #define PAD_BOT 80 78 79 /** 80 * Padding used at left of the frame 81 */ 82 #define PAD_LEFT 80 83 84 /** 85 * Padding used at right of the frame 86 */ 87 #define PAD_RIGHT 80 88 /** 89 * Padding for width 90 */ 91 #define PAD_WD (PAD_LEFT + PAD_RIGHT) 92 /** 93 * Padding for height 94 */ 95 #define PAD_HT (PAD_TOP + PAD_BOT) 96 97 /*****************************************************************************/ 98 /* Number of frame restrictions */ 99 /*****************************************************************************/ 100 /** 101 * Maximum number of reference buffers in DPB manager 102 */ 103 #define MAX_REF_CNT 32 104 105 /*****************************************************************************/ 106 /* Num cores releated defs */ 107 /*****************************************************************************/ 108 /** 109 * Maximum number of cores 110 */ 111 #define MAX_NUM_CORES 8 112 113 /** 114 * Maximum number of threads for pixel processing 115 */ 116 #define MAX_PROCESS_THREADS MAX_NUM_CORES 117 118 /** If num_cores is greater than MV_PRED_NUM_CORES_THRESHOLD, then mv pred and 119 boundary strength computation is done in process side instead of parse side. 120 This ensures thread that does parsing does minimal work */ 121 #define MV_PRED_NUM_CORES_THRESHOLD 2 122 123 /*****************************************************************************/ 124 /* Profile and level restrictions */ 125 /*****************************************************************************/ 126 /** 127 * Max level supported by the codec 128 */ 129 #define MAX_LEVEL IHEVC_LEVEL_62 130 /** 131 * Min level supported by the codec 132 */ 133 134 #define MIN_LEVEL IHEVC_LEVEL_10 135 136 137 /** 138 * Maximum number of slice headers that are held in memory simultaneously 139 * For single core implementation only 1 slice header is enough. 140 * But for multi-core parsing thread needs to ensure that slice headers are 141 * stored till the last CB in a slice is decoded. 142 * Parsing thread has to wait till last CB of a slice is consumed before reusing 143 * overwriting the slice header 144 * MAX_SLICE_HDR_CNT is assumed to be a power of 2 145 */ 146 147 #define LOG2_MAX_SLICE_HDR_CNT 8 148 #define MAX_SLICE_HDR_CNT (1 << LOG2_MAX_SLICE_HDR_CNT) 149 150 /* Number of NOP instructions to wait before yielding in process thread */ 151 #define PROC_NOP_CNT (8 * 128) 152 153 154 /** Max QP delta that can be signalled */ 155 #define TU_MAX_QP_DELTA_ABS 5 156 157 /** Max QP delta context increment that can be used for CABAC context */ 158 #define CTXT_MAX_QP_DELTA_ABS 1 159 160 /* 161 * Flag whether to perform ilf at frame level or CTB level 162 */ 163 #define FRAME_ILF_PAD 0 164 165 #define MAX_NUM_CTBS_IN_FRAME (MAX_WD * MAX_HT / MIN_CTB_SIZE / MIN_CTB_SIZE) 166 167 /* Maximum slice segments allowed per frame in Level 6.2 */ 168 #define MAX_SLICE_SEGMENTS_IN_FRAME 600 169 170 /** 171 * Buffer allocated for ps_tu is re-used after RESET_TU_BUF_NCTB 172 * Set this to MAX_NUM_CTBS_IN_FRAME to disabke reuse 173 */ 174 #define RESET_TU_BUF_NCTB MAX_NUM_CTBS_IN_FRAME 175 /** 176 * Flag whether to shift the CTB for SAO 177 */ 178 #define SAO_PROCESS_SHIFT_CTB 1 179 180 /** 181 * Minimum bistream buffer size 182 */ 183 #define MIN_BITSBUF_SIZE (1024 * 1024) 184 /** 185 ***************************************************************************** 186 * Macro to compute total size required to hold on set of scaling matrices 187 ***************************************************************************** 188 */ 189 #define SCALING_MAT_SIZE(m_scaling_mat_size) \ 190 { \ 191 m_scaling_mat_size = 6 * TRANS_SIZE_4 * TRANS_SIZE_4; \ 192 m_scaling_mat_size += 6 * TRANS_SIZE_8 * TRANS_SIZE_8; \ 193 m_scaling_mat_size += 6 * TRANS_SIZE_16 * TRANS_SIZE_16; \ 194 m_scaling_mat_size += 2 * TRANS_SIZE_32 * TRANS_SIZE_32; \ 195 } 196 197 /** 198 *************************************************************************** 199 * Enum to hold various mem records being request 200 **************************************************************************** 201 */ 202 enum 203 { 204 /** 205 * Codec Object at API level 206 */ 207 MEM_REC_IV_OBJ, 208 209 /** 210 * Codec context 211 */ 212 MEM_REC_CODEC, 213 214 /** 215 * Bitstream buffer which holds emulation prevention removed bytes 216 */ 217 MEM_REC_BITSBUF, 218 219 /** 220 * Buffer to hold TU structures and coeff data 221 */ 222 MEM_REC_TU_DATA, 223 224 /** 225 * Motion vector bank 226 */ 227 MEM_REC_MVBANK, 228 229 /** 230 * Holds mem records passed to the codec. 231 */ 232 MEM_REC_BACKUP, 233 234 /** 235 * Holds VPS 236 */ 237 MEM_REC_VPS, 238 239 /** 240 * Holds SPS 241 */ 242 MEM_REC_SPS, 243 244 /** 245 * Holds PPS 246 */ 247 MEM_REC_PPS, 248 249 /** 250 * Holds Slice Headers 251 */ 252 MEM_REC_SLICE_HDR, 253 254 /** 255 * Holds tile information such as start position, widths and heights 256 */ 257 MEM_REC_TILE, 258 259 /** 260 * Holds entry point offsets for tiles and entropy sync points 261 */ 262 MEM_REC_ENTRY_OFST, 263 264 /** 265 * Holds scaling matrices 266 */ 267 MEM_REC_SCALING_MAT, 268 269 /** 270 * Holds one row skip_flag at 8x8 level used during parsing 271 */ 272 MEM_REC_PARSE_SKIP_FLAG, 273 274 /** 275 * Holds one row ctb_tree_depth at 8x8 level used during parsing 276 */ 277 MEM_REC_PARSE_CT_DEPTH, 278 279 /** 280 * Holds one row luma intra pred mode at 8x8 level used during parsing 281 */ 282 MEM_REC_PARSE_INTRA_PRED_MODE, 283 284 /** 285 * Holds intra flag at 8x8 level for entire frame 286 * This is kept at frame level so that processing thread also can use this 287 * data during intra prediction and compute BS 288 */ 289 MEM_REC_INTRA_FLAG, 290 291 /** 292 * Holds transquant bypass flag at 8x8 level for entire frame 293 * This is kept at frame level so that processing thread also can use this 294 */ 295 MEM_REC_TRANSQUANT_BYPASS_FLAG, 296 297 /** 298 * Holds thread handles 299 */ 300 MEM_REC_THREAD_HANDLE, 301 302 /** 303 * Holds memory for Process JOB Queue 304 */ 305 MEM_REC_PROC_JOBQ, 306 307 /** 308 * Contains status map indicating parse status per CTB basis 309 */ 310 MEM_REC_PARSE_MAP, 311 312 /** 313 * Contains status map indicating processing status per CTB basis 314 */ 315 MEM_REC_PROC_MAP, 316 317 /** 318 * Holds display buffer manager context 319 */ 320 MEM_REC_DISP_MGR, 321 322 /** 323 * Holds dpb manager context 324 */ 325 MEM_REC_DPB_MGR, 326 327 /** 328 * Holds top and left neighbors' pu_idx array w.r.t picture level pu array 329 */ 330 MEM_REC_PIC_PU_IDX_NEIGHBOR, 331 332 /** 333 * Holds intermediate buffers needed during processing stage 334 * Memory for process contexts is allocated in this memtab 335 */ 336 MEM_REC_PROC_SCRATCH, 337 338 /** 339 * Holds intermediate buffers needed during SAO processing 340 */ 341 MEM_REC_SAO_SCRATCH, 342 343 /** 344 * Holds buffers for vert_bs, horz_bs and QP (all frame level) 345 */ 346 MEM_REC_BS_QP, 347 348 /** 349 * Contains slice map indicatating the slice index for each CTB 350 */ 351 MEM_REC_TILE_IDX, 352 353 /** 354 * Holds buffers for array of SAO structures 355 */ 356 MEM_REC_SAO, 357 358 /** 359 * Holds picture buffer manager context and array of pic_buf_ts 360 * Also holds reference picture buffers in non-shared mode 361 */ 362 MEM_REC_REF_PIC, 363 364 365 366 /** 367 * Place holder to compute number of memory records. 368 */ 369 MEM_REC_CNT 370 /* Do not add anything below */ 371 }; 372 373 374 375 #define DISABLE_DEBLOCK_INTERVAL 8 376 #define DISABLE_SAO_INTERVAL 8 377 378 /** 379 **************************************************************************** 380 * Disable deblock levels 381 * Level 0 enables deblocking completely and level 4 disables completely 382 * Other levels are intermediate values to control deblocking level 383 **************************************************************************** 384 */ 385 enum 386 { 387 /** 388 * Enable deblocking completely 389 */ 390 DISABLE_DEBLK_LEVEL_0, 391 /** 392 * Disable only within CTB edges - Not supported currently 393 */ 394 DISABLE_DEBLK_LEVEL_1, 395 396 /** 397 * Enable deblocking once in DEBLOCK_INTERVAL number of pictures 398 * and for I slices 399 */ 400 DISABLE_DEBLK_LEVEL_2, 401 402 /** 403 * Enable deblocking only for I slices 404 */ 405 DISABLE_DEBLK_LEVEL_3, 406 407 /** 408 * Disable deblocking completely 409 */ 410 DISABLE_DEBLK_LEVEL_4 411 }; 412 413 enum 414 { 415 /** 416 * Enable deblocking completely 417 */ 418 DISABLE_SAO_LEVEL_0, 419 /** 420 * Disable only within CTB edges - Not supported currently 421 */ 422 DISABLE_SAO_LEVEL_1, 423 424 /** 425 * Enable deblocking once in DEBLOCK_INTERVAL number of pictures 426 * and for I slices 427 */ 428 DISABLE_SAO_LEVEL_2, 429 430 /** 431 * Enable deblocking only for I slices 432 */ 433 DISABLE_SAO_LEVEL_3, 434 435 /** 436 * Disable deblocking completely 437 */ 438 DISABLE_SAO_LEVEL_4 439 }; 440 441 /** 442 **************************************************************************** 443 * Number of buffers for I/O based on format 444 **************************************************************************** 445 */ 446 #define MIN_IN_BUFS 1 447 #define MIN_OUT_BUFS_420 3 448 #define MIN_OUT_BUFS_422ILE 1 449 #define MIN_OUT_BUFS_RGB565 1 450 #define MIN_OUT_BUFS_RGBA8888 1 451 #define MIN_OUT_BUFS_420SP 2 452 453 /** 454 **************************************************************************** 455 * Definitions related to MV pred mv merge 456 **************************************************************************** 457 */ 458 #define MAX_NUM_MERGE_CAND 5 459 460 #define MAX_NUM_MV_NBR 5 461 462 #define MAX_MVP_LIST_CAND 2 463 #define MAX_MVP_LIST_CAND_MEM (MAX_MVP_LIST_CAND + 1) 464 465 466 467 #endif /*_IHEVCD_DEFS_H_*/ 468