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     ps_pps->u1_is_valid = TRUE;
372     ps_dec->ps_pps[ps_pps->u1_pic_parameter_set_id] = *ps_pps;
373     return OK;
374 }
375 
376 /*!
377  **************************************************************************
378  * \if Function name : ih264d_parse_sps \endif
379  *
380  * \brief
381  *    Decodes Sequence parameter set from the bitstream
382  *
383  * \return
384  *    0 on Success and Error code otherwise
385  **************************************************************************
386  */
ih264d_correct_level_idc(UWORD32 u4_level_idc,UWORD32 u4_total_mbs)387 UWORD32 ih264d_correct_level_idc(UWORD32 u4_level_idc, UWORD32 u4_total_mbs)
388 {
389     UWORD32 u4_max_mbs_allowed;
390 
391     switch(u4_level_idc)
392     {
393         case H264_LEVEL_1_0:
394             u4_max_mbs_allowed = MAX_MBS_LEVEL_10;
395             break;
396         case H264_LEVEL_1_1:
397             u4_max_mbs_allowed = MAX_MBS_LEVEL_11;
398             break;
399         case H264_LEVEL_1_2:
400             u4_max_mbs_allowed = MAX_MBS_LEVEL_12;
401             break;
402         case H264_LEVEL_1_3:
403             u4_max_mbs_allowed = MAX_MBS_LEVEL_13;
404             break;
405         case H264_LEVEL_2_0:
406             u4_max_mbs_allowed = MAX_MBS_LEVEL_20;
407             break;
408         case H264_LEVEL_2_1:
409             u4_max_mbs_allowed = MAX_MBS_LEVEL_21;
410             break;
411         case H264_LEVEL_2_2:
412             u4_max_mbs_allowed = MAX_MBS_LEVEL_22;
413             break;
414         case H264_LEVEL_3_0:
415             u4_max_mbs_allowed = MAX_MBS_LEVEL_30;
416             break;
417         case H264_LEVEL_3_1:
418             u4_max_mbs_allowed = MAX_MBS_LEVEL_31;
419             break;
420         case H264_LEVEL_3_2:
421             u4_max_mbs_allowed = MAX_MBS_LEVEL_32;
422             break;
423         case H264_LEVEL_4_0:
424             u4_max_mbs_allowed = MAX_MBS_LEVEL_40;
425             break;
426         case H264_LEVEL_4_1:
427             u4_max_mbs_allowed = MAX_MBS_LEVEL_41;
428             break;
429         case H264_LEVEL_4_2:
430             u4_max_mbs_allowed = MAX_MBS_LEVEL_42;
431             break;
432         case H264_LEVEL_5_0:
433             u4_max_mbs_allowed = MAX_MBS_LEVEL_50;
434             break;
435         case H264_LEVEL_5_1:
436         default:
437             u4_max_mbs_allowed = MAX_MBS_LEVEL_51;
438             break;
439 
440     }
441 
442     /*correct of the level is incorrect*/
443     if(u4_total_mbs > u4_max_mbs_allowed)
444     {
445         if(u4_total_mbs > MAX_MBS_LEVEL_50)
446             u4_level_idc = H264_LEVEL_5_1;
447         else if(u4_total_mbs > MAX_MBS_LEVEL_42)
448             u4_level_idc = H264_LEVEL_5_0;
449         else if(u4_total_mbs > MAX_MBS_LEVEL_41)
450             u4_level_idc = H264_LEVEL_4_2;
451         else if(u4_total_mbs > MAX_MBS_LEVEL_40)
452             u4_level_idc = H264_LEVEL_4_1;
453         else if(u4_total_mbs > MAX_MBS_LEVEL_32)
454             u4_level_idc = H264_LEVEL_4_0;
455         else if(u4_total_mbs > MAX_MBS_LEVEL_31)
456             u4_level_idc = H264_LEVEL_3_2;
457         else if(u4_total_mbs > MAX_MBS_LEVEL_30)
458             u4_level_idc = H264_LEVEL_3_1;
459         else if(u4_total_mbs > MAX_MBS_LEVEL_21)
460             u4_level_idc = H264_LEVEL_3_0;
461         else if(u4_total_mbs > MAX_MBS_LEVEL_20)
462             u4_level_idc = H264_LEVEL_2_1;
463         else if(u4_total_mbs > MAX_MBS_LEVEL_10)
464             u4_level_idc = H264_LEVEL_2_0;
465     }
466 
467     return (u4_level_idc);
468 
469 }
ih264d_parse_sps(dec_struct_t * ps_dec,dec_bit_stream_t * ps_bitstrm)470 WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm)
471 {
472     UWORD8 i;
473     dec_seq_params_t *ps_seq = NULL;
474     UWORD8 u1_profile_idc, u1_level_idc, u1_seq_parameter_set_id;
475     UWORD16 i2_max_frm_num;
476     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
477     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
478     UWORD8 u1_frm, uc_constraint_set0_flag, uc_constraint_set1_flag;
479 
480     UWORD32 u4_temp;
481     WORD32 pic_height_in_map_units_minus1 = 0;
482     UWORD32 u2_pic_wd = 0;
483     UWORD32 u2_pic_ht = 0;
484     UWORD32 u2_frm_wd_y = 0;
485     UWORD32 u2_frm_ht_y = 0;
486     UWORD32 u2_frm_wd_uv = 0;
487     UWORD32 u2_frm_ht_uv = 0;
488     UWORD32 u2_crop_offset_y = 0;
489     UWORD32 u2_crop_offset_uv = 0;
490     WORD32 ret;
491 
492     /* High profile related syntax element */
493     WORD32 i4_i;
494     /* G050 */
495     UWORD8 u1_frame_cropping_flag, u1_frame_cropping_rect_left_ofst,
496                     u1_frame_cropping_rect_right_ofst,
497                     u1_frame_cropping_rect_top_ofst,
498                     u1_frame_cropping_rect_bottom_ofst;
499     /* G050 */
500     /*--------------------------------------------------------------------*/
501     /* Decode seq_parameter_set_id and profile and level values           */
502     /*--------------------------------------------------------------------*/
503     SWITCHONTRACE;
504     u1_profile_idc = ih264d_get_bits_h264(ps_bitstrm, 8);
505     COPYTHECONTEXT("SPS: profile_idc",u1_profile_idc);
506 
507     /* G050 */
508     uc_constraint_set0_flag = ih264d_get_bit_h264(ps_bitstrm);
509     uc_constraint_set1_flag = ih264d_get_bit_h264(ps_bitstrm);
510     ih264d_get_bit_h264(ps_bitstrm);
511 
512     /*****************************************************/
513     /* Read 5 bits for uc_constraint_set3_flag (1 bit)   */
514     /* and reserved_zero_4bits (4 bits) - Sushant        */
515     /*****************************************************/
516     ih264d_get_bits_h264(ps_bitstrm, 5);
517     /* G050 */
518 
519     /* Check whether particular profile is suported or not */
520     /* Check whether particular profile is suported or not */
521     if((u1_profile_idc != MAIN_PROFILE_IDC) &&
522 
523     (u1_profile_idc != BASE_PROFILE_IDC) &&
524 
525     (u1_profile_idc != HIGH_PROFILE_IDC)
526 
527     )
528     {
529 
530         if((uc_constraint_set1_flag != 1) && (uc_constraint_set0_flag != 1))
531         {
532             if(NULL != ps_dec)
533             {
534                 UWORD32 i4_error_code;
535                 i4_error_code = ERROR_FEATURE_UNAVAIL;
536                 return i4_error_code;
537             }
538             else
539             {
540                 return (ERROR_FEATURE_UNAVAIL);
541             }
542         }
543     }
544 
545     u1_level_idc = ih264d_get_bits_h264(ps_bitstrm, 8);
546 
547 
548 
549     COPYTHECONTEXT("SPS: u4_level_idc",u1_level_idc);
550 
551     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
552     if(u4_temp & MASK_ERR_SEQ_SET_ID)
553         return ERROR_INV_SPS_PPS_T;
554     u1_seq_parameter_set_id = u4_temp;
555     COPYTHECONTEXT("SPS: seq_parameter_set_id",
556                     u1_seq_parameter_set_id);
557 
558     /*--------------------------------------------------------------------*/
559     /* Find an seq param entry in seqparam array of decStruct             */
560     /*--------------------------------------------------------------------*/
561 
562     ps_seq = ps_dec->pv_scratch_sps_pps;
563     *ps_seq = ps_dec->ps_sps[u1_seq_parameter_set_id];
564     ps_seq->u1_profile_idc = u1_profile_idc;
565     ps_seq->u1_level_idc = u1_level_idc;
566     ps_seq->u1_seq_parameter_set_id = u1_seq_parameter_set_id;
567 
568     /*******************************************************************/
569     /* Initializations for high profile - Sushant                      */
570     /*******************************************************************/
571     ps_seq->i4_chroma_format_idc = 1;
572     ps_seq->i4_bit_depth_luma_minus8 = 0;
573     ps_seq->i4_bit_depth_chroma_minus8 = 0;
574     ps_seq->i4_qpprime_y_zero_transform_bypass_flag = 0;
575     ps_seq->i4_seq_scaling_matrix_present_flag = 0;
576     if(u1_profile_idc == HIGH_PROFILE_IDC)
577     {
578 
579         /* reading chroma_format_idc   */
580         ps_seq->i4_chroma_format_idc = ih264d_uev(pu4_bitstrm_ofst,
581                                                   pu4_bitstrm_buf);
582 
583         /* Monochrome is not supported */
584         if(ps_seq->i4_chroma_format_idc != 1)
585         {
586             return ERROR_INV_SPS_PPS_T;
587         }
588 
589         /* reading bit_depth_luma_minus8   */
590         ps_seq->i4_bit_depth_luma_minus8 = ih264d_uev(pu4_bitstrm_ofst,
591                                                       pu4_bitstrm_buf);
592 
593         if(ps_seq->i4_bit_depth_luma_minus8 != 0)
594         {
595             return ERROR_INV_SPS_PPS_T;
596         }
597 
598         /* reading bit_depth_chroma_minus8   */
599         ps_seq->i4_bit_depth_chroma_minus8 = ih264d_uev(pu4_bitstrm_ofst,
600                                                         pu4_bitstrm_buf);
601 
602         if(ps_seq->i4_bit_depth_chroma_minus8 != 0)
603         {
604             return ERROR_INV_SPS_PPS_T;
605         }
606 
607         /* reading qpprime_y_zero_transform_bypass_flag   */
608         ps_seq->i4_qpprime_y_zero_transform_bypass_flag =
609                         (WORD32)ih264d_get_bit_h264(ps_bitstrm);
610 
611         if(ps_seq->i4_qpprime_y_zero_transform_bypass_flag != 0)
612         {
613             return ERROR_INV_SPS_PPS_T;
614         }
615 
616         /* reading seq_scaling_matrix_present_flag   */
617         ps_seq->i4_seq_scaling_matrix_present_flag =
618                         (WORD32)ih264d_get_bit_h264(ps_bitstrm);
619 
620         if(ps_seq->i4_seq_scaling_matrix_present_flag)
621         {
622             for(i4_i = 0; i4_i < 8; i4_i++)
623             {
624                 ps_seq->u1_seq_scaling_list_present_flag[i4_i] =
625                                 ih264d_get_bit_h264(ps_bitstrm);
626 
627                 /* initialize u1_use_default_scaling_matrix_flag[i4_i] to zero */
628                 /* before calling scaling list                             */
629                 ps_seq->u1_use_default_scaling_matrix_flag[i4_i] = 0;
630 
631                 if(ps_seq->u1_seq_scaling_list_present_flag[i4_i])
632                 {
633                     if(i4_i < 6)
634                     {
635                         ih264d_scaling_list(
636                                         ps_seq->i2_scalinglist4x4[i4_i],
637                                         16,
638                                         &ps_seq->u1_use_default_scaling_matrix_flag[i4_i],
639                                         ps_bitstrm);
640                     }
641                     else
642                     {
643                         ih264d_scaling_list(
644                                         ps_seq->i2_scalinglist8x8[i4_i - 6],
645                                         64,
646                                         &ps_seq->u1_use_default_scaling_matrix_flag[i4_i],
647                                         ps_bitstrm);
648                     }
649                 }
650             }
651         }
652     }
653     /*--------------------------------------------------------------------*/
654     /* Decode MaxFrameNum                                                 */
655     /*--------------------------------------------------------------------*/
656     u4_temp = 4 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
657     if(u4_temp > MAX_BITS_IN_FRAME_NUM)
658     {
659         return ERROR_INV_SPS_PPS_T;
660     }
661     ps_seq->u1_bits_in_frm_num = u4_temp;
662     COPYTHECONTEXT("SPS: log2_max_frame_num_minus4",
663                     (ps_seq->u1_bits_in_frm_num - 4));
664 
665     i2_max_frm_num = (1 << (ps_seq->u1_bits_in_frm_num));
666     ps_seq->u2_u4_max_pic_num_minus1 = i2_max_frm_num - 1;
667     /*--------------------------------------------------------------------*/
668     /* Decode picture order count and related values                      */
669     /*--------------------------------------------------------------------*/
670     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
671 
672     if(u4_temp > MAX_PIC_ORDER_CNT_TYPE)
673     {
674         return ERROR_INV_POC_TYPE_T;
675     }
676     ps_seq->u1_pic_order_cnt_type = u4_temp;
677     COPYTHECONTEXT("SPS: pic_order_cnt_type",ps_seq->u1_pic_order_cnt_type);
678 
679     ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle = 1;
680     if(ps_seq->u1_pic_order_cnt_type == 0)
681     {
682         u4_temp = 4 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
683         if(u4_temp > MAX_BITS_IN_POC_LSB)
684         {
685             return ERROR_INV_SPS_PPS_T;
686         }
687         ps_seq->u1_log2_max_pic_order_cnt_lsb_minus = u4_temp;
688         ps_seq->i4_max_pic_order_cntLsb = (1 << u4_temp);
689         COPYTHECONTEXT("SPS: log2_max_pic_order_cnt_lsb_minus4",(u4_temp - 4));
690     }
691     else if(ps_seq->u1_pic_order_cnt_type == 1)
692     {
693         ps_seq->u1_delta_pic_order_always_zero_flag = ih264d_get_bit_h264(
694                         ps_bitstrm);
695         COPYTHECONTEXT("SPS: delta_pic_order_always_zero_flag",
696                         ps_seq->u1_delta_pic_order_always_zero_flag);
697 
698         ps_seq->i4_ofst_for_non_ref_pic = ih264d_sev(pu4_bitstrm_ofst,
699                                                      pu4_bitstrm_buf);
700         COPYTHECONTEXT("SPS: offset_for_non_ref_pic",
701                         ps_seq->i4_ofst_for_non_ref_pic);
702 
703         ps_seq->i4_ofst_for_top_to_bottom_field = ih264d_sev(
704                         pu4_bitstrm_ofst, pu4_bitstrm_buf);
705         COPYTHECONTEXT("SPS: offset_for_top_to_bottom_field",
706                         ps_seq->i4_ofst_for_top_to_bottom_field);
707 
708         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
709         if(u4_temp > 255)
710             return ERROR_INV_SPS_PPS_T;
711         ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle = u4_temp;
712         COPYTHECONTEXT("SPS: num_ref_frames_in_pic_order_cnt_cycle",
713                         ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle);
714 
715         for(i = 0; i < ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle; i++)
716         {
717             ps_seq->i4_ofst_for_ref_frame[i] = ih264d_sev(
718                             pu4_bitstrm_ofst, pu4_bitstrm_buf);
719             COPYTHECONTEXT("SPS: offset_for_ref_frame",
720                             ps_seq->i4_ofst_for_ref_frame[i]);
721         }
722     }
723 
724     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
725 
726     if((u4_temp > H264_MAX_REF_PICS))
727     {
728         return ERROR_NUM_REF;
729     }
730     ps_seq->u1_num_ref_frames = u4_temp;
731 
732     if(ps_seq->u1_num_ref_frames > ps_dec->u4_num_ref_frames_at_init)
733     {
734         return IH264D_UNSUPPORTED_NUM_REF_FRAMES;
735     }
736 
737     COPYTHECONTEXT("SPS: num_ref_frames",ps_seq->u1_num_ref_frames);
738 
739     ps_seq->u1_gaps_in_frame_num_value_allowed_flag = ih264d_get_bit_h264(
740                     ps_bitstrm);
741     COPYTHECONTEXT("SPS: gaps_in_frame_num_value_allowed_flag",
742                     ps_seq->u1_gaps_in_frame_num_value_allowed_flag);
743 
744     /*--------------------------------------------------------------------*/
745     /* Decode FrameWidth and FrameHeight and related values               */
746     /*--------------------------------------------------------------------*/
747     ps_seq->u2_frm_wd_in_mbs = 1
748                     + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
749     COPYTHECONTEXT("SPS: pic_width_in_mbs_minus1",
750                     ps_seq->u2_frm_wd_in_mbs - 1);
751     u2_pic_wd = (ps_seq->u2_frm_wd_in_mbs << 4);
752 
753     pic_height_in_map_units_minus1 = ih264d_uev(pu4_bitstrm_ofst,
754                                                 pu4_bitstrm_buf);
755     ps_seq->u2_frm_ht_in_mbs = 1 + pic_height_in_map_units_minus1;
756 
757     u2_pic_ht = (ps_seq->u2_frm_ht_in_mbs << 4);
758 
759     /*--------------------------------------------------------------------*/
760     /* Get the value of MaxMbAddress and Number of bits needed for it     */
761     /*--------------------------------------------------------------------*/
762     ps_seq->u2_max_mb_addr = (ps_seq->u2_frm_wd_in_mbs
763                     * ps_seq->u2_frm_ht_in_mbs) - 1;
764 
765     ps_seq->u2_total_num_of_mbs = ps_seq->u2_max_mb_addr + 1;
766 
767     ps_seq->u1_level_idc = ih264d_correct_level_idc(
768                     u1_level_idc, ps_seq->u2_total_num_of_mbs);
769 
770     u1_frm = ih264d_get_bit_h264(ps_bitstrm);
771     ps_seq->u1_frame_mbs_only_flag = u1_frm;
772 
773     COPYTHECONTEXT("SPS: frame_mbs_only_flag", u1_frm);
774 
775     if(!u1_frm)
776     {
777         u2_pic_ht <<= 1;
778         ps_seq->u1_mb_aff_flag = ih264d_get_bit_h264(ps_bitstrm);
779         COPYTHECONTEXT("SPS: mb_adaptive_frame_field_flag",
780                         ps_seq->u1_mb_aff_flag);
781 
782     }
783     else
784         ps_seq->u1_mb_aff_flag = 0;
785 
786     {
787         WORD32 frame_height_in_mbs = (2 - ps_seq->u1_frame_mbs_only_flag)
788                         * (pic_height_in_map_units_minus1 + 1);
789         UWORD32 wdth = (ps_seq->u2_frm_wd_in_mbs) << 4;
790         UWORD32 hght = (frame_height_in_mbs) << 4;
791 
792         if((u2_pic_wd < H264_MIN_FRAME_WIDTH)
793                         || (u2_pic_wd > ps_dec->u4_width_at_init))
794         {
795             ivd_video_decode_op_t *ps_out;
796             /*set width and height in decode output structure*/
797             ps_out = (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
798             ps_out->u4_pic_wd = u2_pic_wd;
799             ps_out->u4_pic_ht = u2_pic_ht;
800 
801             return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
802         }
803 
804         if((u2_pic_ht < H264_MIN_FRAME_HEIGHT)
805                         || (((0 != ps_seq->u1_frame_mbs_only_flag)
806                                         && (u2_pic_ht * u2_pic_wd
807                                                         > ps_dec->u4_height_at_init
808                                                                         * ps_dec->u4_width_at_init))
809                                         || ((0 == ps_seq->u1_frame_mbs_only_flag)
810                                                         && (ALIGN32(u2_pic_ht)
811                                                                         * u2_pic_wd
812                                                                         > ALIGN32(ps_dec->u4_height_at_init)
813                                                                                         * ps_dec->u4_width_at_init))))
814         {
815             ivd_video_decode_op_t *ps_out;
816             /*set width and height in decode output structure*/
817             ps_out = (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
818             ps_out->u4_pic_wd = u2_pic_wd;
819             ps_out->u4_pic_ht = u2_pic_ht;
820 
821             return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
822         }
823 
824 
825 
826 
827     }
828 
829     ps_seq->u1_direct_8x8_inference_flag = ih264d_get_bit_h264(ps_bitstrm);
830 
831     COPYTHECONTEXT("SPS: direct_8x8_inference_flag",
832                     ps_seq->u1_direct_8x8_inference_flag);
833 
834     /* G050 */
835     u1_frame_cropping_flag = ih264d_get_bit_h264(ps_bitstrm);
836     COPYTHECONTEXT("SPS: frame_cropping_flag",u1_frame_cropping_flag);
837 
838     if(u1_frame_cropping_flag)
839     {
840         u1_frame_cropping_rect_left_ofst = ih264d_uev(pu4_bitstrm_ofst,
841                                                       pu4_bitstrm_buf);
842         COPYTHECONTEXT("SPS: frame_cropping_rect_left_offset",
843                         u1_frame_cropping_rect_left_ofst);
844         u1_frame_cropping_rect_right_ofst = ih264d_uev(pu4_bitstrm_ofst,
845                                                        pu4_bitstrm_buf);
846         COPYTHECONTEXT("SPS: frame_cropping_rect_right_offset",
847                         u1_frame_cropping_rect_right_ofst);
848         u1_frame_cropping_rect_top_ofst = ih264d_uev(pu4_bitstrm_ofst,
849                                                      pu4_bitstrm_buf);
850         COPYTHECONTEXT("SPS: frame_cropping_rect_top_offset",
851                         u1_frame_cropping_rect_top_ofst);
852         u1_frame_cropping_rect_bottom_ofst = ih264d_uev(pu4_bitstrm_ofst,
853                                                         pu4_bitstrm_buf);
854         COPYTHECONTEXT("SPS: frame_cropping_rect_bottom_offset",
855                         u1_frame_cropping_rect_bottom_ofst);
856     }
857     /* G050 */
858 
859     ps_seq->u1_vui_parameters_present_flag = ih264d_get_bit_h264(ps_bitstrm);
860     COPYTHECONTEXT("SPS: vui_parameters_present_flag",
861                     ps_seq->u1_vui_parameters_present_flag);
862 
863     u2_frm_wd_y = u2_pic_wd + (UWORD8)(PAD_LEN_Y_H << 1);
864     if(1 == ps_dec->u4_share_disp_buf)
865     {
866         if(ps_dec->u4_app_disp_width > u2_frm_wd_y)
867             u2_frm_wd_y = ps_dec->u4_app_disp_width;
868     }
869 
870     u2_frm_ht_y = u2_pic_ht + (UWORD8)(PAD_LEN_Y_V << 2);
871     u2_frm_wd_uv = u2_pic_wd + (UWORD8)(PAD_LEN_UV_H << 2);
872     u2_frm_wd_uv = MAX(u2_frm_wd_uv, u2_frm_wd_y);
873 
874     u2_frm_ht_uv = (u2_pic_ht >> 1) + (UWORD8)(PAD_LEN_UV_V << 2);
875     u2_frm_ht_uv = MAX(u2_frm_ht_uv, (u2_frm_ht_y >> 1));
876 
877 
878     /* Calculate display picture width, height and start u4_ofst from YUV420 */
879     /* pictute buffers as per cropping information parsed above             */
880     {
881         UWORD16 u2_rgt_ofst = 0;
882         UWORD16 u2_lft_ofst = 0;
883         UWORD16 u2_top_ofst = 0;
884         UWORD16 u2_btm_ofst = 0;
885         UWORD8 u1_frm_mbs_flag;
886         UWORD8 u1_vert_mult_factor;
887         WORD32 i4_cropped_ht, i4_cropped_wd;
888 
889         if(u1_frame_cropping_flag)
890         {
891             /* Calculate right and left u4_ofst for cropped picture           */
892             u2_rgt_ofst = u1_frame_cropping_rect_right_ofst << 1;
893             u2_lft_ofst = u1_frame_cropping_rect_left_ofst << 1;
894 
895             /* Know frame MBs only u4_flag                                      */
896             u1_frm_mbs_flag = (1 == ps_seq->u1_frame_mbs_only_flag);
897 
898             /* Simplify the vertical u4_ofst calculation from field/frame     */
899             u1_vert_mult_factor = (2 - u1_frm_mbs_flag);
900 
901             /* Calculate bottom and top u4_ofst for cropped  picture          */
902             u2_btm_ofst = (u1_frame_cropping_rect_bottom_ofst
903                             << u1_vert_mult_factor);
904             u2_top_ofst = (u1_frame_cropping_rect_top_ofst
905                             << u1_vert_mult_factor);
906         }
907 
908         /* Calculate u4_ofst from start of YUV 420 picture buffer to start of*/
909         /* cropped picture buffer                                           */
910         u2_crop_offset_y = (u2_frm_wd_y * u2_top_ofst) + (u2_lft_ofst);
911         u2_crop_offset_uv = (u2_frm_wd_uv * (u2_top_ofst >> 1))
912                         + (u2_lft_ofst >> 1) * YUV420SP_FACTOR;
913         /* Calculate the display picture width and height based on crop      */
914         /* information                                                       */
915         i4_cropped_ht = u2_pic_ht - (u2_btm_ofst + u2_top_ofst);
916         i4_cropped_wd = u2_pic_wd - (u2_rgt_ofst + u2_lft_ofst);
917 
918         if((i4_cropped_ht < MB_SIZE) || (i4_cropped_wd < MB_SIZE))
919         {
920             return ERROR_INV_SPS_PPS_T;
921         }
922 
923         if((3 == ps_dec->i4_header_decoded) && (ps_dec->u2_pic_wd != u2_pic_wd))
924         {
925             ps_dec->u1_res_changed = 1;
926             return IVD_RES_CHANGED;
927         }
928         if((3 == ps_dec->i4_header_decoded) && (ps_dec->u2_pic_ht != u2_pic_ht))
929         {
930             ps_dec->u1_res_changed = 1;
931             return IVD_RES_CHANGED;
932         }
933 
934         ps_dec->u2_disp_height = i4_cropped_ht;
935 
936         ps_dec->u2_disp_width = i4_cropped_wd;
937 
938     }
939 
940     ps_seq->u1_is_valid = TRUE;
941 
942     if(1 == ps_seq->u1_vui_parameters_present_flag)
943     {
944         ret = ih264d_parse_vui_parametres(&ps_seq->s_vui, ps_bitstrm);
945         if(ret != OK)
946             return ret;
947     }
948 
949     if(ps_dec->u4_level_at_init < u1_level_idc)
950     {
951         UWORD32 u4_num_pic_bufs_reqd, u4_num_reorder_frames,
952                         u4_num_mv_bufs_reqd;
953         UWORD32 u4_num_pic_bufs_memory, u4_num_mv_bufs_memory;
954         UWORD32 u4_num_ref_frames;
955 
956         u4_num_ref_frames = ps_seq->u1_num_ref_frames;
957         if(1 == ps_seq->u1_vui_parameters_present_flag)
958         {
959             u4_num_reorder_frames = ps_seq->s_vui.u4_num_reorder_frames;
960         }
961         else
962         {
963             u4_num_reorder_frames = ps_dec->u4_num_reorder_frames_at_init;
964         }
965 
966         u4_num_pic_bufs_reqd = u4_num_ref_frames + u4_num_reorder_frames + 1;
967 
968         u4_num_pic_bufs_memory = ih264d_get_numbuf_dpb_bank(ps_dec, u2_frm_wd_y,
969                                                      u2_frm_ht_y);
970 
971         u4_num_mv_bufs_reqd = u4_num_ref_frames + 1;
972 
973         if(u4_num_mv_bufs_reqd < 2)
974             u4_num_mv_bufs_reqd = 2;
975 
976         u4_num_mv_bufs_memory = ih264d_get_numbuf_mv_bank(ps_dec, u2_pic_wd,
977                                                    u2_pic_ht);
978 
979         if((u4_num_pic_bufs_reqd > u4_num_pic_bufs_memory)
980                         || (u4_num_mv_bufs_reqd > u4_num_mv_bufs_memory))
981         {
982             return IH264D_UNSUPPORTED_LEVEL;
983         }
984 
985     }
986 
987     ps_dec->u2_pic_wd = u2_pic_wd;
988     ps_dec->u2_pic_ht = u2_pic_ht;
989 
990     /* Determining the Width and Height of Frame from that of Picture */
991     ps_dec->u2_frm_wd_y = u2_frm_wd_y;
992     ps_dec->u2_frm_ht_y = u2_frm_ht_y;
993 
994     ps_dec->u2_frm_wd_uv = u2_frm_wd_uv;
995     ps_dec->u2_frm_ht_uv = u2_frm_ht_uv;
996     ps_dec->s_pad_mgr.u1_pad_len_y_v = (UWORD8)(PAD_LEN_Y_V << (1 - u1_frm));
997     ps_dec->s_pad_mgr.u1_pad_len_cr_v = (UWORD8)(PAD_LEN_UV_V << (1 - u1_frm));
998 
999     ps_dec->u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
1000     ps_dec->u2_frm_ht_in_mbs = ps_seq->u2_frm_ht_in_mbs;
1001 
1002     ps_dec->u2_crop_offset_y = u2_crop_offset_y;
1003     ps_dec->u2_crop_offset_uv = u2_crop_offset_uv;
1004 
1005     ps_dec->ps_sps[u1_seq_parameter_set_id] = *ps_seq;
1006 
1007     return OK;
1008 }
1009 
1010 /*!
1011  **************************************************************************
1012  * \if Function name : ih264d_parse_end_of_sequence \endif
1013  *
1014  * \brief
1015  *    Decodes End of Sequence.
1016  *
1017  * \param ps_bitstrm   : Pointer to bit ps_bitstrm containing the NAL unit
1018  *
1019  * \return
1020  *    0 on Success and error code otherwise
1021  **************************************************************************
1022  */
ih264d_parse_end_of_sequence(dec_struct_t * ps_dec)1023 WORD32 ih264d_parse_end_of_sequence(dec_struct_t * ps_dec)
1024 {
1025     WORD32 ret;
1026 
1027     ret = ih264d_end_of_pic_processing(ps_dec);
1028     return ret;
1029 }
1030 
1031 /*!
1032  **************************************************************************
1033  * \if Function name : AcessUnitDelimiterRbsp \endif
1034  *
1035  * \brief
1036  *    Decodes AcessUnitDelimiterRbsp.
1037  *
1038  * \param ps_bitstrm   : Pointer to bit ps_bitstrm containing the NAL unit
1039  *
1040  * \return
1041  *    0 on Success and error code otherwise
1042  **************************************************************************
1043  */
1044 
ih264d_access_unit_delimiter_rbsp(dec_struct_t * ps_dec)1045 WORD32 ih264d_access_unit_delimiter_rbsp(dec_struct_t * ps_dec)
1046 {
1047     UWORD8 u1_primary_pic_type;
1048     u1_primary_pic_type = ih264d_get_bits_h264(ps_dec->ps_bitstrm, 3);
1049     switch(u1_primary_pic_type)
1050     {
1051         case I_PIC:
1052         case SI_PIC:
1053         case ISI_PIC:
1054             ps_dec->ps_dec_err_status->u1_pic_aud_i = PIC_TYPE_I;
1055             break;
1056         default:
1057             ps_dec->ps_dec_err_status->u1_pic_aud_i = PIC_TYPE_UNKNOWN;
1058     }
1059     return (0);
1060 }
1061 /*!
1062  **************************************************************************
1063  * \if Function name : ih264d_parse_nal_unit \endif
1064  *
1065  * \brief
1066  *    Decodes NAL unit
1067  *
1068  * \return
1069  *    0 on Success and error code otherwise
1070  **************************************************************************
1071  */
1072 
ih264d_parse_nal_unit(iv_obj_t * dec_hdl,ivd_video_decode_op_t * ps_dec_op,UWORD8 * pu1_buf,UWORD32 u4_length)1073 WORD32 ih264d_parse_nal_unit(iv_obj_t *dec_hdl,
1074                           ivd_video_decode_op_t *ps_dec_op,
1075                           UWORD8 *pu1_buf,
1076                           UWORD32 u4_length)
1077 {
1078 
1079     dec_bit_stream_t *ps_bitstrm;
1080 
1081 
1082     dec_struct_t *ps_dec = (dec_struct_t *)dec_hdl->pv_codec_handle;
1083     ivd_video_decode_ip_t *ps_dec_in =
1084                     (ivd_video_decode_ip_t *)ps_dec->pv_dec_in;
1085     dec_slice_params_t * ps_cur_slice = ps_dec->ps_cur_slice;
1086     UWORD8 u1_first_byte, u1_nal_ref_idc;
1087     UWORD8 u1_nal_unit_type;
1088     WORD32 i_status = OK;
1089     ps_bitstrm = ps_dec->ps_bitstrm;
1090 
1091     if(pu1_buf)
1092     {
1093         if(u4_length)
1094         {
1095             ps_dec_op->u4_frame_decoded_flag = 0;
1096             ih264d_process_nal_unit(ps_dec->ps_bitstrm, pu1_buf,
1097                                     u4_length);
1098 
1099             SWITCHOFFTRACE;
1100             u1_first_byte = ih264d_get_bits_h264(ps_bitstrm, 8);
1101 
1102             if(NAL_FORBIDDEN_BIT(u1_first_byte))
1103             {
1104                 H264_DEC_DEBUG_PRINT("\nForbidden bit set in Nal Unit, Let's try\n");
1105             }
1106             u1_nal_unit_type = NAL_UNIT_TYPE(u1_first_byte);
1107             ps_dec->u1_nal_unit_type = u1_nal_unit_type;
1108             u1_nal_ref_idc = (UWORD8)(NAL_REF_IDC(u1_first_byte));
1109             //Skip all NALUs if SPS and PPS are not decoded
1110             switch(u1_nal_unit_type)
1111             {
1112                 case SLICE_DATA_PARTITION_A_NAL:
1113                 case SLICE_DATA_PARTITION_B_NAL:
1114                 case SLICE_DATA_PARTITION_C_NAL:
1115                     if(!ps_dec->i4_decode_header)
1116                         ih264d_parse_slice_partition(ps_dec, ps_bitstrm);
1117 
1118                     break;
1119 
1120                 case IDR_SLICE_NAL:
1121                 case SLICE_NAL:
1122 
1123                     /* ! */
1124                     DEBUG_THREADS_PRINTF("Decoding  a slice NAL\n");
1125                     if(!ps_dec->i4_decode_header)
1126                     {
1127                         if(ps_dec->i4_header_decoded == 3)
1128                         {
1129                             /* ! */
1130                             ps_dec->u4_slice_start_code_found = 1;
1131 
1132                             ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1133 
1134                             i_status = ih264d_parse_decode_slice(
1135                                             (UWORD8)(u1_nal_unit_type
1136                                                             == IDR_SLICE_NAL),
1137                                             u1_nal_ref_idc, ps_dec);
1138 
1139                             if((ps_dec->u4_first_slice_in_pic != 0)&&
1140                                 ((ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC) == 0))
1141                             {
1142                                 /*  if the first slice header was not valid set to 1 */
1143                                 ps_dec->u4_first_slice_in_pic = 1;
1144                             }
1145 
1146                             if(i_status != OK)
1147                             {
1148                                 return i_status;
1149                             }
1150                         }
1151                         else
1152                         {
1153                             H264_DEC_DEBUG_PRINT(
1154                                             "\nSlice NAL Supplied but no header has been supplied\n");
1155                         }
1156                     }
1157                     break;
1158 
1159                 case SEI_NAL:
1160                     if(!ps_dec->i4_decode_header)
1161                     {
1162                         ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1163                         i_status = ih264d_parse_sei_message(ps_dec, ps_bitstrm);
1164                         if(i_status != OK)
1165                             return i_status;
1166                         ih264d_parse_sei(ps_dec, ps_bitstrm);
1167                     }
1168                     break;
1169                 case SEQ_PARAM_NAL:
1170                     /* ! */
1171                     ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1172                     i_status = ih264d_parse_sps(ps_dec, ps_bitstrm);
1173                     if(i_status == ERROR_INV_SPS_PPS_T)
1174                         return i_status;
1175                     if(!i_status)
1176                         ps_dec->i4_header_decoded |= 0x1;
1177                     break;
1178 
1179                 case PIC_PARAM_NAL:
1180                     /* ! */
1181                     ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1182                     i_status = ih264d_parse_pps(ps_dec, ps_bitstrm);
1183                     if(i_status == ERROR_INV_SPS_PPS_T)
1184                         return i_status;
1185                     if(!i_status)
1186                         ps_dec->i4_header_decoded |= 0x2;
1187                     break;
1188                 case ACCESS_UNIT_DELIMITER_RBSP:
1189                     if(!ps_dec->i4_decode_header)
1190                     {
1191                         ih264d_access_unit_delimiter_rbsp(ps_dec);
1192                     }
1193                     break;
1194                     //Let us ignore the END_OF_SEQ_RBSP NAL and decode even after this NAL
1195                 case END_OF_STREAM_RBSP:
1196                     if(!ps_dec->i4_decode_header)
1197                     {
1198                         ih264d_parse_end_of_stream(ps_dec);
1199                     }
1200                     break;
1201                 case FILLER_DATA_NAL:
1202                     if(!ps_dec->i4_decode_header)
1203                     {
1204                         ih264d_parse_filler_data(ps_dec, ps_bitstrm);
1205                     }
1206                     break;
1207                 default:
1208                     H264_DEC_DEBUG_PRINT("\nUnknown NAL type %d\n", u1_nal_unit_type);
1209                     break;
1210             }
1211 
1212         }
1213 
1214     }
1215 
1216     return i_status;
1217 
1218 }
1219 
1220