/******************************************************************************
*
* 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_ */