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_process_pslice.c
     23  *
     24  * \brief
     25  *    Contains routines that decode a I slice type
     26  *
     27  * Detailed_description
     28  *
     29  * \date
     30  *    21/12/2002
     31  *
     32  * \author  NS
     33  **************************************************************************
     34  */
     35 #include "ih264_typedefs.h"
     36 #include "ih264_macros.h"
     37 #include "ih264_platform_macros.h"
     38 
     39 #include <string.h>
     40 #include "ih264d_bitstrm.h"
     41 #include "ih264d_defs.h"
     42 #include "ih264d_debug.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_dpb_manager.h"
     49 #include "ih264d_mvpred.h"
     50 #include "ih264d_inter_pred.h"
     51 #include "ih264d_process_pslice.h"
     52 #include "ih264d_error_handler.h"
     53 #include "ih264d_cabac.h"
     54 #include "ih264d_debug.h"
     55 #include "ih264d_tables.h"
     56 #include "ih264d_parse_slice.h"
     57 #include "ih264d_utils.h"
     58 #include "ih264d_parse_islice.h"
     59 #include "ih264d_process_bslice.h"
     60 #include "ih264d_process_intra_mb.h"
     61 
     62 void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec);
     63 
     64 void ih264d_insert_pic_in_ref_pic_listx(struct pic_buffer_t *ps_ref_pic_buf_lx,
     65                                         struct pic_buffer_t *ps_pic)
     66 {
     67     *ps_ref_pic_buf_lx = *ps_pic;
     68 }
     69 
     70 WORD32 ih264d_mv_pred_ref_tfr_nby2_pmb(dec_struct_t * ps_dec,
     71                                      UWORD8 u1_mb_idx,
     72                                      UWORD8 u1_num_mbs)
     73 {
     74     parse_pmbarams_t * ps_mb_part_info;
     75     parse_part_params_t * ps_part;
     76     mv_pred_t *ps_mv_nmb, *ps_mv_nmb_start, *ps_mv_ntop, *ps_mv_ntop_start;
     77     UWORD32 i, j;
     78     const UWORD32 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
     79     dec_mb_info_t * ps_cur_mb_info;
     80     WORD32 i2_mv_x, i2_mv_y;
     81     WORD32 ret;
     82 
     83     ps_dec->i4_submb_ofst -= (u1_num_mbs - u1_mb_idx) << 4;
     84     ps_mb_part_info = ps_dec->ps_parse_mb_data; // + u1_mb_idx;
     85     ps_part = ps_dec->ps_parse_part_params; // + u1_mb_idx;
     86 
     87     /* N/2 Mb MvPred and Transfer Setup Loop */
     88     for(i = u1_mb_idx; i < u1_num_mbs; i++, ps_mb_part_info++)
     89     {
     90         UWORD32 u1_colz;
     91         UWORD32 u1_field;
     92         mv_pred_t s_mvPred;
     93         mv_pred_t *ps_mv_pred = &s_mvPred;
     94 
     95 
     96 
     97         *ps_mv_pred = ps_dec->s_default_mv_pred;
     98 
     99         ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
    100         ps_dec->u2_wait_id = i;
    101 
    102         /* Restore the slice scratch MbX and MbY context */
    103         ps_cur_mb_info = ps_dec->ps_nmb_info + i;
    104         u1_field = ps_cur_mb_info->u1_mb_field_decodingflag;
    105 
    106 
    107 
    108         ps_mv_nmb_start = ps_dec->ps_mv_cur + (i << 4);
    109         ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx;
    110         ps_dec->u2_mby = ps_cur_mb_info->u2_mby;
    111         ps_dec->u2_mv_2mb[i & 0x1] = 0;
    112 
    113         /* Look for MV Prediction and Reference Transfer in Non-I Mbs */
    114         if(!ps_mb_part_info->u1_isI_mb)
    115         {
    116             UWORD32 u1_blk_no;
    117             WORD32 i1_ref_idx, i1_ref_idx1;
    118             UWORD32 u1_sub_mb_x, u1_sub_mb_y, u1_sub_mb_num;
    119             UWORD32 u1_num_part, u1_num_ref, u1_wd, u1_ht;
    120             UWORD32 *pu4_wt_offst, **ppu4_wt_ofst;
    121             UWORD32 u1_scale_ref, u4_bot_mb;
    122             WORD8 *pi1_ref_idx = ps_mb_part_info->i1_ref_idx[0];
    123             pic_buffer_t *ps_ref_frame, **pps_ref_frame;
    124             deblk_mb_t * ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + i;
    125 
    126             /* MB Level initialisations */
    127             ps_dec->u4_num_pmbair = i >> u1_mbaff;
    128             ps_dec->u1_mb_idx_mv = i;
    129             ppu4_wt_ofst = ps_mb_part_info->pu4_wt_offst;
    130             pps_ref_frame = ps_dec->ps_ref_pic_buf_lx[0];
    131             /* CHANGED CODE */
    132             ps_mv_ntop_start = ps_mv_nmb_start
    133                             - (ps_dec->u2_frm_wd_in_mbs << (4 + u1_mbaff)) + 12;
    134 
    135             u1_num_part = ps_mb_part_info->u1_num_part;
    136             ps_cur_deblk_mb->u1_mb_type |= (u1_num_part > 1) << 1;
    137             ps_cur_mb_info->u4_pred_info_pkd_idx = ps_dec->u4_pred_info_pkd_idx;
    138             ps_cur_mb_info->u1_num_pred_parts = 0;
    139 
    140 
    141             /****************************************************/
    142             /* weighted u4_ofst pointer calculations, this loop  */
    143             /* runs maximum 4 times, even in direct cases       */
    144             /****************************************************/
    145             u1_scale_ref = u1_mbaff & u1_field;
    146 
    147             u4_bot_mb = 1 - ps_cur_mb_info->u1_topmb;
    148             if(ps_dec->ps_cur_pps->u1_wted_pred_flag)
    149             {
    150                 u1_num_ref = MIN(u1_num_part, 4);
    151                 for(u1_blk_no = 0; u1_blk_no < u1_num_ref; u1_blk_no++)
    152                 {
    153                     i1_ref_idx = pi1_ref_idx[u1_blk_no];
    154                     if(u1_scale_ref)
    155                         i1_ref_idx >>= 1;
    156                     pu4_wt_offst = (UWORD32*)&ps_dec->pu4_wt_ofsts[2
    157                                     * X3(i1_ref_idx)];
    158                     ppu4_wt_ofst[u1_blk_no] = pu4_wt_offst;
    159                 }
    160             }
    161             else
    162             {
    163                 ppu4_wt_ofst[0] = NULL;
    164                 ppu4_wt_ofst[1] = NULL;
    165                 ppu4_wt_ofst[2] = NULL;
    166                 ppu4_wt_ofst[3] = NULL;
    167             }
    168 
    169             /**************************************************/
    170             /* Loop on Partitions                             */
    171             /**************************************************/
    172             for(j = 0; j < u1_num_part; j++, ps_part++)
    173             {
    174 
    175                 u1_sub_mb_num = ps_part->u1_sub_mb_num;
    176                 ps_dec->u1_sub_mb_num = u1_sub_mb_num;
    177 
    178                 if(PART_NOT_DIRECT != ps_part->u1_is_direct)
    179                 {
    180                     /* Mb Skip Mode */
    181                     /* Setting the default and other members of MvPred Structure */
    182                     s_mvPred.i2_mv[2] = -1;
    183                     s_mvPred.i2_mv[3] = -1;
    184                     s_mvPred.i1_ref_frame[0] = 0;
    185                     i1_ref_idx = (u1_scale_ref && u4_bot_mb) ? MAX_REF_BUFS : 0;
    186                     ps_ref_frame = pps_ref_frame[i1_ref_idx];
    187                     s_mvPred.u1_col_ref_pic_idx = ps_ref_frame->u1_mv_buf_id;
    188                     s_mvPred.u1_pic_type = ps_ref_frame->u1_pic_type;
    189                     pu4_wt_offst = (UWORD32*)&ps_dec->pu4_wt_ofsts[0];
    190 
    191                     ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, ps_mv_nmb_start,
    192                                       ps_mv_ntop_start, &s_mvPred, 0, 4, 0, 1,
    193                                       MB_SKIP);
    194 
    195 
    196 
    197 
    198 
    199 
    200                     {
    201                         pred_info_pkd_t *ps_pred_pkd;
    202                         ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
    203                     ih264d_fill_pred_info (s_mvPred.i2_mv,4,4,0,PRED_L0,ps_pred_pkd,ps_ref_frame->u1_pic_buf_id,
    204                                            (i1_ref_idx >> u1_scale_ref),pu4_wt_offst,
    205                                            ps_ref_frame->u1_pic_type);
    206 
    207 
    208                     ps_dec->u4_pred_info_pkd_idx++;
    209                     ps_cur_mb_info->u1_num_pred_parts++;
    210                     }
    211 
    212 
    213 
    214                     /* Storing colocated zero information */
    215                     u1_colz = ((ABS(s_mvPred.i2_mv[0]) <= 1)
    216                                     && (ABS(s_mvPred.i2_mv[1]) <= 1))
    217                                     + (u1_field << 1);
    218 
    219                     ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
    220                                        u1_colz, 4, 4);
    221                 }
    222                 else
    223                 {
    224                     u1_sub_mb_x = u1_sub_mb_num & 0x03;
    225                     u1_sub_mb_y = u1_sub_mb_num >> 2;
    226                     u1_blk_no =
    227                                     (u1_num_part < 4) ?
    228                                                     j :
    229                                                     (((u1_sub_mb_y >> 1) << 1)
    230                                                                     + (u1_sub_mb_x
    231                                                                                     >> 1));
    232 
    233                     ps_mv_ntop = ps_mv_ntop_start + u1_sub_mb_x;
    234                     ps_mv_nmb = ps_mv_nmb_start + u1_sub_mb_num;
    235 
    236                     u1_wd = ps_part->u1_partwidth;
    237                     u1_ht = ps_part->u1_partheight;
    238 
    239                     /* Populate the colpic info and reference frames */
    240                     i1_ref_idx = pi1_ref_idx[u1_blk_no];
    241                     s_mvPred.i1_ref_frame[0] = i1_ref_idx;
    242 
    243                     /********************************************************/
    244                     /* Predict Mv                                           */
    245                     /* Add Mv Residuals and store back                      */
    246                     /********************************************************/
    247                     ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, ps_mv_nmb, ps_mv_ntop,
    248                                       &s_mvPred, u1_sub_mb_num, u1_wd, 0, 1,
    249                                       ps_cur_mb_info->u1_mb_mc_mode);
    250                     i2_mv_x = ps_mv_nmb->i2_mv[0];
    251                     i2_mv_y = ps_mv_nmb->i2_mv[1];
    252                     i2_mv_x += s_mvPred.i2_mv[0];
    253                     i2_mv_y += s_mvPred.i2_mv[1];
    254                     s_mvPred.i2_mv[0] = i2_mv_x;
    255                     s_mvPred.i2_mv[1] = i2_mv_y;
    256 
    257                     /********************************************************/
    258                     /* Transfer setup call                                  */
    259                     /* convert RefIdx if it is MbAff                        */
    260                     /* Pass Weight Offset and refFrame                      */
    261                     /********************************************************/
    262                     i1_ref_idx1 = i1_ref_idx >> u1_scale_ref;
    263                     if(u1_scale_ref && ((i1_ref_idx & 0x01) != u4_bot_mb))
    264                         i1_ref_idx1 += MAX_REF_BUFS;
    265                     ps_ref_frame = pps_ref_frame[i1_ref_idx1];
    266                     pu4_wt_offst = ppu4_wt_ofst[u1_blk_no];
    267 
    268 
    269 
    270 
    271 
    272 
    273                     {
    274                     pred_info_pkd_t *ps_pred_pkd;
    275                     ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
    276                     ih264d_fill_pred_info (s_mvPred.i2_mv,u1_wd,u1_ht,u1_sub_mb_num,PRED_L0,ps_pred_pkd,
    277                                            ps_ref_frame->u1_pic_buf_id,(i1_ref_idx >> u1_scale_ref),pu4_wt_offst,
    278                                            ps_ref_frame->u1_pic_type);
    279 
    280                     ps_dec->u4_pred_info_pkd_idx++;
    281                     ps_cur_mb_info->u1_num_pred_parts++;
    282                     }
    283 
    284 
    285 
    286                     /* Fill colocated info in MvPred structure */
    287                     s_mvPred.u1_col_ref_pic_idx = ps_ref_frame->u1_mv_buf_id;
    288                     s_mvPred.u1_pic_type = ps_ref_frame->u1_pic_type;
    289 
    290                     /* Calculating colocated zero information */
    291                     u1_colz =
    292                                     (u1_field << 1)
    293                                                     | ((i1_ref_idx == 0)
    294                                                                     && (ABS(i2_mv_x)
    295                                                                                     <= 1)
    296                                                                     && (ABS(i2_mv_y)
    297                                                                                     <= 1));
    298                     u1_colz |= ps_mb_part_info->u1_col_info[u1_blk_no];
    299 
    300                     /* Replicate the motion vectors and colzero u4_flag  */
    301                     /* for all sub-partitions                         */
    302 
    303                     ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb,
    304                                        u1_sub_mb_num, u1_colz, u1_ht,
    305                                        u1_wd);
    306                 }
    307             }
    308 
    309         }
    310         else
    311         {
    312             /* Storing colocated zero information */
    313             ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
    314                                (UWORD8)(u1_field << 1), 4, 4);
    315 
    316         }
    317         /*if num _cores is set to 3,compute bs will be done in another thread*/
    318         if(ps_dec->u4_num_cores < 3)
    319         {
    320 
    321             if(ps_dec->u4_app_disable_deblk_frm == 0)
    322                 ps_dec->pf_compute_bs(ps_dec, ps_cur_mb_info,
    323                                      (UWORD16)(i >> u1_mbaff));
    324         }
    325     }
    326 
    327 
    328 
    329     return OK;
    330 }
    331 
    332 
    333 WORD32 ih264d_decode_recon_tfr_nmb(dec_struct_t * ps_dec,
    334                                    UWORD8 u1_mb_idx,
    335                                    UWORD8 u1_num_mbs,
    336                                    UWORD8 u1_num_mbs_next,
    337                                    UWORD8 u1_tfr_n_mb,
    338                                    UWORD8 u1_end_of_row)
    339 {
    340     WORD32 i,j;
    341     UWORD32 u1_end_of_row_next;
    342     dec_mb_info_t * ps_cur_mb_info;
    343     UWORD32 u4_update_mbaff = 0;
    344     WORD32 ret;
    345     const UWORD32 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
    346     const UWORD32 u1_slice_type = ps_dec->ps_cur_slice->u1_slice_type;
    347     const WORD32 u1_skip_th = (
    348                     (u1_slice_type != I_SLICE) ?
    349                                     (ps_dec->u1_B ? B_8x8 : PRED_8x8R0) : -1);
    350     const UWORD32 u1_ipcm_th = (
    351                     (u1_slice_type != I_SLICE) ? (ps_dec->u1_B ? 23 : 5) : 0);
    352 
    353 
    354 
    355 
    356 
    357     /* N Mb MC Loop */
    358     for(i = u1_mb_idx; i < u1_num_mbs; i++)
    359     {
    360         ps_cur_mb_info = ps_dec->ps_nmb_info + i;
    361         ps_dec->u4_dma_buf_idx = 0;
    362         ps_dec->u4_pred_info_idx = 0;
    363 
    364         if(ps_cur_mb_info->u1_mb_type <= u1_skip_th)
    365         {
    366             {
    367                 WORD32 pred_cnt = 0;
    368                 pred_info_pkd_t *ps_pred_pkd;
    369                 UWORD32 u4_pred_info_pkd_idx;
    370                 WORD8 i1_pred;
    371 
    372                 u4_pred_info_pkd_idx = ps_cur_mb_info->u4_pred_info_pkd_idx;
    373 
    374                 while(pred_cnt < ps_cur_mb_info->u1_num_pred_parts)
    375                 {
    376 
    377                     ps_pred_pkd = ps_dec->ps_pred_pkd + u4_pred_info_pkd_idx;
    378 
    379                      ps_dec->p_form_mb_part_info(ps_pred_pkd,ps_dec,
    380                                                ps_cur_mb_info->u2_mbx,ps_cur_mb_info->u2_mby,(i >> u1_mbaff),
    381                                          ps_cur_mb_info);
    382                     u4_pred_info_pkd_idx++;
    383                     pred_cnt++;
    384                 }
    385             }
    386 
    387             ps_dec->p_motion_compensate(ps_dec, ps_cur_mb_info);
    388 
    389         }
    390         else if(ps_cur_mb_info->u1_mb_type == MB_SKIP)
    391         {
    392             {
    393                 WORD32 pred_cnt = 0;
    394                 pred_info_pkd_t *ps_pred_pkd;
    395                 UWORD32 u4_pred_info_pkd_idx;
    396                 WORD8 i1_pred;
    397 
    398                 u4_pred_info_pkd_idx = ps_cur_mb_info->u4_pred_info_pkd_idx;
    399 
    400                 while(pred_cnt < ps_cur_mb_info->u1_num_pred_parts)
    401                 {
    402 
    403                     ps_pred_pkd = ps_dec->ps_pred_pkd + u4_pred_info_pkd_idx;
    404 
    405                     ps_dec->p_form_mb_part_info(ps_pred_pkd,ps_dec,
    406                                                ps_cur_mb_info->u2_mbx,ps_cur_mb_info->u2_mby,(i >> u1_mbaff),
    407                                          ps_cur_mb_info);
    408 
    409                     u4_pred_info_pkd_idx++;
    410                     pred_cnt++;
    411                 }
    412             }
    413             /* Decode MB skip */
    414             ps_dec->p_motion_compensate(ps_dec, ps_cur_mb_info);
    415 
    416         }
    417 
    418      }
    419 
    420 
    421     /* N Mb IQ IT RECON  Loop */
    422     for(j = u1_mb_idx; j < i; j++)
    423     {
    424         ps_cur_mb_info = ps_dec->ps_nmb_info + j;
    425 
    426         if(ps_cur_mb_info->u1_mb_type <= u1_skip_th)
    427         {
    428             ih264d_process_inter_mb(ps_dec, ps_cur_mb_info, j);
    429 
    430         }
    431         else if(ps_cur_mb_info->u1_mb_type != MB_SKIP)
    432         {
    433             if((u1_ipcm_th + 25) != ps_cur_mb_info->u1_mb_type)
    434             {
    435                 ps_cur_mb_info->u1_mb_type -= (u1_skip_th + 1);
    436                 ih264d_process_intra_mb(ps_dec, ps_cur_mb_info, j);
    437             }
    438         }
    439 
    440 
    441         if(ps_dec->u4_use_intrapred_line_copy)
    442         {
    443             ih264d_copy_intra_pred_line(ps_dec, ps_cur_mb_info, j);
    444         }
    445 
    446     }
    447 
    448     /*N MB deblocking*/
    449     if(ps_dec->u4_nmb_deblk == 1)
    450     {
    451 
    452         UWORD32 u4_cur_mb, u4_right_mb;
    453         UWORD32 u4_mb_x, u4_mb_y;
    454         UWORD32 u4_wd_y, u4_wd_uv;
    455         tfr_ctxt_t *ps_tfr_cxt = &(ps_dec->s_tran_addrecon);
    456         UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
    457         const WORD32 i4_cb_qp_idx_ofst =
    458                        ps_dec->ps_cur_pps->i1_chroma_qp_index_offset;
    459         const WORD32 i4_cr_qp_idx_ofst =
    460                        ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset;
    461 
    462         u4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
    463         u4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
    464 
    465 
    466         ps_cur_mb_info = ps_dec->ps_nmb_info + u1_mb_idx;
    467 
    468         ps_dec->u4_deblk_mb_x = ps_cur_mb_info->u2_mbx;
    469         ps_dec->u4_deblk_mb_y = ps_cur_mb_info->u2_mby;
    470 
    471         for(j = u1_mb_idx; j < i; j++)
    472         {
    473 
    474             ih264d_deblock_mb_nonmbaff(ps_dec, ps_tfr_cxt,
    475                                        i4_cb_qp_idx_ofst, i4_cr_qp_idx_ofst,
    476                                         u4_wd_y, u4_wd_uv);
    477 
    478 
    479         }
    480 
    481 
    482 
    483     }
    484 
    485 
    486 
    487     if(u1_tfr_n_mb)
    488     {
    489         /****************************************************************/
    490         /* Check for End Of Row in Next iteration                       */
    491         /****************************************************************/
    492         u1_end_of_row_next =
    493                         u1_num_mbs_next
    494                                         && (u1_num_mbs_next
    495                                                         <= (ps_dec->u1_recon_mb_grp
    496                                                                         >> u1_mbaff));
    497 
    498         /****************************************************************/
    499         /* Transfer the Following things                                */
    500         /* N-Mb DeblkParams Data    ( To Ext DeblkParams Buffer )       */
    501         /* N-Mb Recon Data          ( To Ext Frame Buffer )             */
    502         /* N-Mb Intrapredline Data  ( Updated Internally)               */
    503         /* N-Mb MV Data             ( To Ext MV Buffer )                */
    504         /* N-Mb MVTop/TopRight Data ( To Int MV Top Scratch Buffers)    */
    505         /****************************************************************/
    506         ih264d_transfer_mb_group_data(ps_dec, u1_num_mbs, u1_end_of_row,
    507                                       u1_end_of_row_next);
    508         ps_dec->u4_num_mbs_prev_nmb = u1_num_mbs;
    509 
    510         ps_dec->u4_pred_info_idx = 0;
    511         ps_dec->u4_dma_buf_idx = 0;
    512 
    513 
    514     }
    515     return OK;
    516 }
    517 
    518 /*!
    519  **************************************************************************
    520  * \if Function name : ih264d_process_inter_mb \endif
    521  *
    522  * \brief
    523  *    This function decodes an Inter MB.
    524  *
    525  *
    526  * \return
    527  *    0 on Success and Error code otherwise
    528  **************************************************************************
    529  */
    530 WORD32 ih264d_process_inter_mb(dec_struct_t * ps_dec,
    531                                dec_mb_info_t * ps_cur_mb_info,
    532                                UWORD8 u1_mb_num)
    533 {
    534     /* CHANGED CODE */
    535     UWORD8 *pu1_rec_y, *pu1_rec_u, *pu1_rec_v;
    536 
    537     /*CHANGED CODE */
    538     UWORD32 ui_rec_width, u4_recwidth_cr;
    539     WORD16 *pi2_y_coeff;
    540     UWORD32 u1_mb_field_decoding_flag;
    541     const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
    542     UWORD32 uc_botMb;
    543     UWORD32 u4_num_pmbair;
    544     /* CHANGED CODE */
    545     tfr_ctxt_t *ps_frame_buf = ps_dec->ps_frame_buf_ip_recon;
    546     UWORD32 u4_luma_dc_only_csbp = 0;
    547     UWORD32 u4_luma_dc_only_cbp = 0;
    548     /* CHANGED CODE */
    549 
    550     uc_botMb = 1 - ps_cur_mb_info->u1_topmb;
    551     u4_num_pmbair = (u1_mb_num >> u1_mbaff);
    552     u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
    553 
    554 
    555     /* CHANGED CODE */
    556     pu1_rec_y = ps_frame_buf->pu1_dest_y + (u4_num_pmbair << 4);
    557     pu1_rec_u =
    558                     ps_frame_buf->pu1_dest_u
    559                                     + (u4_num_pmbair << 3) * YUV420SP_FACTOR;
    560     pu1_rec_v = ps_frame_buf->pu1_dest_v + (u4_num_pmbair << 3);
    561     ui_rec_width = ps_dec->u2_frm_wd_y << u1_mb_field_decoding_flag;
    562     u4_recwidth_cr = ps_dec->u2_frm_wd_uv << u1_mb_field_decoding_flag;
    563 
    564     /* CHANGED CODE */
    565 
    566     if(u1_mbaff)
    567     {
    568         if(uc_botMb)
    569         {
    570             pu1_rec_y += (u1_mb_field_decoding_flag ?
    571                             (ui_rec_width >> 1) : (ui_rec_width << 4));
    572             pu1_rec_u += (u1_mb_field_decoding_flag ?
    573                             (u4_recwidth_cr >> 1) : (u4_recwidth_cr << 3));
    574             pu1_rec_v += (u1_mb_field_decoding_flag ?
    575                             (u4_recwidth_cr >> 1) : (u4_recwidth_cr << 3));
    576         }
    577     }
    578 
    579     if(!ps_cur_mb_info->u1_tran_form8x8)
    580     {
    581         u4_luma_dc_only_csbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec,
    582                                        ps_cur_mb_info,
    583                                        0);
    584     }
    585     else
    586     {
    587         if(!ps_dec->ps_cur_pps->u1_entropy_coding_mode)
    588         {
    589             u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec,
    590                                            ps_cur_mb_info,
    591                                            0);
    592         }
    593         else
    594         {
    595             u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff8x8_mb(ps_dec,
    596                                            ps_cur_mb_info);
    597         }
    598     }
    599 
    600     pi2_y_coeff = ps_dec->pi2_coeff_data;
    601     /* Inverse Transform and Reconstruction */
    602     if(ps_cur_mb_info->u1_cbp & 0x0f)
    603     {
    604         /* CHANGED CODE */
    605         if(!ps_cur_mb_info->u1_tran_form8x8)
    606         {
    607             UWORD32 i;
    608             WORD16 ai2_tmp[16];
    609             for(i = 0; i < 16; i++)
    610             {
    611                 if(CHECKBIT(ps_cur_mb_info->u2_luma_csbp, i))
    612                 {
    613                     WORD16 *pi2_level = pi2_y_coeff + (i << 4);
    614                     UWORD8 *pu1_pred_sblk = pu1_rec_y + ((i & 0x3) * BLK_SIZE)
    615                                     + (i >> 2) * (ui_rec_width << 2);
    616                     PROFILE_DISABLE_IQ_IT_RECON()
    617                     {
    618                         if(CHECKBIT(u4_luma_dc_only_csbp, i))
    619                         {
    620                             ps_dec->pf_iquant_itrans_recon_luma_4x4_dc(
    621                                             pi2_level,
    622                                             pu1_pred_sblk,
    623                                             pu1_pred_sblk,
    624                                             ui_rec_width,
    625                                             ui_rec_width,
    626                                             gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
    627                                             (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[3],
    628                                             ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0,
    629                                             NULL);
    630                         }
    631                         else
    632                         {
    633                             ps_dec->pf_iquant_itrans_recon_luma_4x4(
    634                                             pi2_level,
    635                                             pu1_pred_sblk,
    636                                             pu1_pred_sblk,
    637                                             ui_rec_width,
    638                                             ui_rec_width,
    639                                             gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
    640                                             (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[3],
    641                                             ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0,
    642                                             NULL);
    643                         }
    644                     }
    645                 }
    646             }
    647         }
    648         else
    649         {
    650             WORD16 *pi2_scale_matrix_ptr;
    651             WORD32 i;
    652 
    653             pi2_scale_matrix_ptr =
    654                             ps_dec->s_high_profile.i2_scalinglist8x8[1];
    655 
    656             for(i = 0; i < 4; i++)
    657             {
    658                 WORD16 ai2_tmp[64];
    659                 WORD16 *pi16_levelBlock = pi2_y_coeff + (i << 6); /* move to the next 8x8 adding 64 */
    660 
    661                 UWORD8 *pu1_pred_sblk = pu1_rec_y + ((i & 0x1) * BLK8x8SIZE)
    662                                 + (i >> 1) * (ui_rec_width << 3);
    663                 if(CHECKBIT(ps_cur_mb_info->u1_cbp, i))
    664                 {
    665                     PROFILE_DISABLE_IQ_IT_RECON()
    666                     {
    667                         if(CHECKBIT(u4_luma_dc_only_cbp, i))
    668                         {
    669                             ps_dec->pf_iquant_itrans_recon_luma_8x8_dc(
    670                                             pi16_levelBlock,
    671                                             pu1_pred_sblk,
    672                                             pu1_pred_sblk,
    673                                             ui_rec_width,
    674                                             ui_rec_width,
    675                                             gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
    676                                             (UWORD16 *)pi2_scale_matrix_ptr,
    677                                             ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0,
    678                                             NULL);
    679                         }
    680                         else
    681                         {
    682                             ps_dec->pf_iquant_itrans_recon_luma_8x8(
    683                                             pi16_levelBlock,
    684                                             pu1_pred_sblk,
    685                                             pu1_pred_sblk,
    686                                             ui_rec_width,
    687                                             ui_rec_width,
    688                                             gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
    689                                             (UWORD16 *)pi2_scale_matrix_ptr,
    690                                             ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0,
    691                                             NULL);
    692                         }
    693                     }
    694                 }
    695             }
    696 
    697         }
    698     }
    699 
    700     /* Decode Chroma Block */
    701     ih264d_unpack_chroma_coeff4x4_mb(ps_dec,
    702                                      ps_cur_mb_info);
    703     /*--------------------------------------------------------------------*/
    704     /* Chroma Blocks decoding                                             */
    705     /*--------------------------------------------------------------------*/
    706     {
    707         UWORD8 u1_chroma_cbp = (UWORD8)(ps_cur_mb_info->u1_cbp >> 4);
    708 
    709         if(u1_chroma_cbp != CBPC_ALLZERO)
    710         {
    711             UWORD32 u4_scale_u = ps_cur_mb_info->u1_qpc_div6;
    712             UWORD32 u4_scale_v = ps_cur_mb_info->u1_qpcr_div6;
    713             UWORD16 u2_chroma_csbp = ps_cur_mb_info->u2_chroma_csbp;
    714 
    715             pi2_y_coeff = ps_dec->pi2_coeff_data;
    716 
    717             {
    718                 UWORD32 i;
    719                 WORD16 ai2_tmp[16];
    720                 for(i = 0; i < 4; i++)
    721                 {
    722                     WORD16 *pi2_level = pi2_y_coeff + (i << 4);
    723                     UWORD8 *pu1_pred_sblk = pu1_rec_u
    724                                     + ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR)
    725                                     + (i >> 1) * (u4_recwidth_cr << 2);
    726                     PROFILE_DISABLE_IQ_IT_RECON()
    727                     {
    728                         if(CHECKBIT(u2_chroma_csbp, i))
    729                         {
    730                             ps_dec->pf_iquant_itrans_recon_chroma_4x4(
    731                                             pi2_level,
    732                                             pu1_pred_sblk,
    733                                             pu1_pred_sblk,
    734                                             u4_recwidth_cr,
    735                                             u4_recwidth_cr,
    736                                             gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
    737                                             (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[4],
    738                                             u4_scale_u, ai2_tmp, pi2_level);
    739                         }
    740                         else if(pi2_level[0] != 0)
    741                         {
    742                             ps_dec->pf_iquant_itrans_recon_chroma_4x4_dc(
    743                                             pi2_level,
    744                                             pu1_pred_sblk,
    745                                             pu1_pred_sblk,
    746                                             u4_recwidth_cr,
    747                                             u4_recwidth_cr,
    748                                             gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
    749                                             (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[4],
    750                                             u4_scale_u, ai2_tmp, pi2_level);
    751                         }
    752                     }
    753                 }
    754             }
    755 
    756             pi2_y_coeff += MB_CHROM_SIZE;
    757             u2_chroma_csbp >>= 4;
    758 
    759             {
    760                 UWORD32 i;
    761                 WORD16 ai2_tmp[16];
    762                 for(i = 0; i < 4; i++)
    763                 {
    764                     WORD16 *pi2_level = pi2_y_coeff + (i << 4);
    765                     UWORD8 *pu1_pred_sblk = pu1_rec_u + 1
    766                                     + ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR)
    767                                     + (i >> 1) * (u4_recwidth_cr << 2);
    768                     PROFILE_DISABLE_IQ_IT_RECON()
    769                     {
    770                         if(CHECKBIT(u2_chroma_csbp, i))
    771                         {
    772                             ps_dec->pf_iquant_itrans_recon_chroma_4x4(
    773                                             pi2_level,
    774                                             pu1_pred_sblk,
    775                                             pu1_pred_sblk,
    776                                             u4_recwidth_cr,
    777                                             u4_recwidth_cr,
    778                                             gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
    779                                             (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[5],
    780                                             u4_scale_v, ai2_tmp, pi2_level);
    781                         }
    782                         else if(pi2_level[0] != 0)
    783                         {
    784                             ps_dec->pf_iquant_itrans_recon_chroma_4x4_dc(
    785                                             pi2_level,
    786                                             pu1_pred_sblk,
    787                                             pu1_pred_sblk,
    788                                             u4_recwidth_cr,
    789                                             u4_recwidth_cr,
    790                                             gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
    791                                             (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[5],
    792                                             u4_scale_v, ai2_tmp, pi2_level);
    793                         }
    794                     }
    795                 }
    796             }
    797         }
    798     }
    799     return (0);
    800 }
    801 
    802 /*!
    803  **************************************************************************
    804  * \if Function name : ih264d_parse_pred_weight_table \endif
    805  *
    806  * \brief
    807  *    Implements pred_weight_table() of 7.3.3.2.
    808  *
    809  * \return
    810  *    None
    811  *
    812  **************************************************************************
    813  */
    814 WORD32 ih264d_parse_pred_weight_table(dec_slice_params_t * ps_cur_slice,
    815                                       dec_bit_stream_t * ps_bitstrm)
    816 {
    817     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    818     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
    819     WORD8 i, cont, lx;
    820     UWORD8 uc_weight_flag;
    821     UWORD32 *pui32_weight_offset_lx;
    822     WORD16 c_weight, c_offset;
    823     UWORD32 ui32_y_def_weight_ofst, ui32_cr_def_weight_ofst;
    824     UWORD32 ui32_temp;
    825     UWORD8 uc_luma_log2_weight_denom;
    826     UWORD8 uc_chroma_log2_weight_denom;
    827 
    828     /* Variables for error resilience checks */
    829     UWORD32 u4_temp;
    830     WORD32 i_temp;
    831 
    832     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
    833     if(u4_temp & MASK_LOG2_WEIGHT_DENOM)
    834     {
    835         return ERROR_PRED_WEIGHT_TABLE_T;
    836     }
    837     uc_luma_log2_weight_denom = u4_temp;
    838     COPYTHECONTEXT("SH: luma_log2_weight_denom",uc_luma_log2_weight_denom);
    839     ui32_y_def_weight_ofst = (1 << uc_luma_log2_weight_denom);
    840 
    841     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
    842     if(u4_temp & MASK_LOG2_WEIGHT_DENOM)
    843     {
    844         return ERROR_PRED_WEIGHT_TABLE_T;
    845     }
    846     uc_chroma_log2_weight_denom = u4_temp;
    847     COPYTHECONTEXT("SH: chroma_log2_weight_denom",uc_chroma_log2_weight_denom);
    848     ui32_cr_def_weight_ofst = (1 << uc_chroma_log2_weight_denom);
    849 
    850     ps_cur_slice->u2_log2Y_crwd = uc_luma_log2_weight_denom
    851                     | (uc_chroma_log2_weight_denom << 8);
    852 
    853     cont = (ps_cur_slice->u1_slice_type == B_SLICE);
    854     lx = 0;
    855     do
    856     {
    857         for(i = 0; i < ps_cur_slice->u1_num_ref_idx_lx_active[lx]; i++)
    858         {
    859             pui32_weight_offset_lx = ps_cur_slice->u4_wt_ofst_lx[lx][i];
    860 
    861             uc_weight_flag = ih264d_get_bit_h264(ps_bitstrm);
    862             pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    863             COPYTHECONTEXT("SH: luma_weight_l0_flag",uc_weight_flag);
    864             if(uc_weight_flag)
    865             {
    866                 i_temp = ih264d_sev(pu4_bitstrm_ofst,
    867                                     pu4_bitstrm_buf);
    868                 if((i_temp + 128) & MASK_PRED_WEIGHT_OFFSET)
    869                     return ERROR_PRED_WEIGHT_TABLE_T;
    870                 c_weight = i_temp;
    871                 COPYTHECONTEXT("SH: luma_weight_l0",c_weight);
    872 
    873                 i_temp = ih264d_sev(pu4_bitstrm_ofst,
    874                                     pu4_bitstrm_buf);
    875                 if((i_temp + 128) & MASK_PRED_WEIGHT_OFFSET)
    876                     return ERROR_PRED_WEIGHT_TABLE_T;
    877                 c_offset = i_temp;
    878                 COPYTHECONTEXT("SH: luma_offset_l0",c_offset);
    879 
    880                 ui32_temp = (c_offset << 16) | (c_weight & 0xFFFF);
    881                 pui32_weight_offset_lx[0] = ui32_temp;
    882             }
    883             else
    884             {
    885 
    886                 pui32_weight_offset_lx[0] = ui32_y_def_weight_ofst;
    887             }
    888 
    889             {
    890                 WORD8 c_weightCb, c_weightCr, c_offsetCb, c_offsetCr;
    891                 uc_weight_flag = ih264d_get_bit_h264(ps_bitstrm);
    892                 pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    893                 COPYTHECONTEXT("SH: chroma_weight_l0_flag",uc_weight_flag);
    894                 if(uc_weight_flag)
    895                 {
    896                     i_temp = ih264d_sev(pu4_bitstrm_ofst,
    897                                         pu4_bitstrm_buf);
    898                     if((i_temp + 128) & MASK_PRED_WEIGHT_OFFSET)
    899                         return ERROR_PRED_WEIGHT_TABLE_T;
    900                     c_weightCb = i_temp;
    901                     COPYTHECONTEXT("SH: chroma_weight_l0",c_weightCb);
    902 
    903                     i_temp = ih264d_sev(pu4_bitstrm_ofst,
    904                                         pu4_bitstrm_buf);
    905                     if((i_temp + 128) & MASK_PRED_WEIGHT_OFFSET)
    906                         return ERROR_PRED_WEIGHT_TABLE_T;
    907                     c_offsetCb = i_temp;
    908                     COPYTHECONTEXT("SH: chroma_weight_l0",c_offsetCb);
    909 
    910                     ui32_temp = (c_offsetCb << 16) | (c_weightCb & 0xFFFF);
    911                     pui32_weight_offset_lx[1] = ui32_temp;
    912 
    913                     i_temp = ih264d_sev(pu4_bitstrm_ofst,
    914                                         pu4_bitstrm_buf);
    915                     if((i_temp + 128) & MASK_PRED_WEIGHT_OFFSET)
    916                         return ERROR_PRED_WEIGHT_TABLE_T;
    917                     c_weightCr = i_temp;
    918                     COPYTHECONTEXT("SH: chroma_weight_l0",c_weightCr);
    919 
    920                     i_temp = ih264d_sev(pu4_bitstrm_ofst,
    921                                         pu4_bitstrm_buf);
    922                     if((i_temp + 128) & MASK_PRED_WEIGHT_OFFSET)
    923                         return ERROR_PRED_WEIGHT_TABLE_T;
    924                     c_offsetCr = i_temp;
    925                     COPYTHECONTEXT("SH: chroma_weight_l0",c_offsetCr);
    926 
    927                     ui32_temp = (c_offsetCr << 16) | (c_weightCr & 0xFFFF);
    928                     pui32_weight_offset_lx[2] = ui32_temp;
    929                 }
    930                 else
    931                 {
    932                     pui32_weight_offset_lx[1] = ui32_cr_def_weight_ofst;
    933                     pui32_weight_offset_lx[2] = ui32_cr_def_weight_ofst;
    934                 }
    935             }
    936         }
    937         lx++;
    938     }
    939     while(cont--);
    940 
    941     return OK;
    942 }
    943 
    944 
    945 /*****************************************************************************/
    946 /*                                                                           */
    947 /*  Function Name : ih264d_init_ref_idx_lx_p                                        */
    948 /*                                                                           */
    949 /*  Description   : This function initializes the reference picture L0 list  */
    950 /*                  for P slices as per section 8.2.4.2.1 and 8.2.4.2.2.     */
    951 /*                                                                           */
    952 /*  Inputs        : pointer to ps_dec struture                               */
    953 /*  Globals       : NO                                                       */
    954 /*  Processing    : arranges all the short term pictures according to        */
    955 /*                  pic_num in descending order starting from curr pic_num.  */
    956 /*                  and inserts it in L0 list followed by all Long term      */
    957 /*                  pictures in ascending order.                             */
    958 /*                                                                           */
    959 /*  Returns       : void                                                     */
    960 /*                                                                           */
    961 /*  Issues        : <List any issues or problems with this function>         */
    962 /*                                                                           */
    963 /*  Revision History:                                                        */
    964 /*                                                                           */
    965 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    966 /*         13 07 2002   Jay             Draft                                */
    967 /*                                                                           */
    968 /*****************************************************************************/
    969 void ih264d_init_ref_idx_lx_p(dec_struct_t *ps_dec)
    970 {
    971     struct pic_buffer_t *ps_ref_pic_buf_lx;
    972     dpb_manager_t *ps_dpb_mgr;
    973     struct dpb_info_t *ps_next_dpb;
    974     WORD8 i;
    975     UWORD8 u1_max_lt_index, u1_min_lt_index, u1_lt_index;
    976     UWORD8 u1_field_pic_flag;
    977     dec_slice_params_t *ps_cur_slice;
    978     UWORD8 u1_L0;
    979     WORD32 i4_cur_pic_num, i4_min_st_pic_num;
    980     WORD32 i4_temp_pic_num, i4_ref_pic_num;
    981     UWORD8 u1_num_short_term_bufs;
    982     UWORD8 u1_max_ref_idx_l0;
    983 
    984     ps_cur_slice = ps_dec->ps_cur_slice;
    985     u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
    986     u1_max_ref_idx_l0 = ps_cur_slice->u1_num_ref_idx_lx_active[0]
    987                     << u1_field_pic_flag;
    988 
    989     ps_dpb_mgr = ps_dec->ps_dpb_mgr;
    990     /* Get the current frame number */
    991     i4_cur_pic_num = ps_dec->ps_cur_pic->i4_pic_num;
    992 
    993     /* Get Min pic_num,MinLt */
    994     i4_min_st_pic_num = i4_cur_pic_num;
    995     u1_max_lt_index = MAX_REF_BUFS + 1;
    996     u1_min_lt_index = MAX_REF_BUFS + 1;
    997 
    998     /* Start from ST head */
    999     ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
   1000     for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
   1001     {
   1002         i4_ref_pic_num = ps_next_dpb->ps_pic_buf->i4_pic_num;
   1003         if(i4_ref_pic_num < i4_cur_pic_num)
   1004         {
   1005             /* RefPic Buf pic_num is before Current pic_num in decode order */
   1006             i4_min_st_pic_num = MIN(i4_min_st_pic_num, i4_ref_pic_num);
   1007         }
   1008 
   1009         /* Chase the next link */
   1010         ps_next_dpb = ps_next_dpb->ps_prev_short;
   1011     }
   1012 
   1013     /* Start from LT head */
   1014     ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
   1015     if(ps_next_dpb)
   1016     {
   1017         u1_max_lt_index = ps_next_dpb->u1_lt_idx;
   1018         u1_min_lt_index = ps_next_dpb->u1_lt_idx;
   1019 
   1020         for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
   1021         {
   1022             u1_lt_index = ps_next_dpb->u1_lt_idx;
   1023             u1_max_lt_index = (UWORD8)(MAX(u1_max_lt_index, u1_lt_index));
   1024             u1_min_lt_index = (UWORD8)(MIN(u1_min_lt_index, u1_lt_index));
   1025 
   1026             /* Chase the next link */
   1027             ps_next_dpb = ps_next_dpb->ps_prev_long;
   1028         }
   1029     }
   1030     /* 1. Initialize refIdxL0 */
   1031     u1_L0 = 0;
   1032     if(u1_field_pic_flag)
   1033     {
   1034         ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[0][0];
   1035         ps_ref_pic_buf_lx += MAX_REF_BUFS;
   1036         i4_temp_pic_num = i4_cur_pic_num;
   1037     }
   1038     else
   1039     {
   1040         ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[0][0];
   1041         i4_temp_pic_num = i4_cur_pic_num;
   1042     }
   1043 
   1044     /* Arrange all short term buffers in output order as given by pic_num */
   1045     /* Arrange pic_num's less than Curr pic_num in the descending pic_num */
   1046     /* order starting from (Curr pic_num - 1)                             */
   1047     for(; i4_temp_pic_num >= i4_min_st_pic_num; i4_temp_pic_num--)
   1048     {
   1049         /* Start from ST head */
   1050         ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
   1051         for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
   1052         {
   1053             if((WORD32)ps_next_dpb->ps_pic_buf->i4_pic_num == i4_temp_pic_num)
   1054             {
   1055                 /* Copy info in pic buffer */
   1056                 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
   1057                                                    ps_next_dpb->ps_pic_buf);
   1058                 ps_ref_pic_buf_lx++;
   1059                 u1_L0++;
   1060                 break;
   1061             }
   1062             ps_next_dpb = ps_next_dpb->ps_prev_short;
   1063         }
   1064     }
   1065 
   1066     /* Arrange all Long term buffers in ascending order, in LongtermIndex */
   1067     /* Start from LT head */
   1068     u1_num_short_term_bufs = u1_L0;
   1069     for(u1_lt_index = u1_min_lt_index; u1_lt_index <= u1_max_lt_index;
   1070                     u1_lt_index++)
   1071     {
   1072         ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
   1073         for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
   1074         {
   1075             if(ps_next_dpb->u1_lt_idx == u1_lt_index)
   1076             {
   1077                 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
   1078                                                    ps_next_dpb->ps_pic_buf);
   1079 
   1080                 ps_ref_pic_buf_lx->u1_long_term_pic_num =
   1081                                 ps_ref_pic_buf_lx->u1_long_term_frm_idx;
   1082                 ps_ref_pic_buf_lx++;
   1083                 u1_L0++;
   1084                 break;
   1085             }
   1086             ps_next_dpb = ps_next_dpb->ps_prev_long;
   1087         }
   1088     }
   1089 
   1090     if(u1_field_pic_flag)
   1091     {
   1092         /* Initialize the rest of the entries in the */
   1093         /* reference list to handle of errors        */
   1094         {
   1095             UWORD8 u1_i;
   1096             pic_buffer_t *ps_ref_pic;
   1097 
   1098             ps_ref_pic = ps_dpb_mgr->ps_init_dpb[0][0] + MAX_REF_BUFS;
   1099 
   1100             if(NULL == ps_ref_pic->pu1_buf1)
   1101             {
   1102                 ps_ref_pic = ps_dec->ps_cur_pic;
   1103             }
   1104             for(u1_i = u1_L0; u1_i < u1_max_ref_idx_l0; u1_i++)
   1105             {
   1106                 *ps_ref_pic_buf_lx = *ps_ref_pic;
   1107                 ps_ref_pic_buf_lx++;
   1108             }
   1109         }
   1110 
   1111         ih264d_convert_frm_to_fld_list(
   1112                         ps_dpb_mgr->ps_init_dpb[0][0] + MAX_REF_BUFS, &u1_L0,
   1113                         ps_dec, u1_num_short_term_bufs);
   1114 
   1115         ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[0][0] + u1_L0;
   1116     }
   1117 
   1118     /* Initialize the rest of the entries in the */
   1119     /* reference list to handle of errors        */
   1120     {
   1121         UWORD8 u1_i;
   1122         pic_buffer_t *ps_ref_pic;
   1123 
   1124         ps_ref_pic = ps_dpb_mgr->ps_init_dpb[0][0];
   1125 
   1126         if(NULL == ps_ref_pic->pu1_buf1)
   1127         {
   1128             ps_ref_pic = ps_dec->ps_cur_pic;
   1129         }
   1130         for(u1_i = u1_L0; u1_i < u1_max_ref_idx_l0; u1_i++)
   1131         {
   1132             *ps_ref_pic_buf_lx = *ps_ref_pic;
   1133             ps_ref_pic_buf_lx++;
   1134         }
   1135     }
   1136     ps_dec->ps_cur_slice->u1_initial_list_size[0] = u1_L0;
   1137 }
   1138 
   1139