1/******************************************************************************
2 *
3 * Copyright (C) 2015 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*/
20/*!
21 **************************************************************************
22 * \file ih264d_parse_bslice.c
23 *
24 * \brief
25 *    Contains routines that decode a I slice type
26 *
27 * Detailed_description
28 *
29 * \date
30 *    07/07/2003
31 *
32 * \author  NS
33 **************************************************************************
34 */
35
36#include <string.h>
37#include "ih264d_bitstrm.h"
38#include "ih264d_defs.h"
39#include "ih264d_debug.h"
40#include "ih264d_tables.h"
41#include "ih264d_structs.h"
42#include "ih264d_defs.h"
43#include "ih264d_parse_cavlc.h"
44#include "ih264d_mb_utils.h"
45#include "ih264d_parse_slice.h"
46#include "ih264d_process_intra_mb.h"
47#include "ih264d_mvpred.h"
48#include "ih264d_parse_islice.h"
49#include "ih264d_inter_pred.h"
50#include "ih264d_process_pslice.h"
51#include "ih264d_process_bslice.h"
52#include "ih264d_deblocking.h"
53#include "ih264d_cabac.h"
54#include "ih264d_parse_mb_header.h"
55#include "ih264d_error_handler.h"
56#include "ih264d_mvpred.h"
57#include "ih264d_cabac.h"
58#include "ih264d_utils.h"
59
60void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec);
61
62/*!
63 **************************************************************************
64 * \if Function name : ParseMb_SubMb_PredBCav\endif
65 *
66 * \brief
67 *    Implements sub_mb_pred() of 7.3.5.2. & mb_pred() of 7.3.5.1
68 *
69 * \return
70 *    None.
71 *
72 **************************************************************************
73 */
74WORD32 ih264d_parse_bmb_non_direct_cavlc(dec_struct_t * ps_dec,
75                                       dec_mb_info_t * ps_cur_mb_info,
76                                       UWORD8 u1_mb_num,
77                                       UWORD8 u1_num_mbsNby2)
78{
79    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
80    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
81    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
82    UWORD8 * pu1_sub_mb_pred_modes = (UWORD8 *)(gau1_ih264d_submb_pred_modes) + 4;
83    const UWORD8 (*pu1_mb_pred_modes)[32] =
84                    (const UWORD8 (*)[32])gau1_ih264d_mb_pred_modes;
85    const UWORD8 * pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part;
86    const UWORD8 * pu1_sub_mb_mc_mode = (const UWORD8 *)(gau1_ih264d_submb_mc_mode)
87                    + 4;
88
89    parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data
90                    + u1_num_mbsNby2;
91    UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info;
92    WORD8 (*pi1_ref_idx)[MAX_REFIDX_INFO_PER_MB] = ps_parse_mb_data->i1_ref_idx;
93    UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
94    UWORD8 u1_mb_mc_mode, u1_num_mb_part, u1_sub_mb = !(u1_mb_type ^ B_8x8);
95    UWORD32 u4_mb_mc_mode = 0, u4_mb_pred_mode = 0;
96    WORD32 ret;
97
98    if(u1_sub_mb)
99    {
100        UWORD8 uc_i;
101        u1_mb_mc_mode = 0;
102        u1_num_mb_part = 4;
103        /* Reading the subMB type */
104        for(uc_i = 0; uc_i < 4; uc_i++)
105        {
106
107            UWORD32 ui_sub_mb_mode;
108
109//Inlined ih264d_uev
110            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
111            UWORD32 u4_word, u4_ldz;
112
113            /***************************************************************/
114            /* Find leading zeros in next 32 bits                          */
115            /***************************************************************/
116            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
117            u4_ldz = CLZ(u4_word);
118            /* Flush the ps_bitstrm */
119            u4_bitstream_offset += (u4_ldz + 1);
120            /* Read the suffix from the ps_bitstrm */
121            u4_word = 0;
122            if(u4_ldz)
123                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
124                        u4_ldz);
125            *pu4_bitstrm_ofst = u4_bitstream_offset;
126            ui_sub_mb_mode = ((1 << u4_ldz) + u4_word - 1);
127//Inlined ih264d_uev
128
129            if(ui_sub_mb_mode > 12)
130                return ERROR_SUB_MB_TYPE;
131            else
132            {
133                UWORD8 u1_subMbPredMode = pu1_sub_mb_pred_modes[ui_sub_mb_mode];
134                u4_mb_mc_mode = (u4_mb_mc_mode << 8)
135                                | pu1_sub_mb_mc_mode[ui_sub_mb_mode];
136                u4_mb_pred_mode = (u4_mb_pred_mode << 8) | u1_subMbPredMode;
137                pi1_ref_idx[0][uc_i] = ((u1_subMbPredMode & PRED_L0) - 1) >> 1;
138                pi1_ref_idx[1][uc_i] = ((u1_subMbPredMode & PRED_L1) - 1) >> 1;
139                COPYTHECONTEXT("sub_mb_type", u1_subMbPredMode);
140            }
141            /* Storing collocated Mb and SubMb mode information */
142            *pu1_col_info++ = ((PRED_8x8) << 6)
143                            | ((pu1_sub_mb_mc_mode[ui_sub_mb_mode] << 4));
144            if(ui_sub_mb_mode != B_DIRECT_8x8)
145            {
146                if(ui_sub_mb_mode > B_BI_8x8)
147                {
148                    ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 0;
149                }
150            }
151            else if(!ps_dec->s_high_profile.u1_direct_8x8_inference_flag)
152            {
153                ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 0;
154            }
155        }
156    }
157    else
158    {
159        UWORD8 u1_mb_pred_mode_idx = 5 + u1_mb_type;
160        UWORD8 u1_mb_pred_mode_part0 = pu1_mb_pred_modes[0][u1_mb_pred_mode_idx];
161        UWORD8 u1_mb_pred_mode_part1 = pu1_mb_pred_modes[1][u1_mb_pred_mode_idx];
162        u1_mb_mc_mode = ps_cur_mb_info->u1_mb_mc_mode;
163        u1_num_mb_part = pu1_num_mb_part[u1_mb_mc_mode];
164
165        pi1_ref_idx[0][0] = ((u1_mb_pred_mode_part0 & PRED_L0) - 1) >> 1;
166        pi1_ref_idx[1][0] = ((u1_mb_pred_mode_part0 & PRED_L1) - 1) >> 1;
167        pi1_ref_idx[0][1] = ((u1_mb_pred_mode_part1 & PRED_L0) - 1) >> 1;
168        pi1_ref_idx[1][1] = ((u1_mb_pred_mode_part1 & PRED_L1) - 1) >> 1;
169
170        u4_mb_pred_mode = (u1_mb_pred_mode_part0 << 8) | u1_mb_pred_mode_part1;
171        u4_mb_mc_mode = u1_mb_mc_mode | (u1_mb_mc_mode << 8);
172        u4_mb_mc_mode <<= 16;
173        u4_mb_pred_mode <<= 16;
174
175        /* Storing collocated Mb and SubMb mode information */
176        *pu1_col_info++ = (u1_mb_mc_mode << 6);
177        if(u1_mb_mc_mode)
178            *pu1_col_info++ = (u1_mb_mc_mode << 6);
179    }
180
181    {
182        UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
183        UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag;
184        UWORD8 *pu1_num_ref_idx_lx_active =
185                        ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active;
186        const UWORD8 u1_mbaff_field = (u1_mbaff & uc_field);
187        UWORD8 u4_num_ref_idx_lx_active;
188
189        u4_num_ref_idx_lx_active = (pu1_num_ref_idx_lx_active[0]
190                        << u1_mbaff_field) - 1;
191
192        if(u4_num_ref_idx_lx_active)
193        {
194            if(1 == u4_num_ref_idx_lx_active)
195                ih264d_parse_bmb_ref_index_cavlc_range1(
196                                u1_num_mb_part, ps_bitstrm, pi1_ref_idx[0],
197                                u4_num_ref_idx_lx_active);
198            else
199            {
200                ret = ih264d_parse_bmb_ref_index_cavlc(u1_num_mb_part, ps_bitstrm,
201                                                 pi1_ref_idx[0],
202                                                 u4_num_ref_idx_lx_active);
203                if(ret != OK)
204                    return ret;
205            }
206        }
207
208        u4_num_ref_idx_lx_active = (pu1_num_ref_idx_lx_active[1]
209                        << u1_mbaff_field) - 1;
210
211        if(u4_num_ref_idx_lx_active)
212        {
213            if(1 == u4_num_ref_idx_lx_active)
214                ih264d_parse_bmb_ref_index_cavlc_range1(
215                                u1_num_mb_part, ps_bitstrm, pi1_ref_idx[1],
216                                u4_num_ref_idx_lx_active);
217            else
218            {
219                ret = ih264d_parse_bmb_ref_index_cavlc(u1_num_mb_part, ps_bitstrm,
220                                                 pi1_ref_idx[1],
221                                                 u4_num_ref_idx_lx_active);
222                if(ret != OK)
223                    return ret;
224            }
225        }
226    }
227
228    /* Read MotionVectors */
229    {
230        const UWORD8 * pu1_top_left_sub_mb_indx;
231
232        const UWORD8 * pu1_sub_mb_indx_mod =
233                        (const UWORD8 *)(gau1_ih264d_submb_indx_mod)
234                                        + (u1_sub_mb * 6);
235        const UWORD8 * pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw;
236        const UWORD8 * pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth;
237        const UWORD8 * pu1_num_sub_mb_part =
238                        (const UWORD8 *)gau1_ih264d_num_submb_part;
239        const UWORD8 * pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
240        const UWORD8 * pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
241        UWORD8 u1_p_idx = 0, u1_num_submb_part, uc_lx;
242        parse_part_params_t * ps_part;
243        mv_pred_t *ps_mv_start = ps_dec->ps_mv_cur + (u1_mb_num << 4);
244        UWORD8 u1_mb_part_wd, u1_mb_part_ht;
245
246        /* Initialisations */
247        ps_part = ps_dec->ps_part;
248        /* Default Initialization for Non subMb Case Mode */
249        u1_mb_part_wd = pu1_mb_partw[u1_mb_mc_mode];
250        u1_mb_part_ht = pu1_mb_parth[u1_mb_mc_mode];
251        u1_num_submb_part = 1;
252
253        /* Decoding the MV for the subMB */
254        for(uc_lx = 0; uc_lx < 2; uc_lx++)
255        {
256            UWORD8 u1_sub_mb_num = 0, u1_pred_mode, uc_i;
257            UWORD32 u4_mb_mc_mode_tmp = u4_mb_mc_mode;
258            UWORD32 u4_mb_pred_mode_tmp = u4_mb_pred_mode;
259            UWORD16 u2_sub_mb_num = 0x028A; // for sub mb case
260            UWORD8 u1_b2 = uc_lx << 1;
261            u1_pred_mode = (uc_lx) ? PRED_L1 : PRED_L0;
262            pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_mc_mode << 1);
263
264            for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++)
265            {
266                UWORD8 u1_mb_mc_mode, uc_j;
267                UWORD8 i1_pred = u4_mb_pred_mode_tmp >> 24;
268                u1_mb_mc_mode = u4_mb_mc_mode_tmp >> 24;
269                u4_mb_pred_mode_tmp <<= 8;
270                u4_mb_mc_mode_tmp <<= 8;
271                /* subMb prediction mode */
272                if(u1_sub_mb)
273                {
274
275                    u1_mb_part_wd = pu1_sub_mb_partw[u1_mb_mc_mode];
276                    u1_mb_part_ht = pu1_sub_mb_parth[u1_mb_mc_mode];
277                    u1_sub_mb_num = u2_sub_mb_num >> 12;
278                    u1_num_submb_part = pu1_num_sub_mb_part[u1_mb_mc_mode];
279                    pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod
280                                    + (u1_mb_mc_mode << 1);
281                    u2_sub_mb_num <<= 4;
282                }
283                for(uc_j = 0; uc_j < u1_num_submb_part;
284                                uc_j++, pu1_top_left_sub_mb_indx++)
285                {
286                    mv_pred_t * ps_mv;
287                    u1_sub_mb_num = u1_sub_mb_num + *pu1_top_left_sub_mb_indx;
288                    ps_mv = ps_mv_start + u1_sub_mb_num;
289
290                    /* Storing Info for partitions, writing only once */
291                    if(uc_lx)
292                    {
293                        ps_part->u1_is_direct = (!i1_pred);
294                        ps_part->u1_pred_mode = i1_pred;
295                        ps_part->u1_sub_mb_num = u1_sub_mb_num;
296                        ps_part->u1_partheight = u1_mb_part_ht;
297                        ps_part->u1_partwidth = u1_mb_part_wd;
298                        /* Increment partition Index */
299                        u1_p_idx++;
300                        ps_part++;
301                    }
302
303                    if(i1_pred & u1_pred_mode)
304                    {
305                        WORD16 i2_mvx, i2_mvy;
306
307//inlining ih264d_sev
308                        {
309                            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
310                            UWORD32 u4_word, u4_ldz, u4_abs_val;
311
312                            /***************************************************************/
313                            /* Find leading zeros in next 32 bits                          */
314                            /***************************************************************/
315                            NEXTBITS_32(u4_word, u4_bitstream_offset,
316                                        pu4_bitstrm_buf);
317                            u4_ldz = CLZ(u4_word);
318
319                            /* Flush the ps_bitstrm */
320                            u4_bitstream_offset += (u4_ldz + 1);
321
322                            /* Read the suffix from the ps_bitstrm */
323                            u4_word = 0;
324                            if(u4_ldz)
325                                GETBITS(u4_word, u4_bitstream_offset,
326                                        pu4_bitstrm_buf, u4_ldz);
327
328                            *pu4_bitstrm_ofst = u4_bitstream_offset;
329                            u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
330
331                            if(u4_word & 0x1)
332                                i2_mvx = (-(WORD32)u4_abs_val);
333                            else
334                                i2_mvx = (u4_abs_val);
335                        }
336//inlinined ih264d_sev
337
338//inlining ih264d_sev
339                        {
340                            UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
341                            UWORD32 u4_word, u4_ldz, u4_abs_val;
342
343                            /***************************************************************/
344                            /* Find leading zeros in next 32 bits                          */
345                            /***************************************************************/
346                            NEXTBITS_32(u4_word, u4_bitstream_offset,
347                                        pu4_bitstrm_buf);
348                            u4_ldz = CLZ(u4_word);
349
350                            /* Flush the ps_bitstrm */
351                            u4_bitstream_offset += (u4_ldz + 1);
352
353                            /* Read the suffix from the ps_bitstrm */
354                            u4_word = 0;
355                            if(u4_ldz)
356                                GETBITS(u4_word, u4_bitstream_offset,
357                                        pu4_bitstrm_buf, u4_ldz);
358
359                            *pu4_bitstrm_ofst = u4_bitstream_offset;
360                            u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
361
362                            if(u4_word & 0x1)
363                                i2_mvy = (-(WORD32)u4_abs_val);
364                            else
365                                i2_mvy = (u4_abs_val);
366                        }
367//inlinined ih264d_sev
368
369                        /* Storing Mv residuals */
370                        ps_mv->i2_mv[u1_b2] = i2_mvx;
371                        ps_mv->i2_mv[u1_b2 + 1] = i2_mvy;
372                    }
373                }
374            }
375        }
376        /* write back to the scratch partition info */
377        ps_dec->ps_part = ps_part;
378        ps_parse_mb_data->u1_num_part = u1_sub_mb ? u1_p_idx : u1_num_mb_part;
379
380    }
381    return OK;
382}
383
384/*!
385 **************************************************************************
386 * \if Function name : ParseMb_SubMb_PredBCab\endif
387 *
388 * \brief
389 *    Implements sub_mb_pred() of 7.3.5.2. & mb_pred() of 7.3.5.1
390 *
391 * \return
392 *    None.
393 *
394 **************************************************************************
395 */
396
397WORD32 ih264d_parse_bmb_non_direct_cabac(dec_struct_t * ps_dec,
398                                       dec_mb_info_t * ps_cur_mb_info,
399                                       UWORD8 u1_mb_num,
400                                       UWORD8 u1_num_mbsNby2)
401{
402    /* Loads from ps_dec */
403    decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
404    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
405    ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
406    parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data
407                    + u1_num_mbsNby2;
408
409    /* table pointer loads */
410    const UWORD8 * pu1_sub_mb_pred_modes = (UWORD8 *)(gau1_ih264d_submb_pred_modes)
411                    + 4;
412    const UWORD8 (*pu1_mb_pred_modes)[32] =
413                    (const UWORD8 (*)[32])gau1_ih264d_mb_pred_modes;
414    const UWORD8 *pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part;
415    const UWORD8 *pu1_sub_mb_mc_mode = (UWORD8 *)(gau1_ih264d_submb_mc_mode) + 4;
416
417    const UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
418    UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info;
419    WORD8 *pi1_ref_idx_l0 = &ps_parse_mb_data->i1_ref_idx[0][0];
420    WORD8 *pi1_ref_idx_l1 = &ps_parse_mb_data->i1_ref_idx[1][0];
421    UWORD8 u1_dec_ref_l0, u1_dec_ref_l1;
422
423    UWORD8 u1_num_mb_part, u1_mb_mc_mode, u1_sub_mb, u1_mbpred_mode = 5
424                    + u1_mb_type;
425    UWORD32 u4_mb_mc_mode = 0, u4_mb_pred_mode = 0;
426    WORD32 ret;
427
428    p_curr_ctxt->u1_mb_type = CAB_NON_BD16x16;
429    u1_sub_mb = !(u1_mb_type ^ B_8x8);
430
431    {
432        UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
433        UWORD8 *pu1_num_ref_idx_lx_active =
434                        ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active;
435        UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag;
436        UWORD8 u1_mbaff_field = (u1_mbaff & uc_field);
437        u1_dec_ref_l0 = (pu1_num_ref_idx_lx_active[0] << u1_mbaff_field) - 1;
438        u1_dec_ref_l1 = (pu1_num_ref_idx_lx_active[1] << u1_mbaff_field) - 1;
439    }
440
441    if(u1_sub_mb)
442    {
443        const UWORD8 u1_colz = ((PRED_8x8) << 6);
444        UWORD8 uc_i;
445        u1_mb_mc_mode = 0;
446        u1_num_mb_part = 4;
447        /* Reading the subMB type */
448        for(uc_i = 0; uc_i < 4; uc_i++)
449        {
450            UWORD8 u1_sub_mb_mode, u1_subMbPredModes;
451            u1_sub_mb_mode = ih264d_parse_submb_type_cabac(
452                            1, ps_cab_env, ps_bitstrm,
453                            ps_dec->p_sub_mb_type_t);
454
455            if(u1_sub_mb_mode > 12)
456                return ERROR_SUB_MB_TYPE;
457
458            u1_subMbPredModes = pu1_sub_mb_pred_modes[u1_sub_mb_mode];
459            u4_mb_mc_mode = (u4_mb_mc_mode << 8) | pu1_sub_mb_mc_mode[u1_sub_mb_mode];
460            u4_mb_pred_mode = (u4_mb_pred_mode << 8) | u1_subMbPredModes;
461            *pi1_ref_idx_l0++ =
462                            (u1_subMbPredModes & PRED_L0) ? u1_dec_ref_l0 : -1;
463            *pi1_ref_idx_l1++ =
464                            (u1_subMbPredModes & PRED_L1) ? u1_dec_ref_l1 : -1;
465            COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
466            /* Storing collocated Mb and SubMb mode information */
467            *pu1_col_info++ =
468                            (u1_colz | (pu1_sub_mb_mc_mode[u1_sub_mb_mode] << 4));
469            if(u1_sub_mb_mode != B_DIRECT_8x8)
470            {
471                if(u1_sub_mb_mode > B_BI_8x8)
472                {
473                    ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 0;
474                }
475            }
476            else if(!ps_dec->s_high_profile.u1_direct_8x8_inference_flag)
477            {
478                ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 0;
479            }
480        }
481        pi1_ref_idx_l0 -= 4;
482        pi1_ref_idx_l1 -= 4;
483    }
484    else
485    {
486        UWORD8 u1_mb_pred_mode_part0 = pu1_mb_pred_modes[0][u1_mbpred_mode];
487        UWORD8 u1_mb_pred_mode_part1 = pu1_mb_pred_modes[1][u1_mbpred_mode];
488        u1_mb_mc_mode = ps_cur_mb_info->u1_mb_mc_mode;
489        u1_num_mb_part = pu1_num_mb_part[u1_mb_mc_mode];
490        /* Storing collocated Mb and SubMb mode information */
491        *pu1_col_info++ = (u1_mb_mc_mode << 6);
492        if(u1_mb_mc_mode)
493            *pu1_col_info++ = (u1_mb_mc_mode << 6);
494        u4_mb_mc_mode = u1_mb_mc_mode | (u1_mb_mc_mode << 8);
495        u4_mb_mc_mode <<= 16;
496        u4_mb_pred_mode = ((u1_mb_pred_mode_part0 << 8) | u1_mb_pred_mode_part1) << 16;
497
498        *pi1_ref_idx_l0++ = (u1_mb_pred_mode_part0 & PRED_L0) ? u1_dec_ref_l0 : -1;
499        *pi1_ref_idx_l0-- = (u1_mb_pred_mode_part1 & PRED_L0) ? u1_dec_ref_l0 : -1;
500        *pi1_ref_idx_l1++ = (u1_mb_pred_mode_part0 & PRED_L1) ? u1_dec_ref_l1 : -1;
501        *pi1_ref_idx_l1-- = (u1_mb_pred_mode_part1 & PRED_L1) ? u1_dec_ref_l1 : -1;
502    }
503    {
504        WORD8 *pi1_lft_cxt = ps_dec->pi1_left_ref_idx_ctxt_inc;
505        WORD8 *pi1_top_cxt = p_curr_ctxt->i1_ref_idx;
506
507        ret = ih264d_parse_ref_idx_cabac(u1_num_mb_part, 0, u1_dec_ref_l0,
508                                   u1_mb_mc_mode, pi1_ref_idx_l0, pi1_lft_cxt,
509                                   pi1_top_cxt, ps_cab_env, ps_bitstrm,
510                                   ps_dec->p_ref_idx_t);
511        if(ret != OK)
512            return ret;
513
514        ret = ih264d_parse_ref_idx_cabac(u1_num_mb_part, 2, u1_dec_ref_l1,
515                                   u1_mb_mc_mode, pi1_ref_idx_l1, pi1_lft_cxt,
516                                   pi1_top_cxt, ps_cab_env, ps_bitstrm,
517                                   ps_dec->p_ref_idx_t);
518        if(ret != OK)
519            return ret;
520    }
521    /* Read MotionVectors */
522    {
523        const UWORD8 *pu1_top_left_sub_mb_indx;
524        UWORD8 uc_j, uc_lx;
525        UWORD8 u1_mb_part_wd, u1_mb_part_ht;
526
527        const UWORD8 *pu1_sub_mb_indx_mod =
528                        (const UWORD8 *)gau1_ih264d_submb_indx_mod
529                                        + (u1_sub_mb * 6);
530        const UWORD8 *pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw;
531        const UWORD8 *pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth;
532        const UWORD8 *pu1_num_sub_mb_part =
533                        (const UWORD8 *)gau1_ih264d_num_submb_part;
534        const UWORD8 *pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
535        const UWORD8 *pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
536
537        UWORD8 u1_p_idx = 0;
538        UWORD8 u1_num_submb_part;
539        parse_part_params_t *ps_part;
540        /* Initialisations */
541        mv_pred_t *ps_mv_start = ps_dec->ps_mv_cur + (u1_mb_num << 4);
542        ps_part = ps_dec->ps_part;
543
544        /* Default initialization for non subMb case */
545        u1_mb_part_wd = pu1_mb_partw[u1_mb_mc_mode];
546        u1_mb_part_ht = pu1_mb_parth[u1_mb_mc_mode];
547        u1_num_submb_part = 1;
548
549        /* Decoding the MV for the subMB */
550        for(uc_lx = 0; uc_lx < 2; uc_lx++)
551        {
552            UWORD8 u1_sub_mb_num = 0;
553            UWORD32 u4_mb_pred_mode_tmp = u4_mb_pred_mode;
554            UWORD32 u4_mb_mc_mode_tmp = u4_mb_mc_mode;
555            UWORD8 u1_mb_mc_mode_1, u1_pred_mode, uc_i;
556            UWORD16 u2_sub_mb_num = 0x028A;
557            UWORD8 u1_b2 = uc_lx << 1;
558            u1_pred_mode = (uc_lx) ? PRED_L1 : PRED_L0;
559            /* Default for Cabac */
560            pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_mc_mode << 1);
561            for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++)
562            {
563
564                WORD8 i1_pred = (UWORD8)(u4_mb_pred_mode_tmp >> 24);
565                u1_mb_mc_mode_1 = (UWORD8)(u4_mb_mc_mode_tmp >> 24);
566                u4_mb_pred_mode_tmp <<= 8;
567                u4_mb_mc_mode_tmp <<= 8;
568
569                /* subMb prediction mode */
570                if(u1_sub_mb)
571                {
572                    u1_mb_part_wd = pu1_sub_mb_partw[u1_mb_mc_mode_1];
573                    u1_mb_part_ht = pu1_sub_mb_parth[u1_mb_mc_mode_1];
574                    u1_sub_mb_num = u2_sub_mb_num >> 12;
575                    pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_mc_mode_1 << 1);
576                    u1_num_submb_part = pu1_num_sub_mb_part[u1_mb_mc_mode_1];
577                    u2_sub_mb_num = u2_sub_mb_num << 4;
578                }
579
580                for(uc_j = 0; uc_j < u1_num_submb_part;
581                                uc_j++, pu1_top_left_sub_mb_indx++)
582                {
583                    mv_pred_t *ps_mv;
584                    u1_sub_mb_num = u1_sub_mb_num + *pu1_top_left_sub_mb_indx;
585                    ps_mv = ps_mv_start + u1_sub_mb_num;
586
587                    /* Storing Info for partitions, writing only once */
588                    if(uc_lx)
589                    {
590                        ps_part->u1_is_direct = (!i1_pred);
591                        ps_part->u1_pred_mode = i1_pred;
592                        ps_part->u1_sub_mb_num = u1_sub_mb_num;
593                        ps_part->u1_partheight = u1_mb_part_ht;
594                        ps_part->u1_partwidth = u1_mb_part_wd;
595
596                        /* Increment partition Index */
597                        u1_p_idx++;
598                        ps_part++;
599                    }
600
601                    ih264d_get_mvd_cabac(u1_sub_mb_num, u1_b2, u1_mb_part_wd,
602                                         u1_mb_part_ht,
603                                         (UWORD8)(i1_pred & u1_pred_mode), ps_dec,
604                                         ps_mv);
605                }
606            }
607        }
608        /* write back to the scratch partition info */
609
610        ps_dec->ps_part = ps_part;
611        ps_parse_mb_data->u1_num_part = u1_sub_mb ? u1_p_idx : u1_num_mb_part;
612
613    }
614
615    return OK;
616}
617
618/*!
619 **************************************************************************
620 * \if Function name : ih264d_parse_bmb_cabac \endif
621 *
622 * \brief
623 *    This function parses CABAC syntax of a B MB.
624 *
625 * \return
626 *    0 on Success and Error code otherwise
627 **************************************************************************
628 */
629WORD32 ih264d_parse_bmb_cabac(dec_struct_t * ps_dec,
630                              dec_mb_info_t * ps_cur_mb_info,
631                              UWORD8 u1_mb_num,
632                              UWORD8 u1_num_mbsNby2)
633{
634    UWORD8 u1_cbp;
635    deblk_mb_t * ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_mb_num;
636    const UWORD8 *puc_mb_mc_mode = (const UWORD8 *)gau1_ih264d_mb_mc_mode;
637    UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
638    ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
639
640    WORD32 ret;
641    UWORD8 u1_Bdirect_tranform_read = 1;
642    ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 1;
643
644    ps_cur_mb_info->u1_mb_mc_mode = puc_mb_mc_mode[5 + u1_mb_type];
645
646    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
647
648    ps_cur_deblk_mb->u1_mb_type |= D_B_SLICE;
649    if(u1_mb_type != B_DIRECT)
650    {
651        ret = ih264d_parse_bmb_non_direct_cabac(ps_dec, ps_cur_mb_info, u1_mb_num,
652                                          u1_num_mbsNby2);
653        if(ret != OK)
654            return ret;
655    }
656    else
657    {
658
659        /************ STORING PARTITION INFO ***********/
660        parse_part_params_t * ps_part_info;
661        ps_part_info = ps_dec->ps_part;
662        ps_part_info->u1_is_direct = PART_DIRECT_16x16;
663        ps_part_info->u1_sub_mb_num = 0;
664        ps_dec->ps_part++;
665        p_curr_ctxt->u1_mb_type = CAB_BD16x16;
666
667        MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
668        memset(ps_dec->pi1_left_ref_idx_ctxt_inc, 0, 4);
669        MEMSET_16BYTES(p_curr_ctxt->u1_mv, 0);
670        memset(p_curr_ctxt->i1_ref_idx, 0, 4);
671
672        /* check whether transform8x8 u4_flag to be read or not */
673        u1_Bdirect_tranform_read =
674                        ps_dec->s_high_profile.u1_direct_8x8_inference_flag;
675    }
676
677    /* Read the Coded block pattern */
678    u1_cbp = (WORD8)ih264d_parse_ctx_cbp_cabac(ps_dec);
679    p_curr_ctxt->u1_cbp = u1_cbp;
680    ps_cur_mb_info->u1_cbp = u1_cbp;
681
682    if(u1_cbp > 47)
683        return ERROR_CBP;
684
685    COPYTHECONTEXT("coded_block_pattern", u1_cbp);
686
687    ps_cur_mb_info->u1_tran_form8x8 = 0;
688    ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
689
690    if((ps_dec->s_high_profile.u1_transform8x8_present) && (u1_cbp & (0xf))
691                    && (ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag)
692                    && (u1_Bdirect_tranform_read))
693    {
694        ps_cur_mb_info->u1_tran_form8x8 = ih264d_parse_transform8x8flag_cabac(
695                        ps_dec, ps_cur_mb_info);
696        COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
697
698        ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
699        p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
700    }
701    else
702    {
703        p_curr_ctxt->u1_transform8x8_ctxt = 0;
704    }
705
706    p_curr_ctxt->u1_intra_chroma_pred_mode = 0;
707    p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
708    ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
709
710    /* Read mb_qp_delta */
711    if(u1_cbp)
712    {
713        WORD8 c_temp;
714        ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &c_temp);
715        if(ret != OK)
716            return ret;
717        COPYTHECONTEXT("mb_qp_delta", c_temp);
718        if(c_temp)
719        {
720            ret = ih264d_update_qp(ps_dec, c_temp);
721            if(ret != OK)
722                return ret;
723        }
724    }
725    else
726        ps_dec->i1_prev_mb_qp_delta = 0;
727
728    ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, 0);
729    if(EXCEED_OFFSET(ps_dec->ps_bitstrm))
730        return ERROR_EOB_TERMINATE_T;
731    return OK;
732}
733/*!
734 **************************************************************************
735 * \if Function name : ih264d_parse_bmb_cavlc \endif
736 *
737 * \brief
738 *    This function parses CAVLC syntax of a B MB.
739 *
740 * \return
741 *    0 on Success and Error code otherwise
742 **************************************************************************
743 */
744WORD32 ih264d_parse_bmb_cavlc(dec_struct_t * ps_dec,
745                              dec_mb_info_t * ps_cur_mb_info,
746                              UWORD8 u1_mb_num,
747                              UWORD8 u1_num_mbsNby2)
748{
749    UWORD32 u4_cbp;
750    deblk_mb_t * ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_mb_num;
751    dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
752    UWORD32 * pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
753    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
754    const UWORD8 *puc_mb_mc_mode = (const UWORD8 *)gau1_ih264d_mb_mc_mode;
755    UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
756
757    WORD32 ret;
758    UWORD8 u1_Bdirect_tranform_read = 1;
759    ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 1;
760    ps_cur_mb_info->u1_tran_form8x8 = 0;
761    ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
762
763    ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
764
765    ps_cur_mb_info->u1_mb_mc_mode = puc_mb_mc_mode[5 + u1_mb_type];
766
767    ps_cur_deblk_mb->u1_mb_type |= D_B_SLICE;
768    if(u1_mb_type != B_DIRECT)
769    {
770        ret = ih264d_parse_bmb_non_direct_cavlc(ps_dec, ps_cur_mb_info, u1_mb_num,
771                                          u1_num_mbsNby2);
772        if(ret != OK)
773            return ret;
774    }
775    else
776    {
777        /************ STORING PARTITION INFO ***********/
778        parse_part_params_t * ps_part_info;
779        ps_part_info = ps_dec->ps_part;
780        ps_part_info->u1_is_direct = PART_DIRECT_16x16;
781        ps_part_info->u1_sub_mb_num = 0;
782        ps_dec->ps_part++;
783        /* check whether transform8x8 u4_flag to be read or not */
784        u1_Bdirect_tranform_read =
785                        ps_dec->s_high_profile.u1_direct_8x8_inference_flag;
786    }
787
788    /* Read the Coded block pattern */
789    {
790        const UWORD8 * puc_CbpInter = gau1_ih264d_cbp_inter;
791//Inlined ih264d_uev
792        UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
793        UWORD32 u4_word, u4_ldz;
794
795        /***************************************************************/
796        /* Find leading zeros in next 32 bits                          */
797        /***************************************************************/
798        NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
799        u4_ldz = CLZ(u4_word);
800        /* Flush the ps_bitstrm */
801        u4_bitstream_offset += (u4_ldz + 1);
802        /* Read the suffix from the ps_bitstrm */
803        u4_word = 0;
804        if(u4_ldz)
805            GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
806        *pu4_bitstrm_ofst = u4_bitstream_offset;
807        u4_cbp = ((1 << u4_ldz) + u4_word - 1);
808//Inlined ih264d_uev
809        if(u4_cbp > 47)
810            return ERROR_CBP;
811        u4_cbp = puc_CbpInter[u4_cbp];
812
813        if((ps_dec->s_high_profile.u1_transform8x8_present) && (u4_cbp & (0xf))
814                        && (ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag)
815                        && (u1_Bdirect_tranform_read))
816        {
817            ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm);
818            COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
819            ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
820        }
821
822    }
823
824    COPYTHECONTEXT("coded_block_pattern", u4_cbp);
825    ps_cur_mb_info->u1_cbp = u4_cbp;
826
827    /* Read mb_qp_delta */
828    if(u4_cbp)
829    {
830        WORD32 i_temp;
831//inlining ih264d_sev
832
833        UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
834        UWORD32 u4_word, u4_ldz, u4_abs_val;
835
836        /***************************************************************/
837        /* Find leading zeros in next 32 bits                          */
838        /***************************************************************/
839        NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
840        u4_ldz = CLZ(u4_word);
841
842        /* Flush the ps_bitstrm */
843        u4_bitstream_offset += (u4_ldz + 1);
844
845        /* Read the suffix from the ps_bitstrm */
846        u4_word = 0;
847        if(u4_ldz)
848            GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
849
850        *pu4_bitstrm_ofst = u4_bitstream_offset;
851        u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
852
853        if(u4_word & 0x1)
854            i_temp = (-(WORD32)u4_abs_val);
855        else
856            i_temp = (u4_abs_val);
857
858        if(i_temp < -26 || i_temp > 25)
859            return ERROR_INV_RANGE_QP_T;
860//inlinined ih264d_sev
861        COPYTHECONTEXT("mb_qp_delta", i_temp);
862        if(i_temp)
863        {
864            ret = ih264d_update_qp(ps_dec, (WORD8)i_temp);
865            if(ret != OK)
866                return ret;
867        }
868
869        ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info, 0);
870        if(ret != OK)
871            return ret;
872        if(EXCEED_OFFSET(ps_bitstrm))
873            return ERROR_EOB_TERMINATE_T;
874    }
875    else
876    {
877        ps_dec->i1_prev_mb_qp_delta = 0;
878        ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
879    }
880
881    return OK;
882}
883
884WORD32 ih264d_mv_pred_ref_tfr_nby2_bmb(dec_struct_t * ps_dec,
885                                     UWORD8 u1_mb_idx,
886                                     UWORD8 u1_num_mbs)
887{
888    parse_pmbarams_t * ps_mb_part_info;
889    parse_part_params_t * ps_part;
890    mv_pred_t *ps_mv_nmb, *ps_mv_nmb_start, *ps_mv_ntop, *ps_mv_ntop_start;
891    pic_buffer_t * ps_ref_frame;
892    UWORD8 u1_direct_mode_width;
893    UWORD8 i, j;
894    dec_mb_info_t * ps_cur_mb_info;
895    const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
896    UWORD8 u1_field;
897    WORD32 ret = 0;
898
899    ps_dec->i4_submb_ofst -= (u1_num_mbs - u1_mb_idx) << 4;
900    ps_mb_part_info = ps_dec->ps_parse_mb_data;
901    ps_part = ps_dec->ps_parse_part_params;
902
903    /* N/2 Mb MvPred and Transfer Setup Loop */
904    for(i = u1_mb_idx; i < u1_num_mbs; i++, ps_mb_part_info++)
905    {
906        UWORD8 u1_colz = 0;
907        ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
908        /* Restore the slice scratch MbX and MbY context */
909        ps_cur_mb_info = ps_dec->ps_nmb_info + i;
910
911
912        u1_field = ps_cur_mb_info->u1_mb_field_decodingflag;
913
914        ps_mv_nmb_start = ps_dec->ps_mv_cur + (i << 4);
915        ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx;
916        ps_dec->u2_mby = ps_cur_mb_info->u2_mby;
917        ps_dec->u1_currB_type = 0;
918        ps_dec->u2_mv_2mb[i & 0x1] = 0;
919
920        /* Look for MV Prediction and Reference Transfer in Non-I Mbs */
921        if(!ps_mb_part_info->u1_isI_mb)
922        {
923            UWORD8 u1_blk_no;
924            WORD16 i1_ref_idx, i1_ref_idx1;
925            UWORD8 u1_pred_mode;
926            UWORD8 u1_sub_mb_x, u1_sub_mb_y, u1_sub_mb_num;
927            UWORD8 u1_lx, u1_lx_start, u1_lxend, u1_tmp_lx;
928            UWORD8 u1_num_part, u1_num_ref, u1_wd, u1_ht;
929            UWORD32 *pu4_wt_offst;
930            UWORD8 u1_scale_ref, u4_bot_mb;
931            deblk_mb_t * ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + i;
932            WORD8 (*pi1_ref_idx)[MAX_REFIDX_INFO_PER_MB] =
933                            ps_mb_part_info->i1_ref_idx;
934            WORD8 *pi1_ref_idx0 = pi1_ref_idx[0],
935                            *pi1_ref_idx1 = pi1_ref_idx[1];
936            UWORD32 **ppu4_wt_ofst = ps_mb_part_info->pu4_wt_offst;
937
938            /* MB Level initialisations */
939            ps_dec->u4_num_pmbair = i >> u1_mbaff;
940            ps_dec->u1_mb_idx_mv = i;
941
942            /* CHANGED CODE */
943            ps_mv_ntop_start = ps_mv_nmb_start
944                            - (ps_dec->u2_frm_wd_in_mbs << (4 + u1_mbaff)) + 12;
945
946            u1_num_part = ps_mb_part_info->u1_num_part;
947            ps_cur_deblk_mb->u1_mb_type |= (u1_num_part > 1) << 1;
948            u1_direct_mode_width = (1 == ps_mb_part_info->u1_num_part) ? 16 : 8;
949
950
951            ps_cur_mb_info->u4_pred_info_pkd_idx = ps_dec->u4_pred_info_pkd_idx;
952            ps_cur_mb_info->u1_num_pred_parts = 0;
953
954            /****************************************************/
955            /* weighted u4_ofst pointer calculations, this loop  */
956            /* runs maximum 4 times, even in direct cases       */
957            /****************************************************/
958            u1_scale_ref = u1_mbaff & ps_cur_mb_info->u1_mb_field_decodingflag;
959            u4_bot_mb = 1 - ps_cur_mb_info->u1_topmb;
960            if(ps_dec->ps_cur_pps->u1_wted_bipred_idc)
961            {
962                u1_num_ref = MIN(u1_num_part, 4);
963                if(PART_DIRECT_16x16 != ps_part->u1_is_direct)
964                {
965                    for(u1_blk_no = 0; u1_blk_no < u1_num_ref; u1_blk_no++)
966                    {
967                        i1_ref_idx = MAX(pi1_ref_idx0[u1_blk_no], 0);
968                        if(u1_scale_ref)
969                            i1_ref_idx >>= 1;
970                        i1_ref_idx *=
971                                        ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
972                        if(u1_scale_ref)
973                            i1_ref_idx +=
974                                            (MAX(pi1_ref_idx1[u1_blk_no], 0)
975                                                            >> 1);
976                        else
977                            i1_ref_idx += MAX(pi1_ref_idx1[u1_blk_no], 0);
978                        pu4_wt_offst = (UWORD32*)&ps_dec->pu4_wt_ofsts[2
979                                        * X3(i1_ref_idx)];
980
981                        if(pi1_ref_idx0[u1_blk_no] < 0)
982                            pu4_wt_offst += 1;
983
984                        ppu4_wt_ofst[u1_blk_no] = pu4_wt_offst;
985                        if(u1_scale_ref
986                                        && (ps_dec->ps_cur_pps->u1_wted_bipred_idc
987                                                        == 2))
988                        {
989                            i1_ref_idx = MAX(pi1_ref_idx0[u1_blk_no], 0);
990                            i1_ref_idx *=
991                                            (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
992                                                            << 1);
993                            i1_ref_idx += MAX(pi1_ref_idx1[u1_blk_no], 0);
994                            if(u4_bot_mb)
995                            {
996                                i1_ref_idx +=
997                                                (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]
998                                                                << 1)
999                                                                * (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
1000                                                                                << 1);
1001                            }
1002                            pu4_wt_offst = (UWORD32*)&ps_dec->pu4_mbaff_wt_mat[2
1003                                            * X3(i1_ref_idx)];
1004                            ppu4_wt_ofst[u1_blk_no] = pu4_wt_offst;
1005                        }
1006                    }
1007                }
1008            }
1009
1010            /**************************************************/
1011            /* Loop on Partitions                             */
1012            /* direct mode is reflected as a single partition */
1013            /**************************************************/
1014            for(j = 0; j < u1_num_part; j++, ps_part++)
1015            {
1016                u1_sub_mb_num = ps_part->u1_sub_mb_num;
1017                ps_dec->u1_sub_mb_num = u1_sub_mb_num;
1018
1019                if(PART_NOT_DIRECT != ps_part->u1_is_direct)
1020                {
1021                    /**************************************************/
1022                    /* Direct Mode, Call DecodeSpatial/TemporalDirect */
1023                    /* only (those will in turn call FormMbPartInfo)  */
1024                    /**************************************************/
1025                    ret = ps_dec->ps_cur_slice->pf_decodeDirect(ps_dec,
1026                                                                u1_direct_mode_width,
1027                                                                ps_cur_mb_info, i);
1028                    if(ret != OK)
1029                        return ret;
1030                    ps_cur_deblk_mb->u1_mb_type |= (ps_dec->u1_currB_type << 1);
1031
1032                }
1033                else
1034                {
1035                    mv_pred_t s_mvPred;
1036                    /**************************************************/
1037                    /* Non Direct Mode, Call Motion Vector Predictor  */
1038                    /* and FormMbpartInfo                             */
1039                    /**************************************************/
1040                    u1_sub_mb_x = u1_sub_mb_num & 0x03;
1041                    u1_sub_mb_y = u1_sub_mb_num >> 2;
1042                    u1_blk_no =
1043                                    (u1_num_part < 4) ?
1044                                                    j :
1045                                                    (((u1_sub_mb_y >> 1) << 1)
1046                                                                    + (u1_sub_mb_x
1047                                                                                    >> 1));
1048
1049                    ps_mv_ntop = ps_mv_ntop_start + u1_sub_mb_x;
1050                    ps_mv_nmb = ps_mv_nmb_start + u1_sub_mb_num;
1051
1052                    u1_pred_mode = ps_part->u1_pred_mode;
1053                    u1_wd = ps_part->u1_partwidth;
1054                    u1_ht = ps_part->u1_partheight;
1055
1056                    u1_lx_start = 0;
1057                    u1_lxend = 2;
1058                    if( PRED_L0 == u1_pred_mode)
1059                    {
1060                        s_mvPred.i2_mv[2] = 0;
1061                        s_mvPred.i2_mv[3] = 0;
1062                        u1_lxend = 1;
1063                    }
1064                    if( PRED_L1 == u1_pred_mode)
1065                    {
1066                        s_mvPred.i2_mv[0] = 0;
1067                        s_mvPred.i2_mv[1] = 0;
1068                        u1_lx_start = 1;
1069                    }
1070
1071                    /* Populate the colpic info and reference frames */
1072                    s_mvPred.i1_ref_frame[0] = pi1_ref_idx0[u1_blk_no];
1073                    s_mvPred.i1_ref_frame[1] = pi1_ref_idx1[u1_blk_no];
1074
1075                    ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, ps_mv_nmb, ps_mv_ntop,
1076                                      &s_mvPred, u1_sub_mb_num, u1_wd,
1077                                      u1_lx_start, u1_lxend,
1078                                      ps_cur_mb_info->u1_mb_mc_mode);
1079
1080                    /**********************************************************/
1081                    /* Loop on number of predictors, 1 Each for Forw Backw    */
1082                    /* Loop 2 times for BiDirect mode                         */
1083                    /**********************************************************/
1084                    for(u1_lx = u1_lx_start; u1_lx < u1_lxend; u1_lx++)
1085                    {
1086                        WORD16 i2_mv_x, i2_mv_y;
1087
1088                        /********************************************************/
1089                        /* Predict Mv                                           */
1090                        /* Add Mv Residuals and store back                      */
1091                        /********************************************************/
1092                        i1_ref_idx = s_mvPred.i1_ref_frame[u1_lx];
1093                        u1_tmp_lx = (u1_lx << 1);
1094
1095                        i2_mv_x = ps_mv_nmb->i2_mv[u1_tmp_lx];
1096                        i2_mv_y = ps_mv_nmb->i2_mv[u1_tmp_lx + 1];
1097
1098                        i2_mv_x += s_mvPred.i2_mv[u1_tmp_lx];
1099                        i2_mv_y += s_mvPred.i2_mv[u1_tmp_lx + 1];
1100                        s_mvPred.i2_mv[u1_tmp_lx] = i2_mv_x;
1101                        s_mvPred.i2_mv[u1_tmp_lx + 1] = i2_mv_y;
1102
1103                        /********************************************************/
1104                        /* Transfer setup call                                  */
1105                        /* convert RefIdx if it is MbAff                        */
1106                        /* Pass Weight Offset and refFrame                      */
1107                        /********************************************************/
1108                        i1_ref_idx1 = i1_ref_idx >> u1_scale_ref;
1109                        if(u1_scale_ref && ((i1_ref_idx & 0x01) != u4_bot_mb))
1110                            i1_ref_idx1 += MAX_REF_BUFS;
1111                        ps_ref_frame =
1112                                        ps_dec->ps_ref_pic_buf_lx[u1_lx][i1_ref_idx1];
1113
1114                        /* Storing Colocated-Zero u4_flag */
1115                        if(u1_lx == u1_lx_start)
1116                        {
1117                            /* Fill colocated info in MvPred structure */
1118                            s_mvPred.u1_col_ref_pic_idx =
1119                                            ps_ref_frame->u1_mv_buf_id;
1120                            s_mvPred.u1_pic_type = ps_ref_frame->u1_pic_type;
1121
1122                            /* Calculating colocated zero information */
1123                            u1_colz =
1124                                            (u1_field << 1)
1125                                                            | ((i1_ref_idx == 0)
1126                                                                            && (ABS(i2_mv_x)
1127                                                                                            <= 1)
1128                                                                            && (ABS(i2_mv_y)
1129                                                                                            <= 1));
1130                            u1_colz |= ps_mb_part_info->u1_col_info[u1_blk_no];
1131                        }
1132
1133                        pu4_wt_offst = ppu4_wt_ofst[u1_blk_no];
1134                        {
1135                            pred_info_pkd_t *ps_pred_pkd;
1136                           WORD16 i2_mv[2];
1137
1138                           i2_mv[0] = i2_mv_x;
1139                           i2_mv[1] = i2_mv_y;
1140
1141                           ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
1142                        ih264d_fill_pred_info(i2_mv,u1_wd,u1_ht,u1_sub_mb_num,u1_pred_mode,
1143                                        ps_pred_pkd,ps_ref_frame->u1_pic_buf_id,i1_ref_idx,pu4_wt_offst,
1144                                        ps_ref_frame->u1_pic_type);
1145                        ps_dec->u4_pred_info_pkd_idx++;
1146                        ps_cur_mb_info->u1_num_pred_parts++;
1147
1148
1149                        }
1150
1151                    }
1152                    ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb,
1153                                       u1_sub_mb_num, u1_colz, u1_ht,
1154                                       u1_wd);
1155                }
1156            }
1157
1158        }
1159        else
1160        {
1161            /* Set zero values in case of Intra Mbs */
1162            mv_pred_t s_mvPred =
1163                {
1164                    { 0, 0, 0, 0 },
1165                      { -1, -1 }, 0, 0};
1166            /* Storing colocated zero information */
1167            ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
1168                               (UWORD8)(u1_field << 1), 4, 4);
1169        }
1170
1171        /*if num _cores is set to 3 ,compute bs will be done in another thread*/
1172        if(ps_dec->u4_num_cores < 3)
1173        {
1174            if(ps_dec->u4_app_disable_deblk_frm == 0)
1175                ps_dec->pf_compute_bs(ps_dec, ps_cur_mb_info,
1176                                     (UWORD16)(i >> u1_mbaff));
1177        }
1178    }
1179    return OK;
1180}
1181/*!
1182 **************************************************************************
1183 * \if Function name : ih264d_get_implicit_weights \endif
1184 *
1185 * \brief
1186 *    Calculates Implicit Weights.
1187 *
1188 * \return
1189 *    None
1190 *
1191 **************************************************************************
1192 */
1193void ih264d_get_implicit_weights(dec_struct_t *ps_dec)
1194{
1195    UWORD32 *pu4_iwt_ofst;
1196    UWORD8 i, j;
1197    struct pic_buffer_t *ps_pic_buff0, *ps_pic_buff1;
1198    WORD16 i2_dist_scale_factor;
1199    WORD16 i16_tb, i16_td, i16_tx;
1200    UWORD32 u4_poc0, u4_poc1;
1201    UWORD32 ui_temp0, ui_temp1;
1202    UWORD8 uc_num_ref_idx_l0_active, uc_num_ref_idx_l1_active;
1203
1204    pu4_iwt_ofst = ps_dec->pu4_wts_ofsts_mat;
1205    uc_num_ref_idx_l0_active =
1206                    ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
1207    uc_num_ref_idx_l1_active =
1208                    ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
1209
1210    for(i = 0; i < uc_num_ref_idx_l0_active; i++)
1211    {
1212        ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][i];
1213        u4_poc0 = ps_pic_buff0->i4_avg_poc;
1214        for(j = 0; j < uc_num_ref_idx_l1_active; j++)
1215        {
1216            ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][j];
1217            u4_poc1 = ps_pic_buff1->i4_avg_poc;
1218
1219            if(u4_poc1 != u4_poc0)
1220            {
1221                i16_tb = ps_dec->ps_cur_pic->i4_poc - u4_poc0;
1222                i16_tb = CLIP3(-128, 127, i16_tb);
1223                i16_td = u4_poc1 - u4_poc0;
1224                i16_td = CLIP3(-128, 127, i16_td);
1225                i16_tx = (16384 + ABS(SIGN_POW2_DIV(i16_td, 1))) / i16_td;
1226                i2_dist_scale_factor = CLIP3(-1024, 1023,
1227                                            (((i16_tb * i16_tx) + 32) >> 6));
1228
1229                if(/*((u4_poc1 - u4_poc0) == 0) ||*/
1230                (!(ps_pic_buff1->u1_is_short && ps_pic_buff0->u1_is_short))
1231                                || ((i2_dist_scale_factor >> 2) < -64)
1232                                || ((i2_dist_scale_factor >> 2) > 128))
1233                {
1234                    /* same for forward and backward, wt=32 and Offset = 0 */
1235                    ui_temp0 = 0x00000020;
1236                    ui_temp1 = 0x00000020;
1237                }
1238                else
1239                {
1240                    ui_temp0 = 64 - (i2_dist_scale_factor >> 2);
1241                    ui_temp1 = (i2_dist_scale_factor >> 2);
1242                }
1243            }
1244            else
1245            {
1246                ui_temp0 = 0x00000020;
1247                ui_temp1 = 0x00000020;
1248            }
1249            pu4_iwt_ofst[0] = pu4_iwt_ofst[2] = pu4_iwt_ofst[4] = ui_temp0;
1250            pu4_iwt_ofst[1] = pu4_iwt_ofst[3] = pu4_iwt_ofst[5] = ui_temp1;
1251            pu4_iwt_ofst += 6;
1252        }
1253    }
1254    if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1255    {
1256        UWORD8 k;
1257        WORD32 i4_cur_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1258        UWORD32* pu4_wt_mat = ps_dec->pu4_mbaff_wt_mat;
1259        /* Form the Implicit Weighted prediction matrix for field MBs also */
1260        for(k = 0; k < 2; k++)
1261        {
1262            for(i = 0; i < (uc_num_ref_idx_l0_active << 1); i++)
1263            {
1264                UWORD16 u2_l0_idx;
1265
1266                /*u2_l0_idx = (i >= uc_num_ref_idx_l0_active)
1267                 ?(MAX_REF_BUFS + i - uc_num_ref_idx_l0_active) : (i) ;*/
1268
1269                u2_l0_idx = i >> 1;
1270                if((i & 0x01) != k)
1271                {
1272                    u2_l0_idx += MAX_REF_BUFS;
1273                }
1274                ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][u2_l0_idx];
1275                u4_poc0 = ps_pic_buff0->i4_poc;
1276                for(j = 0; j < (uc_num_ref_idx_l1_active << 1); j++)
1277                {
1278                    UWORD16 u2_l1_idx;
1279                    /*u2_l1_idx = (j >= uc_num_ref_idx_l1_active)
1280                     ? (MAX_REF_BUFS + j - uc_num_ref_idx_l1_active ) : (j) ;*/
1281
1282                    u2_l1_idx = j >> 1;
1283                    if((j & 0x01) != k)
1284                    {
1285                        u2_l1_idx += MAX_REF_BUFS;
1286                    }
1287                    ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][u2_l1_idx];
1288                    u4_poc1 = ps_pic_buff1->i4_poc;
1289                    if(u4_poc1 != u4_poc0)
1290                    {
1291                        i16_tb = i4_cur_poc - u4_poc0;
1292                        i16_tb = CLIP3(-128, 127, i16_tb);
1293                        i16_td = u4_poc1 - u4_poc0;
1294                        i16_td = CLIP3(-128, 127, i16_td);
1295                        i16_tx = (16384 + ABS(SIGN_POW2_DIV(i16_td, 1)))
1296                                        / i16_td;
1297                        i2_dist_scale_factor = CLIP3(
1298                                        -1024, 1023,
1299                                        (((i16_tb * i16_tx) + 32) >> 6));
1300
1301                        if(/*((u4_poc1 - u4_poc0) == 0) ||*/
1302                        (!(ps_pic_buff1->u1_is_short && ps_pic_buff0->u1_is_short))
1303                                        || ((i2_dist_scale_factor >> 2) < -64)
1304                                        || ((i2_dist_scale_factor >> 2) > 128))
1305                        {
1306                            /* same for forward and backward, wt=32 and Offset = 0 */
1307                            ui_temp0 = 0x00000020;
1308                            ui_temp1 = 0x00000020;
1309                        }
1310                        else
1311                        {
1312                            ui_temp0 = 64 - (i2_dist_scale_factor >> 2);
1313                            ui_temp1 = (i2_dist_scale_factor >> 2);
1314                        }
1315                    }
1316                    else
1317                    {
1318                        ui_temp0 = 0x00000020;
1319                        ui_temp1 = 0x00000020;
1320                    }
1321                    /* Store in the weight matrix */
1322                    *pu4_wt_mat++ = ui_temp0;
1323                    *pu4_wt_mat++ = ui_temp1;
1324                    *pu4_wt_mat++ = ui_temp0;
1325                    *pu4_wt_mat++ = ui_temp1;
1326                    *pu4_wt_mat++ = ui_temp0;
1327                    *pu4_wt_mat++ = ui_temp1;
1328
1329                }
1330            }
1331            i4_cur_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1332        }
1333    }
1334}
1335
1336/*!
1337 **************************************************************************
1338 * \if Function name : ih264d_decode_bslice \endif
1339 *
1340 * \brief
1341 *    Decodes a B Slice
1342 *
1343 *
1344 * \return
1345 *    0 on Success and Error code otherwise
1346 **************************************************************************
1347 */
1348WORD32 ih264d_parse_bslice(dec_struct_t * ps_dec, UWORD16 u2_first_mb_in_slice)
1349{
1350    dec_pic_params_t * ps_pps = ps_dec->ps_cur_pps;
1351    dec_slice_params_t * ps_slice = ps_dec->ps_cur_slice;
1352    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
1353    UWORD8 u1_ref_idx_re_flag_lx;
1354    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1355    UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1356
1357    UWORD32 u4_temp, ui_temp1;
1358    WORD32 i_temp;
1359    WORD32 ret;
1360
1361    /*--------------------------------------------------------------------*/
1362    /* Read remaining contents of the slice header                        */
1363    /*--------------------------------------------------------------------*/
1364    {
1365        WORD8 *pi1_buf;
1366        WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv;
1367        WORD32 *pi4_mv = (WORD32*)pi2_mv;
1368        WORD16 *pi16_refFrame;
1369        pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame;
1370        pi16_refFrame = (WORD16*)pi1_buf;
1371        *pi4_mv = 0;
1372        *(pi4_mv + 1) = 0;
1373        *pi16_refFrame = OUT_OF_RANGE_REF;
1374        ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8)-1;
1375        ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8)-1;
1376    }
1377
1378    ps_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264(
1379                    ps_bitstrm);
1380    COPYTHECONTEXT("SH: num_ref_idx_override_flag",
1381                    ps_slice->u1_num_ref_idx_active_override_flag);
1382
1383    u4_temp = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0];
1384    ui_temp1 = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[1];
1385    if(ps_slice->u1_num_ref_idx_active_override_flag)
1386    {
1387        u4_temp = 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1388        COPYTHECONTEXT("SH: num_ref_idx_l0_active_minus1",
1389                        u4_temp - 1);
1390        ui_temp1 = 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1391        COPYTHECONTEXT("SH: num_ref_idx_l1_active_minus1",
1392                        ui_temp1 - 1);
1393    }
1394
1395    {
1396        UWORD8 u1_max_ref_idx = MAX_FRAMES;
1397        if(ps_slice->u1_field_pic_flag)
1398        {
1399            u1_max_ref_idx = MAX_FRAMES << 1;
1400        }
1401        if((u4_temp > u1_max_ref_idx) || (ui_temp1 > u1_max_ref_idx))
1402        {
1403            return ERROR_NUM_REF;
1404        }
1405        ps_slice->u1_num_ref_idx_lx_active[0] = u4_temp;
1406        ps_slice->u1_num_ref_idx_lx_active[1] = ui_temp1;
1407    }
1408    /* Initialize the Reference list once in Picture if the slice type    */
1409    /* of first slice is between 5 to 9 defined in table 7.3 of standard  */
1410    /* If picture contains both P & B slices then Initialize the Reference*/
1411    /* List only when it switches from P to B and B to P                     */
1412
1413    {
1414        UWORD8 init_idx_flg = (ps_dec->u1_pr_sl_type
1415                        != ps_dec->ps_cur_slice->u1_slice_type);
1416        if(ps_dec->u1_first_pb_nal_in_pic
1417                        || (init_idx_flg & !ps_dec->u1_sl_typ_5_9)
1418                        || ps_dec->u1_num_ref_idx_lx_active_prev
1419                                        != ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0])
1420            ih264d_init_ref_idx_lx_b(ps_dec);
1421        if(ps_dec->u1_first_pb_nal_in_pic & ps_dec->u1_sl_typ_5_9)
1422            ps_dec->u1_first_pb_nal_in_pic = 0;
1423    }
1424    /* Store the value for future slices in the same picture */
1425    ps_dec->u1_num_ref_idx_lx_active_prev =
1426                    ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
1427
1428    u1_ref_idx_re_flag_lx = ih264d_get_bit_h264(ps_bitstrm);
1429    COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l0",u1_ref_idx_re_flag_lx);
1430
1431    /* Modified temporarily */
1432    if(u1_ref_idx_re_flag_lx)
1433    {
1434        WORD8 ret;
1435        ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
1436        ret = ih264d_ref_idx_reordering(ps_dec, 0);
1437        if(ret == -1)
1438            return ERROR_REFIDX_ORDER_T;
1439    }
1440    else
1441        ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0];
1442
1443    u1_ref_idx_re_flag_lx = ih264d_get_bit_h264(ps_bitstrm);
1444    COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l1",u1_ref_idx_re_flag_lx);
1445
1446    /* Modified temporarily */
1447    if(u1_ref_idx_re_flag_lx)
1448    {
1449        WORD8 ret;
1450        ps_dec->ps_ref_pic_buf_lx[1] = ps_dec->ps_dpb_mgr->ps_mod_dpb[1];
1451        ret = ih264d_ref_idx_reordering(ps_dec, 1);
1452        if(ret == -1)
1453            return ERROR_REFIDX_ORDER_T;
1454    }
1455    else
1456        ps_dec->ps_ref_pic_buf_lx[1] = ps_dec->ps_dpb_mgr->ps_init_dpb[1];
1457
1458    /* Create refIdx to POC mapping */
1459    {
1460        void **ppv_map_ref_idx_to_poc_lx;
1461        WORD8 idx;
1462        struct pic_buffer_t *ps_pic;
1463
1464        ppv_map_ref_idx_to_poc_lx = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0;
1465        ppv_map_ref_idx_to_poc_lx[0] = 0;
1466        ppv_map_ref_idx_to_poc_lx++;
1467        for(idx = 0; idx < ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
1468                        idx++)
1469        {
1470            ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
1471            ppv_map_ref_idx_to_poc_lx[idx] = (ps_pic->pu1_buf1);
1472        }
1473
1474        ppv_map_ref_idx_to_poc_lx = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1;
1475
1476        ppv_map_ref_idx_to_poc_lx[0] = 0;
1477        ppv_map_ref_idx_to_poc_lx++;
1478        for(idx = 0; idx < ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
1479                        idx++)
1480        {
1481            ps_pic = ps_dec->ps_ref_pic_buf_lx[1][idx];
1482            ppv_map_ref_idx_to_poc_lx[idx] = (ps_pic->pu1_buf1);
1483        }
1484
1485        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1486        {
1487            void **ppv_map_ref_idx_to_poc_lx_t, **ppv_map_ref_idx_to_poc_lx_b;
1488
1489            ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc
1490                            + TOP_LIST_FLD_L0;
1491            ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc
1492                            + BOT_LIST_FLD_L0;
1493
1494            ppv_map_ref_idx_to_poc_lx_t[0] = 0;
1495            ppv_map_ref_idx_to_poc_lx_t++;
1496            ppv_map_ref_idx_to_poc_lx_b[0] = 0;
1497            ppv_map_ref_idx_to_poc_lx_b++;
1498            for(idx = 0; idx < ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
1499                            idx++)
1500            {
1501                ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
1502                ppv_map_ref_idx_to_poc_lx_t[0] = (ps_pic->pu1_buf1);
1503                ppv_map_ref_idx_to_poc_lx_b[1] = (ps_pic->pu1_buf1);
1504
1505                ppv_map_ref_idx_to_poc_lx_b[0] = (ps_pic->pu1_buf1) + 1;
1506                ppv_map_ref_idx_to_poc_lx_t[1] = (ps_pic->pu1_buf1) + 1;
1507
1508                ppv_map_ref_idx_to_poc_lx_t += 2;
1509                ppv_map_ref_idx_to_poc_lx_b += 2;
1510            }
1511
1512            ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc
1513                            + TOP_LIST_FLD_L1;
1514            ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc
1515                            + BOT_LIST_FLD_L1;
1516
1517            ppv_map_ref_idx_to_poc_lx_t[0] = 0;
1518            ppv_map_ref_idx_to_poc_lx_t++;
1519            ppv_map_ref_idx_to_poc_lx_b[0] = 0;
1520            ppv_map_ref_idx_to_poc_lx_b++;
1521            for(idx = 0; idx < ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
1522                            idx++)
1523            {
1524                UWORD8 u1_tmp_idx = idx << 1;
1525                ps_pic = ps_dec->ps_ref_pic_buf_lx[1][idx];
1526                ppv_map_ref_idx_to_poc_lx_t[u1_tmp_idx] = (ps_pic->pu1_buf1);
1527                ppv_map_ref_idx_to_poc_lx_b[u1_tmp_idx + 1] = (ps_pic->pu1_buf1);
1528
1529                ppv_map_ref_idx_to_poc_lx_b[u1_tmp_idx] = (ps_pic->pu1_buf1) + 1;
1530                ppv_map_ref_idx_to_poc_lx_t[u1_tmp_idx + 1] = (ps_pic->pu1_buf1) + 1;
1531
1532            }
1533        }
1534
1535        if(ps_dec->u4_num_cores >= 3)
1536        {
1537            WORD32 num_entries;
1538            WORD32 size;
1539            num_entries = MAX_FRAMES;
1540            if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
1541                (0 == ps_dec->i4_display_delay))
1542            {
1543                num_entries = 1;
1544            }
1545
1546            num_entries = ((2 * num_entries) + 1);
1547            if(BASE_PROFILE_IDC != ps_dec->ps_cur_sps->u1_profile_idc)
1548            {
1549                num_entries *= 2;
1550            }
1551
1552            size = num_entries * sizeof(void *);
1553            size += PAD_MAP_IDX_POC * sizeof(void *);
1554
1555            memcpy((void *)ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc,
1556               ps_dec->ppv_map_ref_idx_to_poc,
1557               size);
1558        }
1559
1560    }
1561
1562    if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag
1563                    && (ps_dec->ps_cur_slice->u1_field_pic_flag == 0))
1564    {
1565        ih264d_convert_frm_mbaff_list(ps_dec);
1566    }
1567
1568    if(ps_pps->u1_wted_bipred_idc == 1)
1569    {
1570        ret = ih264d_parse_pred_weight_table(ps_slice, ps_bitstrm);
1571        if(ret != OK)
1572            return ret;
1573        ih264d_form_pred_weight_matrix(ps_dec);
1574        ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
1575    }
1576    else if(ps_pps->u1_wted_bipred_idc == 2)
1577    {
1578        /* Implicit Weighted prediction */
1579        ps_slice->u2_log2Y_crwd = 0x0505;
1580        ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
1581        ih264d_get_implicit_weights(ps_dec);
1582    }
1583    else
1584        ps_dec->ps_cur_slice->u2_log2Y_crwd = 0;
1585
1586    ps_dec->ps_parse_cur_slice->u2_log2Y_crwd =
1587                    ps_dec->ps_cur_slice->u2_log2Y_crwd;
1588
1589    /* G050 */
1590    if(ps_slice->u1_nal_ref_idc != 0)
1591    {
1592        if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
1593        {
1594            i_temp = ih264d_read_mmco_commands(ps_dec);
1595            if (i_temp < 0)
1596            {
1597                return ERROR_DBP_MANAGER_T;
1598            }
1599            ps_dec->u4_bitoffset = i_temp;
1600        }
1601        else
1602            ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
1603    }
1604    /* G050 */
1605
1606    if(ps_pps->u1_entropy_coding_mode == CABAC)
1607    {
1608        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1609        if(u4_temp > MAX_CABAC_INIT_IDC)
1610        {
1611            return ERROR_INV_SLICE_HDR_T;
1612        }
1613        ps_slice->u1_cabac_init_idc = u4_temp;
1614        COPYTHECONTEXT("SH: cabac_init_idc",ps_slice->u1_cabac_init_idc);
1615    }
1616
1617    /* Read slice_qp_delta */
1618    i_temp = ps_pps->u1_pic_init_qp
1619                    + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1620    if((i_temp < 0) || (i_temp > 51))
1621    {
1622        return ERROR_INV_RANGE_QP_T;
1623    }
1624    ps_slice->u1_slice_qp = i_temp;
1625    COPYTHECONTEXT("SH: slice_qp_delta",
1626                    (WORD8)(ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp));
1627
1628    if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
1629    {
1630        u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1631        if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
1632        {
1633            return ERROR_INV_SLICE_HDR_T;
1634        } COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
1635        ps_slice->u1_disable_dblk_filter_idc = u4_temp;
1636        if(u4_temp != 1)
1637        {
1638            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
1639                            << 1;
1640            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
1641            {
1642                return ERROR_INV_SLICE_HDR_T;
1643            }
1644            ps_slice->i1_slice_alpha_c0_offset = i_temp;
1645            COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
1646                            ps_slice->i1_slice_alpha_c0_offset >> 1);
1647
1648            i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
1649                            << 1;
1650            if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
1651            {
1652                return ERROR_INV_SLICE_HDR_T;
1653            }
1654            ps_slice->i1_slice_beta_offset = i_temp;
1655            COPYTHECONTEXT("SH: slice_beta_offset_div2",
1656                            ps_slice->i1_slice_beta_offset >> 1);
1657
1658        }
1659        else
1660        {
1661            ps_slice->i1_slice_alpha_c0_offset = 0;
1662            ps_slice->i1_slice_beta_offset = 0;
1663        }
1664    }
1665    else
1666    {
1667        ps_slice->u1_disable_dblk_filter_idc = 0;
1668        ps_slice->i1_slice_alpha_c0_offset = 0;
1669        ps_slice->i1_slice_beta_offset = 0;
1670    }
1671
1672    ps_dec->u1_slice_header_done = 2;
1673
1674    if(ps_pps->u1_entropy_coding_mode)
1675    {
1676        SWITCHOFFTRACE; SWITCHONTRACECABAC;
1677        ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cabac;
1678        ps_dec->pf_parse_inter_mb = ih264d_parse_bmb_cabac;
1679        ih264d_init_cabac_contexts(B_SLICE, ps_dec);
1680
1681        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1682            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
1683        else
1684            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff;
1685    }
1686    else
1687    {
1688        SWITCHONTRACE; SWITCHOFFTRACECABAC;
1689        ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cavlc;
1690        ps_dec->pf_parse_inter_mb = ih264d_parse_bmb_cavlc;
1691        if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1692            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
1693        else
1694            ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff;
1695    }
1696
1697    ret = ih264d_cal_col_pic(ps_dec);
1698    if(ret != OK)
1699        return ret;
1700    ps_dec->u1_B = 1;
1701    ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_bmb;
1702    ret = ps_dec->pf_parse_inter_slice(ps_dec, ps_slice, u2_first_mb_in_slice);
1703    if(ret != OK)
1704        return ret;
1705    return OK;
1706}
1707
1708