Home | History | Annotate | Download | only in decoder
      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