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  **************************************************************************
     23  * \file ih264d_parse_islice.c
     24  *
     25  * \brief
     26  *    Contains routines that decode a I slice type
     27  *
     28  * Detailed_description
     29  *
     30  * \date
     31  *    07/07/2003
     32  *
     33  * \author  NS
     34  **************************************************************************
     35  */
     36 #include "ih264d_error_handler.h"
     37 #include "ih264d_debug.h"
     38 #include <string.h>
     39 #include "ih264d_bitstrm.h"
     40 #include "ih264d_defs.h"
     41 #include "ih264d_debug.h"
     42 #include "ih264d_tables.h"
     43 #include "ih264d_structs.h"
     44 #include "ih264d_defs.h"
     45 #include "ih264d_parse_cavlc.h"
     46 #include "ih264d_mb_utils.h"
     47 #include "ih264d_deblocking.h"
     48 #include "ih264d_cabac.h"
     49 #include "ih264d_parse_cabac.h"
     50 #include "ih264d_parse_mb_header.h"
     51 #include "ih264d_parse_slice.h"
     52 #include "ih264d_process_pslice.h"
     53 #include "ih264d_process_intra_mb.h"
     54 #include "ih264d_parse_islice.h"
     55 #include "ih264d_error_handler.h"
     56 #include "ih264d_mvpred.h"
     57 #include "ih264d_defs.h"
     58 #include "ih264d_thread_parse_decode.h"
     59 #include "ithread.h"
     60 #include "ih264d_parse_mb_header.h"
     61 #include "assert.h"
     62 #include "ih264d_utils.h"
     63 #include "ih264d_format_conv.h"
     64 
     65 void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec);
     66 
     67 void ih264d_itrans_recon_luma_dc(dec_struct_t *ps_dec,
     68                                  WORD16* pi2_src,
     69                                  WORD16* pi2_coeff_block,
     70                                  const UWORD16 *pu2_weigh_mat);
     71 
     72 
     73 
     74 /*!
     75  **************************************************************************
     76  * \if Function name : ParseIMb \endif
     77  *
     78  * \brief
     79  *    This function parses CAVLC syntax of a I MB. If 16x16 Luma DC transform
     80  *    is also done here. Transformed Luma DC values are copied in their
     81  *    0th pixel location of corrosponding CoeffBlock.
     82  *
     83  * \return
     84  *    0 on Success and Error code otherwise
     85  **************************************************************************
     86  */
     87 WORD32 ih264d_parse_imb_cavlc(dec_struct_t * ps_dec,
     88                               dec_mb_info_t * ps_cur_mb_info,
     89                               UWORD8 u1_mb_num,
     90                               UWORD8 u1_mb_type)
     91 {
     92     WORD32 i4_delta_qp;
     93     UWORD32 u4_temp;
     94     UWORD32 ui_is_top_mb_available;
     95     UWORD32 ui_is_left_mb_available;
     96     UWORD32 u4_cbp;
     97     UWORD32 u4_offset;
     98     UWORD32 *pu4_bitstrm_buf;
     99     WORD32 ret;
    100 
    101     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
    102     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
    103     UNUSED(u1_mb_num);
    104     ps_cur_mb_info->u1_tran_form8x8 = 0;
    105     ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
    106 
    107     ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
    108 
    109     u4_temp = ps_dec->u1_mb_ngbr_availablity;
    110     ui_is_top_mb_available = BOOLEAN(u4_temp & TOP_MB_AVAILABLE_MASK);
    111     ui_is_left_mb_available = BOOLEAN(u4_temp & LEFT_MB_AVAILABLE_MASK);
    112 
    113     pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    114 
    115     if(u1_mb_type == I_4x4_MB)
    116     {
    117         ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
    118         u4_offset = 0;
    119 
    120         /*--------------------------------------------------------------------*/
    121         /* Read transform_size_8x8_flag if present                            */
    122         /*--------------------------------------------------------------------*/
    123         if(ps_dec->s_high_profile.u1_transform8x8_present)
    124         {
    125             ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm);
    126             COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
    127             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
    128         }
    129 
    130         /*--------------------------------------------------------------------*/
    131         /* Read the IntraPrediction modes for LUMA                            */
    132         /*--------------------------------------------------------------------*/
    133         if (!ps_cur_mb_info->u1_tran_form8x8)
    134         {
    135             UWORD8 *pu1_temp;
    136             ih264d_read_intra_pred_modes(ps_dec,
    137                                           ((UWORD8 *)ps_dec->pv_parse_tu_coeff_data),
    138                                           ((UWORD8 *)ps_dec->pv_parse_tu_coeff_data+16),
    139                                           ps_cur_mb_info->u1_tran_form8x8);
    140             pu1_temp = (UWORD8 *)ps_dec->pv_parse_tu_coeff_data;
    141             pu1_temp += 32;
    142             ps_dec->pv_parse_tu_coeff_data = (void *)pu1_temp;
    143         }
    144         else
    145         {
    146             UWORD8 *pu1_temp;
    147             ih264d_read_intra_pred_modes(ps_dec,
    148                                           ((UWORD8 *)ps_dec->pv_parse_tu_coeff_data),
    149                                           ((UWORD8 *)ps_dec->pv_parse_tu_coeff_data+4),
    150                                           ps_cur_mb_info->u1_tran_form8x8);
    151             pu1_temp = (UWORD8 *)ps_dec->pv_parse_tu_coeff_data;
    152             pu1_temp += 8;
    153             ps_dec->pv_parse_tu_coeff_data = (void *)pu1_temp;
    154         }
    155         /*--------------------------------------------------------------------*/
    156         /* Read the IntraPrediction mode for CHROMA                           */
    157         /*--------------------------------------------------------------------*/
    158 //Inlined ih264d_uev
    159         {
    160             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
    161             UWORD32 u4_word, u4_ldz, u4_temp;
    162 
    163             /***************************************************************/
    164             /* Find leading zeros in next 32 bits                          */
    165             /***************************************************************/
    166             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
    167             u4_ldz = CLZ(u4_word);
    168             /* Flush the ps_bitstrm */
    169             u4_bitstream_offset += (u4_ldz + 1);
    170             /* Read the suffix from the ps_bitstrm */
    171             u4_word = 0;
    172             if(u4_ldz)
    173             {
    174                 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
    175                         u4_ldz);
    176             }
    177             *pu4_bitstrm_ofst = u4_bitstream_offset;
    178             u4_temp = ((1 << u4_ldz) + u4_word - 1);
    179             if(u4_temp > 3)
    180             {
    181                 return ERROR_CHROMA_PRED_MODE;
    182             }
    183             ps_cur_mb_info->u1_chroma_pred_mode = u4_temp;
    184             COPYTHECONTEXT("intra_chroma_pred_mode", ps_cur_mb_info->u1_chroma_pred_mode);
    185         }
    186         /*--------------------------------------------------------------------*/
    187         /* Read the Coded block pattern                                       */
    188         /*--------------------------------------------------------------------*/
    189         {
    190             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
    191             UWORD32 u4_word, u4_ldz;
    192 
    193             /***************************************************************/
    194             /* Find leading zeros in next 32 bits                          */
    195             /***************************************************************/
    196             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
    197             u4_ldz = CLZ(u4_word);
    198             /* Flush the ps_bitstrm */
    199             u4_bitstream_offset += (u4_ldz + 1);
    200             /* Read the suffix from the ps_bitstrm */
    201             u4_word = 0;
    202             if(u4_ldz)
    203             {
    204                 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
    205                         u4_ldz);
    206             }
    207             *pu4_bitstrm_ofst = u4_bitstream_offset;
    208             u4_cbp = ((1 << u4_ldz) + u4_word - 1);
    209         }
    210         if(u4_cbp > 47)
    211         {
    212             return ERROR_CBP;
    213         }
    214 
    215         u4_cbp = gau1_ih264d_cbp_table[u4_cbp][0];
    216         COPYTHECONTEXT("coded_block_pattern", u1_cbp);
    217         ps_cur_mb_info->u1_cbp = u4_cbp;
    218 
    219         /*--------------------------------------------------------------------*/
    220         /* Read mb_qp_delta                                                   */
    221         /*--------------------------------------------------------------------*/
    222         if(ps_cur_mb_info->u1_cbp)
    223         {
    224             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
    225             UWORD32 u4_word, u4_ldz, u4_abs_val;
    226 
    227             /***************************************************************/
    228             /* Find leading zeros in next 32 bits                          */
    229             /***************************************************************/
    230             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
    231             u4_ldz = CLZ(u4_word);
    232 
    233             /* Flush the ps_bitstrm */
    234             u4_bitstream_offset += (u4_ldz + 1);
    235 
    236             /* Read the suffix from the ps_bitstrm */
    237             u4_word = 0;
    238             if(u4_ldz)
    239             {
    240                 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
    241                         u4_ldz);
    242             }
    243 
    244             *pu4_bitstrm_ofst = u4_bitstream_offset;
    245             u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
    246 
    247             if(u4_word & 0x1)
    248             {
    249                 i4_delta_qp = (-(WORD32)u4_abs_val);
    250             }
    251             else
    252             {
    253                 i4_delta_qp = (u4_abs_val);
    254             }
    255 
    256             if((i4_delta_qp < -26) || (i4_delta_qp > 25))
    257             {
    258                 return ERROR_INV_RANGE_QP_T;
    259             }
    260 
    261             COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
    262             if(i4_delta_qp != 0)
    263             {
    264                 ret = ih264d_update_qp(ps_dec, (WORD8)i4_delta_qp);
    265                 if(ret != OK)
    266                     return ret;
    267             }
    268         }
    269 
    270     }
    271     else
    272     {
    273         u4_offset = 1;
    274         ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
    275         /*-------------------------------------------------------------------*/
    276         /* Read the IntraPrediction mode for CHROMA                          */
    277         /*-------------------------------------------------------------------*/
    278         {
    279             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
    280             UWORD32 u4_word, u4_ldz;
    281 
    282             /***************************************************************/
    283             /* Find leading zeros in next 32 bits                          */
    284             /***************************************************************/
    285             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
    286             u4_ldz = CLZ(u4_word);
    287             /* Flush the ps_bitstrm */
    288             u4_bitstream_offset += (u4_ldz + 1);
    289             /* Read the suffix from the ps_bitstrm */
    290             u4_word = 0;
    291             if(u4_ldz)
    292             {
    293                 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
    294                         u4_ldz);
    295             }
    296             *pu4_bitstrm_ofst = u4_bitstream_offset;
    297             u4_temp = ((1 << u4_ldz) + u4_word - 1);
    298 
    299 //Inlined ih264d_uev
    300 
    301             if(u4_temp > 3)
    302             {
    303                 return ERROR_CHROMA_PRED_MODE;
    304             }
    305             ps_cur_mb_info->u1_chroma_pred_mode = u4_temp;
    306             COPYTHECONTEXT("intra_chroma_pred_mode", ps_cur_mb_info->u1_chroma_pred_mode);
    307         }
    308         /*-------------------------------------------------------------------*/
    309         /* Read the Coded block pattern                                      */
    310         /*-------------------------------------------------------------------*/
    311         u4_cbp = gau1_ih264d_cbp_tab[(u1_mb_type - 1) >> 2];
    312         ps_cur_mb_info->u1_cbp = u4_cbp;
    313 
    314         /*-------------------------------------------------------------------*/
    315         /* Read mb_qp_delta                                                  */
    316         /*-------------------------------------------------------------------*/
    317         {
    318             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
    319             UWORD32 u4_word, u4_ldz, u4_abs_val;
    320 
    321             /***************************************************************/
    322             /* Find leading zeros in next 32 bits                          */
    323             /***************************************************************/
    324             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
    325             u4_ldz = CLZ(u4_word);
    326 
    327             /* Flush the ps_bitstrm */
    328             u4_bitstream_offset += (u4_ldz + 1);
    329 
    330             /* Read the suffix from the ps_bitstrm */
    331             u4_word = 0;
    332             if(u4_ldz)
    333                 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
    334                         u4_ldz);
    335 
    336             *pu4_bitstrm_ofst = u4_bitstream_offset;
    337             u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
    338 
    339             if(u4_word & 0x1)
    340                 i4_delta_qp = (-(WORD32)u4_abs_val);
    341             else
    342                 i4_delta_qp = (u4_abs_val);
    343 
    344             if((i4_delta_qp < -26) || (i4_delta_qp > 25))
    345                 return ERROR_INV_RANGE_QP_T;
    346 
    347         }
    348 //inlinined ih264d_sev
    349         COPYTHECONTEXT("Delta quant", i1_delta_qp);
    350 
    351         if(i4_delta_qp != 0)
    352         {
    353             ret = ih264d_update_qp(ps_dec, (WORD8)i4_delta_qp);
    354             if(ret != OK)
    355                 return ret;
    356         }
    357 
    358         {
    359             WORD16 i_scaleFactor;
    360             UWORD32 ui_N = 0;
    361             WORD16 *pi2_scale_matrix_ptr;
    362             /*******************************************************************/
    363             /* for luma DC coefficients the scaling is done during the parsing */
    364             /* to preserve the precision                                       */
    365             /*******************************************************************/
    366             if(ps_dec->s_high_profile.u1_scaling_present)
    367             {
    368                 pi2_scale_matrix_ptr =
    369                                 ps_dec->s_high_profile.i2_scalinglist4x4[0];
    370             }
    371             else
    372             {
    373                 i_scaleFactor = 16;
    374                 pi2_scale_matrix_ptr = &i_scaleFactor;
    375             }
    376 
    377             /*---------------------------------------------------------------*/
    378             /* Decode DC coefficients                                        */
    379             /*---------------------------------------------------------------*/
    380             /*---------------------------------------------------------------*/
    381             /* Calculation of N                                              */
    382             /*---------------------------------------------------------------*/
    383             if(ui_is_left_mb_available)
    384             {
    385 
    386                 if(ui_is_top_mb_available)
    387                 {
    388                     ui_N = ((ps_cur_mb_info->ps_top_mb->pu1_nnz_y[0]
    389                                     + ps_dec->pu1_left_nnz_y[0] + 1) >> 1);
    390                 }
    391                 else
    392                 {
    393                     ui_N = ps_dec->pu1_left_nnz_y[0];
    394                 }
    395             }
    396             else if(ui_is_top_mb_available)
    397             {
    398                 ui_N = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[0];
    399             }
    400 
    401             {
    402                 WORD16 pi2_dc_coef[16];
    403                 WORD32 pi4_tmp[16];
    404                 tu_sblk4x4_coeff_data_t *ps_tu_4x4 =
    405                                 (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
    406                 WORD16 *pi2_coeff_block =
    407                                 (WORD16 *)ps_dec->pv_parse_tu_coeff_data;
    408                 UWORD32 u4_num_coeff;
    409                 ps_tu_4x4->u2_sig_coeff_map = 0;
    410 
    411                 ret = ps_dec->pf_cavlc_parse4x4coeff[(ui_N > 7)](pi2_dc_coef, 0, ui_N,
    412                                                                  ps_dec, &u4_num_coeff);
    413                 if(ret != OK)
    414                     return ret;
    415 
    416                 if(EXCEED_OFFSET(ps_bitstrm))
    417                     return ERROR_EOB_TERMINATE_T;
    418                 if(ps_tu_4x4->u2_sig_coeff_map)
    419                 {
    420                     memset(pi2_dc_coef,0,sizeof(pi2_dc_coef));
    421                     ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4,
    422                                                      pi2_dc_coef,
    423                                                      ps_dec->pu1_inv_scan);
    424 
    425                     PROFILE_DISABLE_IQ_IT_RECON()
    426                     ps_dec->pf_ihadamard_scaling_4x4(pi2_dc_coef,
    427                                                      pi2_coeff_block,
    428                                                      ps_dec->pu2_quant_scale_y,
    429                                                      (UWORD16 *)pi2_scale_matrix_ptr,
    430                                                      ps_dec->u1_qp_y_div6,
    431                                                      pi4_tmp);
    432                     pi2_coeff_block += 16;
    433                     ps_dec->pv_parse_tu_coeff_data = (void *)pi2_coeff_block;
    434                     SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag,0);
    435                 }
    436 
    437             }
    438         }
    439     }
    440 
    441 
    442     if(u4_cbp)
    443     {
    444 
    445         ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info,
    446                                        (UWORD8)u4_offset);
    447         if(ret != OK)
    448             return ret;
    449         if(EXCEED_OFFSET(ps_bitstrm))
    450             return ERROR_EOB_TERMINATE_T;
    451 
    452         /* Store Left Mb NNZ and TOP chroma NNZ */
    453     }
    454     else
    455     {
    456         ps_cur_mb_info->u1_qp_div6 = ps_dec->u1_qp_y_div6;
    457         ps_cur_mb_info->u1_qpc_div6 = ps_dec->u1_qp_u_div6;
    458         ps_cur_mb_info->u1_qpcr_div6 = ps_dec->u1_qp_v_div6;
    459         ps_cur_mb_info->u1_qp_rem6 = ps_dec->u1_qp_y_rem6;
    460         ps_cur_mb_info->u1_qpc_rem6 = ps_dec->u1_qp_u_rem6;
    461         ps_cur_mb_info->u1_qpcr_rem6 = ps_dec->u1_qp_v_rem6;
    462         ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
    463     }
    464 
    465     return OK;
    466 }
    467 
    468 /*!
    469  **************************************************************************
    470  * \if Function name : ParseIMbCab \endif
    471  *
    472  * \brief
    473  *    This function parses CABAC syntax of a I MB. If 16x16 Luma DC transform
    474  *    is also done here. Transformed Luma DC values are copied in their
    475  *    0th pixel location of corrosponding CoeffBlock.
    476  *
    477  * \return
    478  *    0 on Success and Error code otherwise
    479  **************************************************************************
    480  */
    481 WORD32 ih264d_parse_imb_cabac(dec_struct_t * ps_dec,
    482                               dec_mb_info_t * ps_cur_mb_info,
    483                               UWORD8 u1_mb_type)
    484 {
    485     WORD8 i1_delta_qp;
    486     UWORD8 u1_cbp;
    487     UWORD8 u1_offset;
    488     /* Variables for handling Cabac contexts */
    489     ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
    490     ctxt_inc_mb_info_t *ps_left_ctxt = ps_dec->p_left_ctxt_mb_info;
    491     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
    492     bin_ctxt_model_t *p_bin_ctxt;
    493 
    494     UWORD8 u1_intra_chrom_pred_mode;
    495     UWORD8 u1_dc_block_flag = 0;
    496     WORD32 ret;
    497 
    498     ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
    499 
    500     if(ps_left_ctxt == ps_dec->ps_def_ctxt_mb_info)
    501     {
    502         ps_dec->pu1_left_yuv_dc_csbp[0] = 0xf;
    503     }
    504 
    505     if(ps_dec->ps_cur_slice->u1_slice_type != I_SLICE)
    506     {
    507         WORD32 *pi4_buf;
    508         WORD8 *pi1_buf;
    509         MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
    510         *((UWORD32 *)ps_dec->pi1_left_ref_idx_ctxt_inc) = 0;
    511         MEMSET_16BYTES(p_curr_ctxt->u1_mv, 0);
    512         pi1_buf = p_curr_ctxt->i1_ref_idx;
    513         pi4_buf = (WORD32 *)pi1_buf;
    514         *pi4_buf = 0;
    515     }
    516 
    517     if(u1_mb_type == I_4x4_MB)
    518     {
    519         ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
    520         p_curr_ctxt->u1_mb_type = CAB_I4x4;
    521         u1_offset = 0;
    522 
    523         ps_cur_mb_info->u1_tran_form8x8 = 0;
    524         ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
    525 
    526         /*--------------------------------------------------------------------*/
    527         /* Read transform_size_8x8_flag if present                            */
    528         /*--------------------------------------------------------------------*/
    529         if(ps_dec->s_high_profile.u1_transform8x8_present)
    530         {
    531             ps_cur_mb_info->u1_tran_form8x8 = ih264d_parse_transform8x8flag_cabac(
    532                             ps_dec, ps_cur_mb_info);
    533             COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
    534             p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
    535             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
    536         }
    537         else
    538         {
    539             p_curr_ctxt->u1_transform8x8_ctxt = 0;
    540         }
    541 
    542         /*--------------------------------------------------------------------*/
    543         /* Read the IntraPrediction modes for LUMA                            */
    544         /*--------------------------------------------------------------------*/
    545         if (!ps_cur_mb_info->u1_tran_form8x8)
    546         {
    547             UWORD8 *pu1_temp;
    548             ih264d_read_intra_pred_modes_cabac(
    549                             ps_dec,
    550                             ((UWORD8 *)ps_dec->pv_parse_tu_coeff_data),
    551                             ((UWORD8 *)ps_dec->pv_parse_tu_coeff_data+16),
    552                             ps_cur_mb_info->u1_tran_form8x8);
    553             pu1_temp = (UWORD8 *)ps_dec->pv_parse_tu_coeff_data;
    554             pu1_temp += 32;
    555             ps_dec->pv_parse_tu_coeff_data = (void *)pu1_temp;
    556         }
    557         else
    558         {
    559             UWORD8 *pu1_temp;
    560             ih264d_read_intra_pred_modes_cabac(
    561                             ps_dec,
    562                             ((UWORD8 *)ps_dec->pv_parse_tu_coeff_data),
    563                             ((UWORD8 *)ps_dec->pv_parse_tu_coeff_data+4),
    564                             ps_cur_mb_info->u1_tran_form8x8);
    565             pu1_temp = (UWORD8 *)ps_dec->pv_parse_tu_coeff_data;
    566             pu1_temp += 8;
    567             ps_dec->pv_parse_tu_coeff_data = (void *)pu1_temp;
    568         }
    569         /*--------------------------------------------------------------------*/
    570         /* Read the IntraPrediction mode for CHROMA                           */
    571         /*--------------------------------------------------------------------*/
    572         u1_intra_chrom_pred_mode = ih264d_parse_chroma_pred_mode_cabac(ps_dec);
    573         COPYTHECONTEXT("intra_chroma_pred_mode", u1_intra_chrom_pred_mode);
    574         p_curr_ctxt->u1_intra_chroma_pred_mode = ps_cur_mb_info->u1_chroma_pred_mode =
    575                         u1_intra_chrom_pred_mode;
    576 
    577         /*--------------------------------------------------------------------*/
    578         /* Read the Coded block pattern                                       */
    579         /*--------------------------------------------------------------------*/
    580         u1_cbp = ih264d_parse_ctx_cbp_cabac(ps_dec);
    581         COPYTHECONTEXT("coded_block_pattern", u1_cbp);
    582         ps_cur_mb_info->u1_cbp = u1_cbp;
    583         p_curr_ctxt->u1_cbp = u1_cbp;
    584 
    585         /*--------------------------------------------------------------------*/
    586         /* Read mb_qp_delta                                                   */
    587         /*--------------------------------------------------------------------*/
    588         if(ps_cur_mb_info->u1_cbp)
    589         {
    590             ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp);
    591             if(ret != OK)
    592                 return ret;
    593             COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
    594             if(i1_delta_qp != 0)
    595             {
    596                 ret = ih264d_update_qp(ps_dec, i1_delta_qp);
    597                 if(ret != OK)
    598                     return ret;
    599             }
    600         }
    601         else
    602             ps_dec->i1_prev_mb_qp_delta = 0;
    603         p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
    604     }
    605     else
    606     {
    607         u1_offset = 1;
    608         ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
    609         p_curr_ctxt->u1_mb_type = CAB_I16x16;
    610         ps_cur_mb_info->u1_tran_form8x8 = 0;
    611         p_curr_ctxt->u1_transform8x8_ctxt = 0;
    612         ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
    613         /*--------------------------------------------------------------------*/
    614         /* Read the IntraPrediction mode for CHROMA                           */
    615         /*--------------------------------------------------------------------*/
    616         u1_intra_chrom_pred_mode = ih264d_parse_chroma_pred_mode_cabac(ps_dec);
    617         if(u1_intra_chrom_pred_mode > 3)
    618             return ERROR_CHROMA_PRED_MODE;
    619 
    620         COPYTHECONTEXT("Chroma intra_chroma_pred_mode pred mode", u1_intra_chrom_pred_mode);
    621         p_curr_ctxt->u1_intra_chroma_pred_mode = ps_cur_mb_info->u1_chroma_pred_mode =
    622                         u1_intra_chrom_pred_mode;
    623 
    624         /*--------------------------------------------------------------------*/
    625         /* Read the Coded block pattern                                       */
    626         /*--------------------------------------------------------------------*/
    627         u1_cbp = gau1_ih264d_cbp_tab[(u1_mb_type - 1) >> 2];
    628         ps_cur_mb_info->u1_cbp = u1_cbp;
    629         p_curr_ctxt->u1_cbp = u1_cbp;
    630 
    631         /*--------------------------------------------------------------------*/
    632         /* Read mb_qp_delta                                                   */
    633         /*--------------------------------------------------------------------*/
    634         ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp);
    635         if(ret != OK)
    636             return ret;
    637         COPYTHECONTEXT("mb_qp_delta", i1_delta_qp);
    638         if(i1_delta_qp != 0)
    639         {
    640             ret = ih264d_update_qp(ps_dec, i1_delta_qp);
    641             if(ret != OK)
    642                 return ret;
    643         }
    644 
    645         {
    646             WORD16 i_scaleFactor;
    647             WORD16* pi2_scale_matrix_ptr;
    648             /*******************************************************************/
    649             /* for luma DC coefficients the scaling is done during the parsing */
    650             /* to preserve the precision                                       */
    651             /*******************************************************************/
    652             if(ps_dec->s_high_profile.u1_scaling_present)
    653             {
    654                 pi2_scale_matrix_ptr =
    655                                 ps_dec->s_high_profile.i2_scalinglist4x4[0];
    656 
    657             }
    658             else
    659             {
    660                 i_scaleFactor = 16;
    661                 pi2_scale_matrix_ptr = &i_scaleFactor;
    662             }
    663             {
    664                 ctxt_inc_mb_info_t *ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
    665                 UWORD8 uc_a, uc_b;
    666                 UWORD32 u4_ctx_inc;
    667 
    668                 INC_SYM_COUNT(&(ps_dec->s_cab_dec_env));
    669 
    670                 /* if MbAddrN not available then CondTermN = 1 */
    671                 uc_b = ((ps_top_ctxt->u1_yuv_dc_csbp) & 0x01);
    672 
    673                 /* if MbAddrN not available then CondTermN = 1 */
    674                 uc_a = ((ps_dec->pu1_left_yuv_dc_csbp[0]) & 0x01);
    675 
    676                 u4_ctx_inc = (uc_a + (uc_b << 1));
    677 
    678                 {
    679                     WORD16 pi2_dc_coef[16];
    680                     tu_sblk4x4_coeff_data_t *ps_tu_4x4 =
    681                                     (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
    682                     WORD16 *pi2_coeff_block =
    683                                     (WORD16 *)ps_dec->pv_parse_tu_coeff_data;
    684 
    685                     p_bin_ctxt = (ps_dec->p_cbf_t[LUMA_DC_CTXCAT]) + u4_ctx_inc;
    686 
    687                     u1_dc_block_flag =
    688                                     ih264d_read_coeff4x4_cabac(ps_bitstrm,
    689                                                     LUMA_DC_CTXCAT,
    690                                                     ps_dec->p_significant_coeff_flag_t[LUMA_DC_CTXCAT],
    691                                                     ps_dec, p_bin_ctxt);
    692 
    693                     /* Store coded_block_flag */
    694                     p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
    695                     p_curr_ctxt->u1_yuv_dc_csbp |= u1_dc_block_flag;
    696                     if(u1_dc_block_flag)
    697                     {
    698                         WORD32 pi4_tmp[16];
    699                         memset(pi2_dc_coef,0,sizeof(pi2_dc_coef));
    700                         ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4,
    701                                                          pi2_dc_coef,
    702                                                          ps_dec->pu1_inv_scan);
    703 
    704                         PROFILE_DISABLE_IQ_IT_RECON()
    705                         ps_dec->pf_ihadamard_scaling_4x4(pi2_dc_coef,
    706                                                          pi2_coeff_block,
    707                                                          ps_dec->pu2_quant_scale_y,
    708                                                          (UWORD16 *)pi2_scale_matrix_ptr,
    709                                                          ps_dec->u1_qp_y_div6,
    710                                                          pi4_tmp);
    711                         pi2_coeff_block += 16;
    712                         ps_dec->pv_parse_tu_coeff_data = (void *)pi2_coeff_block;
    713                         SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag,0);
    714                     }
    715 
    716                 }
    717 
    718             }
    719         }
    720     }
    721 
    722     ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
    723     ps_dec->pu1_left_yuv_dc_csbp[0] |= u1_dc_block_flag;
    724 
    725     ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, u1_offset);
    726     if(EXCEED_OFFSET(ps_bitstrm))
    727         return ERROR_EOB_TERMINATE_T;
    728     return OK;
    729 }
    730 
    731 /*****************************************************************************/
    732 /*                                                                           */
    733 /*  Function Name : ih264d_parse_islice_data_cavlc                                  */
    734 /*                                                                           */
    735 /*  Description   : This function parses cabac syntax of a inter slice on    */
    736 /*                  N MB basis.                                              */
    737 /*                                                                           */
    738 /*  Inputs        : ps_dec                                                   */
    739 /*                  sliceparams                                              */
    740 /*                  firstMbInSlice                                           */
    741 /*                                                                           */
    742 /*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
    743 /*                     decoded till the end of slice.                        */
    744 /*                                                                           */
    745 /*  Returns       : 0                                                        */
    746 /*                                                                           */
    747 /*  Issues        : <List any issues or problems with this function>         */
    748 /*                                                                           */
    749 /*  Revision History:                                                        */
    750 /*                                                                           */
    751 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    752 /*         24 06 2005   ARNY            Draft                                */
    753 /*                                                                           */
    754 /*****************************************************************************/
    755 WORD32 ih264d_parse_islice_data_cavlc(dec_struct_t * ps_dec,
    756                                       dec_slice_params_t * ps_slice,
    757                                       UWORD16 u2_first_mb_in_slice)
    758 {
    759     UWORD8 uc_more_data_flag;
    760     UWORD8 u1_num_mbs, u1_mb_idx;
    761     dec_mb_info_t *ps_cur_mb_info;
    762     deblk_mb_t *ps_cur_deblk_mb;
    763     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
    764     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
    765     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    766     UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
    767     WORD16 i2_cur_mb_addr;
    768     UWORD8 u1_mbaff;
    769     UWORD8 u1_num_mbs_next, u1_end_of_row, u1_tfr_n_mb;
    770     WORD32 ret = OK;
    771 
    772     ps_dec->u1_qp = ps_slice->u1_slice_qp;
    773     ih264d_update_qp(ps_dec, 0);
    774     u1_mbaff = ps_slice->u1_mbaff_frame_flag;
    775 
    776     /* initializations */
    777     u1_mb_idx = ps_dec->u1_mb_idx;
    778     u1_num_mbs = u1_mb_idx;
    779 
    780     uc_more_data_flag = 1;
    781     i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
    782 
    783     do
    784     {
    785         UWORD8 u1_mb_type;
    786 
    787         ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
    788 
    789         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
    790         {
    791             break;
    792         }
    793 
    794         ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
    795         ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
    796         ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
    797 
    798         ps_cur_mb_info->u1_end_of_slice = 0;
    799 
    800         /***************************************************************/
    801         /* Get the required information for decoding of MB             */
    802         /* mb_x, mb_y , neighbour availablity,                         */
    803         /***************************************************************/
    804         ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 0);
    805 
    806         /***************************************************************/
    807         /* Set the deblocking parameters for this MB                   */
    808         /***************************************************************/
    809         ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
    810 
    811         if(ps_dec->u4_app_disable_deblk_frm == 0)
    812             ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
    813                                              ps_dec->u1_mb_ngbr_availablity,
    814                                              ps_dec->u1_cur_mb_fld_dec_flag);
    815 
    816         ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB;
    817 
    818         /**************************************************************/
    819         /* Macroblock Layer Begins, Decode the u1_mb_type                */
    820         /**************************************************************/
    821 //Inlined ih264d_uev
    822         {
    823             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
    824             UWORD32 u4_word, u4_ldz, u4_temp;
    825 
    826             /***************************************************************/
    827             /* Find leading zeros in next 32 bits                          */
    828             /***************************************************************/
    829             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
    830             u4_ldz = CLZ(u4_word);
    831             /* Flush the ps_bitstrm */
    832             u4_bitstream_offset += (u4_ldz + 1);
    833             /* Read the suffix from the ps_bitstrm */
    834             u4_word = 0;
    835             if(u4_ldz)
    836                 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
    837                         u4_ldz);
    838             *pu4_bitstrm_ofst = u4_bitstream_offset;
    839             u4_temp = ((1 << u4_ldz) + u4_word - 1);
    840             if(u4_temp > 25)
    841                 return ERROR_MB_TYPE;
    842             u1_mb_type = u4_temp;
    843 
    844         }
    845 //Inlined ih264d_uev
    846         ps_cur_mb_info->u1_mb_type = u1_mb_type;
    847         COPYTHECONTEXT("u1_mb_type", u1_mb_type);
    848 
    849         /**************************************************************/
    850         /* Parse Macroblock data                                      */
    851         /**************************************************************/
    852         if(25 == u1_mb_type)
    853         {
    854             /* I_PCM_MB */
    855             ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
    856             ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
    857             if(ret != OK)
    858                 return ret;
    859             ps_cur_deblk_mb->u1_mb_qp = 0;
    860         }
    861         else
    862         {
    863             ret = ih264d_parse_imb_cavlc(ps_dec, ps_cur_mb_info, u1_num_mbs, u1_mb_type);
    864             if(ret != OK)
    865                 return ret;
    866             ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
    867         }
    868 
    869         if(u1_mbaff)
    870         {
    871             ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
    872         }
    873         /**************************************************************/
    874         /* Get next Macroblock address                                */
    875         /**************************************************************/
    876 
    877         i2_cur_mb_addr++;
    878         uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
    879 
    880         /* Store the colocated information */
    881         {
    882             mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_num_mbs << 4);
    883 
    884             mv_pred_t s_mvPred =
    885                 {
    886                     { 0, 0, 0, 0 },
    887                       { -1, -1 }, 0, 0};
    888             ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
    889                                (UWORD8)(ps_dec->u1_cur_mb_fld_dec_flag << 1), 4,
    890                                4);
    891         }
    892 
    893         /*if num _cores is set to 3,compute bs will be done in another thread*/
    894         if(ps_dec->u4_num_cores < 3)
    895         {
    896             if(ps_dec->u4_app_disable_deblk_frm == 0)
    897                 ps_dec->pf_compute_bs(ps_dec, ps_cur_mb_info,
    898                                      (UWORD16)(u1_num_mbs >> u1_mbaff));
    899         }
    900         u1_num_mbs++;
    901 
    902         /****************************************************************/
    903         /* Check for End Of Row                                         */
    904         /****************************************************************/
    905         u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
    906         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
    907         u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row
    908                         || (!uc_more_data_flag);
    909         ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
    910 
    911         /*H264_DEC_DEBUG_PRINT("Pic: %d Mb_X=%d Mb_Y=%d",
    912          ps_slice->i4_poc >> ps_slice->u1_field_pic_flag,
    913          ps_dec->u2_mbx,ps_dec->u2_mby + (1 - ps_cur_mb_info->u1_topmb));
    914          H264_DEC_DEBUG_PRINT("u1_tfr_n_mb || (!uc_more_data_flag): %d", u1_tfr_n_mb || (!uc_more_data_flag));*/
    915         if(u1_tfr_n_mb || (!uc_more_data_flag))
    916         {
    917 
    918             if(ps_dec->u1_separate_parse)
    919             {
    920                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
    921                                      u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
    922                 ps_dec->ps_nmb_info +=  u1_num_mbs;
    923             }
    924             else
    925             {
    926                 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
    927                                             u1_num_mbs_next, u1_tfr_n_mb,
    928                                             u1_end_of_row);
    929             }
    930             ps_dec->u2_total_mbs_coded += u1_num_mbs;
    931             if(u1_tfr_n_mb)
    932                 u1_num_mbs = 0;
    933             u1_mb_idx = u1_num_mbs;
    934             ps_dec->u1_mb_idx = u1_num_mbs;
    935 
    936         }
    937     }
    938     while(uc_more_data_flag);
    939 
    940     ps_dec->u4_num_mbs_cur_nmb = 0;
    941     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
    942 
    943                         - (u2_first_mb_in_slice << u1_mbaff);
    944 
    945     return ret;
    946 }
    947 
    948 /*****************************************************************************/
    949 /*                                                                           */
    950 /*  Function Name : ih264d_parse_islice_data_cabac                                  */
    951 /*                                                                           */
    952 /*  Description   : This function parses cabac syntax of a inter slice on    */
    953 /*                  N MB basis.                                              */
    954 /*                                                                           */
    955 /*  Inputs        : ps_dec                                                   */
    956 /*                  sliceparams                                              */
    957 /*                  firstMbInSlice                                           */
    958 /*                                                                           */
    959 /*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
    960 /*                     decoded till the end of slice.                        */
    961 /*                                                                           */
    962 /*  Returns       : 0                                                        */
    963 /*                                                                           */
    964 /*  Issues        : <List any issues or problems with this function>         */
    965 /*                                                                           */
    966 /*  Revision History:                                                        */
    967 /*                                                                           */
    968 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    969 /*         24 06 2005   ARNY            Draft                                */
    970 /*                                                                           */
    971 /*****************************************************************************/
    972 WORD32 ih264d_parse_islice_data_cabac(dec_struct_t * ps_dec,
    973                                       dec_slice_params_t * ps_slice,
    974                                       UWORD16 u2_first_mb_in_slice)
    975 {
    976     UWORD8 uc_more_data_flag;
    977     UWORD8 u1_num_mbs, u1_mb_idx;
    978     dec_mb_info_t *ps_cur_mb_info;
    979     deblk_mb_t *ps_cur_deblk_mb;
    980 
    981     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
    982     UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
    983     WORD16 i2_cur_mb_addr;
    984     UWORD8 u1_mbaff;
    985     UWORD8 u1_num_mbs_next, u1_end_of_row, u1_tfr_n_mb;
    986     WORD32 ret = OK;
    987 
    988     ps_dec->u1_qp = ps_slice->u1_slice_qp;
    989     ih264d_update_qp(ps_dec, 0);
    990     u1_mbaff = ps_slice->u1_mbaff_frame_flag;
    991 
    992     if(ps_bitstrm->u4_ofst & 0x07)
    993     {
    994         ps_bitstrm->u4_ofst += 8;
    995         ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
    996     }
    997     ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
    998     if(ret != OK)
    999         return ret;
   1000     ih264d_init_cabac_contexts(I_SLICE, ps_dec);
   1001 
   1002     ps_dec->i1_prev_mb_qp_delta = 0;
   1003 
   1004     /* initializations */
   1005     u1_mb_idx = ps_dec->u1_mb_idx;
   1006     u1_num_mbs = u1_mb_idx;
   1007 
   1008     uc_more_data_flag = 1;
   1009     i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
   1010     do
   1011     {
   1012         UWORD16 u2_mbx;
   1013 
   1014         ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
   1015 
   1016         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
   1017         {
   1018             break;
   1019         }
   1020 
   1021         {
   1022             UWORD8 u1_mb_type;
   1023 
   1024             ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
   1025             ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
   1026             ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
   1027 
   1028             ps_cur_mb_info->u1_end_of_slice = 0;
   1029 
   1030             /***************************************************************/
   1031             /* Get the required information for decoding of MB                  */
   1032             /* mb_x, mb_y , neighbour availablity,                              */
   1033             /***************************************************************/
   1034             ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 0);
   1035             u2_mbx = ps_dec->u2_mbx;
   1036 
   1037             /*********************************************************************/
   1038             /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */
   1039             /*********************************************************************/
   1040             ps_cur_mb_info->u1_tran_form8x8 = 0;
   1041             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
   1042 
   1043             /***************************************************************/
   1044             /* Set the deblocking parameters for this MB                   */
   1045             /***************************************************************/
   1046             ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
   1047             if(ps_dec->u4_app_disable_deblk_frm == 0)
   1048                 ih264d_set_deblocking_parameters(
   1049                                 ps_cur_deblk_mb, ps_slice,
   1050                                 ps_dec->u1_mb_ngbr_availablity,
   1051                                 ps_dec->u1_cur_mb_fld_dec_flag);
   1052 
   1053             ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type
   1054                             | D_INTRA_MB;
   1055 
   1056             /* Macroblock Layer Begins */
   1057             /* Decode the u1_mb_type */
   1058             u1_mb_type = ih264d_parse_mb_type_intra_cabac(0, ps_dec);
   1059             if(u1_mb_type > 25)
   1060                 return ERROR_MB_TYPE;
   1061             ps_cur_mb_info->u1_mb_type = u1_mb_type;
   1062             COPYTHECONTEXT("u1_mb_type", u1_mb_type);
   1063 
   1064             /* Parse Macroblock Data */
   1065             if(25 == u1_mb_type)
   1066             {
   1067                 /* I_PCM_MB */
   1068                 ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
   1069                 ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
   1070                 if(ret != OK)
   1071                     return ret;
   1072                 ps_cur_deblk_mb->u1_mb_qp = 0;
   1073             }
   1074             else
   1075             {
   1076                 ret = ih264d_parse_imb_cabac(ps_dec, ps_cur_mb_info, u1_mb_type);
   1077                 if(ret != OK)
   1078                     return ret;
   1079                 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
   1080             }
   1081 
   1082             if(u1_mbaff)
   1083             {
   1084                 ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
   1085             }
   1086             /* Next macroblock information */
   1087             i2_cur_mb_addr++;
   1088 
   1089             if(ps_cur_mb_info->u1_topmb && u1_mbaff)
   1090                 uc_more_data_flag = 1;
   1091             else
   1092             {
   1093                 uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env,
   1094                                                           ps_bitstrm);
   1095                 uc_more_data_flag = !uc_more_data_flag;
   1096                 COPYTHECONTEXT("Decode Sliceterm",!uc_more_data_flag);
   1097             }
   1098             /* Store the colocated information */
   1099             {
   1100 
   1101                 mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_num_mbs << 4);
   1102                 mv_pred_t s_mvPred =
   1103                     {
   1104                         { 0, 0, 0, 0 },
   1105                           { -1, -1 }, 0, 0};
   1106                 ih264d_rep_mv_colz(
   1107                                 ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
   1108                                 (UWORD8)(ps_dec->u1_cur_mb_fld_dec_flag << 1),
   1109                                 4, 4);
   1110             }
   1111             /*if num _cores is set to 3,compute bs will be done in another thread*/
   1112             if(ps_dec->u4_num_cores < 3)
   1113             {
   1114                 if(ps_dec->u4_app_disable_deblk_frm == 0)
   1115                     ps_dec->pf_compute_bs(ps_dec, ps_cur_mb_info,
   1116                                          (UWORD16)(u1_num_mbs >> u1_mbaff));
   1117             }
   1118             u1_num_mbs++;
   1119 
   1120         }
   1121 
   1122         /****************************************************************/
   1123         /* Check for End Of Row                                         */
   1124         /****************************************************************/
   1125         u1_num_mbs_next = i2_pic_wdin_mbs - u2_mbx - 1;
   1126         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
   1127         u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row
   1128                         || (!uc_more_data_flag);
   1129         ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag);
   1130 
   1131         if(u1_tfr_n_mb || (!uc_more_data_flag))
   1132         {
   1133 
   1134 
   1135             if(ps_dec->u1_separate_parse)
   1136             {
   1137                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1138                                      u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
   1139                 ps_dec->ps_nmb_info +=  u1_num_mbs;
   1140             }
   1141             else
   1142             {
   1143                 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1144                                             u1_num_mbs_next, u1_tfr_n_mb,
   1145                                             u1_end_of_row);
   1146             }
   1147             ps_dec->u2_total_mbs_coded += u1_num_mbs;
   1148             if(u1_tfr_n_mb)
   1149                 u1_num_mbs = 0;
   1150             u1_mb_idx = u1_num_mbs;
   1151             ps_dec->u1_mb_idx = u1_num_mbs;
   1152 
   1153         }
   1154     }
   1155     while(uc_more_data_flag);
   1156 
   1157     ps_dec->u4_num_mbs_cur_nmb = 0;
   1158     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
   1159 
   1160                         - (u2_first_mb_in_slice << u1_mbaff);
   1161 
   1162     return ret;
   1163 }
   1164 
   1165 /*****************************************************************************/
   1166 /*                                                                           */
   1167 /*  Function Name : ih264d_parse_ipcm_mb                                       */
   1168 /*                                                                           */
   1169 /*  Description   : This function decodes the pixel values of I_PCM Mb.      */
   1170 /*                                                                           */
   1171 /*  Inputs        : ps_dec,  ps_cur_mb_info and mb number                          */
   1172 /*                                                                           */
   1173 /*  Description   : This function reads the luma and chroma pixels directly  */
   1174 /*                  from the bitstream when the mbtype is I_PCM and stores   */
   1175 /*                  them in recon buffer. If the entropy coding mode is      */
   1176 /*                  cabac, decoding engine is re-initialized. The nnzs and   */
   1177 /*                  cabac contexts are appropriately modified.               */
   1178 /*  Returns       : void                                                     */
   1179 /*                                                                           */
   1180 /*  Revision History:                                                        */
   1181 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   1182 /*         13 07 2002   Jay                                                  */
   1183 /*                                                                           */
   1184 /*****************************************************************************/
   1185 
   1186 WORD32 ih264d_parse_ipcm_mb(dec_struct_t * ps_dec,
   1187                           dec_mb_info_t *ps_cur_mb_info,
   1188                           UWORD8 u1_mbNum)
   1189 {
   1190     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
   1191     UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
   1192     UWORD8 *pu1_y, *pu1_u, *pu1_v;
   1193     WORD32 ret;
   1194 
   1195     UWORD32 u4_rec_width_y, u4_rec_width_uv;
   1196     UWORD32 u1_num_mb_pair;
   1197     UWORD8 u1_x, u1_y;
   1198     /* CHANGED CODE */
   1199     tfr_ctxt_t *ps_frame_buf;
   1200     UWORD8 u1_mb_field_decoding_flag;
   1201     UWORD32 *pu4_buf;
   1202     UWORD8 *pu1_buf;
   1203     /* CHANGED CODE */
   1204 
   1205     if(ps_dec->u1_separate_parse)
   1206     {
   1207         ps_frame_buf = &ps_dec->s_tran_addrecon_parse;
   1208     }
   1209     else
   1210     {
   1211         ps_frame_buf = &ps_dec->s_tran_addrecon;
   1212     }
   1213     /* align bistream to byte boundary. */
   1214     /* pcm_alignment_zero_bit discarded */
   1215     /* For XX GotoByteBoundary */
   1216     if(ps_bitstrm->u4_ofst & 0x07)
   1217     {
   1218         ps_bitstrm->u4_ofst += 8;
   1219         ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
   1220     }
   1221 
   1222     /*  Store left Nnz as 16 for each 4x4 blk */
   1223 
   1224     pu1_buf = ps_dec->pu1_left_nnz_y;
   1225     pu4_buf = (UWORD32 *)pu1_buf;
   1226     *pu4_buf = 0x10101010;
   1227     pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_y;
   1228     pu4_buf = (UWORD32 *)pu1_buf;
   1229     *pu4_buf = 0x10101010;
   1230     pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_uv;
   1231     pu4_buf = (UWORD32 *)pu1_buf;
   1232     *pu4_buf = 0x10101010;
   1233     pu1_buf = ps_dec->pu1_left_nnz_uv;
   1234     pu4_buf = (UWORD32 *)pu1_buf;
   1235     *pu4_buf = 0x10101010;
   1236     ps_cur_mb_info->u1_cbp = 0xff;
   1237 
   1238     ps_dec->i1_prev_mb_qp_delta = 0;
   1239     /* Get neighbour MB's */
   1240     u1_num_mb_pair = (u1_mbNum >> u1_mbaff);
   1241 
   1242     /*****************************************************************************/
   1243     /* calculate the RECON buffer YUV pointers for the PCM data                  */
   1244     /*****************************************************************************/
   1245     /* CHANGED CODE  */
   1246     u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
   1247     pu1_y = ps_frame_buf->pu1_dest_y + (u1_num_mb_pair << 4);
   1248     pu1_u = ps_frame_buf->pu1_dest_u + (u1_num_mb_pair << 4);
   1249     pu1_v = pu1_u + 1;
   1250 
   1251     u4_rec_width_y = ps_dec->u2_frm_wd_y << u1_mb_field_decoding_flag;
   1252     u4_rec_width_uv = ps_dec->u2_frm_wd_uv << u1_mb_field_decoding_flag;
   1253     /* CHANGED CODE  */
   1254 
   1255     if(u1_mbaff)
   1256     {
   1257         UWORD8 u1_top_mb;
   1258 
   1259         u1_top_mb = ps_cur_mb_info->u1_topmb;
   1260 
   1261         if(u1_top_mb == 0)
   1262         {
   1263             pu1_y += (u1_mb_field_decoding_flag ?
   1264                             (u4_rec_width_y >> 1) : (u4_rec_width_y << 4));
   1265             pu1_u += (u1_mb_field_decoding_flag ?
   1266                             (u4_rec_width_uv) : (u4_rec_width_uv << 4));
   1267             pu1_v = pu1_u + 1;
   1268         }
   1269     }
   1270 
   1271     /* Read Luma samples */
   1272     for(u1_y = 0; u1_y < 16; u1_y++)
   1273     {
   1274         for(u1_x = 0; u1_x < 16; u1_x++)
   1275             pu1_y[u1_x] = ih264d_get_bits_h264(ps_bitstrm, 8);
   1276 
   1277         pu1_y += u4_rec_width_y;
   1278     }
   1279 
   1280     /* Read Chroma samples */
   1281     for(u1_y = 0; u1_y < 8; u1_y++)
   1282     {
   1283         for(u1_x = 0; u1_x < 8; u1_x++)
   1284             pu1_u[u1_x * YUV420SP_FACTOR] = ih264d_get_bits_h264(ps_bitstrm, 8);
   1285 
   1286         pu1_u += u4_rec_width_uv;
   1287     }
   1288 
   1289     for(u1_y = 0; u1_y < 8; u1_y++)
   1290     {
   1291         for(u1_x = 0; u1_x < 8; u1_x++)
   1292             pu1_v[u1_x * YUV420SP_FACTOR] = ih264d_get_bits_h264(ps_bitstrm, 8);
   1293 
   1294         pu1_v += u4_rec_width_uv;
   1295     }
   1296 
   1297     if(CABAC == ps_dec->ps_cur_pps->u1_entropy_coding_mode)
   1298     {
   1299         UWORD32 *pu4_buf;
   1300         UWORD8 *pu1_buf;
   1301         ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
   1302         /* Re-initialize the cabac decoding engine. */
   1303         ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
   1304         if(ret != OK)
   1305             return ret;
   1306         /* update the cabac contetxs */
   1307         p_curr_ctxt->u1_mb_type = CAB_I_PCM;
   1308         p_curr_ctxt->u1_cbp = 47;
   1309         p_curr_ctxt->u1_intra_chroma_pred_mode = 0;
   1310         p_curr_ctxt->u1_transform8x8_ctxt = 0;
   1311         ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
   1312 
   1313         pu1_buf = ps_dec->pu1_left_nnz_y;
   1314         pu4_buf = (UWORD32 *)pu1_buf;
   1315         *pu4_buf = 0x01010101;
   1316 
   1317         pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_y;
   1318         pu4_buf = (UWORD32 *)pu1_buf;
   1319         *pu4_buf = 0x01010101;
   1320 
   1321         pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_uv;
   1322         pu4_buf = (UWORD32 *)pu1_buf;
   1323         *pu4_buf = 0x01010101;
   1324 
   1325         pu1_buf = ps_dec->pu1_left_nnz_uv;
   1326         pu4_buf = (UWORD32 *)pu1_buf;
   1327         *pu4_buf = 0x01010101;
   1328 
   1329         p_curr_ctxt->u1_yuv_dc_csbp = 0x7;
   1330         ps_dec->pu1_left_yuv_dc_csbp[0] = 0x7;
   1331         if(ps_dec->ps_cur_slice->u1_slice_type != I_SLICE)
   1332         {
   1333 
   1334             MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
   1335             memset(ps_dec->pi1_left_ref_idx_ctxt_inc, 0, 4);
   1336             MEMSET_16BYTES(p_curr_ctxt->u1_mv, 0);
   1337             memset(p_curr_ctxt->i1_ref_idx, 0, 4);
   1338 
   1339         }
   1340     }
   1341     return OK;
   1342 }
   1343 
   1344 /*!
   1345  **************************************************************************
   1346  * \if Function name : ih264d_decode_islice \endif
   1347  *
   1348  * \brief
   1349  *    Decodes an I Slice
   1350  *
   1351  *
   1352  * \return
   1353  *    0 on Success and Error code otherwise
   1354  **************************************************************************
   1355  */
   1356 WORD32 ih264d_parse_islice(dec_struct_t *ps_dec,
   1357                             UWORD16 u2_first_mb_in_slice)
   1358 {
   1359     dec_pic_params_t * ps_pps = ps_dec->ps_cur_pps;
   1360     dec_slice_params_t * ps_slice = ps_dec->ps_cur_slice;
   1361     UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer;
   1362     UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst;
   1363     UWORD32 u4_temp;
   1364     WORD32 i_temp;
   1365     WORD32 ret;
   1366 
   1367     /*--------------------------------------------------------------------*/
   1368     /* Read remaining contents of the slice header                        */
   1369     /*--------------------------------------------------------------------*/
   1370     /* dec_ref_pic_marking function */
   1371     /* G050 */
   1372     if(ps_slice->u1_nal_ref_idc != 0)
   1373     {
   1374         if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
   1375         {
   1376             i_temp = ih264d_read_mmco_commands(ps_dec);
   1377             if (i_temp < 0)
   1378             {
   1379                 return ERROR_DBP_MANAGER_T;
   1380             }
   1381             ps_dec->u4_bitoffset = i_temp;
   1382         }
   1383         else
   1384             ps_dec->ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
   1385     }
   1386     /* G050 */
   1387 
   1388     /* Read slice_qp_delta */
   1389     i_temp = ps_pps->u1_pic_init_qp
   1390                     + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
   1391     if((i_temp < 0) || (i_temp > 51))
   1392         return ERROR_INV_RANGE_QP_T;
   1393     ps_slice->u1_slice_qp = i_temp;
   1394     COPYTHECONTEXT("SH: slice_qp_delta",
   1395                     ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp);
   1396 
   1397     if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
   1398     {
   1399         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
   1400         COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
   1401 
   1402         if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
   1403         {
   1404             return ERROR_INV_SLICE_HDR_T;
   1405         }
   1406         ps_slice->u1_disable_dblk_filter_idc = u4_temp;
   1407         if(u4_temp != 1)
   1408         {
   1409             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
   1410                             << 1;
   1411             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
   1412             {
   1413                 return ERROR_INV_SLICE_HDR_T;
   1414             }
   1415             ps_slice->i1_slice_alpha_c0_offset = i_temp;
   1416             COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
   1417                             ps_slice->i1_slice_alpha_c0_offset >> 1);
   1418 
   1419             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
   1420                             << 1;
   1421             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
   1422             {
   1423                 return ERROR_INV_SLICE_HDR_T;
   1424             }
   1425             ps_slice->i1_slice_beta_offset = i_temp;
   1426             COPYTHECONTEXT("SH: slice_beta_offset_div2",
   1427                             ps_slice->i1_slice_beta_offset >> 1);
   1428 
   1429         }
   1430         else
   1431         {
   1432             ps_slice->i1_slice_alpha_c0_offset = 0;
   1433             ps_slice->i1_slice_beta_offset = 0;
   1434         }
   1435     }
   1436     else
   1437     {
   1438         ps_slice->u1_disable_dblk_filter_idc = 0;
   1439         ps_slice->i1_slice_alpha_c0_offset = 0;
   1440         ps_slice->i1_slice_beta_offset = 0;
   1441     }
   1442 
   1443     /* Initialization to check if number of motion vector per 2 Mbs */
   1444     /* are exceeding the range or not */
   1445     ps_dec->u2_mv_2mb[0] = 0;
   1446     ps_dec->u2_mv_2mb[1] = 0;
   1447 
   1448 
   1449     /*set slice header cone to 2 ,to indicate  correct header*/
   1450     ps_dec->u1_slice_header_done = 2;
   1451 
   1452     if(ps_pps->u1_entropy_coding_mode)
   1453     {
   1454         SWITCHOFFTRACE; SWITCHONTRACECABAC;
   1455         if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
   1456         {
   1457             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
   1458         }
   1459         else
   1460             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff;
   1461 
   1462         ret = ih264d_parse_islice_data_cabac(ps_dec, ps_slice,
   1463                                              u2_first_mb_in_slice);
   1464         if(ret != OK)
   1465             return ret;
   1466         SWITCHONTRACE; SWITCHOFFTRACECABAC;
   1467     }
   1468     else
   1469     {
   1470         if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
   1471         {
   1472             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
   1473         }
   1474         else
   1475             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff;
   1476         ret = ih264d_parse_islice_data_cavlc(ps_dec, ps_slice,
   1477                                        u2_first_mb_in_slice);
   1478         if(ret != OK)
   1479             return ret;
   1480     }
   1481 
   1482     return OK;
   1483 }
   1484