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