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