ih264d_parse_headers.c revision c080d5799655658eb847b0583f58e5aff3a5cbaa
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
84WORD32 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/*****************************************************************************/
115WORD32 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/*****************************************************************************/
144WORD32 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/*****************************************************************************/
173void 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 */
190WORD32 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 */
387UWORD32 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}
470WORD32 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    COPYTHECONTEXT("SPS: num_ref_frames",ps_seq->u1_num_ref_frames);
732
733    ps_seq->u1_gaps_in_frame_num_value_allowed_flag = ih264d_get_bit_h264(
734                    ps_bitstrm);
735    COPYTHECONTEXT("SPS: gaps_in_frame_num_value_allowed_flag",
736                    ps_seq->u1_gaps_in_frame_num_value_allowed_flag);
737
738    /*--------------------------------------------------------------------*/
739    /* Decode FrameWidth and FrameHeight and related values               */
740    /*--------------------------------------------------------------------*/
741    ps_seq->u2_frm_wd_in_mbs = 1
742                    + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
743    COPYTHECONTEXT("SPS: pic_width_in_mbs_minus1",
744                    ps_seq->u2_frm_wd_in_mbs - 1);
745    u2_pic_wd = (ps_seq->u2_frm_wd_in_mbs << 4);
746
747    pic_height_in_map_units_minus1 = ih264d_uev(pu4_bitstrm_ofst,
748                                                pu4_bitstrm_buf);
749    ps_seq->u2_frm_ht_in_mbs = 1 + pic_height_in_map_units_minus1;
750
751    u2_pic_ht = (ps_seq->u2_frm_ht_in_mbs << 4);
752
753    /*--------------------------------------------------------------------*/
754    /* Get the value of MaxMbAddress and Number of bits needed for it     */
755    /*--------------------------------------------------------------------*/
756    ps_seq->u2_max_mb_addr = (ps_seq->u2_frm_wd_in_mbs
757                    * ps_seq->u2_frm_ht_in_mbs) - 1;
758
759    ps_seq->u2_total_num_of_mbs = ps_seq->u2_max_mb_addr + 1;
760
761    ps_seq->u1_level_idc = ih264d_correct_level_idc(
762                    u1_level_idc, ps_seq->u2_total_num_of_mbs);
763
764    u1_frm = ih264d_get_bit_h264(ps_bitstrm);
765    ps_seq->u1_frame_mbs_only_flag = u1_frm;
766
767    COPYTHECONTEXT("SPS: frame_mbs_only_flag", u1_frm);
768
769    if(!u1_frm)
770    {
771        u2_pic_ht <<= 1;
772        ps_seq->u1_mb_aff_flag = ih264d_get_bit_h264(ps_bitstrm);
773        COPYTHECONTEXT("SPS: mb_adaptive_frame_field_flag",
774                        ps_seq->u1_mb_aff_flag);
775
776    }
777    else
778        ps_seq->u1_mb_aff_flag = 0;
779
780    {
781        WORD32 frame_height_in_mbs = (2 - ps_seq->u1_frame_mbs_only_flag)
782                        * (pic_height_in_map_units_minus1 + 1);
783        UWORD32 wdth = (ps_seq->u2_frm_wd_in_mbs) << 4;
784        UWORD32 hght = (frame_height_in_mbs) << 4;
785
786        if((u2_pic_wd < H264_MIN_FRAME_WIDTH)
787                        || (u2_pic_wd > ps_dec->u4_width_at_init))
788        {
789            ivd_video_decode_op_t *ps_out;
790            /*set width and height in decode output structure*/
791            ps_out = (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
792            ps_out->u4_pic_wd = u2_pic_wd;
793            ps_out->u4_pic_ht = u2_pic_ht;
794
795            return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
796        }
797
798        if((u2_pic_ht < H264_MIN_FRAME_HEIGHT)
799                        || (((0 != ps_seq->u1_frame_mbs_only_flag)
800                                        && (u2_pic_ht * u2_pic_wd
801                                                        > ps_dec->u4_height_at_init
802                                                                        * ps_dec->u4_width_at_init))
803                                        || ((0 == ps_seq->u1_frame_mbs_only_flag)
804                                                        && (ALIGN32(u2_pic_ht)
805                                                                        * u2_pic_wd
806                                                                        > ALIGN32(ps_dec->u4_height_at_init)
807                                                                                        * ps_dec->u4_width_at_init))))
808        {
809            ivd_video_decode_op_t *ps_out;
810            /*set width and height in decode output structure*/
811            ps_out = (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
812            ps_out->u4_pic_wd = u2_pic_wd;
813            ps_out->u4_pic_ht = u2_pic_ht;
814
815            return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
816        }
817
818
819
820
821    }
822
823    ps_seq->u1_direct_8x8_inference_flag = ih264d_get_bit_h264(ps_bitstrm);
824
825    COPYTHECONTEXT("SPS: direct_8x8_inference_flag",
826                    ps_seq->u1_direct_8x8_inference_flag);
827
828    /* G050 */
829    u1_frame_cropping_flag = ih264d_get_bit_h264(ps_bitstrm);
830    COPYTHECONTEXT("SPS: frame_cropping_flag",u1_frame_cropping_flag);
831
832    if(u1_frame_cropping_flag)
833    {
834        u1_frame_cropping_rect_left_ofst = ih264d_uev(pu4_bitstrm_ofst,
835                                                      pu4_bitstrm_buf);
836        COPYTHECONTEXT("SPS: frame_cropping_rect_left_offset",
837                        u1_frame_cropping_rect_left_ofst);
838        u1_frame_cropping_rect_right_ofst = ih264d_uev(pu4_bitstrm_ofst,
839                                                       pu4_bitstrm_buf);
840        COPYTHECONTEXT("SPS: frame_cropping_rect_right_offset",
841                        u1_frame_cropping_rect_right_ofst);
842        u1_frame_cropping_rect_top_ofst = ih264d_uev(pu4_bitstrm_ofst,
843                                                     pu4_bitstrm_buf);
844        COPYTHECONTEXT("SPS: frame_cropping_rect_top_offset",
845                        u1_frame_cropping_rect_top_ofst);
846        u1_frame_cropping_rect_bottom_ofst = ih264d_uev(pu4_bitstrm_ofst,
847                                                        pu4_bitstrm_buf);
848        COPYTHECONTEXT("SPS: frame_cropping_rect_bottom_offset",
849                        u1_frame_cropping_rect_bottom_ofst);
850    }
851    /* G050 */
852
853    ps_seq->u1_vui_parameters_present_flag = ih264d_get_bit_h264(ps_bitstrm);
854    COPYTHECONTEXT("SPS: vui_parameters_present_flag",
855                    ps_seq->u1_vui_parameters_present_flag);
856
857    u2_frm_wd_y = u2_pic_wd + (UWORD8)(PAD_LEN_Y_H << 1);
858    if(1 == ps_dec->u4_share_disp_buf)
859    {
860        if(ps_dec->u4_app_disp_width > u2_frm_wd_y)
861            u2_frm_wd_y = ps_dec->u4_app_disp_width;
862    }
863
864    u2_frm_ht_y = u2_pic_ht + (UWORD8)(PAD_LEN_Y_V << 2);
865    u2_frm_wd_uv = u2_pic_wd + (UWORD8)(PAD_LEN_UV_H << 2);
866    u2_frm_wd_uv = MAX(u2_frm_wd_uv, u2_frm_wd_y);
867
868    u2_frm_ht_uv = (u2_pic_ht >> 1) + (UWORD8)(PAD_LEN_UV_V << 2);
869    u2_frm_ht_uv = MAX(u2_frm_ht_uv, (u2_frm_ht_y >> 1));
870
871
872    /* Calculate display picture width, height and start u4_ofst from YUV420 */
873    /* pictute buffers as per cropping information parsed above             */
874    {
875        UWORD16 u2_rgt_ofst = 0;
876        UWORD16 u2_lft_ofst = 0;
877        UWORD16 u2_top_ofst = 0;
878        UWORD16 u2_btm_ofst = 0;
879        UWORD8 u1_frm_mbs_flag;
880        UWORD8 u1_vert_mult_factor;
881        WORD32 i4_cropped_ht, i4_cropped_wd;
882
883        if(u1_frame_cropping_flag)
884        {
885            /* Calculate right and left u4_ofst for cropped picture           */
886            u2_rgt_ofst = u1_frame_cropping_rect_right_ofst << 1;
887            u2_lft_ofst = u1_frame_cropping_rect_left_ofst << 1;
888
889            /* Know frame MBs only u4_flag                                      */
890            u1_frm_mbs_flag = (1 == ps_seq->u1_frame_mbs_only_flag);
891
892            /* Simplify the vertical u4_ofst calculation from field/frame     */
893            u1_vert_mult_factor = (2 - u1_frm_mbs_flag);
894
895            /* Calculate bottom and top u4_ofst for cropped  picture          */
896            u2_btm_ofst = (u1_frame_cropping_rect_bottom_ofst
897                            << u1_vert_mult_factor);
898            u2_top_ofst = (u1_frame_cropping_rect_top_ofst
899                            << u1_vert_mult_factor);
900        }
901
902        /* Calculate u4_ofst from start of YUV 420 picture buffer to start of*/
903        /* cropped picture buffer                                           */
904        u2_crop_offset_y = (u2_frm_wd_y * u2_top_ofst) + (u2_lft_ofst);
905        u2_crop_offset_uv = (u2_frm_wd_uv * (u2_top_ofst >> 1))
906                        + (u2_lft_ofst >> 1) * YUV420SP_FACTOR;
907        /* Calculate the display picture width and height based on crop      */
908        /* information                                                       */
909        i4_cropped_ht = u2_pic_ht - (u2_btm_ofst + u2_top_ofst);
910        i4_cropped_wd = u2_pic_wd - (u2_rgt_ofst + u2_lft_ofst);
911
912        if((i4_cropped_ht < MB_SIZE) || (i4_cropped_wd < MB_SIZE))
913        {
914            return ERROR_INV_SPS_PPS_T;
915        }
916
917        if((3 == ps_dec->i4_header_decoded) && (ps_dec->u2_pic_wd != u2_pic_wd))
918        {
919            ps_dec->u1_res_changed = 1;
920            return IVD_RES_CHANGED;
921        }
922        if((3 == ps_dec->i4_header_decoded) && (ps_dec->u2_pic_ht != u2_pic_ht))
923        {
924            ps_dec->u1_res_changed = 1;
925            return IVD_RES_CHANGED;
926        }
927
928        ps_dec->u2_disp_height = i4_cropped_ht;
929
930        ps_dec->u2_disp_width = i4_cropped_wd;
931
932    }
933     if(ps_dec->u4_level_at_init < u1_level_idc)
934     {
935         return IH264D_UNSUPPORTED_LEVEL;
936     }
937
938    ps_seq->u1_is_valid = TRUE;
939
940    if(1 == ps_seq->u1_vui_parameters_present_flag)
941    {
942        ret = ih264d_parse_vui_parametres(&ps_seq->s_vui, ps_bitstrm);
943        if(ret != OK)
944            return ret;
945    }
946
947    ps_dec->u2_pic_wd = u2_pic_wd;
948    ps_dec->u2_pic_ht = u2_pic_ht;
949
950    /* Determining the Width and Height of Frame from that of Picture */
951    ps_dec->u2_frm_wd_y = u2_frm_wd_y;
952    ps_dec->u2_frm_ht_y = u2_frm_ht_y;
953
954    ps_dec->u2_frm_wd_uv = u2_frm_wd_uv;
955    ps_dec->u2_frm_ht_uv = u2_frm_ht_uv;
956    ps_dec->s_pad_mgr.u1_pad_len_y_v = (UWORD8)(PAD_LEN_Y_V << (1 - u1_frm));
957    ps_dec->s_pad_mgr.u1_pad_len_cr_v = (UWORD8)(PAD_LEN_UV_V << (1 - u1_frm));
958
959    ps_dec->u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
960    ps_dec->u2_frm_ht_in_mbs = ps_seq->u2_frm_ht_in_mbs;
961
962    ps_dec->u2_crop_offset_y = u2_crop_offset_y;
963    ps_dec->u2_crop_offset_uv = u2_crop_offset_uv;
964
965    ps_dec->ps_sps[u1_seq_parameter_set_id] = *ps_seq;
966
967    return OK;
968}
969
970/*!
971 **************************************************************************
972 * \if Function name : ih264d_parse_end_of_sequence \endif
973 *
974 * \brief
975 *    Decodes End of Sequence.
976 *
977 * \param ps_bitstrm   : Pointer to bit ps_bitstrm containing the NAL unit
978 *
979 * \return
980 *    0 on Success and error code otherwise
981 **************************************************************************
982 */
983WORD32 ih264d_parse_end_of_sequence(dec_struct_t * ps_dec)
984{
985    WORD32 ret;
986
987    ret = ih264d_end_of_pic_processing(ps_dec);
988    return ret;
989}
990
991/*!
992 **************************************************************************
993 * \if Function name : AcessUnitDelimiterRbsp \endif
994 *
995 * \brief
996 *    Decodes AcessUnitDelimiterRbsp.
997 *
998 * \param ps_bitstrm   : Pointer to bit ps_bitstrm containing the NAL unit
999 *
1000 * \return
1001 *    0 on Success and error code otherwise
1002 **************************************************************************
1003 */
1004
1005WORD32 ih264d_access_unit_delimiter_rbsp(dec_struct_t * ps_dec)
1006{
1007    UWORD8 u1_primary_pic_type;
1008    u1_primary_pic_type = ih264d_get_bits_h264(ps_dec->ps_bitstrm, 3);
1009    switch(u1_primary_pic_type)
1010    {
1011        case I_PIC:
1012        case SI_PIC:
1013        case ISI_PIC:
1014            ps_dec->ps_dec_err_status->u1_pic_aud_i = PIC_TYPE_I;
1015            break;
1016        default:
1017            ps_dec->ps_dec_err_status->u1_pic_aud_i = PIC_TYPE_UNKNOWN;
1018    }
1019    return (0);
1020}
1021/*!
1022 **************************************************************************
1023 * \if Function name : ih264d_parse_nal_unit \endif
1024 *
1025 * \brief
1026 *    Decodes NAL unit
1027 *
1028 * \return
1029 *    0 on Success and error code otherwise
1030 **************************************************************************
1031 */
1032
1033WORD32 ih264d_parse_nal_unit(iv_obj_t *dec_hdl,
1034                          ivd_video_decode_op_t *ps_dec_op,
1035                          UWORD8 *pu1_buf,
1036                          UWORD32 u4_length)
1037{
1038
1039    dec_bit_stream_t *ps_bitstrm;
1040
1041
1042    dec_struct_t *ps_dec = (dec_struct_t *)dec_hdl->pv_codec_handle;
1043    ivd_video_decode_ip_t *ps_dec_in =
1044                    (ivd_video_decode_ip_t *)ps_dec->pv_dec_in;
1045    dec_slice_params_t * ps_cur_slice = ps_dec->ps_cur_slice;
1046    UWORD8 u1_first_byte, u1_nal_ref_idc;
1047    UWORD8 u1_nal_unit_type;
1048    WORD32 i_status = OK;
1049    ps_bitstrm = ps_dec->ps_bitstrm;
1050
1051    if(pu1_buf)
1052    {
1053        if(u4_length)
1054        {
1055            ps_dec_op->u4_frame_decoded_flag = 0;
1056            ih264d_process_nal_unit(ps_dec->ps_bitstrm, pu1_buf,
1057                                    u4_length);
1058
1059            SWITCHOFFTRACE;
1060            u1_first_byte = ih264d_get_bits_h264(ps_bitstrm, 8);
1061
1062            if(NAL_FORBIDDEN_BIT(u1_first_byte))
1063            {
1064                H264_DEC_DEBUG_PRINT("\nForbidden bit set in Nal Unit, Let's try\n");
1065            }
1066            u1_nal_unit_type = NAL_UNIT_TYPE(u1_first_byte);
1067            ps_dec->u1_nal_unit_type = u1_nal_unit_type;
1068            u1_nal_ref_idc = (UWORD8)(NAL_REF_IDC(u1_first_byte));
1069            //Skip all NALUs if SPS and PPS are not decoded
1070            switch(u1_nal_unit_type)
1071            {
1072                case SLICE_DATA_PARTITION_A_NAL:
1073                case SLICE_DATA_PARTITION_B_NAL:
1074                case SLICE_DATA_PARTITION_C_NAL:
1075                    if(!ps_dec->i4_decode_header)
1076                        ih264d_parse_slice_partition(ps_dec, ps_bitstrm);
1077
1078                    break;
1079
1080                case IDR_SLICE_NAL:
1081                case SLICE_NAL:
1082
1083                    /* ! */
1084                    DEBUG_THREADS_PRINTF("Decoding  a slice NAL\n");
1085                    if(!ps_dec->i4_decode_header)
1086                    {
1087                        if(ps_dec->i4_header_decoded == 3)
1088                        {
1089                            /* ! */
1090                            ps_dec->u4_slice_start_code_found = 1;
1091
1092                            ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1093
1094                            i_status = ih264d_parse_decode_slice(
1095                                            (UWORD8)(u1_nal_unit_type
1096                                                            == IDR_SLICE_NAL),
1097                                            u1_nal_ref_idc, ps_dec);
1098
1099                            if(i_status != OK)
1100                                return i_status;
1101                        }
1102                        else
1103                        {
1104                            H264_DEC_DEBUG_PRINT(
1105                                            "\nSlice NAL Supplied but no header has been supplied\n");
1106                        }
1107                    }
1108                    break;
1109
1110                case SEI_NAL:
1111                    if(!ps_dec->i4_decode_header)
1112                    {
1113                        ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1114                        i_status = ih264d_parse_sei_message(ps_dec, ps_bitstrm);
1115                        if(i_status != OK)
1116                            return i_status;
1117                        ih264d_parse_sei(ps_dec, ps_bitstrm);
1118                    }
1119                    break;
1120                case SEQ_PARAM_NAL:
1121                    /* ! */
1122                    ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1123                    i_status = ih264d_parse_sps(ps_dec, ps_bitstrm);
1124                    if(i_status == ERROR_INV_SPS_PPS_T)
1125                        return i_status;
1126                    if(!i_status)
1127                        ps_dec->i4_header_decoded |= 0x1;
1128                    break;
1129
1130                case PIC_PARAM_NAL:
1131                    /* ! */
1132                    ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm);
1133                    i_status = ih264d_parse_pps(ps_dec, ps_bitstrm);
1134                    if(i_status == ERROR_INV_SPS_PPS_T)
1135                        return i_status;
1136                    if(!i_status)
1137                        ps_dec->i4_header_decoded |= 0x2;
1138                    break;
1139                case ACCESS_UNIT_DELIMITER_RBSP:
1140                    if(!ps_dec->i4_decode_header)
1141                    {
1142                        ih264d_access_unit_delimiter_rbsp(ps_dec);
1143                    }
1144                    break;
1145                    //Let us ignore the END_OF_SEQ_RBSP NAL and decode even after this NAL
1146                case END_OF_STREAM_RBSP:
1147                    if(!ps_dec->i4_decode_header)
1148                    {
1149                        ih264d_parse_end_of_stream(ps_dec);
1150                    }
1151                    break;
1152                case FILLER_DATA_NAL:
1153                    if(!ps_dec->i4_decode_header)
1154                    {
1155                        ih264d_parse_filler_data(ps_dec, ps_bitstrm);
1156                    }
1157                    break;
1158                default:
1159                    H264_DEC_DEBUG_PRINT("\nUnknown NAL type %d\n", u1_nal_unit_type);
1160                    break;
1161            }
1162
1163        }
1164
1165    }
1166
1167    return i_status;
1168
1169}
1170
1171