• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "ih264_typedefs.h"
34 #include "ih264_macros.h"
35 #include "ih264_platform_macros.h"
36 #include "ih264d_bitstrm.h"
37 #include "ih264d_structs.h"
38 #include "ih264d_parse_cavlc.h"
39 #include "ih264d_defs.h"
40 #include "ih264d_defs.h"
41 #include "ih264d_defs.h"
42 #include "ih264d_parse_slice.h"
43 #include "ih264d_tables.h"
44 #include "ih264d_utils.h"
45 #include "ih264d_nal.h"
46 #include "ih264d_deblocking.h"
47 
48 #include "ih264d_mem_request.h"
49 #include "ih264d_debug.h"
50 #include "ih264d_error_handler.h"
51 #include "ih264d_mb_utils.h"
52 #include "ih264d_sei.h"
53 #include "ih264d_vui.h"
54 #include "ih264d_thread_parse_decode.h"
55 #include "ih264d_thread_compute_bs.h"
56 #include "ih264d_quant_scaling.h"
57 #include "ih264d_defs.h"
58 #include "ivd.h"
59 #include "ih264d.h"
60 
61 /*****************************************************************************/
62 /*                                                                           */
63 /*  Function Name : ih264d_parse_slice_partition                                     */
64 /*                                                                           */
65 /*  Description   : This function is intended to parse and decode slice part */
66 /*                  itions. Currently it's not implemented. Decoder will     */
67 /*                  print a message, skips this NAL and continues            */
68 /*  Inputs        : ps_dec    Decoder parameters                             */
69 /*                  ps_bitstrm    Bitstream                                */
70 /*  Globals       : None                                                     */
71 /*  Processing    : This functionality needs to be implemented               */
72 /*  Outputs       : None                                                     */
73 /*  Returns       : None                                                     */
74 /*                                                                           */
75 /*  Issues        : Not implemented                                          */
76 /*                                                                           */
77 /*  Revision History:                                                        */
78 /*                                                                           */
79 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
80 /*         06 05 2002   NS              Draft                                */
81 /*                                                                           */
82 /*****************************************************************************/
83 
ih264d_parse_slice_partition(dec_struct_t * ps_dec,dec_bit_stream_t * ps_bitstrm)84 WORD32 ih264d_parse_slice_partition(dec_struct_t * ps_dec,
85                                     dec_bit_stream_t * ps_bitstrm)
86 {
87     H264_DEC_DEBUG_PRINT("\nSlice partition not supported");
88     UNUSED(ps_dec);
89     UNUSED(ps_bitstrm);
90     return (0);
91 }
92 
93 /*****************************************************************************/
94 /*                                                                           */
95 /*  Function Name : ih264d_parse_sei                                                */
96 /*                                                                           */
97 /*  Description   : This function is intended to parse and decode SEI        */
98 /*                  Currently it's not implemented. Decoder will print a     */
99 /*                  message, skips this NAL and continues                    */
100 /*  Inputs        : ps_dec    Decoder parameters                       */
101 /*                  ps_bitstrm    Bitstream                                */
102 /*  Globals       : None                                                     */
103 /*  Processing    : This functionality needs to be implemented               */
104 /*  Outputs       : None                                                     */
105 /*  Returns       : None                                                     */
106 /*                                                                           */
107 /*  Issues        : Not implemented                                          */
108 /*                                                                           */
109 /*  Revision History:                                                        */
110 /*                                                                           */
111 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
112 /*         06 05 2002   NS              Draft                                */
113 /*                                                                           */
114 /*****************************************************************************/
ih264d_parse_sei(dec_struct_t * ps_dec,dec_bit_stream_t * ps_bitstrm)115 WORD32 ih264d_parse_sei(dec_struct_t * ps_dec, dec_bit_stream_t * ps_bitstrm)
116 {
117     UNUSED(ps_dec);
118     UNUSED(ps_bitstrm);
119     return (0);
120 }
121 
122 /*****************************************************************************/
123 /*                                                                           */
124 /*  Function Name : ih264d_parse_filler_data                                          */
125 /*                                                                           */
126 /*  Description   : This function is intended to parse and decode filler     */
127 /*                  data NAL. Currently it's not implemented. Decoder will   */
128 /*                  print a message, skips this NAL and continues            */
129 /*  Inputs        : ps_dec    Decoder parameters                       */
130 /*                  ps_bitstrm    Bitstream                                */
131 /*  Globals       : None                                                     */
132 /*  Processing    : This functionality needs to be implemented               */
133 /*  Outputs       : None                                                     */
134 /*  Returns       : None                                                     */
135 /*                                                                           */
136 /*  Issues        : Not implemented                                          */
137 /*                                                                           */
138 /*  Revision History:                                                        */
139 /*                                                                           */
140 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
141 /*         06 05 2002   NS              Draft                                */
142 /*                                                                           */
143 /*****************************************************************************/
ih264d_parse_filler_data(dec_struct_t * ps_dec,dec_bit_stream_t * ps_bitstrm)144 WORD32 ih264d_parse_filler_data(dec_struct_t * ps_dec,
145                                 dec_bit_stream_t * ps_bitstrm)
146 {
147     UNUSED(ps_dec);
148     UNUSED(ps_bitstrm);
149     return (0);
150 }
151 
152 /*****************************************************************************/
153 /*                                                                           */
154 /*  Function Name : ih264d_parse_end_of_stream                                        */
155 /*                                                                           */
156 /*  Description   : This function is intended to parse and decode end of     */
157 /*                  sequence. Currently it's not implemented. Decoder will   */
158 /*                  print a message, skips this NAL and continues            */
159 /*  Inputs        : ps_dec    Decoder parameters                       */
160 /*  Globals       : None                                                     */
161 /*  Processing    : This functionality needs to be implemented               */
162 /*  Outputs       : None                                                     */
163 /*  Returns       : None                                                     */
164 /*                                                                           */
165 /*  Issues        : Not implemented                                          */
166 /*                                                                           */
167 /*  Revision History:                                                        */
168 /*                                                                           */
169 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
170 /*         06 05 2002   NS              Draft                                */
171 /*                                                                           */
172 /*****************************************************************************/
ih264d_parse_end_of_stream(dec_struct_t * ps_dec)173 void ih264d_parse_end_of_stream(dec_struct_t * ps_dec)
174 {
175     UNUSED(ps_dec);
176     return;
177 }
178 
179 /*!
180  **************************************************************************
181  * \if Function name : ih264d_parse_pps \endif
182  *
183  * \brief
184  *    Decodes Picture Parameter set
185  *
186  * \return
187  *    0 on Success and Error code otherwise
188  **************************************************************************
189  */
ih264d_parse_pps(dec_struct_t * ps_dec,dec_bit_stream_t * ps_bitstrm)190 WORD32 ih264d_parse_pps(dec_struct_t * ps_dec, dec_bit_stream_t * ps_bitstrm)
191 {
192     UWORD8 uc_temp;
193     dec_seq_params_t * ps_sps = NULL;
194     dec_pic_params_t * ps_pps = NULL;
195     UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer;
196     UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst;
197 
198     /* Variables used for error resilience checks */
199     UWORD32 u4_temp;
200     WORD32 i_temp;
201 
202     /* For High profile related syntax elements */
203     UWORD8 u1_more_data_flag;
204     WORD32 i4_i;
205 
206     /*--------------------------------------------------------------------*/
207     /* Decode pic_parameter_set_id and find corresponding pic params      */
208     /*--------------------------------------------------------------------*/
209     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
210     if(u4_temp & MASK_ERR_PIC_SET_ID)
211         return ERROR_INV_SPS_PPS_T;
212     ps_pps = ps_dec->pv_scratch_sps_pps;
213     *ps_pps = ps_dec->ps_pps[u4_temp];
214     ps_pps->u1_pic_parameter_set_id = (WORD8)u4_temp;
215     COPYTHECONTEXT("PPS: pic_parameter_set_id",ps_pps->u1_pic_parameter_set_id);
216 
217     /************************************************/
218     /* initilization of High profile syntax element */
219     /************************************************/
220     ps_pps->i4_transform_8x8_mode_flag = 0;
221     ps_pps->i4_pic_scaling_matrix_present_flag = 0;
222 
223     /*--------------------------------------------------------------------*/
224     /* Decode seq_parameter_set_id and map it to a seq_parameter_set      */
225     /*--------------------------------------------------------------------*/
226     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
227     if(u4_temp & MASK_ERR_SEQ_SET_ID)
228         return ERROR_INV_SPS_PPS_T;
229     COPYTHECONTEXT("PPS: seq_parameter_set_id",u4_temp);
230     ps_sps = &ps_dec->ps_sps[u4_temp];
231     ps_pps->ps_sps = ps_sps;
232 
233     /*--------------------------------------------------------------------*/
234     /* Decode entropy_coding_mode                                         */
235     /*--------------------------------------------------------------------*/
236     ps_pps->u1_entropy_coding_mode = ih264d_get_bit_h264(ps_bitstrm);
237     COPYTHECONTEXT("PPS: entropy_coding_mode_flag",ps_pps->u1_entropy_coding_mode);
238 
239     ps_pps->u1_pic_order_present_flag = ih264d_get_bit_h264(ps_bitstrm);
240     COPYTHECONTEXT("PPS: pic_order_present_flag",ps_pps->u1_pic_order_present_flag);
241 
242     /*--------------------------------------------------------------------*/
243     /* Decode num_slice_groups_minus1                                     */
244     /*--------------------------------------------------------------------*/
245     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf) + 1;
246     if(u4_temp != 1)
247     {
248         UWORD32 i4_error_code;
249         i4_error_code = ERROR_FEATURE_UNAVAIL;
250         return i4_error_code;
251     }
252     ps_pps->u1_num_slice_groups = u4_temp;
253     COPYTHECONTEXT("PPS: num_slice_groups_minus1",ps_pps->u1_num_slice_groups -1);
254 
255     /*--------------------------------------------------------------------*/
256     /* Other parameter set values                                         */
257     /*--------------------------------------------------------------------*/
258     u4_temp = 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
259     if(u4_temp > H264_MAX_REF_IDX)
260         return ERROR_REF_IDX;
261     ps_pps->u1_num_ref_idx_lx_active[0] = u4_temp;
262     COPYTHECONTEXT("PPS: num_ref_idx_l0_active_minus1",
263                     ps_pps->u1_num_ref_idx_lx_active[0] - 1);
264 
265     u4_temp = 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
266     if(u4_temp > H264_MAX_REF_IDX)
267         return ERROR_REF_IDX;
268     ps_pps->u1_num_ref_idx_lx_active[1] = u4_temp;
269     COPYTHECONTEXT("PPS: num_ref_idx_l1_active_minus1",
270                     ps_pps->u1_num_ref_idx_lx_active[1] - 1);
271 
272     ps_pps->u1_wted_pred_flag = ih264d_get_bit_h264(ps_bitstrm);
273     COPYTHECONTEXT("PPS: weighted prediction u4_flag",ps_pps->u1_wted_pred_flag);
274     uc_temp = ih264d_get_bits_h264(ps_bitstrm, 2);
275     COPYTHECONTEXT("PPS: weighted_bipred_idc",uc_temp);
276     ps_pps->u1_wted_bipred_idc = uc_temp;
277 
278     if(ps_pps->u1_wted_bipred_idc > MAX_WEIGHT_BIPRED_IDC)
279         return ERROR_INV_SPS_PPS_T;
280 
281     i_temp = 26 + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
282 
283     if((i_temp < 0) || (i_temp > 51))
284         return ERROR_INV_RANGE_QP_T;
285 
286     ps_pps->u1_pic_init_qp = i_temp;
287     COPYTHECONTEXT("PPS: pic_init_qp_minus26",ps_pps->u1_pic_init_qp - 26);
288 
289     i_temp = 26 + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
290 
291     if((i_temp < 0) || (i_temp > 51))
292         return ERROR_INV_RANGE_QP_T;
293 
294     ps_pps->u1_pic_init_qs = i_temp;
295     COPYTHECONTEXT("PPS: pic_init_qs_minus26",ps_pps->u1_pic_init_qs - 26);
296 
297     i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
298     if((i_temp < -12) || (i_temp > 12))
299         return ERROR_INV_RANGE_QP_T;
300     ps_pps->i1_chroma_qp_index_offset = i_temp;
301     COPYTHECONTEXT("PPS: chroma_qp_index_offset",ps_pps->i1_chroma_qp_index_offset);
302 
303     /***************************************************************************/
304     /* initialize second_chroma_qp_index_offset to i1_chroma_qp_index_offset if */
305     /* second_chroma_qp_index_offset is not present in bit-ps_bitstrm              */
306     /***************************************************************************/
307     ps_pps->i1_second_chroma_qp_index_offset =
308                     ps_pps->i1_chroma_qp_index_offset;
309 
310     ps_pps->u1_deblocking_filter_parameters_present_flag = ih264d_get_bit_h264(
311                     ps_bitstrm);
312     COPYTHECONTEXT("PPS: deblocking_filter_control_present_flag",
313                     ps_pps->u1_deblocking_filter_parameters_present_flag);
314     ps_pps->u1_constrained_intra_pred_flag = ih264d_get_bit_h264(ps_bitstrm);
315     COPYTHECONTEXT("PPS: constrained_intra_pred_flag",
316                     ps_pps->u1_constrained_intra_pred_flag);
317     ps_pps->u1_redundant_pic_cnt_present_flag = ih264d_get_bit_h264(ps_bitstrm);
318     COPYTHECONTEXT("PPS: redundant_pic_cnt_present_flag",
319                     ps_pps->u1_redundant_pic_cnt_present_flag);
320 
321     /* High profile related syntax elements */
322     u1_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
323     if(u1_more_data_flag && (ps_pps->ps_sps->u1_profile_idc == HIGH_PROFILE_IDC))
324     {
325         /* read transform_8x8_mode_flag  */
326         ps_pps->i4_transform_8x8_mode_flag = (WORD32)ih264d_get_bit_h264(
327                         ps_bitstrm);
328 
329         /* read pic_scaling_matrix_present_flag */
330         ps_pps->i4_pic_scaling_matrix_present_flag =
331                         (WORD32)ih264d_get_bit_h264(ps_bitstrm);
332 
333         if(ps_pps->i4_pic_scaling_matrix_present_flag)
334         {
335             /* read the scaling matrices */
336             for(i4_i = 0; i4_i < (6 + (ps_pps->i4_transform_8x8_mode_flag << 1)); i4_i++)
337             {
338                 ps_pps->u1_pic_scaling_list_present_flag[i4_i] =
339                                 ih264d_get_bit_h264(ps_bitstrm);
340 
341                 if(ps_pps->u1_pic_scaling_list_present_flag[i4_i])
342                 {
343                     if(i4_i < 6)
344                     {
345                         ih264d_scaling_list(
346                                         ps_pps->i2_pic_scalinglist4x4[i4_i],
347                                         16,
348                                         &ps_pps->u1_pic_use_default_scaling_matrix_flag[i4_i],
349                                         ps_bitstrm);
350                     }
351                     else
352                     {
353                         ih264d_scaling_list(
354                                         ps_pps->i2_pic_scalinglist8x8[i4_i - 6],
355                                         64,
356                                         &ps_pps->u1_pic_use_default_scaling_matrix_flag[i4_i],
357                                         ps_bitstrm);
358                     }
359                 }
360             }
361         }
362 
363         /* read second_chroma_qp_index_offset syntax element */
364         ps_pps->i1_second_chroma_qp_index_offset = ih264d_sev(
365                         pu4_bitstrm_ofst, pu4_bitstrm_buf);
366 
367         if((ps_pps->i1_second_chroma_qp_index_offset + 12) > 24)
368             return ERROR_INV_RANGE_QP_T;
369     }
370 
371     /* In case bitstream read has exceeded the filled size, then
372        return an error */
373     if(ps_bitstrm->u4_ofst > ps_bitstrm->u4_max_ofst + 8)
374     {
375         return ERROR_INV_SPS_PPS_T;
376     }
377     ps_pps->u1_is_valid = TRUE;
378     ps_dec->ps_pps[ps_pps->u1_pic_parameter_set_id] = *ps_pps;
379     return OK;
380 }
381 
382 /*!
383  **************************************************************************
384  * \if Function name : ih264d_parse_sps \endif
385  *
386  * \brief
387  *    Decodes Sequence parameter set from the bitstream
388  *
389  * \return
390  *    0 on Success and Error code otherwise
391  **************************************************************************
392  */
ih264d_correct_level_idc(UWORD32 u4_level_idc,UWORD32 u4_total_mbs)393 UWORD32 ih264d_correct_level_idc(UWORD32 u4_level_idc, UWORD32 u4_total_mbs)
394 {
395     UWORD32 u4_max_mbs_allowed;
396 
397     switch(u4_level_idc)
398     {
399         case H264_LEVEL_1_0:
400             u4_max_mbs_allowed = MAX_MBS_LEVEL_10;
401             break;
402         case H264_LEVEL_1_1:
403             u4_max_mbs_allowed = MAX_MBS_LEVEL_11;
404             break;
405         case H264_LEVEL_1_2:
406             u4_max_mbs_allowed = MAX_MBS_LEVEL_12;
407             break;
408         case H264_LEVEL_1_3:
409             u4_max_mbs_allowed = MAX_MBS_LEVEL_13;
410             break;
411         case H264_LEVEL_2_0:
412             u4_max_mbs_allowed = MAX_MBS_LEVEL_20;
413             break;
414         case H264_LEVEL_2_1:
415             u4_max_mbs_allowed = MAX_MBS_LEVEL_21;
416             break;
417         case H264_LEVEL_2_2:
418             u4_max_mbs_allowed = MAX_MBS_LEVEL_22;
419             break;
420         case H264_LEVEL_3_0:
421             u4_max_mbs_allowed = MAX_MBS_LEVEL_30;
422             break;
423         case H264_LEVEL_3_1:
424             u4_max_mbs_allowed = MAX_MBS_LEVEL_31;
425             break;
426         case H264_LEVEL_3_2:
427             u4_max_mbs_allowed = MAX_MBS_LEVEL_32;
428             break;
429         case H264_LEVEL_4_0:
430             u4_max_mbs_allowed = MAX_MBS_LEVEL_40;
431             break;
432         case H264_LEVEL_4_1:
433             u4_max_mbs_allowed = MAX_MBS_LEVEL_41;
434             break;
435         case H264_LEVEL_4_2:
436             u4_max_mbs_allowed = MAX_MBS_LEVEL_42;
437             break;
438         case H264_LEVEL_5_0:
439             u4_max_mbs_allowed = MAX_MBS_LEVEL_50;
440             break;
441         case H264_LEVEL_5_1:
442         default:
443             u4_max_mbs_allowed = MAX_MBS_LEVEL_51;
444             break;
445 
446     }
447 
448     /*correct of the level is incorrect*/
449     if(u4_total_mbs > u4_max_mbs_allowed)
450     {
451         if(u4_total_mbs > MAX_MBS_LEVEL_50)
452             u4_level_idc = H264_LEVEL_5_1;
453         else if(u4_total_mbs > MAX_MBS_LEVEL_42)
454             u4_level_idc = H264_LEVEL_5_0;
455         else if(u4_total_mbs > MAX_MBS_LEVEL_41)
456             u4_level_idc = H264_LEVEL_4_2;
457         else if(u4_total_mbs > MAX_MBS_LEVEL_40)
458             u4_level_idc = H264_LEVEL_4_1;
459         else if(u4_total_mbs > MAX_MBS_LEVEL_32)
460             u4_level_idc = H264_LEVEL_4_0;
461         else if(u4_total_mbs > MAX_MBS_LEVEL_31)
462             u4_level_idc = H264_LEVEL_3_2;
463         else if(u4_total_mbs > MAX_MBS_LEVEL_30)
464             u4_level_idc = H264_LEVEL_3_1;
465         else if(u4_total_mbs > MAX_MBS_LEVEL_21)
466             u4_level_idc = H264_LEVEL_3_0;
467         else if(u4_total_mbs > MAX_MBS_LEVEL_20)
468             u4_level_idc = H264_LEVEL_2_1;
469         else if(u4_total_mbs > MAX_MBS_LEVEL_10)
470             u4_level_idc = H264_LEVEL_2_0;
471     }
472 
473     return (u4_level_idc);
474 
475 }
ih264d_parse_sps(dec_struct_t * ps_dec,dec_bit_stream_t * ps_bitstrm)476 WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm)
477 {
478     UWORD8 i;
479     dec_seq_params_t *ps_seq = NULL;
480     UWORD8 u1_profile_idc, u1_level_idc, u1_seq_parameter_set_id;
481     UWORD16 i2_max_frm_num;
482     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
483     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
484     UWORD8 u1_frm, uc_constraint_set0_flag, uc_constraint_set1_flag;
485 
486     UWORD32 u4_temp;
487     WORD32 pic_height_in_map_units_minus1 = 0;
488     UWORD32 u2_pic_wd = 0;
489     UWORD32 u2_pic_ht = 0;
490     UWORD32 u2_frm_wd_y = 0;
491     UWORD32 u2_frm_ht_y = 0;
492     UWORD32 u2_frm_wd_uv = 0;
493     UWORD32 u2_frm_ht_uv = 0;
494     UWORD32 u2_crop_offset_y = 0;
495     UWORD32 u2_crop_offset_uv = 0;
496     WORD32 ret;
497 
498     /* High profile related syntax element */
499     WORD32 i4_i;
500     /* G050 */
501     UWORD8 u1_frame_cropping_flag, u1_frame_cropping_rect_left_ofst,
502                     u1_frame_cropping_rect_right_ofst,
503                     u1_frame_cropping_rect_top_ofst,
504                     u1_frame_cropping_rect_bottom_ofst;
505     /* G050 */
506     /*--------------------------------------------------------------------*/
507     /* Decode seq_parameter_set_id and profile and level values           */
508     /*--------------------------------------------------------------------*/
509     SWITCHONTRACE;
510     u1_profile_idc = ih264d_get_bits_h264(ps_bitstrm, 8);
511     COPYTHECONTEXT("SPS: profile_idc",u1_profile_idc);
512 
513     /* G050 */
514     uc_constraint_set0_flag = ih264d_get_bit_h264(ps_bitstrm);
515     uc_constraint_set1_flag = ih264d_get_bit_h264(ps_bitstrm);
516     ih264d_get_bit_h264(ps_bitstrm);
517 
518     /*****************************************************/
519     /* Read 5 bits for uc_constraint_set3_flag (1 bit)   */
520     /* and reserved_zero_4bits (4 bits) - Sushant        */
521     /*****************************************************/
522     ih264d_get_bits_h264(ps_bitstrm, 5);
523     /* G050 */
524 
525     /* Check whether particular profile is suported or not */
526     /* Check whether particular profile is suported or not */
527     if((u1_profile_idc != MAIN_PROFILE_IDC) &&
528 
529     (u1_profile_idc != BASE_PROFILE_IDC) &&
530 
531     (u1_profile_idc != HIGH_PROFILE_IDC)
532 
533     )
534     {
535 
536         if((uc_constraint_set1_flag != 1) && (uc_constraint_set0_flag != 1))
537         {
538             if(NULL != ps_dec)
539             {
540                 UWORD32 i4_error_code;
541                 i4_error_code = ERROR_FEATURE_UNAVAIL;
542                 return i4_error_code;
543             }
544             else
545             {
546                 return (ERROR_FEATURE_UNAVAIL);
547             }
548         }
549     }
550 
551     u1_level_idc = ih264d_get_bits_h264(ps_bitstrm, 8);
552 
553 
554 
555     COPYTHECONTEXT("SPS: u4_level_idc",u1_level_idc);
556 
557     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
558     if(u4_temp & MASK_ERR_SEQ_SET_ID)
559         return ERROR_INV_SPS_PPS_T;
560     u1_seq_parameter_set_id = u4_temp;
561     COPYTHECONTEXT("SPS: seq_parameter_set_id",
562                     u1_seq_parameter_set_id);
563 
564     /*--------------------------------------------------------------------*/
565     /* Find an seq param entry in seqparam array of decStruct             */
566     /*--------------------------------------------------------------------*/
567 
568     ps_seq = ps_dec->pv_scratch_sps_pps;
569     *ps_seq = ps_dec->ps_sps[u1_seq_parameter_set_id];
570 
571     if(NULL == ps_dec->ps_cur_sps)
572         ps_dec->ps_cur_sps = ps_seq;
573 
574     ps_seq->u1_profile_idc = u1_profile_idc;
575     ps_seq->u1_level_idc = u1_level_idc;
576     ps_seq->u1_seq_parameter_set_id = u1_seq_parameter_set_id;
577 
578     /*******************************************************************/
579     /* Initializations for high profile - Sushant                      */
580     /*******************************************************************/
581     ps_seq->i4_chroma_format_idc = 1;
582     ps_seq->i4_bit_depth_luma_minus8 = 0;
583     ps_seq->i4_bit_depth_chroma_minus8 = 0;
584     ps_seq->i4_qpprime_y_zero_transform_bypass_flag = 0;
585     ps_seq->i4_seq_scaling_matrix_present_flag = 0;
586     if(u1_profile_idc == HIGH_PROFILE_IDC)
587     {
588 
589         /* reading chroma_format_idc   */
590         ps_seq->i4_chroma_format_idc = ih264d_uev(pu4_bitstrm_ofst,
591                                                   pu4_bitstrm_buf);
592 
593         /* Monochrome is not supported */
594         if(ps_seq->i4_chroma_format_idc != 1)
595         {
596             return ERROR_INV_SPS_PPS_T;
597         }
598 
599         /* reading bit_depth_luma_minus8   */
600         ps_seq->i4_bit_depth_luma_minus8 = ih264d_uev(pu4_bitstrm_ofst,
601                                                       pu4_bitstrm_buf);
602 
603         if(ps_seq->i4_bit_depth_luma_minus8 != 0)
604         {
605             return ERROR_INV_SPS_PPS_T;
606         }
607 
608         /* reading bit_depth_chroma_minus8   */
609         ps_seq->i4_bit_depth_chroma_minus8 = ih264d_uev(pu4_bitstrm_ofst,
610                                                         pu4_bitstrm_buf);
611 
612         if(ps_seq->i4_bit_depth_chroma_minus8 != 0)
613         {
614             return ERROR_INV_SPS_PPS_T;
615         }
616 
617         /* reading qpprime_y_zero_transform_bypass_flag   */
618         ps_seq->i4_qpprime_y_zero_transform_bypass_flag =
619                         (WORD32)ih264d_get_bit_h264(ps_bitstrm);
620 
621         if(ps_seq->i4_qpprime_y_zero_transform_bypass_flag != 0)
622         {
623             return ERROR_INV_SPS_PPS_T;
624         }
625 
626         /* reading seq_scaling_matrix_present_flag   */
627         ps_seq->i4_seq_scaling_matrix_present_flag =
628                         (WORD32)ih264d_get_bit_h264(ps_bitstrm);
629 
630         if(ps_seq->i4_seq_scaling_matrix_present_flag)
631         {
632             for(i4_i = 0; i4_i < 8; i4_i++)
633             {
634                 ps_seq->u1_seq_scaling_list_present_flag[i4_i] =
635                                 ih264d_get_bit_h264(ps_bitstrm);
636 
637                 /* initialize u1_use_default_scaling_matrix_flag[i4_i] to zero */
638                 /* before calling scaling list                             */
639                 ps_seq->u1_use_default_scaling_matrix_flag[i4_i] = 0;
640 
641                 if(ps_seq->u1_seq_scaling_list_present_flag[i4_i])
642                 {
643                     if(i4_i < 6)
644                     {
645                         ih264d_scaling_list(
646                                         ps_seq->i2_scalinglist4x4[i4_i],
647                                         16,
648                                         &ps_seq->u1_use_default_scaling_matrix_flag[i4_i],
649                                         ps_bitstrm);
650                     }
651                     else
652                     {
653                         ih264d_scaling_list(
654                                         ps_seq->i2_scalinglist8x8[i4_i - 6],
655                                         64,
656                                         &ps_seq->u1_use_default_scaling_matrix_flag[i4_i],
657                                         ps_bitstrm);
658                     }
659                 }
660             }
661         }
662     }
663     /*--------------------------------------------------------------------*/
664     /* Decode MaxFrameNum                                                 */
665     /*--------------------------------------------------------------------*/
666     u4_temp = 4 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
667     if(u4_temp > MAX_BITS_IN_FRAME_NUM)
668     {
669         return ERROR_INV_SPS_PPS_T;
670     }
671     ps_seq->u1_bits_in_frm_num = u4_temp;
672     COPYTHECONTEXT("SPS: log2_max_frame_num_minus4",
673                     (ps_seq->u1_bits_in_frm_num - 4));
674 
675     i2_max_frm_num = (1 << (ps_seq->u1_bits_in_frm_num));
676     ps_seq->u2_u4_max_pic_num_minus1 = i2_max_frm_num - 1;
677     /*--------------------------------------------------------------------*/
678     /* Decode picture order count and related values                      */
679     /*--------------------------------------------------------------------*/
680     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
681 
682     if(u4_temp > MAX_PIC_ORDER_CNT_TYPE)
683     {
684         return ERROR_INV_POC_TYPE_T;
685     }
686     ps_seq->u1_pic_order_cnt_type = u4_temp;
687     COPYTHECONTEXT("SPS: pic_order_cnt_type",ps_seq->u1_pic_order_cnt_type);
688 
689     ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle = 1;
690     if(ps_seq->u1_pic_order_cnt_type == 0)
691     {
692         u4_temp = 4 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
693         if(u4_temp > MAX_BITS_IN_POC_LSB)
694         {
695             return ERROR_INV_SPS_PPS_T;
696         }
697         ps_seq->u1_log2_max_pic_order_cnt_lsb_minus = u4_temp;
698         ps_seq->i4_max_pic_order_cntLsb = (1 << u4_temp);
699         COPYTHECONTEXT("SPS: log2_max_pic_order_cnt_lsb_minus4",(u4_temp - 4));
700     }
701     else if(ps_seq->u1_pic_order_cnt_type == 1)
702     {
703         ps_seq->u1_delta_pic_order_always_zero_flag = ih264d_get_bit_h264(
704                         ps_bitstrm);
705         COPYTHECONTEXT("SPS: delta_pic_order_always_zero_flag",
706                         ps_seq->u1_delta_pic_order_always_zero_flag);
707 
708         ps_seq->i4_ofst_for_non_ref_pic = ih264d_sev(pu4_bitstrm_ofst,
709                                                      pu4_bitstrm_buf);
710         COPYTHECONTEXT("SPS: offset_for_non_ref_pic",
711                         ps_seq->i4_ofst_for_non_ref_pic);
712 
713         ps_seq->i4_ofst_for_top_to_bottom_field = ih264d_sev(
714                         pu4_bitstrm_ofst, pu4_bitstrm_buf);
715         COPYTHECONTEXT("SPS: offset_for_top_to_bottom_field",
716                         ps_seq->i4_ofst_for_top_to_bottom_field);
717 
718         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
719         if(u4_temp > 255)
720             return ERROR_INV_SPS_PPS_T;
721         ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle = u4_temp;
722         COPYTHECONTEXT("SPS: num_ref_frames_in_pic_order_cnt_cycle",
723                         ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle);
724 
725         for(i = 0; i < ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle; i++)
726         {
727             ps_seq->i4_ofst_for_ref_frame[i] = ih264d_sev(
728                             pu4_bitstrm_ofst, pu4_bitstrm_buf);
729             COPYTHECONTEXT("SPS: offset_for_ref_frame",
730                             ps_seq->i4_ofst_for_ref_frame[i]);
731         }
732     }
733 
734     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
735 
736     if((u4_temp > H264_MAX_REF_PICS))
737     {
738         return ERROR_NUM_REF;
739     }
740     ps_seq->u1_num_ref_frames = u4_temp;
741     COPYTHECONTEXT("SPS: num_ref_frames",ps_seq->u1_num_ref_frames);
742 
743     ps_seq->u1_gaps_in_frame_num_value_allowed_flag = ih264d_get_bit_h264(
744                     ps_bitstrm);
745     COPYTHECONTEXT("SPS: gaps_in_frame_num_value_allowed_flag",
746                     ps_seq->u1_gaps_in_frame_num_value_allowed_flag);
747 
748     /*--------------------------------------------------------------------*/
749     /* Decode FrameWidth and FrameHeight and related values               */
750     /*--------------------------------------------------------------------*/
751     ps_seq->u2_frm_wd_in_mbs = 1
752                     + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
753     COPYTHECONTEXT("SPS: pic_width_in_mbs_minus1",
754                     ps_seq->u2_frm_wd_in_mbs - 1);
755     u2_pic_wd = (ps_seq->u2_frm_wd_in_mbs << 4);
756 
757     pic_height_in_map_units_minus1 = ih264d_uev(pu4_bitstrm_ofst,
758                                                 pu4_bitstrm_buf);
759     ps_seq->u2_frm_ht_in_mbs = 1 + pic_height_in_map_units_minus1;
760 
761     u2_pic_ht = (ps_seq->u2_frm_ht_in_mbs << 4);
762 
763     /*--------------------------------------------------------------------*/
764     /* Get the value of MaxMbAddress and Number of bits needed for it     */
765     /*--------------------------------------------------------------------*/
766     ps_seq->u2_max_mb_addr = (ps_seq->u2_frm_wd_in_mbs
767                     * ps_seq->u2_frm_ht_in_mbs) - 1;
768 
769     ps_seq->u2_total_num_of_mbs = ps_seq->u2_max_mb_addr + 1;
770 
771     ps_seq->u1_level_idc = ih264d_correct_level_idc(
772                     u1_level_idc, ps_seq->u2_total_num_of_mbs);
773 
774     u1_frm = ih264d_get_bit_h264(ps_bitstrm);
775     ps_seq->u1_frame_mbs_only_flag = u1_frm;
776 
777     COPYTHECONTEXT("SPS: frame_mbs_only_flag", u1_frm);
778 
779     if(!u1_frm)
780     {
781         u2_pic_ht <<= 1;
782         ps_seq->u1_mb_aff_flag = ih264d_get_bit_h264(ps_bitstrm);
783         COPYTHECONTEXT("SPS: mb_adaptive_frame_field_flag",
784                         ps_seq->u1_mb_aff_flag);
785 
786     }
787     else
788         ps_seq->u1_mb_aff_flag = 0;
789 
790     ps_seq->u1_direct_8x8_inference_flag = ih264d_get_bit_h264(ps_bitstrm);
791 
792     COPYTHECONTEXT("SPS: direct_8x8_inference_flag",
793                     ps_seq->u1_direct_8x8_inference_flag);
794 
795     /* G050 */
796     u1_frame_cropping_flag = ih264d_get_bit_h264(ps_bitstrm);
797     COPYTHECONTEXT("SPS: frame_cropping_flag",u1_frame_cropping_flag);
798 
799     if(u1_frame_cropping_flag)
800     {
801         u1_frame_cropping_rect_left_ofst = ih264d_uev(pu4_bitstrm_ofst,
802                                                       pu4_bitstrm_buf);
803         COPYTHECONTEXT("SPS: frame_cropping_rect_left_offset",
804                         u1_frame_cropping_rect_left_ofst);
805         u1_frame_cropping_rect_right_ofst = ih264d_uev(pu4_bitstrm_ofst,
806                                                        pu4_bitstrm_buf);
807         COPYTHECONTEXT("SPS: frame_cropping_rect_right_offset",
808                         u1_frame_cropping_rect_right_ofst);
809         u1_frame_cropping_rect_top_ofst = ih264d_uev(pu4_bitstrm_ofst,
810                                                      pu4_bitstrm_buf);
811         COPYTHECONTEXT("SPS: frame_cropping_rect_top_offset",
812                         u1_frame_cropping_rect_top_ofst);
813         u1_frame_cropping_rect_bottom_ofst = ih264d_uev(pu4_bitstrm_ofst,
814                                                         pu4_bitstrm_buf);
815         COPYTHECONTEXT("SPS: frame_cropping_rect_bottom_offset",
816                         u1_frame_cropping_rect_bottom_ofst);
817     }
818     /* G050 */
819 
820     ps_seq->u1_vui_parameters_present_flag = ih264d_get_bit_h264(ps_bitstrm);
821     COPYTHECONTEXT("SPS: vui_parameters_present_flag",
822                     ps_seq->u1_vui_parameters_present_flag);
823 
824     u2_frm_wd_y = u2_pic_wd + (UWORD8)(PAD_LEN_Y_H << 1);
825     if(1 == ps_dec->u4_share_disp_buf)
826     {
827         if(ps_dec->u4_app_disp_width > u2_frm_wd_y)
828             u2_frm_wd_y = ps_dec->u4_app_disp_width;
829     }
830 
831     u2_frm_ht_y = u2_pic_ht + (UWORD8)(PAD_LEN_Y_V << 2);
832     u2_frm_wd_uv = u2_pic_wd + (UWORD8)(PAD_LEN_UV_H << 2);
833     u2_frm_wd_uv = MAX(u2_frm_wd_uv, u2_frm_wd_y);
834 
835     u2_frm_ht_uv = (u2_pic_ht >> 1) + (UWORD8)(PAD_LEN_UV_V << 2);
836     u2_frm_ht_uv = MAX(u2_frm_ht_uv, (u2_frm_ht_y >> 1));
837 
838 
839     /* Calculate display picture width, height and start u4_ofst from YUV420 */
840     /* pictute buffers as per cropping information parsed above             */
841     {
842         UWORD16 u2_rgt_ofst = 0;
843         UWORD16 u2_lft_ofst = 0;
844         UWORD16 u2_top_ofst = 0;
845         UWORD16 u2_btm_ofst = 0;
846         UWORD8 u1_frm_mbs_flag;
847         UWORD8 u1_vert_mult_factor;
848         WORD32 i4_cropped_ht, i4_cropped_wd;
849 
850         if(u1_frame_cropping_flag)
851         {
852             /* Calculate right and left u4_ofst for cropped picture           */
853             u2_rgt_ofst = u1_frame_cropping_rect_right_ofst << 1;
854             u2_lft_ofst = u1_frame_cropping_rect_left_ofst << 1;
855 
856             /* Know frame MBs only u4_flag                                      */
857             u1_frm_mbs_flag = (1 == ps_seq->u1_frame_mbs_only_flag);
858 
859             /* Simplify the vertical u4_ofst calculation from field/frame     */
860             u1_vert_mult_factor = (2 - u1_frm_mbs_flag);
861 
862             /* Calculate bottom and top u4_ofst for cropped  picture          */
863             u2_btm_ofst = (u1_frame_cropping_rect_bottom_ofst
864                             << u1_vert_mult_factor);
865             u2_top_ofst = (u1_frame_cropping_rect_top_ofst
866                             << u1_vert_mult_factor);
867         }
868 
869         /* Calculate u4_ofst from start of YUV 420 picture buffer to start of*/
870         /* cropped picture buffer                                           */
871         u2_crop_offset_y = (u2_frm_wd_y * u2_top_ofst) + (u2_lft_ofst);
872         u2_crop_offset_uv = (u2_frm_wd_uv * (u2_top_ofst >> 1))
873                         + (u2_lft_ofst >> 1) * YUV420SP_FACTOR;
874         /* Calculate the display picture width and height based on crop      */
875         /* information                                                       */
876         i4_cropped_ht = u2_pic_ht - (u2_btm_ofst + u2_top_ofst);
877         i4_cropped_wd = u2_pic_wd - (u2_rgt_ofst + u2_lft_ofst);
878 
879         if((i4_cropped_ht < MB_SIZE) || (i4_cropped_wd < MB_SIZE))
880         {
881             return ERROR_INV_SPS_PPS_T;
882         }
883 
884         if((3 == ps_dec->i4_header_decoded) && (ps_dec->u2_pic_wd != u2_pic_wd))
885         {
886             ps_dec->u1_res_changed = 1;
887             return IVD_RES_CHANGED;
888         }
889         if((3 == ps_dec->i4_header_decoded) && (ps_dec->u2_pic_ht != u2_pic_ht))
890         {
891             ps_dec->u1_res_changed = 1;
892             return IVD_RES_CHANGED;
893         }
894 
895         /* Check for unsupported resolutions */
896         if((u2_pic_wd > H264_MAX_FRAME_WIDTH) || (u2_pic_ht > H264_MAX_FRAME_HEIGHT))
897         {
898             return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
899         }
900 
901         ps_dec->u2_disp_height = i4_cropped_ht;
902 
903         ps_dec->u2_disp_width = i4_cropped_wd;
904 
905     }
906 
907     if(1 == ps_seq->u1_vui_parameters_present_flag)
908     {
909         ret = ih264d_parse_vui_parametres(&ps_seq->s_vui, ps_bitstrm);
910         if(ret != OK)
911             return ret;
912     }
913 
914     ps_dec->u2_pic_wd = u2_pic_wd;
915     ps_dec->u2_pic_ht = u2_pic_ht;
916 
917     /* Determining the Width and Height of Frame from that of Picture */
918     ps_dec->u2_frm_wd_y = u2_frm_wd_y;
919     ps_dec->u2_frm_ht_y = u2_frm_ht_y;
920 
921     ps_dec->u2_frm_wd_uv = u2_frm_wd_uv;
922     ps_dec->u2_frm_ht_uv = u2_frm_ht_uv;
923     ps_dec->s_pad_mgr.u1_pad_len_y_v = (UWORD8)(PAD_LEN_Y_V << (1 - u1_frm));
924     ps_dec->s_pad_mgr.u1_pad_len_cr_v = (UWORD8)(PAD_LEN_UV_V << (1 - u1_frm));
925 
926     ps_dec->u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
927     ps_dec->u2_frm_ht_in_mbs = ps_seq->u2_frm_ht_in_mbs;
928 
929     ps_dec->u2_crop_offset_y = u2_crop_offset_y;
930     ps_dec->u2_crop_offset_uv = u2_crop_offset_uv;
931 
932     /* In case bitstream read has exceeded the filled size, then
933        return an error */
934     if(ps_bitstrm->u4_ofst > ps_bitstrm->u4_max_ofst)
935     {
936         return ERROR_INV_SPS_PPS_T;
937     }
938     ps_seq->u1_is_valid = TRUE;
939     ps_dec->ps_sps[u1_seq_parameter_set_id] = *ps_seq;
940 
941     return OK;
942 }
943 
944 /*!
945  **************************************************************************
946  * \if Function name : ih264d_parse_end_of_sequence \endif
947  *
948  * \brief
949  *    Decodes End of Sequence.
950  *
951  * \param ps_bitstrm   : Pointer to bit ps_bitstrm containing the NAL unit
952  *
953  * \return
954  *    0 on Success and error code otherwise
955  **************************************************************************
956  */
ih264d_parse_end_of_sequence(dec_struct_t * ps_dec)957 WORD32 ih264d_parse_end_of_sequence(dec_struct_t * ps_dec)
958 {
959     WORD32 ret;
960 
961     ret = ih264d_end_of_pic_processing(ps_dec);
962     return ret;
963 }
964 
965 /*!
966  **************************************************************************
967  * \if Function name : AcessUnitDelimiterRbsp \endif
968  *
969  * \brief
970  *    Decodes AcessUnitDelimiterRbsp.
971  *
972  * \param ps_bitstrm   : Pointer to bit ps_bitstrm containing the NAL unit
973  *
974  * \return
975  *    0 on Success and error code otherwise
976  **************************************************************************
977  */
978 
ih264d_access_unit_delimiter_rbsp(dec_struct_t * ps_dec)979 WORD32 ih264d_access_unit_delimiter_rbsp(dec_struct_t * ps_dec)
980 {
981     UWORD8 u1_primary_pic_type;
982     u1_primary_pic_type = ih264d_get_bits_h264(ps_dec->ps_bitstrm, 3);
983     switch(u1_primary_pic_type)
984     {
985         case I_PIC:
986         case SI_PIC:
987         case ISI_PIC:
988             ps_dec->ps_dec_err_status->u1_pic_aud_i = PIC_TYPE_I;
989             break;
990         default:
991             ps_dec->ps_dec_err_status->u1_pic_aud_i = PIC_TYPE_UNKNOWN;
992     }
993     return (0);
994 }
995 /*!
996  **************************************************************************
997  * \if Function name : ih264d_parse_nal_unit \endif
998  *
999  * \brief
1000  *    Decodes NAL unit
1001  *
1002  * \return
1003  *    0 on Success and error code otherwise
1004  **************************************************************************
1005  */
1006 
ih264d_parse_nal_unit(iv_obj_t * dec_hdl,ivd_video_decode_op_t * ps_dec_op,UWORD8 * pu1_buf,UWORD32 u4_length)1007 WORD32 ih264d_parse_nal_unit(iv_obj_t *dec_hdl,
1008                           ivd_video_decode_op_t *ps_dec_op,
1009                           UWORD8 *pu1_buf,
1010                           UWORD32 u4_length)
1011 {
1012 
1013     dec_bit_stream_t *ps_bitstrm;
1014 
1015 
1016     dec_struct_t *ps_dec = (dec_struct_t *)dec_hdl->pv_codec_handle;
1017     ivd_video_decode_ip_t *ps_dec_in =
1018                     (ivd_video_decode_ip_t *)ps_dec->pv_dec_in;
1019     dec_slice_params_t * ps_cur_slice = ps_dec->ps_cur_slice;
1020     UWORD8 u1_first_byte, u1_nal_ref_idc;
1021     UWORD8 u1_nal_unit_type;
1022     WORD32 i_status = OK;
1023     ps_bitstrm = ps_dec->ps_bitstrm;
1024 
1025     if(pu1_buf)
1026     {
1027         if(u4_length)
1028         {
1029             ps_dec_op->u4_frame_decoded_flag = 0;
1030             ih264d_process_nal_unit(ps_dec->ps_bitstrm, pu1_buf,
1031                                     u4_length);
1032 
1033             SWITCHOFFTRACE;
1034             u1_first_byte = ih264d_get_bits_h264(ps_bitstrm, 8);
1035 
1036             if(NAL_FORBIDDEN_BIT(u1_first_byte))
1037             {
1038                 H264_DEC_DEBUG_PRINT("\nForbidden bit set in Nal Unit, Let's try\n");
1039             }
1040             u1_nal_unit_type = NAL_UNIT_TYPE(u1_first_byte);
1041             // if any other nal unit other than slice nal is encountered in between a
1042             // frame break out of loop without consuming header
1043             if((ps_dec->u2_total_mbs_coded != 0) && (u1_nal_unit_type > IDR_SLICE_NAL))
1044             {
1045                 return ERROR_INCOMPLETE_FRAME;
1046             }
1047             ps_dec->u1_nal_unit_type = u1_nal_unit_type;
1048             u1_nal_ref_idc = (UWORD8)(NAL_REF_IDC(u1_first_byte));
1049             //Skip all NALUs if SPS and PPS are not decoded
1050             switch(u1_nal_unit_type)
1051             {
1052                 case SLICE_DATA_PARTITION_A_NAL:
1053                 case SLICE_DATA_PARTITION_B_NAL:
1054                 case SLICE_DATA_PARTITION_C_NAL:
1055                     if(!ps_dec->i4_decode_header)
1056                         ih264d_parse_slice_partition(ps_dec, ps_bitstrm);
1057 
1058                     break;
1059 
1060                 case IDR_SLICE_NAL:
1061                 case SLICE_NAL:
1062 
1063                     /* ! */
1064                     DEBUG_THREADS_PRINTF("Decoding  a slice NAL\n");
1065                     if(!ps_dec->i4_decode_header)
1066                     {
1067                         if(ps_dec->i4_header_decoded == 3)
1068                         {
1069                             /* ! */
1070                             ps_dec->u4_slice_start_code_found = 1;
1071 
1072                             ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1073 
1074                             i_status = ih264d_parse_decode_slice(
1075                                             (UWORD8)(u1_nal_unit_type
1076                                                             == IDR_SLICE_NAL),
1077                                             u1_nal_ref_idc, ps_dec);
1078 
1079                             if((ps_dec->u4_first_slice_in_pic != 0)&&
1080                                 ((ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC) == 0))
1081                             {
1082                                 /*  if the first slice header was not valid set to 1 */
1083                                 ps_dec->u4_first_slice_in_pic = 1;
1084                             }
1085 
1086                             if(i_status != OK)
1087                             {
1088                                 return i_status;
1089                             }
1090                         }
1091                         else
1092                         {
1093                             H264_DEC_DEBUG_PRINT(
1094                                             "\nSlice NAL Supplied but no header has been supplied\n");
1095                         }
1096                     }
1097                     break;
1098 
1099                 case SEI_NAL:
1100                     if(!ps_dec->i4_decode_header)
1101                     {
1102                         ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1103                         i_status = ih264d_parse_sei_message(ps_dec, ps_bitstrm);
1104                         if(i_status != OK)
1105                             return i_status;
1106                         ih264d_parse_sei(ps_dec, ps_bitstrm);
1107                     }
1108                     break;
1109                 case SEQ_PARAM_NAL:
1110                     /* ! */
1111                     ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1112                     i_status = ih264d_parse_sps(ps_dec, ps_bitstrm);
1113                     if(i_status == ERROR_INV_SPS_PPS_T)
1114                         return i_status;
1115                     if(!i_status)
1116                         ps_dec->i4_header_decoded |= 0x1;
1117                     break;
1118 
1119                 case PIC_PARAM_NAL:
1120                     /* ! */
1121                     ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1122                     i_status = ih264d_parse_pps(ps_dec, ps_bitstrm);
1123                     if(i_status == ERROR_INV_SPS_PPS_T)
1124                         return i_status;
1125                     if(!i_status)
1126                         ps_dec->i4_header_decoded |= 0x2;
1127                     break;
1128                 case ACCESS_UNIT_DELIMITER_RBSP:
1129                     if(!ps_dec->i4_decode_header)
1130                     {
1131                         ih264d_access_unit_delimiter_rbsp(ps_dec);
1132                     }
1133                     break;
1134                     //Let us ignore the END_OF_SEQ_RBSP NAL and decode even after this NAL
1135                 case END_OF_STREAM_RBSP:
1136                     if(!ps_dec->i4_decode_header)
1137                     {
1138                         ih264d_parse_end_of_stream(ps_dec);
1139                     }
1140                     break;
1141                 case FILLER_DATA_NAL:
1142                     if(!ps_dec->i4_decode_header)
1143                     {
1144                         ih264d_parse_filler_data(ps_dec, ps_bitstrm);
1145                     }
1146                     break;
1147                 default:
1148                     H264_DEC_DEBUG_PRINT("\nUnknown NAL type %d\n", u1_nal_unit_type);
1149                     break;
1150             }
1151 
1152         }
1153 
1154     }
1155 
1156     return i_status;
1157 
1158 }
1159 
1160