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     UWORD32 u4_num_reorder_frames;
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     if((3 == ps_dec->i4_header_decoded) && (ps_seq->u1_profile_idc != u1_profile_idc))
575     {
576         ps_dec->u1_res_changed = 1;
577         return IVD_RES_CHANGED;
578     }
579 
580     if((3 == ps_dec->i4_header_decoded) && (ps_seq->u1_level_idc != u1_level_idc))
581     {
582         ps_dec->u1_res_changed = 1;
583         return IVD_RES_CHANGED;
584     }
585 
586     ps_seq->u1_profile_idc = u1_profile_idc;
587     ps_seq->u1_level_idc = u1_level_idc;
588     ps_seq->u1_seq_parameter_set_id = u1_seq_parameter_set_id;
589 
590     /*******************************************************************/
591     /* Initializations for high profile - Sushant                      */
592     /*******************************************************************/
593     ps_seq->i4_chroma_format_idc = 1;
594     ps_seq->i4_bit_depth_luma_minus8 = 0;
595     ps_seq->i4_bit_depth_chroma_minus8 = 0;
596     ps_seq->i4_qpprime_y_zero_transform_bypass_flag = 0;
597     ps_seq->i4_seq_scaling_matrix_present_flag = 0;
598     if(u1_profile_idc == HIGH_PROFILE_IDC)
599     {
600 
601         /* reading chroma_format_idc   */
602         ps_seq->i4_chroma_format_idc = ih264d_uev(pu4_bitstrm_ofst,
603                                                   pu4_bitstrm_buf);
604 
605         /* Monochrome is not supported */
606         if(ps_seq->i4_chroma_format_idc != 1)
607         {
608             return ERROR_INV_SPS_PPS_T;
609         }
610 
611         /* reading bit_depth_luma_minus8   */
612         ps_seq->i4_bit_depth_luma_minus8 = ih264d_uev(pu4_bitstrm_ofst,
613                                                       pu4_bitstrm_buf);
614 
615         if(ps_seq->i4_bit_depth_luma_minus8 != 0)
616         {
617             return ERROR_INV_SPS_PPS_T;
618         }
619 
620         /* reading bit_depth_chroma_minus8   */
621         ps_seq->i4_bit_depth_chroma_minus8 = ih264d_uev(pu4_bitstrm_ofst,
622                                                         pu4_bitstrm_buf);
623 
624         if(ps_seq->i4_bit_depth_chroma_minus8 != 0)
625         {
626             return ERROR_INV_SPS_PPS_T;
627         }
628 
629         /* reading qpprime_y_zero_transform_bypass_flag   */
630         ps_seq->i4_qpprime_y_zero_transform_bypass_flag =
631                         (WORD32)ih264d_get_bit_h264(ps_bitstrm);
632 
633         if(ps_seq->i4_qpprime_y_zero_transform_bypass_flag != 0)
634         {
635             return ERROR_INV_SPS_PPS_T;
636         }
637 
638         /* reading seq_scaling_matrix_present_flag   */
639         ps_seq->i4_seq_scaling_matrix_present_flag =
640                         (WORD32)ih264d_get_bit_h264(ps_bitstrm);
641 
642         if(ps_seq->i4_seq_scaling_matrix_present_flag)
643         {
644             for(i4_i = 0; i4_i < 8; i4_i++)
645             {
646                 ps_seq->u1_seq_scaling_list_present_flag[i4_i] =
647                                 ih264d_get_bit_h264(ps_bitstrm);
648 
649                 /* initialize u1_use_default_scaling_matrix_flag[i4_i] to zero */
650                 /* before calling scaling list                             */
651                 ps_seq->u1_use_default_scaling_matrix_flag[i4_i] = 0;
652 
653                 if(ps_seq->u1_seq_scaling_list_present_flag[i4_i])
654                 {
655                     if(i4_i < 6)
656                     {
657                         ih264d_scaling_list(
658                                         ps_seq->i2_scalinglist4x4[i4_i],
659                                         16,
660                                         &ps_seq->u1_use_default_scaling_matrix_flag[i4_i],
661                                         ps_bitstrm);
662                     }
663                     else
664                     {
665                         ih264d_scaling_list(
666                                         ps_seq->i2_scalinglist8x8[i4_i - 6],
667                                         64,
668                                         &ps_seq->u1_use_default_scaling_matrix_flag[i4_i],
669                                         ps_bitstrm);
670                     }
671                 }
672             }
673         }
674     }
675     /*--------------------------------------------------------------------*/
676     /* Decode MaxFrameNum                                                 */
677     /*--------------------------------------------------------------------*/
678     u4_temp = 4 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
679     if(u4_temp > MAX_BITS_IN_FRAME_NUM)
680     {
681         return ERROR_INV_SPS_PPS_T;
682     }
683     ps_seq->u1_bits_in_frm_num = u4_temp;
684     COPYTHECONTEXT("SPS: log2_max_frame_num_minus4",
685                     (ps_seq->u1_bits_in_frm_num - 4));
686 
687     i2_max_frm_num = (1 << (ps_seq->u1_bits_in_frm_num));
688     ps_seq->u2_u4_max_pic_num_minus1 = i2_max_frm_num - 1;
689     /*--------------------------------------------------------------------*/
690     /* Decode picture order count and related values                      */
691     /*--------------------------------------------------------------------*/
692     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
693 
694     if(u4_temp > MAX_PIC_ORDER_CNT_TYPE)
695     {
696         return ERROR_INV_POC_TYPE_T;
697     }
698     ps_seq->u1_pic_order_cnt_type = u4_temp;
699     COPYTHECONTEXT("SPS: pic_order_cnt_type",ps_seq->u1_pic_order_cnt_type);
700 
701     ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle = 1;
702     if(ps_seq->u1_pic_order_cnt_type == 0)
703     {
704         u4_temp = 4 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
705         if(u4_temp > MAX_BITS_IN_POC_LSB)
706         {
707             return ERROR_INV_SPS_PPS_T;
708         }
709         ps_seq->u1_log2_max_pic_order_cnt_lsb_minus = u4_temp;
710         ps_seq->i4_max_pic_order_cntLsb = (1 << u4_temp);
711         COPYTHECONTEXT("SPS: log2_max_pic_order_cnt_lsb_minus4",(u4_temp - 4));
712     }
713     else if(ps_seq->u1_pic_order_cnt_type == 1)
714     {
715         ps_seq->u1_delta_pic_order_always_zero_flag = ih264d_get_bit_h264(
716                         ps_bitstrm);
717         COPYTHECONTEXT("SPS: delta_pic_order_always_zero_flag",
718                         ps_seq->u1_delta_pic_order_always_zero_flag);
719 
720         ps_seq->i4_ofst_for_non_ref_pic = ih264d_sev(pu4_bitstrm_ofst,
721                                                      pu4_bitstrm_buf);
722         COPYTHECONTEXT("SPS: offset_for_non_ref_pic",
723                         ps_seq->i4_ofst_for_non_ref_pic);
724 
725         ps_seq->i4_ofst_for_top_to_bottom_field = ih264d_sev(
726                         pu4_bitstrm_ofst, pu4_bitstrm_buf);
727         COPYTHECONTEXT("SPS: offset_for_top_to_bottom_field",
728                         ps_seq->i4_ofst_for_top_to_bottom_field);
729 
730         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
731         if(u4_temp > 255)
732             return ERROR_INV_SPS_PPS_T;
733         ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle = u4_temp;
734         COPYTHECONTEXT("SPS: num_ref_frames_in_pic_order_cnt_cycle",
735                         ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle);
736 
737         for(i = 0; i < ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle; i++)
738         {
739             ps_seq->i4_ofst_for_ref_frame[i] = ih264d_sev(
740                             pu4_bitstrm_ofst, pu4_bitstrm_buf);
741             COPYTHECONTEXT("SPS: offset_for_ref_frame",
742                             ps_seq->i4_ofst_for_ref_frame[i]);
743         }
744     }
745 
746     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
747 
748     if((u4_temp > H264_MAX_REF_PICS))
749     {
750         return ERROR_NUM_REF;
751     }
752 
753     /* Compare with older num_ref_frames is header is already once */
754     if((3 == ps_dec->i4_header_decoded) && (ps_seq->u1_num_ref_frames != u4_temp))
755     {
756         ps_dec->u1_res_changed = 1;
757         return IVD_RES_CHANGED;
758     }
759 
760     ps_seq->u1_num_ref_frames = u4_temp;
761     COPYTHECONTEXT("SPS: num_ref_frames",ps_seq->u1_num_ref_frames);
762 
763     ps_seq->u1_gaps_in_frame_num_value_allowed_flag = ih264d_get_bit_h264(
764                     ps_bitstrm);
765     COPYTHECONTEXT("SPS: gaps_in_frame_num_value_allowed_flag",
766                     ps_seq->u1_gaps_in_frame_num_value_allowed_flag);
767 
768     /*--------------------------------------------------------------------*/
769     /* Decode FrameWidth and FrameHeight and related values               */
770     /*--------------------------------------------------------------------*/
771     ps_seq->u2_frm_wd_in_mbs = 1
772                     + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
773     COPYTHECONTEXT("SPS: pic_width_in_mbs_minus1",
774                     ps_seq->u2_frm_wd_in_mbs - 1);
775     u2_pic_wd = (ps_seq->u2_frm_wd_in_mbs << 4);
776 
777     pic_height_in_map_units_minus1 = ih264d_uev(pu4_bitstrm_ofst,
778                                                 pu4_bitstrm_buf);
779     ps_seq->u2_frm_ht_in_mbs = 1 + pic_height_in_map_units_minus1;
780 
781     u2_pic_ht = (ps_seq->u2_frm_ht_in_mbs << 4);
782 
783     /*--------------------------------------------------------------------*/
784     /* Get the value of MaxMbAddress and Number of bits needed for it     */
785     /*--------------------------------------------------------------------*/
786     ps_seq->u2_max_mb_addr = (ps_seq->u2_frm_wd_in_mbs
787                     * ps_seq->u2_frm_ht_in_mbs) - 1;
788 
789     ps_seq->u2_total_num_of_mbs = ps_seq->u2_max_mb_addr + 1;
790 
791     ps_seq->u1_level_idc = ih264d_correct_level_idc(
792                     u1_level_idc, ps_seq->u2_total_num_of_mbs);
793 
794     u1_frm = ih264d_get_bit_h264(ps_bitstrm);
795     ps_seq->u1_frame_mbs_only_flag = u1_frm;
796 
797     COPYTHECONTEXT("SPS: frame_mbs_only_flag", u1_frm);
798 
799     if(!u1_frm)
800     {
801         u2_pic_ht <<= 1;
802         ps_seq->u1_mb_aff_flag = ih264d_get_bit_h264(ps_bitstrm);
803         COPYTHECONTEXT("SPS: mb_adaptive_frame_field_flag",
804                         ps_seq->u1_mb_aff_flag);
805 
806     }
807     else
808         ps_seq->u1_mb_aff_flag = 0;
809 
810     ps_seq->u1_direct_8x8_inference_flag = ih264d_get_bit_h264(ps_bitstrm);
811 
812     COPYTHECONTEXT("SPS: direct_8x8_inference_flag",
813                     ps_seq->u1_direct_8x8_inference_flag);
814 
815     /* G050 */
816     u1_frame_cropping_flag = ih264d_get_bit_h264(ps_bitstrm);
817     COPYTHECONTEXT("SPS: frame_cropping_flag",u1_frame_cropping_flag);
818 
819     if(u1_frame_cropping_flag)
820     {
821         u1_frame_cropping_rect_left_ofst = ih264d_uev(pu4_bitstrm_ofst,
822                                                       pu4_bitstrm_buf);
823         COPYTHECONTEXT("SPS: frame_cropping_rect_left_offset",
824                         u1_frame_cropping_rect_left_ofst);
825         u1_frame_cropping_rect_right_ofst = ih264d_uev(pu4_bitstrm_ofst,
826                                                        pu4_bitstrm_buf);
827         COPYTHECONTEXT("SPS: frame_cropping_rect_right_offset",
828                         u1_frame_cropping_rect_right_ofst);
829         u1_frame_cropping_rect_top_ofst = ih264d_uev(pu4_bitstrm_ofst,
830                                                      pu4_bitstrm_buf);
831         COPYTHECONTEXT("SPS: frame_cropping_rect_top_offset",
832                         u1_frame_cropping_rect_top_ofst);
833         u1_frame_cropping_rect_bottom_ofst = ih264d_uev(pu4_bitstrm_ofst,
834                                                         pu4_bitstrm_buf);
835         COPYTHECONTEXT("SPS: frame_cropping_rect_bottom_offset",
836                         u1_frame_cropping_rect_bottom_ofst);
837     }
838     /* G050 */
839 
840     ps_seq->u1_vui_parameters_present_flag = ih264d_get_bit_h264(ps_bitstrm);
841     COPYTHECONTEXT("SPS: vui_parameters_present_flag",
842                     ps_seq->u1_vui_parameters_present_flag);
843 
844     u2_frm_wd_y = u2_pic_wd + (UWORD8)(PAD_LEN_Y_H << 1);
845     if(1 == ps_dec->u4_share_disp_buf)
846     {
847         if(ps_dec->u4_app_disp_width > u2_frm_wd_y)
848             u2_frm_wd_y = ps_dec->u4_app_disp_width;
849     }
850 
851     u2_frm_ht_y = u2_pic_ht + (UWORD8)(PAD_LEN_Y_V << 2);
852     u2_frm_wd_uv = u2_pic_wd + (UWORD8)(PAD_LEN_UV_H << 2);
853     u2_frm_wd_uv = MAX(u2_frm_wd_uv, u2_frm_wd_y);
854 
855     u2_frm_ht_uv = (u2_pic_ht >> 1) + (UWORD8)(PAD_LEN_UV_V << 2);
856     u2_frm_ht_uv = MAX(u2_frm_ht_uv, (u2_frm_ht_y >> 1));
857 
858 
859     /* Calculate display picture width, height and start u4_ofst from YUV420 */
860     /* pictute buffers as per cropping information parsed above             */
861     {
862         UWORD16 u2_rgt_ofst = 0;
863         UWORD16 u2_lft_ofst = 0;
864         UWORD16 u2_top_ofst = 0;
865         UWORD16 u2_btm_ofst = 0;
866         UWORD8 u1_frm_mbs_flag;
867         UWORD8 u1_vert_mult_factor;
868         WORD32 i4_cropped_ht, i4_cropped_wd;
869 
870         if(u1_frame_cropping_flag)
871         {
872             /* Calculate right and left u4_ofst for cropped picture           */
873             u2_rgt_ofst = u1_frame_cropping_rect_right_ofst << 1;
874             u2_lft_ofst = u1_frame_cropping_rect_left_ofst << 1;
875 
876             /* Know frame MBs only u4_flag                                      */
877             u1_frm_mbs_flag = (1 == ps_seq->u1_frame_mbs_only_flag);
878 
879             /* Simplify the vertical u4_ofst calculation from field/frame     */
880             u1_vert_mult_factor = (2 - u1_frm_mbs_flag);
881 
882             /* Calculate bottom and top u4_ofst for cropped  picture          */
883             u2_btm_ofst = (u1_frame_cropping_rect_bottom_ofst
884                             << u1_vert_mult_factor);
885             u2_top_ofst = (u1_frame_cropping_rect_top_ofst
886                             << u1_vert_mult_factor);
887         }
888 
889         /* Calculate u4_ofst from start of YUV 420 picture buffer to start of*/
890         /* cropped picture buffer                                           */
891         u2_crop_offset_y = (u2_frm_wd_y * u2_top_ofst) + (u2_lft_ofst);
892         u2_crop_offset_uv = (u2_frm_wd_uv * (u2_top_ofst >> 1))
893                         + (u2_lft_ofst >> 1) * YUV420SP_FACTOR;
894         /* Calculate the display picture width and height based on crop      */
895         /* information                                                       */
896         i4_cropped_ht = u2_pic_ht - (u2_btm_ofst + u2_top_ofst);
897         i4_cropped_wd = u2_pic_wd - (u2_rgt_ofst + u2_lft_ofst);
898 
899         if((i4_cropped_ht < MB_SIZE) || (i4_cropped_wd < MB_SIZE))
900         {
901             return ERROR_INV_SPS_PPS_T;
902         }
903 
904         if((3 == ps_dec->i4_header_decoded) && (ps_dec->u2_pic_wd != u2_pic_wd))
905         {
906             ps_dec->u1_res_changed = 1;
907             return IVD_RES_CHANGED;
908         }
909         if((3 == ps_dec->i4_header_decoded) && (ps_dec->u2_pic_ht != u2_pic_ht))
910         {
911             ps_dec->u1_res_changed = 1;
912             return IVD_RES_CHANGED;
913         }
914 
915         /* Check for unsupported resolutions */
916         if((u2_pic_wd > H264_MAX_FRAME_WIDTH) || (u2_pic_ht > H264_MAX_FRAME_HEIGHT))
917         {
918             return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
919         }
920 
921         ps_dec->u2_disp_height = i4_cropped_ht;
922 
923         ps_dec->u2_disp_width = i4_cropped_wd;
924 
925     }
926 
927     /* Backup u4_num_reorder_frames if header is already decoded */
928     if((3 == ps_dec->i4_header_decoded) &&
929                     (1 == ps_seq->u1_vui_parameters_present_flag) &&
930                     (1 == ps_seq->s_vui.u1_bitstream_restriction_flag))
931     {
932         u4_num_reorder_frames =  ps_seq->s_vui.u4_num_reorder_frames;
933     }
934     else
935     {
936         u4_num_reorder_frames = -1;
937     }
938     if(1 == ps_seq->u1_vui_parameters_present_flag)
939     {
940         ret = ih264d_parse_vui_parametres(&ps_seq->s_vui, ps_bitstrm);
941         if(ret != OK)
942             return ret;
943     }
944 
945     /* Compare older u4_num_reorder_frames with the new one if header is already decoded */
946     if((3 == ps_dec->i4_header_decoded) &&
947                     (-1 != (WORD32)u4_num_reorder_frames) &&
948                     (1 == ps_seq->u1_vui_parameters_present_flag) &&
949                     (1 == ps_seq->s_vui.u1_bitstream_restriction_flag) &&
950                     (ps_seq->s_vui.u4_num_reorder_frames != u4_num_reorder_frames))
951     {
952         ps_dec->u1_res_changed = 1;
953         return IVD_RES_CHANGED;
954     }
955 
956     ps_dec->u2_pic_wd = u2_pic_wd;
957     ps_dec->u2_pic_ht = u2_pic_ht;
958 
959     /* Determining the Width and Height of Frame from that of Picture */
960     ps_dec->u2_frm_wd_y = u2_frm_wd_y;
961     ps_dec->u2_frm_ht_y = u2_frm_ht_y;
962 
963     ps_dec->u2_frm_wd_uv = u2_frm_wd_uv;
964     ps_dec->u2_frm_ht_uv = u2_frm_ht_uv;
965     ps_dec->s_pad_mgr.u1_pad_len_y_v = (UWORD8)(PAD_LEN_Y_V << (1 - u1_frm));
966     ps_dec->s_pad_mgr.u1_pad_len_cr_v = (UWORD8)(PAD_LEN_UV_V << (1 - u1_frm));
967 
968     ps_dec->u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
969     ps_dec->u2_frm_ht_in_mbs = ps_seq->u2_frm_ht_in_mbs;
970 
971     ps_dec->u2_crop_offset_y = u2_crop_offset_y;
972     ps_dec->u2_crop_offset_uv = u2_crop_offset_uv;
973 
974     /* In case bitstream read has exceeded the filled size, then
975        return an error */
976     if(ps_bitstrm->u4_ofst > ps_bitstrm->u4_max_ofst)
977     {
978         return ERROR_INV_SPS_PPS_T;
979     }
980     ps_seq->u1_is_valid = TRUE;
981     ps_dec->ps_sps[u1_seq_parameter_set_id] = *ps_seq;
982 
983     return OK;
984 }
985 
986 /*!
987  **************************************************************************
988  * \if Function name : ih264d_parse_end_of_sequence \endif
989  *
990  * \brief
991  *    Decodes End of Sequence.
992  *
993  * \param ps_bitstrm   : Pointer to bit ps_bitstrm containing the NAL unit
994  *
995  * \return
996  *    0 on Success and error code otherwise
997  **************************************************************************
998  */
ih264d_parse_end_of_sequence(dec_struct_t * ps_dec)999 WORD32 ih264d_parse_end_of_sequence(dec_struct_t * ps_dec)
1000 {
1001     WORD32 ret;
1002 
1003     ret = ih264d_end_of_pic_processing(ps_dec);
1004     return ret;
1005 }
1006 
1007 /*!
1008  **************************************************************************
1009  * \if Function name : AcessUnitDelimiterRbsp \endif
1010  *
1011  * \brief
1012  *    Decodes AcessUnitDelimiterRbsp.
1013  *
1014  * \param ps_bitstrm   : Pointer to bit ps_bitstrm containing the NAL unit
1015  *
1016  * \return
1017  *    0 on Success and error code otherwise
1018  **************************************************************************
1019  */
1020 
ih264d_access_unit_delimiter_rbsp(dec_struct_t * ps_dec)1021 WORD32 ih264d_access_unit_delimiter_rbsp(dec_struct_t * ps_dec)
1022 {
1023     UWORD8 u1_primary_pic_type;
1024     u1_primary_pic_type = ih264d_get_bits_h264(ps_dec->ps_bitstrm, 3);
1025     switch(u1_primary_pic_type)
1026     {
1027         case I_PIC:
1028         case SI_PIC:
1029         case ISI_PIC:
1030             ps_dec->ps_dec_err_status->u1_pic_aud_i = PIC_TYPE_I;
1031             break;
1032         default:
1033             ps_dec->ps_dec_err_status->u1_pic_aud_i = PIC_TYPE_UNKNOWN;
1034     }
1035     return (0);
1036 }
1037 /*!
1038  **************************************************************************
1039  * \if Function name : ih264d_parse_nal_unit \endif
1040  *
1041  * \brief
1042  *    Decodes NAL unit
1043  *
1044  * \return
1045  *    0 on Success and error code otherwise
1046  **************************************************************************
1047  */
1048 
ih264d_parse_nal_unit(iv_obj_t * dec_hdl,ivd_video_decode_op_t * ps_dec_op,UWORD8 * pu1_buf,UWORD32 u4_length)1049 WORD32 ih264d_parse_nal_unit(iv_obj_t *dec_hdl,
1050                           ivd_video_decode_op_t *ps_dec_op,
1051                           UWORD8 *pu1_buf,
1052                           UWORD32 u4_length)
1053 {
1054 
1055     dec_bit_stream_t *ps_bitstrm;
1056 
1057 
1058     dec_struct_t *ps_dec = (dec_struct_t *)dec_hdl->pv_codec_handle;
1059     ivd_video_decode_ip_t *ps_dec_in =
1060                     (ivd_video_decode_ip_t *)ps_dec->pv_dec_in;
1061     dec_slice_params_t * ps_cur_slice = ps_dec->ps_cur_slice;
1062     UWORD8 u1_first_byte, u1_nal_ref_idc;
1063     UWORD8 u1_nal_unit_type;
1064     WORD32 i_status = OK;
1065     ps_bitstrm = ps_dec->ps_bitstrm;
1066 
1067     if(pu1_buf)
1068     {
1069         if(u4_length)
1070         {
1071             ps_dec_op->u4_frame_decoded_flag = 0;
1072             ih264d_process_nal_unit(ps_dec->ps_bitstrm, pu1_buf,
1073                                     u4_length);
1074 
1075             SWITCHOFFTRACE;
1076             u1_first_byte = ih264d_get_bits_h264(ps_bitstrm, 8);
1077 
1078             if(NAL_FORBIDDEN_BIT(u1_first_byte))
1079             {
1080                 H264_DEC_DEBUG_PRINT("\nForbidden bit set in Nal Unit, Let's try\n");
1081             }
1082             u1_nal_unit_type = NAL_UNIT_TYPE(u1_first_byte);
1083             // if any other nal unit other than slice nal is encountered in between a
1084             // frame break out of loop without consuming header
1085             if((ps_dec->u2_total_mbs_coded != 0) && (u1_nal_unit_type > IDR_SLICE_NAL))
1086             {
1087                 return ERROR_INCOMPLETE_FRAME;
1088             }
1089             ps_dec->u1_nal_unit_type = u1_nal_unit_type;
1090             u1_nal_ref_idc = (UWORD8)(NAL_REF_IDC(u1_first_byte));
1091             //Skip all NALUs if SPS and PPS are not decoded
1092             switch(u1_nal_unit_type)
1093             {
1094                 case SLICE_DATA_PARTITION_A_NAL:
1095                 case SLICE_DATA_PARTITION_B_NAL:
1096                 case SLICE_DATA_PARTITION_C_NAL:
1097                     if(!ps_dec->i4_decode_header)
1098                         ih264d_parse_slice_partition(ps_dec, ps_bitstrm);
1099 
1100                     break;
1101 
1102                 case IDR_SLICE_NAL:
1103                 case SLICE_NAL:
1104 
1105                     /* ! */
1106                     DEBUG_THREADS_PRINTF("Decoding  a slice NAL\n");
1107                     if(!ps_dec->i4_decode_header)
1108                     {
1109                         if(ps_dec->i4_header_decoded == 3)
1110                         {
1111                             /* ! */
1112                             ps_dec->u4_slice_start_code_found = 1;
1113 
1114                             ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1115 
1116                             i_status = ih264d_parse_decode_slice(
1117                                             (UWORD8)(u1_nal_unit_type
1118                                                             == IDR_SLICE_NAL),
1119                                             u1_nal_ref_idc, ps_dec);
1120 
1121                             if((ps_dec->u4_first_slice_in_pic != 0)&&
1122                                 ((ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC) == 0))
1123                             {
1124                                 /*  if the first slice header was not valid set to 1 */
1125                                 ps_dec->u4_first_slice_in_pic = 1;
1126                             }
1127 
1128                             if(i_status != OK)
1129                             {
1130                                 return i_status;
1131                             }
1132                         }
1133                         else
1134                         {
1135                             H264_DEC_DEBUG_PRINT(
1136                                             "\nSlice NAL Supplied but no header has been supplied\n");
1137                         }
1138                     }
1139                     break;
1140 
1141                 case SEI_NAL:
1142                     if(!ps_dec->i4_decode_header)
1143                     {
1144                         ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1145                         i_status = ih264d_parse_sei_message(ps_dec, ps_bitstrm);
1146                         if(i_status != OK)
1147                             return i_status;
1148                         ih264d_parse_sei(ps_dec, ps_bitstrm);
1149                     }
1150                     break;
1151                 case SEQ_PARAM_NAL:
1152                     /* ! */
1153                     ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1154                     i_status = ih264d_parse_sps(ps_dec, ps_bitstrm);
1155                     if(i_status == ERROR_INV_SPS_PPS_T)
1156                         return i_status;
1157                     if(!i_status)
1158                         ps_dec->i4_header_decoded |= 0x1;
1159                     break;
1160 
1161                 case PIC_PARAM_NAL:
1162                     /* ! */
1163                     ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1164                     i_status = ih264d_parse_pps(ps_dec, ps_bitstrm);
1165                     if(i_status == ERROR_INV_SPS_PPS_T)
1166                         return i_status;
1167                     if(!i_status)
1168                         ps_dec->i4_header_decoded |= 0x2;
1169                     break;
1170                 case ACCESS_UNIT_DELIMITER_RBSP:
1171                     if(!ps_dec->i4_decode_header)
1172                     {
1173                         ih264d_access_unit_delimiter_rbsp(ps_dec);
1174                     }
1175                     break;
1176                     //Let us ignore the END_OF_SEQ_RBSP NAL and decode even after this NAL
1177                 case END_OF_STREAM_RBSP:
1178                     if(!ps_dec->i4_decode_header)
1179                     {
1180                         ih264d_parse_end_of_stream(ps_dec);
1181                     }
1182                     break;
1183                 case FILLER_DATA_NAL:
1184                     if(!ps_dec->i4_decode_header)
1185                     {
1186                         ih264d_parse_filler_data(ps_dec, ps_bitstrm);
1187                     }
1188                     break;
1189                 default:
1190                     H264_DEC_DEBUG_PRINT("\nUnknown NAL type %d\n", u1_nal_unit_type);
1191                     break;
1192             }
1193 
1194         }
1195 
1196     }
1197 
1198     return i_status;
1199 
1200 }
1201 
1202