| /****************************************************************************** |
| * |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at: |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| ***************************************************************************** |
| * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
| */ |
| /** |
| ******************************************************************************* |
| * @file |
| * ih264_defs.h |
| * |
| * @brief |
| * Definitions used in the codec |
| * |
| * @author |
| * Ittiam |
| * |
| * |
| * @remarks |
| * None |
| * |
| ******************************************************************************* |
| */ |
| |
| #ifndef IH264_DEFS_H_ |
| #define IH264_DEFS_H_ |
| |
| /*****************************************************************************/ |
| /* Enums */ |
| /*****************************************************************************/ |
| |
| |
| /*****************************************************************************/ |
| /* Profile and Levels */ |
| /*****************************************************************************/ |
| |
| /** |
| ****************************************************************************** |
| * @enum PROFILE_IDC |
| * @brief Defines the set of possible profiles |
| ****************************************************************************** |
| */ |
| enum |
| { |
| IH264_PROFILE_BASELINE = 66, |
| IH264_PROFILE_MAIN = 77, |
| IH264_PROFILE_EXTENDED = 88, |
| IH264_PROFILE_HIGH = 100, |
| IH264_PROFILE_HIGH10 = 110, |
| IH264_PROFILE_HIGH422 = 122, |
| IH264_PROFILE_HIGH444 = 144, |
| }; |
| |
| /** |
| ****************************************************************************** |
| * @enum LEVEL_IDC |
| * @brief Defines the set of possible levels |
| ****************************************************************************** |
| */ |
| typedef enum |
| { |
| IH264_LEVEL_10 = 10, |
| IH264_LEVEL_1B = 9, |
| IH264_LEVEL_11 = 11, |
| IH264_LEVEL_12 = 12, |
| IH264_LEVEL_13 = 13, |
| IH264_LEVEL_20 = 20, |
| IH264_LEVEL_21 = 21, |
| IH264_LEVEL_22 = 22, |
| IH264_LEVEL_30 = 30, |
| IH264_LEVEL_31 = 31, |
| IH264_LEVEL_32 = 32, |
| IH264_LEVEL_40 = 40, |
| IH264_LEVEL_41 = 41, |
| IH264_LEVEL_42 = 42, |
| IH264_LEVEL_50 = 50, |
| IH264_LEVEL_51 = 51, |
| }IH264_LEVEL_T; |
| |
| |
| /** |
| ****************************************************************************** |
| * @enum PIC TYPES |
| * @brief Defines the set of possible picture type - not signaled in bitstream |
| ****************************************************************************** |
| */ |
| typedef enum |
| { |
| PIC_NA = 0x7FFFFFFF, |
| PIC_IDR = 0, |
| PIC_I = 1, |
| PIC_P = 2, |
| PIC_B = 3, |
| PIC_P_NONREF = 4, |
| PIC_B_NONREF = 5, |
| PIC_MAX, |
| }PIC_TYPE_T; |
| |
| /** |
| ****************************************************************************** |
| * @enum FRAME-FIELD types |
| * @brief Defines the set of possible field types. |
| ****************************************************************************** |
| */ |
| enum |
| { |
| TOP_FIELD, |
| BOTTOM_FIELD, |
| FRAME, |
| }; |
| |
| /** |
| ****************************************************************************** |
| * @enum SLICE TYPES |
| * @brief Defines the set of possible SLICE TYPES |
| ****************************************************************************** |
| */ |
| enum |
| { |
| PSLICE = 0, |
| BSLICE = 1, |
| ISLICE = 2, |
| SPSLICE = 3, |
| SISLICE = 4, |
| MAXSLICE_TYPE, |
| }; |
| |
| /** |
| ****************************************************************************** |
| * @enum NAL_UNIT_TYPE |
| * @brief Defines the set of possible nal unit types |
| ****************************************************************************** |
| */ |
| enum |
| { |
| NAL_UNSPEC_0 = 0, |
| NAL_SLICE_NON_IDR = 1, |
| NAL_SLICE_DPA = 2, |
| NAL_SLICE_DPB = 3, |
| NAL_SLICE_DPC = 4, |
| NAL_SLICE_IDR = 5, |
| NAL_SEI = 6, |
| NAL_SPS = 7, |
| NAL_PPS = 8, |
| NAL_AUD = 9, |
| NAL_EOSEQ = 10, |
| NAL_EOSTR = 11, |
| NAL_FILLER = 12, |
| NAL_SPSE = 13, |
| NAL_RES_18 = 14, |
| NAL_AUX_PIC = 19, |
| NAL_RES_23 = 20, |
| NAL_UNSPEC_31 = 24, |
| }; |
| |
| /** |
| ****************************************************************************** |
| * @enum CHROMA_FORMAT_IDC |
| * @brief Defines the set of possible chroma formats |
| * Note Chorma format Do not change enum values |
| ****************************************************************************** |
| */ |
| enum |
| { |
| CHROMA_FMT_IDC_MONOCHROME = 0, |
| CHROMA_FMT_IDC_YUV420 = 1, |
| CHROMA_FMT_IDC_YUV422 = 2, |
| CHROMA_FMT_IDC_YUV444 = 3, |
| CHROMA_FMT_IDC_YUV444_PLANES = 4, |
| }; |
| |
| |
| /** |
| ****************************************************************************** |
| * @enum MBMODES_I16x16 |
| * @brief Defines the set of possible intra 16x16 mb modes |
| ****************************************************************************** |
| */ |
| typedef enum |
| { |
| VERT_I16x16 = 0, |
| HORZ_I16x16 = 1, |
| DC_I16x16 = 2, |
| PLANE_I16x16 = 3, |
| MAX_I16x16 = 4, |
| }MBMODES_I16x16; |
| |
| /** |
| ****************************************************************************** |
| * @enum MBMODES_I4x4 |
| * @brief Defines the set of possible intra 4x4 mb modes |
| ****************************************************************************** |
| */ |
| typedef enum |
| { |
| VERT_I4x4 = 0, |
| HORZ_I4x4 = 1, |
| DC_I4x4 = 2, |
| DIAG_DL_I4x4 = 3, |
| DIAG_DR_I4x4 = 4, |
| VERT_R_I4x4 = 5, |
| HORZ_D_I4x4 = 6, |
| VERT_L_I4x4 = 7, |
| HORZ_U_I4x4 = 8, |
| MAX_I4x4 = 9, |
| }MBMODES_I4x4; |
| |
| /** |
| ****************************************************************************** |
| * @enum MBMODES_I8x8 |
| * @brief Defines the set of possible intra 8x8 mb modes |
| ****************************************************************************** |
| */ |
| typedef enum |
| { |
| VERT_I8x8 = 0, |
| HORZ_I8x8 = 1, |
| DC_I8x8 = 2, |
| DIAG_DL_I8x8 = 3, |
| DIAG_DR_I8x8 = 4, |
| VERT_R_I8x8 = 5, |
| HORZ_D_I8x8 = 6, |
| VERT_L_I8x8 = 7, |
| HORZ_U_I8x8 = 8, |
| MAX_I8x8 = 9, |
| }MBMODES_I8x8; |
| |
| /** |
| ****************************************************************************** |
| * @enum MBMODES_CHROMA_I8x8 (Chroma) |
| * @brief Defines the set of possible intra 8x8 mb modes for chroma |
| ****************************************************************************** |
| */ |
| typedef enum |
| { |
| DC_CH_I8x8 = 0, |
| HORZ_CH_I8x8 = 1, |
| VERT_CH_I8x8 = 2, |
| PLANE_CH_I8x8 = 3, |
| MAX_CH_I8x8 = 4, |
| }MBMODES_CHROMA_I8x8; |
| |
| /** |
| ****************************************************************************** |
| * @enum MBTYPES |
| * @brief Defines the set of possible macro block types |
| ****************************************************************************** |
| */ |
| typedef enum |
| { |
| I16x16 = 0, |
| I4x4 = 1, |
| I8x8 = 2, |
| P16x16 = 3, |
| P16x8 = 4, |
| P8x16 = 5, |
| P8x8 = 6, |
| PSKIP = 7, |
| IPCM = 8, |
| B16x16 = 9, |
| BSKIP = 10, |
| BDIRECT = 11, |
| MAX_MBTYPES, |
| }MBTYPES_T; |
| |
| /* Prediction list */ |
| /* Do not change enum values */ |
| enum |
| { |
| PRED_L0 = 0, |
| PRED_L1 = 1, |
| PRED_BI = 2 |
| }; |
| |
| |
| /** |
| ****************************************************************************** |
| * @enum ENTROPY_BLK_TYPE |
| * @brief Defines the nature of blocks employed in entropy coding |
| ****************************************************************************** |
| */ |
| typedef enum |
| { |
| ENTROPY_BLK_INVALID = -1, |
| CAVLC_LUMA_4x4_DC = 0, |
| CAVLC_LUMA_4x4_AC = 1, |
| CAVLC_LUMA_4x4 = 2, |
| CAVLC_CHROMA_4x4_DC = 3, |
| CAVLC_CHROMA_4x4_AC = 4, |
| } ENTROPY_BLK_TYPE; |
| |
| /** |
| ****************************************************************************** |
| * @enum ENTROPY_MODE |
| * @brief Entropy coding modes |
| ****************************************************************************** |
| */ |
| typedef enum |
| { |
| CAVLC = 0, |
| CABAC = 1, |
| } ENTROPY_MODE; |
| |
| /** |
| ****************************************************************************** |
| * @enum COMPONENT_TYPE |
| * @brief components Y, U & V |
| ****************************************************************************** |
| */ |
| typedef enum |
| { |
| Y, |
| U, |
| V, |
| } COMPONENT_TYPE; |
| |
| |
| /** |
| ****************************************************************************** |
| * @enum MBPART_PREDMODE_T |
| * @brief MbPartps_pred_mode_ctxt Table 7-11 to 7-14 |
| ****************************************************************************** |
| */ |
| typedef enum |
| { |
| MBPART_NA, |
| MBPART_I4x4, |
| MBPART_I8x8, |
| MBPART_I16x16, |
| MBPART_L0, |
| MBPART_L1, |
| MBPART_BI, |
| MBPART_DIRECT, |
| MBPART_IPCM, |
| }MBPART_PREDMODE_T; |
| |
| |
| typedef enum |
| { |
| I_NxN, |
| I_16x16_0_0_0, |
| I_16x16_1_0_0, |
| I_16x16_2_0_0, |
| I_16x16_3_0_0, |
| I_16x16_0_1_0, |
| I_16x16_1_1_0, |
| I_16x16_2_1_0, |
| I_16x16_3_1_0, |
| I_16x16_0_2_0, |
| I_16x16_1_2_0, |
| I_16x16_2_2_0, |
| I_16x16_3_2_0, |
| I_16x16_0_0_1, |
| I_16x16_1_0_1, |
| I_16x16_2_0_1, |
| I_16x16_3_0_1, |
| I_16x16_0_1_1, |
| I_16x16_1_1_1, |
| I_16x16_2_1_1, |
| I_16x16_3_1_1, |
| I_16x16_0_2_1, |
| I_16x16_1_2_1, |
| I_16x16_2_2_1, |
| I_16x16_3_2_1, |
| I_PCM, |
| }MBTYPE_ISLICE_T; |
| |
| typedef enum |
| { |
| P_L0_16x16, |
| P_L0_L0_16x8, |
| P_L0_L0_8x16, |
| P_8x8, |
| P_8x8REF0, |
| P_SKIP |
| }MBTYPE_PSLICE_T; |
| |
| typedef enum |
| { |
| B_DIRECT_16x16, |
| B_L0_16x16, |
| B_L1_16x16, |
| B_BI_16x16, |
| B_L0_L0_16x8, |
| B_L0_L0_8x16, |
| B_L1_L1_16x8, |
| B_L1_L1_8x16, |
| B_L0_L1_16x8, |
| B_L0_L1_8x16, |
| B_L1_L0_16x8, |
| B_L1_L0_8x16, |
| B_L0_BI_16x8, |
| B_L0_BI_8x16, |
| B_L1_BI_16x8, |
| B_L1_BI_8x16, |
| B_BI_L0_16x8, |
| B_BI_L0_8x16, |
| B_BI_L1_16x8, |
| B_BI_L1_8x16, |
| B_BI_BI_16x8, |
| B_BI_BI_8x16, |
| B_8x8, |
| B_SKIP, |
| }MBTYPE_BSLICE_T; |
| |
| |
| typedef enum |
| { |
| P_L0_8x8, |
| P_L0_8x4, |
| P_L0_4x8, |
| P_L0_4x4, |
| }SUBMBTYPE_PSLICE_T; |
| |
| typedef enum |
| { |
| B_DIRECT_8x8, |
| B_L0_8x8, |
| B_L1_8x8, |
| B_BI_8x8, |
| B_L0_8x4, |
| B_L0_4x8, |
| B_L1_8x4, |
| B_L1_4x8, |
| B_BI_8x4, |
| B_BI_4x8, |
| B_L0_4x4, |
| B_L1_4x4, |
| B_BI_4x4, |
| }SUBMBTYPE_BSLICE_T; |
| |
| /** |
| * DC Mode pattern for 4 4x4 sub blocks in an MB row |
| */ |
| #define DC_I16X16_MB_ROW (DC_I16x16 << 24) | (DC_I16x16 << 16) | \ |
| (DC_I16x16 << 8) | DC_I16x16 |
| |
| |
| |
| /*****************************************************************************/ |
| /* Constant Macros */ |
| /*****************************************************************************/ |
| |
| /*****************************************************************************/ |
| /* Reference frame defs */ |
| /*****************************************************************************/ |
| /* Maximum DPB size */ |
| #define MAX_DPB_SIZE 16 |
| |
| /* Maximum mmco commands in slice header */ |
| #define MAX_MMCO_COMMANDS 32 |
| |
| /* Maximum reference reorder idc */ |
| #define MAX_MODICATION_IDC 32 |
| |
| /*****************************************************************************/ |
| /* SPS restrictions */ |
| /*****************************************************************************/ |
| |
| /* Number of SPS allowed */ |
| /* An extra buffer is allocated to write the parsed data |
| * It is copied to the appropriate location later */ |
| #define MAX_SPS_CNT (32 + 1) |
| |
| /* Maximum long term reference pics */ |
| #define MAX_LTREF_PICS_SPS 16 |
| |
| /* Maximum short term reference pics */ |
| #define MAX_STREF_PICS_SPS 64 |
| |
| |
| /*****************************************************************************/ |
| /* PPS restrictions */ |
| /*****************************************************************************/ |
| |
| /* Number of PPS allowed */ |
| /* An extra buffer is allocated to write the parsed data |
| * It is copied to the appropriate location later */ |
| #define MAX_PPS_CNT (256 + 1) |
| |
| /*****************************************************************************/ |
| /* Macro definitions for sizes of MB, PU, TU, CU */ |
| /*****************************************************************************/ |
| #define MB_SIZE 16 |
| #define BLK8x8SIZE 8 |
| #define BLK_SIZE 4 |
| |
| |
| /* TU Size Range */ |
| #define MAX_TU_SIZE 8 |
| #define MIN_TU_SIZE 4 |
| |
| /* Max Transform Size */ |
| #define MAX_TRANS_SIZE (MAX_TU_SIZE*MAX_TU_SIZE) |
| |
| /* PU Size Range */ |
| #define MAX_PU_SIZE 16 |
| #define MIN_PU_SIZE 4 |
| |
| /* Number of max TU in a MB row */ |
| #define MAX_TU_IN_MB_ROW ((MB_SIZE / MIN_TU_SIZE)) |
| |
| /* Number of max PU in a CTb row */ |
| #define MAX_PU_IN_MB_ROW ((MB_SIZE / MIN_PU_SIZE)) |
| |
| |
| /* Number of max PU in a MB */ |
| /*****************************************************************************/ |
| /* Note though for 64 x 64 MB, Max PU in MB is 128, in order to store */ |
| /* intra pred info, 256 entries are needed */ |
| /*****************************************************************************/ |
| #define MAX_PU_IN_MB ((MB_SIZE / MIN_PU_SIZE) * \ |
| (MB_SIZE / MIN_PU_SIZE)) |
| |
| /* Number of max TU in a MB */ |
| #define MAX_TU_IN_MB ((MB_SIZE / MIN_TU_SIZE) * \ |
| (MB_SIZE / MIN_TU_SIZE)) |
| |
| |
| |
| /** |
| * Maximum transform depths |
| */ |
| #define MAX_TRAFO_DEPTH 5 |
| |
| #define MAX_DC_4x4_SUBBLK_LUMA 1 |
| #define MAX_AC_4x4_SUBBLK_LUMA 16 |
| #define MAX_DC_4x4_SUBBLK_CHROMA 2 |
| #define MAX_AC_4x4_SUBBLK_CHROMA 8 |
| |
| #define MAX_4x4_SUBBLKS (MAX_DC_4x4_SUBBLK_LUMA + MAX_DC_4x4_SUBBLK_CHROMA +\ |
| MAX_AC_4x4_SUBBLK_LUMA + MAX_AC_4x4_SUBBLK_CHROMA) |
| |
| /* Max number of deblocking edges */ |
| #define MAX_VERT_DEBLK_EDGES ((MB_SIZE/8) * (MB_SIZE/4)) |
| #define MAX_HORZ_DEBLK_EDGES ((MB_SIZE/4) * (MB_SIZE/8)) |
| |
| /* Qp can not change below 8x8 level */ |
| #define MAX_DEBLK_QP_CNT ((MB_SIZE/8) * (MB_SIZE/8)) |
| |
| /*****************************************************************************/ |
| /* Parsing related macros */ |
| /*****************************************************************************/ |
| #define SUBBLK_COEFF_CNT 16 |
| |
| /* Quant and Trans defs */ |
| |
| /*****************************************************************************/ |
| /* Sizes for Transform functions */ |
| /*****************************************************************************/ |
| #define TRANS_SIZE_4 4 |
| #define TRANS_SIZE_8 8 |
| #define TRANS_SIZE_16 16 |
| #define TRANS_SIZE_32 32 |
| |
| |
| #define IT_SHIFT_STAGE_1 7 |
| #define IT_SHIFT_STAGE_2 12 |
| |
| /** |
| * @breif Maximum transform dynamic range (excluding sign bit) |
| */ |
| #define MAX_TR_DYNAMIC_RANGE 15 |
| |
| /** |
| * @brief Q(QP%6) * IQ(QP%6) = 2^20 |
| */ |
| #define QUANT_IQUANT_SHIFT 20 |
| |
| /** |
| * @breif Q factor for Qp%6 multiplication |
| */ |
| #define QUANT_SHIFT 14 |
| |
| /** |
| * @breif Q shift factor for flat rescale matrix weights |
| */ |
| #define FLAT_RESCALE_MAT_Q_SHIFT 11 |
| |
| /** |
| * @breif Scaling matrix is represented in Q15 format |
| */ |
| #define SCALING_Q_SHIFT 15 |
| |
| /** |
| * @brief rounding factor for quantization represented in Q9 format |
| */ |
| #define QUANT_ROUND_FACTOR_Q 9 |
| |
| /** |
| * @brief Minimum qp supported in H264 spec |
| */ |
| #define MIN_H264_QP 0 |
| |
| /** |
| * @brief Maximum qp supported in H264 spec |
| */ |
| #define MAX_H264_QP 51 |
| |
| /** |
| * @breif Total number of transform sizes |
| * used for sizeID while getting scale matrix |
| */ |
| #define NUM_UNIQUE_TRANS_SIZE 4 |
| |
| /** |
| * @breif Maximum number of bits in frameNumber signaling |
| */ |
| #define MAX_BITS_IN_FRAME_NUM 16 |
| |
| /** |
| * @breif Maximum number of bits in POC LSB signaling |
| */ |
| #define MAX_BITS_IN_POC_LSB 16 |
| |
| |
| /** |
| * @breif Maximum PIC Order Count type |
| */ |
| #define MAX_PIC_ORDER_COUNT_TYPE 2 |
| |
| |
| /** |
| * @breif Maximum Weighted bipred idc |
| */ |
| #define MAX_WEIGHT_BIPRED_IDC 2 |
| |
| /*****************************************************************************/ |
| /* Number of scaling matrices for each transform size */ |
| /*****************************************************************************/ |
| #define SCALE_MAT_CNT_TRANS_SIZE_4 6 |
| #define SCALE_MAT_CNT_TRANS_SIZE_8 6 |
| #define SCALE_MAT_CNT_TRANS_SIZE_16 6 |
| #define SCALE_MAT_CNT_TRANS_SIZE_32 2 |
| |
| /* Maximum number of scale matrices for a given transform size */ |
| #define SCALE_MAT_CNT_MAX_PER_TRANS_SIZE 6 |
| |
| /* Total number of scale matrices */ |
| #define TOTAL_SCALE_MAT_COUNT (SCALE_MAT_CNT_TRANS_SIZE_4 + \ |
| SCALE_MAT_CNT_TRANS_SIZE_8 + \ |
| SCALE_MAT_CNT_TRANS_SIZE_16 + \ |
| SCALE_MAT_CNT_TRANS_SIZE_32) |
| |
| |
| /*****************************************************************************/ |
| /* Intra pred Macros */ |
| /*****************************************************************************/ |
| /** Planar Intra prediction mode */ |
| #define INTRA_PLANAR 0 |
| |
| /** DC Intra prediction mode */ |
| #define INTRA_DC 1 |
| |
| /** Gives angular mode for intra prediction */ |
| #define INTRA_ANGULAR(x) (x) |
| |
| /** Following is used to signal no intra prediction in case of pcm blocks |
| */ |
| #define INTRA_PRED_NONE 63 |
| |
| |
| /** Following is used to signal no intra prediction is needed for first three |
| * 4x4 luma blocks in case of 4x4 TU sizes |
| * Also used in pcm cases |
| */ |
| #define INTRA_PRED_CHROMA_IDX_NONE 7 |
| |
| |
| /** |
| ****************************************************************************** |
| * @brief neighbor availability masks |
| ****************************************************************************** |
| */ |
| #define LEFT_MB_AVAILABLE_MASK 0x01 |
| #define TOP_LEFT_MB_AVAILABLE_MASK 0x02 |
| #define TOP_MB_AVAILABLE_MASK 0x04 |
| #define TOP_RIGHT_MB_AVAILABLE_MASK 0x08 |
| |
| #endif /* IH264_DEFS_H_ */ |