1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee//#define H264_PARSE_SPS_C 2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee//#ifdef H264_PARSE_SPS_C 3bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "h264.h" 5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "h264parse.h" 6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 8bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/// SPS extension unit (unit_type = 13) 9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/// 10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 11bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeh264_Status h264_Parse_SeqParameterSet_Extension(void *parent,h264_Info * pInfo) 12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*h264_SPS_Extension_RBSP_t* SPS_ext = pInfo->p_active_SPS_ext; 14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS_ext->seq_parameter_set_id = h264_GetVLCElement(pInfo, false); 16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS_ext->seq_parameter_set_id > MAX_SEQ_PARAMS-1) 17bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return H264_SPS_ERROR; 19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS_ext->aux_format_idc = h264_GetVLCElement(pInfo, false); 21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS_ext->aux_format_idc > 3) 22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return H264_SPS_ERROR; 24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS_ext->aux_format_idc != 0) 26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS_ext->bit_depth_aux_minus8 = h264_GetVLCElement(pInfo, false); 28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS_ext->bit_depth_aux_minus8 + 8 > 12) 29bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 30bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return H264_SPS_ERROR; 31bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 33bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS_ext->alpha_incr_flag = h264_GetBits(pInfo, 1, "alpha_incr_flag"); 34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS_ext->alpha_incr_flag > 1) 35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return H264_SPS_ERROR; 37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 38bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS_ext->alpha_opaque_value = h264_GetBits(pInfo,(SPS_ext->bit_depth_aux_minus8+8+1), "alpha_opaque_value"); //+8 to get the bit_depth value 40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS_ext->alpha_transparent_value = h264_GetBits(pInfo,(SPS_ext->bit_depth_aux_minus8+8+1), "alpha_transparent_value"); //+8 to get the bit_depth value 41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS_ext->additional_extension_flag = h264_GetBits(pInfo, 1, "additional_extension_flag"); 43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee*/ 44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return H264_STATUS_OK; 45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 49bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeh264_Status h264_Parse_HRD_Parameters(void *parent, h264_Info* pInfo, int nal_hrd,seq_param_set_used_ptr SPS, vui_seq_parameters_t_not_used_ptr pVUI_Seq_Not_Used) 50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //seq_param_set_ptr SPS = pInfo->p_active_SPS; 52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t i = 0; 53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t code; 54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(nal_hrd) 57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.nal_hrd_cpb_cnt_minus1 = h264_GetVLCElement(parent, pInfo, false); 59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->sps_disp.vui_seq_parameters.nal_hrd_cpb_cnt_minus1 >= MAX_CPB_CNT) 61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return H264_SPS_ERROR; 63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 8); 66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->nal_hrd_bit_rate_scale = (uint8_t)(code>>4); 67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->nal_hrd_cpb_size_scale = (uint8_t)(code & 0xf); 68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(i=0; i<=SPS->sps_disp.vui_seq_parameters.nal_hrd_cpb_cnt_minus1; i++) 70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->nal_hrd_parameters.bit_rate_value_minus1[i] = h264_GetVLCElement(parent, pInfo, false); 72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->nal_hrd_parameters.cpb_size_value_minus1[i] = h264_GetVLCElement(parent, pInfo, false); 73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->nal_hrd_parameters.cbr_flag[i] = (uint8_t)code; 76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if( viddec_pm_get_bits(parent, &code, 20) == -1) 79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return H264_SPS_ERROR; 80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.nal_hrd_initial_cpb_removal_delay_length_minus1 = (uint8_t)((code>>15)&0x1f); 82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.nal_hrd_cpb_removal_delay_length_minus1 = (uint8_t)((code>>10)&0x1f);; 83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.nal_hrd_dpb_output_delay_length_minus1 = (uint8_t)((code>>5)&0x1f);; 84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.nal_hrd_time_offset_length = (uint8_t)(code&0x1f);; 85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.vcl_hrd_cpb_cnt_minus1 = h264_GetVLCElement(parent, pInfo, false); 90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->sps_disp.vui_seq_parameters.vcl_hrd_cpb_cnt_minus1 >= MAX_CPB_CNT) 92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return H264_SPS_ERROR; 94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 8); 97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->vcl_hrd_bit_rate_scale = (uint8_t)(code>>4); 98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->vcl_hrd_cpb_size_scale = (uint8_t)(code&0xf); 99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(i=0; i<=SPS->sps_disp.vui_seq_parameters.vcl_hrd_cpb_cnt_minus1; i++) 101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->vcl_hrd_parameters.bit_rate_value_minus1[i] = h264_GetVLCElement(parent, pInfo, false); 103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->vcl_hrd_parameters.cpb_size_value_minus1[i] = h264_GetVLCElement(parent, pInfo, false); 104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->vcl_hrd_parameters.cbr_flag[i] = (uint8_t)code; 106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if( viddec_pm_get_bits(parent, &code, 20) == -1) 109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return H264_SPS_ERROR; 110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.vcl_hrd_initial_cpb_removal_delay_length_minus1 = (uint8_t)((code>>15)&0x1f); 112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.vcl_hrd_cpb_removal_delay_length_minus1 = (uint8_t)((code>>10)&0x1f);; 113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.vcl_hrd_dpb_output_delay_length_minus1 = (uint8_t)((code>>5)&0x1f);; 114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.vcl_hrd_time_offset_length = (uint8_t)(code&0x1f);; 115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return H264_STATUS_OK; 118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 122bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeh264_Status h264_Parse_Vui_Parameters(void *parent, h264_Info* pInfo, seq_param_set_used_ptr SPS, vui_seq_parameters_t_not_used_ptr pVUI_Seq_Not_Used) 123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Status ret = H264_STATUS_OK; 125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //seq_param_set_ptr SPS = pInfo->p_active_SPS; 126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t nal_hrd = 0; 127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t code; 128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee do { 130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.aspect_ratio_info_present_flag = (uint8_t)code; 132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->sps_disp.vui_seq_parameters.aspect_ratio_info_present_flag) 135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 8); 137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.aspect_ratio_idc = (uint8_t)code; 138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->sps_disp.vui_seq_parameters.aspect_ratio_idc == h264_AR_Extended_SAR) 140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 16); 142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.sar_width = (uint16_t)code; 143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 16); 145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.sar_height = (uint16_t)code; 146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->overscan_info_present_flag = (uint8_t)code; 152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pVUI_Seq_Not_Used->overscan_info_present_flag) 154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->overscan_appropriate_flag = (uint8_t)code; 157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.video_signal_type_present_flag = (uint8_t)code; 161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->sps_disp.vui_seq_parameters.video_signal_type_present_flag) 163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 3); 165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.video_format = (uint8_t)code; 166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->video_full_range_flag = (uint8_t)code; 169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.colour_description_present_flag = (uint8_t)code; 172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->sps_disp.vui_seq_parameters.colour_description_present_flag) 174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 8); 176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.colour_primaries = (uint8_t)code; 177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 8); 179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.transfer_characteristics = (uint8_t)code; 180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 8); 182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->matrix_coefficients = (uint8_t)code; 183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->chroma_location_info_present_flag = (uint8_t)code; 188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pVUI_Seq_Not_Used->chroma_location_info_present_flag) 190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->chroma_sample_loc_type_top_field = h264_GetVLCElement(parent, pInfo, false); 192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->chroma_sample_loc_type_bottom_field = h264_GetVLCElement(parent, pInfo, false); 193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.timing_info_present_flag = (uint8_t)code; 197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->sps_disp.vui_seq_parameters.timing_info_present_flag == 1) 199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 32); 201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.num_units_in_tick = (uint32_t)code; 202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 32); 204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.time_scale = (uint32_t)code; 205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.fixed_frame_rate_flag = (uint8_t)code; 208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.nal_hrd_parameters_present_flag = (uint8_t)code; 212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->sps_disp.vui_seq_parameters.nal_hrd_parameters_present_flag == 1) 214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee nal_hrd = 1; 216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret |= h264_Parse_HRD_Parameters(parent,pInfo, nal_hrd,SPS, pVUI_Seq_Not_Used); 217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.vcl_hrd_parameters_present_flag = (uint8_t)code; 221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->sps_disp.vui_seq_parameters.vcl_hrd_parameters_present_flag == 1) 223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee nal_hrd = 0; 225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret |= h264_Parse_HRD_Parameters(parent,pInfo, nal_hrd,SPS, pVUI_Seq_Not_Used); 226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if((SPS->sps_disp.vui_seq_parameters.nal_hrd_parameters_present_flag == 1) || (SPS->sps_disp.vui_seq_parameters.vcl_hrd_parameters_present_flag == 1)) 229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.low_delay_hrd_flag = (uint8_t)code; 232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.pic_struct_present_flag = (uint8_t)code; 236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_pm_get_bits(parent, &code, 1) == -1) { 238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = H264_STATUS_ERROR; 239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.bitstream_restriction_flag = (uint8_t)code; 242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->sps_disp.vui_seq_parameters.bitstream_restriction_flag) 244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->motion_vectors_over_pic_boundaries_flag = (uint8_t)code; 247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->max_bytes_per_pic_denom = h264_GetVLCElement(parent, pInfo, false); 249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->max_bits_per_mb_denom = h264_GetVLCElement(parent, pInfo, false); 250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->log2_max_mv_length_horizontal = h264_GetVLCElement(parent, pInfo, false); 251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pVUI_Seq_Not_Used->log2_max_mv_length_vertical = h264_GetVLCElement(parent, pInfo, false); 252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.num_reorder_frames = h264_GetVLCElement(parent, pInfo, false); 253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_seq_parameters.max_dec_frame_buffering = h264_GetVLCElement(parent, pInfo, false); 254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->sps_disp.vui_seq_parameters.max_dec_frame_buffering == MAX_INT32_VALUE) 256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = H264_STATUS_ERROR; 257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }while (0); 259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 264bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeh264_Status h264_Parse_SeqParameterSet(void *parent,h264_Info * pInfo, seq_param_set_used_ptr SPS, vui_seq_parameters_t_not_used_ptr pVUI_Seq_Not_Used, int32_t* pOffset_ref_frame) 265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Status ret = H264_SPS_ERROR; 267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t i = 0, tmp = 0; 269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t PicWidthInMbs, PicHeightInMapUnits, FrameHeightInMbs; 270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t code = 0; 271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t data = 0; 272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //SPS->profile_idc = h264_GetBits(pInfo, 8, "Profile"); 274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 8); 275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->profile_idc = (uint8_t)code; 276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee switch(SPS->profile_idc) 278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_ProfileBaseline: 280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_ProfileMain: 281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_ProfileExtended: 282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_ProfileHigh10: 283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_ProfileHigh422: 284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_ProfileHigh444: 285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_ProfileHigh: 286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee default: 288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return H264_SPS_INVALID_PROFILE; 289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //SPS->constraint_set0_flag = h264_GetBits(pInfo, 1, "constraint_set0_flag"); 293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //SPS->constraint_set1_flag = h264_GetBits(pInfo, 1, "constraint_set1_flag"); //should be 1 294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //SPS->constraint_set2_flag = h264_GetBits(pInfo, 1, "constraint_set2_flag"); 295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //SPS->constraint_set3_flag = h264_GetBits(pInfo, 1, "constraint_set3_flag"); 296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 4); 298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->constraint_set_flags = (uint8_t)code; 299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// reserved_zero_4bits 301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, (uint32_t *)&code, 4); 302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 8); 304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->level_idc = (uint8_t)code; 305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee switch(SPS->level_idc) 307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level1b: 309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level1: 310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level11: 311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level12: 312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level13: 313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level2: 314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level21: 315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level22: 316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level3: 317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level31: 318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level32: 319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level4: 320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level41: 321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level42: 322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level5: 323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level51: 324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee default: 326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return H264_SPS_INVALID_LEVEL; 327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee do { 330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->seq_parameter_set_id = h264_GetVLCElement(parent, pInfo, false); 331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// seq_parameter_set_id ---[0,31] 333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->seq_parameter_set_id > MAX_NUM_SPS -1) 334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if((SPS->profile_idc == h264_ProfileHigh) || (SPS->profile_idc == h264_ProfileHigh10) || 337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (SPS->profile_idc == h264_ProfileHigh422) || (SPS->profile_idc == h264_ProfileHigh444) ) 338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// chroma_format_idc ---[0,3], currently we don't support 444, so [0,2] 340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee data = h264_GetVLCElement(parent, pInfo, false); 341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if( data > H264_CHROMA_422) 342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.chroma_format_idc = (uint8_t)data; 344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //if(SPS->sps_disp.chroma_format_idc == H264_CHROMA_444) {} 345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// bit_depth_luma_minus8 ---[0,4], -----only support 8-bit pixel 347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee data = h264_GetVLCElement(parent, pInfo, false); 348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if( data) 349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->bit_depth_luma_minus8 = (uint8_t)data; 351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// bit_depth_chroma_minus8 ---[0,4] 353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee data = h264_GetVLCElement(parent, pInfo, false); 354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if( data ) 355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->bit_depth_chroma_minus8 = (uint8_t)data; 357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->lossless_qpprime_y_zero_flag = (uint8_t)code; 361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->seq_scaling_matrix_present_flag = (uint8_t)code; 364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->seq_scaling_matrix_present_flag == 1) 366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //int n_ScalingList = (SPS->sps_disp.chroma_format_idc != H264_CHROMA_444) ? 8 : 12; 368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int n_ScalingList = 8; /// We do not support 444 currrently 369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(i=0; i<n_ScalingList; i++) 371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->seq_scaling_list_present_flag[i] = (uint8_t)code; 374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->seq_scaling_list_present_flag[i]) 376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(i<6) 378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Scaling_List(parent, SPS->ScalingList4x4[i], 16, &SPS->UseDefaultScalingMatrix4x4Flag[i], pInfo); 379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Scaling_List(parent, SPS->ScalingList8x8[i-6], 64, &SPS->UseDefaultScalingMatrix8x8Flag[i-6], pInfo); 381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.chroma_format_idc = 1; 388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->seq_scaling_matrix_present_flag = 0; 389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->bit_depth_luma_minus8 = 0; 391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->bit_depth_chroma_minus8 = 0; 392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_SetDefaultScalingLists(pInfo); 393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// log2_max_frame_num_minus4 ---[0,12] 396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee data = (h264_GetVLCElement(parent, pInfo, false)); 397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if( data > 12) 398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->log2_max_frame_num_minus4 = (uint8_t)data; 400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// pic_order_cnt_type ---- [0,2] 402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee data = h264_GetVLCElement(parent, pInfo, false); 403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if( data > 2) 404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->pic_order_cnt_type = (uint8_t)data; 406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->expectedDeltaPerPOCCycle = 0; 409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->pic_order_cnt_type == 0) { 410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->log2_max_pic_order_cnt_lsb_minus4 = h264_GetVLCElement(parent, pInfo, false); 411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else if(SPS->pic_order_cnt_type == 1){ 412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->delta_pic_order_always_zero_flag = (uint8_t)code; 414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->offset_for_non_ref_pic = h264_GetVLCElement(parent, pInfo, true); 416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->offset_for_top_to_bottom_field = h264_GetVLCElement(parent, pInfo, true); 417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// num_ref_frames_in_pic_order_cnt_cycle ---- [0,255] 419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee data = h264_GetVLCElement(parent, pInfo, false); 420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if( data > 255) 421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->num_ref_frames_in_pic_order_cnt_cycle = (uint8_t)data; 423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Alloc memory for frame offset -- FIXME 426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(i=0; i< SPS->num_ref_frames_in_pic_order_cnt_cycle; i++) 427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /////SPS->offset_for_ref_frame[i] could be removed from SPS 429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifndef USER_MODE 430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee tmp = h264_GetVLCElement(parent, pInfo, true); 431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pOffset_ref_frame[i]=tmp; 432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->expectedDeltaPerPOCCycle += tmp; 433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else 434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee tmp = h264_GetVLCElement(parent, pInfo, true); 435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->offset_for_ref_frame[i]=tmp; 436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->expectedDeltaPerPOCCycle += tmp; 437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// num_ref_frames ---[0,16] 442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee data = h264_GetVLCElement(parent, pInfo, false); 443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if( data > 16) 444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->num_ref_frames = (uint8_t)data; 446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->gaps_in_frame_num_value_allowed_flag = (uint8_t)code; 449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.pic_width_in_mbs_minus1 = h264_GetVLCElement(parent, pInfo, false); 452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.pic_height_in_map_units_minus1 = h264_GetVLCElement(parent, pInfo, false); 453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.frame_mbs_only_flag = (uint8_t)code; 455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// err check for size 457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee PicWidthInMbs = (SPS->sps_disp.pic_width_in_mbs_minus1 + 1); 458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee PicHeightInMapUnits = (SPS->sps_disp.pic_height_in_map_units_minus1 + 1); 459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee FrameHeightInMbs = SPS->sps_disp.frame_mbs_only_flag? PicHeightInMapUnits: (PicHeightInMapUnits<<1); 460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if((PicWidthInMbs < 2) || (PicWidthInMbs > 128) || (FrameHeightInMbs < 2) || (FrameHeightInMbs>128)) 461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(!SPS->sps_disp.frame_mbs_only_flag) 464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.mb_adaptive_frame_field_flag = (uint8_t)code; 467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //SPS->frame_height_in_mbs = (2-SPS->sps_disp.frame_mbs_only_flag)*(SPS->sps_disp.pic_height_in_map_units_minus1+1); 470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //SPS->pic_size_in_map_units = (SPS->sps_disp.pic_width_in_mbs_minus1+1)*SPS->sps_disp.frame_height_in_mbs; 471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.direct_8x8_inference_flag = (uint8_t)code; 474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_pm_get_bits(parent, &code, 1); 476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.frame_cropping_flag = (uint8_t)code; 477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->sps_disp.frame_cropping_flag) 479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.frame_crop_rect_left_offset = h264_GetVLCElement(parent, pInfo, false); 481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.frame_crop_rect_right_offset = h264_GetVLCElement(parent, pInfo, false); 482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.frame_crop_rect_top_offset = h264_GetVLCElement(parent, pInfo, false); 483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.frame_crop_rect_bottom_offset = h264_GetVLCElement(parent, pInfo, false); 484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// when frame_mbs_only_flag is equal to 0, direct_8x8_inference_flag shall be equal to 1 487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (SPS->sps_disp.frame_mbs_only_flag == 0 && SPS->sps_disp.direct_8x8_inference_flag == 0){ 488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ////// vui_parameters 492bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_pm_get_bits(parent, &code, 1) == -1) 493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee SPS->sps_disp.vui_parameters_present_flag = (uint8_t)code; 495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = H264_STATUS_OK; 496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SPS->sps_disp.vui_parameters_present_flag) 498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifndef VBP // Ignore VUI parsing result 500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ret = 501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Parse_Vui_Parameters(parent, pInfo, SPS, pVUI_Seq_Not_Used); 503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }while(0); 506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_Parse_rbsp_trailing_bits(pInfo); 508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 510bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee//#endif 513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 514