ih264d_parse_bslice.c revision 208c74d62a3e1039dc87818306e057877760fbaa
18d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/******************************************************************************
28d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
38d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Copyright (C) 2015 The Android Open Source Project
48d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
58d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Licensed under the Apache License, Version 2.0 (the "License");
68d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * you may not use this file except in compliance with the License.
78d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * You may obtain a copy of the License at:
88d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
98d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * http://www.apache.org/licenses/LICENSE-2.0
108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Unless required by applicable law or agreed to in writing, software
128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * distributed under the License is distributed on an "AS IS" BASIS,
138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * See the License for the specific language governing permissions and
158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * limitations under the License.
168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *****************************************************************************
188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*!
218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S **************************************************************************
228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \file ih264d_parse_bslice.c
238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \brief
258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *    Contains routines that decode a I slice type
268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Detailed_description
288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \date
308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *    07/07/2003
318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \author  NS
338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S **************************************************************************
348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include <string.h>
378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_bitstrm.h"
388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_defs.h"
398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_debug.h"
408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_tables.h"
418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_structs.h"
428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_defs.h"
438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_parse_cavlc.h"
448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_mb_utils.h"
458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_parse_slice.h"
468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_process_intra_mb.h"
478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_mvpred.h"
488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_parse_islice.h"
498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_inter_pred.h"
508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_process_pslice.h"
518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_process_bslice.h"
528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_deblocking.h"
538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_cabac.h"
548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_parse_mb_header.h"
558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_error_handler.h"
568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_mvpred.h"
578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_cabac.h"
588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_utils.h"
598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec);
618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*!
638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S **************************************************************************
648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \if Function name : ParseMb_SubMb_PredBCav\endif
658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \brief
678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *    Implements sub_mb_pred() of 7.3.5.2. & mb_pred() of 7.3.5.1
688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \return
708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *    None.
718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S **************************************************************************
738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SWORD32 ih264d_parse_bmb_non_direct_cavlc(dec_struct_t * ps_dec,
758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                       dec_mb_info_t * ps_cur_mb_info,
768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                       UWORD8 u1_mb_num,
778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                       UWORD8 u1_num_mbsNby2)
788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 * pu1_sub_mb_pred_modes = (UWORD8 *)(gau1_ih264d_submb_pred_modes) + 4;
838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    const UWORD8 (*pu1_mb_pred_modes)[32] =
848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    (const UWORD8 (*)[32])gau1_ih264d_mb_pred_modes;
858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    const UWORD8 * pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part;
868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    const UWORD8 * pu1_sub_mb_mc_mode = (const UWORD8 *)(gau1_ih264d_submb_mc_mode)
878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    + 4;
888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data
908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    + u1_num_mbsNby2;
918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info;
928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD8 (*pi1_ref_idx)[MAX_REFIDX_INFO_PER_MB] = ps_parse_mb_data->i1_ref_idx;
938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 u1_mb_mc_mode, u1_num_mb_part, u1_sub_mb = !(u1_mb_type ^ B_8x8);
958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 u4_mb_mc_mode = 0, u4_mb_pred_mode = 0;
968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32 ret;
978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(u1_sub_mb)
998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
1008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 uc_i;
1018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_mb_mc_mode = 0;
1028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_num_mb_part = 4;
1038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Reading the subMB type */
1048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        for(uc_i = 0; uc_i < 4; uc_i++)
1058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
1068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD32 ui_sub_mb_mode;
1088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S//Inlined ih264d_uev
1108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
1118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD32 u4_word, u4_ldz;
1128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /***************************************************************/
1148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* Find leading zeros in next 32 bits                          */
1158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /***************************************************************/
1168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
1178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u4_ldz = CLZ(u4_word);
1188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* Flush the ps_bitstrm */
1198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u4_bitstream_offset += (u4_ldz + 1);
1208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* Read the suffix from the ps_bitstrm */
1218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u4_word = 0;
1228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            if(u4_ldz)
1238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
1248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        u4_ldz);
1258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            *pu4_bitstrm_ofst = u4_bitstream_offset;
1268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ui_sub_mb_mode = ((1 << u4_ldz) + u4_word - 1);
1278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S//Inlined ih264d_uev
1288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            if(ui_sub_mb_mode > 12)
1308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                return ERROR_SUB_MB_TYPE;
1318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            else
1328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
1338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                UWORD8 u1_subMbPredMode = pu1_sub_mb_pred_modes[ui_sub_mb_mode];
1348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                u4_mb_mc_mode = (u4_mb_mc_mode << 8)
1358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                | pu1_sub_mb_mc_mode[ui_sub_mb_mode];
1368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                u4_mb_pred_mode = (u4_mb_pred_mode << 8) | u1_subMbPredMode;
1378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                pi1_ref_idx[0][uc_i] = ((u1_subMbPredMode & PRED_L0) - 1) >> 1;
1388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                pi1_ref_idx[1][uc_i] = ((u1_subMbPredMode & PRED_L1) - 1) >> 1;
1398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                COPYTHECONTEXT("sub_mb_type", u1_subMbPredMode);
1408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
1418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* Storing collocated Mb and SubMb mode information */
1428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            *pu1_col_info++ = ((PRED_8x8) << 6)
1438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            | ((pu1_sub_mb_mc_mode[ui_sub_mb_mode] << 4));
1448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            if(ui_sub_mb_mode != B_DIRECT_8x8)
1458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
1468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                if(ui_sub_mb_mode > B_BI_8x8)
1478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                {
1488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 0;
1498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                }
1508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
1518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            else if(!ps_dec->s_high_profile.u1_direct_8x8_inference_flag)
1528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
1538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 0;
1548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
1558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
1568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
1578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    else
1588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
1598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 u1_mb_pred_mode_idx = 5 + u1_mb_type;
1608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 u1_mb_pred_mode_part0 = pu1_mb_pred_modes[0][u1_mb_pred_mode_idx];
1618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 u1_mb_pred_mode_part1 = pu1_mb_pred_modes[1][u1_mb_pred_mode_idx];
1628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_mb_mc_mode = ps_cur_mb_info->u1_mb_mc_mode;
1638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_num_mb_part = pu1_num_mb_part[u1_mb_mc_mode];
1648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        pi1_ref_idx[0][0] = ((u1_mb_pred_mode_part0 & PRED_L0) - 1) >> 1;
1668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        pi1_ref_idx[1][0] = ((u1_mb_pred_mode_part0 & PRED_L1) - 1) >> 1;
1678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        pi1_ref_idx[0][1] = ((u1_mb_pred_mode_part1 & PRED_L0) - 1) >> 1;
1688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        pi1_ref_idx[1][1] = ((u1_mb_pred_mode_part1 & PRED_L1) - 1) >> 1;
1698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_mb_pred_mode = (u1_mb_pred_mode_part0 << 8) | u1_mb_pred_mode_part1;
1718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_mb_mc_mode = u1_mb_mc_mode | (u1_mb_mc_mode << 8);
1728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_mb_mc_mode <<= 16;
1738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_mb_pred_mode <<= 16;
1748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Storing collocated Mb and SubMb mode information */
1768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        *pu1_col_info++ = (u1_mb_mc_mode << 6);
1778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(u1_mb_mc_mode)
1788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            *pu1_col_info++ = (u1_mb_mc_mode << 6);
1798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
1808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
1828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
1838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag;
1848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 *pu1_num_ref_idx_lx_active =
1858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active;
1868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 u1_mbaff_field = (u1_mbaff & uc_field);
1878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 u4_num_ref_idx_lx_active;
1888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_num_ref_idx_lx_active = (pu1_num_ref_idx_lx_active[0]
1908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        << u1_mbaff_field) - 1;
1918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(u4_num_ref_idx_lx_active)
1938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
1948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            if(1 == u4_num_ref_idx_lx_active)
1958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ih264d_parse_bmb_ref_index_cavlc_range1(
1968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                u1_num_mb_part, ps_bitstrm, pi1_ref_idx[0],
1978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                u4_num_ref_idx_lx_active);
1988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            else
1998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
2008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ret = ih264d_parse_bmb_ref_index_cavlc(u1_num_mb_part, ps_bitstrm,
2018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                 pi1_ref_idx[0],
2028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                 u4_num_ref_idx_lx_active);
2038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                if(ret != OK)
2048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    return ret;
2058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
2068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
2078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_num_ref_idx_lx_active = (pu1_num_ref_idx_lx_active[1]
2098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        << u1_mbaff_field) - 1;
2108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(u4_num_ref_idx_lx_active)
2128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
2138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            if(1 == u4_num_ref_idx_lx_active)
2148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ih264d_parse_bmb_ref_index_cavlc_range1(
2158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                u1_num_mb_part, ps_bitstrm, pi1_ref_idx[1],
2168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                u4_num_ref_idx_lx_active);
2178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            else
2188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
2198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ret = ih264d_parse_bmb_ref_index_cavlc(u1_num_mb_part, ps_bitstrm,
2208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                 pi1_ref_idx[1],
2218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                 u4_num_ref_idx_lx_active);
2228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                if(ret != OK)
2238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    return ret;
2248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
2258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
2268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
2278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Read MotionVectors */
2298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
2308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 * pu1_top_left_sub_mb_indx;
2318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 * pu1_sub_mb_indx_mod =
2338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        (const UWORD8 *)(gau1_ih264d_submb_indx_mod)
2348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        + (u1_sub_mb * 6);
2358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 * pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw;
2368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 * pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth;
2378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 * pu1_num_sub_mb_part =
2388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        (const UWORD8 *)gau1_ih264d_num_submb_part;
2398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 * pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
2408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 * pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
2418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 u1_p_idx = 0, u1_num_submb_part, uc_lx;
2428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        parse_part_params_t * ps_part;
2438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        mv_pred_t *ps_mv_start = ps_dec->ps_mv_cur + (u1_mb_num << 4);
2448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 u1_mb_part_wd, u1_mb_part_ht;
2458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Initialisations */
2478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_part = ps_dec->ps_part;
2488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Default Initialization for Non subMb Case Mode */
2498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_mb_part_wd = pu1_mb_partw[u1_mb_mc_mode];
2508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_mb_part_ht = pu1_mb_parth[u1_mb_mc_mode];
2518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_num_submb_part = 1;
2528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Decoding the MV for the subMB */
2548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        for(uc_lx = 0; uc_lx < 2; uc_lx++)
2558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
2568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD8 u1_sub_mb_num = 0, u1_pred_mode, uc_i;
2578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD32 u4_mb_mc_mode_tmp = u4_mb_mc_mode;
2588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD32 u4_mb_pred_mode_tmp = u4_mb_pred_mode;
2598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD16 u2_sub_mb_num = 0x028A; // for sub mb case
2608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD8 u1_b2 = uc_lx << 1;
2618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u1_pred_mode = (uc_lx) ? PRED_L1 : PRED_L0;
2628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_mc_mode << 1);
2638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++)
2658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
2668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                UWORD8 u1_mb_mc_mode, uc_j;
2678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                UWORD8 i1_pred = u4_mb_pred_mode_tmp >> 24;
2688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                u1_mb_mc_mode = u4_mb_mc_mode_tmp >> 24;
2698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                u4_mb_pred_mode_tmp <<= 8;
2708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                u4_mb_mc_mode_tmp <<= 8;
2718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                /* subMb prediction mode */
2728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                if(u1_sub_mb)
2738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                {
2748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_mb_part_wd = pu1_sub_mb_partw[u1_mb_mc_mode];
2768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_mb_part_ht = pu1_sub_mb_parth[u1_mb_mc_mode];
2778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_sub_mb_num = u2_sub_mb_num >> 12;
2788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_num_submb_part = pu1_num_sub_mb_part[u1_mb_mc_mode];
2798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod
2808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                    + (u1_mb_mc_mode << 1);
2818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u2_sub_mb_num <<= 4;
2828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                }
2838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                for(uc_j = 0; uc_j < u1_num_submb_part;
2848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                uc_j++, pu1_top_left_sub_mb_indx++)
2858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                {
2868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    mv_pred_t * ps_mv;
2878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_sub_mb_num = u1_sub_mb_num + *pu1_top_left_sub_mb_indx;
2888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ps_mv = ps_mv_start + u1_sub_mb_num;
2898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /* Storing Info for partitions, writing only once */
2918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    if(uc_lx)
2928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    {
2938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_part->u1_is_direct = (!i1_pred);
2948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_part->u1_pred_mode = i1_pred;
2958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_part->u1_sub_mb_num = u1_sub_mb_num;
2968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_part->u1_partheight = u1_mb_part_ht;
2978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_part->u1_partwidth = u1_mb_part_wd;
2988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        /* Increment partition Index */
2998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        u1_p_idx++;
3008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_part++;
3018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    }
3028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    if(i1_pred & u1_pred_mode)
3048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    {
3058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        WORD16 i2_mvx, i2_mvy;
3068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S//inlining ih264d_sev
3088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        {
3098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
3108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            UWORD32 u4_word, u4_ldz, u4_abs_val;
3118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            /***************************************************************/
3138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            /* Find leading zeros in next 32 bits                          */
3148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            /***************************************************************/
3158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            NEXTBITS_32(u4_word, u4_bitstream_offset,
3168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        pu4_bitstrm_buf);
3178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            u4_ldz = CLZ(u4_word);
3188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            /* Flush the ps_bitstrm */
3208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            u4_bitstream_offset += (u4_ldz + 1);
3218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            /* Read the suffix from the ps_bitstrm */
3238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            u4_word = 0;
3248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            if(u4_ldz)
3258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                GETBITS(u4_word, u4_bitstream_offset,
3268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        pu4_bitstrm_buf, u4_ldz);
3278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            *pu4_bitstrm_ofst = u4_bitstream_offset;
3298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
3308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            if(u4_word & 0x1)
3328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                i2_mvx = (-(WORD32)u4_abs_val);
3338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            else
3348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                i2_mvx = (u4_abs_val);
3358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        }
3368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S//inlinined ih264d_sev
3378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S//inlining ih264d_sev
3398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        {
3408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
3418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            UWORD32 u4_word, u4_ldz, u4_abs_val;
3428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            /***************************************************************/
3448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            /* Find leading zeros in next 32 bits                          */
3458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            /***************************************************************/
3468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            NEXTBITS_32(u4_word, u4_bitstream_offset,
3478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        pu4_bitstrm_buf);
3488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            u4_ldz = CLZ(u4_word);
3498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            /* Flush the ps_bitstrm */
3518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            u4_bitstream_offset += (u4_ldz + 1);
3528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            /* Read the suffix from the ps_bitstrm */
3548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            u4_word = 0;
3558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            if(u4_ldz)
3568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                GETBITS(u4_word, u4_bitstream_offset,
3578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        pu4_bitstrm_buf, u4_ldz);
3588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            *pu4_bitstrm_ofst = u4_bitstream_offset;
3608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
3618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            if(u4_word & 0x1)
3638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                i2_mvy = (-(WORD32)u4_abs_val);
3648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            else
3658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                i2_mvy = (u4_abs_val);
3668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        }
3678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S//inlinined ih264d_sev
3688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        /* Storing Mv residuals */
3708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_mv->i2_mv[u1_b2] = i2_mvx;
3718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_mv->i2_mv[u1_b2 + 1] = i2_mvy;
3728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    }
3738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                }
3748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
3758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
3768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* write back to the scratch partition info */
3778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->ps_part = ps_part;
3788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_parse_mb_data->u1_num_part = u1_sub_mb ? u1_p_idx : u1_num_mb_part;
3798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
3818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    return OK;
3828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
3838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*!
3858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S **************************************************************************
3868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \if Function name : ParseMb_SubMb_PredBCab\endif
3878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
3888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \brief
3898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *    Implements sub_mb_pred() of 7.3.5.2. & mb_pred() of 7.3.5.1
3908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
3918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \return
3928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *    None.
3938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
3948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S **************************************************************************
3958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
3968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SWORD32 ih264d_parse_bmb_non_direct_cabac(dec_struct_t * ps_dec,
3988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                       dec_mb_info_t * ps_cur_mb_info,
3998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                       UWORD8 u1_mb_num,
4008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                       UWORD8 u1_num_mbsNby2)
4018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
4028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Loads from ps_dec */
4038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
4048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
4058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
4068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data
4078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    + u1_num_mbsNby2;
4088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
4098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* table pointer loads */
4108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    const UWORD8 * pu1_sub_mb_pred_modes = (UWORD8 *)(gau1_ih264d_submb_pred_modes)
4118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    + 4;
4128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    const UWORD8 (*pu1_mb_pred_modes)[32] =
4138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    (const UWORD8 (*)[32])gau1_ih264d_mb_pred_modes;
4148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    const UWORD8 *pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part;
4158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    const UWORD8 *pu1_sub_mb_mc_mode = (UWORD8 *)(gau1_ih264d_submb_mc_mode) + 4;
4168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
4178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    const UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
4188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info;
4198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD8 *pi1_ref_idx_l0 = &ps_parse_mb_data->i1_ref_idx[0][0];
4208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD8 *pi1_ref_idx_l1 = &ps_parse_mb_data->i1_ref_idx[1][0];
4218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 u1_dec_ref_l0, u1_dec_ref_l1;
4228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
4238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 u1_num_mb_part, u1_mb_mc_mode, u1_sub_mb, u1_mbpred_mode = 5
4248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    + u1_mb_type;
4258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 u4_mb_mc_mode = 0, u4_mb_pred_mode = 0;
4268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32 ret;
4278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
4288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    p_curr_ctxt->u1_mb_type = CAB_NON_BD16x16;
4298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    u1_sub_mb = !(u1_mb_type ^ B_8x8);
4308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
4318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
4328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
4338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 *pu1_num_ref_idx_lx_active =
4348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active;
4358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag;
4368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 u1_mbaff_field = (u1_mbaff & uc_field);
4378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_dec_ref_l0 = (pu1_num_ref_idx_lx_active[0] << u1_mbaff_field) - 1;
4388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_dec_ref_l1 = (pu1_num_ref_idx_lx_active[1] << u1_mbaff_field) - 1;
4398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
4408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
4418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(u1_sub_mb)
4428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
4438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 u1_colz = ((PRED_8x8) << 6);
4448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 uc_i;
4458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_mb_mc_mode = 0;
4468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_num_mb_part = 4;
4478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Reading the subMB type */
4488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        for(uc_i = 0; uc_i < 4; uc_i++)
4498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
4508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD8 u1_sub_mb_mode, u1_subMbPredModes;
4518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u1_sub_mb_mode = ih264d_parse_submb_type_cabac(
4528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            1, ps_cab_env, ps_bitstrm,
4538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            ps_dec->p_sub_mb_type_t);
4548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
4558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            if(u1_sub_mb_mode > 12)
4568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                return ERROR_SUB_MB_TYPE;
4578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
4588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u1_subMbPredModes = pu1_sub_mb_pred_modes[u1_sub_mb_mode];
4598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u4_mb_mc_mode = (u4_mb_mc_mode << 8) | pu1_sub_mb_mc_mode[u1_sub_mb_mode];
4608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u4_mb_pred_mode = (u4_mb_pred_mode << 8) | u1_subMbPredModes;
4618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            *pi1_ref_idx_l0++ =
4628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            (u1_subMbPredModes & PRED_L0) ? u1_dec_ref_l0 : -1;
4638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            *pi1_ref_idx_l1++ =
4648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            (u1_subMbPredModes & PRED_L1) ? u1_dec_ref_l1 : -1;
4658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
4668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* Storing collocated Mb and SubMb mode information */
4678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            *pu1_col_info++ =
4688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            (u1_colz | (pu1_sub_mb_mc_mode[u1_sub_mb_mode] << 4));
4698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            if(u1_sub_mb_mode != B_DIRECT_8x8)
4708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
4718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                if(u1_sub_mb_mode > B_BI_8x8)
4728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                {
4738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 0;
4748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                }
4758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
4768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            else if(!ps_dec->s_high_profile.u1_direct_8x8_inference_flag)
4778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
4788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 0;
4798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
4808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
4818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        pi1_ref_idx_l0 -= 4;
4828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        pi1_ref_idx_l1 -= 4;
4838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
4848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    else
4858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
4868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 u1_mb_pred_mode_part0 = pu1_mb_pred_modes[0][u1_mbpred_mode];
4878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 u1_mb_pred_mode_part1 = pu1_mb_pred_modes[1][u1_mbpred_mode];
4888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_mb_mc_mode = ps_cur_mb_info->u1_mb_mc_mode;
4898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_num_mb_part = pu1_num_mb_part[u1_mb_mc_mode];
4908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Storing collocated Mb and SubMb mode information */
4918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        *pu1_col_info++ = (u1_mb_mc_mode << 6);
4928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(u1_mb_mc_mode)
4938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            *pu1_col_info++ = (u1_mb_mc_mode << 6);
4948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_mb_mc_mode = u1_mb_mc_mode | (u1_mb_mc_mode << 8);
4958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_mb_mc_mode <<= 16;
4968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_mb_pred_mode = ((u1_mb_pred_mode_part0 << 8) | u1_mb_pred_mode_part1) << 16;
4978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
4988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        *pi1_ref_idx_l0++ = (u1_mb_pred_mode_part0 & PRED_L0) ? u1_dec_ref_l0 : -1;
4998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        *pi1_ref_idx_l0-- = (u1_mb_pred_mode_part1 & PRED_L0) ? u1_dec_ref_l0 : -1;
5008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        *pi1_ref_idx_l1++ = (u1_mb_pred_mode_part0 & PRED_L1) ? u1_dec_ref_l1 : -1;
5018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        *pi1_ref_idx_l1-- = (u1_mb_pred_mode_part1 & PRED_L1) ? u1_dec_ref_l1 : -1;
5028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
5038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
5048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        WORD8 *pi1_lft_cxt = ps_dec->pi1_left_ref_idx_ctxt_inc;
5058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        WORD8 *pi1_top_cxt = p_curr_ctxt->i1_ref_idx;
5068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
5078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ret = ih264d_parse_ref_idx_cabac(u1_num_mb_part, 0, u1_dec_ref_l0,
5088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                   u1_mb_mc_mode, pi1_ref_idx_l0, pi1_lft_cxt,
5098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                   pi1_top_cxt, ps_cab_env, ps_bitstrm,
5108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                   ps_dec->p_ref_idx_t);
5118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(ret != OK)
5128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            return ret;
5138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
5148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ret = ih264d_parse_ref_idx_cabac(u1_num_mb_part, 2, u1_dec_ref_l1,
5158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                   u1_mb_mc_mode, pi1_ref_idx_l1, pi1_lft_cxt,
5168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                   pi1_top_cxt, ps_cab_env, ps_bitstrm,
5178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                   ps_dec->p_ref_idx_t);
5188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(ret != OK)
5198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            return ret;
5208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
5218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Read MotionVectors */
5228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
5238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 *pu1_top_left_sub_mb_indx;
5248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 uc_j, uc_lx;
5258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 u1_mb_part_wd, u1_mb_part_ht;
5268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
5278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 *pu1_sub_mb_indx_mod =
5288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        (const UWORD8 *)gau1_ih264d_submb_indx_mod
5298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        + (u1_sub_mb * 6);
5308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 *pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw;
5318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 *pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth;
5328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 *pu1_num_sub_mb_part =
5338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        (const UWORD8 *)gau1_ih264d_num_submb_part;
5348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 *pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
5358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 *pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
5368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
5378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 u1_p_idx = 0;
5388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 u1_num_submb_part;
5398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        parse_part_params_t *ps_part;
5408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Initialisations */
5418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        mv_pred_t *ps_mv_start = ps_dec->ps_mv_cur + (u1_mb_num << 4);
5428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_part = ps_dec->ps_part;
5438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
5448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Default initialization for non subMb case */
5458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_mb_part_wd = pu1_mb_partw[u1_mb_mc_mode];
5468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_mb_part_ht = pu1_mb_parth[u1_mb_mc_mode];
5478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_num_submb_part = 1;
5488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
5498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Decoding the MV for the subMB */
5508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        for(uc_lx = 0; uc_lx < 2; uc_lx++)
5518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
5528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD8 u1_sub_mb_num = 0;
5538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD32 u4_mb_pred_mode_tmp = u4_mb_pred_mode;
5548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD32 u4_mb_mc_mode_tmp = u4_mb_mc_mode;
5558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD8 u1_mb_mc_mode_1, u1_pred_mode, uc_i;
5568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD16 u2_sub_mb_num = 0x028A;
5578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD8 u1_b2 = uc_lx << 1;
5588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u1_pred_mode = (uc_lx) ? PRED_L1 : PRED_L0;
5598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* Default for Cabac */
5608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_mc_mode << 1);
5618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++)
5628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
5638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
5648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                WORD8 i1_pred = (UWORD8)(u4_mb_pred_mode_tmp >> 24);
5658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                u1_mb_mc_mode_1 = (UWORD8)(u4_mb_mc_mode_tmp >> 24);
5668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                u4_mb_pred_mode_tmp <<= 8;
5678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                u4_mb_mc_mode_tmp <<= 8;
5688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
5698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                /* subMb prediction mode */
5708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                if(u1_sub_mb)
5718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                {
5728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_mb_part_wd = pu1_sub_mb_partw[u1_mb_mc_mode_1];
5738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_mb_part_ht = pu1_sub_mb_parth[u1_mb_mc_mode_1];
5748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_sub_mb_num = u2_sub_mb_num >> 12;
5758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_mc_mode_1 << 1);
5768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_num_submb_part = pu1_num_sub_mb_part[u1_mb_mc_mode_1];
5778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u2_sub_mb_num = u2_sub_mb_num << 4;
5788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                }
5798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
5808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                for(uc_j = 0; uc_j < u1_num_submb_part;
5818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                uc_j++, pu1_top_left_sub_mb_indx++)
5828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                {
5838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    mv_pred_t *ps_mv;
5848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_sub_mb_num = u1_sub_mb_num + *pu1_top_left_sub_mb_indx;
5858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ps_mv = ps_mv_start + u1_sub_mb_num;
5868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
5878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /* Storing Info for partitions, writing only once */
5888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    if(uc_lx)
5898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    {
5908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_part->u1_is_direct = (!i1_pred);
5918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_part->u1_pred_mode = i1_pred;
5928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_part->u1_sub_mb_num = u1_sub_mb_num;
5938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_part->u1_partheight = u1_mb_part_ht;
5948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_part->u1_partwidth = u1_mb_part_wd;
5958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
5968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        /* Increment partition Index */
5978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        u1_p_idx++;
5988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_part++;
5998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    }
6008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ih264d_get_mvd_cabac(u1_sub_mb_num, u1_b2, u1_mb_part_wd,
6028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                         u1_mb_part_ht,
6038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                         (UWORD8)(i1_pred & u1_pred_mode), ps_dec,
6048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                         ps_mv);
6058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                }
6068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
6078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
6088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* write back to the scratch partition info */
6098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->ps_part = ps_part;
6118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_parse_mb_data->u1_num_part = u1_sub_mb ? u1_p_idx : u1_num_mb_part;
6128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
6148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    return OK;
6168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
6178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*!
6198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S **************************************************************************
6208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \if Function name : ih264d_parse_bmb_cabac \endif
6218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
6228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \brief
6238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *    This function parses CABAC syntax of a B MB.
6248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
6258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \return
6268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *    0 on Success and Error code otherwise
6278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S **************************************************************************
6288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
6298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SWORD32 ih264d_parse_bmb_cabac(dec_struct_t * ps_dec,
6308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                              dec_mb_info_t * ps_cur_mb_info,
6318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                              UWORD8 u1_mb_num,
6328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                              UWORD8 u1_num_mbsNby2)
6338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
6348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 u1_cbp;
6358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    deblk_mb_t * ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_mb_num;
6368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    const UWORD8 *puc_mb_mc_mode = (const UWORD8 *)gau1_ih264d_mb_mc_mode;
6378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
6388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
6398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32 ret;
6418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 u1_Bdirect_tranform_read = 1;
6428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 1;
6438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_cur_mb_info->u1_mb_mc_mode = puc_mb_mc_mode[5 + u1_mb_type];
6458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
6478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_cur_deblk_mb->u1_mb_type |= D_B_SLICE;
6498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(u1_mb_type != B_DIRECT)
6508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
6518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ret = ih264d_parse_bmb_non_direct_cabac(ps_dec, ps_cur_mb_info, u1_mb_num,
6528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                          u1_num_mbsNby2);
6538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(ret != OK)
6548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            return ret;
6558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
6568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    else
6578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
6588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /************ STORING PARTITION INFO ***********/
6608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        parse_part_params_t * ps_part_info;
6618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_part_info = ps_dec->ps_part;
6628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_part_info->u1_is_direct = PART_DIRECT_16x16;
6638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_part_info->u1_sub_mb_num = 0;
6648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->ps_part++;
6658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        p_curr_ctxt->u1_mb_type = CAB_BD16x16;
6668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
6688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        memset(ps_dec->pi1_left_ref_idx_ctxt_inc, 0, 4);
6698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        MEMSET_16BYTES(p_curr_ctxt->u1_mv, 0);
6708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        memset(p_curr_ctxt->i1_ref_idx, 0, 4);
6718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* check whether transform8x8 u4_flag to be read or not */
6738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_Bdirect_tranform_read =
6748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_dec->s_high_profile.u1_direct_8x8_inference_flag;
6758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
6768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Read the Coded block pattern */
6788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    u1_cbp = (WORD8)ih264d_parse_ctx_cbp_cabac(ps_dec);
6798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    p_curr_ctxt->u1_cbp = u1_cbp;
6808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_cur_mb_info->u1_cbp = u1_cbp;
6818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(u1_cbp > 47)
6838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        return ERROR_CBP;
6848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    COPYTHECONTEXT("coded_block_pattern", u1_cbp);
6868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_cur_mb_info->u1_tran_form8x8 = 0;
6888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
6898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if((ps_dec->s_high_profile.u1_transform8x8_present) && (u1_cbp & (0xf))
6918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    && (ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag)
6928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    && (u1_Bdirect_tranform_read))
6938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
6948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_cur_mb_info->u1_tran_form8x8 = ih264d_parse_transform8x8flag_cabac(
6958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_dec, ps_cur_mb_info);
6968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
6978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
6988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
6998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
7008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
7018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    else
7028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
7038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        p_curr_ctxt->u1_transform8x8_ctxt = 0;
7048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
7058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    p_curr_ctxt->u1_intra_chroma_pred_mode = 0;
7078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
7088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
7098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Read mb_qp_delta */
7118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(u1_cbp)
7128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
7138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        WORD8 c_temp;
7148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &c_temp);
7158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(ret != OK)
7168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            return ret;
7178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        COPYTHECONTEXT("mb_qp_delta", c_temp);
7188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(c_temp)
7198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
7208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ret = ih264d_update_qp(ps_dec, c_temp);
7218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            if(ret != OK)
7228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                return ret;
7238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
7248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
7258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    else
7268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->i1_prev_mb_qp_delta = 0;
7278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, 0);
7298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(EXCEED_OFFSET(ps_dec->ps_bitstrm))
7308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        return ERROR_EOB_TERMINATE_T;
7318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    return OK;
7328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
7338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*!
7348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S **************************************************************************
7358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \if Function name : ih264d_parse_bmb_cavlc \endif
7368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
7378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \brief
7388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *    This function parses CAVLC syntax of a B MB.
7398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
7408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \return
7418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *    0 on Success and Error code otherwise
7428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S **************************************************************************
7438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
7448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SWORD32 ih264d_parse_bmb_cavlc(dec_struct_t * ps_dec,
7458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                              dec_mb_info_t * ps_cur_mb_info,
7468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                              UWORD8 u1_mb_num,
7478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                              UWORD8 u1_num_mbsNby2)
7488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
7498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 u4_cbp;
7508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    deblk_mb_t * ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_mb_num;
7518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
7528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 * pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
7538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
7548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    const UWORD8 *puc_mb_mc_mode = (const UWORD8 *)gau1_ih264d_mb_mc_mode;
7558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
7568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32 ret;
7588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 u1_Bdirect_tranform_read = 1;
7598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 1;
7608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_cur_mb_info->u1_tran_form8x8 = 0;
7618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
7628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
7648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_cur_mb_info->u1_mb_mc_mode = puc_mb_mc_mode[5 + u1_mb_type];
7668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_cur_deblk_mb->u1_mb_type |= D_B_SLICE;
7688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(u1_mb_type != B_DIRECT)
7698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
7708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ret = ih264d_parse_bmb_non_direct_cavlc(ps_dec, ps_cur_mb_info, u1_mb_num,
7718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                          u1_num_mbsNby2);
7728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(ret != OK)
7738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            return ret;
7748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
7758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    else
7768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
7778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /************ STORING PARTITION INFO ***********/
7788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        parse_part_params_t * ps_part_info;
7798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_part_info = ps_dec->ps_part;
7808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_part_info->u1_is_direct = PART_DIRECT_16x16;
7818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_part_info->u1_sub_mb_num = 0;
7828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->ps_part++;
7838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* check whether transform8x8 u4_flag to be read or not */
7848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_Bdirect_tranform_read =
7858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_dec->s_high_profile.u1_direct_8x8_inference_flag;
7868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
7878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Read the Coded block pattern */
7898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
7908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        const UWORD8 * puc_CbpInter = gau1_ih264d_cbp_inter;
7918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S//Inlined ih264d_uev
7928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
7938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD32 u4_word, u4_ldz;
7948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
7958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /***************************************************************/
7968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Find leading zeros in next 32 bits                          */
7978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /***************************************************************/
7988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
7998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_ldz = CLZ(u4_word);
8008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Flush the ps_bitstrm */
8018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_bitstream_offset += (u4_ldz + 1);
8028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Read the suffix from the ps_bitstrm */
8038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_word = 0;
8048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(u4_ldz)
8058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
8068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        *pu4_bitstrm_ofst = u4_bitstream_offset;
8078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_cbp = ((1 << u4_ldz) + u4_word - 1);
8088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S//Inlined ih264d_uev
8098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(u4_cbp > 47)
8108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            return ERROR_CBP;
8118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_cbp = puc_CbpInter[u4_cbp];
8128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if((ps_dec->s_high_profile.u1_transform8x8_present) && (u4_cbp & (0xf))
8148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        && (ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag)
8158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        && (u1_Bdirect_tranform_read))
8168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
8178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm);
8188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
8198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
8208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
8218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
8238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    COPYTHECONTEXT("coded_block_pattern", u4_cbp);
8258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_cur_mb_info->u1_cbp = u4_cbp;
8268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Read mb_qp_delta */
8288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(u4_cbp)
8298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
8308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        WORD32 i_temp;
8318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S//inlining ih264d_sev
8328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
8348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD32 u4_word, u4_ldz, u4_abs_val;
8358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /***************************************************************/
8378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Find leading zeros in next 32 bits                          */
8388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /***************************************************************/
8398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
8408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_ldz = CLZ(u4_word);
8418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Flush the ps_bitstrm */
8438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_bitstream_offset += (u4_ldz + 1);
8448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Read the suffix from the ps_bitstrm */
8468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_word = 0;
8478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(u4_ldz)
8488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
8498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        *pu4_bitstrm_ofst = u4_bitstream_offset;
8518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
8528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(u4_word & 0x1)
8548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            i_temp = (-(WORD32)u4_abs_val);
8558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        else
8568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            i_temp = (u4_abs_val);
8578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(i_temp < -26 || i_temp > 25)
8598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            return ERROR_INV_RANGE_QP_T;
8608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S//inlinined ih264d_sev
8618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        COPYTHECONTEXT("mb_qp_delta", i_temp);
8628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(i_temp)
8638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
8648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ret = ih264d_update_qp(ps_dec, (WORD8)i_temp);
8658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            if(ret != OK)
8668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                return ret;
8678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
8688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info, 0);
8708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(ret != OK)
8718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            return ret;
8728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(EXCEED_OFFSET(ps_bitstrm))
8738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            return ERROR_EOB_TERMINATE_T;
8748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
8758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    else
8768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
8778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->i1_prev_mb_qp_delta = 0;
8788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
8798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
8808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    return OK;
8828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
8838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SWORD32 ih264d_mv_pred_ref_tfr_nby2_bmb(dec_struct_t * ps_dec,
8858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                     UWORD8 u1_mb_idx,
8868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                     UWORD8 u1_num_mbs)
8878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
8888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    parse_pmbarams_t * ps_mb_part_info;
8898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    parse_part_params_t * ps_part;
8908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    mv_pred_t *ps_mv_nmb, *ps_mv_nmb_start, *ps_mv_ntop, *ps_mv_ntop_start;
8918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    pic_buffer_t * ps_ref_frame;
8928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 u1_direct_mode_width;
8938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 i, j;
8948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    dec_mb_info_t * ps_cur_mb_info;
8958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
8968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 u1_field;
8978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32 ret = 0;
8988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
8998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_dec->i4_submb_ofst -= (u1_num_mbs - u1_mb_idx) << 4;
9008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_mb_part_info = ps_dec->ps_parse_mb_data;
9018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_part = ps_dec->ps_parse_part_params;
9028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* N/2 Mb MvPred and Transfer Setup Loop */
9048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    for(i = u1_mb_idx; i < u1_num_mbs; i++, ps_mb_part_info++)
9058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
9068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 u1_colz = 0;
9078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
9088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Restore the slice scratch MbX and MbY context */
9098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_cur_mb_info = ps_dec->ps_nmb_info + i;
9108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->u2_wait_id = i;
9118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u1_field = ps_cur_mb_info->u1_mb_field_decodingflag;
9138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_mv_nmb_start = ps_dec->ps_mv_cur + (i << 4);
9158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx;
9168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->u2_mby = ps_cur_mb_info->u2_mby;
9178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->u1_currB_type = 0;
9188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->u2_mv_2mb[i & 0x1] = 0;
9198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Look for MV Prediction and Reference Transfer in Non-I Mbs */
9218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(!ps_mb_part_info->u1_isI_mb)
9228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
9238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD8 u1_blk_no;
9248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            WORD16 i1_ref_idx, i1_ref_idx1;
9258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD8 u1_pred_mode;
9268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD8 u1_sub_mb_x, u1_sub_mb_y, u1_sub_mb_num;
9278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD8 u1_lx, u1_lx_start, u1_lxend, u1_tmp_lx;
9288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD8 u1_num_part, u1_num_ref, u1_wd, u1_ht;
9298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD32 *pu4_wt_offst;
9308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD8 u1_scale_ref, u4_bot_mb;
9318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            deblk_mb_t * ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + i;
9328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            WORD8 (*pi1_ref_idx)[MAX_REFIDX_INFO_PER_MB] =
9338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            ps_mb_part_info->i1_ref_idx;
9348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            WORD8 *pi1_ref_idx0 = pi1_ref_idx[0],
9358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            *pi1_ref_idx1 = pi1_ref_idx[1];
9368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD32 **ppu4_wt_ofst = ps_mb_part_info->pu4_wt_offst;
9378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* MB Level initialisations */
9398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_dec->u4_num_pmbair = i >> u1_mbaff;
9408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_dec->u1_mb_idx_mv = i;
9418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* CHANGED CODE */
9438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_mv_ntop_start = ps_mv_nmb_start
9448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            - (ps_dec->u2_frm_wd_in_mbs << (4 + u1_mbaff)) + 12;
9458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u1_num_part = ps_mb_part_info->u1_num_part;
9478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_cur_deblk_mb->u1_mb_type |= (u1_num_part > 1) << 1;
9488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u1_direct_mode_width = (1 == ps_mb_part_info->u1_num_part) ? 16 : 8;
9498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_cur_mb_info->u4_pred_info_pkd_idx = ps_dec->u4_pred_info_pkd_idx;
9528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_cur_mb_info->u1_num_pred_parts = 0;
9538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /****************************************************/
9558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* weighted u4_ofst pointer calculations, this loop  */
9568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* runs maximum 4 times, even in direct cases       */
9578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /****************************************************/
9588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u1_scale_ref = u1_mbaff & ps_cur_mb_info->u1_mb_field_decodingflag;
9598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u4_bot_mb = 1 - ps_cur_mb_info->u1_topmb;
9608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            if(ps_dec->ps_cur_pps->u1_wted_bipred_idc)
9618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
9628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                u1_num_ref = MIN(u1_num_part, 4);
9638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                if(PART_DIRECT_16x16 != ps_part->u1_is_direct)
9648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                {
9658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    for(u1_blk_no = 0; u1_blk_no < u1_num_ref; u1_blk_no++)
9668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    {
9678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        i1_ref_idx = MAX(pi1_ref_idx0[u1_blk_no], 0);
9688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        if(u1_scale_ref)
9698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            i1_ref_idx >>= 1;
9708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        i1_ref_idx *=
9718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
9728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        if(u1_scale_ref)
9738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            i1_ref_idx +=
9748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                            (MAX(pi1_ref_idx1[u1_blk_no], 0)
9758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                            >> 1);
9768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        else
9778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            i1_ref_idx += MAX(pi1_ref_idx1[u1_blk_no], 0);
9788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        pu4_wt_offst = (UWORD32*)&ps_dec->pu4_wt_ofsts[2
9798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        * X3(i1_ref_idx)];
9808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        if(pi1_ref_idx0[u1_blk_no] < 0)
9828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            pu4_wt_offst += 1;
9838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
9848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ppu4_wt_ofst[u1_blk_no] = pu4_wt_offst;
9858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        if(u1_scale_ref
9868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        && (ps_dec->ps_cur_pps->u1_wted_bipred_idc
9878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                        == 2))
9888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        {
9898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            i1_ref_idx = MAX(pi1_ref_idx0[u1_blk_no], 0);
9908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            i1_ref_idx *=
9918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                            (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
9928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                            << 1);
9938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            i1_ref_idx += MAX(pi1_ref_idx1[u1_blk_no], 0);
9948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            if(u4_bot_mb)
9958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            {
9968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                i1_ref_idx +=
9978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]
9988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                                << 1)
9998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                                * (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
10008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                                                << 1);
10018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            }
10028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            pu4_wt_offst = (UWORD32*)&ps_dec->pu4_mbaff_wt_mat[2
10038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                            * X3(i1_ref_idx)];
10048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            ppu4_wt_ofst[u1_blk_no] = pu4_wt_offst;
10058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        }
10068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    }
10078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                }
10088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
10098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /**************************************************/
10118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* Loop on Partitions                             */
10128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* direct mode is reflected as a single partition */
10138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /**************************************************/
10148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            for(j = 0; j < u1_num_part; j++, ps_part++)
10158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
10168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                u1_sub_mb_num = ps_part->u1_sub_mb_num;
10178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ps_dec->u1_sub_mb_num = u1_sub_mb_num;
10188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                if(PART_NOT_DIRECT != ps_part->u1_is_direct)
10208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                {
10218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /**************************************************/
10228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /* Direct Mode, Call DecodeSpatial/TemporalDirect */
10238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /* only (those will in turn call FormMbPartInfo)  */
10248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /**************************************************/
10258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ret = ps_dec->ps_cur_slice->pf_decodeDirect(ps_dec,
10268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                                u1_direct_mode_width,
10278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                                ps_cur_mb_info, i);
10288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    if(ret != OK)
10298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        return ret;
10308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ps_cur_deblk_mb->u1_mb_type |= (ps_dec->u1_currB_type << 1);
10318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                }
10338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                else
10348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                {
10358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    mv_pred_t s_mvPred;
10368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /**************************************************/
10378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /* Non Direct Mode, Call Motion Vector Predictor  */
10388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /* and FormMbpartInfo                             */
10398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /**************************************************/
10408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_sub_mb_x = u1_sub_mb_num & 0x03;
10418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_sub_mb_y = u1_sub_mb_num >> 2;
10428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_blk_no =
10438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                    (u1_num_part < 4) ?
10448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                    j :
10458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                    (((u1_sub_mb_y >> 1) << 1)
10468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                                    + (u1_sub_mb_x
10478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                                                    >> 1));
10488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ps_mv_ntop = ps_mv_ntop_start + u1_sub_mb_x;
10508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ps_mv_nmb = ps_mv_nmb_start + u1_sub_mb_num;
10518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_pred_mode = ps_part->u1_pred_mode;
10538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_wd = ps_part->u1_partwidth;
10548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_ht = ps_part->u1_partheight;
10558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_lx_start = 0;
10578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u1_lxend = 2;
10588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    if( PRED_L0 == u1_pred_mode)
10598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    {
10608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        s_mvPred.i2_mv[2] = 0;
10618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        s_mvPred.i2_mv[3] = 0;
10628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        u1_lxend = 1;
10638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    }
10648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    if( PRED_L1 == u1_pred_mode)
10658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    {
10668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        s_mvPred.i2_mv[0] = 0;
10678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        s_mvPred.i2_mv[1] = 0;
10688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        u1_lx_start = 1;
10698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    }
10708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /* Populate the colpic info and reference frames */
10728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    s_mvPred.i1_ref_frame[0] = pi1_ref_idx0[u1_blk_no];
10738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    s_mvPred.i1_ref_frame[1] = pi1_ref_idx1[u1_blk_no];
10748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, ps_mv_nmb, ps_mv_ntop,
10768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                      &s_mvPred, u1_sub_mb_num, u1_wd,
10778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                      u1_lx_start, u1_lxend,
10788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                      ps_cur_mb_info->u1_mb_mc_mode);
10798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /**********************************************************/
10818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /* Loop on number of predictors, 1 Each for Forw Backw    */
10828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /* Loop 2 times for BiDirect mode                         */
10838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /**********************************************************/
10848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    for(u1_lx = u1_lx_start; u1_lx < u1_lxend; u1_lx++)
10858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    {
10868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        WORD16 i2_mv_x, i2_mv_y;
10878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        /********************************************************/
10898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        /* Predict Mv                                           */
10908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        /* Add Mv Residuals and store back                      */
10918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        /********************************************************/
10928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        i1_ref_idx = s_mvPred.i1_ref_frame[u1_lx];
10938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        u1_tmp_lx = (u1_lx << 1);
10948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        i2_mv_x = ps_mv_nmb->i2_mv[u1_tmp_lx];
10968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        i2_mv_y = ps_mv_nmb->i2_mv[u1_tmp_lx + 1];
10978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
10988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        i2_mv_x += s_mvPred.i2_mv[u1_tmp_lx];
10998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        i2_mv_y += s_mvPred.i2_mv[u1_tmp_lx + 1];
11008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        s_mvPred.i2_mv[u1_tmp_lx] = i2_mv_x;
11018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        s_mvPred.i2_mv[u1_tmp_lx + 1] = i2_mv_y;
11028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        /********************************************************/
11048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        /* Transfer setup call                                  */
11058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        /* convert RefIdx if it is MbAff                        */
11068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        /* Pass Weight Offset and refFrame                      */
11078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        /********************************************************/
11088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        i1_ref_idx1 = i1_ref_idx >> u1_scale_ref;
11098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        if(u1_scale_ref && ((i1_ref_idx & 0x01) != u4_bot_mb))
11108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            i1_ref_idx1 += MAX_REF_BUFS;
11118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_ref_frame =
11128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        ps_dec->ps_ref_pic_buf_lx[u1_lx][i1_ref_idx1];
11138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        /* Storing Colocated-Zero u4_flag */
11158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        if(u1_lx == u1_lx_start)
11168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        {
11178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            /* Fill colocated info in MvPred structure */
11188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            s_mvPred.u1_col_ref_pic_idx =
11198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                            ps_ref_frame->u1_mv_buf_id;
11208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            s_mvPred.u1_pic_type = ps_ref_frame->u1_pic_type;
11218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            /* Calculating colocated zero information */
11238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            u1_colz =
11248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                            (u1_field << 1)
11258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                            | ((i1_ref_idx == 0)
11268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                                            && (ABS(i2_mv_x)
11278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                                                            <= 1)
11288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                                            && (ABS(i2_mv_y)
11298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                                                            <= 1));
11308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            u1_colz |= ps_mb_part_info->u1_col_info[u1_blk_no];
11318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        }
11328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        pu4_wt_offst = ppu4_wt_ofst[u1_blk_no];
11348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        {
11358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            pred_info_pkd_t *ps_pred_pkd;
11368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                           WORD16 i2_mv[2];
11378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                           i2_mv[0] = i2_mv_x;
11398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                           i2_mv[1] = i2_mv_y;
11408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                           ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
11428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ih264d_fill_pred_info(i2_mv,u1_wd,u1_ht,u1_sub_mb_num,u1_pred_mode,
11438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        ps_pred_pkd,ps_ref_frame->u1_pic_buf_id,i1_ref_idx,pu4_wt_offst,
11448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        ps_ref_frame->u1_pic_type);
11458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_dec->u4_pred_info_pkd_idx++;
11468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ps_cur_mb_info->u1_num_pred_parts++;
11478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        }
11508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    }
11528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb,
11538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                       u1_sub_mb_num, u1_colz, u1_ht,
11548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                       u1_wd);
11558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                }
11568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
11578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
11598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        else
11608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
11618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* Set zero values in case of Intra Mbs */
11628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            mv_pred_t s_mvPred =
11638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                {
11648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    { 0, 0, 0, 0 },
11658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                      { -1, -1 }, 0, 0};
11668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            /* Storing colocated zero information */
11678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
11688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                               (UWORD8)(u1_field << 1), 4, 4);
11698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
11708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
11718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /*if num _cores is set to 3 ,compute bs will be done in another thread*/
11728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(ps_dec->u4_num_cores < 3)
11738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
11748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            if(ps_dec->u4_app_disable_deblk_frm == 0)
11758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ps_dec->pf_compute_bs(ps_dec, ps_cur_mb_info,
11768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                     (UWORD16)(i >> u1_mbaff));
11778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
11788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
11798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    return OK;
11808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
11818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*!
11828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S **************************************************************************
11838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \if Function name : ih264d_get_implicit_weights \endif
11848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
11858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \brief
11868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *    Calculates Implicit Weights.
11878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
11888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \return
11898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *    None
11908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
11918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S **************************************************************************
11928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
11938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264d_get_implicit_weights(dec_struct_t *ps_dec)
11948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
11958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 *pu4_iwt_ofst;
11968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 i, j;
11978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    struct pic_buffer_t *ps_pic_buff0, *ps_pic_buff1;
11988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD16 i2_dist_scale_factor;
11998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD16 i16_tb, i16_td, i16_tx;
12008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 u4_poc0, u4_poc1;
12018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 ui_temp0, ui_temp1;
12028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 uc_num_ref_idx_l0_active, uc_num_ref_idx_l1_active;
12038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
12048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    pu4_iwt_ofst = ps_dec->pu4_wts_ofsts_mat;
12058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    uc_num_ref_idx_l0_active =
12068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
12078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    uc_num_ref_idx_l1_active =
12088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
12098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
12108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    for(i = 0; i < uc_num_ref_idx_l0_active; i++)
12118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
12128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][i];
12138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_poc0 = ps_pic_buff0->i4_avg_poc;
12148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        for(j = 0; j < uc_num_ref_idx_l1_active; j++)
12158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
12168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][j];
12178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u4_poc1 = ps_pic_buff1->i4_avg_poc;
12188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
12198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            if(u4_poc1 != u4_poc0)
12208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
12218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                i16_tb = ps_dec->ps_cur_pic->i4_poc - u4_poc0;
12228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                i16_tb = CLIP3(-128, 127, i16_tb);
12238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                i16_td = u4_poc1 - u4_poc0;
12248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                i16_td = CLIP3(-128, 127, i16_td);
12258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                i16_tx = (16384 + ABS(SIGN_POW2_DIV(i16_td, 1))) / i16_td;
12268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                i2_dist_scale_factor = CLIP3(-1024, 1023,
12278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                            (((i16_tb * i16_tx) + 32) >> 6));
12288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
12298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                if(/*((u4_poc1 - u4_poc0) == 0) ||*/
12308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                (!(ps_pic_buff1->u1_is_short && ps_pic_buff0->u1_is_short))
12318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                || ((i2_dist_scale_factor >> 2) < -64)
12328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                || ((i2_dist_scale_factor >> 2) > 128))
12338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                {
12348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /* same for forward and backward, wt=32 and Offset = 0 */
12358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ui_temp0 = 0x00000020;
12368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ui_temp1 = 0x00000020;
12378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                }
12388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                else
12398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                {
12408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ui_temp0 = 64 - (i2_dist_scale_factor >> 2);
12418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ui_temp1 = (i2_dist_scale_factor >> 2);
12428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                }
12438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
12448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            else
12458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
12468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ui_temp0 = 0x00000020;
12478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ui_temp1 = 0x00000020;
12488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
12498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            pu4_iwt_ofst[0] = pu4_iwt_ofst[2] = pu4_iwt_ofst[4] = ui_temp0;
12508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            pu4_iwt_ofst[1] = pu4_iwt_ofst[3] = pu4_iwt_ofst[5] = ui_temp1;
12518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            pu4_iwt_ofst += 6;
12528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
12538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
12548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
12558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
12568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 k;
12578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        WORD32 i4_cur_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
12588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD32* pu4_wt_mat = ps_dec->pu4_mbaff_wt_mat;
12598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Form the Implicit Weighted prediction matrix for field MBs also */
12608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        for(k = 0; k < 2; k++)
12618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
12628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            for(i = 0; i < (uc_num_ref_idx_l0_active << 1); i++)
12638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
12648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                UWORD16 u2_l0_idx;
12658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
12668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                /*u2_l0_idx = (i >= uc_num_ref_idx_l0_active)
12678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                 ?(MAX_REF_BUFS + i - uc_num_ref_idx_l0_active) : (i) ;*/
12688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
12698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                u2_l0_idx = i >> 1;
12708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                if((i & 0x01) != k)
12718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                {
12728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u2_l0_idx += MAX_REF_BUFS;
12738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                }
12748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][u2_l0_idx];
12758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                u4_poc0 = ps_pic_buff0->i4_poc;
12768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                for(j = 0; j < (uc_num_ref_idx_l1_active << 1); j++)
12778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                {
12788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    UWORD16 u2_l1_idx;
12798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /*u2_l1_idx = (j >= uc_num_ref_idx_l1_active)
12808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                     ? (MAX_REF_BUFS + j - uc_num_ref_idx_l1_active ) : (j) ;*/
12818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
12828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u2_l1_idx = j >> 1;
12838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    if((j & 0x01) != k)
12848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    {
12858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        u2_l1_idx += MAX_REF_BUFS;
12868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    }
12878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][u2_l1_idx];
12888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    u4_poc1 = ps_pic_buff1->i4_poc;
12898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    if(u4_poc1 != u4_poc0)
12908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    {
12918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        i16_tb = i4_cur_poc - u4_poc0;
12928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        i16_tb = CLIP3(-128, 127, i16_tb);
12938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        i16_td = u4_poc1 - u4_poc0;
12948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        i16_td = CLIP3(-128, 127, i16_td);
12958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        i16_tx = (16384 + ABS(SIGN_POW2_DIV(i16_td, 1)))
12968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        / i16_td;
12978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        i2_dist_scale_factor = CLIP3(
12988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        -1024, 1023,
12998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        (((i16_tb * i16_tx) + 32) >> 6));
13008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
13018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        if(/*((u4_poc1 - u4_poc0) == 0) ||*/
13028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        (!(ps_pic_buff1->u1_is_short && ps_pic_buff0->u1_is_short))
13038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        || ((i2_dist_scale_factor >> 2) < -64)
13048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                        || ((i2_dist_scale_factor >> 2) > 128))
13058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        {
13068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            /* same for forward and backward, wt=32 and Offset = 0 */
13078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            ui_temp0 = 0x00000020;
13088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            ui_temp1 = 0x00000020;
13098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        }
13108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        else
13118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        {
13128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            ui_temp0 = 64 - (i2_dist_scale_factor >> 2);
13138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            ui_temp1 = (i2_dist_scale_factor >> 2);
13148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        }
13158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    }
13168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    else
13178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    {
13188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ui_temp0 = 0x00000020;
13198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ui_temp1 = 0x00000020;
13208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    }
13218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    /* Store in the weight matrix */
13228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    *pu4_wt_mat++ = ui_temp0;
13238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    *pu4_wt_mat++ = ui_temp1;
13248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    *pu4_wt_mat++ = ui_temp0;
13258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    *pu4_wt_mat++ = ui_temp1;
13268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    *pu4_wt_mat++ = ui_temp0;
13278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    *pu4_wt_mat++ = ui_temp1;
13288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
13298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                }
13308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
13318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            i4_cur_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
13328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
13338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
13348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
13358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
13368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*!
13378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S **************************************************************************
13388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \if Function name : ih264d_decode_bslice \endif
13398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
13408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \brief
13418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *    Decodes a B Slice
13428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
13438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
13448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \return
13458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *    0 on Success and Error code otherwise
13468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S **************************************************************************
13478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
13488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SWORD32 ih264d_parse_bslice(dec_struct_t * ps_dec, UWORD16 u2_first_mb_in_slice)
13498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
13508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    dec_pic_params_t * ps_pps = ps_dec->ps_cur_pps;
13518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    dec_slice_params_t * ps_slice = ps_dec->ps_cur_slice;
13528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
13538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8 u1_ref_idx_re_flag_lx;
13548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
13558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
13568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
13578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 u4_temp, ui_temp1;
13588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32 i_temp;
13598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32 ret;
13608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
13618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /*--------------------------------------------------------------------*/
13628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Read remaining contents of the slice header                        */
13638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /*--------------------------------------------------------------------*/
13648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
13658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        WORD8 *pi1_buf;
13668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv;
13678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        WORD32 *pi4_mv = (WORD32*)pi2_mv;
13688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        WORD16 *pi16_refFrame;
13698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame;
13708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        pi16_refFrame = (WORD16*)pi1_buf;
13718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        *pi4_mv = 0;
13728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        *(pi4_mv + 1) = 0;
13738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        *pi16_refFrame = OUT_OF_RANGE_REF;
13748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8)-1;
13758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8)-1;
13768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
13778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
13788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264(
13798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ps_bitstrm);
13808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    COPYTHECONTEXT("SH: num_ref_idx_override_flag",
13818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ps_slice->u1_num_ref_idx_active_override_flag);
13828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
13838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    u4_temp = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0];
13848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ui_temp1 = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[1];
13858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(ps_slice->u1_num_ref_idx_active_override_flag)
13868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
13878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_temp = 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
13888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        COPYTHECONTEXT("SH: num_ref_idx_l0_active_minus1",
13898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        u4_temp - 1);
13908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ui_temp1 = 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
13918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        COPYTHECONTEXT("SH: num_ref_idx_l1_active_minus1",
13928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        ui_temp1 - 1);
13938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
13948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
13958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
13968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        UWORD8 u1_max_ref_idx = MAX_FRAMES;
13978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(ps_slice->u1_field_pic_flag)
13988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
13998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            u1_max_ref_idx = MAX_FRAMES << 1;
14008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
1401208c74d62a3e1039dc87818306e057877760fbaaHamsalekha S        if((u4_temp > u1_max_ref_idx) || (ui_temp1 > u1_max_ref_idx)
1402208c74d62a3e1039dc87818306e057877760fbaaHamsalekha S                        || (u4_temp < 1) || (ui_temp1 < 1))
14038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
14048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            return ERROR_NUM_REF;
14058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
14068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_slice->u1_num_ref_idx_lx_active[0] = u4_temp;
14078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_slice->u1_num_ref_idx_lx_active[1] = ui_temp1;
14088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
14098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1410f9d3f9af8fc113acda28e1a4e48d85736ee29c75Hamsalekha S
1411f9d3f9af8fc113acda28e1a4e48d85736ee29c75Hamsalekha S    ih264d_init_ref_idx_lx_b(ps_dec);
14128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Store the value for future slices in the same picture */
14138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_dec->u1_num_ref_idx_lx_active_prev =
14148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
14158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
14168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    u1_ref_idx_re_flag_lx = ih264d_get_bit_h264(ps_bitstrm);
14178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l0",u1_ref_idx_re_flag_lx);
14188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
14198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Modified temporarily */
14208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(u1_ref_idx_re_flag_lx)
14218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
14228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        WORD8 ret;
14238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
14248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ret = ih264d_ref_idx_reordering(ps_dec, 0);
14258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(ret == -1)
14268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            return ERROR_REFIDX_ORDER_T;
14278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
14288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    else
14298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0];
14308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
14318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    u1_ref_idx_re_flag_lx = ih264d_get_bit_h264(ps_bitstrm);
14328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l1",u1_ref_idx_re_flag_lx);
14338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
14348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Modified temporarily */
14358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(u1_ref_idx_re_flag_lx)
14368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
14378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        WORD8 ret;
14388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->ps_ref_pic_buf_lx[1] = ps_dec->ps_dpb_mgr->ps_mod_dpb[1];
14398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ret = ih264d_ref_idx_reordering(ps_dec, 1);
14408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(ret == -1)
14418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            return ERROR_REFIDX_ORDER_T;
14428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
14438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    else
14448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->ps_ref_pic_buf_lx[1] = ps_dec->ps_dpb_mgr->ps_init_dpb[1];
14458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
14468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Create refIdx to POC mapping */
14478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
14488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        void **ppv_map_ref_idx_to_poc_lx;
14498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        WORD8 idx;
14508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        struct pic_buffer_t *ps_pic;
14518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
14528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ppv_map_ref_idx_to_poc_lx = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0;
14538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ppv_map_ref_idx_to_poc_lx[0] = 0;
14548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ppv_map_ref_idx_to_poc_lx++;
14558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        for(idx = 0; idx < ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
14568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        idx++)
14578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
14588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
14598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ppv_map_ref_idx_to_poc_lx[idx] = (ps_pic->pu1_buf1);
14608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
14618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
14628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ppv_map_ref_idx_to_poc_lx = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1;
14638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
14648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ppv_map_ref_idx_to_poc_lx[0] = 0;
14658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ppv_map_ref_idx_to_poc_lx++;
14668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        for(idx = 0; idx < ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
14678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                        idx++)
14688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
14698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_pic = ps_dec->ps_ref_pic_buf_lx[1][idx];
14708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ppv_map_ref_idx_to_poc_lx[idx] = (ps_pic->pu1_buf1);
14718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
14728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
14738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
14748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
14758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            void **ppv_map_ref_idx_to_poc_lx_t, **ppv_map_ref_idx_to_poc_lx_b;
14768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
14778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc
14788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            + TOP_LIST_FLD_L0;
14798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc
14808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            + BOT_LIST_FLD_L0;
14818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
14828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ppv_map_ref_idx_to_poc_lx_t[0] = 0;
14838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ppv_map_ref_idx_to_poc_lx_t++;
14848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ppv_map_ref_idx_to_poc_lx_b[0] = 0;
14858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ppv_map_ref_idx_to_poc_lx_b++;
14868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            for(idx = 0; idx < ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
14878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            idx++)
14888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
14898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
14908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ppv_map_ref_idx_to_poc_lx_t[0] = (ps_pic->pu1_buf1);
14918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ppv_map_ref_idx_to_poc_lx_b[1] = (ps_pic->pu1_buf1);
14928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
14938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ppv_map_ref_idx_to_poc_lx_b[0] = (ps_pic->pu1_buf1) + 1;
14948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ppv_map_ref_idx_to_poc_lx_t[1] = (ps_pic->pu1_buf1) + 1;
14958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
14968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ppv_map_ref_idx_to_poc_lx_t += 2;
14978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ppv_map_ref_idx_to_poc_lx_b += 2;
14988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
14998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
15008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc
15018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            + TOP_LIST_FLD_L1;
15028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc
15038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            + BOT_LIST_FLD_L1;
15048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
15058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ppv_map_ref_idx_to_poc_lx_t[0] = 0;
15068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ppv_map_ref_idx_to_poc_lx_t++;
15078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ppv_map_ref_idx_to_poc_lx_b[0] = 0;
15088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ppv_map_ref_idx_to_poc_lx_b++;
15098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            for(idx = 0; idx < ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
15108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            idx++)
15118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
15128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                UWORD8 u1_tmp_idx = idx << 1;
15138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ps_pic = ps_dec->ps_ref_pic_buf_lx[1][idx];
15148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ppv_map_ref_idx_to_poc_lx_t[u1_tmp_idx] = (ps_pic->pu1_buf1);
15158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ppv_map_ref_idx_to_poc_lx_b[u1_tmp_idx + 1] = (ps_pic->pu1_buf1);
15168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
15178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ppv_map_ref_idx_to_poc_lx_b[u1_tmp_idx] = (ps_pic->pu1_buf1) + 1;
15188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                ppv_map_ref_idx_to_poc_lx_t[u1_tmp_idx + 1] = (ps_pic->pu1_buf1) + 1;
15198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
15208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
15218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
15228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
15238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(ps_dec->u4_num_cores >= 3)
15248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
15258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            WORD32 num_entries;
15268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            WORD32 size;
15278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
15288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            num_entries = MIN(MAX_FRAMES, ps_dec->u4_num_ref_frames_at_init);
15298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            num_entries = 2 * ((2 * num_entries) + 1);
15308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
15318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            size = num_entries * sizeof(void *);
15328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            size += PAD_MAP_IDX_POC * sizeof(void *);
15338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
15348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            memcpy((void *)ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc,
15358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S               ps_dec->ppv_map_ref_idx_to_poc,
15368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S               size);
15378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
15388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
15398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
15408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
15418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag
15428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    && (ps_dec->ps_cur_slice->u1_field_pic_flag == 0))
15438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
15448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ih264d_convert_frm_mbaff_list(ps_dec);
15458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
15468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
15478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(ps_pps->u1_wted_bipred_idc == 1)
15488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
15498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ret = ih264d_parse_pred_weight_table(ps_slice, ps_bitstrm);
15508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(ret != OK)
15518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            return ret;
15528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ih264d_form_pred_weight_matrix(ps_dec);
15538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
15548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
15558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    else if(ps_pps->u1_wted_bipred_idc == 2)
15568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
15578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        /* Implicit Weighted prediction */
15588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_slice->u2_log2Y_crwd = 0x0505;
15598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
15608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ih264d_get_implicit_weights(ps_dec);
15618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
15628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    else
15638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->ps_cur_slice->u2_log2Y_crwd = 0;
15648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
15658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_dec->ps_parse_cur_slice->u2_log2Y_crwd =
15668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    ps_dec->ps_cur_slice->u2_log2Y_crwd;
15678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
15688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* G050 */
15698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(ps_slice->u1_nal_ref_idc != 0)
15708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
15718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
1572943323f1d9d3dd5c2634deb26cbe72343ca6b3dbNaveen Kumar Ponnusamy        {
1573943323f1d9d3dd5c2634deb26cbe72343ca6b3dbNaveen Kumar Ponnusamy            i_temp = ih264d_read_mmco_commands(ps_dec);
1574943323f1d9d3dd5c2634deb26cbe72343ca6b3dbNaveen Kumar Ponnusamy            if (i_temp < 0)
1575943323f1d9d3dd5c2634deb26cbe72343ca6b3dbNaveen Kumar Ponnusamy            {
1576943323f1d9d3dd5c2634deb26cbe72343ca6b3dbNaveen Kumar Ponnusamy                return ERROR_DBP_MANAGER_T;
1577943323f1d9d3dd5c2634deb26cbe72343ca6b3dbNaveen Kumar Ponnusamy            }
1578943323f1d9d3dd5c2634deb26cbe72343ca6b3dbNaveen Kumar Ponnusamy            ps_dec->u4_bitoffset = i_temp;
1579943323f1d9d3dd5c2634deb26cbe72343ca6b3dbNaveen Kumar Ponnusamy        }
15808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        else
15818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
15828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
15838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* G050 */
15848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
15858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(ps_pps->u1_entropy_coding_mode == CABAC)
15868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
15878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
15888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(u4_temp > MAX_CABAC_INIT_IDC)
15898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
15908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            return ERROR_INV_SLICE_HDR_T;
15918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
15928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_slice->u1_cabac_init_idc = u4_temp;
15938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        COPYTHECONTEXT("SH: cabac_init_idc",ps_slice->u1_cabac_init_idc);
15948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
15958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
15968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /* Read slice_qp_delta */
15978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    i_temp = ps_pps->u1_pic_init_qp
15988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
15998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if((i_temp < 0) || (i_temp > 51))
16008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
16018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        return ERROR_INV_RANGE_QP_T;
16028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
16038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_slice->u1_slice_qp = i_temp;
16048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    COPYTHECONTEXT("SH: slice_qp_delta",
16058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                    (WORD8)(ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp));
16068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
16078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
16088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
16098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
16108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
16118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
16128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            return ERROR_INV_SLICE_HDR_T;
16138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        } COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
16148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_slice->u1_disable_dblk_filter_idc = u4_temp;
16158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(u4_temp != 1)
16168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
16178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
16188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            << 1;
16198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
16208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
16218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                return ERROR_INV_SLICE_HDR_T;
16228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
16238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_slice->i1_slice_alpha_c0_offset = i_temp;
16248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
16258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            ps_slice->i1_slice_alpha_c0_offset >> 1);
16268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
16278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
16288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            << 1;
16298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
16308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            {
16318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                return ERROR_INV_SLICE_HDR_T;
16328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            }
16338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_slice->i1_slice_beta_offset = i_temp;
16348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            COPYTHECONTEXT("SH: slice_beta_offset_div2",
16358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                            ps_slice->i1_slice_beta_offset >> 1);
16368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
16378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
16388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        else
16398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        {
16408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_slice->i1_slice_alpha_c0_offset = 0;
16418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_slice->i1_slice_beta_offset = 0;
16428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        }
16438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
16448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    else
16458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
16468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_slice->u1_disable_dblk_filter_idc = 0;
16478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_slice->i1_slice_alpha_c0_offset = 0;
16488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_slice->i1_slice_beta_offset = 0;
16498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
16508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
16518ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen    ps_dec->u1_slice_header_done = 2;
16528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
16538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(ps_pps->u1_entropy_coding_mode)
16548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
16558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        SWITCHOFFTRACE; SWITCHONTRACECABAC;
16568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cabac;
16578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->pf_parse_inter_mb = ih264d_parse_bmb_cabac;
16588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ih264d_init_cabac_contexts(B_SLICE, ps_dec);
16598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
16608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
16618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
16628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        else
16638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff;
16648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
16658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    else
16668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {
16678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        SWITCHONTRACE; SWITCHOFFTRACECABAC;
16688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cavlc;
16698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ps_dec->pf_parse_inter_mb = ih264d_parse_bmb_cavlc;
16708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
16718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
16728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        else
16738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff;
16748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }
16758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
16768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ret = ih264d_cal_col_pic(ps_dec);
16778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(ret != OK)
16788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        return ret;
16798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_dec->u1_B = 1;
16808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_bmb;
16818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ret = ps_dec->pf_parse_inter_slice(ps_dec, ps_slice, u2_first_mb_in_slice);
16828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(ret != OK)
16838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        return ret;
16848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    return OK;
16858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
16868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1687