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