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