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