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 
60 void 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  */
ih264d_parse_bmb_non_direct_cavlc(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_mb_num,UWORD8 u1_num_mbsNby2)74 WORD32 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 
ih264d_parse_bmb_non_direct_cabac(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_mb_num,UWORD8 u1_num_mbsNby2)397 WORD32 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  */
ih264d_parse_bmb_cabac(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_mb_num,UWORD8 u1_num_mbsNby2)629 WORD32 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  */
ih264d_parse_bmb_cavlc(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_mb_num,UWORD8 u1_num_mbsNby2)744 WORD32 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 
ih264d_mv_pred_ref_tfr_nby2_bmb(dec_struct_t * ps_dec,UWORD8 u1_mb_idx,UWORD8 u1_num_mbs)884 WORD32 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  */
ih264d_get_implicit_weights(dec_struct_t * ps_dec)1193 void 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  */
ih264d_parse_bslice(dec_struct_t * ps_dec,UWORD16 u2_first_mb_in_slice)1348 WORD32 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