/src/libavc/decoder/ih264d_parse_headers.c
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Copyright (C) 2015 The Android Open Source Project |
4 | | * |
5 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
6 | | * you may not use this file except in compliance with the License. |
7 | | * You may obtain a copy of the License at: |
8 | | * |
9 | | * http://www.apache.org/licenses/LICENSE-2.0 |
10 | | * |
11 | | * Unless required by applicable law or agreed to in writing, software |
12 | | * distributed under the License is distributed on an "AS IS" BASIS, |
13 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
14 | | * See the License for the specific language governing permissions and |
15 | | * limitations under the License. |
16 | | * |
17 | | ***************************************************************************** |
18 | | * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
19 | | */ |
20 | | /*! |
21 | | ************************************************************************** |
22 | | * \file ih264d_parse_headers.c |
23 | | * |
24 | | * \brief |
25 | | * Contains High level syntax[above slice] parsing routines |
26 | | * |
27 | | * \date |
28 | | * 19/12/2002 |
29 | | * |
30 | | * \author AI |
31 | | ************************************************************************** |
32 | | */ |
33 | | #include <string.h> |
34 | | |
35 | | #include "ih264_typedefs.h" |
36 | | #include "ih264_macros.h" |
37 | | #include "ih264_platform_macros.h" |
38 | | #include "ih264_defs.h" |
39 | | #include "ih264d_bitstrm.h" |
40 | | #include "ih264d_structs.h" |
41 | | #include "ih264d_parse_cavlc.h" |
42 | | #include "ih264d_defs.h" |
43 | | #include "ih264d_defs.h" |
44 | | #include "ih264d_defs.h" |
45 | | #include "ih264d_parse_slice.h" |
46 | | #include "ih264d_tables.h" |
47 | | #include "ih264d_utils.h" |
48 | | #include "ih264d_nal.h" |
49 | | #include "ih264d_deblocking.h" |
50 | | |
51 | | #include "ih264d_mem_request.h" |
52 | | #include "ih264d_debug.h" |
53 | | #include "ih264d_error_handler.h" |
54 | | #include "ih264d_mb_utils.h" |
55 | | #include "ih264d_sei.h" |
56 | | #include "ih264d_vui.h" |
57 | | #include "ih264d_thread_parse_decode.h" |
58 | | #include "ih264d_thread_compute_bs.h" |
59 | | #include "ih264d_quant_scaling.h" |
60 | | #include "ih264d_defs.h" |
61 | | #include "ivd.h" |
62 | | #include "ih264d.h" |
63 | | |
64 | | /*****************************************************************************/ |
65 | | /* */ |
66 | | /* Function Name : ih264d_get_pre_sei_params */ |
67 | | /* */ |
68 | | /* Description : Gets valid pre-sei params in decoder struct from parse */ |
69 | | /* struct. */ |
70 | | /* Inputs : u1_nal_unit_type slice type */ |
71 | | /* ps_dec Decoder parameters */ |
72 | | /* Globals : None */ |
73 | | /* Outputs : None */ |
74 | | /* Returns : None */ |
75 | | /* */ |
76 | | /* Issues : None */ |
77 | | /* */ |
78 | | /* Revision History: */ |
79 | | /* */ |
80 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
81 | | /* Draft */ |
82 | | /* */ |
83 | | /*****************************************************************************/ |
84 | | |
85 | | void ih264d_get_pre_sei_params(dec_struct_t *ps_dec, UWORD8 u1_nal_unit_type) |
86 | 219k | { |
87 | 219k | if((NULL != ps_dec->ps_sei) && |
88 | 219k | ((0 == ps_dec->ps_sei->s_sei_ccv_params.u1_ccv_cancel_flag) && |
89 | 219k | (0 == ps_dec->ps_sei->s_sei_ccv_params.u1_ccv_persistence_flag))) |
90 | 218k | { |
91 | 218k | ps_dec->ps_sei->u1_sei_ccv_params_present_flag = 0; |
92 | 218k | memset(&ps_dec->ps_sei->s_sei_ccv_params, 0, sizeof(sei_ccv_params_t)); |
93 | 218k | } |
94 | | |
95 | 219k | if((NULL != ps_dec->ps_cur_sps) && |
96 | 219k | ((1 == ps_dec->ps_cur_sps->u1_vui_parameters_present_flag) && |
97 | 183k | ((2 != ps_dec->ps_cur_sps->s_vui.u1_colour_primaries) && |
98 | 33.0k | (2 != ps_dec->ps_cur_sps->s_vui.u1_matrix_coeffs) && |
99 | 33.0k | (2 != ps_dec->ps_cur_sps->s_vui.u1_tfr_chars) && |
100 | 33.0k | (4 != ps_dec->ps_cur_sps->s_vui.u1_tfr_chars) && |
101 | 33.0k | (5 != ps_dec->ps_cur_sps->s_vui.u1_tfr_chars)))) |
102 | 2.49k | { |
103 | 2.49k | if((1 == ps_dec->ps_sei_parse->u1_sei_ccv_params_present_flag) || |
104 | 2.49k | (IDR_SLICE_NAL == u1_nal_unit_type)) |
105 | 1.29k | { |
106 | 1.29k | ps_dec->ps_sei->u1_sei_ccv_params_present_flag = |
107 | 1.29k | ps_dec->ps_sei_parse->u1_sei_ccv_params_present_flag; |
108 | 1.29k | ps_dec->ps_sei->s_sei_ccv_params = ps_dec->ps_sei_parse->s_sei_ccv_params; |
109 | 1.29k | } |
110 | 2.49k | } |
111 | 216k | else |
112 | 216k | { |
113 | 216k | ps_dec->ps_sei->u1_sei_ccv_params_present_flag = 0; |
114 | 216k | memset(&ps_dec->ps_sei->s_sei_ccv_params, 0, sizeof(sei_ccv_params_t)); |
115 | 216k | } |
116 | | |
117 | 219k | if(IDR_SLICE_NAL == u1_nal_unit_type) |
118 | 134k | { |
119 | 134k | ps_dec->ps_sei->u1_sei_mdcv_params_present_flag = |
120 | 134k | ps_dec->ps_sei_parse->u1_sei_mdcv_params_present_flag; |
121 | 134k | ps_dec->ps_sei->s_sei_mdcv_params = ps_dec->ps_sei_parse->s_sei_mdcv_params; |
122 | 134k | ps_dec->ps_sei->u1_sei_cll_params_present_flag = |
123 | 134k | ps_dec->ps_sei_parse->u1_sei_cll_params_present_flag; |
124 | 134k | ps_dec->ps_sei->s_sei_cll_params = ps_dec->ps_sei_parse->s_sei_cll_params; |
125 | 134k | ps_dec->ps_sei->u1_sei_ave_params_present_flag = |
126 | 134k | ps_dec->ps_sei_parse->u1_sei_ave_params_present_flag; |
127 | 134k | ps_dec->ps_sei->s_sei_ave_params = ps_dec->ps_sei_parse->s_sei_ave_params; |
128 | 134k | ps_dec->ps_sei->u1_sei_sii_params_present_flag = |
129 | 134k | ps_dec->ps_sei_parse->u1_sei_sii_params_present_flag; |
130 | 134k | ps_dec->ps_sei->s_sei_sii_params = ps_dec->ps_sei_parse->s_sei_sii_params; |
131 | 134k | } |
132 | | |
133 | 219k | if(NULL != ps_dec->ps_sei) |
134 | 219k | { |
135 | 219k | ps_dec->ps_sei->u1_sei_fgc_params_present_flag = |
136 | 219k | ps_dec->ps_sei_parse->u1_sei_fgc_params_present_flag; |
137 | 219k | ps_dec->ps_sei->s_sei_fgc_params = ps_dec->ps_sei_parse->s_sei_fgc_params; |
138 | 219k | } |
139 | | |
140 | 219k | ps_dec->ps_sei_parse->u1_sei_mdcv_params_present_flag = 0; |
141 | 219k | memset(&ps_dec->ps_sei_parse->s_sei_mdcv_params, 0, sizeof(sei_mdcv_params_t)); |
142 | 219k | ps_dec->ps_sei_parse->u1_sei_cll_params_present_flag = 0; |
143 | 219k | memset(&ps_dec->ps_sei_parse->s_sei_cll_params, 0, sizeof(sei_cll_params_t)); |
144 | 219k | ps_dec->ps_sei_parse->u1_sei_ave_params_present_flag = 0; |
145 | 219k | memset(&ps_dec->ps_sei_parse->s_sei_ave_params, 0, sizeof(sei_ave_params_t)); |
146 | 219k | ps_dec->ps_sei_parse->u1_sei_ccv_params_present_flag = 0; |
147 | 219k | memset(&ps_dec->ps_sei_parse->s_sei_ccv_params, 0, sizeof(sei_ccv_params_t)); |
148 | 219k | ps_dec->ps_sei_parse->u1_sei_sii_params_present_flag = 0; |
149 | 219k | memset(&ps_dec->ps_sei_parse->s_sei_sii_params, 0, sizeof(sei_sii_params_t)); |
150 | 219k | } |
151 | | |
152 | | /*****************************************************************************/ |
153 | | /* */ |
154 | | /* Function Name : ih264d_parse_slice_partition */ |
155 | | /* */ |
156 | | /* Description : This function is intended to parse and decode slice part */ |
157 | | /* itions. Currently it's not implemented. Decoder will */ |
158 | | /* print a message, skips this NAL and continues */ |
159 | | /* Inputs : ps_dec Decoder parameters */ |
160 | | /* ps_bitstrm Bitstream */ |
161 | | /* Globals : None */ |
162 | | /* Processing : This functionality needs to be implemented */ |
163 | | /* Outputs : None */ |
164 | | /* Returns : None */ |
165 | | /* */ |
166 | | /* Issues : Not implemented */ |
167 | | /* */ |
168 | | /* Revision History: */ |
169 | | /* */ |
170 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
171 | | /* 06 05 2002 NS Draft */ |
172 | | /* */ |
173 | | /*****************************************************************************/ |
174 | | |
175 | | WORD32 ih264d_parse_slice_partition(dec_struct_t * ps_dec, |
176 | | dec_bit_stream_t * ps_bitstrm) |
177 | 484 | { |
178 | 484 | H264_DEC_DEBUG_PRINT("\nSlice partition not supported"); |
179 | 484 | UNUSED(ps_dec); |
180 | 484 | UNUSED(ps_bitstrm); |
181 | 484 | return (0); |
182 | 484 | } |
183 | | |
184 | | /*****************************************************************************/ |
185 | | /* */ |
186 | | /* Function Name : ih264d_parse_sei */ |
187 | | /* */ |
188 | | /* Description : This function is intended to parse and decode SEI */ |
189 | | /* Currently it's not implemented. Decoder will print a */ |
190 | | /* message, skips this NAL and continues */ |
191 | | /* Inputs : ps_dec Decoder parameters */ |
192 | | /* ps_bitstrm Bitstream */ |
193 | | /* Globals : None */ |
194 | | /* Processing : This functionality needs to be implemented */ |
195 | | /* Outputs : None */ |
196 | | /* Returns : None */ |
197 | | /* */ |
198 | | /* Issues : Not implemented */ |
199 | | /* */ |
200 | | /* Revision History: */ |
201 | | /* */ |
202 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
203 | | /* 06 05 2002 NS Draft */ |
204 | | /* */ |
205 | | /*****************************************************************************/ |
206 | | WORD32 ih264d_parse_sei(dec_struct_t * ps_dec, dec_bit_stream_t * ps_bitstrm) |
207 | 6.73k | { |
208 | 6.73k | UNUSED(ps_dec); |
209 | 6.73k | UNUSED(ps_bitstrm); |
210 | 6.73k | return (0); |
211 | 6.73k | } |
212 | | |
213 | | /*****************************************************************************/ |
214 | | /* */ |
215 | | /* Function Name : ih264d_parse_filler_data */ |
216 | | /* */ |
217 | | /* Description : This function is intended to parse and decode filler */ |
218 | | /* data NAL. Currently it's not implemented. Decoder will */ |
219 | | /* print a message, skips this NAL and continues */ |
220 | | /* Inputs : ps_dec Decoder parameters */ |
221 | | /* ps_bitstrm Bitstream */ |
222 | | /* Globals : None */ |
223 | | /* Processing : This functionality needs to be implemented */ |
224 | | /* Outputs : None */ |
225 | | /* Returns : None */ |
226 | | /* */ |
227 | | /* Issues : Not implemented */ |
228 | | /* */ |
229 | | /* Revision History: */ |
230 | | /* */ |
231 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
232 | | /* 06 05 2002 NS Draft */ |
233 | | /* */ |
234 | | /*****************************************************************************/ |
235 | | WORD32 ih264d_parse_filler_data(dec_struct_t * ps_dec, |
236 | | dec_bit_stream_t * ps_bitstrm) |
237 | 124 | { |
238 | 124 | UNUSED(ps_dec); |
239 | 124 | UNUSED(ps_bitstrm); |
240 | 124 | return (0); |
241 | 124 | } |
242 | | |
243 | | /*****************************************************************************/ |
244 | | /* */ |
245 | | /* Function Name : ih264d_parse_end_of_stream */ |
246 | | /* */ |
247 | | /* Description : This function is intended to parse and decode end of */ |
248 | | /* sequence. Currently it's not implemented. Decoder will */ |
249 | | /* print a message, skips this NAL and continues */ |
250 | | /* Inputs : ps_dec Decoder parameters */ |
251 | | /* Globals : None */ |
252 | | /* Processing : This functionality needs to be implemented */ |
253 | | /* Outputs : None */ |
254 | | /* Returns : None */ |
255 | | /* */ |
256 | | /* Issues : Not implemented */ |
257 | | /* */ |
258 | | /* Revision History: */ |
259 | | /* */ |
260 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
261 | | /* 06 05 2002 NS Draft */ |
262 | | /* */ |
263 | | /*****************************************************************************/ |
264 | | void ih264d_parse_end_of_stream(dec_struct_t * ps_dec) |
265 | 287 | { |
266 | 287 | UNUSED(ps_dec); |
267 | 287 | return; |
268 | 287 | } |
269 | | |
270 | | /*! |
271 | | ************************************************************************** |
272 | | * \if Function name : ih264d_parse_pps \endif |
273 | | * |
274 | | * \brief |
275 | | * Decodes Picture Parameter set |
276 | | * |
277 | | * \return |
278 | | * 0 on Success and Error code otherwise |
279 | | ************************************************************************** |
280 | | */ |
281 | | WORD32 ih264d_parse_pps(dec_struct_t * ps_dec, dec_bit_stream_t * ps_bitstrm) |
282 | 45.4k | { |
283 | 45.4k | UWORD8 uc_temp; |
284 | 45.4k | dec_seq_params_t * ps_sps = NULL; |
285 | 45.4k | dec_pic_params_t * ps_pps = NULL; |
286 | 45.4k | UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer; |
287 | 45.4k | UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst; |
288 | | |
289 | | /* Variables used for error resilience checks */ |
290 | 45.4k | UWORD64 u8_temp; |
291 | 45.4k | UWORD32 u4_temp; |
292 | 45.4k | WORD32 i_temp; |
293 | | |
294 | | /* For High profile related syntax elements */ |
295 | 45.4k | UWORD8 u1_more_data_flag; |
296 | 45.4k | WORD32 i4_i; |
297 | | |
298 | 45.4k | if(!(ps_dec->i4_header_decoded & 1)) |
299 | 539 | return ERROR_INV_SPS_PPS_T; |
300 | | |
301 | | /*--------------------------------------------------------------------*/ |
302 | | /* Decode pic_parameter_set_id and find corresponding pic params */ |
303 | | /*--------------------------------------------------------------------*/ |
304 | 44.9k | u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
305 | 44.9k | if(u4_temp & MASK_ERR_PIC_SET_ID) |
306 | 149 | return ERROR_INV_SPS_PPS_T; |
307 | 44.8k | ps_pps = ps_dec->pv_scratch_sps_pps; |
308 | 44.8k | *ps_pps = ps_dec->ps_pps[u4_temp]; |
309 | 44.8k | ps_pps->u1_pic_parameter_set_id = (WORD8)u4_temp; |
310 | 44.8k | COPYTHECONTEXT("PPS: pic_parameter_set_id",ps_pps->u1_pic_parameter_set_id); |
311 | | |
312 | | /************************************************/ |
313 | | /* initilization of High profile syntax element */ |
314 | | /************************************************/ |
315 | 44.8k | ps_pps->i4_transform_8x8_mode_flag = 0; |
316 | 44.8k | ps_pps->i4_pic_scaling_matrix_present_flag = 0; |
317 | | |
318 | | /*--------------------------------------------------------------------*/ |
319 | | /* Decode seq_parameter_set_id and map it to a seq_parameter_set */ |
320 | | /*--------------------------------------------------------------------*/ |
321 | 44.8k | u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
322 | 44.8k | if(u4_temp & MASK_ERR_SEQ_SET_ID) |
323 | 161 | return ERROR_INV_SPS_PPS_T; |
324 | 44.6k | COPYTHECONTEXT("PPS: seq_parameter_set_id",u4_temp); |
325 | 44.6k | ps_sps = &ps_dec->ps_sps[u4_temp]; |
326 | | |
327 | 44.6k | if(FALSE == ps_sps->u1_is_valid) |
328 | 140 | return ERROR_INV_SPS_PPS_T; |
329 | 44.5k | ps_pps->ps_sps = ps_sps; |
330 | | |
331 | | /*--------------------------------------------------------------------*/ |
332 | | /* Decode entropy_coding_mode */ |
333 | | /*--------------------------------------------------------------------*/ |
334 | 44.5k | ps_pps->u1_entropy_coding_mode = ih264d_get_bit_h264(ps_bitstrm); |
335 | 44.5k | COPYTHECONTEXT("PPS: entropy_coding_mode_flag",ps_pps->u1_entropy_coding_mode); |
336 | | |
337 | 44.5k | ps_pps->u1_pic_order_present_flag = ih264d_get_bit_h264(ps_bitstrm); |
338 | 44.5k | COPYTHECONTEXT("PPS: pic_order_present_flag",ps_pps->u1_pic_order_present_flag); |
339 | | |
340 | | /*--------------------------------------------------------------------*/ |
341 | | /* Decode num_slice_groups_minus1 */ |
342 | | /*--------------------------------------------------------------------*/ |
343 | 44.5k | u8_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf) + (UWORD64)1; |
344 | 44.5k | if(u8_temp != 1) |
345 | 121 | { |
346 | 121 | return ERROR_FEATURE_UNAVAIL; |
347 | 121 | } |
348 | 44.3k | ps_pps->u1_num_slice_groups = u8_temp; |
349 | 44.3k | COPYTHECONTEXT("PPS: num_slice_groups_minus1",ps_pps->u1_num_slice_groups -1); |
350 | | |
351 | | /*--------------------------------------------------------------------*/ |
352 | | /* Other parameter set values */ |
353 | | /*--------------------------------------------------------------------*/ |
354 | 44.3k | u8_temp = (UWORD64)1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
355 | 44.3k | if(u8_temp > H264_MAX_REF_IDX) |
356 | 173 | return ERROR_REF_IDX; |
357 | 44.2k | ps_pps->u1_num_ref_idx_lx_active[0] = u8_temp; |
358 | 44.2k | COPYTHECONTEXT("PPS: num_ref_idx_l0_active_minus1", |
359 | 44.2k | ps_pps->u1_num_ref_idx_lx_active[0] - 1); |
360 | | |
361 | 44.2k | u8_temp = (UWORD64)1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
362 | 44.2k | if(u8_temp > H264_MAX_REF_IDX) |
363 | 60 | return ERROR_REF_IDX; |
364 | 44.1k | ps_pps->u1_num_ref_idx_lx_active[1] = u8_temp; |
365 | 44.1k | COPYTHECONTEXT("PPS: num_ref_idx_l1_active_minus1", |
366 | 44.1k | ps_pps->u1_num_ref_idx_lx_active[1] - 1); |
367 | | |
368 | 44.1k | ps_pps->u1_wted_pred_flag = ih264d_get_bit_h264(ps_bitstrm); |
369 | 44.1k | COPYTHECONTEXT("PPS: weighted prediction u4_flag",ps_pps->u1_wted_pred_flag); |
370 | 44.1k | uc_temp = ih264d_get_bits_h264(ps_bitstrm, 2); |
371 | 44.1k | COPYTHECONTEXT("PPS: weighted_bipred_idc",uc_temp); |
372 | 44.1k | ps_pps->u1_wted_bipred_idc = uc_temp; |
373 | | |
374 | 44.1k | if(ps_pps->u1_wted_bipred_idc > MAX_WEIGHT_BIPRED_IDC) |
375 | 84 | return ERROR_INV_SPS_PPS_T; |
376 | 44.0k | { |
377 | 44.0k | WORD64 i8_temp; |
378 | 44.0k | i8_temp = (WORD64)26 + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
379 | | |
380 | 44.0k | if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) |
381 | 90 | return ERROR_INV_RANGE_QP_T; |
382 | | |
383 | 43.9k | ps_pps->u1_pic_init_qp = i8_temp; |
384 | 43.9k | COPYTHECONTEXT("PPS: pic_init_qp_minus26",ps_pps->u1_pic_init_qp - 26); |
385 | | |
386 | 43.9k | i8_temp = (WORD64)26 + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
387 | | |
388 | 43.9k | if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) |
389 | 93 | return ERROR_INV_RANGE_QP_T; |
390 | | |
391 | 43.8k | ps_pps->u1_pic_init_qs = i8_temp; |
392 | 43.8k | COPYTHECONTEXT("PPS: pic_init_qs_minus26",ps_pps->u1_pic_init_qs - 26); |
393 | 43.8k | } |
394 | | |
395 | 0 | i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
396 | 43.8k | if((i_temp < -12) || (i_temp > 12)) |
397 | 337 | return ERROR_INV_RANGE_QP_T; |
398 | 43.5k | ps_pps->i1_chroma_qp_index_offset = i_temp; |
399 | 43.5k | COPYTHECONTEXT("PPS: chroma_qp_index_offset",ps_pps->i1_chroma_qp_index_offset); |
400 | | |
401 | | /***************************************************************************/ |
402 | | /* initialize second_chroma_qp_index_offset to i1_chroma_qp_index_offset if */ |
403 | | /* second_chroma_qp_index_offset is not present in bit-ps_bitstrm */ |
404 | | /***************************************************************************/ |
405 | 43.5k | ps_pps->i1_second_chroma_qp_index_offset = |
406 | 43.5k | ps_pps->i1_chroma_qp_index_offset; |
407 | | |
408 | 43.5k | ps_pps->u1_deblocking_filter_parameters_present_flag = ih264d_get_bit_h264( |
409 | 43.5k | ps_bitstrm); |
410 | 43.5k | COPYTHECONTEXT("PPS: deblocking_filter_control_present_flag", |
411 | 43.5k | ps_pps->u1_deblocking_filter_parameters_present_flag); |
412 | 43.5k | ps_pps->u1_constrained_intra_pred_flag = ih264d_get_bit_h264(ps_bitstrm); |
413 | 43.5k | COPYTHECONTEXT("PPS: constrained_intra_pred_flag", |
414 | 43.5k | ps_pps->u1_constrained_intra_pred_flag); |
415 | 43.5k | ps_pps->u1_redundant_pic_cnt_present_flag = ih264d_get_bit_h264(ps_bitstrm); |
416 | 43.5k | COPYTHECONTEXT("PPS: redundant_pic_cnt_present_flag", |
417 | 43.5k | ps_pps->u1_redundant_pic_cnt_present_flag); |
418 | | |
419 | | /* High profile related syntax elements */ |
420 | 43.5k | u1_more_data_flag = MORE_RBSP_DATA(ps_bitstrm); |
421 | 43.5k | if(u1_more_data_flag && (ps_pps->ps_sps->u1_profile_idc == HIGH_PROFILE_IDC)) |
422 | 10.7k | { |
423 | | /* read transform_8x8_mode_flag */ |
424 | 10.7k | ps_pps->i4_transform_8x8_mode_flag = (WORD32)ih264d_get_bit_h264( |
425 | 10.7k | ps_bitstrm); |
426 | | |
427 | | /* read pic_scaling_matrix_present_flag */ |
428 | 10.7k | ps_pps->i4_pic_scaling_matrix_present_flag = |
429 | 10.7k | (WORD32)ih264d_get_bit_h264(ps_bitstrm); |
430 | | |
431 | 10.7k | if(ps_pps->i4_pic_scaling_matrix_present_flag) |
432 | 2.01k | { |
433 | | /* read the scaling matrices */ |
434 | 15.7k | for(i4_i = 0; i4_i < (6 + (ps_pps->i4_transform_8x8_mode_flag << 1)); i4_i++) |
435 | 14.0k | { |
436 | 14.0k | ps_pps->u1_pic_scaling_list_present_flag[i4_i] = |
437 | 14.0k | ih264d_get_bit_h264(ps_bitstrm); |
438 | | |
439 | 14.0k | if(ps_pps->u1_pic_scaling_list_present_flag[i4_i]) |
440 | 3.04k | { |
441 | 3.04k | WORD32 ret; |
442 | 3.04k | if(i4_i < 6) |
443 | 2.40k | { |
444 | 2.40k | ret = ih264d_scaling_list( |
445 | 2.40k | ps_pps->i2_pic_scalinglist4x4[i4_i], |
446 | 2.40k | 16, |
447 | 2.40k | &ps_pps->u1_pic_use_default_scaling_matrix_flag[i4_i], |
448 | 2.40k | ps_bitstrm); |
449 | 2.40k | } |
450 | 639 | else |
451 | 639 | { |
452 | 639 | ret = ih264d_scaling_list( |
453 | 639 | ps_pps->i2_pic_scalinglist8x8[i4_i - 6], |
454 | 639 | 64, |
455 | 639 | &ps_pps->u1_pic_use_default_scaling_matrix_flag[i4_i], |
456 | 639 | ps_bitstrm); |
457 | 639 | } |
458 | | |
459 | 3.04k | if(ret != OK) |
460 | 257 | { |
461 | 257 | return ret; |
462 | 257 | } |
463 | 3.04k | } |
464 | 14.0k | } |
465 | 2.01k | } |
466 | | |
467 | | /* read second_chroma_qp_index_offset syntax element */ |
468 | 10.5k | i_temp = ih264d_sev( |
469 | 10.5k | pu4_bitstrm_ofst, pu4_bitstrm_buf); |
470 | | |
471 | 10.5k | if((i_temp < -12) || (i_temp > 12)) |
472 | 222 | return ERROR_INV_RANGE_QP_T; |
473 | | |
474 | 10.3k | ps_pps->i1_second_chroma_qp_index_offset = i_temp; |
475 | 10.3k | } |
476 | | |
477 | | /* In case bitstream read has exceeded the filled size, then |
478 | | return an error */ |
479 | 43.0k | if(EXCEED_OFFSET(ps_bitstrm)) |
480 | 77 | { |
481 | 77 | return ERROR_INV_SPS_PPS_T; |
482 | 77 | } |
483 | 42.9k | ps_pps->u1_is_valid = TRUE; |
484 | 42.9k | ps_dec->ps_pps[ps_pps->u1_pic_parameter_set_id] = *ps_pps; |
485 | 42.9k | return OK; |
486 | 43.0k | } |
487 | | |
488 | | /*! |
489 | | ************************************************************************** |
490 | | * \if Function name : ih264d_parse_sps \endif |
491 | | * |
492 | | * \brief |
493 | | * Decodes Sequence parameter set from the bitstream |
494 | | * |
495 | | * \return |
496 | | * 0 on Success and Error code otherwise |
497 | | ************************************************************************** |
498 | | */ |
499 | | UWORD32 ih264d_correct_level_idc(UWORD32 u4_level_idc, UWORD32 u4_total_mbs) |
500 | 179k | { |
501 | 179k | UWORD32 u4_max_mbs_allowed; |
502 | | |
503 | 179k | switch(u4_level_idc) |
504 | 179k | { |
505 | 2.88k | case H264_LEVEL_1_0: |
506 | 2.88k | u4_max_mbs_allowed = MAX_MBS_LEVEL_10; |
507 | 2.88k | break; |
508 | 22.6k | case H264_LEVEL_1_1: |
509 | 22.6k | u4_max_mbs_allowed = MAX_MBS_LEVEL_11; |
510 | 22.6k | break; |
511 | 2.38k | case H264_LEVEL_1_2: |
512 | 2.38k | u4_max_mbs_allowed = MAX_MBS_LEVEL_12; |
513 | 2.38k | break; |
514 | 3.13k | case H264_LEVEL_1_3: |
515 | 3.13k | u4_max_mbs_allowed = MAX_MBS_LEVEL_13; |
516 | 3.13k | break; |
517 | 26.9k | case H264_LEVEL_2_0: |
518 | 26.9k | u4_max_mbs_allowed = MAX_MBS_LEVEL_20; |
519 | 26.9k | break; |
520 | 17.1k | case H264_LEVEL_2_1: |
521 | 17.1k | u4_max_mbs_allowed = MAX_MBS_LEVEL_21; |
522 | 17.1k | break; |
523 | 2.12k | case H264_LEVEL_2_2: |
524 | 2.12k | u4_max_mbs_allowed = MAX_MBS_LEVEL_22; |
525 | 2.12k | break; |
526 | 2.20k | case H264_LEVEL_3_0: |
527 | 2.20k | u4_max_mbs_allowed = MAX_MBS_LEVEL_30; |
528 | 2.20k | break; |
529 | 5.61k | case H264_LEVEL_3_1: |
530 | 5.61k | u4_max_mbs_allowed = MAX_MBS_LEVEL_31; |
531 | 5.61k | break; |
532 | 8.80k | case H264_LEVEL_3_2: |
533 | 8.80k | u4_max_mbs_allowed = MAX_MBS_LEVEL_32; |
534 | 8.80k | break; |
535 | 10.4k | case H264_LEVEL_4_0: |
536 | 10.4k | u4_max_mbs_allowed = MAX_MBS_LEVEL_40; |
537 | 10.4k | break; |
538 | 2.41k | case H264_LEVEL_4_1: |
539 | 2.41k | u4_max_mbs_allowed = MAX_MBS_LEVEL_41; |
540 | 2.41k | break; |
541 | 3.17k | case H264_LEVEL_4_2: |
542 | 3.17k | u4_max_mbs_allowed = MAX_MBS_LEVEL_42; |
543 | 3.17k | break; |
544 | 807 | case H264_LEVEL_5_0: |
545 | 807 | u4_max_mbs_allowed = MAX_MBS_LEVEL_50; |
546 | 807 | break; |
547 | 621 | case H264_LEVEL_5_1: |
548 | 68.3k | default: |
549 | 68.3k | u4_max_mbs_allowed = MAX_MBS_LEVEL_51; |
550 | 68.3k | break; |
551 | | |
552 | 179k | } |
553 | | |
554 | | /*correct of the level is incorrect*/ |
555 | 179k | if(u4_total_mbs > u4_max_mbs_allowed) |
556 | 4.99k | { |
557 | 4.99k | if(u4_total_mbs > MAX_MBS_LEVEL_50) |
558 | 496 | u4_level_idc = H264_LEVEL_5_1; |
559 | 4.50k | else if(u4_total_mbs > MAX_MBS_LEVEL_42) |
560 | 270 | u4_level_idc = H264_LEVEL_5_0; |
561 | 4.23k | else if(u4_total_mbs > MAX_MBS_LEVEL_41) |
562 | 314 | u4_level_idc = H264_LEVEL_4_2; |
563 | 3.91k | else if(u4_total_mbs > MAX_MBS_LEVEL_40) |
564 | 0 | u4_level_idc = H264_LEVEL_4_1; |
565 | 3.91k | else if(u4_total_mbs > MAX_MBS_LEVEL_32) |
566 | 277 | u4_level_idc = H264_LEVEL_4_0; |
567 | 3.63k | else if(u4_total_mbs > MAX_MBS_LEVEL_31) |
568 | 318 | u4_level_idc = H264_LEVEL_3_2; |
569 | 3.32k | else if(u4_total_mbs > MAX_MBS_LEVEL_30) |
570 | 1.07k | u4_level_idc = H264_LEVEL_3_1; |
571 | 2.24k | else if(u4_total_mbs > MAX_MBS_LEVEL_21) |
572 | 405 | u4_level_idc = H264_LEVEL_3_0; |
573 | 1.83k | else if(u4_total_mbs > MAX_MBS_LEVEL_20) |
574 | 1.33k | u4_level_idc = H264_LEVEL_2_1; |
575 | 501 | else if(u4_total_mbs > MAX_MBS_LEVEL_10) |
576 | 501 | u4_level_idc = H264_LEVEL_2_0; |
577 | 4.99k | } |
578 | | |
579 | 179k | return (u4_level_idc); |
580 | | |
581 | 179k | } |
582 | | WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm) |
583 | 84.7k | { |
584 | 84.7k | UWORD8 i; |
585 | 84.7k | dec_seq_params_t *ps_seq = NULL; |
586 | 84.7k | UWORD8 u1_profile_idc, u1_level_idc, u1_seq_parameter_set_id, u1_mb_aff_flag = 0; |
587 | 84.7k | UWORD32 u4_max_frm_num; |
588 | 84.7k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
589 | 84.7k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
590 | 84.7k | UWORD8 u1_frm, uc_constraint_set0_flag, uc_constraint_set1_flag; |
591 | 84.7k | WORD32 i4_cropped_ht, i4_cropped_wd; |
592 | 84.7k | UWORD32 u4_temp; |
593 | 84.7k | UWORD64 u8_temp; |
594 | 84.7k | UWORD32 u4_pic_height_in_map_units, u4_pic_width_in_mbs; |
595 | 84.7k | UWORD32 u2_pic_wd = 0; |
596 | 84.7k | UWORD32 u2_pic_ht = 0; |
597 | 84.7k | UWORD32 u2_frm_wd_y = 0; |
598 | 84.7k | UWORD32 u2_frm_ht_y = 0; |
599 | 84.7k | UWORD32 u2_frm_wd_uv = 0; |
600 | 84.7k | UWORD32 u2_frm_ht_uv = 0; |
601 | 84.7k | UWORD32 u2_crop_offset_y = 0; |
602 | 84.7k | UWORD32 u2_crop_offset_uv = 0; |
603 | 84.7k | WORD32 ret; |
604 | 84.7k | WORD32 num_reorder_frames; |
605 | | /* High profile related syntax element */ |
606 | 84.7k | WORD32 i4_i; |
607 | | /* G050 */ |
608 | 84.7k | UWORD8 u1_frame_cropping_flag, u1_frame_cropping_rect_left_ofst, |
609 | 84.7k | u1_frame_cropping_rect_right_ofst, |
610 | 84.7k | u1_frame_cropping_rect_top_ofst, |
611 | 84.7k | u1_frame_cropping_rect_bottom_ofst; |
612 | | /* G050 */ |
613 | | /*--------------------------------------------------------------------*/ |
614 | | /* Decode seq_parameter_set_id and profile and level values */ |
615 | | /*--------------------------------------------------------------------*/ |
616 | 84.7k | SWITCHONTRACE; |
617 | 84.7k | u1_profile_idc = ih264d_get_bits_h264(ps_bitstrm, 8); |
618 | 84.7k | COPYTHECONTEXT("SPS: profile_idc",u1_profile_idc); |
619 | | |
620 | | /* G050 */ |
621 | 84.7k | uc_constraint_set0_flag = ih264d_get_bit_h264(ps_bitstrm); |
622 | 84.7k | uc_constraint_set1_flag = ih264d_get_bit_h264(ps_bitstrm); |
623 | 84.7k | ih264d_get_bit_h264(ps_bitstrm); |
624 | | |
625 | | /*****************************************************/ |
626 | | /* Read 5 bits for uc_constraint_set3_flag (1 bit) */ |
627 | | /* and reserved_zero_4bits (4 bits) - Sushant */ |
628 | | /*****************************************************/ |
629 | 84.7k | ih264d_get_bits_h264(ps_bitstrm, 5); |
630 | | /* G050 */ |
631 | | |
632 | | /* Check whether particular profile is suported or not */ |
633 | | /* Check whether particular profile is suported or not */ |
634 | 84.7k | if((u1_profile_idc != MAIN_PROFILE_IDC) && |
635 | | |
636 | 84.7k | (u1_profile_idc != BASE_PROFILE_IDC) && |
637 | | |
638 | 84.7k | (u1_profile_idc != HIGH_PROFILE_IDC) |
639 | | |
640 | 84.7k | ) |
641 | 4.71k | { |
642 | | |
643 | | /* Apart from Baseline, main and high profile, |
644 | | * only extended profile is supported provided |
645 | | * uc_constraint_set0_flag or uc_constraint_set1_flag are set to 1 |
646 | | */ |
647 | 4.71k | if((u1_profile_idc != EXTENDED_PROFILE_IDC) || |
648 | 4.71k | ((uc_constraint_set1_flag != 1) && (uc_constraint_set0_flag != 1))) |
649 | 257 | { |
650 | 257 | return (ERROR_FEATURE_UNAVAIL); |
651 | 257 | } |
652 | 4.71k | } |
653 | | |
654 | 84.4k | u1_level_idc = ih264d_get_bits_h264(ps_bitstrm, 8); |
655 | | |
656 | | |
657 | | |
658 | 84.4k | COPYTHECONTEXT("SPS: u4_level_idc",u1_level_idc); |
659 | | |
660 | 84.4k | u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
661 | 84.4k | if(u4_temp & MASK_ERR_SEQ_SET_ID) |
662 | 1.06k | return ERROR_INV_SPS_PPS_T; |
663 | 83.4k | u1_seq_parameter_set_id = u4_temp; |
664 | 83.4k | COPYTHECONTEXT("SPS: seq_parameter_set_id", |
665 | 83.4k | u1_seq_parameter_set_id); |
666 | | |
667 | | /*--------------------------------------------------------------------*/ |
668 | | /* Find an seq param entry in seqparam array of decStruct */ |
669 | | /*--------------------------------------------------------------------*/ |
670 | | |
671 | 83.4k | ps_seq = ps_dec->pv_scratch_sps_pps; |
672 | 83.4k | memset(ps_seq, 0, sizeof(dec_seq_params_t)); |
673 | | |
674 | 83.4k | if(ps_dec->i4_header_decoded & 1) |
675 | 61.9k | { |
676 | 61.9k | *ps_seq = *ps_dec->ps_cur_sps; |
677 | 61.9k | } |
678 | | |
679 | | |
680 | 83.4k | if((ps_dec->i4_header_decoded & 1) && (ps_seq->u1_profile_idc != u1_profile_idc)) |
681 | 549 | { |
682 | 549 | ps_dec->u1_res_changed = 1; |
683 | 549 | return IVD_RES_CHANGED; |
684 | 549 | } |
685 | | |
686 | 82.8k | if((ps_dec->i4_header_decoded & 1) && (ps_seq->u1_level_idc != u1_level_idc)) |
687 | 1.85k | { |
688 | 1.85k | ps_dec->u1_res_changed = 1; |
689 | 1.85k | return IVD_RES_CHANGED; |
690 | 1.85k | } |
691 | | |
692 | 81.0k | ps_seq->u1_profile_idc = u1_profile_idc; |
693 | 81.0k | ps_seq->u1_level_idc = u1_level_idc; |
694 | 81.0k | ps_seq->u1_seq_parameter_set_id = u1_seq_parameter_set_id; |
695 | | |
696 | | /*******************************************************************/ |
697 | | /* Initializations for high profile - Sushant */ |
698 | | /*******************************************************************/ |
699 | 81.0k | ps_seq->i4_chroma_format_idc = 1; |
700 | 81.0k | ps_seq->i4_bit_depth_luma_minus8 = 0; |
701 | 81.0k | ps_seq->i4_bit_depth_chroma_minus8 = 0; |
702 | 81.0k | ps_seq->i4_qpprime_y_zero_transform_bypass_flag = 0; |
703 | 81.0k | ps_seq->i4_seq_scaling_matrix_present_flag = 0; |
704 | 81.0k | if(u1_profile_idc == HIGH_PROFILE_IDC) |
705 | 18.2k | { |
706 | | |
707 | | /* reading chroma_format_idc */ |
708 | 18.2k | ps_seq->i4_chroma_format_idc = ih264d_uev(pu4_bitstrm_ofst, |
709 | 18.2k | pu4_bitstrm_buf); |
710 | | |
711 | | /* Monochrome is not supported */ |
712 | 18.2k | if(ps_seq->i4_chroma_format_idc != 1) |
713 | 41 | { |
714 | 41 | return ERROR_FEATURE_UNAVAIL; |
715 | 41 | } |
716 | | |
717 | | /* reading bit_depth_luma_minus8 */ |
718 | 18.2k | ps_seq->i4_bit_depth_luma_minus8 = ih264d_uev(pu4_bitstrm_ofst, |
719 | 18.2k | pu4_bitstrm_buf); |
720 | | |
721 | 18.2k | if(ps_seq->i4_bit_depth_luma_minus8 != 0) |
722 | 48 | { |
723 | 48 | return ERROR_FEATURE_UNAVAIL; |
724 | 48 | } |
725 | | |
726 | | /* reading bit_depth_chroma_minus8 */ |
727 | 18.1k | ps_seq->i4_bit_depth_chroma_minus8 = ih264d_uev(pu4_bitstrm_ofst, |
728 | 18.1k | pu4_bitstrm_buf); |
729 | | |
730 | 18.1k | if(ps_seq->i4_bit_depth_chroma_minus8 != 0) |
731 | 183 | { |
732 | 183 | return ERROR_FEATURE_UNAVAIL; |
733 | 183 | } |
734 | | |
735 | | /* reading qpprime_y_zero_transform_bypass_flag */ |
736 | 18.0k | ps_seq->i4_qpprime_y_zero_transform_bypass_flag = |
737 | 18.0k | (WORD32)ih264d_get_bit_h264(ps_bitstrm); |
738 | | |
739 | 18.0k | if(ps_seq->i4_qpprime_y_zero_transform_bypass_flag != 0) |
740 | 6 | { |
741 | 6 | return ERROR_INV_SPS_PPS_T; |
742 | 6 | } |
743 | | |
744 | | /* reading seq_scaling_matrix_present_flag */ |
745 | 18.0k | ps_seq->i4_seq_scaling_matrix_present_flag = |
746 | 18.0k | (WORD32)ih264d_get_bit_h264(ps_bitstrm); |
747 | | |
748 | 18.0k | if(ps_seq->i4_seq_scaling_matrix_present_flag) |
749 | 1.95k | { |
750 | 17.0k | for(i4_i = 0; i4_i < 8; i4_i++) |
751 | 15.2k | { |
752 | 15.2k | ps_seq->u1_seq_scaling_list_present_flag[i4_i] = |
753 | 15.2k | ih264d_get_bit_h264(ps_bitstrm); |
754 | | |
755 | | /* initialize u1_use_default_scaling_matrix_flag[i4_i] to zero */ |
756 | | /* before calling scaling list */ |
757 | 15.2k | ps_seq->u1_use_default_scaling_matrix_flag[i4_i] = 0; |
758 | | |
759 | 15.2k | if(ps_seq->u1_seq_scaling_list_present_flag[i4_i]) |
760 | 5.43k | { |
761 | 5.43k | if(i4_i < 6) |
762 | 3.26k | { |
763 | 3.26k | ret = ih264d_scaling_list( |
764 | 3.26k | ps_seq->i2_scalinglist4x4[i4_i], |
765 | 3.26k | 16, |
766 | 3.26k | &ps_seq->u1_use_default_scaling_matrix_flag[i4_i], |
767 | 3.26k | ps_bitstrm); |
768 | 3.26k | } |
769 | 2.16k | else |
770 | 2.16k | { |
771 | 2.16k | ret = ih264d_scaling_list( |
772 | 2.16k | ps_seq->i2_scalinglist8x8[i4_i - 6], |
773 | 2.16k | 64, |
774 | 2.16k | &ps_seq->u1_use_default_scaling_matrix_flag[i4_i], |
775 | 2.16k | ps_bitstrm); |
776 | 2.16k | } |
777 | 5.43k | if(ret != OK) |
778 | 97 | { |
779 | 97 | return ret; |
780 | 97 | } |
781 | 5.43k | } |
782 | 15.2k | } |
783 | 1.95k | } |
784 | 18.0k | } |
785 | | /*--------------------------------------------------------------------*/ |
786 | | /* Decode MaxFrameNum */ |
787 | | /*--------------------------------------------------------------------*/ |
788 | 80.6k | u8_temp = (UWORD64)4 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
789 | 80.6k | if(u8_temp > MAX_BITS_IN_FRAME_NUM) |
790 | 142 | { |
791 | 142 | return ERROR_INV_SPS_PPS_T; |
792 | 142 | } |
793 | 80.4k | ps_seq->u1_bits_in_frm_num = u8_temp; |
794 | 80.4k | COPYTHECONTEXT("SPS: log2_max_frame_num_minus4", |
795 | 80.4k | (ps_seq->u1_bits_in_frm_num - 4)); |
796 | | |
797 | 80.4k | u4_max_frm_num = (1 << (ps_seq->u1_bits_in_frm_num)); |
798 | 80.4k | ps_seq->u2_u4_max_pic_num_minus1 = u4_max_frm_num - 1; |
799 | | /*--------------------------------------------------------------------*/ |
800 | | /* Decode picture order count and related values */ |
801 | | /*--------------------------------------------------------------------*/ |
802 | 80.4k | u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
803 | | |
804 | 80.4k | if(u4_temp > MAX_PIC_ORDER_CNT_TYPE) |
805 | 87 | { |
806 | 87 | return ERROR_INV_POC_TYPE_T; |
807 | 87 | } |
808 | 80.4k | ps_seq->u1_pic_order_cnt_type = u4_temp; |
809 | 80.4k | COPYTHECONTEXT("SPS: pic_order_cnt_type",ps_seq->u1_pic_order_cnt_type); |
810 | | |
811 | 80.4k | ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle = 1; |
812 | 80.4k | if(ps_seq->u1_pic_order_cnt_type == 0) |
813 | 34.7k | { |
814 | 34.7k | u8_temp = (UWORD64)4 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
815 | 34.7k | if(u8_temp > MAX_BITS_IN_POC_LSB) |
816 | 61 | { |
817 | 61 | return ERROR_INV_SPS_PPS_T; |
818 | 61 | } |
819 | 34.6k | ps_seq->u1_log2_max_pic_order_cnt_lsb_minus = u8_temp; |
820 | 34.6k | ps_seq->i4_max_pic_order_cntLsb = (1 << u8_temp); |
821 | 34.6k | COPYTHECONTEXT("SPS: log2_max_pic_order_cnt_lsb_minus4",(u8_temp - 4)); |
822 | 34.6k | } |
823 | 45.6k | else if(ps_seq->u1_pic_order_cnt_type == 1) |
824 | 9.49k | { |
825 | 9.49k | ps_seq->u1_delta_pic_order_always_zero_flag = ih264d_get_bit_h264( |
826 | 9.49k | ps_bitstrm); |
827 | 9.49k | COPYTHECONTEXT("SPS: delta_pic_order_always_zero_flag", |
828 | 9.49k | ps_seq->u1_delta_pic_order_always_zero_flag); |
829 | | |
830 | 9.49k | ps_seq->i4_ofst_for_non_ref_pic = ih264d_sev(pu4_bitstrm_ofst, |
831 | 9.49k | pu4_bitstrm_buf); |
832 | 9.49k | COPYTHECONTEXT("SPS: offset_for_non_ref_pic", |
833 | 9.49k | ps_seq->i4_ofst_for_non_ref_pic); |
834 | | |
835 | 9.49k | ps_seq->i4_ofst_for_top_to_bottom_field = ih264d_sev( |
836 | 9.49k | pu4_bitstrm_ofst, pu4_bitstrm_buf); |
837 | 9.49k | COPYTHECONTEXT("SPS: offset_for_top_to_bottom_field", |
838 | 9.49k | ps_seq->i4_ofst_for_top_to_bottom_field); |
839 | | |
840 | 9.49k | u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
841 | 9.49k | if(u4_temp > 255) |
842 | 49 | return ERROR_INV_SPS_PPS_T; |
843 | 9.44k | ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle = u4_temp; |
844 | 9.44k | COPYTHECONTEXT("SPS: num_ref_frames_in_pic_order_cnt_cycle", |
845 | 9.44k | ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle); |
846 | | |
847 | 33.9k | for(i = 0; i < ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle; i++) |
848 | 24.5k | { |
849 | 24.5k | ps_seq->i4_ofst_for_ref_frame[i] = ih264d_sev( |
850 | 24.5k | pu4_bitstrm_ofst, pu4_bitstrm_buf); |
851 | 24.5k | COPYTHECONTEXT("SPS: offset_for_ref_frame", |
852 | 24.5k | ps_seq->i4_ofst_for_ref_frame[i]); |
853 | 24.5k | } |
854 | 9.44k | } |
855 | | |
856 | 80.2k | u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
857 | | |
858 | 80.2k | if((u4_temp > H264_MAX_REF_PICS)) |
859 | 168 | { |
860 | 168 | return ERROR_NUM_REF; |
861 | 168 | } |
862 | | |
863 | | /* Compare with older num_ref_frames is header is already once */ |
864 | 80.1k | if((ps_dec->i4_header_decoded & 1) && (ps_seq->u1_num_ref_frames != u4_temp)) |
865 | 147 | { |
866 | 147 | ps_dec->u1_res_changed = 1; |
867 | 147 | return IVD_RES_CHANGED; |
868 | 147 | } |
869 | | |
870 | 79.9k | ps_seq->u1_num_ref_frames = u4_temp; |
871 | 79.9k | COPYTHECONTEXT("SPS: num_ref_frames",ps_seq->u1_num_ref_frames); |
872 | | |
873 | 79.9k | ps_seq->u1_gaps_in_frame_num_value_allowed_flag = ih264d_get_bit_h264( |
874 | 79.9k | ps_bitstrm); |
875 | 79.9k | COPYTHECONTEXT("SPS: gaps_in_frame_num_value_allowed_flag", |
876 | 79.9k | ps_seq->u1_gaps_in_frame_num_value_allowed_flag); |
877 | | |
878 | | /*--------------------------------------------------------------------*/ |
879 | | /* Decode FrameWidth and FrameHeight and related values */ |
880 | | /*--------------------------------------------------------------------*/ |
881 | 79.9k | u8_temp = (UWORD64)1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
882 | | /* Check for unsupported resolutions*/ |
883 | 79.9k | if(u8_temp > (H264_MAX_FRAME_WIDTH >> 4)) |
884 | 58 | { |
885 | 58 | return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED; |
886 | 58 | } |
887 | 79.9k | u4_pic_width_in_mbs = u8_temp; |
888 | 79.9k | COPYTHECONTEXT("SPS: pic_width_in_mbs_minus1", |
889 | 79.9k | u4_pic_width_in_mbs - 1); |
890 | | |
891 | 79.9k | u8_temp = (UWORD64)1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
892 | 79.9k | if (u8_temp > (H264_MAX_FRAME_HEIGHT >> 4)) |
893 | 59 | { |
894 | 59 | return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED; |
895 | 59 | } |
896 | 79.8k | u4_pic_height_in_map_units = u8_temp; |
897 | | |
898 | 79.8k | ps_seq->u2_frm_wd_in_mbs = u4_pic_width_in_mbs; |
899 | 79.8k | ps_seq->u2_frm_ht_in_mbs = u4_pic_height_in_map_units; |
900 | | |
901 | 79.8k | u2_pic_wd = (u4_pic_width_in_mbs << 4); |
902 | 79.8k | u2_pic_ht = (u4_pic_height_in_map_units << 4); |
903 | | /*--------------------------------------------------------------------*/ |
904 | | /* Get the value of MaxMbAddress and Number of bits needed for it */ |
905 | | /*--------------------------------------------------------------------*/ |
906 | 79.8k | ps_seq->u2_max_mb_addr = (ps_seq->u2_frm_wd_in_mbs |
907 | 79.8k | * ps_seq->u2_frm_ht_in_mbs) - 1; |
908 | | |
909 | 79.8k | ps_seq->u2_total_num_of_mbs = ps_seq->u2_max_mb_addr + 1; |
910 | | |
911 | 79.8k | ps_seq->u1_level_idc = ih264d_correct_level_idc( |
912 | 79.8k | u1_level_idc, ps_seq->u2_total_num_of_mbs); |
913 | | |
914 | 79.8k | u1_frm = ih264d_get_bit_h264(ps_bitstrm); |
915 | 79.8k | if((ps_dec->i4_header_decoded & 1) && (ps_seq->u1_frame_mbs_only_flag != u1_frm)) |
916 | 576 | { |
917 | 576 | ps_dec->u1_res_changed = 1; |
918 | 576 | return IVD_RES_CHANGED; |
919 | 576 | } |
920 | | |
921 | 79.2k | ps_seq->u1_frame_mbs_only_flag = u1_frm; |
922 | | |
923 | 79.2k | COPYTHECONTEXT("SPS: frame_mbs_only_flag", u1_frm); |
924 | | |
925 | 79.2k | if(!u1_frm) |
926 | 11.5k | u1_mb_aff_flag = ih264d_get_bit_h264(ps_bitstrm); |
927 | | |
928 | 79.2k | if((ps_dec->i4_header_decoded & 1) |
929 | 79.2k | && (ps_seq->u1_mb_aff_flag != u1_mb_aff_flag)) |
930 | 134 | { |
931 | 134 | ps_dec->u1_res_changed = 1; |
932 | 134 | return IVD_RES_CHANGED; |
933 | 134 | } |
934 | | |
935 | 79.1k | if(!u1_frm) |
936 | 11.4k | { |
937 | 11.4k | u2_pic_ht <<= 1; |
938 | 11.4k | ps_seq->u1_mb_aff_flag = u1_mb_aff_flag; |
939 | 11.4k | COPYTHECONTEXT("SPS: mb_adaptive_frame_field_flag", |
940 | 11.4k | ps_seq->u1_mb_aff_flag); |
941 | | |
942 | 11.4k | } |
943 | 67.7k | else |
944 | 67.7k | ps_seq->u1_mb_aff_flag = 0; |
945 | | |
946 | 79.1k | ps_seq->u1_direct_8x8_inference_flag = ih264d_get_bit_h264(ps_bitstrm); |
947 | | |
948 | 79.1k | COPYTHECONTEXT("SPS: direct_8x8_inference_flag", |
949 | 79.1k | ps_seq->u1_direct_8x8_inference_flag); |
950 | | |
951 | | /* G050 */ |
952 | 79.1k | u1_frame_cropping_flag = ih264d_get_bit_h264(ps_bitstrm); |
953 | 79.1k | COPYTHECONTEXT("SPS: frame_cropping_flag",u1_frame_cropping_flag); |
954 | | |
955 | 79.1k | if(u1_frame_cropping_flag) |
956 | 18.4k | { |
957 | 18.4k | u1_frame_cropping_rect_left_ofst = ih264d_uev(pu4_bitstrm_ofst, |
958 | 18.4k | pu4_bitstrm_buf); |
959 | 18.4k | COPYTHECONTEXT("SPS: frame_cropping_rect_left_offset", |
960 | 18.4k | u1_frame_cropping_rect_left_ofst); |
961 | 18.4k | u1_frame_cropping_rect_right_ofst = ih264d_uev(pu4_bitstrm_ofst, |
962 | 18.4k | pu4_bitstrm_buf); |
963 | 18.4k | COPYTHECONTEXT("SPS: frame_cropping_rect_right_offset", |
964 | 18.4k | u1_frame_cropping_rect_right_ofst); |
965 | 18.4k | u1_frame_cropping_rect_top_ofst = ih264d_uev(pu4_bitstrm_ofst, |
966 | 18.4k | pu4_bitstrm_buf); |
967 | 18.4k | COPYTHECONTEXT("SPS: frame_cropping_rect_top_offset", |
968 | 18.4k | u1_frame_cropping_rect_top_ofst); |
969 | 18.4k | u1_frame_cropping_rect_bottom_ofst = ih264d_uev(pu4_bitstrm_ofst, |
970 | 18.4k | pu4_bitstrm_buf); |
971 | 18.4k | COPYTHECONTEXT("SPS: frame_cropping_rect_bottom_offset", |
972 | 18.4k | u1_frame_cropping_rect_bottom_ofst); |
973 | 18.4k | } |
974 | | /* G050 */ |
975 | | |
976 | 79.1k | ps_seq->u1_vui_parameters_present_flag = ih264d_get_bit_h264(ps_bitstrm); |
977 | 79.1k | COPYTHECONTEXT("SPS: vui_parameters_present_flag", |
978 | 79.1k | ps_seq->u1_vui_parameters_present_flag); |
979 | | |
980 | 79.1k | u2_frm_wd_y = u2_pic_wd + (UWORD8)(PAD_LEN_Y_H << 1); |
981 | 79.1k | if(1 == ps_dec->u4_share_disp_buf) |
982 | 0 | { |
983 | 0 | if(ps_dec->u4_app_disp_width > u2_frm_wd_y) |
984 | 0 | u2_frm_wd_y = ps_dec->u4_app_disp_width; |
985 | 0 | } |
986 | | |
987 | 79.1k | u2_frm_ht_y = u2_pic_ht + (UWORD8)(PAD_LEN_Y_V << 2); |
988 | 79.1k | u2_frm_wd_uv = u2_pic_wd + (UWORD8)(PAD_LEN_UV_H << 2); |
989 | 79.1k | u2_frm_wd_uv = MAX(u2_frm_wd_uv, u2_frm_wd_y); |
990 | | |
991 | 79.1k | u2_frm_ht_uv = (u2_pic_ht >> 1) + (UWORD8)(PAD_LEN_UV_V << 2); |
992 | 79.1k | u2_frm_ht_uv = MAX(u2_frm_ht_uv, (u2_frm_ht_y >> 1)); |
993 | | |
994 | | |
995 | | /* Calculate display picture width, height and start u4_ofst from YUV420 */ |
996 | | /* pictute buffers as per cropping information parsed above */ |
997 | 79.1k | { |
998 | 79.1k | UWORD16 u2_rgt_ofst = 0; |
999 | 79.1k | UWORD16 u2_lft_ofst = 0; |
1000 | 79.1k | UWORD16 u2_top_ofst = 0; |
1001 | 79.1k | UWORD16 u2_btm_ofst = 0; |
1002 | 79.1k | UWORD8 u1_frm_mbs_flag; |
1003 | 79.1k | UWORD8 u1_vert_mult_factor; |
1004 | | |
1005 | 79.1k | if(u1_frame_cropping_flag) |
1006 | 18.4k | { |
1007 | | /* Calculate right and left u4_ofst for cropped picture */ |
1008 | 18.4k | u2_rgt_ofst = u1_frame_cropping_rect_right_ofst << 1; |
1009 | 18.4k | u2_lft_ofst = u1_frame_cropping_rect_left_ofst << 1; |
1010 | | |
1011 | | /* Know frame MBs only u4_flag */ |
1012 | 18.4k | u1_frm_mbs_flag = (1 == ps_seq->u1_frame_mbs_only_flag); |
1013 | | |
1014 | | /* Simplify the vertical u4_ofst calculation from field/frame */ |
1015 | 18.4k | u1_vert_mult_factor = (2 - u1_frm_mbs_flag); |
1016 | | |
1017 | | /* Calculate bottom and top u4_ofst for cropped picture */ |
1018 | 18.4k | u2_btm_ofst = (u1_frame_cropping_rect_bottom_ofst |
1019 | 18.4k | << u1_vert_mult_factor); |
1020 | 18.4k | u2_top_ofst = (u1_frame_cropping_rect_top_ofst |
1021 | 18.4k | << u1_vert_mult_factor); |
1022 | 18.4k | } |
1023 | | |
1024 | | /* Calculate u4_ofst from start of YUV 420 picture buffer to start of*/ |
1025 | | /* cropped picture buffer */ |
1026 | 79.1k | u2_crop_offset_y = (u2_frm_wd_y * u2_top_ofst) + (u2_lft_ofst); |
1027 | 79.1k | u2_crop_offset_uv = (u2_frm_wd_uv * (u2_top_ofst >> 1)) |
1028 | 79.1k | + (u2_lft_ofst >> 1) * YUV420SP_FACTOR; |
1029 | | /* Calculate the display picture width and height based on crop */ |
1030 | | /* information */ |
1031 | 79.1k | i4_cropped_ht = (WORD32)u2_pic_ht - (WORD32)(u2_btm_ofst + u2_top_ofst); |
1032 | 79.1k | i4_cropped_wd = (WORD32)u2_pic_wd - (WORD32)(u2_rgt_ofst + u2_lft_ofst); |
1033 | | |
1034 | 79.1k | if((i4_cropped_ht < MB_SIZE) || (i4_cropped_wd < MB_SIZE)) |
1035 | 377 | { |
1036 | 377 | return ERROR_INV_SPS_PPS_T; |
1037 | 377 | } |
1038 | | |
1039 | 78.7k | if((ps_dec->i4_header_decoded & 1) && (ps_dec->u2_pic_wd != u2_pic_wd)) |
1040 | 242 | { |
1041 | 242 | ps_dec->u1_res_changed = 1; |
1042 | 242 | return IVD_RES_CHANGED; |
1043 | 242 | } |
1044 | | |
1045 | 78.5k | if((ps_dec->i4_header_decoded & 1) && (ps_dec->u2_disp_width != i4_cropped_wd)) |
1046 | 139 | { |
1047 | 139 | ps_dec->u1_res_changed = 1; |
1048 | 139 | return IVD_RES_CHANGED; |
1049 | 139 | } |
1050 | | |
1051 | 78.3k | if((ps_dec->i4_header_decoded & 1) && (ps_dec->u2_pic_ht != u2_pic_ht)) |
1052 | 268 | { |
1053 | 268 | ps_dec->u1_res_changed = 1; |
1054 | 268 | return IVD_RES_CHANGED; |
1055 | 268 | } |
1056 | | |
1057 | 78.1k | if((ps_dec->i4_header_decoded & 1) && (ps_dec->u2_disp_height != i4_cropped_ht)) |
1058 | 145 | { |
1059 | 145 | ps_dec->u1_res_changed = 1; |
1060 | 145 | return IVD_RES_CHANGED; |
1061 | 145 | } |
1062 | | |
1063 | | /* Check again for unsupported resolutions with updated values*/ |
1064 | 77.9k | if((u2_pic_wd > H264_MAX_FRAME_WIDTH) || (u2_pic_ht > H264_MAX_FRAME_HEIGHT) |
1065 | 77.9k | || (u2_pic_wd < H264_MIN_FRAME_WIDTH) || (u2_pic_ht < H264_MIN_FRAME_HEIGHT) |
1066 | 77.9k | || (u2_pic_wd * (UWORD32)u2_pic_ht > H264_MAX_FRAME_SIZE)) |
1067 | 889 | { |
1068 | 889 | return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED; |
1069 | 889 | } |
1070 | | |
1071 | | /* If MBAff is enabled, decoder support is limited to streams with |
1072 | | * width less than half of H264_MAX_FRAME_WIDTH. |
1073 | | * In case of MBAff decoder processes two rows at a time |
1074 | | */ |
1075 | 77.0k | if((u2_pic_wd << ps_seq->u1_mb_aff_flag) > H264_MAX_FRAME_WIDTH) |
1076 | 65 | { |
1077 | 65 | return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED; |
1078 | 65 | } |
1079 | | |
1080 | 77.0k | } |
1081 | | |
1082 | | /* Backup num_reorder_frames if header is already decoded */ |
1083 | 77.0k | if((ps_dec->i4_header_decoded & 1) && |
1084 | 77.0k | (1 == ps_seq->u1_vui_parameters_present_flag) && |
1085 | 77.0k | (1 == ps_seq->s_vui.u1_bitstream_restriction_flag)) |
1086 | 2.95k | { |
1087 | 2.95k | num_reorder_frames = (WORD32)ps_seq->s_vui.u4_num_reorder_frames; |
1088 | 2.95k | } |
1089 | 74.0k | else |
1090 | 74.0k | { |
1091 | 74.0k | num_reorder_frames = -1; |
1092 | 74.0k | } |
1093 | 77.0k | if(1 == ps_seq->u1_vui_parameters_present_flag) |
1094 | 16.4k | { |
1095 | 16.4k | ret = ih264d_parse_vui_parametres(&ps_seq->s_vui, ps_bitstrm); |
1096 | 16.4k | if(ret != OK) |
1097 | 215 | return ret; |
1098 | | |
1099 | 16.2k | if (ps_dec->pu1_bits_buf_dynamic != NULL && ps_dec->ps_cur_sps != NULL) { |
1100 | 3.80k | vui_t *ps_vui = &ps_seq->s_vui; |
1101 | 3.80k | dec_seq_params_t *ps_sps_old = ps_dec->ps_cur_sps; |
1102 | 3.80k | vui_t *ps_vui_old = &ps_sps_old->s_vui; |
1103 | | |
1104 | 3.80k | if (ps_vui->u1_video_full_range_flag != ps_vui_old->u1_video_full_range_flag || |
1105 | 3.80k | ps_vui->u1_colour_primaries != ps_vui_old->u1_colour_primaries || |
1106 | 3.80k | ps_vui->u1_tfr_chars != ps_vui_old->u1_tfr_chars || |
1107 | 3.80k | ps_vui->u1_matrix_coeffs != ps_vui_old->u1_matrix_coeffs) { |
1108 | 615 | ps_dec->u1_res_changed = 1; |
1109 | 615 | return IVD_RES_CHANGED; |
1110 | 615 | } |
1111 | 3.80k | } |
1112 | 16.2k | } |
1113 | | |
1114 | | /* Compare older num_reorder_frames with the new one if header is already decoded */ |
1115 | 76.2k | if((ps_dec->i4_header_decoded & 1) && |
1116 | 76.2k | (-1 != num_reorder_frames) && |
1117 | 76.2k | (1 == ps_seq->u1_vui_parameters_present_flag) && |
1118 | 76.2k | (1 == ps_seq->s_vui.u1_bitstream_restriction_flag) && |
1119 | 76.2k | ((WORD32)ps_seq->s_vui.u4_num_reorder_frames != num_reorder_frames)) |
1120 | 170 | { |
1121 | 170 | ps_dec->u1_res_changed = 1; |
1122 | 170 | return IVD_RES_CHANGED; |
1123 | 170 | } |
1124 | | |
1125 | | /* In case bitstream read has exceeded the filled size, then |
1126 | | return an error */ |
1127 | 76.0k | if (EXCEED_OFFSET(ps_bitstrm)) |
1128 | 591 | { |
1129 | 591 | return ERROR_INV_SPS_PPS_T; |
1130 | 591 | } |
1131 | | |
1132 | | /*--------------------------------------------------------------------*/ |
1133 | | /* All initializations to ps_dec are beyond this point */ |
1134 | | /*--------------------------------------------------------------------*/ |
1135 | 75.4k | { |
1136 | 75.4k | WORD32 reorder_depth = ih264d_get_dpb_size(ps_seq); |
1137 | 75.4k | if((1 == ps_seq->u1_vui_parameters_present_flag) && |
1138 | 75.4k | (1 == ps_seq->s_vui.u1_bitstream_restriction_flag)) |
1139 | 3.10k | { |
1140 | 3.10k | reorder_depth = ps_seq->s_vui.u4_num_reorder_frames + 1; |
1141 | 3.10k | } |
1142 | | |
1143 | 75.4k | if (reorder_depth > H264_MAX_REF_PICS) |
1144 | 3 | { |
1145 | 3 | return ERROR_INV_SPS_PPS_T; |
1146 | 3 | } |
1147 | | |
1148 | 75.4k | if(ps_seq->u1_frame_mbs_only_flag != 1) |
1149 | 9.71k | reorder_depth *= 2; |
1150 | 75.4k | ps_dec->i4_reorder_depth = reorder_depth + DISPLAY_LATENCY; |
1151 | 75.4k | } |
1152 | 0 | ps_dec->u2_disp_height = i4_cropped_ht; |
1153 | 75.4k | ps_dec->u2_disp_width = i4_cropped_wd; |
1154 | | |
1155 | 75.4k | ps_dec->u2_pic_wd = u2_pic_wd; |
1156 | 75.4k | ps_dec->u2_pic_ht = u2_pic_ht; |
1157 | 75.4k | ps_dec->u4_total_mbs = ps_seq->u2_total_num_of_mbs << (1 - ps_seq->u1_frame_mbs_only_flag); |
1158 | | |
1159 | | /* Determining the Width and Height of Frame from that of Picture */ |
1160 | 75.4k | ps_dec->u2_frm_wd_y = u2_frm_wd_y; |
1161 | 75.4k | ps_dec->u2_frm_ht_y = u2_frm_ht_y; |
1162 | | |
1163 | 75.4k | ps_dec->u2_frm_wd_uv = u2_frm_wd_uv; |
1164 | 75.4k | ps_dec->u2_frm_ht_uv = u2_frm_ht_uv; |
1165 | 75.4k | ps_dec->s_pad_mgr.u1_pad_len_y_v = (UWORD8)(PAD_LEN_Y_V << (1 - u1_frm)); |
1166 | 75.4k | ps_dec->s_pad_mgr.u1_pad_len_cr_v = (UWORD8)(PAD_LEN_UV_V << (1 - u1_frm)); |
1167 | | |
1168 | 75.4k | ps_dec->u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs; |
1169 | 75.4k | ps_dec->u2_frm_ht_in_mbs = ps_seq->u2_frm_ht_in_mbs; |
1170 | | |
1171 | 75.4k | ps_dec->u2_crop_offset_y = u2_crop_offset_y; |
1172 | 75.4k | ps_dec->u2_crop_offset_uv = u2_crop_offset_uv; |
1173 | | |
1174 | 75.4k | ps_seq->u1_is_valid = TRUE; |
1175 | 75.4k | ps_dec->ps_sps[u1_seq_parameter_set_id] = *ps_seq; |
1176 | 75.4k | ps_dec->ps_cur_sps = &ps_dec->ps_sps[u1_seq_parameter_set_id]; |
1177 | | |
1178 | 75.4k | return OK; |
1179 | 75.4k | } |
1180 | | |
1181 | | /*! |
1182 | | ************************************************************************** |
1183 | | * \if Function name : ih264d_parse_end_of_sequence \endif |
1184 | | * |
1185 | | * \brief |
1186 | | * Decodes End of Sequence. |
1187 | | * |
1188 | | * \param ps_bitstrm : Pointer to bit ps_bitstrm containing the NAL unit |
1189 | | * |
1190 | | * \return |
1191 | | * 0 on Success and error code otherwise |
1192 | | ************************************************************************** |
1193 | | */ |
1194 | | WORD32 ih264d_parse_end_of_sequence(dec_struct_t * ps_dec) |
1195 | 0 | { |
1196 | 0 | WORD32 ret; |
1197 | |
|
1198 | 0 | ret = ih264d_end_of_pic_processing(ps_dec); |
1199 | 0 | return ret; |
1200 | 0 | } |
1201 | | |
1202 | | /*! |
1203 | | ************************************************************************** |
1204 | | * \if Function name : AcessUnitDelimiterRbsp \endif |
1205 | | * |
1206 | | * \brief |
1207 | | * Decodes AcessUnitDelimiterRbsp. |
1208 | | * |
1209 | | * \param ps_bitstrm : Pointer to bit ps_bitstrm containing the NAL unit |
1210 | | * |
1211 | | * \return |
1212 | | * 0 on Success and error code otherwise |
1213 | | ************************************************************************** |
1214 | | */ |
1215 | | |
1216 | | WORD32 ih264d_access_unit_delimiter_rbsp(dec_struct_t * ps_dec) |
1217 | 7.24k | { |
1218 | 7.24k | UWORD8 u1_primary_pic_type; |
1219 | 7.24k | u1_primary_pic_type = ih264d_get_bits_h264(ps_dec->ps_bitstrm, 3); |
1220 | 7.24k | switch(u1_primary_pic_type) |
1221 | 7.24k | { |
1222 | 6.68k | case I_PIC: |
1223 | 6.98k | case SI_PIC: |
1224 | 6.99k | case ISI_PIC: |
1225 | 6.99k | ps_dec->ps_dec_err_status->u1_pic_aud_i = PIC_TYPE_I; |
1226 | 6.99k | break; |
1227 | 248 | default: |
1228 | 248 | ps_dec->ps_dec_err_status->u1_pic_aud_i = PIC_TYPE_UNKNOWN; |
1229 | 7.24k | } |
1230 | 7.24k | return (0); |
1231 | 7.24k | } |
1232 | | /*! |
1233 | | ************************************************************************** |
1234 | | * \if Function name : ih264d_parse_nal_unit \endif |
1235 | | * |
1236 | | * \brief |
1237 | | * Decodes NAL unit |
1238 | | * |
1239 | | * \return |
1240 | | * 0 on Success and error code otherwise |
1241 | | ************************************************************************** |
1242 | | */ |
1243 | | |
1244 | | WORD32 ih264d_parse_nal_unit(iv_obj_t *dec_hdl, |
1245 | | ivd_video_decode_op_t *ps_dec_op, |
1246 | | UWORD8 *pu1_buf, |
1247 | | UWORD32 u4_length) |
1248 | 404k | { |
1249 | | |
1250 | 404k | dec_bit_stream_t *ps_bitstrm; |
1251 | | |
1252 | | |
1253 | 404k | dec_struct_t *ps_dec = (dec_struct_t *)dec_hdl->pv_codec_handle; |
1254 | 404k | ivd_video_decode_ip_t *ps_dec_in = |
1255 | 404k | (ivd_video_decode_ip_t *)ps_dec->pv_dec_in; |
1256 | 404k | dec_slice_params_t * ps_cur_slice = ps_dec->ps_cur_slice; |
1257 | 404k | UWORD8 u1_first_byte, u1_nal_ref_idc; |
1258 | 404k | UWORD8 u1_nal_unit_type; |
1259 | 404k | WORD32 i_status = OK; |
1260 | 404k | ps_bitstrm = ps_dec->ps_bitstrm; |
1261 | | |
1262 | 404k | if(pu1_buf) |
1263 | 404k | { |
1264 | 404k | if(u4_length) |
1265 | 404k | { |
1266 | 404k | ps_dec_op->u4_frame_decoded_flag = 0; |
1267 | 404k | ih264d_process_nal_unit(ps_dec->ps_bitstrm, pu1_buf, |
1268 | 404k | u4_length); |
1269 | | |
1270 | 404k | SWITCHOFFTRACE; |
1271 | 404k | u1_first_byte = ih264d_get_bits_h264(ps_bitstrm, 8); |
1272 | | |
1273 | 404k | if(NAL_FORBIDDEN_BIT(u1_first_byte)) |
1274 | 76.3k | { |
1275 | 76.3k | H264_DEC_DEBUG_PRINT("\nForbidden bit set in Nal Unit, Let's try\n"); |
1276 | 76.3k | } |
1277 | 404k | u1_nal_unit_type = NAL_UNIT_TYPE(u1_first_byte); |
1278 | | // if any other nal unit other than slice nal is encountered in between a |
1279 | | // frame break out of loop without consuming header |
1280 | 404k | if ((ps_dec->u4_slice_start_code_found == 1) |
1281 | 404k | && (ps_dec->u1_pic_decode_done != 1) |
1282 | 404k | && (u1_nal_unit_type > IDR_SLICE_NAL)) |
1283 | 3.75k | { |
1284 | 3.75k | return ERROR_INCOMPLETE_FRAME; |
1285 | 3.75k | } |
1286 | 400k | ps_dec->u1_nal_unit_type = u1_nal_unit_type; |
1287 | 400k | u1_nal_ref_idc = (UWORD8)(NAL_REF_IDC(u1_first_byte)); |
1288 | | //Skip all NALUs if SPS and PPS are not decoded |
1289 | 400k | switch(u1_nal_unit_type) |
1290 | 400k | { |
1291 | 595 | case SLICE_DATA_PARTITION_A_NAL: |
1292 | 662 | case SLICE_DATA_PARTITION_B_NAL: |
1293 | 811 | case SLICE_DATA_PARTITION_C_NAL: |
1294 | 811 | if(!ps_dec->i4_decode_header) |
1295 | 484 | ih264d_parse_slice_partition(ps_dec, ps_bitstrm); |
1296 | | |
1297 | 811 | break; |
1298 | | |
1299 | 6.13k | case IDR_SLICE_NAL: |
1300 | 53.8k | case SLICE_NAL: |
1301 | | |
1302 | | /* ! */ |
1303 | 53.8k | DEBUG_THREADS_PRINTF("Decoding a slice NAL\n"); |
1304 | 53.8k | if(!ps_dec->i4_decode_header) |
1305 | 24.1k | { |
1306 | 24.1k | if(ps_dec->i4_header_decoded == 3) |
1307 | 21.8k | { |
1308 | 21.8k | ih264d_get_pre_sei_params(ps_dec, u1_nal_unit_type); |
1309 | | /* ! */ |
1310 | 21.8k | ps_dec->u4_slice_start_code_found = 1; |
1311 | | |
1312 | 21.8k | ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm); |
1313 | | |
1314 | 21.8k | i_status = ih264d_parse_decode_slice( |
1315 | 21.8k | (UWORD8)(u1_nal_unit_type |
1316 | 21.8k | == IDR_SLICE_NAL), |
1317 | 21.8k | u1_nal_ref_idc, ps_dec); |
1318 | | |
1319 | 21.8k | if(i_status != OK) |
1320 | 15.4k | { |
1321 | 15.4k | return i_status; |
1322 | 15.4k | } |
1323 | 21.8k | } |
1324 | 2.35k | else |
1325 | 2.35k | { |
1326 | 2.35k | H264_DEC_DEBUG_PRINT( |
1327 | 2.35k | "\nSlice NAL Supplied but no header has been supplied\n"); |
1328 | 2.35k | } |
1329 | 24.1k | } |
1330 | 38.4k | break; |
1331 | | |
1332 | 59.0k | case SEI_NAL: |
1333 | 59.0k | if(!ps_dec->i4_decode_header) |
1334 | 36.6k | { |
1335 | 36.6k | ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm); |
1336 | 36.6k | i_status = ih264d_parse_sei_message(ps_dec, ps_bitstrm); |
1337 | 36.6k | if(i_status != OK) |
1338 | 32.3k | return i_status; |
1339 | 4.29k | ih264d_parse_sei(ps_dec, ps_bitstrm); |
1340 | 4.29k | } |
1341 | 26.6k | break; |
1342 | 84.7k | case SEQ_PARAM_NAL: |
1343 | | /* ! */ |
1344 | 84.7k | ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm); |
1345 | 84.7k | i_status = ih264d_parse_sps(ps_dec, ps_bitstrm); |
1346 | 84.7k | ps_dec->u4_sps_cnt_in_process++; |
1347 | | /*If a resolution change happens within a process call, due to multiple sps |
1348 | | * we will not support it. |
1349 | | */ |
1350 | 84.7k | if((ps_dec->u4_sps_cnt_in_process > 1 ) && |
1351 | 84.7k | (i_status == IVD_RES_CHANGED)) |
1352 | 2.33k | { |
1353 | 2.33k | i_status = ERROR_INV_SPS_PPS_T; |
1354 | 2.33k | ps_dec->u1_res_changed = 0; |
1355 | 2.33k | } |
1356 | 84.7k | if(i_status == ERROR_INV_SPS_PPS_T) |
1357 | 4.84k | return i_status; |
1358 | 79.8k | if(!i_status) |
1359 | 75.4k | ps_dec->i4_header_decoded |= 0x1; |
1360 | 79.8k | break; |
1361 | | |
1362 | 45.4k | case PIC_PARAM_NAL: |
1363 | | /* ! */ |
1364 | 45.4k | ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm); |
1365 | 45.4k | i_status = ih264d_parse_pps(ps_dec, ps_bitstrm); |
1366 | 45.4k | if(i_status == ERROR_INV_SPS_PPS_T) |
1367 | 1.15k | return i_status; |
1368 | 44.3k | if(!i_status) |
1369 | 42.9k | ps_dec->i4_header_decoded |= 0x2; |
1370 | 44.3k | break; |
1371 | 14.1k | case ACCESS_UNIT_DELIMITER_RBSP: |
1372 | 14.1k | if(!ps_dec->i4_decode_header) |
1373 | 7.24k | { |
1374 | 7.24k | ih264d_access_unit_delimiter_rbsp(ps_dec); |
1375 | 7.24k | } |
1376 | 14.1k | break; |
1377 | | //Let us ignore the END_OF_SEQ_RBSP NAL and decode even after this NAL |
1378 | 350 | case END_OF_STREAM_RBSP: |
1379 | 350 | if(!ps_dec->i4_decode_header) |
1380 | 287 | { |
1381 | 287 | ih264d_parse_end_of_stream(ps_dec); |
1382 | 287 | } |
1383 | 350 | break; |
1384 | 145 | case FILLER_DATA_NAL: |
1385 | 145 | if(!ps_dec->i4_decode_header) |
1386 | 124 | { |
1387 | 124 | ih264d_parse_filler_data(ps_dec, ps_bitstrm); |
1388 | 124 | } |
1389 | 145 | break; |
1390 | 141k | default: |
1391 | 141k | H264_DEC_DEBUG_PRINT("\nUnknown NAL type %d\n", u1_nal_unit_type); |
1392 | 141k | break; |
1393 | 400k | } |
1394 | | |
1395 | 400k | } |
1396 | | |
1397 | 404k | } |
1398 | | |
1399 | 346k | return i_status; |
1400 | | |
1401 | 404k | } |