/***************************************************************************************
|
|
***************************************************************************************/
|
#ifndef _sps_pps_H_
|
#define _sps_pps_H_
|
|
#if defined (__cplusplus)
|
extern "C" {
|
#endif
|
|
typedef struct mpeg_header
|
{
|
unsigned char start_code_prefix[5];
|
}mpeg_header_t; //4
|
/***
|
* Sequence parameter set
|
* ¿É²Î¿¼H264±ê×¼µÚ7½ÚºÍ¸½Â¼D E
|
*/
|
#define Extended_SAR 255
|
typedef struct vui_parameters{
|
int aspect_ratio_info_present_flag; //0 u(1)
|
int aspect_ratio_idc; //0 u(8)
|
int sar_width; //0 u(16)
|
int sar_height; //0 u(16)
|
int overscan_info_present_flag; //0 u(1)
|
int overscan_appropriate_flag; //0 u(1)
|
int video_signal_type_present_flag; //0 u(1)
|
int video_format; //0 u(3)
|
int video_full_range_flag; //0 u(1)
|
int colour_description_present_flag; //0 u(1)
|
int colour_primaries; //0 u(8)
|
int transfer_characteristics; //0 u(8)
|
int matrix_coefficients; //0 u(8)
|
int chroma_loc_info_present_flag; //0 u(1)
|
int chroma_sample_loc_type_top_field; //0 ue(v)
|
int chroma_sample_loc_type_bottom_field; //0 ue(v)
|
int timing_info_present_flag; //0 u(1)
|
uint32_t num_units_in_tick; //0 u(32)
|
uint32_t time_scale; //0 u(32)
|
int fixed_frame_rate_flag; //0 u(1)
|
int nal_hrd_parameters_present_flag; //0 u(1)
|
int cpb_cnt_minus1; //0 ue(v)
|
int bit_rate_scale; //0 u(4)
|
int cpb_size_scale; //0 u(4)
|
int bit_rate_value_minus1[16]; //0 ue(v)
|
int cpb_size_value_minus1[16]; //0 ue(v)
|
int cbr_flag[16]; //0 u(1)
|
int initial_cpb_removal_delay_length_minus1; //0 u(5)
|
int cpb_removal_delay_length_minus1; //0 u(5)
|
int dpb_output_delay_length_minus1; //0 u(5)
|
int time_offset_length; //0 u(5)
|
int vcl_hrd_parameters_present_flag; //0 u(1)
|
int low_delay_hrd_flag; //0 u(1)
|
int pic_struct_present_flag; //0 u(1)
|
int bitstream_restriction_flag; //0 u(1)
|
int motion_vectors_over_pic_boundaries_flag; //0 ue(v)
|
int max_bytes_per_pic_denom; //0 ue(v)
|
int max_bits_per_mb_denom; //0 ue(v)
|
int log2_max_mv_length_horizontal; //0 ue(v)
|
int log2_max_mv_length_vertical; //0 ue(v)
|
int num_reorder_frames; //0 ue(v)
|
int max_dec_frame_buffering; //0 ue(v)
|
}vui_parameters_t;
|
|
typedef struct SPS{
|
int profile_idc;
|
int constraint_set0_flag;
|
int constraint_set1_flag;
|
int constraint_set2_flag;
|
int constraint_set3_flag;
|
int reserved_zero_4bits;
|
int level_idc;
|
int seq_parameter_set_id; //ue(v)
|
int chroma_format_idc; //ue(v)
|
int separate_colour_plane_flag; //u(1)
|
int bit_depth_luma_minus8; //0 ue(v)
|
int bit_depth_chroma_minus8; //0 ue(v)
|
int qpprime_y_zero_transform_bypass_flag; //0 u(1)
|
int seq_scaling_matrix_present_flag; //0 u(1)
|
int seq_scaling_list_present_flag[12];
|
int UseDefaultScalingMatrix4x4Flag[6];
|
int UseDefaultScalingMatrix8x8Flag[6];
|
int ScalingList4x4[6][16];
|
int ScalingList8x8[6][64];
|
int log2_max_frame_num_minus4; //0 ue(v)
|
int pic_order_cnt_type; //0 ue(v)
|
int log2_max_pic_order_cnt_lsb_minus4; //
|
int delta_pic_order_always_zero_flag; //u(1)
|
int offset_for_non_ref_pic; //se(v)
|
int offset_for_top_to_bottom_field; //se(v)
|
int num_ref_frames_in_pic_order_cnt_cycle; //ue(v)
|
int offset_for_ref_frame_array[16]; //se(v)
|
int num_ref_frames; //ue(v)
|
int gaps_in_frame_num_value_allowed_flag; //u(1)
|
int pic_width_in_mbs_minus1; //ue(v)
|
int pic_height_in_map_units_minus1; //u(1)
|
int frame_mbs_only_flag; //0 u(1)
|
int mb_adaptive_frame_field_flag; //0 u(1)
|
int direct_8x8_inference_flag; //0 u(1)
|
int frame_cropping_flag; //u(1)
|
int frame_crop_left_offset; //ue(v)
|
int frame_crop_right_offset; //ue(v)
|
int frame_crop_top_offset; //ue(v)
|
int frame_crop_bottom_offset; //ue(v)
|
int vui_parameters_present_flag; //u(1)
|
vui_parameters_t vui_parameters;
|
}SPS;
|
|
/***
|
* Picture parameter set
|
*/
|
typedef struct PPS{
|
int pic_parameter_set_id;
|
int seq_parameter_set_id;
|
int entropy_coding_mode_flag;
|
int pic_order_present_flag;
|
int num_slice_groups_minus1;
|
int slice_group_map_type;
|
int run_length_minus1[32];
|
int top_left[32];
|
int bottom_right[32];
|
int slice_group_change_direction_flag;
|
int slice_group_change_rate_minus1;
|
int pic_size_in_map_units_minus1;
|
int slice_group_id[32];
|
int num_ref_idx_10_active_minus1;
|
int num_ref_idx_11_active_minus1;
|
int weighted_pred_flag;
|
int weighted_bipred_idc;
|
int pic_init_qp_minus26;
|
int pic_init_qs_minus26;
|
int chroma_qp_index_offset;
|
int deblocking_filter_control_present_flag;
|
int constrained_intra_pred_flag;
|
int redundant_pic_cnt_present_flag;
|
int transform_8x8_mode_flag;
|
int pic_scaling_matrix_present_flag;
|
int pic_scaling_list_present_flag[32];
|
int second_chroma_qp_index_offset;
|
int UseDefaultScalingMatrix4x4Flag[6];
|
int UseDefaultScalingMatrix8x8Flag[6];
|
int ScalingList4x4[6][16];
|
int ScalingList8x8[2][64];
|
}PPS;
|
|
typedef struct get_bit_context{
|
uint8_t *buf; /*Ö¸ÏòSPS start*/
|
int buf_size; /*SPS ³¤¶È*/
|
int bit_pos; /*bitÒѶÁȡλÖÃ*/
|
int total_bit; /*bit×ܳ¤¶È*/
|
int cur_bit_pos; /*µ±Ç°¶ÁȡλÖÃ*/
|
}get_bit_context;
|
|
|
/**
|
* @brief Function h264dec_seq_parameter_set() h264 SPS infomation ½âÎö
|
* @param[in] buf get_bit_context½á¹¹µÄbuf ptr, Ðèͬ²½00 00 00 01 X7ºó´«Èë
|
* @param[in] sps_ptr spsÖ¸Õ룬±£´æSPSÐÅÏ¢
|
* @retval 0: success, -1 : failure
|
* @pre
|
* @post
|
* @note:
|
* Ó÷¨:(α´úÂë)
|
* get_bit_context buffer; //ÉêÇëÒ»¸öget_bit_context½á¹¹buffer
|
* SPS sps_buffer; //ÉêÇëÒ»¸öSPS½á¹¹sps_buffer
|
* .......
|
* buffer.buf = SPS_start //esÍ·±êʶΪ00 00 00 01 x7ÒÔºóµÄÊý¾Ý£¬²»ÒªÕâǰ5×Ö½Ú
|
* buffer.buf_size = SPS_len //SPS´ý·ÖÎöÊý¾Ý³¤¶È
|
* ......
|
* h264dec_seq_parameter_set(&buffer, &sps_buffer);
|
*
|
*/
|
int h264dec_seq_parameter_set(void *buf_ptr, SPS *sps_ptr);
|
|
|
/**
|
* @brief Function h264dec_picture_parameter_set() h264 PPS infomation ½âÎö
|
* @param[in] buf buf ptr, Ðèͬ²½00 00 00 01 X8ºó´«Èë
|
* @param[in] pps_ptr ppsÖ¸Õ룬±£´æppsÐÅÏ¢
|
* @retval 0: success, -1 : failure
|
* @pre
|
* @post
|
* @note: Ó÷¨²Î¿¼sps½âÎö
|
*/
|
int h264dec_picture_parameter_set(void *buf, PPS *pps_ptr);
|
|
|
int h264_get_width(SPS *sps_ptr);
|
|
int h264_get_height(SPS *sps_ptr);
|
|
int h264_get_format(SPS *sps_ptr);
|
|
int h264_get_framerate(float *framerate,SPS *sps_ptr);
|
|
int h265dec_seq_parameter_set(void *buf, int* width,int* height);
|
|
|
// for mpeg-2
|
// sequence header
|
typedef struct _sequence_header_
|
{
|
unsigned int sequence_header_code; // 0x000001b3
|
|
unsigned int frame_rate_code : 4;
|
unsigned int aspect_ratio_information : 4;
|
unsigned int vertical_size_value : 12;
|
unsigned int horizontal_size_value : 12;
|
|
unsigned int marker_bit : 2;
|
unsigned int bit_rate_value : 30;
|
|
}sequence_header;
|
|
// sequence extension
|
typedef struct _sequence_extension_
|
{
|
unsigned int sequence_header_code; // 0x000001b5
|
|
unsigned int marker_bit : 1;
|
unsigned int bit_rate_extension: 12;
|
unsigned int vertical_size_extension : 2;
|
unsigned int horizontal_size_extension : 2;
|
unsigned int chroma_format : 2;
|
unsigned int progressive_sequence : 1;
|
unsigned int profile_and_level_indication : 8;
|
unsigned int extension_start_code : 4;
|
}sequence_extension;
|
|
|
void memcpy_sps_data(uint8_t *dst,uint8_t *src,int len);
|
|
////////////////////////////////////////////////////////
|
typedef struct slice_header
|
{
|
unsigned char start_code_prefix[4];
|
unsigned char nalu;
|
}slice_header_t; //5
|
|
|
void get_sps_pps_len(uint8_t *h264_data,int h264_len,int* sps_len,int* pps_len,int* Iframe_len);
|
void get_vps_sps_pps_len(uint8_t *h265_data,int h265_len,int* vps_len,int* sps_len,int* pps_len,int* Iframe_len);
|
|
bool is_VOL_header(mpeg_header_t* VOL);
|
bool is_sequence_header(mpeg_header_t* SH);
|
bool is_H264_IFrame_Data(uint8_t *h264_data,int h264_len);
|
bool is_h265_IFrame_Data(uint8_t *h265_data,int h265_len);
|
|
#if defined (__cplusplus)
|
}
|
#endif
|
|
#endif
|
|
/*_*/
|