2017-09-27 16:20:30 +08:00
|
|
|
|
#ifndef _SPSPARSER_H_
|
|
|
|
|
#define _SPSPARSER_H_
|
2017-04-01 16:35:56 +08:00
|
|
|
|
|
|
|
|
|
#if defined (__cplusplus)
|
|
|
|
|
extern "C" {
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#define QP_MAX_NUM (51 + 6*6) // The maximum supported qp
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Chromaticity coordinates of the source primaries.
|
|
|
|
|
*/
|
|
|
|
|
enum T_AVColorPrimaries {
|
|
|
|
|
AVCOL_PRI_RESERVED0 = 0,
|
|
|
|
|
AVCOL_PRI_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B
|
|
|
|
|
AVCOL_PRI_UNSPECIFIED = 2,
|
|
|
|
|
AVCOL_PRI_RESERVED = 3,
|
|
|
|
|
AVCOL_PRI_BT470M = 4, ///< also FCC Title 47 Code of Federal Regulations 73.682 (a)(20)
|
|
|
|
|
|
|
|
|
|
AVCOL_PRI_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM
|
|
|
|
|
AVCOL_PRI_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC
|
|
|
|
|
AVCOL_PRI_SMPTE240M = 7, ///< functionally identical to above
|
|
|
|
|
AVCOL_PRI_FILM = 8, ///< colour filters using Illuminant C
|
|
|
|
|
AVCOL_PRI_BT2020 = 9, ///< ITU-R BT2020
|
|
|
|
|
AVCOL_PRI_NB, ///< Not part of ABI
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Color Transfer Characteristic.
|
|
|
|
|
*/
|
|
|
|
|
enum T_AVColorTransferCharacteristic {
|
|
|
|
|
AVCOL_TRC_RESERVED0 = 0,
|
|
|
|
|
AVCOL_TRC_BT709 = 1, ///< also ITU-R BT1361
|
|
|
|
|
AVCOL_TRC_UNSPECIFIED = 2,
|
|
|
|
|
AVCOL_TRC_RESERVED = 3,
|
|
|
|
|
AVCOL_TRC_GAMMA22 = 4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
|
|
|
|
|
AVCOL_TRC_GAMMA28 = 5, ///< also ITU-R BT470BG
|
|
|
|
|
AVCOL_TRC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC
|
|
|
|
|
AVCOL_TRC_SMPTE240M = 7,
|
|
|
|
|
AVCOL_TRC_LINEAR = 8, ///< "Linear transfer characteristics"
|
|
|
|
|
AVCOL_TRC_LOG = 9, ///< "Logarithmic transfer characteristic (100:1 range)"
|
|
|
|
|
AVCOL_TRC_LOG_SQRT = 10, ///< "Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)"
|
|
|
|
|
AVCOL_TRC_IEC61966_2_4 = 11, ///< IEC 61966-2-4
|
|
|
|
|
AVCOL_TRC_BT1361_ECG = 12, ///< ITU-R BT1361 Extended Colour Gamut
|
|
|
|
|
AVCOL_TRC_IEC61966_2_1 = 13, ///< IEC 61966-2-1 (sRGB or sYCC)
|
|
|
|
|
AVCOL_TRC_BT2020_10 = 14, ///< ITU-R BT2020 for 10 bit system
|
|
|
|
|
AVCOL_TRC_BT2020_12 = 15, ///< ITU-R BT2020 for 12 bit system
|
|
|
|
|
AVCOL_TRC_NB, ///< Not part of ABI
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* YUV tColorspace type.
|
|
|
|
|
*/
|
|
|
|
|
enum T_AVColorSpace {
|
|
|
|
|
AVCOL_SPC_RGB = 0, ///< order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB)
|
|
|
|
|
AVCOL_SPC_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B
|
|
|
|
|
AVCOL_SPC_UNSPECIFIED = 2,
|
|
|
|
|
AVCOL_SPC_RESERVED = 3,
|
|
|
|
|
AVCOL_SPC_FCC = 4, ///< FCC Title 47 Code of Federal Regulations 73.682 (a)(20)
|
|
|
|
|
AVCOL_SPC_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
|
|
|
|
|
AVCOL_SPC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
|
|
|
|
|
AVCOL_SPC_SMPTE240M = 7,
|
|
|
|
|
AVCOL_SPC_YCOCG = 8, ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16
|
|
|
|
|
AVCOL_SPC_BT2020_NCL = 9, ///< ITU-R BT2020 non-constant luminance system
|
|
|
|
|
AVCOL_SPC_BT2020_CL = 10, ///< ITU-R BT2020 constant luminance system
|
|
|
|
|
AVCOL_SPC_NB, ///< Not part of ABI
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* rational number numerator/denominator
|
|
|
|
|
*/
|
|
|
|
|
typedef struct T_AVRational{
|
|
|
|
|
int num; ///< numerator
|
|
|
|
|
int den; ///< denominator
|
|
|
|
|
} T_AVRational;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***
|
|
|
|
|
* Sequence parameter set
|
|
|
|
|
* ¿É²Î¿¼H264±ê×¼µÚ7½ÚºÍ¸½Â¼D E
|
|
|
|
|
*/
|
|
|
|
|
#define Extended_SAR 255
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sequence parameter set
|
|
|
|
|
*/
|
|
|
|
|
typedef struct T_SPS {
|
|
|
|
|
unsigned int uiSpsId;
|
|
|
|
|
int iProfileIdc;
|
|
|
|
|
int iLevelIdc;
|
|
|
|
|
int iChromaFormatIdc;
|
|
|
|
|
int iTransformBypass; ///< qpprime_y_zero_transform_bypass_flag
|
|
|
|
|
int iLog2MaxFrameNum; ///< log2_max_frame_num_minus4 + 4
|
|
|
|
|
int iPocType; ///< pic_order_cnt_type
|
|
|
|
|
int iLog2MaxPocLsb; ///< log2_max_pic_order_cnt_lsb_minus4
|
|
|
|
|
int iDeltaPicOrderAlwaysZeroFlag;
|
|
|
|
|
int iOffsetForNonRefPic;
|
|
|
|
|
int iOffsetForTopToBottomField;
|
|
|
|
|
int iPocCycleLength; ///< num_ref_frames_in_pic_order_cnt_cycle
|
|
|
|
|
int iRefFrameCount; ///< num_ref_frames
|
|
|
|
|
int iGapsInFrameNumAllowedFlag;
|
|
|
|
|
int iMbWidth; ///< pic_width_in_mbs_minus1 + 1
|
|
|
|
|
int iMbHeight; ///< pic_height_in_map_units_minus1 + 1
|
|
|
|
|
int iFrameMbsOnlyFlag;
|
|
|
|
|
int iMbAff; ///< mb_adaptive_frame_field_flag
|
|
|
|
|
int iDirect8x8InferenceFlag;
|
|
|
|
|
int iCrop; ///< frame_cropping_flag
|
|
|
|
|
|
|
|
|
|
/* those 4 are already in luma samples */
|
|
|
|
|
unsigned int uiCropLeft; ///< frame_cropping_rect_left_offset
|
|
|
|
|
unsigned int uiCropRight; ///< frame_cropping_rect_right_offset
|
|
|
|
|
unsigned int uiCropTop; ///< frame_cropping_rect_top_offset
|
|
|
|
|
unsigned int uiCropBottom; ///< frame_cropping_rect_bottom_offset
|
|
|
|
|
int iVuiParametersPresentFlag;
|
|
|
|
|
T_AVRational tSar;
|
|
|
|
|
int iVideoSignalTypePresentFlag;
|
|
|
|
|
int iFullRange;
|
|
|
|
|
int iColourDescriptionPresentFlag;
|
|
|
|
|
enum T_AVColorPrimaries tColorPrimaries;
|
|
|
|
|
enum T_AVColorTransferCharacteristic tColorTrc;
|
|
|
|
|
enum T_AVColorSpace tColorspace;
|
|
|
|
|
int iTimingInfoPresentFlag;
|
|
|
|
|
uint32_t u32NumUnitsInTick;
|
|
|
|
|
uint32_t u32TimeScale;
|
|
|
|
|
int iFixedFrameRateFlag;
|
|
|
|
|
short asOffsetForRefFrame[256]; // FIXME dyn aloc?
|
|
|
|
|
int iBitstreamRestrictionFlag;
|
|
|
|
|
int iNumReorderFrames;
|
|
|
|
|
int iScalingMatrixPresent;
|
|
|
|
|
uint8_t aau8ScalingMatrix4[6][16];
|
|
|
|
|
uint8_t aau8ScalingMatrix8[6][64];
|
|
|
|
|
int iNalHrdParametersPresentFlag;
|
|
|
|
|
int iVclHrdParametersPresentFlag;
|
|
|
|
|
int iPicStructPresentFlag;
|
|
|
|
|
int iTimeOffsetLength;
|
|
|
|
|
int iCpbCnt; ///< See H.264 E.1.2
|
|
|
|
|
int iInitialCpbRemovalDelayLength; ///< initial_cpb_removal_delay_length_minus1 + 1
|
|
|
|
|
int iCpbRemovalDelayLength; ///< cpb_removal_delay_length_minus1 + 1
|
|
|
|
|
int iDpbOutputDelayLength; ///< dpb_output_delay_length_minus1 + 1
|
|
|
|
|
int iBitDepthLuma; ///< bit_depth_luma_minus8 + 8
|
|
|
|
|
int iBitDepthChroma; ///< bit_depth_chroma_minus8 + 8
|
|
|
|
|
int iResidualColorTransformFlag; ///< residual_colour_transform_flag
|
|
|
|
|
int iConstraintSetFlags; ///< constraint_set[0-3]_flag
|
|
|
|
|
int iNew; ///< flag to keep track if the decoder context needs re-init due to changed SPS
|
|
|
|
|
} T_SPS;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Picture parameter set
|
|
|
|
|
*/
|
|
|
|
|
typedef struct T_PPS {
|
|
|
|
|
unsigned int uiSpsId;
|
|
|
|
|
int iCabac; ///< entropy_coding_mode_flag
|
|
|
|
|
int iPicOrderPresent; ///< pic_order_present_flag
|
|
|
|
|
int iSliceGroupCount; ///< num_slice_groups_minus1 + 1
|
|
|
|
|
int iMbSliceGroupMapType;
|
|
|
|
|
unsigned int auiRefCount[2]; ///< num_ref_idx_l0/1_active_minus1 + 1
|
|
|
|
|
int iWeightedPred; ///< weighted_pred_flag
|
|
|
|
|
int iWeightedBipredIdc;
|
|
|
|
|
int iInitQp; ///< pic_init_qp_minus26 + 26
|
|
|
|
|
int iInitQs; ///< pic_init_qs_minus26 + 26
|
|
|
|
|
int aiChromaQpIndexOffset[2];
|
|
|
|
|
int iDeblockingFilterParametersPresent; ///< deblocking_filter_parameters_present_flag
|
|
|
|
|
int iConstrainedIntraPred; ///< constrained_intra_pred_flag
|
|
|
|
|
int iRedundantPicCntPresent; ///< redundant_pic_cnt_present_flag
|
|
|
|
|
int iTransform8x8Mode; ///< transform_8x8_mode_flag
|
|
|
|
|
uint8_t aau8ScalingMatrix4[6][16];
|
|
|
|
|
uint8_t aau8ScalingMatrix8[6][64];
|
|
|
|
|
uint8_t u8ChromaQpTable[2][QP_MAX_NUM+1]; ///< pre-scaled (with aiChromaQpIndexOffset) version of qp_table
|
|
|
|
|
int iChromaQpDiff;
|
|
|
|
|
} T_PPS;
|
|
|
|
|
|
|
|
|
|
typedef struct T_GetBitContext{
|
|
|
|
|
uint8_t *pu8Buf; /*Ö¸ÏòSPS start*/
|
|
|
|
|
int iBufSize; /*SPS ³¤¶È*/
|
|
|
|
|
int iBitPos; /*bitÒѶÁȡλÖÃ*/
|
|
|
|
|
int iTotalBit; /*bit×ܳ¤¶È*/
|
|
|
|
|
int iCurBitPos; /*µ±Ç°¶ÁȡλÖÃ*/
|
|
|
|
|
}T_GetBitContext;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int h264DecSeqParameterSet(void *pvBuf, T_SPS *ptSps);
|
|
|
|
|
void h264GetWidthHeight(T_SPS *ptSps, int *piWidth, int *piHeight);
|
|
|
|
|
void h264GeFramerate(T_SPS *ptSps, float *pfFramerate);
|
|
|
|
|
|
|
|
|
|
#if defined (__cplusplus)
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
2017-09-27 16:20:30 +08:00
|
|
|
|
#endif //_SPS_PPS_H_
|