xref: /aosp_15_r20/external/libavc/decoder/svc/isvcd_process_ebslice.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2022 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
23*495ae853SAndroid Build Coastguard Worker  *  isvcd_process_bslice.c
24*495ae853SAndroid Build Coastguard Worker  *
25*495ae853SAndroid Build Coastguard Worker  * @brief
26*495ae853SAndroid Build Coastguard Worker  *  Contains routines that decode B slice type
27*495ae853SAndroid Build Coastguard Worker  *
28*495ae853SAndroid Build Coastguard Worker  * @author
29*495ae853SAndroid Build Coastguard Worker  *  Kishore
30*495ae853SAndroid Build Coastguard Worker  *
31*495ae853SAndroid Build Coastguard Worker  * @remarks
32*495ae853SAndroid Build Coastguard Worker  *  None
33*495ae853SAndroid Build Coastguard Worker  *
34*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
35*495ae853SAndroid Build Coastguard Worker  */
36*495ae853SAndroid Build Coastguard Worker 
37*495ae853SAndroid Build Coastguard Worker #include <string.h>
38*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
39*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
40*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
41*495ae853SAndroid Build Coastguard Worker #include "isvcd_structs.h"
42*495ae853SAndroid Build Coastguard Worker #include "ih264d_bitstrm.h"
43*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
44*495ae853SAndroid Build Coastguard Worker #include "ih264d_mb_utils.h"
45*495ae853SAndroid Build Coastguard Worker #include "ih264d_mvpred.h"
46*495ae853SAndroid Build Coastguard Worker #include "ih264d_inter_pred.h"
47*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_pslice.h"
48*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
49*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
50*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_slice.h"
51*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_pslice.h"
52*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_bslice.h"
53*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
54*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_islice.h"
55*495ae853SAndroid Build Coastguard Worker #include "ih264d_mvpred.h"
56*495ae853SAndroid Build Coastguard Worker 
57*495ae853SAndroid Build Coastguard Worker /*!
58*495ae853SAndroid Build Coastguard Worker **************************************************************************
59*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_one_to_one \endif
60*495ae853SAndroid Build Coastguard Worker *
61*495ae853SAndroid Build Coastguard Worker * \brief
62*495ae853SAndroid Build Coastguard Worker *    Initializes forward and backward refernce lists for B slice decoding.
63*495ae853SAndroid Build Coastguard Worker *
64*495ae853SAndroid Build Coastguard Worker *
65*495ae853SAndroid Build Coastguard Worker * \return
66*495ae853SAndroid Build Coastguard Worker *    0 on Success and Error code otherwise
67*495ae853SAndroid Build Coastguard Worker **************************************************************************
68*495ae853SAndroid Build Coastguard Worker */
isvcd_one_to_one(svc_dec_lyr_struct_t * ps_svc_lyr_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)69*495ae853SAndroid Build Coastguard Worker void isvcd_one_to_one(svc_dec_lyr_struct_t *ps_svc_lyr_dec, struct pic_buffer_t *ps_col_pic,
70*495ae853SAndroid Build Coastguard Worker                       directmv_t *ps_direct, UWORD8 u1_wd_x, WORD32 u2_sub_mb_ofst,
71*495ae853SAndroid Build Coastguard Worker                       dec_mb_info_t *ps_cur_mb_info)
72*495ae853SAndroid Build Coastguard Worker {
73*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
74*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_col_zero_flag_start, u1_col_mb_pred_mode, u1_num_blks, u1_sub_mb_num;
75*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_init_colzero_flag;
76*495ae853SAndroid Build Coastguard Worker     UNUSED(ps_cur_mb_info);
77*495ae853SAndroid Build Coastguard Worker     pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
78*495ae853SAndroid Build Coastguard Worker     u1_col_mb_pred_mode = pu1_col_zero_flag_start[ps_dec->u1_sub_mb_num];
79*495ae853SAndroid Build Coastguard Worker     u1_init_colzero_flag = u1_col_mb_pred_mode & 1;
80*495ae853SAndroid Build Coastguard Worker     u1_col_mb_pred_mode >>= 6;
81*495ae853SAndroid Build Coastguard Worker     ps_direct->u1_vert_mv_scale = ONE_TO_ONE;
82*495ae853SAndroid Build Coastguard Worker     ps_direct->u1_col_zeroflag_change = (ps_svc_lyr_dec->u1_base_res_flag) ? 0 : 1;
83*495ae853SAndroid Build Coastguard Worker 
84*495ae853SAndroid Build Coastguard Worker     if(u1_wd_x == MB_SIZE)
85*495ae853SAndroid Build Coastguard Worker     {
86*495ae853SAndroid Build Coastguard Worker         ps_dec->u1_currB_type = (!!u1_col_mb_pred_mode);
87*495ae853SAndroid Build Coastguard Worker         if(u1_col_mb_pred_mode == PRED_16x16)
88*495ae853SAndroid Build Coastguard Worker         {
89*495ae853SAndroid Build Coastguard Worker             ps_direct->i1_num_partitions = 1;
90*495ae853SAndroid Build Coastguard Worker             ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
91*495ae853SAndroid Build Coastguard Worker             ps_direct->i1_submb_num[0] = 0;
92*495ae853SAndroid Build Coastguard Worker             ps_direct->i1_partitionsize[0] = PRED_16x16;
93*495ae853SAndroid Build Coastguard Worker 
94*495ae853SAndroid Build Coastguard Worker             return;
95*495ae853SAndroid Build Coastguard Worker         }
96*495ae853SAndroid Build Coastguard Worker         else if(u1_col_mb_pred_mode < PRED_8x8)
97*495ae853SAndroid Build Coastguard Worker         {
98*495ae853SAndroid Build Coastguard Worker             ps_direct->i1_num_partitions = 2;
99*495ae853SAndroid Build Coastguard Worker             ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
100*495ae853SAndroid Build Coastguard Worker             ps_direct->i1_submb_num[0] = 0;
101*495ae853SAndroid Build Coastguard Worker             ps_direct->i1_partitionsize[0] = u1_col_mb_pred_mode;
102*495ae853SAndroid Build Coastguard Worker             u1_sub_mb_num = (u1_col_mb_pred_mode == PRED_16x8) ? 8 : 2;
103*495ae853SAndroid Build Coastguard Worker             ps_direct->i1_submb_num[1] = u1_sub_mb_num;
104*495ae853SAndroid Build Coastguard Worker             ps_direct->i4_mv_indices[1] = u2_sub_mb_ofst + ps_direct->i1_submb_num[1];
105*495ae853SAndroid Build Coastguard Worker             ps_direct->i1_partitionsize[1] = u1_col_mb_pred_mode;
106*495ae853SAndroid Build Coastguard Worker             if((pu1_col_zero_flag_start[u1_sub_mb_num] & 1) != u1_init_colzero_flag)
107*495ae853SAndroid Build Coastguard Worker                 ps_direct->u1_col_zeroflag_change = 1;
108*495ae853SAndroid Build Coastguard Worker             return;
109*495ae853SAndroid Build Coastguard Worker         }
110*495ae853SAndroid Build Coastguard Worker         else
111*495ae853SAndroid Build Coastguard Worker         {
112*495ae853SAndroid Build Coastguard Worker             u1_num_blks = 4;
113*495ae853SAndroid Build Coastguard Worker         }
114*495ae853SAndroid Build Coastguard Worker     }
115*495ae853SAndroid Build Coastguard Worker     else
116*495ae853SAndroid Build Coastguard Worker     {
117*495ae853SAndroid Build Coastguard Worker         u1_num_blks = 1;
118*495ae853SAndroid Build Coastguard Worker     }
119*495ae853SAndroid Build Coastguard Worker 
120*495ae853SAndroid Build Coastguard Worker     {
121*495ae853SAndroid Build Coastguard Worker         const UWORD8 *pu1_top_lt_mb_part_idx;
122*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_col_sub_mb_pred_mode, uc_blk, u1_sub_blk, u1_submb_col = 0;
123*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_num_sub_blks, uc_direct8x8inf, *pu1_col_zero_flag, u1_sub_mb_num;
124*495ae853SAndroid Build Coastguard Worker         const UWORD8 *pu1_num_sub_mb_part = (const UWORD8 *) gau1_ih264d_num_submb_part;
125*495ae853SAndroid Build Coastguard Worker         UWORD8 i1_num_partitions = 0, partition_size;
126*495ae853SAndroid Build Coastguard Worker         WORD32 mv_index;
127*495ae853SAndroid Build Coastguard Worker         const UWORD8 *pu1_top_lt_sub_mb_idx = gau1_ih264d_submb_indx_mod_sp_drct;
128*495ae853SAndroid Build Coastguard Worker 
129*495ae853SAndroid Build Coastguard Worker         u1_sub_mb_num = ps_dec->u1_sub_mb_num;
130*495ae853SAndroid Build Coastguard Worker         uc_direct8x8inf = ps_dec->ps_cur_slice->u1_direct_8x8_inference_flag;
131*495ae853SAndroid Build Coastguard Worker         pu1_top_lt_mb_part_idx = gau1_ih264d_top_left_mb_part_indx_mod + (PRED_8x8 << 1) + 1;
132*495ae853SAndroid Build Coastguard Worker 
133*495ae853SAndroid Build Coastguard Worker         for(uc_blk = 0; uc_blk < u1_num_blks; uc_blk++)
134*495ae853SAndroid Build Coastguard Worker         {
135*495ae853SAndroid Build Coastguard Worker             partition_size = PRED_8x8;
136*495ae853SAndroid Build Coastguard Worker             pu1_top_lt_sub_mb_idx = gau1_ih264d_submb_indx_mod_sp_drct;
137*495ae853SAndroid Build Coastguard Worker             if(uc_direct8x8inf == 1)
138*495ae853SAndroid Build Coastguard Worker             {
139*495ae853SAndroid Build Coastguard Worker                 u1_submb_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
140*495ae853SAndroid Build Coastguard Worker                 mv_index = u2_sub_mb_ofst + u1_submb_col;
141*495ae853SAndroid Build Coastguard Worker                 u1_num_sub_blks = 1;
142*495ae853SAndroid Build Coastguard Worker             }
143*495ae853SAndroid Build Coastguard Worker             else
144*495ae853SAndroid Build Coastguard Worker             {
145*495ae853SAndroid Build Coastguard Worker                 /* colMbPart is either 8x8, 8x4, 4x8, 4x4 */
146*495ae853SAndroid Build Coastguard Worker                 pu1_col_zero_flag = pu1_col_zero_flag_start + u1_sub_mb_num;
147*495ae853SAndroid Build Coastguard Worker                 u1_col_sub_mb_pred_mode = *pu1_col_zero_flag;
148*495ae853SAndroid Build Coastguard Worker                 u1_col_sub_mb_pred_mode = (u1_col_sub_mb_pred_mode & 0x30) >> 4;
149*495ae853SAndroid Build Coastguard Worker                 partition_size = (UWORD8) ((u1_col_sub_mb_pred_mode) | (PRED_8x8 << 2));
150*495ae853SAndroid Build Coastguard Worker                 mv_index = u2_sub_mb_ofst + u1_sub_mb_num;
151*495ae853SAndroid Build Coastguard Worker                 pu1_top_lt_sub_mb_idx += (u1_col_sub_mb_pred_mode << 1);
152*495ae853SAndroid Build Coastguard Worker                 u1_num_sub_blks = pu1_num_sub_mb_part[u1_col_sub_mb_pred_mode];
153*495ae853SAndroid Build Coastguard Worker             }
154*495ae853SAndroid Build Coastguard Worker 
155*495ae853SAndroid Build Coastguard Worker             for(u1_sub_blk = 0; u1_sub_blk < u1_num_sub_blks; u1_sub_blk++, pu1_top_lt_sub_mb_idx++)
156*495ae853SAndroid Build Coastguard Worker             {
157*495ae853SAndroid Build Coastguard Worker                 u1_sub_mb_num += *pu1_top_lt_sub_mb_idx;
158*495ae853SAndroid Build Coastguard Worker                 mv_index += *pu1_top_lt_sub_mb_idx;
159*495ae853SAndroid Build Coastguard Worker                 ps_direct->i4_mv_indices[i1_num_partitions] = mv_index;
160*495ae853SAndroid Build Coastguard Worker                 ps_direct->i1_submb_num[i1_num_partitions] = u1_sub_mb_num;
161*495ae853SAndroid Build Coastguard Worker                 ps_direct->i1_partitionsize[i1_num_partitions] = partition_size;
162*495ae853SAndroid Build Coastguard Worker                 i1_num_partitions++;
163*495ae853SAndroid Build Coastguard Worker                 if(!uc_direct8x8inf) u1_submb_col = u1_sub_mb_num;
164*495ae853SAndroid Build Coastguard Worker                 if((pu1_col_zero_flag_start[u1_submb_col] & 1) != u1_init_colzero_flag)
165*495ae853SAndroid Build Coastguard Worker                     ps_direct->u1_col_zeroflag_change = 1;
166*495ae853SAndroid Build Coastguard Worker             }
167*495ae853SAndroid Build Coastguard Worker             u1_sub_mb_num = *pu1_top_lt_mb_part_idx++;
168*495ae853SAndroid Build Coastguard Worker         }
169*495ae853SAndroid Build Coastguard Worker         ps_direct->i1_num_partitions = i1_num_partitions;
170*495ae853SAndroid Build Coastguard Worker     }
171*495ae853SAndroid Build Coastguard Worker }
172*495ae853SAndroid Build Coastguard Worker 
173*495ae853SAndroid Build Coastguard Worker /*!
174*495ae853SAndroid Build Coastguard Worker  **************************************************************************
175*495ae853SAndroid Build Coastguard Worker  * \if Function name : isvcd_decode_spatial_direct \endif
176*495ae853SAndroid Build Coastguard Worker  *
177*495ae853SAndroid Build Coastguard Worker  * \brief
178*495ae853SAndroid Build Coastguard Worker  *    Decodes spatial direct mode.
179*495ae853SAndroid Build Coastguard Worker  *
180*495ae853SAndroid Build Coastguard Worker  * \return
181*495ae853SAndroid Build Coastguard Worker  *    None.
182*495ae853SAndroid Build Coastguard Worker  *    Vijay
183*495ae853SAndroid Build Coastguard Worker  **************************************************************************
184*495ae853SAndroid Build Coastguard Worker  */
isvcd_decode_spatial_direct(dec_struct_t * ps_dec,UWORD8 u1_wd_x,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_mb_num)185*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_decode_spatial_direct(dec_struct_t *ps_dec, UWORD8 u1_wd_x,
186*495ae853SAndroid Build Coastguard Worker                                    dec_mb_info_t *ps_cur_mb_info, UWORD8 u1_mb_num)
187*495ae853SAndroid Build Coastguard Worker {
188*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec = (svc_dec_lyr_struct_t *) ps_dec;
189*495ae853SAndroid Build Coastguard Worker     mv_pred_t s_mv_pred = {0};
190*495ae853SAndroid Build Coastguard Worker     mv_pred_t *ps_mv;
191*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_col_zero_flag, u1_sub_mb_num, u1_direct_zero_pred_flag = 0;
192*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
193*495ae853SAndroid Build Coastguard Worker     mv_pred_t *ps_mv_ntop_start;
194*495ae853SAndroid Build Coastguard Worker     mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_mb_num << 4);
195*495ae853SAndroid Build Coastguard Worker     UWORD8 partition_size, sub_partition, u1_mb_partw, u1_mb_parth;
196*495ae853SAndroid Build Coastguard Worker     UWORD8 i;
197*495ae853SAndroid Build Coastguard Worker     WORD8 i1_pred, i1_ref_frame0, i1_ref_frame1;
198*495ae853SAndroid Build Coastguard Worker     struct pic_buffer_t *ps_ref_frame = NULL, *ps_col_pic, *ps_pic_buff0 = NULL,
199*495ae853SAndroid Build Coastguard Worker                         *ps_pic_buff1 = NULL;
200*495ae853SAndroid Build Coastguard Worker 
201*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_zero_pred_cond_f, u1_zero_pred_cond_b;
202*495ae853SAndroid Build Coastguard Worker     WORD16 i2_spat_pred_mv[4] = {0};
203*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_final_mv0, *pi2_final_mv1;
204*495ae853SAndroid Build Coastguard Worker     UWORD16 ui2_mask_fwd = 0, ui2_mask_bwd = 0;
205*495ae853SAndroid Build Coastguard Worker     UWORD32 *pui32_weight_ofsts = NULL;
206*495ae853SAndroid Build Coastguard Worker     directmv_t s_mvdirect = {0};
207*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_colz;
208*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_final_ref_idx = 0;
209*495ae853SAndroid Build Coastguard Worker     const UWORD8 *pu1_mb_parth = (const UWORD8 *) gau1_ih264d_mb_parth;
210*495ae853SAndroid Build Coastguard Worker     const UWORD8 *pu1_mb_partw = (const UWORD8 *) gau1_ih264d_mb_partw;
211*495ae853SAndroid Build Coastguard Worker 
212*495ae853SAndroid Build Coastguard Worker     mv_pred_t s_temp_mv_pred = {0};
213*495ae853SAndroid Build Coastguard Worker     ps_mv_ntop_start =
214*495ae853SAndroid Build Coastguard Worker         ps_dec->ps_mv_cur + (u1_mb_num << 4) - (ps_dec->u2_frm_wd_in_mbs << (4 + u1_mbaff)) + 12;
215*495ae853SAndroid Build Coastguard Worker 
216*495ae853SAndroid Build Coastguard Worker     u1_direct_zero_pred_flag =
217*495ae853SAndroid Build Coastguard Worker         ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, (ps_mv_nmb_start + ps_dec->u1_sub_mb_num),
218*495ae853SAndroid Build Coastguard Worker                           ps_mv_ntop_start + (ps_dec->u1_sub_mb_num & 0x03), &s_mv_pred,
219*495ae853SAndroid Build Coastguard Worker                           ps_dec->u1_sub_mb_num, (u1_wd_x >> 2), 0, 1, B_DIRECT_SPATIAL);
220*495ae853SAndroid Build Coastguard Worker 
221*495ae853SAndroid Build Coastguard Worker     i2_spat_pred_mv[0] = s_mv_pred.i2_mv[0];
222*495ae853SAndroid Build Coastguard Worker     i2_spat_pred_mv[1] = s_mv_pred.i2_mv[1];
223*495ae853SAndroid Build Coastguard Worker     i2_spat_pred_mv[2] = s_mv_pred.i2_mv[2];
224*495ae853SAndroid Build Coastguard Worker     i2_spat_pred_mv[3] = s_mv_pred.i2_mv[3];
225*495ae853SAndroid Build Coastguard Worker 
226*495ae853SAndroid Build Coastguard Worker     i1_ref_frame0 = s_mv_pred.i1_ref_frame[0];
227*495ae853SAndroid Build Coastguard Worker     i1_ref_frame1 = s_mv_pred.i1_ref_frame[1];
228*495ae853SAndroid Build Coastguard Worker 
229*495ae853SAndroid Build Coastguard Worker     i1_ref_frame0 = (i1_ref_frame0 < 0) ? -1 : i1_ref_frame0;
230*495ae853SAndroid Build Coastguard Worker     i1_ref_frame1 = (i1_ref_frame1 < 0) ? -1 : i1_ref_frame1;
231*495ae853SAndroid Build Coastguard Worker 
232*495ae853SAndroid Build Coastguard Worker     i1_pred = 0;
233*495ae853SAndroid Build Coastguard Worker 
234*495ae853SAndroid Build Coastguard Worker     {
235*495ae853SAndroid Build Coastguard Worker         WORD8 u1_ref_idx, u1_ref_idx1;
236*495ae853SAndroid Build Coastguard Worker         UWORD32 uc_Idx, uc_Idx1;
237*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_scale_ref =
238*495ae853SAndroid Build Coastguard Worker             (ps_dec->ps_cur_slice->u1_mbaff_frame_flag && ps_cur_mb_info->u1_mb_field_decodingflag);
239*495ae853SAndroid Build Coastguard Worker         u1_final_ref_idx = i1_ref_frame0;
240*495ae853SAndroid Build Coastguard Worker         if(i1_ref_frame0 >= 0)
241*495ae853SAndroid Build Coastguard Worker         {
242*495ae853SAndroid Build Coastguard Worker             /* convert RefIdx if it is MbAff */
243*495ae853SAndroid Build Coastguard Worker             u1_ref_idx = i1_ref_frame0;
244*495ae853SAndroid Build Coastguard Worker             u1_ref_idx1 = i1_ref_frame0;
245*495ae853SAndroid Build Coastguard Worker             if(u1_scale_ref)
246*495ae853SAndroid Build Coastguard Worker             {
247*495ae853SAndroid Build Coastguard Worker                 u1_ref_idx1 = u1_ref_idx >> 1;
248*495ae853SAndroid Build Coastguard Worker                 if((u1_ref_idx & 0x01) != (1 - ps_cur_mb_info->u1_topmb))
249*495ae853SAndroid Build Coastguard Worker                     u1_ref_idx1 += MAX_REF_BUFS;
250*495ae853SAndroid Build Coastguard Worker             }
251*495ae853SAndroid Build Coastguard Worker             /* If i1_ref_frame0 < 0 then refIdxCol is obtained from ps_pic_buff1 */
252*495ae853SAndroid Build Coastguard Worker             ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][u1_ref_idx1];
253*495ae853SAndroid Build Coastguard Worker             ps_ref_frame = ps_pic_buff0;
254*495ae853SAndroid Build Coastguard Worker             i1_pred = PRED_L0;
255*495ae853SAndroid Build Coastguard Worker         }
256*495ae853SAndroid Build Coastguard Worker 
257*495ae853SAndroid Build Coastguard Worker         if(i1_ref_frame1 >= 0)
258*495ae853SAndroid Build Coastguard Worker         {
259*495ae853SAndroid Build Coastguard Worker             /* convert RefIdx if it is MbAff */
260*495ae853SAndroid Build Coastguard Worker             u1_ref_idx = i1_ref_frame1;
261*495ae853SAndroid Build Coastguard Worker             u1_ref_idx1 = i1_ref_frame1;
262*495ae853SAndroid Build Coastguard Worker             if(u1_scale_ref)
263*495ae853SAndroid Build Coastguard Worker             {
264*495ae853SAndroid Build Coastguard Worker                 u1_ref_idx1 = u1_ref_idx >> 1;
265*495ae853SAndroid Build Coastguard Worker                 if((u1_ref_idx & 0x01) != (1 - ps_cur_mb_info->u1_topmb))
266*495ae853SAndroid Build Coastguard Worker                     u1_ref_idx1 += MAX_REF_BUFS;
267*495ae853SAndroid Build Coastguard Worker             }
268*495ae853SAndroid Build Coastguard Worker             ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][u1_ref_idx1];
269*495ae853SAndroid Build Coastguard Worker             i1_pred = i1_pred | PRED_L1;
270*495ae853SAndroid Build Coastguard Worker         }
271*495ae853SAndroid Build Coastguard Worker         if(i1_ref_frame0 < 0)
272*495ae853SAndroid Build Coastguard Worker         {
273*495ae853SAndroid Build Coastguard Worker             ps_ref_frame = ps_pic_buff1;
274*495ae853SAndroid Build Coastguard Worker             u1_final_ref_idx = i1_ref_frame1;
275*495ae853SAndroid Build Coastguard Worker         }
276*495ae853SAndroid Build Coastguard Worker 
277*495ae853SAndroid Build Coastguard Worker         u1_zero_pred_cond_f = (u1_direct_zero_pred_flag) || (i1_ref_frame0 < 0);
278*495ae853SAndroid Build Coastguard Worker         u1_zero_pred_cond_b = (u1_direct_zero_pred_flag) || (i1_ref_frame1 < 0);
279*495ae853SAndroid Build Coastguard Worker 
280*495ae853SAndroid Build Coastguard Worker         if(ps_dec->ps_cur_pps->u1_wted_bipred_idc)
281*495ae853SAndroid Build Coastguard Worker         {
282*495ae853SAndroid Build Coastguard Worker             uc_Idx = ((i1_ref_frame0 < 1) ? 0 : i1_ref_frame0) *
283*495ae853SAndroid Build Coastguard Worker                      ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
284*495ae853SAndroid Build Coastguard Worker             if(u1_scale_ref) uc_Idx >>= 1;
285*495ae853SAndroid Build Coastguard Worker             uc_Idx1 = (i1_ref_frame1 < 0) ? 0 : i1_ref_frame1;
286*495ae853SAndroid Build Coastguard Worker             uc_Idx += (u1_scale_ref) ? (uc_Idx1 >> 1) : uc_Idx1;
287*495ae853SAndroid Build Coastguard Worker             pui32_weight_ofsts = (UWORD32 *) &ps_dec->pu4_wt_ofsts[2 * X3(uc_Idx)];
288*495ae853SAndroid Build Coastguard Worker 
289*495ae853SAndroid Build Coastguard Worker             if(i1_ref_frame0 < 0) pui32_weight_ofsts += 1;
290*495ae853SAndroid Build Coastguard Worker 
291*495ae853SAndroid Build Coastguard Worker             if(u1_scale_ref && (ps_dec->ps_cur_pps->u1_wted_bipred_idc == 2))
292*495ae853SAndroid Build Coastguard Worker             {
293*495ae853SAndroid Build Coastguard Worker                 WORD16 i2_ref_idx;
294*495ae853SAndroid Build Coastguard Worker                 i2_ref_idx = MAX(i1_ref_frame0, 0);
295*495ae853SAndroid Build Coastguard Worker                 i2_ref_idx *= (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1] << 1);
296*495ae853SAndroid Build Coastguard Worker                 i2_ref_idx += MAX(i1_ref_frame1, 0);
297*495ae853SAndroid Build Coastguard Worker                 if(!ps_cur_mb_info->u1_topmb)
298*495ae853SAndroid Build Coastguard Worker                     i2_ref_idx += (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] << 1) *
299*495ae853SAndroid Build Coastguard Worker                                   (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1] << 1);
300*495ae853SAndroid Build Coastguard Worker                 pui32_weight_ofsts = (UWORD32 *) &ps_dec->pu4_mbaff_wt_mat[2 * X3(i2_ref_idx)];
301*495ae853SAndroid Build Coastguard Worker             }
302*495ae853SAndroid Build Coastguard Worker         }
303*495ae853SAndroid Build Coastguard Worker     }
304*495ae853SAndroid Build Coastguard Worker 
305*495ae853SAndroid Build Coastguard Worker     s_temp_mv_pred.i1_ref_frame[0] = i1_ref_frame0;
306*495ae853SAndroid Build Coastguard Worker     s_temp_mv_pred.i1_ref_frame[1] = i1_ref_frame1;
307*495ae853SAndroid Build Coastguard Worker     s_temp_mv_pred.u1_col_ref_pic_idx = ps_ref_frame->u1_mv_buf_id;
308*495ae853SAndroid Build Coastguard Worker     s_temp_mv_pred.u1_pic_type = ps_ref_frame->u1_pic_type;
309*495ae853SAndroid Build Coastguard Worker 
310*495ae853SAndroid Build Coastguard Worker     /**********************************************************************/
311*495ae853SAndroid Build Coastguard Worker     /* Call the function which gets the number of partitions and          */
312*495ae853SAndroid Build Coastguard Worker     /* partition info of colocated Mb                                     */
313*495ae853SAndroid Build Coastguard Worker     /**********************************************************************/
314*495ae853SAndroid Build Coastguard Worker 
315*495ae853SAndroid Build Coastguard Worker     isvcd_one_to_one(ps_svc_lyr_dec, ps_dec->ps_col_pic, &s_mvdirect, u1_wd_x,
316*495ae853SAndroid Build Coastguard Worker                      ps_dec->i4_submb_ofst, ps_cur_mb_info);
317*495ae853SAndroid Build Coastguard Worker 
318*495ae853SAndroid Build Coastguard Worker     ps_col_pic = ps_dec->ps_col_pic;
319*495ae853SAndroid Build Coastguard Worker     if((s_mvdirect.u1_col_zeroflag_change == 0) || u1_direct_zero_pred_flag)
320*495ae853SAndroid Build Coastguard Worker     {
321*495ae853SAndroid Build Coastguard Worker         WORD16 i2_mv_x, i2_mv_y, i2_mvX1, i2_mvY1;
322*495ae853SAndroid Build Coastguard Worker         /* Most probable case */
323*495ae853SAndroid Build Coastguard Worker         u1_col_zero_flag = *(ps_col_pic->pu1_col_zero_flag + s_mvdirect.i4_mv_indices[0]);
324*495ae853SAndroid Build Coastguard Worker         u1_col_zero_flag = u1_col_zero_flag & 0x01;
325*495ae853SAndroid Build Coastguard Worker 
326*495ae853SAndroid Build Coastguard Worker         if(u1_zero_pred_cond_f || ((i1_ref_frame0 == 0) && (u1_col_zero_flag == 1)))
327*495ae853SAndroid Build Coastguard Worker         {
328*495ae853SAndroid Build Coastguard Worker             i2_mv_x = 0;
329*495ae853SAndroid Build Coastguard Worker             i2_mv_y = 0;
330*495ae853SAndroid Build Coastguard Worker         }
331*495ae853SAndroid Build Coastguard Worker         else
332*495ae853SAndroid Build Coastguard Worker         {
333*495ae853SAndroid Build Coastguard Worker             i2_mv_x = i2_spat_pred_mv[0];
334*495ae853SAndroid Build Coastguard Worker             i2_mv_y = i2_spat_pred_mv[1];
335*495ae853SAndroid Build Coastguard Worker         }
336*495ae853SAndroid Build Coastguard Worker 
337*495ae853SAndroid Build Coastguard Worker         if(u1_zero_pred_cond_b || ((i1_ref_frame1 == 0) && (u1_col_zero_flag == 1)))
338*495ae853SAndroid Build Coastguard Worker         {
339*495ae853SAndroid Build Coastguard Worker             i2_mvX1 = 0;
340*495ae853SAndroid Build Coastguard Worker             i2_mvY1 = 0;
341*495ae853SAndroid Build Coastguard Worker         }
342*495ae853SAndroid Build Coastguard Worker         else
343*495ae853SAndroid Build Coastguard Worker         {
344*495ae853SAndroid Build Coastguard Worker             i2_mvX1 = i2_spat_pred_mv[2];
345*495ae853SAndroid Build Coastguard Worker             i2_mvY1 = i2_spat_pred_mv[3];
346*495ae853SAndroid Build Coastguard Worker         }
347*495ae853SAndroid Build Coastguard Worker 
348*495ae853SAndroid Build Coastguard Worker         u1_sub_mb_num = ps_dec->u1_sub_mb_num;
349*495ae853SAndroid Build Coastguard Worker         u1_mb_partw = (u1_wd_x >> 2);
350*495ae853SAndroid Build Coastguard Worker 
351*495ae853SAndroid Build Coastguard Worker         if(i1_ref_frame0 >= 0)
352*495ae853SAndroid Build Coastguard Worker         {
353*495ae853SAndroid Build Coastguard Worker             {
354*495ae853SAndroid Build Coastguard Worker                 pred_info_pkd_t *ps_pred_pkd;
355*495ae853SAndroid Build Coastguard Worker                 WORD16 i2_mv[2];
356*495ae853SAndroid Build Coastguard Worker                 WORD8 i1_ref_idx = 0;
357*495ae853SAndroid Build Coastguard Worker 
358*495ae853SAndroid Build Coastguard Worker                 i2_mv[0] = i2_mv_x;
359*495ae853SAndroid Build Coastguard Worker                 i2_mv[1] = i2_mv_y;
360*495ae853SAndroid Build Coastguard Worker 
361*495ae853SAndroid Build Coastguard Worker                 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
362*495ae853SAndroid Build Coastguard Worker                 ih264d_fill_pred_info(i2_mv, u1_mb_partw, u1_mb_partw, u1_sub_mb_num, i1_pred,
363*495ae853SAndroid Build Coastguard Worker                                       ps_pred_pkd, ps_pic_buff0->u1_pic_buf_id, i1_ref_idx,
364*495ae853SAndroid Build Coastguard Worker                                       pui32_weight_ofsts, ps_pic_buff0->u1_pic_type);
365*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_pred_info_pkd_idx++;
366*495ae853SAndroid Build Coastguard Worker                 ps_cur_mb_info->u1_num_pred_parts++;
367*495ae853SAndroid Build Coastguard Worker             }
368*495ae853SAndroid Build Coastguard Worker         }
369*495ae853SAndroid Build Coastguard Worker 
370*495ae853SAndroid Build Coastguard Worker         if(i1_ref_frame1 >= 0)
371*495ae853SAndroid Build Coastguard Worker         {
372*495ae853SAndroid Build Coastguard Worker             {
373*495ae853SAndroid Build Coastguard Worker                 pred_info_pkd_t *ps_pred_pkd;
374*495ae853SAndroid Build Coastguard Worker                 WORD16 i2_mv[2];
375*495ae853SAndroid Build Coastguard Worker                 WORD8 i1_ref_idx = 0;
376*495ae853SAndroid Build Coastguard Worker 
377*495ae853SAndroid Build Coastguard Worker                 i2_mv[0] = i2_mvX1;
378*495ae853SAndroid Build Coastguard Worker                 i2_mv[1] = i2_mvY1;
379*495ae853SAndroid Build Coastguard Worker 
380*495ae853SAndroid Build Coastguard Worker                 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
381*495ae853SAndroid Build Coastguard Worker                 ih264d_fill_pred_info(i2_mv, u1_mb_partw, u1_mb_partw, u1_sub_mb_num, i1_pred,
382*495ae853SAndroid Build Coastguard Worker                                       ps_pred_pkd, ps_pic_buff1->u1_pic_buf_id, i1_ref_idx,
383*495ae853SAndroid Build Coastguard Worker                                       pui32_weight_ofsts, ps_pic_buff1->u1_pic_type);
384*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_pred_info_pkd_idx++;
385*495ae853SAndroid Build Coastguard Worker                 ps_cur_mb_info->u1_num_pred_parts++;
386*495ae853SAndroid Build Coastguard Worker             }
387*495ae853SAndroid Build Coastguard Worker         }
388*495ae853SAndroid Build Coastguard Worker 
389*495ae853SAndroid Build Coastguard Worker         /* Replication optimisation */
390*495ae853SAndroid Build Coastguard Worker         s_temp_mv_pred.i2_mv[0] = i2_mv_x;
391*495ae853SAndroid Build Coastguard Worker         s_temp_mv_pred.i2_mv[1] = i2_mv_y;
392*495ae853SAndroid Build Coastguard Worker         s_temp_mv_pred.i2_mv[2] = i2_mvX1;
393*495ae853SAndroid Build Coastguard Worker         s_temp_mv_pred.i2_mv[3] = i2_mvY1;
394*495ae853SAndroid Build Coastguard Worker 
395*495ae853SAndroid Build Coastguard Worker         /* Calculating colocated zero information */
396*495ae853SAndroid Build Coastguard Worker         {
397*495ae853SAndroid Build Coastguard Worker             /*************************************/
398*495ae853SAndroid Build Coastguard Worker             /* If(bit2 and bit3 set)             */
399*495ae853SAndroid Build Coastguard Worker             /* then                              */
400*495ae853SAndroid Build Coastguard Worker             /*  (bit0 and bit1) => submmbmode    */
401*495ae853SAndroid Build Coastguard Worker             /*  (bit2 and bit3) => mbmode        */
402*495ae853SAndroid Build Coastguard Worker             /* else                              */
403*495ae853SAndroid Build Coastguard Worker             /*  (bit0 and bit1) => mbmode        */
404*495ae853SAndroid Build Coastguard Worker             /*************************************/
405*495ae853SAndroid Build Coastguard Worker             /*UWORD8 u1_packed_mb_sub_mb_mode = sub_partition ?
406*495ae853SAndroid Build Coastguard Worker              (s_mvdirect.i1_partitionsize[0]) : ((s_mvdirect.i1_partitionsize[0]) <<
407*495ae853SAndroid Build Coastguard Worker              2);*/
408*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_packed_mb_sub_mb_mode = (u1_mb_partw == 2) ? 0x03 : 0;
409*495ae853SAndroid Build Coastguard Worker 
410*495ae853SAndroid Build Coastguard Worker             if(i1_ref_frame0 < 0)
411*495ae853SAndroid Build Coastguard Worker             {
412*495ae853SAndroid Build Coastguard Worker                 i2_mv_x = i2_mvX1;
413*495ae853SAndroid Build Coastguard Worker                 i2_mv_y = i2_mvY1;
414*495ae853SAndroid Build Coastguard Worker             }
415*495ae853SAndroid Build Coastguard Worker 
416*495ae853SAndroid Build Coastguard Worker             /* Change from left shift 4 to 6 - Varun */
417*495ae853SAndroid Build Coastguard Worker             u1_colz = (ps_cur_mb_info->u1_mb_field_decodingflag << 1) |
418*495ae853SAndroid Build Coastguard Worker                       ((u1_final_ref_idx == 0) && (ABS(i2_mv_x) <= 1) && (ABS(i2_mv_y) <= 1));
419*495ae853SAndroid Build Coastguard Worker             u1_colz |= (u1_packed_mb_sub_mb_mode << 6);
420*495ae853SAndroid Build Coastguard Worker         }
421*495ae853SAndroid Build Coastguard Worker         ps_mv = ps_mv_nmb_start + u1_sub_mb_num;
422*495ae853SAndroid Build Coastguard Worker         if(ps_mv)
423*495ae853SAndroid Build Coastguard Worker         {
424*495ae853SAndroid Build Coastguard Worker             ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u1_sub_mb_num, u1_colz, u1_mb_partw,
425*495ae853SAndroid Build Coastguard Worker                                u1_mb_partw);
426*495ae853SAndroid Build Coastguard Worker         }
427*495ae853SAndroid Build Coastguard Worker         else
428*495ae853SAndroid Build Coastguard Worker         {
429*495ae853SAndroid Build Coastguard Worker             return NOT_OK;
430*495ae853SAndroid Build Coastguard Worker         }
431*495ae853SAndroid Build Coastguard Worker 
432*495ae853SAndroid Build Coastguard Worker         if(u1_wd_x == MB_SIZE) ps_dec->u1_currB_type = 0;
433*495ae853SAndroid Build Coastguard Worker 
434*495ae853SAndroid Build Coastguard Worker         return OK;
435*495ae853SAndroid Build Coastguard Worker     }
436*495ae853SAndroid Build Coastguard Worker 
437*495ae853SAndroid Build Coastguard Worker     /***************************************************************************/
438*495ae853SAndroid Build Coastguard Worker     /* If present MB is 16x16 and the partition of colocated Mb is >= PRED_8x8 */
439*495ae853SAndroid Build Coastguard Worker     /* i.e 8x8 or less than 8x8 partitions then set up DMA for (0,0) and       */
440*495ae853SAndroid Build Coastguard Worker     /* spatially predicted motion vector and do the multiplexing after         */
441*495ae853SAndroid Build Coastguard Worker     /* motion compensation                                                     */
442*495ae853SAndroid Build Coastguard Worker     /***************************************************************************/
443*495ae853SAndroid Build Coastguard Worker 
444*495ae853SAndroid Build Coastguard Worker     if((u1_wd_x == MB_SIZE) && (s_mvdirect.i1_num_partitions > 2))
445*495ae853SAndroid Build Coastguard Worker     {
446*495ae853SAndroid Build Coastguard Worker         ps_cur_mb_info->u1_Mux = 1;
447*495ae853SAndroid Build Coastguard Worker         if(i1_ref_frame0 >= 0)
448*495ae853SAndroid Build Coastguard Worker         {
449*495ae853SAndroid Build Coastguard Worker             {
450*495ae853SAndroid Build Coastguard Worker                 pred_info_pkd_t *ps_pred_pkd;
451*495ae853SAndroid Build Coastguard Worker                 WORD8 i1_ref_idx = 0;
452*495ae853SAndroid Build Coastguard Worker 
453*495ae853SAndroid Build Coastguard Worker                 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
454*495ae853SAndroid Build Coastguard Worker                 ih264d_fill_pred_info(&(i2_spat_pred_mv[0]), 4, 4, 0, i1_pred, ps_pred_pkd,
455*495ae853SAndroid Build Coastguard Worker                                       ps_pic_buff0->u1_pic_buf_id, i1_ref_idx, pui32_weight_ofsts,
456*495ae853SAndroid Build Coastguard Worker                                       ps_pic_buff0->u1_pic_type);
457*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_pred_info_pkd_idx++;
458*495ae853SAndroid Build Coastguard Worker                 ps_cur_mb_info->u1_num_pred_parts++;
459*495ae853SAndroid Build Coastguard Worker             }
460*495ae853SAndroid Build Coastguard Worker 
461*495ae853SAndroid Build Coastguard Worker             /******    (0,0) Motion vectors DMA     *****/
462*495ae853SAndroid Build Coastguard Worker             {
463*495ae853SAndroid Build Coastguard Worker                 pred_info_pkd_t *ps_pred_pkd;
464*495ae853SAndroid Build Coastguard Worker                 WORD16 i2_mv[2];
465*495ae853SAndroid Build Coastguard Worker                 WORD8 i1_ref_idx = 0;
466*495ae853SAndroid Build Coastguard Worker 
467*495ae853SAndroid Build Coastguard Worker                 i2_mv[0] = 0;
468*495ae853SAndroid Build Coastguard Worker                 i2_mv[1] = 0;
469*495ae853SAndroid Build Coastguard Worker 
470*495ae853SAndroid Build Coastguard Worker                 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
471*495ae853SAndroid Build Coastguard Worker                 ih264d_fill_pred_info(i2_mv, 4, 4, 0, i1_pred, ps_pred_pkd,
472*495ae853SAndroid Build Coastguard Worker                                       ps_pic_buff0->u1_pic_buf_id, i1_ref_idx, pui32_weight_ofsts,
473*495ae853SAndroid Build Coastguard Worker                                       ps_pic_buff0->u1_pic_type);
474*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_pred_info_pkd_idx++;
475*495ae853SAndroid Build Coastguard Worker                 ps_cur_mb_info->u1_num_pred_parts++;
476*495ae853SAndroid Build Coastguard Worker             }
477*495ae853SAndroid Build Coastguard Worker         }
478*495ae853SAndroid Build Coastguard Worker         if(i1_ref_frame1 >= 0)
479*495ae853SAndroid Build Coastguard Worker         {
480*495ae853SAndroid Build Coastguard Worker             {
481*495ae853SAndroid Build Coastguard Worker                 pred_info_pkd_t *ps_pred_pkd;
482*495ae853SAndroid Build Coastguard Worker                 WORD8 i1_ref_idx = 0;
483*495ae853SAndroid Build Coastguard Worker 
484*495ae853SAndroid Build Coastguard Worker                 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
485*495ae853SAndroid Build Coastguard Worker                 ih264d_fill_pred_info(&(i2_spat_pred_mv[2]), 4, 4, 0, i1_pred, ps_pred_pkd,
486*495ae853SAndroid Build Coastguard Worker                                       ps_pic_buff1->u1_pic_buf_id, i1_ref_idx, pui32_weight_ofsts,
487*495ae853SAndroid Build Coastguard Worker                                       ps_pic_buff1->u1_pic_type);
488*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_pred_info_pkd_idx++;
489*495ae853SAndroid Build Coastguard Worker                 ps_cur_mb_info->u1_num_pred_parts++;
490*495ae853SAndroid Build Coastguard Worker             }
491*495ae853SAndroid Build Coastguard Worker 
492*495ae853SAndroid Build Coastguard Worker             /******    (0,0) Motion vectors DMA     *****/
493*495ae853SAndroid Build Coastguard Worker             {
494*495ae853SAndroid Build Coastguard Worker                 pred_info_pkd_t *ps_pred_pkd;
495*495ae853SAndroid Build Coastguard Worker                 WORD16 i2_mv[2];
496*495ae853SAndroid Build Coastguard Worker                 WORD8 i1_ref_idx = 0;
497*495ae853SAndroid Build Coastguard Worker 
498*495ae853SAndroid Build Coastguard Worker                 i2_mv[0] = 0;
499*495ae853SAndroid Build Coastguard Worker                 i2_mv[1] = 0;
500*495ae853SAndroid Build Coastguard Worker 
501*495ae853SAndroid Build Coastguard Worker                 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
502*495ae853SAndroid Build Coastguard Worker                 ih264d_fill_pred_info(i2_mv, 4, 4, 0, i1_pred, ps_pred_pkd,
503*495ae853SAndroid Build Coastguard Worker                                       ps_pic_buff1->u1_pic_buf_id, i1_ref_idx, pui32_weight_ofsts,
504*495ae853SAndroid Build Coastguard Worker                                       ps_pic_buff1->u1_pic_type);
505*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_pred_info_pkd_idx++;
506*495ae853SAndroid Build Coastguard Worker                 ps_cur_mb_info->u1_num_pred_parts++;
507*495ae853SAndroid Build Coastguard Worker             }
508*495ae853SAndroid Build Coastguard Worker         }
509*495ae853SAndroid Build Coastguard Worker     }
510*495ae853SAndroid Build Coastguard Worker 
511*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < s_mvdirect.i1_num_partitions; i++)
512*495ae853SAndroid Build Coastguard Worker     {
513*495ae853SAndroid Build Coastguard Worker         partition_size = s_mvdirect.i1_partitionsize[i];
514*495ae853SAndroid Build Coastguard Worker         u1_sub_mb_num = s_mvdirect.i1_submb_num[i];
515*495ae853SAndroid Build Coastguard Worker 
516*495ae853SAndroid Build Coastguard Worker         sub_partition = partition_size >> 2;
517*495ae853SAndroid Build Coastguard Worker         partition_size &= 0x3;
518*495ae853SAndroid Build Coastguard Worker         u1_mb_partw = pu1_mb_partw[partition_size];
519*495ae853SAndroid Build Coastguard Worker         u1_mb_parth = pu1_mb_parth[partition_size];
520*495ae853SAndroid Build Coastguard Worker         if(sub_partition != 0)
521*495ae853SAndroid Build Coastguard Worker         {
522*495ae853SAndroid Build Coastguard Worker             u1_mb_partw >>= 1;
523*495ae853SAndroid Build Coastguard Worker             u1_mb_parth >>= 1;
524*495ae853SAndroid Build Coastguard Worker         }
525*495ae853SAndroid Build Coastguard Worker 
526*495ae853SAndroid Build Coastguard Worker         u1_col_zero_flag = *(ps_col_pic->pu1_col_zero_flag + s_mvdirect.i4_mv_indices[i]);
527*495ae853SAndroid Build Coastguard Worker         u1_col_zero_flag = u1_col_zero_flag & 0x01;
528*495ae853SAndroid Build Coastguard Worker 
529*495ae853SAndroid Build Coastguard Worker         /*if(u1_col != u1_col_zero_flag)
530*495ae853SAndroid Build Coastguard Worker          u1_init = 1;*/
531*495ae853SAndroid Build Coastguard Worker 
532*495ae853SAndroid Build Coastguard Worker         pi2_final_mv0 = &i2_spat_pred_mv[0];
533*495ae853SAndroid Build Coastguard Worker         pi2_final_mv1 = &i2_spat_pred_mv[2];
534*495ae853SAndroid Build Coastguard Worker 
535*495ae853SAndroid Build Coastguard Worker         if(ps_cur_mb_info->u1_Mux != 1)
536*495ae853SAndroid Build Coastguard Worker         {
537*495ae853SAndroid Build Coastguard Worker             if(i1_ref_frame0 >= 0)
538*495ae853SAndroid Build Coastguard Worker             {
539*495ae853SAndroid Build Coastguard Worker                 {
540*495ae853SAndroid Build Coastguard Worker                     pred_info_pkd_t *ps_pred_pkd;
541*495ae853SAndroid Build Coastguard Worker                     WORD8 i1_ref_idx = 0;
542*495ae853SAndroid Build Coastguard Worker 
543*495ae853SAndroid Build Coastguard Worker                     ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
544*495ae853SAndroid Build Coastguard Worker                     ih264d_fill_pred_info(pi2_final_mv0, u1_mb_partw, u1_mb_parth, u1_sub_mb_num,
545*495ae853SAndroid Build Coastguard Worker                                           i1_pred, ps_pred_pkd, ps_pic_buff0->u1_pic_buf_id,
546*495ae853SAndroid Build Coastguard Worker                                           i1_ref_idx, pui32_weight_ofsts,
547*495ae853SAndroid Build Coastguard Worker                                           ps_pic_buff0->u1_pic_type);
548*495ae853SAndroid Build Coastguard Worker                     ps_dec->u4_pred_info_pkd_idx++;
549*495ae853SAndroid Build Coastguard Worker                     ps_cur_mb_info->u1_num_pred_parts++;
550*495ae853SAndroid Build Coastguard Worker                 }
551*495ae853SAndroid Build Coastguard Worker             }
552*495ae853SAndroid Build Coastguard Worker 
553*495ae853SAndroid Build Coastguard Worker             if(i1_ref_frame1 >= 0)
554*495ae853SAndroid Build Coastguard Worker             {
555*495ae853SAndroid Build Coastguard Worker                 pred_info_pkd_t *ps_pred_pkd;
556*495ae853SAndroid Build Coastguard Worker                 WORD8 i1_ref_idx = 0;
557*495ae853SAndroid Build Coastguard Worker 
558*495ae853SAndroid Build Coastguard Worker                 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
559*495ae853SAndroid Build Coastguard Worker                 ih264d_fill_pred_info(pi2_final_mv1, u1_mb_partw, u1_mb_parth, u1_sub_mb_num,
560*495ae853SAndroid Build Coastguard Worker                                       i1_pred, ps_pred_pkd, ps_pic_buff1->u1_pic_buf_id, i1_ref_idx,
561*495ae853SAndroid Build Coastguard Worker                                       pui32_weight_ofsts, ps_pic_buff1->u1_pic_type);
562*495ae853SAndroid Build Coastguard Worker                 ps_dec->u4_pred_info_pkd_idx++;
563*495ae853SAndroid Build Coastguard Worker                 ps_cur_mb_info->u1_num_pred_parts++;
564*495ae853SAndroid Build Coastguard Worker             }
565*495ae853SAndroid Build Coastguard Worker         }
566*495ae853SAndroid Build Coastguard Worker 
567*495ae853SAndroid Build Coastguard Worker         /* Replication optimisation */
568*495ae853SAndroid Build Coastguard Worker         s_temp_mv_pred.i2_mv[0] = pi2_final_mv0[0];
569*495ae853SAndroid Build Coastguard Worker         s_temp_mv_pred.i2_mv[1] = pi2_final_mv0[1];
570*495ae853SAndroid Build Coastguard Worker         s_temp_mv_pred.i2_mv[2] = pi2_final_mv1[0];
571*495ae853SAndroid Build Coastguard Worker         s_temp_mv_pred.i2_mv[3] = pi2_final_mv1[1];
572*495ae853SAndroid Build Coastguard Worker 
573*495ae853SAndroid Build Coastguard Worker         /* Calculating colocated zero information */
574*495ae853SAndroid Build Coastguard Worker         {
575*495ae853SAndroid Build Coastguard Worker             WORD16 i2_mv_x = 0, i2_mv_y = 0;
576*495ae853SAndroid Build Coastguard Worker             /*************************************/
577*495ae853SAndroid Build Coastguard Worker             /* If(bit2 and bit3 set)             */
578*495ae853SAndroid Build Coastguard Worker             /* then                              */
579*495ae853SAndroid Build Coastguard Worker             /*  (bit0 and bit1) => submmbmode    */
580*495ae853SAndroid Build Coastguard Worker             /*  (bit2 and bit3) => mbmode        */
581*495ae853SAndroid Build Coastguard Worker             /* else                              */
582*495ae853SAndroid Build Coastguard Worker             /*  (bit0 and bit1) => mbmode        */
583*495ae853SAndroid Build Coastguard Worker             /*************************************/
584*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_packed_mb_sub_mb_mode = sub_partition
585*495ae853SAndroid Build Coastguard Worker                                                   ? (s_mvdirect.i1_partitionsize[i])
586*495ae853SAndroid Build Coastguard Worker                                                   : ((s_mvdirect.i1_partitionsize[i]) << 2);
587*495ae853SAndroid Build Coastguard Worker 
588*495ae853SAndroid Build Coastguard Worker             if(i1_ref_frame0 >= 0)
589*495ae853SAndroid Build Coastguard Worker             {
590*495ae853SAndroid Build Coastguard Worker                 i2_mv_x = pi2_final_mv0[0];
591*495ae853SAndroid Build Coastguard Worker                 i2_mv_y = pi2_final_mv0[1];
592*495ae853SAndroid Build Coastguard Worker             }
593*495ae853SAndroid Build Coastguard Worker             else
594*495ae853SAndroid Build Coastguard Worker             {
595*495ae853SAndroid Build Coastguard Worker                 i2_mv_x = pi2_final_mv1[0];
596*495ae853SAndroid Build Coastguard Worker                 i2_mv_y = pi2_final_mv1[1];
597*495ae853SAndroid Build Coastguard Worker             }
598*495ae853SAndroid Build Coastguard Worker 
599*495ae853SAndroid Build Coastguard Worker             u1_colz = (ps_cur_mb_info->u1_mb_field_decodingflag << 1) |
600*495ae853SAndroid Build Coastguard Worker                       ((u1_final_ref_idx == 0) && (ABS(i2_mv_x) <= 1) && (ABS(i2_mv_y) <= 1));
601*495ae853SAndroid Build Coastguard Worker             u1_colz |= (u1_packed_mb_sub_mb_mode << 4);
602*495ae853SAndroid Build Coastguard Worker         }
603*495ae853SAndroid Build Coastguard Worker         ps_mv = ps_mv_nmb_start + u1_sub_mb_num;
604*495ae853SAndroid Build Coastguard Worker         if(ps_mv)
605*495ae853SAndroid Build Coastguard Worker         {
606*495ae853SAndroid Build Coastguard Worker             ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u1_sub_mb_num, u1_colz, u1_mb_parth,
607*495ae853SAndroid Build Coastguard Worker                                u1_mb_partw);
608*495ae853SAndroid Build Coastguard Worker         }
609*495ae853SAndroid Build Coastguard Worker         else
610*495ae853SAndroid Build Coastguard Worker         {
611*495ae853SAndroid Build Coastguard Worker             return NOT_OK;
612*495ae853SAndroid Build Coastguard Worker         }
613*495ae853SAndroid Build Coastguard Worker     }
614*495ae853SAndroid Build Coastguard Worker     i = 0;
615*495ae853SAndroid Build Coastguard Worker     if(i1_ref_frame0 >= 0) ps_cur_mb_info->u2_mask[i++] = ui2_mask_fwd;
616*495ae853SAndroid Build Coastguard Worker     if(i1_ref_frame1 >= 0) ps_cur_mb_info->u2_mask[i] = ui2_mask_bwd;
617*495ae853SAndroid Build Coastguard Worker 
618*495ae853SAndroid Build Coastguard Worker     return OK;
619*495ae853SAndroid Build Coastguard Worker }
620