• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  * Copyright (C) 2015 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 /*!
21  **************************************************************************
22  * \file ih264d_process_bslice.c
23  *
24  * \brief
25  *    Contains routines that decode B slice type
26  *
27  * Detailed_description
28  *
29  * \date
30  *    21/12/2002
31  *
32  * \author  NS
33  **************************************************************************
34  */
35 #include "ih264_typedefs.h"
36 #include "ih264_macros.h"
37 #include "ih264_platform_macros.h"
38 
39 #include <string.h>
40 #include "ih264d_structs.h"
41 #include "ih264d_bitstrm.h"
42 #include "ih264d_parse_cavlc.h"
43 #include "ih264d_mb_utils.h"
44 #include "ih264d_mvpred.h"
45 #include "ih264d_inter_pred.h"
46 #include "ih264d_process_pslice.h"
47 #include "ih264d_error_handler.h"
48 #include "ih264d_tables.h"
49 #include "ih264d_parse_slice.h"
50 #include "ih264d_process_pslice.h"
51 #include "ih264d_process_bslice.h"
52 #include "ih264d_tables.h"
53 #include "ih264d_parse_islice.h"
54 #include "ih264d_mvpred.h"
55 
56 void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec);
57 //UWORD32 g_hits = 0;
58 //UWORD32 g_miss = 0;
59 /*!
60  **************************************************************************
61  * \if Function name : ih264d_decode_spatial_direct \endif
62  *
63  * \brief
64  *    Decodes spatial direct mode.
65  *
66  * \return
67  *    None.
68  *    Arunoday T
69  **************************************************************************
70  */
ih264d_decode_spatial_direct(dec_struct_t * ps_dec,UWORD8 u1_wd_x,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_mb_num)71 WORD32 ih264d_decode_spatial_direct(dec_struct_t * ps_dec,
72                                     UWORD8 u1_wd_x,
73                                     dec_mb_info_t * ps_cur_mb_info,
74                                     UWORD8 u1_mb_num)
75 {
76     mv_pred_t s_mv_pred, *ps_mv;
77     UWORD8 u1_col_zero_flag, u1_sub_mb_num, u1_direct_zero_pred_flag = 0;
78     UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
79     mv_pred_t *ps_mv_ntop_start;
80     mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_mb_num << 4);
81     UWORD8 partition_size, sub_partition, u1_mb_partw, u1_mb_parth;
82     UWORD8 i;
83     WORD8 i1_pred, i1_ref_frame0, i1_ref_frame1;
84     struct pic_buffer_t *ps_ref_frame = NULL, *ps_col_pic, *ps_pic_buff0 = NULL,
85                     *ps_pic_buff1 = NULL;
86 
87     UWORD8 u1_zero_pred_cond_f, u1_zero_pred_cond_b;
88     WORD16 i2_def_mv[2], i2_spat_pred_mv[4], *pi2_final_mv0, *pi2_final_mv1;
89     UWORD16 ui2_mask_fwd = 0, ui2_mask_bwd = 0, u2_mask = 0;
90     UWORD32 *pui32_weight_ofsts = NULL;
91     directmv_t s_mvdirect;
92     UWORD8 u1_colz;
93     UWORD8 u1_final_ref_idx = 0;
94     const UWORD8 *pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
95     const UWORD8 *pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
96     const UWORD16 sub_mask_table[] =
97         { 0x33, 0x3, 0x11, 0x1 };
98     const UWORD16 mask_table[] =
99         { 0xffff, /*16x16 NA */
100           0xff, /* 16x8*/
101           0x3333, /* 8x16*/
102           0x33 };/* 8x8*/
103     mv_pred_t s_temp_mv_pred;
104     WORD32 ret = 0;
105 
106     /* CHANGED CODE */
107     ps_mv_ntop_start = ps_dec->ps_mv_cur + (u1_mb_num << 4)
108                     - (ps_dec->u2_frm_wd_in_mbs << (4 + u1_mbaff)) + 12;
109 
110     /* assign default values for MotionVector as zero */
111     i2_def_mv[0] = 0;
112     i2_def_mv[1] = 0;
113 
114     u1_direct_zero_pred_flag = ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, ps_mv_nmb_start,
115                                               ps_mv_ntop_start, &s_mv_pred, 0, 4,
116                                               0, 1, B_DIRECT_SPATIAL);
117 
118     i2_spat_pred_mv[0] = s_mv_pred.i2_mv[0];
119     i2_spat_pred_mv[1] = s_mv_pred.i2_mv[1];
120     i2_spat_pred_mv[2] = s_mv_pred.i2_mv[2];
121     i2_spat_pred_mv[3] = s_mv_pred.i2_mv[3];
122 
123     i1_ref_frame0 = s_mv_pred.i1_ref_frame[0];
124     i1_ref_frame1 = s_mv_pred.i1_ref_frame[1];
125 
126     i1_ref_frame0 = (i1_ref_frame0 < 0) ? -1 : i1_ref_frame0;
127     i1_ref_frame1 = (i1_ref_frame1 < 0) ? -1 : i1_ref_frame1;
128 
129     i1_pred = 0;
130 
131     {
132         WORD8 u1_ref_idx, u1_ref_idx1;
133         UWORD32 uc_Idx, uc_Idx1;
134         UWORD8 u1_scale_ref = (ps_dec->ps_cur_slice->u1_mbaff_frame_flag
135                         && ps_cur_mb_info->u1_mb_field_decodingflag);
136         u1_final_ref_idx = i1_ref_frame0;
137         if(i1_ref_frame0 >= 0)
138         {
139             /* convert RefIdx if it is MbAff */
140             u1_ref_idx = i1_ref_frame0;
141             u1_ref_idx1 = i1_ref_frame0;
142             if(u1_scale_ref)
143             {
144                 u1_ref_idx1 = u1_ref_idx >> 1;
145                 if((u1_ref_idx & 0x01) != (1 - ps_cur_mb_info->u1_topmb))
146                     u1_ref_idx1 += MAX_REF_BUFS;
147             }
148             /* If i1_ref_frame0 < 0 then refIdxCol is obtained from ps_pic_buff1 */
149             ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][u1_ref_idx1];
150             ps_ref_frame = ps_pic_buff0;
151             i1_pred = PRED_L0;
152         }
153 
154         if(i1_ref_frame1 >= 0)
155         {
156             /* convert RefIdx if it is MbAff */
157             u1_ref_idx = i1_ref_frame1;
158             u1_ref_idx1 = i1_ref_frame1;
159             if(u1_scale_ref)
160             {
161                 u1_ref_idx1 = u1_ref_idx >> 1;
162                 if((u1_ref_idx & 0x01) != (1 - ps_cur_mb_info->u1_topmb))
163                     u1_ref_idx1 += MAX_REF_BUFS;
164             }
165             ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][u1_ref_idx1];
166             i1_pred = i1_pred | PRED_L1;
167         }
168         if(i1_ref_frame0 < 0)
169         {
170             ps_ref_frame = ps_pic_buff1;
171             u1_final_ref_idx = i1_ref_frame1;
172         }
173 
174         u1_zero_pred_cond_f = (u1_direct_zero_pred_flag) || (i1_ref_frame0 < 0);
175         u1_zero_pred_cond_b = (u1_direct_zero_pred_flag) || (i1_ref_frame1 < 0);
176 
177         if(ps_dec->ps_cur_pps->u1_wted_bipred_idc)
178         {
179             uc_Idx = ((i1_ref_frame0 < 1) ? 0 : i1_ref_frame0)
180                             * ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
181             if(u1_scale_ref)
182                 uc_Idx >>= 1;
183             uc_Idx1 = (i1_ref_frame1 < 0) ? 0 : i1_ref_frame1;
184             uc_Idx += (u1_scale_ref) ? (uc_Idx1 >> 1) : uc_Idx1;
185             pui32_weight_ofsts =
186                             (UWORD32*)&ps_dec->pu4_wt_ofsts[2 * X3(uc_Idx)];
187 
188             if(i1_ref_frame0 < 0)
189                 pui32_weight_ofsts += 1;
190 
191             if(u1_scale_ref && (ps_dec->ps_cur_pps->u1_wted_bipred_idc == 2))
192             {
193                 WORD16 i2_ref_idx;
194                 i2_ref_idx = MAX(i1_ref_frame0, 0);
195                 i2_ref_idx *= (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
196                                 << 1);
197                 i2_ref_idx += MAX(i1_ref_frame1, 0);
198                 if(!ps_cur_mb_info->u1_topmb)
199                     i2_ref_idx +=
200                                     (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]
201                                                     << 1)
202                                                     * (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
203                                                                     << 1);
204                 pui32_weight_ofsts = (UWORD32*)&ps_dec->pu4_mbaff_wt_mat[2
205                                 * X3(i2_ref_idx)];
206             }
207         }
208     }
209 
210     s_temp_mv_pred.i1_ref_frame[0] = i1_ref_frame0;
211     s_temp_mv_pred.i1_ref_frame[1] = i1_ref_frame1;
212     s_temp_mv_pred.u1_col_ref_pic_idx = ps_ref_frame->u1_mv_buf_id;
213     s_temp_mv_pred.u1_pic_type = ps_ref_frame->u1_pic_type;
214 
215     /**********************************************************************/
216     /* Call the function which gets the number of partitions and          */
217     /* partition info of colocated Mb                                     */
218     /**********************************************************************/
219 
220     ps_dec->pf_parse_mvdirect(ps_dec, ps_dec->ps_col_pic, &s_mvdirect, u1_wd_x,
221                            ps_dec->i4_submb_ofst, ps_cur_mb_info);
222     ps_col_pic = ps_dec->ps_col_pic;
223     if((s_mvdirect.u1_col_zeroflag_change == 0) || u1_direct_zero_pred_flag)
224     {
225         WORD16 i2_mv_x, i2_mv_y, i2_mvX1, i2_mvY1;
226         /* Most probable case */
227         u1_col_zero_flag = *(ps_col_pic->pu1_col_zero_flag
228                         + s_mvdirect.i4_mv_indices[0]);
229         u1_col_zero_flag = u1_col_zero_flag & 0x01;
230 
231         if(u1_zero_pred_cond_f || ((i1_ref_frame0 == 0) && (u1_col_zero_flag == 1)))
232         {
233             i2_mv_x = 0;
234             i2_mv_y = 0;
235         }
236         else
237         {
238             i2_mv_x = i2_spat_pred_mv[0];
239             i2_mv_y = i2_spat_pred_mv[1];
240 
241         }
242 
243         if(u1_zero_pred_cond_b || ((i1_ref_frame1 == 0) && (u1_col_zero_flag == 1)))
244         {
245             i2_mvX1 = 0;
246             i2_mvY1 = 0;
247         }
248         else
249         {
250             i2_mvX1 = i2_spat_pred_mv[2];
251             i2_mvY1 = i2_spat_pred_mv[3];
252         }
253 
254         u1_sub_mb_num = ps_dec->u1_sub_mb_num;
255         u1_mb_partw = (u1_wd_x >> 2);
256 
257 
258         if(i1_ref_frame0 >= 0)
259         {
260             {
261                pred_info_pkd_t *ps_pred_pkd;
262                WORD16 i2_mv[2];
263                WORD8 i1_ref_idx= 0;
264 
265                i2_mv[0] = i2_mv_x;
266                i2_mv[1] = i2_mv_y;
267 
268                ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
269             ih264d_fill_pred_info(i2_mv,u1_mb_partw,u1_mb_partw,u1_sub_mb_num,i1_pred,
270                             ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
271                             ps_pic_buff0->u1_pic_type);
272             ps_dec->u4_pred_info_pkd_idx++;
273             ps_cur_mb_info->u1_num_pred_parts++;
274 
275 
276             }
277 
278         }
279 
280         if(i1_ref_frame1 >= 0)
281         {
282             {
283                 pred_info_pkd_t *ps_pred_pkd;
284                WORD16 i2_mv[2];
285                WORD8 i1_ref_idx= 0;
286 
287                i2_mv[0] = i2_mvX1;
288                i2_mv[1] = i2_mvY1;
289 
290                ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
291             ih264d_fill_pred_info(i2_mv,u1_mb_partw,u1_mb_partw,u1_sub_mb_num,i1_pred,
292                             ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
293                             ps_pic_buff1->u1_pic_type);
294             ps_dec->u4_pred_info_pkd_idx++;
295             ps_cur_mb_info->u1_num_pred_parts++;
296 
297 
298             }
299         }
300 
301 
302         /* Replication optimisation */
303         s_temp_mv_pred.i2_mv[0] = i2_mv_x;
304         s_temp_mv_pred.i2_mv[1] = i2_mv_y;
305         s_temp_mv_pred.i2_mv[2] = i2_mvX1;
306         s_temp_mv_pred.i2_mv[3] = i2_mvY1;
307 
308         /* Calculating colocated zero information */
309         {
310             /*************************************/
311             /* If(bit2 and bit3 set)             */
312             /* then                              */
313             /*  (bit0 and bit1) => submmbmode    */
314             /*  (bit2 and bit3) => mbmode        */
315             /* else                              */
316             /*  (bit0 and bit1) => mbmode        */
317             /*************************************/
318             /*UWORD8 u1_packed_mb_sub_mb_mode = sub_partition ?
319              (s_mvdirect.i1_partitionsize[0]) : ((s_mvdirect.i1_partitionsize[0]) << 2);*/
320             UWORD8 u1_packed_mb_sub_mb_mode = (u1_mb_partw == 2) ? 0x03 : 0;
321 
322             if(i1_ref_frame0 < 0)
323             {
324                 i2_mv_x = i2_mvX1;
325                 i2_mv_y = i2_mvY1;
326             }
327 
328             /* Change from left shift 4 to 6 - Varun */
329             u1_colz = (ps_cur_mb_info->u1_mb_field_decodingflag << 1)
330                             | ((u1_final_ref_idx == 0) && (ABS(i2_mv_x) <= 1)
331                                             && (ABS(i2_mv_y) <= 1));
332             u1_colz |= (u1_packed_mb_sub_mb_mode << 6);
333         }
334         ps_mv = ps_mv_nmb_start + u1_sub_mb_num;
335         ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u1_sub_mb_num, u1_colz,
336                            u1_mb_partw, u1_mb_partw);
337         if(u1_wd_x == MB_SIZE)
338             ps_dec->u1_currB_type = 0;
339 
340 
341 
342         return OK;
343     }
344     /***************************************************************************/
345     /* If present MB is 16x16 and the partition of colocated Mb is >= PRED_8x8 */
346     /* i.e 8x8 or less than 8x8 partitions then set up DMA for (0,0) and       */
347     /* spatially predicted motion vector and do the multiplexing after         */
348     /* motion compensation                                                     */
349     /***************************************************************************/
350 
351 
352     if((u1_wd_x == MB_SIZE) && (s_mvdirect.i1_num_partitions > 2))
353     {
354         ps_cur_mb_info->u1_Mux = 1;
355         if(i1_ref_frame0 >= 0)
356         {
357 
358             {
359                 pred_info_pkd_t *ps_pred_pkd;
360                WORD8 i1_ref_idx= 0;
361 
362                ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
363             ih264d_fill_pred_info(&(i2_spat_pred_mv[0]),4,4,0,i1_pred,
364                             ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
365                             ps_pic_buff0->u1_pic_type);
366             ps_dec->u4_pred_info_pkd_idx++;
367             ps_cur_mb_info->u1_num_pred_parts++;
368 
369 
370             }
371 
372             /******    (0,0) Motion vectors DMA     *****/
373             {
374                 pred_info_pkd_t *ps_pred_pkd;
375                WORD16 i2_mv[2];
376                WORD8 i1_ref_idx= 0;
377 
378                i2_mv[0] = 0;
379                i2_mv[1] = 0;
380 
381                ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
382             ih264d_fill_pred_info(i2_mv,4,4,0,i1_pred,
383                             ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
384                             ps_pic_buff0->u1_pic_type);
385             ps_dec->u4_pred_info_pkd_idx++;
386             ps_cur_mb_info->u1_num_pred_parts++;
387 
388 
389             }
390         }
391         if(i1_ref_frame1 >= 0)
392         {
393             {
394                 pred_info_pkd_t *ps_pred_pkd;
395                WORD16 i2_mv[2];
396                WORD8 i1_ref_idx= 0;
397 
398                ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
399             ih264d_fill_pred_info(&(i2_spat_pred_mv[2]),4,4,0,i1_pred,
400                             ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
401                             ps_pic_buff1->u1_pic_type);
402             ps_dec->u4_pred_info_pkd_idx++;
403             ps_cur_mb_info->u1_num_pred_parts++;
404 
405 
406             }
407 
408             /******    (0,0) Motion vectors DMA     *****/
409 
410             {
411                 pred_info_pkd_t *ps_pred_pkd;
412                WORD16 i2_mv[2];
413                WORD8 i1_ref_idx= 0;
414 
415                i2_mv[0] = 0;
416                i2_mv[1] = 0;
417 
418                ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
419             ih264d_fill_pred_info(i2_mv,4,4,0,i1_pred,
420                             ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
421                             ps_pic_buff1->u1_pic_type);
422             ps_dec->u4_pred_info_pkd_idx++;
423             ps_cur_mb_info->u1_num_pred_parts++;
424 
425 
426             }
427         }
428     }
429 
430     /*u1_col = *(ps_col_pic->pu1_col_zero_flag + s_mvdirect.i4_mv_indices[0]);
431      u1_col &= 1;
432      u1_init = 0;*/
433 
434     for(i = 0; i < s_mvdirect.i1_num_partitions; i++)
435     {
436         partition_size = s_mvdirect.i1_partitionsize[i];
437         u1_sub_mb_num = s_mvdirect.i1_submb_num[i];
438 
439         sub_partition = partition_size >> 2;
440         partition_size &= 0x3;
441         u1_mb_partw = pu1_mb_partw[partition_size];
442         u1_mb_parth = pu1_mb_parth[partition_size];
443         u2_mask = mask_table[partition_size];
444         if(sub_partition != 0)
445         {
446             u1_mb_partw >>= 1;
447             u1_mb_parth >>= 1;
448             u2_mask = sub_mask_table[partition_size];
449         }
450 
451         u1_col_zero_flag = *(ps_col_pic->pu1_col_zero_flag
452                         + s_mvdirect.i4_mv_indices[i]);
453         u1_col_zero_flag = u1_col_zero_flag & 0x01;
454 
455         /*if(u1_col != u1_col_zero_flag)
456          u1_init = 1;*/
457 
458         if(u1_zero_pred_cond_f || ((i1_ref_frame0 == 0) && (u1_col_zero_flag == 1)))
459         {
460             pi2_final_mv0 = &i2_def_mv[0];
461             ui2_mask_fwd |= (u2_mask << u1_sub_mb_num);
462         }
463         else
464             pi2_final_mv0 = &i2_spat_pred_mv[0];
465 
466         if(u1_zero_pred_cond_b || ((i1_ref_frame1 == 0) && (u1_col_zero_flag == 1)))
467         {
468             pi2_final_mv1 = &i2_def_mv[0];
469             ui2_mask_bwd |= (u2_mask << u1_sub_mb_num);
470         }
471         else
472             pi2_final_mv1 = &i2_spat_pred_mv[2];
473 
474         if(ps_cur_mb_info->u1_Mux != 1)
475         {
476             /*u1_sub_mb_x = u1_sub_mb_num & 0x03;
477              uc_sub_mb_y = (u1_sub_mb_num >> 2);*/
478             if(i1_ref_frame0 >= 0)
479             {
480 
481                 {
482                     pred_info_pkd_t *ps_pred_pkd;
483                    WORD8 i1_ref_idx= 0;
484 
485                    ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
486                 ih264d_fill_pred_info(pi2_final_mv0,u1_mb_partw,u1_mb_parth,u1_sub_mb_num,i1_pred,
487                                 ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
488                                 ps_pic_buff0->u1_pic_type);
489                 ps_dec->u4_pred_info_pkd_idx++;
490                 ps_cur_mb_info->u1_num_pred_parts++;
491 
492 
493                 }
494 
495             }
496 
497             if(i1_ref_frame1 >= 0)
498             {
499                 {
500                     pred_info_pkd_t *ps_pred_pkd;
501                    WORD8 i1_ref_idx= 0;
502 
503                    ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
504                 ih264d_fill_pred_info(pi2_final_mv1,u1_mb_partw,u1_mb_parth,u1_sub_mb_num,i1_pred,
505                                 ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
506                                 ps_pic_buff1->u1_pic_type);
507                 ps_dec->u4_pred_info_pkd_idx++;
508                 ps_cur_mb_info->u1_num_pred_parts++;
509 
510 
511                 }
512             }
513         }
514 
515         /* Replication optimisation */
516         s_temp_mv_pred.i2_mv[0] = pi2_final_mv0[0];
517         s_temp_mv_pred.i2_mv[1] = pi2_final_mv0[1];
518         s_temp_mv_pred.i2_mv[2] = pi2_final_mv1[0];
519         s_temp_mv_pred.i2_mv[3] = pi2_final_mv1[1];
520 
521         /* Calculating colocated zero information */
522         {
523             WORD16 i2_mv_x = 0, i2_mv_y = 0;
524             /*************************************/
525             /* If(bit2 and bit3 set)             */
526             /* then                              */
527             /*  (bit0 and bit1) => submmbmode    */
528             /*  (bit2 and bit3) => mbmode        */
529             /* else                              */
530             /*  (bit0 and bit1) => mbmode        */
531             /*************************************/
532             UWORD8 u1_packed_mb_sub_mb_mode =
533                             sub_partition ? (s_mvdirect.i1_partitionsize[i]) : ((s_mvdirect.i1_partitionsize[i])
534                                                             << 2);
535 
536             if(i1_ref_frame0 >= 0)
537             {
538                 i2_mv_x = pi2_final_mv0[0];
539                 i2_mv_y = pi2_final_mv0[1];
540             }
541             else
542             {
543                 i2_mv_x = pi2_final_mv1[0];
544                 i2_mv_y = pi2_final_mv1[1];
545             }
546 
547             u1_colz = (ps_cur_mb_info->u1_mb_field_decodingflag << 1)
548                             | ((u1_final_ref_idx == 0) && (ABS(i2_mv_x) <= 1)
549                                             && (ABS(i2_mv_y) <= 1));
550             u1_colz |= (u1_packed_mb_sub_mb_mode << 4);
551         }
552         ps_mv = ps_mv_nmb_start + u1_sub_mb_num;
553         ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u1_sub_mb_num, u1_colz,
554                            u1_mb_parth, u1_mb_partw);
555     }
556     i = 0;
557     if(i1_ref_frame0 >= 0)
558         ps_cur_mb_info->u2_mask[i++] = ui2_mask_fwd;
559     if(i1_ref_frame1 >= 0)
560         ps_cur_mb_info->u2_mask[i] = ui2_mask_bwd;
561 
562     /*if(u1_init)
563      H264_DEC_DEBUG_PRINT("hit\n");
564      else
565      H264_DEC_DEBUG_PRINT("miss\n");*/
566 
567     return OK;
568 }
569 
570 /*!
571  **************************************************************************
572  * \if Function name : ih264d_decode_temporal_direct \endif
573  *
574  * \brief
575  *    Decodes temporal direct mode.
576  *
577  * \return
578  *    None.
579  *
580  **************************************************************************
581  */
ih264d_decode_temporal_direct(dec_struct_t * ps_dec,UWORD8 u1_wd_x,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_mb_num)582 WORD32 ih264d_decode_temporal_direct(dec_struct_t * ps_dec,
583                                      UWORD8 u1_wd_x,
584                                      dec_mb_info_t * ps_cur_mb_info,
585                                      UWORD8 u1_mb_num)
586 {
587     struct pic_buffer_t *ps_pic_buff0, *ps_pic_buff1, *ps_col_pic;
588     mv_pred_t *ps_mv, s_temp_mv_pred;
589     UWORD8 u1_sub_mb_num;
590     UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
591     WORD16 i2_mv_x0, i2_mv_y0, i2_mv_x1, i2_mv_y1;
592     UWORD8 u1_mb_partw, u1_mb_parth;
593     UWORD8 i, partition_size, sub_partition;
594     UWORD32 *pui32_weight_ofsts = NULL;
595     directmv_t s_mvdirect;
596     const UWORD8 *pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
597     const UWORD8 *pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
598     WORD8 c_refFrm0, c_refFrm1;
599     UWORD8 u1_ref_idx0, u1_is_cur_mb_fld;
600     WORD32 pic0_poc, pic1_poc, cur_poc;
601     WORD32 ret = 0;
602 
603     u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
604     ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][0];
605 
606     /**********************************************************************/
607     /* Call the function which gets the number of partitions and          */
608     /* partition info of colocated Mb                                     */
609     /**********************************************************************/
610     ps_dec->pf_parse_mvdirect(ps_dec, ps_dec->ps_col_pic, &s_mvdirect, u1_wd_x,
611                            ps_dec->i4_submb_ofst, ps_cur_mb_info);
612     ps_col_pic = ps_dec->ps_col_pic;
613 
614     for(i = 0; i < s_mvdirect.i1_num_partitions; i++)
615     {
616         UWORD8 u1_colz;
617         partition_size = s_mvdirect.i1_partitionsize[i];
618         u1_sub_mb_num = s_mvdirect.i1_submb_num[i];
619         ps_mv = ps_col_pic->ps_mv + s_mvdirect.i4_mv_indices[i];
620 
621         /* This should be removed to catch unitialized memory read */
622         u1_ref_idx0 = 0;
623 
624         sub_partition = partition_size >> 2;
625         partition_size &= 0x3;
626         u1_mb_partw = pu1_mb_partw[partition_size];
627         u1_mb_parth = pu1_mb_parth[partition_size];
628         if(sub_partition != 0)
629         {
630             u1_mb_partw >>= 1;
631             u1_mb_parth >>= 1;
632         }
633         c_refFrm0 = ps_mv->i1_ref_frame[0];
634         c_refFrm1 = ps_mv->i1_ref_frame[1];
635 
636         if((c_refFrm0 == -1) && (c_refFrm1 == -1))
637         {
638             u1_ref_idx0 = 0;
639             ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][0];
640             if(u1_mbaff && u1_is_cur_mb_fld)
641             {
642                 if(ps_cur_mb_info->u1_topmb)
643                 {
644                     pic0_poc = ps_pic_buff0->i4_top_field_order_cnt;
645                     pic1_poc = ps_pic_buff1->i4_top_field_order_cnt;
646                     cur_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
647                 }
648                 else
649                 {
650                     pic1_poc = ps_pic_buff1->i4_bottom_field_order_cnt;
651                     cur_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
652                     ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS];
653                     pic0_poc = ps_pic_buff0->i4_bottom_field_order_cnt;
654                     ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][MAX_REF_BUFS];
655                 }
656             }
657             else
658             {
659                 pic0_poc = ps_pic_buff0->i4_avg_poc;
660                 pic1_poc = ps_pic_buff1->i4_avg_poc;
661                 cur_poc = ps_dec->ps_cur_pic->i4_poc;
662             }
663         }
664         else
665         {
666             UWORD8 uc_i, u1_num_frw_ref_pics;
667             UWORD8 buf_id, u1_pic_type;
668             buf_id = ps_mv->u1_col_ref_pic_idx;
669             u1_pic_type = ps_mv->u1_pic_type;
670             if(ps_dec->ps_cur_slice->u1_field_pic_flag)
671             {
672                 if(s_mvdirect.u1_vert_mv_scale == FRM_TO_FLD)
673                 {
674                     u1_pic_type = TOP_FLD;
675                     if(ps_dec->ps_cur_slice->u1_bottom_field_flag)
676                         u1_pic_type = BOT_FLD;
677                 }
678             }
679             u1_num_frw_ref_pics =
680                             ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
681 
682             for(uc_i = 0; uc_i < u1_num_frw_ref_pics; uc_i++)
683             {
684                 if(ps_dec->ps_cur_slice->u1_field_pic_flag)
685                 {
686                     if(ps_dec->ps_ref_pic_buf_lx[0][uc_i]->u1_mv_buf_id == buf_id)
687                     {
688                         if(ps_dec->ps_ref_pic_buf_lx[0][uc_i]->u1_pic_type
689                                         == u1_pic_type)
690                         {
691                             u1_ref_idx0 = uc_i;
692                             break;
693                         }
694                     }
695                 }
696                 else
697                 {
698                     if(ps_dec->ps_ref_pic_buf_lx[0][uc_i]->u1_mv_buf_id == buf_id)
699                     {
700                         u1_ref_idx0 = uc_i;
701                         break;
702                     }
703                 }
704             }
705 
706             ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][u1_ref_idx0];
707             ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][0];
708 
709             if(u1_mbaff && u1_is_cur_mb_fld)
710             {
711                 pic0_poc = ps_pic_buff0->i4_top_field_order_cnt;
712                 u1_ref_idx0 <<= 1;
713                 if(s_mvdirect.u1_vert_mv_scale == ONE_TO_ONE)
714                 {
715                     if(u1_pic_type == BOT_FLD)
716                     {
717                         pic0_poc = ps_pic_buff0->i4_bottom_field_order_cnt;
718                         ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][(u1_ref_idx0
719                                         >> 1) + MAX_REF_BUFS];
720                         if(ps_cur_mb_info->u1_topmb)
721                             u1_ref_idx0++;
722                     }
723                     else
724                     {
725                         if(1 - ps_cur_mb_info->u1_topmb)
726                             u1_ref_idx0++;
727                     }
728                 }
729                 if(s_mvdirect.u1_vert_mv_scale == FRM_TO_FLD)
730                 {
731                     if(1 - ps_cur_mb_info->u1_topmb)
732                     {
733                         pic0_poc = ps_pic_buff0->i4_bottom_field_order_cnt;
734                         ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][(u1_ref_idx0
735                                         >> 1) + MAX_REF_BUFS];
736                     }
737                 }
738                 if(ps_cur_mb_info->u1_topmb)
739                 {
740                     pic1_poc = ps_pic_buff1->i4_top_field_order_cnt;
741                     cur_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
742                 }
743                 else
744                 {
745                     pic1_poc = ps_pic_buff1->i4_bottom_field_order_cnt;
746                     cur_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
747                     ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS];
748                 }
749             }
750             else
751             {
752                 pic0_poc = ps_pic_buff0->i4_avg_poc;
753                 pic1_poc = ps_pic_buff1->i4_avg_poc;
754                 cur_poc = ps_dec->ps_cur_pic->i4_poc;
755             }
756         }
757         {
758             WORD16 i16_td;
759             WORD32 diff;
760             if(c_refFrm0 >= 0)
761             {
762                 i2_mv_x0 = ps_mv->i2_mv[0];
763                 i2_mv_y0 = ps_mv->i2_mv[1];
764             }
765             else if(c_refFrm1 >= 0)
766             {
767                 i2_mv_x0 = ps_mv->i2_mv[2];
768                 i2_mv_y0 = ps_mv->i2_mv[3];
769             }
770             else
771             {
772                 i2_mv_x0 = 0;
773                 i2_mv_y0 = 0;
774             }
775             /* If FRM_TO_FLD or FLD_TO_FRM scale the "y" component of the colocated Mv*/
776             if(s_mvdirect.u1_vert_mv_scale == FRM_TO_FLD)
777             {
778                 i2_mv_y0 /= 2;
779             }
780             else if(s_mvdirect.u1_vert_mv_scale == FLD_TO_FRM)
781             {
782                 i2_mv_y0 *= 2;
783             }
784 
785             diff = pic1_poc - pic0_poc;
786             i16_td = CLIP_S8(diff);
787             if((ps_pic_buff0->u1_is_short == 0) || (i16_td == 0))
788             {
789                 i2_mv_x1 = 0;
790                 i2_mv_y1 = 0;
791             }
792             else
793             {
794                 WORD16 i16_tb, i16_tx, i2_dist_scale_factor, i16_temp;
795 
796                 diff = cur_poc - pic0_poc;
797                 i16_tb = CLIP_S8(diff);
798 
799                 i16_tx = (16384 + ABS(SIGN_POW2_DIV(i16_td, 1))) / i16_td;
800                 i2_dist_scale_factor = CLIP_S11(
801                                             (((i16_tb * i16_tx) + 32) >> 6));
802                 i16_temp = (i2_mv_x0 * i2_dist_scale_factor + 128) >> 8;
803                 i2_mv_x1 = i16_temp - i2_mv_x0;
804                 i2_mv_x0 = i16_temp;
805 
806                 i16_temp = (i2_mv_y0 * i2_dist_scale_factor + 128) >> 8;
807                 i2_mv_y1 = i16_temp - i2_mv_y0;
808                 i2_mv_y0 = i16_temp;
809             }
810             {
811                 mv_pred_t *ps_mv;
812 
813                 /*u1_sub_mb_x = u1_sub_mb_num & 0x03;
814                  uc_sub_mb_y = u1_sub_mb_num >> 2;*/
815                 if(ps_dec->ps_cur_pps->u1_wted_bipred_idc)
816                 {
817                     UWORD8 u1_idx =
818                                     u1_ref_idx0
819                                                     * ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
820                     UWORD8 u1_scale_ref = u1_mbaff && u1_is_cur_mb_fld;
821                     if(u1_scale_ref)
822                         u1_idx >>= 1;
823                     pui32_weight_ofsts = (UWORD32*)&ps_dec->pu4_wt_ofsts[2
824                                     * X3(u1_idx)];
825                     if(u1_scale_ref
826                                     && (ps_dec->ps_cur_pps->u1_wted_bipred_idc
827                                                     == 2))
828                     {
829                         WORD16 i2_ref_idx;
830                         i2_ref_idx = u1_ref_idx0;
831                         i2_ref_idx *=
832                                         (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
833                                                         << 1);
834                         if(!ps_cur_mb_info->u1_topmb)
835                             i2_ref_idx +=
836                                             (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]
837                                                             << 1)
838                                                             * (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
839                                                                             << 1);
840                         pui32_weight_ofsts =
841                                         (UWORD32*)&ps_dec->pu4_mbaff_wt_mat[2
842                                                         * X3(i2_ref_idx)];
843                     }
844                 }
845                 {
846                     pred_info_pkd_t *ps_pred_pkd;
847                    WORD16 i2_mv[2];
848                    WORD8 i1_ref_idx= 0;
849 
850                    i2_mv[0] = i2_mv_x0;
851                    i2_mv[1] = i2_mv_y0;
852 
853                    ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
854                 ih264d_fill_pred_info(i2_mv,u1_mb_partw,u1_mb_parth,u1_sub_mb_num,PRED_L0 | PRED_L1,
855                                 ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
856                                 ps_pic_buff0->u1_pic_type);
857                 ps_dec->u4_pred_info_pkd_idx++;
858                 ps_cur_mb_info->u1_num_pred_parts++;
859 
860 
861                 }
862                 {
863                    pred_info_pkd_t *ps_pred_pkd;
864                    WORD16 i2_mv[2];
865                    WORD8 i1_ref_idx= 0;
866 
867                    i2_mv[0] = i2_mv_x1;
868                    i2_mv[1] = i2_mv_y1;
869 
870                    ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
871                 ih264d_fill_pred_info(i2_mv,u1_mb_partw,u1_mb_parth,u1_sub_mb_num,PRED_L0 | PRED_L1,
872                                 ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
873                                 ps_pic_buff1->u1_pic_type);
874                 ps_dec->u4_pred_info_pkd_idx++;
875                 ps_cur_mb_info->u1_num_pred_parts++;
876 
877 
878                 }
879 
880                 /* Replication optimisation */
881                 s_temp_mv_pred.i2_mv[0] = i2_mv_x0;
882                 s_temp_mv_pred.i2_mv[1] = i2_mv_y0;
883                 s_temp_mv_pred.i2_mv[2] = i2_mv_x1;
884                 s_temp_mv_pred.i2_mv[3] = i2_mv_y1;
885                 s_temp_mv_pred.i1_ref_frame[0] = u1_ref_idx0;
886                 s_temp_mv_pred.i1_ref_frame[1] = 0;
887                 s_temp_mv_pred.u1_col_ref_pic_idx = ps_pic_buff0->u1_mv_buf_id;
888                 s_temp_mv_pred.u1_pic_type = ps_pic_buff0->u1_pic_type;
889                 ps_mv = ps_dec->ps_mv_cur + (u1_mb_num << 4) + u1_sub_mb_num;
890 
891                 {
892                     WORD16 i2_mv_x = 0, i2_mv_y = 0;
893                     UWORD8 u1_packed_mb_sub_mb_mode =
894                                     sub_partition ? (s_mvdirect.i1_partitionsize[i]) : ((s_mvdirect.i1_partitionsize[i])
895                                                                     << 2);
896 
897                     if(c_refFrm0 >= 0)
898                     {
899                         i2_mv_x = i2_mv_x0;
900                         i2_mv_y = i2_mv_y0;
901                     }
902                     else
903                     {
904                         i2_mv_x = i2_mv_x1;
905                         i2_mv_y = i2_mv_y1;
906                     }
907 
908                     u1_colz =
909                                     (ps_cur_mb_info->u1_mb_field_decodingflag << 1)
910                                                     | ((u1_ref_idx0 == 0)
911                                                                     && (ABS(i2_mv_x)
912                                                                                     <= 1)
913                                                                     && (ABS(i2_mv_y)
914                                                                                     <= 1));
915                     u1_colz |= (u1_packed_mb_sub_mb_mode << 4);
916                 }
917                 ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u1_sub_mb_num,
918                                    u1_colz, u1_mb_parth, u1_mb_partw);
919             }
920         }
921     }
922     /* return value set to UWORD8 to make it homogeneous  */
923     /* with decodespatialdirect                           */
924     return OK;
925 }
926 
ih264d_convert_frm_to_fld_list(struct pic_buffer_t * ps_ref_pic_buf_lx,UWORD8 * pu1_L0,dec_struct_t * ps_dec,UWORD8 u1_num_short_term_bufs)927 void ih264d_convert_frm_to_fld_list(struct pic_buffer_t *ps_ref_pic_buf_lx,
928                                     UWORD8 *pu1_L0,
929                                     dec_struct_t *ps_dec,
930                                     UWORD8 u1_num_short_term_bufs)
931 {
932     UWORD8 uc_count = *pu1_L0, i, uc_l1, uc_lx, j;
933     struct pic_buffer_t *ps_ref_lx[2], *ps_ref_pic_lx;
934     UWORD8 u1_bottom_field_flag;
935     dec_slice_params_t *ps_cur_slice;
936     UWORD8 u1_ref[2], u1_fld[2], u1_same_fld, u1_op_fld;
937     UWORD32 ui_half_num_of_sub_mbs;
938 
939     uc_l1 = 0;
940     uc_lx = 0;
941     ps_cur_slice = ps_dec->ps_cur_slice;
942     ps_ref_pic_lx = ps_ref_pic_buf_lx - MAX_REF_BUFS;
943     ps_ref_lx[0] = ps_ref_pic_buf_lx;
944     ps_ref_lx[1] = ps_ref_pic_buf_lx;
945     u1_bottom_field_flag = ps_cur_slice->u1_bottom_field_flag;
946     ui_half_num_of_sub_mbs = ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5);
947     if(u1_bottom_field_flag)
948     {
949         u1_ref[0] = BOT_REF;
950         u1_ref[1] = TOP_REF;
951         u1_fld[0] = BOT_FLD;
952         u1_fld[1] = TOP_FLD;
953         u1_same_fld = BOT_FLD;
954         u1_op_fld = TOP_FLD;
955     }
956     else
957     {
958         u1_ref[0] = TOP_REF;
959         u1_ref[1] = BOT_REF;
960         u1_fld[0] = TOP_FLD;
961         u1_fld[1] = BOT_FLD;
962         u1_same_fld = TOP_FLD;
963         u1_op_fld = BOT_FLD;
964     }
965 
966     /* Create the field list starting with all the short term     */
967     /* frames followed by all the long term frames. No long term  */
968     /* reference field should have a list idx less than a short   */
969     /* term reference field during initiailization.               */
970 
971     for(j = 0; j < 2; j++)
972     {
973         i = ((j == 0) ? 0 : u1_num_short_term_bufs);
974         uc_count = ((j == 0) ? u1_num_short_term_bufs : *pu1_L0);
975         for(; i < uc_count; i++, ps_ref_lx[0]++)
976         {
977             /* Search field of same parity in Frame list */
978             if((ps_ref_lx[0]->u1_pic_type & u1_ref[0])) // || ((ps_ref_lx[0]->u1_picturetype & 0x3) == 0))
979             {
980                 /* Insert PIC of same parity in RefPicList */
981                 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_lx, ps_ref_lx[0]);
982                 ps_ref_pic_lx->i4_pic_num = (ps_ref_pic_lx->i4_pic_num * 2 + 1);
983                 ps_ref_pic_lx->u1_long_term_pic_num =
984                                 (ps_ref_pic_lx->u1_long_term_frm_idx * 2 + 1);
985                 ps_ref_pic_lx->u1_pic_type = u1_same_fld;
986                 if(u1_fld[0] & BOT_FLD)
987                 {
988                     ps_ref_pic_lx->u1_pic_type = BOT_FLD;
989                     ps_ref_pic_lx->pu1_buf1 += ps_ref_pic_lx->u2_frm_wd_y;
990                     ps_ref_pic_lx->pu1_buf2 += ps_ref_pic_lx->u2_frm_wd_uv;
991                     ps_ref_pic_lx->pu1_buf3 += ps_ref_pic_lx->u2_frm_wd_uv;
992                     if(ps_ref_pic_lx->u1_picturetype & 0x3)
993                     {
994                         ps_ref_pic_lx->pu1_col_zero_flag += ui_half_num_of_sub_mbs;
995                         ps_ref_pic_lx->ps_mv += ui_half_num_of_sub_mbs;
996                     }
997                     ps_ref_pic_lx->i4_poc =
998                                     ps_ref_pic_lx->i4_bottom_field_order_cnt;
999                     ps_ref_pic_lx->i4_avg_poc =
1000                                     ps_ref_pic_lx->i4_bottom_field_order_cnt;
1001                 }
1002                 else
1003                 {
1004                     ps_ref_pic_lx->u1_pic_type = TOP_FLD;
1005                     ps_ref_pic_lx->i4_poc = ps_ref_pic_lx->i4_top_field_order_cnt;
1006                     ps_ref_pic_lx->i4_avg_poc =
1007                                     ps_ref_pic_lx->i4_top_field_order_cnt;
1008                 }
1009 
1010                 ps_ref_pic_lx++;
1011                 uc_lx++;
1012                 /* Find field of opposite parity */
1013                 if(uc_l1 < uc_count && ps_ref_lx[1])
1014                 {
1015                     while(!(ps_ref_lx[1]->u1_pic_type & u1_ref[1]))
1016                     {
1017                         ps_ref_lx[1]++;
1018                         uc_l1++;
1019                         if(uc_l1 >= uc_count)
1020                             ps_ref_lx[1] = 0;
1021                         if(!ps_ref_lx[1])
1022                             break;
1023                     }
1024 
1025                     if(ps_ref_lx[1])
1026                     {
1027                         uc_l1++;
1028                         ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_lx,
1029                                                            ps_ref_lx[1]);
1030                         ps_ref_pic_lx->u1_pic_type = u1_op_fld;
1031                         ps_ref_pic_lx->i4_pic_num = (ps_ref_pic_lx->i4_pic_num * 2);
1032                         ps_ref_pic_lx->u1_long_term_pic_num =
1033                                         (ps_ref_pic_lx->u1_long_term_frm_idx * 2);
1034                         if(u1_fld[1] & BOT_FLD)
1035                         {
1036                             ps_ref_pic_lx->u1_pic_type = BOT_FLD;
1037                             ps_ref_pic_lx->pu1_buf1 += ps_ref_pic_lx->u2_frm_wd_y;
1038                             ps_ref_pic_lx->pu1_buf2 += ps_ref_pic_lx->u2_frm_wd_uv;
1039                             ps_ref_pic_lx->pu1_buf3 += ps_ref_pic_lx->u2_frm_wd_uv;
1040                             if(ps_ref_pic_lx->u1_picturetype & 0x3)
1041                             {
1042                                 ps_ref_pic_lx->pu1_col_zero_flag +=
1043                                                 ui_half_num_of_sub_mbs;
1044                                 ps_ref_pic_lx->ps_mv += ui_half_num_of_sub_mbs;
1045                             }
1046                             ps_ref_pic_lx->i4_poc =
1047                                             ps_ref_pic_lx->i4_bottom_field_order_cnt;
1048                             ps_ref_pic_lx->i4_avg_poc =
1049                                             ps_ref_pic_lx->i4_bottom_field_order_cnt;
1050                         }
1051                         else
1052                         {
1053                             ps_ref_pic_lx->u1_pic_type = TOP_FLD;
1054                             ps_ref_pic_lx->i4_poc =
1055                                             ps_ref_pic_lx->i4_top_field_order_cnt;
1056                             ps_ref_pic_lx->i4_avg_poc =
1057                                             ps_ref_pic_lx->i4_top_field_order_cnt;
1058                         }
1059                         ps_ref_pic_lx++;
1060                         uc_lx++;
1061                         ps_ref_lx[1]++;
1062                     }
1063                 }
1064             }
1065         }
1066 
1067         /* Same parity fields are over, now insert left over opposite parity fields */
1068         /** Added  if(ps_ref_lx[1]) for error checks */
1069         if(ps_ref_lx[1])
1070         {
1071             for(; uc_l1 < uc_count; uc_l1++)
1072             {
1073                 if(ps_ref_lx[1]->u1_pic_type & u1_ref[1])
1074                 {
1075                     /* Insert PIC of opposite parity in RefPicList */
1076                     ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_lx,
1077                                                        ps_ref_lx[1]);
1078                     ps_ref_pic_lx->u1_pic_type = u1_op_fld;
1079                     ps_ref_pic_lx->i4_pic_num = (ps_ref_pic_lx->i4_pic_num * 2);
1080                     ps_ref_pic_lx->u1_long_term_pic_num =
1081                                     (ps_ref_pic_lx->u1_long_term_frm_idx * 2);
1082                     if(u1_op_fld == BOT_FLD)
1083                     {
1084                         ps_ref_pic_lx->u1_pic_type = BOT_FLD;
1085                         ps_ref_pic_lx->pu1_buf1 += ps_ref_pic_lx->u2_frm_wd_y;
1086                         ps_ref_pic_lx->pu1_buf2 += ps_ref_pic_lx->u2_frm_wd_uv;
1087                         ps_ref_pic_lx->pu1_buf3 += ps_ref_pic_lx->u2_frm_wd_uv;
1088                         if(ps_ref_pic_lx->u1_picturetype & 0x3)
1089                         {
1090                             ps_ref_pic_lx->pu1_col_zero_flag +=
1091                                             ui_half_num_of_sub_mbs;
1092                             ps_ref_pic_lx->ps_mv += ui_half_num_of_sub_mbs;
1093                         }
1094                         ps_ref_pic_lx->i4_poc =
1095                                         ps_ref_pic_lx->i4_bottom_field_order_cnt;
1096                         ps_ref_pic_lx->i4_avg_poc =
1097                                         ps_ref_pic_lx->i4_bottom_field_order_cnt;
1098                     }
1099                     else
1100                     {
1101                         ps_ref_pic_lx->i4_poc =
1102                                         ps_ref_pic_lx->i4_top_field_order_cnt;
1103                         ps_ref_pic_lx->i4_avg_poc =
1104                                         ps_ref_pic_lx->i4_top_field_order_cnt;
1105                     }
1106                     ps_ref_pic_lx++;
1107                     uc_lx++;
1108                     ps_ref_lx[1]++;
1109                 }
1110             }
1111         }
1112     }
1113     *pu1_L0 = uc_lx;
1114 }
1115 
ih264d_convert_frm_mbaff_list(dec_struct_t * ps_dec)1116 void ih264d_convert_frm_mbaff_list(dec_struct_t *ps_dec)
1117 {
1118     struct pic_buffer_t **ps_ref_pic_lx;
1119     UWORD8 u1_max_ref_idx, idx;
1120     UWORD16 u2_frm_wd_y, u2_frm_wd_uv;
1121     struct pic_buffer_t **ps_ref_pic_buf_lx;
1122     UWORD32 u4_half_num_of_sub_mbs = ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5);
1123 
1124     ps_ref_pic_buf_lx = ps_dec->ps_ref_pic_buf_lx[0];
1125     ps_ref_pic_lx = ps_dec->ps_ref_pic_buf_lx[0];
1126     u1_max_ref_idx = ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
1127     for(idx = 0; idx < u1_max_ref_idx; idx++)
1128     {
1129         ps_ref_pic_lx[idx]->u1_pic_type = TOP_FLD;
1130         ps_ref_pic_lx[idx]->i4_poc = ps_ref_pic_lx[idx]->i4_top_field_order_cnt;
1131 
1132     }
1133     u2_frm_wd_y = ps_dec->u2_frm_wd_y;
1134     u2_frm_wd_uv = ps_dec->u2_frm_wd_uv;
1135 
1136     for(idx = 0; idx < u1_max_ref_idx; idx++)
1137     {
1138         *ps_ref_pic_lx[idx + MAX_REF_BUFS] = *ps_ref_pic_buf_lx[idx];
1139         ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf1 =
1140                         ps_ref_pic_buf_lx[idx]->pu1_buf1 + u2_frm_wd_y;
1141         ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf2 =
1142                         ps_ref_pic_buf_lx[idx]->pu1_buf2 + u2_frm_wd_uv;
1143         ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf3 =
1144                         ps_ref_pic_buf_lx[idx]->pu1_buf3 + u2_frm_wd_uv;
1145 
1146         ps_ref_pic_lx[idx + MAX_REF_BUFS]->u1_pic_type = BOT_FLD;
1147         ps_ref_pic_lx[idx + MAX_REF_BUFS]->i4_poc =
1148                         ps_ref_pic_buf_lx[idx]->i4_bottom_field_order_cnt;
1149         if(ps_ref_pic_buf_lx[idx]->u1_picturetype & 0x3)
1150         {
1151             ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_col_zero_flag =
1152                             ps_ref_pic_buf_lx[idx]->pu1_col_zero_flag
1153                                             + u4_half_num_of_sub_mbs;
1154             ps_ref_pic_lx[idx + MAX_REF_BUFS]->ps_mv =
1155                             ps_ref_pic_buf_lx[idx]->ps_mv + u4_half_num_of_sub_mbs;
1156         }
1157     }
1158 
1159     if(ps_dec->u1_B)
1160     {
1161         ps_ref_pic_buf_lx = ps_dec->ps_ref_pic_buf_lx[1];
1162         ps_ref_pic_lx = ps_dec->ps_ref_pic_buf_lx[1];
1163         u1_max_ref_idx = ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
1164         for(idx = 0; idx < u1_max_ref_idx; idx++)
1165         {
1166             ps_ref_pic_lx[idx]->u1_pic_type = TOP_FLD;
1167             ps_ref_pic_lx[idx]->i4_poc = ps_ref_pic_lx[idx]->i4_top_field_order_cnt;
1168 
1169         }
1170 
1171         for(idx = 0; idx < u1_max_ref_idx; idx++)
1172         {
1173             *ps_ref_pic_lx[idx + MAX_REF_BUFS] = *ps_ref_pic_buf_lx[idx];
1174             ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf1 =
1175                             ps_ref_pic_buf_lx[idx]->pu1_buf1 + u2_frm_wd_y;
1176             ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf2 =
1177                             ps_ref_pic_buf_lx[idx]->pu1_buf2 + u2_frm_wd_uv;
1178             ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf3 =
1179                             ps_ref_pic_buf_lx[idx]->pu1_buf3 + u2_frm_wd_uv;
1180             ps_ref_pic_lx[idx + MAX_REF_BUFS]->u1_pic_type = BOT_FLD;
1181             ps_ref_pic_lx[idx + MAX_REF_BUFS]->i4_poc =
1182                             ps_ref_pic_buf_lx[idx]->i4_bottom_field_order_cnt;
1183 
1184             if(ps_ref_pic_buf_lx[idx]->u1_picturetype & 0x3)
1185             {
1186                 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_col_zero_flag =
1187                                 ps_ref_pic_buf_lx[idx]->pu1_col_zero_flag
1188                                                 + u4_half_num_of_sub_mbs;
1189                 ps_ref_pic_lx[idx + MAX_REF_BUFS]->ps_mv =
1190                                 ps_ref_pic_buf_lx[idx]->ps_mv
1191                                                 + u4_half_num_of_sub_mbs;
1192             }
1193         }
1194     }
1195 }
1196 /*!
1197  **************************************************************************
1198  * \if Function name : ih264d_init_ref_idx_lx_b \endif
1199  *
1200  * \brief
1201  *    Initializes forward and backward refernce lists for B slice decoding.
1202  *
1203  *
1204  * \return
1205  *    0 on Success and Error code otherwise
1206  **************************************************************************
1207  */
ih264d_init_ref_idx_lx_b(dec_struct_t * ps_dec)1208 void ih264d_init_ref_idx_lx_b(dec_struct_t *ps_dec)
1209 {
1210     struct pic_buffer_t *ps_ref_pic_buf_lx;
1211     dpb_manager_t *ps_dpb_mgr;
1212     struct dpb_info_t *ps_next_dpb;
1213     WORD32 i_cur_poc, i_max_st_poc, i_min_st_poc, i_ref_poc, i_temp_poc;
1214     WORD8 i;
1215     UWORD8 u1_max_lt_index, u1_min_lt_index;
1216     UWORD32 u4_lt_index;
1217     UWORD8 u1_field_pic_flag;
1218     dec_slice_params_t *ps_cur_slice;
1219     UWORD8 u1_L0, u1_L1;
1220     UWORD8 u1_num_short_term_bufs;
1221     UWORD8 u1_max_ref_idx_l0, u1_max_ref_idx_l1;
1222 
1223     ps_cur_slice = ps_dec->ps_cur_slice;
1224     u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
1225     u1_max_ref_idx_l0 = ps_cur_slice->u1_num_ref_idx_lx_active[0]
1226                     << u1_field_pic_flag;
1227     u1_max_ref_idx_l1 = ps_cur_slice->u1_num_ref_idx_lx_active[1]
1228                     << u1_field_pic_flag;
1229 
1230     ps_dpb_mgr = ps_dec->ps_dpb_mgr;
1231     /* Get the current POC */
1232     i_cur_poc = ps_dec->ps_cur_pic->i4_poc;
1233 
1234     /* Get MaxStPOC,MinStPOC,MaxLt,MinLt */
1235     i_max_st_poc = i_cur_poc;
1236     i_min_st_poc = i_cur_poc;
1237     u1_max_lt_index = MAX_REF_BUFS + 1;
1238     u1_min_lt_index = MAX_REF_BUFS + 1;
1239     /* Start from ST head */
1240     ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1241     for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
1242     {
1243         i_ref_poc = ps_next_dpb->ps_pic_buf->i4_poc;
1244         if(i_ref_poc < i_cur_poc)
1245         {
1246             /* RefPic Buf POC is before Current POC in display order */
1247             i_min_st_poc = MIN(i_min_st_poc, i_ref_poc);
1248         }
1249         else
1250         {
1251             /* RefPic Buf POC is after Current POC in display order */
1252             i_max_st_poc = MAX(i_max_st_poc, i_ref_poc);
1253         }
1254 
1255         /* Chase the next link */
1256         ps_next_dpb = ps_next_dpb->ps_prev_short;
1257     }
1258 
1259     /* Start from LT head */
1260     ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
1261     if(ps_next_dpb)
1262     {
1263         u1_max_lt_index = ps_next_dpb->u1_lt_idx;
1264         u1_min_lt_index = ps_next_dpb->u1_lt_idx;
1265     }
1266     for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
1267     {
1268         u4_lt_index = ps_next_dpb->u1_lt_idx;
1269         u1_max_lt_index = (UWORD8)(MAX(u1_max_lt_index, u4_lt_index));
1270         u1_min_lt_index = (UWORD8)(MIN(u1_min_lt_index, u4_lt_index));
1271 
1272         /* Chase the next link */
1273         ps_next_dpb = ps_next_dpb->ps_prev_long;
1274     }
1275 
1276     /* 1. Initialize refIdxL0 */
1277     u1_L0 = 0;
1278     if(u1_field_pic_flag)
1279     {
1280         ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[0][0];
1281         ps_ref_pic_buf_lx += MAX_REF_BUFS;
1282         i_temp_poc = i_cur_poc;
1283     }
1284     else
1285     {
1286         ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[0][0];
1287         i_temp_poc = i_cur_poc - 1;
1288     }
1289     /* Arrange all short term buffers in output order as given by POC */
1290     /* 1.1 Arrange POC's less than CurrPOC in the descending POC order starting
1291      from (CurrPOC - 1)*/
1292     for(; i_temp_poc >= i_min_st_poc; i_temp_poc--)
1293     {
1294         /* Start from ST head */
1295         ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1296         for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
1297         {
1298             if((WORD32)ps_next_dpb->ps_pic_buf->i4_poc == i_temp_poc)
1299             {
1300                 /* Copy info in pic buffer */
1301                 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
1302                                                    ps_next_dpb->ps_pic_buf);
1303                 ps_ref_pic_buf_lx++;
1304                 u1_L0++;
1305                 break;
1306             }
1307             ps_next_dpb = ps_next_dpb->ps_prev_short;
1308         }
1309     }
1310 
1311     {
1312         /* 1.2. Arrange POC's more than CurrPOC in the ascending POC order starting
1313          from (CurrPOC + 1)*/
1314         for(i_temp_poc = i_cur_poc + 1; i_temp_poc <= i_max_st_poc; i_temp_poc++)
1315         {
1316             /* Start from ST head */
1317             ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1318             for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
1319             {
1320                 if((WORD32)ps_next_dpb->ps_pic_buf->i4_poc == i_temp_poc)
1321                 {
1322                     ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
1323                                                        ps_next_dpb->ps_pic_buf);
1324                     ps_ref_pic_buf_lx++;
1325                     u1_L0++;
1326                     break;
1327                 }
1328                 ps_next_dpb = ps_next_dpb->ps_prev_short;
1329             }
1330         }
1331     }
1332 
1333     /* 1.3 Arrange all Long term buffers in ascending order, in LongtermIndex */
1334     /* Start from ST head */
1335 
1336     u1_num_short_term_bufs = u1_L0;
1337     for(u4_lt_index = u1_min_lt_index; u4_lt_index <= u1_max_lt_index; u4_lt_index++)
1338     {
1339         ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
1340         for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
1341         {
1342             if(ps_next_dpb->u1_lt_idx == u4_lt_index)
1343             {
1344                 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
1345                                                    ps_next_dpb->ps_pic_buf);
1346                 ps_ref_pic_buf_lx->u1_long_term_pic_num =
1347                                 ps_ref_pic_buf_lx->u1_long_term_frm_idx;
1348 
1349                 ps_ref_pic_buf_lx++;
1350                 u1_L0++;
1351                 break;
1352             }
1353             ps_next_dpb = ps_next_dpb->ps_prev_long;
1354         }
1355     }
1356 
1357     if(u1_field_pic_flag)
1358     {
1359         /* Initialize the rest of the entries in the */
1360         /* reference list to handle of errors        */
1361         {
1362             UWORD8 u1_i;
1363             pic_buffer_t *ps_ref_pic;
1364 
1365             ps_ref_pic = ps_dpb_mgr->ps_init_dpb[0][0] + MAX_REF_BUFS;
1366 
1367             if(NULL == ps_ref_pic->pu1_buf1)
1368             {
1369                 ps_ref_pic = ps_dec->ps_cur_pic;
1370             }
1371             for(u1_i = u1_L0; u1_i < u1_max_ref_idx_l0; u1_i++)
1372             {
1373                 *ps_ref_pic_buf_lx = *ps_ref_pic;
1374                 ps_ref_pic_buf_lx++;
1375             }
1376         }
1377         ih264d_convert_frm_to_fld_list(
1378                         ps_dpb_mgr->ps_init_dpb[0][0] + MAX_REF_BUFS, &u1_L0,
1379                         ps_dec, u1_num_short_term_bufs);
1380 
1381         ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[0][0] + u1_L0;
1382     }
1383 
1384     ps_dec->ps_cur_slice->u1_initial_list_size[0] = u1_L0;
1385 
1386     /* Initialize the rest of the entries in the */
1387     /* reference list to handle of errors        */
1388     {
1389         UWORD8 u1_i;
1390         pic_buffer_t *ps_ref_pic;
1391 
1392         ps_ref_pic = ps_dpb_mgr->ps_init_dpb[0][0];
1393 
1394         if(NULL == ps_ref_pic->pu1_buf1)
1395         {
1396             ps_ref_pic = ps_dec->ps_cur_pic;
1397         }
1398         for(u1_i = u1_L0; u1_i < u1_max_ref_idx_l0; u1_i++)
1399         {
1400             *ps_ref_pic_buf_lx = *ps_ref_pic;
1401             ps_ref_pic_buf_lx++;
1402         }
1403     }
1404     {
1405         /* 2. Initialize refIdxL1 */
1406         u1_L1 = 0;
1407         if(u1_field_pic_flag)
1408         {
1409             ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[1][0] + MAX_REF_BUFS;
1410         }
1411         else
1412         {
1413             ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[1][0];
1414         }
1415 
1416         /* 2.1. Arrange POC's more than CurrPOC in the ascending POC order starting
1417          from (CurrPOC + 1)*/
1418         for(i_temp_poc = i_cur_poc + 1; i_temp_poc <= i_max_st_poc; i_temp_poc++)
1419         {
1420             /* Start from ST head */
1421             ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1422             for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
1423             {
1424                 if((WORD32)ps_next_dpb->ps_pic_buf->i4_poc == i_temp_poc)
1425                 {
1426                     ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
1427                                                        ps_next_dpb->ps_pic_buf);
1428                     ps_ref_pic_buf_lx++;
1429                     u1_L1++;
1430                     break;
1431                 }
1432                 ps_next_dpb = ps_next_dpb->ps_prev_short;
1433             }
1434         }
1435 
1436         if(u1_field_pic_flag)
1437         {
1438             i_temp_poc = i_cur_poc;
1439         }
1440         else
1441         {
1442             i_temp_poc = i_cur_poc - 1;
1443         }
1444 
1445         /* Arrange all short term buffers in output order as given by POC */
1446         /* 2.2 Arrange POC's less than CurrPOC in the descending POC order starting
1447          from (CurrPOC - 1)*/
1448         for(; i_temp_poc >= i_min_st_poc; i_temp_poc--)
1449         {
1450             /* Start from ST head */
1451             ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1452             for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
1453             {
1454                 if((WORD32)ps_next_dpb->ps_pic_buf->i4_poc == i_temp_poc)
1455                 {
1456                     ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
1457                                                        ps_next_dpb->ps_pic_buf);
1458                     ps_ref_pic_buf_lx++;
1459                     u1_L1++;
1460                     break;
1461                 }
1462                 ps_next_dpb = ps_next_dpb->ps_prev_short;
1463             }
1464         }
1465 
1466         /* 2.3 Arrange all Long term buffers in ascending order, in LongtermIndex */
1467         /* Start from ST head */
1468         u1_num_short_term_bufs = u1_L1;
1469 
1470         for(u4_lt_index = u1_min_lt_index; u4_lt_index <= u1_max_lt_index;
1471                         u4_lt_index++)
1472         {
1473             ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
1474             for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
1475             {
1476                 if(ps_next_dpb->u1_lt_idx == u4_lt_index)
1477                 {
1478                     ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
1479                                                        ps_next_dpb->ps_pic_buf);
1480                     ps_ref_pic_buf_lx->u1_long_term_pic_num =
1481                                     ps_ref_pic_buf_lx->u1_long_term_frm_idx;
1482                     ps_ref_pic_buf_lx++;
1483                     u1_L1++;
1484                     break;
1485                 }
1486                 ps_next_dpb = ps_next_dpb->ps_prev_long;
1487             }
1488         }
1489 
1490         if(u1_field_pic_flag)
1491         {
1492             /* Initialize the rest of the entries in the */
1493             /* reference list to handle of errors        */
1494             {
1495                 UWORD8 u1_i;
1496                 pic_buffer_t *ps_ref_pic;
1497 
1498                 ps_ref_pic = ps_dpb_mgr->ps_init_dpb[0][0] + MAX_REF_BUFS;
1499 
1500                 if(NULL == ps_ref_pic->pu1_buf1)
1501                 {
1502                     ps_ref_pic = ps_dec->ps_cur_pic;
1503                 }
1504                 for(u1_i = u1_L1; u1_i < u1_max_ref_idx_l1; u1_i++)
1505                 {
1506                     *ps_ref_pic_buf_lx = *ps_ref_pic;
1507                     ps_ref_pic_buf_lx++;
1508                 }
1509             }
1510 
1511             ih264d_convert_frm_to_fld_list(
1512                             ps_dpb_mgr->ps_init_dpb[1][0] + MAX_REF_BUFS,
1513                             &u1_L1, ps_dec, u1_num_short_term_bufs);
1514             ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[1][0] + u1_L1;
1515         }
1516 
1517         ps_dec->ps_cur_slice->u1_initial_list_size[1] = u1_L1;
1518 
1519         /* Initialize the rest of the entries in the */
1520         /* reference list to handle of errors        */
1521         {
1522             UWORD8 u1_i;
1523             pic_buffer_t *ps_ref_pic;
1524 
1525             ps_ref_pic = ps_dpb_mgr->ps_init_dpb[0][0];
1526 
1527             if(NULL == ps_ref_pic->pu1_buf1)
1528             {
1529                 ps_ref_pic = ps_dec->ps_cur_pic;
1530             }
1531             for(u1_i = u1_L1; u1_i < u1_max_ref_idx_l1; u1_i++)
1532             {
1533                 *ps_ref_pic_buf_lx = *ps_ref_pic;
1534                 ps_ref_pic_buf_lx++;
1535             }
1536         }
1537 
1538         /* If list0 and list 1 ebtries are same then swap the 0th and 1st entry */
1539         /* of list 1                                                            */
1540         {
1541             struct pic_buffer_t *ps_ref_pic1_buf_l0, *ps_ref_pic1_buf_l1;
1542             struct pic_buffer_t s_ref_pic1_buf_temp;
1543 
1544             ps_ref_pic1_buf_l0 = ps_dpb_mgr->ps_init_dpb[0][0];
1545             ps_ref_pic1_buf_l1 = ps_dpb_mgr->ps_init_dpb[1][0];
1546 
1547             if((u1_L0 == u1_L1) && (u1_L0 > 1))
1548             {
1549                 WORD32 i_index, i_swap;
1550 
1551                 i_swap = 1;
1552 
1553                 for(i_index = 0; i_index < u1_L0; i_index++)
1554                 {
1555                     if((ps_ref_pic1_buf_l0[i_index]).pu1_buf1
1556                                     != (ps_ref_pic1_buf_l1[i_index]).pu1_buf1)
1557                     {
1558                         i_swap = 0;
1559                         break;
1560                     }
1561                 }
1562                 if(1 == i_swap)
1563                 {
1564                     memcpy(&s_ref_pic1_buf_temp, &ps_ref_pic1_buf_l1[1],
1565                            sizeof(struct pic_buffer_t));
1566                     memcpy(&ps_ref_pic1_buf_l1[1], &ps_ref_pic1_buf_l1[0],
1567                            sizeof(struct pic_buffer_t));
1568                     memcpy(&ps_ref_pic1_buf_l1[0], &s_ref_pic1_buf_temp,
1569                            sizeof(struct pic_buffer_t));
1570                 }
1571             }
1572         }
1573     }
1574 }
1575 
1576 
1577 
1578 void ih264d_get_implicit_weights(dec_struct_t *ps_dec);
1579 
1580 /*!
1581  **************************************************************************
1582  * \if Function name : ih264d_one_to_one \endif
1583  *
1584  * \brief
1585  *    Initializes forward and backward refernce lists for B slice decoding.
1586  *
1587  *
1588  * \return
1589  *    0 on Success and Error code otherwise
1590  **************************************************************************
1591  */
ih264d_one_to_one(dec_struct_t * ps_dec,struct pic_buffer_t * ps_col_pic,directmv_t * ps_direct,UWORD8 u1_wd_x,WORD32 u2_sub_mb_ofst,dec_mb_info_t * ps_cur_mb_info)1592 void ih264d_one_to_one(dec_struct_t *ps_dec,
1593                        struct pic_buffer_t *ps_col_pic,
1594                        directmv_t *ps_direct,
1595                        UWORD8 u1_wd_x,
1596                        WORD32 u2_sub_mb_ofst,
1597                        dec_mb_info_t * ps_cur_mb_info)
1598 {
1599     UWORD8 *pu1_col_zero_flag_start, u1_col_mb_pred_mode, u1_num_blks, u1_sub_mb_num;
1600     UWORD8 u1_init_colzero_flag;
1601     UNUSED(ps_cur_mb_info);
1602     pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
1603     u1_col_mb_pred_mode = pu1_col_zero_flag_start[ps_dec->u1_sub_mb_num];
1604     u1_init_colzero_flag = u1_col_mb_pred_mode & 1;
1605     u1_col_mb_pred_mode >>= 6;
1606     ps_direct->u1_vert_mv_scale = ONE_TO_ONE;
1607     ps_direct->u1_col_zeroflag_change = 0;
1608 
1609     if(u1_wd_x == MB_SIZE)
1610     {
1611         ps_dec->u1_currB_type = (!!u1_col_mb_pred_mode);
1612         if(u1_col_mb_pred_mode == PRED_16x16)
1613         {
1614             ps_direct->i1_num_partitions = 1;
1615             ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
1616             ps_direct->i1_submb_num[0] = 0;
1617             ps_direct->i1_partitionsize[0] = PRED_16x16;
1618 
1619             return;
1620         }
1621         else if(u1_col_mb_pred_mode < PRED_8x8)
1622         {
1623             ps_direct->i1_num_partitions = 2;
1624             ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
1625             ps_direct->i1_submb_num[0] = 0;
1626             ps_direct->i1_partitionsize[0] = u1_col_mb_pred_mode;
1627             u1_sub_mb_num = (u1_col_mb_pred_mode == PRED_16x8) ? 8 : 2;
1628             ps_direct->i1_submb_num[1] = u1_sub_mb_num;
1629             ps_direct->i4_mv_indices[1] = u2_sub_mb_ofst
1630                             + ps_direct->i1_submb_num[1];
1631             ps_direct->i1_partitionsize[1] = u1_col_mb_pred_mode;
1632             if((pu1_col_zero_flag_start[u1_sub_mb_num] & 1) != u1_init_colzero_flag)
1633                 ps_direct->u1_col_zeroflag_change = 1;
1634             return;
1635         }
1636         else
1637         {
1638             u1_num_blks = 4;
1639         }
1640     }
1641     else
1642     {
1643         u1_num_blks = 1;
1644     }
1645 
1646     {
1647         const UWORD8 *pu1_top_lt_mb_part_idx;
1648         UWORD8 u1_col_sub_mb_pred_mode, uc_blk, u1_sub_blk, u1_submb_col = 0;
1649         UWORD8 u1_num_sub_blks, uc_direct8x8inf, *pu1_col_zero_flag, u1_sub_mb_num;
1650         const UWORD8 *pu1_num_sub_mb_part =
1651                         (const UWORD8 *)gau1_ih264d_num_submb_part;
1652         UWORD8 i1_num_partitions = 0, partition_size;
1653         WORD32 mv_index;
1654         const UWORD8 *pu1_top_lt_sub_mb_idx = gau1_ih264d_submb_indx_mod_sp_drct;
1655 
1656         u1_sub_mb_num = ps_dec->u1_sub_mb_num;
1657         uc_direct8x8inf = ps_dec->ps_cur_slice->u1_direct_8x8_inference_flag;
1658         pu1_top_lt_mb_part_idx = gau1_ih264d_top_left_mb_part_indx_mod
1659                         + (PRED_8x8 << 1) + 1;
1660 
1661         for(uc_blk = 0; uc_blk < u1_num_blks; uc_blk++)
1662         {
1663             partition_size = PRED_8x8;
1664             pu1_top_lt_sub_mb_idx = gau1_ih264d_submb_indx_mod_sp_drct;
1665             if(uc_direct8x8inf == 1)
1666             {
1667                 u1_submb_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
1668                 mv_index = u2_sub_mb_ofst + u1_submb_col;
1669                 u1_num_sub_blks = 1;
1670             }
1671             else
1672             {
1673                 /* colMbPart is either 8x8, 8x4, 4x8, 4x4 */
1674                 pu1_col_zero_flag = pu1_col_zero_flag_start + u1_sub_mb_num;
1675                 u1_col_sub_mb_pred_mode = *pu1_col_zero_flag;
1676                 u1_col_sub_mb_pred_mode = (u1_col_sub_mb_pred_mode & 0x30) >> 4;
1677                 partition_size = (UWORD8)((u1_col_sub_mb_pred_mode)
1678                                 | (PRED_8x8 << 2));
1679                 mv_index = u2_sub_mb_ofst + u1_sub_mb_num;
1680                 pu1_top_lt_sub_mb_idx += (u1_col_sub_mb_pred_mode << 1);
1681                 u1_num_sub_blks = pu1_num_sub_mb_part[u1_col_sub_mb_pred_mode];
1682 
1683             }
1684 
1685             for(u1_sub_blk = 0; u1_sub_blk < u1_num_sub_blks;
1686                             u1_sub_blk++, pu1_top_lt_sub_mb_idx++)
1687             {
1688                 u1_sub_mb_num += *pu1_top_lt_sub_mb_idx;
1689                 mv_index += *pu1_top_lt_sub_mb_idx;
1690                 ps_direct->i4_mv_indices[i1_num_partitions] = mv_index;
1691                 ps_direct->i1_submb_num[i1_num_partitions] = u1_sub_mb_num;
1692                 ps_direct->i1_partitionsize[i1_num_partitions] = partition_size;
1693                 i1_num_partitions++;
1694                 if(!uc_direct8x8inf)
1695                     u1_submb_col = u1_sub_mb_num;
1696                 if((pu1_col_zero_flag_start[u1_submb_col] & 1)
1697                                 != u1_init_colzero_flag)
1698                     ps_direct->u1_col_zeroflag_change = 1;
1699             }
1700             u1_sub_mb_num = *pu1_top_lt_mb_part_idx++;
1701         }
1702         ps_direct->i1_num_partitions = i1_num_partitions;
1703     }
1704 }
1705 /*!
1706  **************************************************************************
1707  * \if Function name : ih264d_mbaff_cross_pmbair \endif
1708  *
1709  * \brief
1710  *    Initializes forward and backward refernce lists for B slice decoding.
1711  *
1712  *
1713  * \return
1714  *    0 on Success and Error code otherwise
1715  **************************************************************************
1716  */
ih264d_mbaff_cross_pmbair(dec_struct_t * ps_dec,struct pic_buffer_t * ps_col_pic,directmv_t * ps_direct,UWORD8 u1_wd_x,WORD32 u2_sub_mb_ofst,dec_mb_info_t * ps_cur_mb_info)1717 void ih264d_mbaff_cross_pmbair(dec_struct_t *ps_dec,
1718                                struct pic_buffer_t *ps_col_pic,
1719                                directmv_t *ps_direct,
1720                                UWORD8 u1_wd_x,
1721                                WORD32 u2_sub_mb_ofst,
1722                                dec_mb_info_t * ps_cur_mb_info)
1723 {
1724     UWORD8 *pu1_col_zero_flag_start, *pu1_col_zero_flag, u1_sub_mb_num,
1725                     uc_sub_mb_num_col;
1726     UWORD8 *pu1_col_zero_flag_right_half;
1727     WORD32 i4_force_8X8;
1728     UWORD8 u1_num_blks, u1_col_mb_pred_mode, uc_blk, u1_col_sub_mb_pred_mode,
1729                     u1_col_sub_mb_pred_mode_rt;
1730     UWORD8 i1_num_partitions = 0, partition_size;
1731 
1732     WORD32 mv_index;
1733 
1734     UWORD8 u1_num_sub_blks;
1735     UWORD8 u1_is_cur_mb_fld, i;
1736     UWORD8 u1_init_colzero_flag;
1737 
1738     u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
1739     u1_sub_mb_num = ps_dec->u1_sub_mb_num;
1740     ps_direct->u1_col_zeroflag_change = 0;
1741     /*pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
1742      u1_col_mb_pred_mode = pu1_col_zero_flag_start[u1_sub_mb_num];
1743      u1_init_colzero_flag = u1_col_mb_pred_mode & 1;
1744      u1_col_mb_pred_mode >>= 6; */
1745     if(0 == u1_is_cur_mb_fld)
1746     {
1747         ps_direct->u1_vert_mv_scale = FLD_TO_FRM;
1748         if(u1_wd_x == MB_SIZE)
1749         {
1750             pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag
1751                             + u2_sub_mb_ofst;
1752             u1_col_mb_pred_mode = pu1_col_zero_flag_start[0];
1753             u1_init_colzero_flag = u1_col_mb_pred_mode & 1;
1754             u1_col_mb_pred_mode >>= 6;
1755 
1756 
1757             if(u1_col_mb_pred_mode & 0x2)
1758             {
1759                 ps_dec->u1_currB_type = 1;
1760                 if(u1_col_mb_pred_mode == PRED_8x16)
1761                 {
1762                     ps_direct->i1_num_partitions = 2;
1763                     ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
1764                     ps_direct->i1_submb_num[0] = 0;
1765                     ps_direct->i1_partitionsize[0] = PRED_8x16;
1766                     ps_direct->i4_mv_indices[1] = u2_sub_mb_ofst + 2;
1767                     ps_direct->i1_submb_num[1] = 2;
1768                     ps_direct->i1_partitionsize[1] = PRED_8x16;
1769                     if((pu1_col_zero_flag_start[2] & 1) != u1_init_colzero_flag)
1770                         ps_direct->u1_col_zeroflag_change = 1;
1771                 }
1772                 else
1773                 {
1774                     pu1_col_zero_flag = pu1_col_zero_flag_start + u1_sub_mb_num;
1775                     u1_col_sub_mb_pred_mode = (*pu1_col_zero_flag & 0x10);/* 8x4 or 4x4 mode */
1776 
1777                     pu1_col_zero_flag_right_half = pu1_col_zero_flag_start
1778                                     + u1_sub_mb_num + 2;
1779                     u1_col_sub_mb_pred_mode_rt =
1780                                     (*pu1_col_zero_flag_right_half & 0x10);/* 8x4 or 4x4 mode */
1781 
1782                     i4_force_8X8 = (u1_col_sub_mb_pred_mode)
1783                                     || (u1_col_sub_mb_pred_mode_rt);
1784                     if(i4_force_8X8)
1785                     {
1786                         u1_num_sub_blks = 2;
1787                         partition_size = PRED_8x8;
1788                     }
1789                     else
1790                     {
1791                         partition_size = PRED_8x16;
1792                         u1_num_sub_blks = 1;
1793                     }
1794 
1795                     for(i = 0; i < 2; i++)
1796                     {
1797                         for(uc_blk = 0; uc_blk < u1_num_sub_blks; uc_blk++)
1798                         {
1799                             uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
1800                             uc_sub_mb_num_col &= 0x7;
1801                             mv_index = u2_sub_mb_ofst + uc_sub_mb_num_col;
1802 
1803                             ps_direct->i4_mv_indices[i1_num_partitions] =
1804                                             mv_index;
1805                             ps_direct->i1_submb_num[i1_num_partitions] =
1806                                             u1_sub_mb_num;
1807                             ps_direct->i1_partitionsize[i1_num_partitions] =
1808                                             partition_size;
1809                             i1_num_partitions++;
1810                             if((pu1_col_zero_flag_start[uc_sub_mb_num_col] & 1)
1811                                             != u1_init_colzero_flag)
1812                                 ps_direct->u1_col_zeroflag_change = 1;
1813                             u1_sub_mb_num += 8;
1814                         }
1815                         u1_sub_mb_num = 2; /* move to second half of Cur MB */
1816                     }
1817                     ps_direct->i1_num_partitions = i1_num_partitions;
1818                     return;
1819                 }
1820             }
1821             else
1822             {
1823                 ps_direct->i1_num_partitions = 1;
1824                 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
1825                 ps_direct->i1_submb_num[0] = 0;
1826                 ps_direct->i1_partitionsize[0] = PRED_16x16;
1827                 ps_dec->u1_currB_type = 0;
1828                 return;
1829             }
1830         }
1831         else
1832         {
1833             uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
1834             uc_sub_mb_num_col &= 0x7;
1835 
1836             ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst + uc_sub_mb_num_col;
1837             ps_direct->i1_submb_num[0] = u1_sub_mb_num;
1838             ps_direct->i1_partitionsize[0] = PRED_8x8;
1839             ps_direct->i1_num_partitions = 1;
1840         }
1841     }
1842     else
1843     {
1844         ps_direct->u1_vert_mv_scale = FRM_TO_FLD;
1845         pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
1846         u1_init_colzero_flag = pu1_col_zero_flag_start[0] & 1;
1847 
1848         if(u1_wd_x == MB_SIZE)
1849         {
1850             UWORD8 u1_submb_col;
1851             UWORD8 *puc_colZeroFlagStart_bot_mb, uc_colMbPredMode_bot_mb;
1852 
1853             pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag
1854                             + u2_sub_mb_ofst;
1855             u1_col_mb_pred_mode = pu1_col_zero_flag_start[u1_sub_mb_num] >> 6;
1856 
1857             puc_colZeroFlagStart_bot_mb = ps_col_pic->pu1_col_zero_flag
1858                             + u2_sub_mb_ofst + 16;
1859             uc_colMbPredMode_bot_mb = puc_colZeroFlagStart_bot_mb[8] >> 6;
1860 
1861             i4_force_8X8 = (u1_col_mb_pred_mode & 0x2)
1862                             || (uc_colMbPredMode_bot_mb & 0x2);
1863             if(i4_force_8X8)
1864             {
1865                 u1_num_blks = 2;
1866                 partition_size = PRED_8x8;
1867             }
1868             else
1869             {
1870                 u1_num_blks = 1;
1871                 partition_size = PRED_16x8;
1872             }
1873 
1874             ps_dec->u1_currB_type = 1;
1875             /*As this mb is derived from 2 Mbs min no of partitions = 2*/
1876             for(i = 0; i < 2; i++)
1877             {
1878 
1879                 pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag
1880                                 + u2_sub_mb_ofst;
1881                 u1_col_mb_pred_mode = pu1_col_zero_flag_start[u1_sub_mb_num] >> 6;
1882 
1883                 for(uc_blk = 0; uc_blk < u1_num_blks; uc_blk++)
1884                 {
1885                     u1_submb_col = (u1_sub_mb_num & 0x7) ? 1 : 0;
1886                     u1_submb_col += u1_sub_mb_num;
1887                     mv_index = u2_sub_mb_ofst + u1_submb_col;
1888 
1889 
1890                     ps_direct->i4_mv_indices[i1_num_partitions] = mv_index;
1891                     ps_direct->i1_submb_num[i1_num_partitions] = u1_sub_mb_num;
1892                     ps_direct->i1_partitionsize[i1_num_partitions] =
1893                                     partition_size;
1894                     i1_num_partitions++;
1895                     if((pu1_col_zero_flag_start[u1_submb_col] & 1)
1896                                     != u1_init_colzero_flag)
1897                         ps_direct->u1_col_zeroflag_change = 1;
1898                     u1_sub_mb_num += 2;
1899                 }
1900                 u1_sub_mb_num = 8; /* move to second half of Cur MB */
1901                 u2_sub_mb_ofst += 16;/* move to next Colocated MB */
1902             }
1903             ps_direct->i1_num_partitions = i1_num_partitions;
1904             return;
1905         }
1906         else
1907         {
1908             uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
1909             uc_sub_mb_num_col &= 0xb;
1910             u2_sub_mb_ofst += (u1_sub_mb_num >> 3) ? 16 : 0;
1911 
1912             ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst + uc_sub_mb_num_col;
1913             ps_direct->i1_submb_num[0] = u1_sub_mb_num;
1914             ps_direct->i1_partitionsize[0] = PRED_8x8;
1915             ps_direct->i1_num_partitions = 1;
1916             return;
1917         }
1918     }
1919 }
1920 /*!
1921  **************************************************************************
1922  * \if Function name : ih264d_cal_col_pic \endif
1923  *
1924  * \brief
1925  *    Finds the colocated picture.
1926  *
1927  *
1928  * \return
1929  *    0 on Success and Error code otherwise
1930  **************************************************************************
1931  */
ih264d_cal_col_pic(dec_struct_t * ps_dec)1932 WORD32 ih264d_cal_col_pic(dec_struct_t *ps_dec)
1933 {
1934     struct pic_buffer_t* ps_col_pic = ps_dec->ps_col_pic;
1935     UWORD8 uc_curpictype, uc_colpictype;
1936     ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][0];
1937     uc_curpictype = (ps_dec->ps_cur_pic->u1_picturetype & 0x7);
1938     uc_colpictype = (ps_col_pic->u1_picturetype & 0x7);
1939     if(uc_curpictype == FRM_PIC)
1940     {
1941         if(uc_colpictype == FRM_PIC)
1942             ps_dec->pf_parse_mvdirect = ih264d_one_to_one;
1943         else if(uc_colpictype == COMP_FLD_PAIR)
1944         {
1945             ps_dec->pf_parse_mvdirect = ih264d_fld_to_frm;
1946             if(ps_col_pic->i4_top_field_order_cnt
1947                             >= ps_col_pic->i4_bottom_field_order_cnt)
1948             {
1949                 struct pic_buffer_t* ps_tempPic = ps_col_pic;
1950                 UWORD32 ui_half_num_of_sub_mbs = ((ps_dec->u2_pic_ht
1951                                 * ps_dec->u2_pic_wd) >> 5);
1952                 ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS];
1953                 /* memcpy ps_tempPic to ps_col_pic */
1954                 *ps_col_pic = *ps_tempPic;
1955                 ps_col_pic->pu1_buf1 = ps_tempPic->pu1_buf1
1956                                 + ps_tempPic->u2_frm_wd_y;
1957                 ps_col_pic->pu1_buf2 = ps_tempPic->pu1_buf2
1958                                 + ps_tempPic->u2_frm_wd_uv;
1959                 ps_col_pic->pu1_buf3 = ps_tempPic->pu1_buf3
1960                                 + ps_tempPic->u2_frm_wd_uv;
1961                 ps_col_pic->pu1_col_zero_flag = ps_tempPic->pu1_col_zero_flag
1962                                 + ui_half_num_of_sub_mbs;
1963                 ps_col_pic->ps_mv = ps_tempPic->ps_mv + ui_half_num_of_sub_mbs;
1964 
1965 
1966                 ps_col_pic->u1_pic_type = 0;/*complementary reference field pair-refering as frame */
1967 
1968 
1969 
1970             }
1971         }
1972         else
1973         {
1974             UWORD32 i4_error_code;
1975             i4_error_code = ERROR_DBP_MANAGER_T;
1976 //          i4_error_code |= 1<<IVD_CORRUPTEDDATA;
1977             return i4_error_code;
1978         }
1979     }
1980     else if(uc_curpictype == AFRM_PIC)
1981     {
1982         ps_dec->pf_parse_mvdirect = ih264d_fld_to_mbaff;
1983     }
1984     else /* must be a field*/
1985     {
1986         if(uc_colpictype == FRM_PIC)
1987             ps_dec->pf_parse_mvdirect = ih264d_frm_to_fld;
1988         else if(uc_colpictype == AFRM_PIC)
1989             ps_dec->pf_parse_mvdirect = ih264d_mbaff_to_fld;
1990         else
1991             ps_dec->pf_parse_mvdirect = ih264d_one_to_one;
1992     }
1993     ps_dec->ps_col_pic = ps_col_pic;
1994     return OK;
1995 }
1996 
1997 /*!
1998  **************************************************************************
1999  * \if Function name : ih264d_frm_to_fld \endif
2000  *
2001  * \brief
2002  *    Initializes forward and backward refernce lists for B slice decoding.
2003  *
2004  *
2005  * \return
2006  *    0 on Success and Error code otherwise
2007  **************************************************************************
2008  */
ih264d_frm_to_fld(dec_struct_t * ps_dec,struct pic_buffer_t * ps_col_pic,directmv_t * ps_direct,UWORD8 u1_wd_x,WORD32 u2_sub_mb_ofst,dec_mb_info_t * ps_cur_mb_info)2009 void ih264d_frm_to_fld(dec_struct_t *ps_dec,
2010                        struct pic_buffer_t *ps_col_pic,
2011                        directmv_t *ps_direct,
2012                        UWORD8 u1_wd_x,
2013                        WORD32 u2_sub_mb_ofst,
2014                        dec_mb_info_t * ps_cur_mb_info)
2015 {
2016     UWORD8 *pu1_col_zero_flag_start, u1_sub_mb_num;
2017     UWORD8 u1_num_blks, u1_col_mb_pred_mode, uc_blk;
2018     UWORD8 i1_num_partitions = 0, partition_size, i;
2019     WORD32 mv_index;
2020     UWORD32 increment;
2021     WORD32 i4_force_8X8;
2022     UNUSED(ps_cur_mb_info);
2023     ps_direct->u1_col_zeroflag_change = 1;
2024     ps_direct->u1_vert_mv_scale = FRM_TO_FLD;
2025     u1_sub_mb_num = ps_dec->u1_sub_mb_num;
2026 
2027     /* new calculation specific to this function */
2028     if((ps_col_pic->u1_picturetype & 0x7) == FRM_PIC)
2029     {
2030         UWORD16 u2_frm_wd_in_mbs = ps_dec->u2_frm_wd_in_mbs;
2031         increment = (u2_frm_wd_in_mbs << 4);
2032         /*mbAddrCol = mbAddrCol1 */
2033         u2_sub_mb_ofst = (ps_dec->u2_mbx
2034                         + (2 * ps_dec->u2_mby * u2_frm_wd_in_mbs)) << 4;
2035     }
2036     else
2037         increment = 16;
2038 
2039     if(u1_wd_x == MB_SIZE)
2040     {
2041         ps_dec->u1_currB_type = 1;
2042 
2043         {
2044             UWORD8 *puc_colZeroFlagStart_bot_mb, uc_colMbPredMode_bot_mb;
2045 
2046             pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag
2047                             + u2_sub_mb_ofst;
2048             u1_col_mb_pred_mode = (*pu1_col_zero_flag_start >> 6);
2049 
2050             puc_colZeroFlagStart_bot_mb = ps_col_pic->pu1_col_zero_flag
2051                             + u2_sub_mb_ofst + increment;
2052             uc_colMbPredMode_bot_mb = (*puc_colZeroFlagStart_bot_mb >> 6);
2053 
2054             i4_force_8X8 = (u1_col_mb_pred_mode & 0x2)
2055                             || (uc_colMbPredMode_bot_mb & 0x2);
2056 
2057             if(i4_force_8X8)
2058             {
2059                 u1_num_blks = 2;
2060                 partition_size = PRED_8x8;
2061             }
2062             else
2063             {
2064                 partition_size = PRED_16x8;
2065                 u1_num_blks = 1;
2066             }
2067         }
2068 
2069         /*As this mb is derived from 2 Mbs, min no of partitions = 2*/
2070         for(i = 0; i < 2; i++)
2071         {
2072             for(uc_blk = 0; uc_blk < u1_num_blks; uc_blk++)
2073             {
2074                 mv_index = u2_sub_mb_ofst + u1_sub_mb_num;
2075                 mv_index += (u1_sub_mb_num & 0x7) ? 1 : 0;
2076 
2077                 ps_direct->i4_mv_indices[i1_num_partitions] = mv_index;
2078                 ps_direct->i1_submb_num[i1_num_partitions] = u1_sub_mb_num;
2079                 ps_direct->i1_partitionsize[i1_num_partitions] = partition_size;
2080                 i1_num_partitions++;
2081 
2082                 u1_sub_mb_num += 2;
2083             }
2084             u1_sub_mb_num = 8; /* move to second half of Cur MB */
2085             u2_sub_mb_ofst += increment;/* move to next Colocated MB */
2086         }
2087         ps_direct->i1_num_partitions = i1_num_partitions;
2088         return;
2089     }
2090     else
2091     {
2092         UWORD8 u1_sub_mb_num_col;
2093         u1_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
2094         u1_sub_mb_num_col &= 0xb;
2095         u2_sub_mb_ofst += (u1_sub_mb_num >> 3) ? increment : 0;
2096 
2097         ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst + u1_sub_mb_num_col;
2098         ps_direct->i1_submb_num[0] = u1_sub_mb_num;
2099         ps_direct->i1_partitionsize[0] = PRED_8x8;
2100         ps_direct->i1_num_partitions = 1;
2101         return;
2102     }
2103 }
2104 /*!
2105  **************************************************************************
2106  * \if Function name : ih264d_fld_to_frm \endif
2107  *
2108  * \brief
2109  *    Initializes forward and backward refernce lists for B slice decoding.
2110  *
2111  *
2112  * \return
2113  *    0 on Success and Error code otherwise
2114  **************************************************************************
2115  */
ih264d_fld_to_frm(dec_struct_t * ps_dec,struct pic_buffer_t * ps_col_pic,directmv_t * ps_direct,UWORD8 u1_wd_x,WORD32 u2_sub_mb_ofst,dec_mb_info_t * ps_cur_mb_info)2116 void ih264d_fld_to_frm(dec_struct_t *ps_dec,
2117                        struct pic_buffer_t *ps_col_pic,
2118                        directmv_t *ps_direct,
2119                        UWORD8 u1_wd_x,
2120                        WORD32 u2_sub_mb_ofst,
2121                        dec_mb_info_t * ps_cur_mb_info)
2122 {
2123     UWORD8 *pu1_col_zero_flag_start, *pu1_col_zero_flag,
2124                     *pu1_col_zero_flag_right_half, u1_sub_mb_num, uc_sub_mb_num_col;
2125     UWORD8 u1_col_mb_pred_mode, uc_blk;
2126     WORD32 i4_force_8X8;
2127 
2128     UNUSED(ps_cur_mb_info);
2129     ps_direct->u1_vert_mv_scale = FLD_TO_FRM;
2130     ps_direct->u1_col_zeroflag_change = 1;
2131     /* new calculation specific to this function for u2_sub_mb_ofst*/
2132     u2_sub_mb_ofst = (ps_dec->u2_mbx
2133                     + ((ps_dec->u2_mby >> 1) * ps_dec->u2_frm_wd_in_mbs)) << 4;
2134     u2_sub_mb_ofst += ((ps_dec->u2_mby & 1) << 3);
2135 
2136     if(u1_wd_x == MB_SIZE)
2137     {
2138         pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
2139         u1_col_mb_pred_mode = (*pu1_col_zero_flag_start >> 6);
2140         ps_dec->u1_currB_type = (!!u1_col_mb_pred_mode);
2141 
2142         if(u1_col_mb_pred_mode & 0x2)
2143         {
2144             if(u1_col_mb_pred_mode == PRED_8x16)
2145             {
2146                 ps_direct->i1_num_partitions = 2;
2147                 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
2148                 ps_direct->i1_submb_num[0] = 0;
2149                 ps_direct->i1_partitionsize[0] = PRED_8x16;
2150                 ps_direct->i4_mv_indices[1] = u2_sub_mb_ofst + 2;
2151                 ps_direct->i1_submb_num[1] = 2;
2152                 ps_direct->i1_partitionsize[1] = PRED_8x16;
2153             }
2154             else
2155             {
2156                 UWORD8 i1_num_partitions = 0, partition_size;
2157                 UWORD32 mv_index;
2158                 UWORD8 u1_num_sub_blks, i, u1_col_sub_mb_pred_mode,
2159                                 u1_col_sub_mb_pred_mode_rt;
2160 
2161                 u1_sub_mb_num = ps_dec->u1_sub_mb_num;
2162 
2163                 pu1_col_zero_flag = pu1_col_zero_flag_start + u1_sub_mb_num;
2164                 u1_col_sub_mb_pred_mode = (*pu1_col_zero_flag & 0x10);/* 8x4 or 4x4 mode */
2165 
2166                 pu1_col_zero_flag_right_half = pu1_col_zero_flag_start + u1_sub_mb_num
2167                                 + 2;
2168                 u1_col_sub_mb_pred_mode_rt = (*pu1_col_zero_flag_right_half
2169                                 & 0x10);/* 8x4 or 4x4 mode */
2170 
2171                 i4_force_8X8 = (u1_col_sub_mb_pred_mode)
2172                                 || (u1_col_sub_mb_pred_mode_rt);
2173                 if(i4_force_8X8)
2174                 {
2175                     u1_num_sub_blks = 2;
2176                     partition_size = PRED_8x8;
2177                 }
2178                 else
2179                 {
2180                     partition_size = PRED_8x16;
2181                     u1_num_sub_blks = 1;
2182                 }
2183 
2184                 for(i = 0; i < 2; i++)
2185                 {
2186                     for(uc_blk = 0; uc_blk < u1_num_sub_blks; uc_blk++)
2187                     {
2188                         uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
2189                         uc_sub_mb_num_col &= 0x7;
2190                         mv_index = u2_sub_mb_ofst + uc_sub_mb_num_col;
2191 
2192                         ps_direct->i4_mv_indices[i1_num_partitions] = mv_index;
2193                         ps_direct->i1_submb_num[i1_num_partitions] =
2194                                         u1_sub_mb_num;
2195                         ps_direct->i1_partitionsize[i1_num_partitions] =
2196                                         partition_size;
2197                         i1_num_partitions++;
2198                         u1_sub_mb_num += 8;
2199                     }
2200 
2201                     u1_sub_mb_num = 2; /* move to second half of Cur MB */
2202 
2203                 }
2204                 ps_direct->i1_num_partitions = i1_num_partitions;
2205                 return;
2206             }
2207         }
2208         else
2209         {
2210             ps_direct->i1_num_partitions = 1;
2211             ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
2212             ps_direct->i1_submb_num[0] = 0;
2213             ps_direct->i1_partitionsize[0] = PRED_16x16;
2214             return;
2215         }
2216     }
2217     else
2218     {
2219         u1_sub_mb_num = ps_dec->u1_sub_mb_num;
2220         uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
2221         uc_sub_mb_num_col &= 0x7;
2222 
2223         ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst + uc_sub_mb_num_col;
2224         ps_direct->i1_submb_num[0] = u1_sub_mb_num;
2225         ps_direct->i1_partitionsize[0] = PRED_8x8;
2226         ps_direct->i1_num_partitions = 1;
2227     }
2228 }
2229 /*!
2230  **************************************************************************
2231  * \if Function name : ih264d_one_to_one \endif
2232  *
2233  * \brief
2234  *    Initializes forward and backward refernce lists for B slice decoding.
2235  *
2236  *
2237  * \return
2238  *    0 on Success and Error code otherwise
2239  **************************************************************************
2240  */
ih264d_mbaff_to_fld(dec_struct_t * ps_dec,struct pic_buffer_t * ps_col_pic,directmv_t * ps_direct,UWORD8 u1_wd_x,WORD32 u2_sub_mb_ofst,dec_mb_info_t * ps_cur_mb_info)2241 void ih264d_mbaff_to_fld(dec_struct_t *ps_dec,
2242                          struct pic_buffer_t *ps_col_pic,
2243                          directmv_t *ps_direct,
2244                          UWORD8 u1_wd_x,
2245                          WORD32 u2_sub_mb_ofst,
2246                          dec_mb_info_t * ps_cur_mb_info)
2247 {
2248     UWORD8* pu1_col_zero_flag, u1_iscol_mb_fld;
2249     u2_sub_mb_ofst <<= 1;
2250     pu1_col_zero_flag = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
2251     u1_iscol_mb_fld = (*pu1_col_zero_flag & 0x2) >> 1;
2252     if(u1_iscol_mb_fld)
2253     {
2254         u2_sub_mb_ofst += (ps_dec->ps_cur_slice->u1_bottom_field_flag << 4);
2255         ih264d_one_to_one(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
2256                           u2_sub_mb_ofst, ps_cur_mb_info);
2257     }
2258     else
2259         ih264d_frm_to_fld(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
2260                           u2_sub_mb_ofst, ps_cur_mb_info);
2261 }
2262 /*!
2263  **************************************************************************
2264  * \if Function name : ih264d_one_to_one \endif
2265  *
2266  * \brief
2267  *    Initializes forward and backward refernce lists for B slice decoding.
2268  *
2269  *
2270  * \return
2271  *    0 on Success and Error code otherwise
2272  **************************************************************************
2273  */
ih264d_fld_to_mbaff(dec_struct_t * ps_dec,struct pic_buffer_t * ps_col_pic,directmv_t * ps_direct,UWORD8 u1_wd_x,WORD32 u2_sub_mb_ofst,dec_mb_info_t * ps_cur_mb_info)2274 void ih264d_fld_to_mbaff(dec_struct_t *ps_dec,
2275                          struct pic_buffer_t *ps_col_pic,
2276                          directmv_t *ps_direct,
2277                          UWORD8 u1_wd_x,
2278                          WORD32 u2_sub_mb_ofst,
2279                          dec_mb_info_t * ps_cur_mb_info)
2280 {
2281     if((ps_col_pic->u1_picturetype & 0x7) == COMP_FLD_PAIR)
2282     {
2283         /* first calculate the colocated picture which varies with Mb */
2284         UWORD8 u1_is_cur_mb_fld;
2285         u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
2286         u2_sub_mb_ofst = (u2_sub_mb_ofst & 0xffe0); /* mbaddrCol5 = curmbaddr/2;*/
2287         u2_sub_mb_ofst >>= 1;
2288 
2289         ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][0];
2290         if(u1_is_cur_mb_fld)
2291         {
2292             if(1 - ps_cur_mb_info->u1_topmb)
2293                 ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS];
2294 
2295             ih264d_one_to_one(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
2296                               u2_sub_mb_ofst, ps_cur_mb_info);
2297         }
2298         else
2299         {
2300 
2301             if(ABS(ps_col_pic->i4_top_field_order_cnt
2302                             - ps_dec->ps_cur_pic->i4_poc) >=
2303                             ABS(ps_dec->ps_cur_pic->i4_poc - ps_col_pic->i4_bottom_field_order_cnt))
2304             {
2305                 ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS];
2306             }
2307 
2308             if(ps_cur_mb_info->u1_topmb == 0)
2309                 u2_sub_mb_ofst += 8;
2310             ih264d_mbaff_cross_pmbair(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
2311                                       u2_sub_mb_ofst, ps_cur_mb_info);
2312         }
2313         ps_dec->ps_col_pic = ps_col_pic;
2314     }
2315     else
2316     {
2317         UWORD8* pu1_col_zero_flag = ps_col_pic->pu1_col_zero_flag
2318                         + u2_sub_mb_ofst;
2319         UWORD8 temp, u1_is_cur_mb_fld, u1_iscol_mb_fld;
2320 
2321         u1_iscol_mb_fld = (*pu1_col_zero_flag & 0x2) >> 1;
2322         u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
2323         temp = (u1_iscol_mb_fld ^ u1_is_cur_mb_fld);
2324 
2325         if(temp == 0)
2326             ih264d_one_to_one(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
2327                               u2_sub_mb_ofst, ps_cur_mb_info);
2328         else
2329         {
2330             u2_sub_mb_ofst &= 0xffef;
2331             if(u1_is_cur_mb_fld == 0)
2332             {
2333                 if(ABS(ps_col_pic->i4_top_field_order_cnt
2334                                 - ps_dec->ps_cur_pic->i4_poc) >=
2335                                 ABS(ps_dec->ps_cur_pic->i4_poc - ps_col_pic->i4_bottom_field_order_cnt))
2336                 {
2337                     u2_sub_mb_ofst += 0x10;
2338                 }
2339                 if(ps_cur_mb_info->u1_topmb == 0)
2340                     u2_sub_mb_ofst += 8;
2341             }
2342             ih264d_mbaff_cross_pmbair(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
2343                                       u2_sub_mb_ofst, ps_cur_mb_info);
2344         }
2345     }
2346 }
2347 
2348