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