1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker *
5*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker *
9*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker *
11*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker *
17*495ae853SAndroid Build Coastguard Worker *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker /**
21*495ae853SAndroid Build Coastguard Worker *******************************************************************************
22*495ae853SAndroid Build Coastguard Worker * @file
23*495ae853SAndroid Build Coastguard Worker * isvcd_process_epslice.c
24*495ae853SAndroid Build Coastguard Worker *
25*495ae853SAndroid Build Coastguard Worker * @brief
26*495ae853SAndroid Build Coastguard Worker * Contains routines that decode a I slice type
27*495ae853SAndroid Build Coastguard Worker *
28*495ae853SAndroid Build Coastguard Worker * @author
29*495ae853SAndroid Build Coastguard Worker * Kishore
30*495ae853SAndroid Build Coastguard Worker *
31*495ae853SAndroid Build Coastguard Worker * @remarks
32*495ae853SAndroid Build Coastguard Worker * None
33*495ae853SAndroid Build Coastguard Worker *
34*495ae853SAndroid Build Coastguard Worker *******************************************************************************
35*495ae853SAndroid Build Coastguard Worker */
36*495ae853SAndroid Build Coastguard Worker
37*495ae853SAndroid Build Coastguard Worker #include <assert.h>
38*495ae853SAndroid Build Coastguard Worker #include <string.h>
39*495ae853SAndroid Build Coastguard Worker
40*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
41*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
42*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
43*495ae853SAndroid Build Coastguard Worker #include "ih264d_bitstrm.h"
44*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
45*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
46*495ae853SAndroid Build Coastguard Worker #include "isvcd_structs.h"
47*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
48*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
49*495ae853SAndroid Build Coastguard Worker #include "ih264d_mb_utils.h"
50*495ae853SAndroid Build Coastguard Worker #include "ih264d_deblocking.h"
51*495ae853SAndroid Build Coastguard Worker #include "ih264d_dpb_manager.h"
52*495ae853SAndroid Build Coastguard Worker #include "ih264d_mvpred.h"
53*495ae853SAndroid Build Coastguard Worker #include "ih264d_inter_pred.h"
54*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_pslice.h"
55*495ae853SAndroid Build Coastguard Worker #include "isvcd_process_epslice.h"
56*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
57*495ae853SAndroid Build Coastguard Worker #include "ih264d_cabac.h"
58*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
59*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
60*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_slice.h"
61*495ae853SAndroid Build Coastguard Worker #include "ih264d_utils.h"
62*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_islice.h"
63*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_bslice.h"
64*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_intra_mb.h"
65*495ae853SAndroid Build Coastguard Worker #include "isvcd_mode_mv_resamp.h"
66*495ae853SAndroid Build Coastguard Worker #include "ih264_debug.h"
67*495ae853SAndroid Build Coastguard Worker
68*495ae853SAndroid Build Coastguard Worker /*!
69*495ae853SAndroid Build Coastguard Worker **************************************************************************
70*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_retrive_infer_mode_mv \endif
71*495ae853SAndroid Build Coastguard Worker *
72*495ae853SAndroid Build Coastguard Worker * \brief
73*495ae853SAndroid Build Coastguard Worker *
74*495ae853SAndroid Build Coastguard Worker * \return
75*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
76*495ae853SAndroid Build Coastguard Worker **************************************************************************
77*495ae853SAndroid Build Coastguard Worker */
isvcd_retrive_infer_mode_mv(svc_dec_lyr_struct_t * ps_svc_lyr_dec,mv_pred_t * ps_mvpred,UWORD8 u1_lx,UWORD8 u1_sub_mb_num)78*495ae853SAndroid Build Coastguard Worker void isvcd_retrive_infer_mode_mv(svc_dec_lyr_struct_t *ps_svc_lyr_dec, mv_pred_t *ps_mvpred,
79*495ae853SAndroid Build Coastguard Worker UWORD8 u1_lx, UWORD8 u1_sub_mb_num)
80*495ae853SAndroid Build Coastguard Worker {
81*495ae853SAndroid Build Coastguard Worker mode_motion_ctxt_t *ps_ctxt;
82*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_motion_pred;
83*495ae853SAndroid Build Coastguard Worker UWORD8 u1_tmp_lx = (u1_lx << 1);
84*495ae853SAndroid Build Coastguard Worker
85*495ae853SAndroid Build Coastguard Worker ps_ctxt = (mode_motion_ctxt_t *) ps_svc_lyr_dec->pv_mode_mv_sample_ctxt;
86*495ae853SAndroid Build Coastguard Worker ps_motion_pred = ps_ctxt->ps_motion_pred_struct;
87*495ae853SAndroid Build Coastguard Worker ps_motion_pred += u1_sub_mb_num;
88*495ae853SAndroid Build Coastguard Worker ps_mvpred->i2_mv[u1_tmp_lx] = ps_motion_pred->i2_mv[u1_tmp_lx];
89*495ae853SAndroid Build Coastguard Worker ps_mvpred->i2_mv[u1_tmp_lx + 1] = ps_motion_pred->i2_mv[u1_tmp_lx + 1];
90*495ae853SAndroid Build Coastguard Worker
91*495ae853SAndroid Build Coastguard Worker return;
92*495ae853SAndroid Build Coastguard Worker }
93*495ae853SAndroid Build Coastguard Worker /*!
94*495ae853SAndroid Build Coastguard Worker **************************************************************************
95*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_interlyr_motion_mode_pred \endif
96*495ae853SAndroid Build Coastguard Worker *
97*495ae853SAndroid Build Coastguard Worker * \brief
98*495ae853SAndroid Build Coastguard Worker *
99*495ae853SAndroid Build Coastguard Worker *
100*495ae853SAndroid Build Coastguard Worker * \return
101*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
102*495ae853SAndroid Build Coastguard Worker **************************************************************************
103*495ae853SAndroid Build Coastguard Worker */
isvcd_interlyr_motion_mode_pred(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info,dec_svc_mb_info_t * ps_svc_cur_mb_info,parse_pmbarams_t * ps_mb_part_info,parse_part_params_t * ps_part)104*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_interlyr_motion_mode_pred(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
105*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_cur_mb_info,
106*495ae853SAndroid Build Coastguard Worker dec_svc_mb_info_t *ps_svc_cur_mb_info,
107*495ae853SAndroid Build Coastguard Worker parse_pmbarams_t *ps_mb_part_info,
108*495ae853SAndroid Build Coastguard Worker parse_part_params_t *ps_part)
109*495ae853SAndroid Build Coastguard Worker {
110*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
111*495ae853SAndroid Build Coastguard Worker WORD32 i4_inter_layer_pred_req_flag;
112*495ae853SAndroid Build Coastguard Worker WORD32 i4_listx;
113*495ae853SAndroid Build Coastguard Worker WORD32 i4_mb_mode = -1;
114*495ae853SAndroid Build Coastguard Worker i4_inter_layer_pred_req_flag = SVCD_FALSE;
115*495ae853SAndroid Build Coastguard Worker i4_listx = (ps_dec->ps_cur_slice->u1_slice_type == B_SLICE) ? 2 : 1;
116*495ae853SAndroid Build Coastguard Worker /* check Base mode flag and motion predcition flags */
117*495ae853SAndroid Build Coastguard Worker if(1 == ps_svc_cur_mb_info->u1_base_mode_flag)
118*495ae853SAndroid Build Coastguard Worker {
119*495ae853SAndroid Build Coastguard Worker i4_inter_layer_pred_req_flag = SVCD_TRUE;
120*495ae853SAndroid Build Coastguard Worker }
121*495ae853SAndroid Build Coastguard Worker else
122*495ae853SAndroid Build Coastguard Worker {
123*495ae853SAndroid Build Coastguard Worker UWORD8 u1_mot_pred_flag;
124*495ae853SAndroid Build Coastguard Worker
125*495ae853SAndroid Build Coastguard Worker /* get the packed the motion pred flag of list 0 */
126*495ae853SAndroid Build Coastguard Worker u1_mot_pred_flag = ps_svc_cur_mb_info->au1_motion_pred_flag[0];
127*495ae853SAndroid Build Coastguard Worker
128*495ae853SAndroid Build Coastguard Worker /* extract the last 4 bits */
129*495ae853SAndroid Build Coastguard Worker u1_mot_pred_flag &= 0x0F;
130*495ae853SAndroid Build Coastguard Worker
131*495ae853SAndroid Build Coastguard Worker if(0 != u1_mot_pred_flag)
132*495ae853SAndroid Build Coastguard Worker {
133*495ae853SAndroid Build Coastguard Worker i4_inter_layer_pred_req_flag = SVCD_TRUE;
134*495ae853SAndroid Build Coastguard Worker }
135*495ae853SAndroid Build Coastguard Worker
136*495ae853SAndroid Build Coastguard Worker /* check for list 1 flags if required */
137*495ae853SAndroid Build Coastguard Worker if((2 == i4_listx) && (SVCD_FALSE == i4_inter_layer_pred_req_flag))
138*495ae853SAndroid Build Coastguard Worker {
139*495ae853SAndroid Build Coastguard Worker /* get the packed the motion pred flag of list 1 */
140*495ae853SAndroid Build Coastguard Worker u1_mot_pred_flag = ps_svc_cur_mb_info->au1_motion_pred_flag[1];
141*495ae853SAndroid Build Coastguard Worker
142*495ae853SAndroid Build Coastguard Worker /* extract the last 4 bits */
143*495ae853SAndroid Build Coastguard Worker u1_mot_pred_flag &= 0x0F;
144*495ae853SAndroid Build Coastguard Worker
145*495ae853SAndroid Build Coastguard Worker if(0 != u1_mot_pred_flag)
146*495ae853SAndroid Build Coastguard Worker {
147*495ae853SAndroid Build Coastguard Worker i4_inter_layer_pred_req_flag = SVCD_TRUE;
148*495ae853SAndroid Build Coastguard Worker }
149*495ae853SAndroid Build Coastguard Worker }
150*495ae853SAndroid Build Coastguard Worker }
151*495ae853SAndroid Build Coastguard Worker
152*495ae853SAndroid Build Coastguard Worker if(SVCD_TRUE == i4_inter_layer_pred_req_flag)
153*495ae853SAndroid Build Coastguard Worker {
154*495ae853SAndroid Build Coastguard Worker mode_motion_ctxt_t *ps_ctxt;
155*495ae853SAndroid Build Coastguard Worker mode_motion_lyr_ctxt *ps_lyr_mem;
156*495ae853SAndroid Build Coastguard Worker
157*495ae853SAndroid Build Coastguard Worker ps_ctxt = (mode_motion_ctxt_t *) ps_svc_lyr_dec->pv_mode_mv_sample_ctxt;
158*495ae853SAndroid Build Coastguard Worker /* get the current layer ctxt */
159*495ae853SAndroid Build Coastguard Worker ps_lyr_mem = &ps_ctxt->as_res_lyr_mem[ps_ctxt->i4_res_id];
160*495ae853SAndroid Build Coastguard Worker
161*495ae853SAndroid Build Coastguard Worker {
162*495ae853SAndroid Build Coastguard Worker ps_ctxt->i4_listx = i4_listx;
163*495ae853SAndroid Build Coastguard Worker
164*495ae853SAndroid Build Coastguard Worker i4_mb_mode =
165*495ae853SAndroid Build Coastguard Worker ps_lyr_mem->pf_inter_lyr_pred(ps_svc_lyr_dec->pv_mode_mv_sample_ctxt, ps_cur_mb_info,
166*495ae853SAndroid Build Coastguard Worker ps_svc_cur_mb_info, ps_dec, ps_mb_part_info, ps_part);
167*495ae853SAndroid Build Coastguard Worker }
168*495ae853SAndroid Build Coastguard Worker }
169*495ae853SAndroid Build Coastguard Worker return i4_mb_mode;
170*495ae853SAndroid Build Coastguard Worker }
171*495ae853SAndroid Build Coastguard Worker /*!
172*495ae853SAndroid Build Coastguard Worker **************************************************************************
173*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_mv_pred_ref_tfr_nby2_epmb \endif
174*495ae853SAndroid Build Coastguard Worker *
175*495ae853SAndroid Build Coastguard Worker * \brief
176*495ae853SAndroid Build Coastguard Worker *
177*495ae853SAndroid Build Coastguard Worker * \return
178*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
179*495ae853SAndroid Build Coastguard Worker **************************************************************************
180*495ae853SAndroid Build Coastguard Worker */
isvcd_mv_pred_ref_tfr_nby2_epmb(dec_struct_t * ps_dec,UWORD8 u1_mb_idx,UWORD8 u1_num_mbs)181*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_mv_pred_ref_tfr_nby2_epmb(dec_struct_t *ps_dec, UWORD8 u1_mb_idx, UWORD8 u1_num_mbs)
182*495ae853SAndroid Build Coastguard Worker {
183*495ae853SAndroid Build Coastguard Worker svc_dec_lyr_struct_t *ps_svc_lyr_dec = (svc_dec_lyr_struct_t *) ps_dec;
184*495ae853SAndroid Build Coastguard Worker parse_pmbarams_t *ps_mb_part_info;
185*495ae853SAndroid Build Coastguard Worker parse_part_params_t *ps_part;
186*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_mv_nmb, *ps_mv_nmb_start, *ps_mv_ntop, *ps_mv_ntop_start;
187*495ae853SAndroid Build Coastguard Worker UWORD32 i, j;
188*495ae853SAndroid Build Coastguard Worker const UWORD32 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
189*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_cur_mb_info;
190*495ae853SAndroid Build Coastguard Worker dec_svc_mb_info_t *ps_svc_cur_mb_info;
191*495ae853SAndroid Build Coastguard Worker WORD32 i2_mv_x, i2_mv_y;
192*495ae853SAndroid Build Coastguard Worker
193*495ae853SAndroid Build Coastguard Worker ps_dec->i4_submb_ofst -= (u1_num_mbs - u1_mb_idx) << 4;
194*495ae853SAndroid Build Coastguard Worker ps_mb_part_info = ps_dec->ps_parse_mb_data;
195*495ae853SAndroid Build Coastguard Worker ps_part = ps_dec->ps_parse_part_params;
196*495ae853SAndroid Build Coastguard Worker
197*495ae853SAndroid Build Coastguard Worker /* N/2 Mb MvPred and Transfer Setup Loop */
198*495ae853SAndroid Build Coastguard Worker for(i = u1_mb_idx; i < u1_num_mbs; i++, ps_mb_part_info++)
199*495ae853SAndroid Build Coastguard Worker {
200*495ae853SAndroid Build Coastguard Worker UWORD32 u1_colz;
201*495ae853SAndroid Build Coastguard Worker UWORD32 u1_field;
202*495ae853SAndroid Build Coastguard Worker mv_pred_t s_mvPred = {0};
203*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_mv_pred = &s_mvPred;
204*495ae853SAndroid Build Coastguard Worker
205*495ae853SAndroid Build Coastguard Worker *ps_mv_pred = ps_dec->s_default_mv_pred;
206*495ae853SAndroid Build Coastguard Worker
207*495ae853SAndroid Build Coastguard Worker ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
208*495ae853SAndroid Build Coastguard Worker
209*495ae853SAndroid Build Coastguard Worker /* Restore the slice scratch MbX and MbY context */
210*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info = ps_dec->ps_nmb_info + i;
211*495ae853SAndroid Build Coastguard Worker ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + i;
212*495ae853SAndroid Build Coastguard Worker u1_field = ps_cur_mb_info->u1_mb_field_decodingflag;
213*495ae853SAndroid Build Coastguard Worker
214*495ae853SAndroid Build Coastguard Worker ps_mv_nmb_start = ps_dec->ps_mv_cur + (i << 4);
215*495ae853SAndroid Build Coastguard Worker ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx;
216*495ae853SAndroid Build Coastguard Worker ps_dec->u2_mby = ps_cur_mb_info->u2_mby;
217*495ae853SAndroid Build Coastguard Worker ps_dec->u2_mv_2mb[i & 0x1] = 0;
218*495ae853SAndroid Build Coastguard Worker
219*495ae853SAndroid Build Coastguard Worker /* Look for MV Prediction and Reference Transfer in Non-I Mbs */
220*495ae853SAndroid Build Coastguard Worker if(!ps_mb_part_info->u1_isI_mb)
221*495ae853SAndroid Build Coastguard Worker {
222*495ae853SAndroid Build Coastguard Worker UWORD32 u1_blk_no;
223*495ae853SAndroid Build Coastguard Worker WORD32 i1_ref_idx, i1_ref_idx1;
224*495ae853SAndroid Build Coastguard Worker UWORD32 u1_sub_mb_x, u1_sub_mb_y, u1_sub_mb_num;
225*495ae853SAndroid Build Coastguard Worker UWORD32 u1_num_part, u1_num_ref, u1_wd, u1_ht;
226*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_wt_offst, **ppu4_wt_ofst;
227*495ae853SAndroid Build Coastguard Worker UWORD32 u1_scale_ref, u4_bot_mb;
228*495ae853SAndroid Build Coastguard Worker WORD8 *pi1_ref_idx = ps_mb_part_info->i1_ref_idx[0];
229*495ae853SAndroid Build Coastguard Worker pic_buffer_t *ps_ref_frame, **pps_ref_frame;
230*495ae853SAndroid Build Coastguard Worker deblk_mb_t *ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + i;
231*495ae853SAndroid Build Coastguard Worker WORD32 i4_mb_mode_svc;
232*495ae853SAndroid Build Coastguard Worker UWORD8 u1_motion_pred_flag_l0 = ps_svc_cur_mb_info->au1_motion_pred_flag[0];
233*495ae853SAndroid Build Coastguard Worker
234*495ae853SAndroid Build Coastguard Worker /* MB Level initialisations */
235*495ae853SAndroid Build Coastguard Worker ps_dec->u4_num_pmbair = i >> u1_mbaff;
236*495ae853SAndroid Build Coastguard Worker ps_dec->u1_mb_idx_mv = i;
237*495ae853SAndroid Build Coastguard Worker ppu4_wt_ofst = ps_mb_part_info->pu4_wt_offst;
238*495ae853SAndroid Build Coastguard Worker pps_ref_frame = ps_dec->ps_ref_pic_buf_lx[0];
239*495ae853SAndroid Build Coastguard Worker
240*495ae853SAndroid Build Coastguard Worker i4_mb_mode_svc = isvcd_interlyr_motion_mode_pred(
241*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info, ps_mb_part_info, ps_part);
242*495ae853SAndroid Build Coastguard Worker
243*495ae853SAndroid Build Coastguard Worker if((-1 == i4_mb_mode_svc) || (SVC_INTER_MB == i4_mb_mode_svc))
244*495ae853SAndroid Build Coastguard Worker {
245*495ae853SAndroid Build Coastguard Worker ps_mv_ntop_start =
246*495ae853SAndroid Build Coastguard Worker ps_mv_nmb_start - (ps_dec->u2_frm_wd_in_mbs << (4 + u1_mbaff)) + 12;
247*495ae853SAndroid Build Coastguard Worker
248*495ae853SAndroid Build Coastguard Worker u1_num_part = ps_mb_part_info->u1_num_part;
249*495ae853SAndroid Build Coastguard Worker ps_cur_deblk_mb->u1_mb_type |= (u1_num_part > 1) << 1;
250*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u4_pred_info_pkd_idx = ps_dec->u4_pred_info_pkd_idx;
251*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_num_pred_parts = 0;
252*495ae853SAndroid Build Coastguard Worker
253*495ae853SAndroid Build Coastguard Worker /****************************************************/
254*495ae853SAndroid Build Coastguard Worker /* weighted u4_ofst pointer calculations, this loop */
255*495ae853SAndroid Build Coastguard Worker /* runs maximum 4 times, even in direct cases */
256*495ae853SAndroid Build Coastguard Worker /****************************************************/
257*495ae853SAndroid Build Coastguard Worker u1_scale_ref = u1_mbaff & u1_field;
258*495ae853SAndroid Build Coastguard Worker
259*495ae853SAndroid Build Coastguard Worker u4_bot_mb = 1 - ps_cur_mb_info->u1_topmb;
260*495ae853SAndroid Build Coastguard Worker if(ps_dec->ps_cur_pps->u1_wted_pred_flag)
261*495ae853SAndroid Build Coastguard Worker {
262*495ae853SAndroid Build Coastguard Worker u1_num_ref = MIN(u1_num_part, 4);
263*495ae853SAndroid Build Coastguard Worker for(u1_blk_no = 0; u1_blk_no < u1_num_ref; u1_blk_no++)
264*495ae853SAndroid Build Coastguard Worker {
265*495ae853SAndroid Build Coastguard Worker i1_ref_idx = pi1_ref_idx[u1_blk_no];
266*495ae853SAndroid Build Coastguard Worker if(u1_scale_ref) i1_ref_idx >>= 1;
267*495ae853SAndroid Build Coastguard Worker pu4_wt_offst = (UWORD32 *) &ps_dec->pu4_wt_ofsts[2 * X3(i1_ref_idx)];
268*495ae853SAndroid Build Coastguard Worker ppu4_wt_ofst[u1_blk_no] = pu4_wt_offst;
269*495ae853SAndroid Build Coastguard Worker }
270*495ae853SAndroid Build Coastguard Worker }
271*495ae853SAndroid Build Coastguard Worker else
272*495ae853SAndroid Build Coastguard Worker {
273*495ae853SAndroid Build Coastguard Worker ppu4_wt_ofst[0] = NULL;
274*495ae853SAndroid Build Coastguard Worker ppu4_wt_ofst[1] = NULL;
275*495ae853SAndroid Build Coastguard Worker ppu4_wt_ofst[2] = NULL;
276*495ae853SAndroid Build Coastguard Worker ppu4_wt_ofst[3] = NULL;
277*495ae853SAndroid Build Coastguard Worker }
278*495ae853SAndroid Build Coastguard Worker
279*495ae853SAndroid Build Coastguard Worker /**************************************************/
280*495ae853SAndroid Build Coastguard Worker /* Loop on Partitions */
281*495ae853SAndroid Build Coastguard Worker /**************************************************/
282*495ae853SAndroid Build Coastguard Worker for(j = 0; j < u1_num_part; j++, ps_part++)
283*495ae853SAndroid Build Coastguard Worker {
284*495ae853SAndroid Build Coastguard Worker u1_sub_mb_num = ps_part->u1_sub_mb_num;
285*495ae853SAndroid Build Coastguard Worker ps_dec->u1_sub_mb_num = u1_sub_mb_num;
286*495ae853SAndroid Build Coastguard Worker
287*495ae853SAndroid Build Coastguard Worker if(PART_NOT_DIRECT != ps_part->u1_is_direct)
288*495ae853SAndroid Build Coastguard Worker {
289*495ae853SAndroid Build Coastguard Worker /* Mb Skip Mode */
290*495ae853SAndroid Build Coastguard Worker /* Setting the default and other members of MvPred Structure */
291*495ae853SAndroid Build Coastguard Worker s_mvPred.i2_mv[2] = -1;
292*495ae853SAndroid Build Coastguard Worker s_mvPred.i2_mv[3] = -1;
293*495ae853SAndroid Build Coastguard Worker s_mvPred.i1_ref_frame[0] = 0;
294*495ae853SAndroid Build Coastguard Worker i1_ref_idx = (u1_scale_ref && u4_bot_mb) ? MAX_REF_BUFS : 0;
295*495ae853SAndroid Build Coastguard Worker ps_ref_frame = pps_ref_frame[i1_ref_idx];
296*495ae853SAndroid Build Coastguard Worker s_mvPred.u1_col_ref_pic_idx = ps_ref_frame->u1_mv_buf_id;
297*495ae853SAndroid Build Coastguard Worker s_mvPred.u1_pic_type = ps_ref_frame->u1_pic_type;
298*495ae853SAndroid Build Coastguard Worker pu4_wt_offst = (UWORD32 *) &ps_dec->pu4_wt_ofsts[0];
299*495ae853SAndroid Build Coastguard Worker
300*495ae853SAndroid Build Coastguard Worker ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, ps_mv_nmb_start, ps_mv_ntop_start,
301*495ae853SAndroid Build Coastguard Worker &s_mvPred, 0, 4, 0, 1, MB_SKIP);
302*495ae853SAndroid Build Coastguard Worker
303*495ae853SAndroid Build Coastguard Worker {
304*495ae853SAndroid Build Coastguard Worker pred_info_pkd_t *ps_pred_pkd;
305*495ae853SAndroid Build Coastguard Worker ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
306*495ae853SAndroid Build Coastguard Worker ih264d_fill_pred_info(s_mvPred.i2_mv, 4, 4, 0, PRED_L0, ps_pred_pkd,
307*495ae853SAndroid Build Coastguard Worker ps_ref_frame->u1_pic_buf_id,
308*495ae853SAndroid Build Coastguard Worker (i1_ref_idx >> u1_scale_ref), pu4_wt_offst,
309*495ae853SAndroid Build Coastguard Worker ps_ref_frame->u1_pic_type);
310*495ae853SAndroid Build Coastguard Worker
311*495ae853SAndroid Build Coastguard Worker ps_dec->u4_pred_info_pkd_idx++;
312*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_num_pred_parts++;
313*495ae853SAndroid Build Coastguard Worker }
314*495ae853SAndroid Build Coastguard Worker
315*495ae853SAndroid Build Coastguard Worker /* Storing colocated zero information */
316*495ae853SAndroid Build Coastguard Worker u1_colz = ((ABS(s_mvPred.i2_mv[0]) <= 1) && (ABS(s_mvPred.i2_mv[1]) <= 1)) +
317*495ae853SAndroid Build Coastguard Worker (u1_field << 1);
318*495ae853SAndroid Build Coastguard Worker
319*495ae853SAndroid Build Coastguard Worker if(ps_mv_nmb_start)
320*495ae853SAndroid Build Coastguard Worker {
321*495ae853SAndroid Build Coastguard Worker ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0, u1_colz, 4,
322*495ae853SAndroid Build Coastguard Worker 4);
323*495ae853SAndroid Build Coastguard Worker }
324*495ae853SAndroid Build Coastguard Worker else
325*495ae853SAndroid Build Coastguard Worker {
326*495ae853SAndroid Build Coastguard Worker return NOT_OK;
327*495ae853SAndroid Build Coastguard Worker }
328*495ae853SAndroid Build Coastguard Worker }
329*495ae853SAndroid Build Coastguard Worker else
330*495ae853SAndroid Build Coastguard Worker {
331*495ae853SAndroid Build Coastguard Worker u1_sub_mb_x = u1_sub_mb_num & 0x03;
332*495ae853SAndroid Build Coastguard Worker u1_sub_mb_y = u1_sub_mb_num >> 2;
333*495ae853SAndroid Build Coastguard Worker u1_blk_no = (u1_num_part < 4)
334*495ae853SAndroid Build Coastguard Worker ? j
335*495ae853SAndroid Build Coastguard Worker : (((u1_sub_mb_y >> 1) << 1) + (u1_sub_mb_x >> 1));
336*495ae853SAndroid Build Coastguard Worker
337*495ae853SAndroid Build Coastguard Worker ps_mv_ntop = ps_mv_ntop_start + u1_sub_mb_x;
338*495ae853SAndroid Build Coastguard Worker ps_mv_nmb = ps_mv_nmb_start + u1_sub_mb_num;
339*495ae853SAndroid Build Coastguard Worker
340*495ae853SAndroid Build Coastguard Worker u1_wd = ps_part->u1_partwidth;
341*495ae853SAndroid Build Coastguard Worker u1_ht = ps_part->u1_partheight;
342*495ae853SAndroid Build Coastguard Worker
343*495ae853SAndroid Build Coastguard Worker /* Populate the colpic info and reference frames */
344*495ae853SAndroid Build Coastguard Worker i1_ref_idx = pi1_ref_idx[u1_blk_no];
345*495ae853SAndroid Build Coastguard Worker /********************************************************************/
346*495ae853SAndroid Build Coastguard Worker /* If reference index is inferred from the base layer and it is */
347*495ae853SAndroid Build Coastguard Worker /* exceeding the number of active reference in the current layer. */
348*495ae853SAndroid Build Coastguard Worker /* Then reference index is clipped to the max in the current layer */
349*495ae853SAndroid Build Coastguard Worker /********************************************************************/
350*495ae853SAndroid Build Coastguard Worker if(ps_svc_cur_mb_info->u1_base_mode_flag == 1)
351*495ae853SAndroid Build Coastguard Worker {
352*495ae853SAndroid Build Coastguard Worker if(i1_ref_idx > (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1))
353*495ae853SAndroid Build Coastguard Worker {
354*495ae853SAndroid Build Coastguard Worker i1_ref_idx = ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1;
355*495ae853SAndroid Build Coastguard Worker }
356*495ae853SAndroid Build Coastguard Worker }
357*495ae853SAndroid Build Coastguard Worker s_mvPred.i1_ref_frame[0] = i1_ref_idx;
358*495ae853SAndroid Build Coastguard Worker
359*495ae853SAndroid Build Coastguard Worker if((1 != ps_svc_cur_mb_info->u1_base_mode_flag) &&
360*495ae853SAndroid Build Coastguard Worker (0 == (u1_motion_pred_flag_l0 & (1 << u1_blk_no))))
361*495ae853SAndroid Build Coastguard Worker {
362*495ae853SAndroid Build Coastguard Worker /********************************************************/
363*495ae853SAndroid Build Coastguard Worker /* Predict Mv */
364*495ae853SAndroid Build Coastguard Worker /* Add Mv Residuals and store back */
365*495ae853SAndroid Build Coastguard Worker /********************************************************/
366*495ae853SAndroid Build Coastguard Worker ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, ps_mv_nmb, ps_mv_ntop,
367*495ae853SAndroid Build Coastguard Worker &s_mvPred, u1_sub_mb_num, u1_wd, 0, 1,
368*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_mb_mc_mode);
369*495ae853SAndroid Build Coastguard Worker
370*495ae853SAndroid Build Coastguard Worker i2_mv_x = ps_mv_nmb->i2_mv[0];
371*495ae853SAndroid Build Coastguard Worker i2_mv_y = ps_mv_nmb->i2_mv[1];
372*495ae853SAndroid Build Coastguard Worker i2_mv_x += s_mvPred.i2_mv[0];
373*495ae853SAndroid Build Coastguard Worker i2_mv_y += s_mvPred.i2_mv[1];
374*495ae853SAndroid Build Coastguard Worker s_mvPred.i2_mv[0] = i2_mv_x;
375*495ae853SAndroid Build Coastguard Worker s_mvPred.i2_mv[1] = i2_mv_y;
376*495ae853SAndroid Build Coastguard Worker }
377*495ae853SAndroid Build Coastguard Worker else
378*495ae853SAndroid Build Coastguard Worker {
379*495ae853SAndroid Build Coastguard Worker isvcd_retrive_infer_mode_mv(ps_svc_lyr_dec, &s_mvPred, 0,
380*495ae853SAndroid Build Coastguard Worker u1_sub_mb_num);
381*495ae853SAndroid Build Coastguard Worker
382*495ae853SAndroid Build Coastguard Worker if(0 != (u1_motion_pred_flag_l0 & (1 << u1_blk_no)))
383*495ae853SAndroid Build Coastguard Worker {
384*495ae853SAndroid Build Coastguard Worker i2_mv_x = ps_mv_nmb->i2_mv[0];
385*495ae853SAndroid Build Coastguard Worker i2_mv_y = ps_mv_nmb->i2_mv[1];
386*495ae853SAndroid Build Coastguard Worker i2_mv_x += s_mvPred.i2_mv[0];
387*495ae853SAndroid Build Coastguard Worker i2_mv_y += s_mvPred.i2_mv[1];
388*495ae853SAndroid Build Coastguard Worker s_mvPred.i2_mv[0] = i2_mv_x;
389*495ae853SAndroid Build Coastguard Worker s_mvPred.i2_mv[1] = i2_mv_y;
390*495ae853SAndroid Build Coastguard Worker }
391*495ae853SAndroid Build Coastguard Worker i2_mv_x = s_mvPred.i2_mv[0];
392*495ae853SAndroid Build Coastguard Worker i2_mv_y = s_mvPred.i2_mv[1];
393*495ae853SAndroid Build Coastguard Worker }
394*495ae853SAndroid Build Coastguard Worker /********************************************************/
395*495ae853SAndroid Build Coastguard Worker /* Transfer setup call */
396*495ae853SAndroid Build Coastguard Worker /* convert RefIdx if it is MbAff */
397*495ae853SAndroid Build Coastguard Worker /* Pass Weight Offset and refFrame */
398*495ae853SAndroid Build Coastguard Worker /********************************************************/
399*495ae853SAndroid Build Coastguard Worker i1_ref_idx1 = i1_ref_idx >> u1_scale_ref;
400*495ae853SAndroid Build Coastguard Worker if(u1_scale_ref && ((i1_ref_idx & 0x01) != u4_bot_mb))
401*495ae853SAndroid Build Coastguard Worker i1_ref_idx1 += MAX_REF_BUFS;
402*495ae853SAndroid Build Coastguard Worker if(-1 == i1_ref_idx1) return NOT_OK;
403*495ae853SAndroid Build Coastguard Worker ps_ref_frame = pps_ref_frame[i1_ref_idx1];
404*495ae853SAndroid Build Coastguard Worker pu4_wt_offst = ppu4_wt_ofst[u1_blk_no];
405*495ae853SAndroid Build Coastguard Worker
406*495ae853SAndroid Build Coastguard Worker {
407*495ae853SAndroid Build Coastguard Worker pred_info_pkd_t *ps_pred_pkd;
408*495ae853SAndroid Build Coastguard Worker ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
409*495ae853SAndroid Build Coastguard Worker ih264d_fill_pred_info(s_mvPred.i2_mv, u1_wd, u1_ht, u1_sub_mb_num,
410*495ae853SAndroid Build Coastguard Worker PRED_L0, ps_pred_pkd, ps_ref_frame->u1_pic_buf_id,
411*495ae853SAndroid Build Coastguard Worker (i1_ref_idx >> u1_scale_ref), pu4_wt_offst,
412*495ae853SAndroid Build Coastguard Worker ps_ref_frame->u1_pic_type);
413*495ae853SAndroid Build Coastguard Worker
414*495ae853SAndroid Build Coastguard Worker ps_dec->u4_pred_info_pkd_idx++;
415*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_num_pred_parts++;
416*495ae853SAndroid Build Coastguard Worker }
417*495ae853SAndroid Build Coastguard Worker
418*495ae853SAndroid Build Coastguard Worker /* Fill colocated info in MvPred structure */
419*495ae853SAndroid Build Coastguard Worker s_mvPred.u1_col_ref_pic_idx = ps_ref_frame->u1_mv_buf_id;
420*495ae853SAndroid Build Coastguard Worker s_mvPred.u1_pic_type = ps_ref_frame->u1_pic_type;
421*495ae853SAndroid Build Coastguard Worker
422*495ae853SAndroid Build Coastguard Worker /* Calculating colocated zero information */
423*495ae853SAndroid Build Coastguard Worker u1_colz = (u1_field << 1) |
424*495ae853SAndroid Build Coastguard Worker ((i1_ref_idx == 0) && (ABS(i2_mv_x) <= 1) && (ABS(i2_mv_y) <= 1));
425*495ae853SAndroid Build Coastguard Worker u1_colz |= ps_mb_part_info->u1_col_info[u1_blk_no];
426*495ae853SAndroid Build Coastguard Worker
427*495ae853SAndroid Build Coastguard Worker /* Replicate the motion vectors and colzero u4_flag */
428*495ae853SAndroid Build Coastguard Worker /* for all sub-partitions */
429*495ae853SAndroid Build Coastguard Worker
430*495ae853SAndroid Build Coastguard Worker if(ps_mv_nmb)
431*495ae853SAndroid Build Coastguard Worker {
432*495ae853SAndroid Build Coastguard Worker ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb, u1_sub_mb_num, u1_colz,
433*495ae853SAndroid Build Coastguard Worker u1_ht, u1_wd);
434*495ae853SAndroid Build Coastguard Worker }
435*495ae853SAndroid Build Coastguard Worker else
436*495ae853SAndroid Build Coastguard Worker {
437*495ae853SAndroid Build Coastguard Worker return NOT_OK;
438*495ae853SAndroid Build Coastguard Worker }
439*495ae853SAndroid Build Coastguard Worker }
440*495ae853SAndroid Build Coastguard Worker }
441*495ae853SAndroid Build Coastguard Worker
442*495ae853SAndroid Build Coastguard Worker /* to take care of 16 parttitions increment for base mode flag case*/
443*495ae853SAndroid Build Coastguard Worker if(1 == ps_svc_cur_mb_info->u1_base_mode_flag)
444*495ae853SAndroid Build Coastguard Worker {
445*495ae853SAndroid Build Coastguard Worker ps_part += (MAX_NUM_MB_PART - u1_num_part);
446*495ae853SAndroid Build Coastguard Worker }
447*495ae853SAndroid Build Coastguard Worker }
448*495ae853SAndroid Build Coastguard Worker else
449*495ae853SAndroid Build Coastguard Worker {
450*495ae853SAndroid Build Coastguard Worker ps_cur_deblk_mb->u1_mb_type |= D_INTRA_IBL;
451*495ae853SAndroid Build Coastguard Worker if((ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER) &&
452*495ae853SAndroid Build Coastguard Worker (DBLK_ENABLED == ps_dec->ps_cur_slice->u1_disable_dblk_filter_idc))
453*495ae853SAndroid Build Coastguard Worker {
454*495ae853SAndroid Build Coastguard Worker ps_cur_deblk_mb->u1_deblocking_mode = MB_ENABLE_FILTERING;
455*495ae853SAndroid Build Coastguard Worker }
456*495ae853SAndroid Build Coastguard Worker /* to take care of 16 parttitions increment for base mode flag case*/
457*495ae853SAndroid Build Coastguard Worker if(1 != ps_svc_cur_mb_info->u1_base_mode_flag)
458*495ae853SAndroid Build Coastguard Worker {
459*495ae853SAndroid Build Coastguard Worker return NOT_OK;
460*495ae853SAndroid Build Coastguard Worker }
461*495ae853SAndroid Build Coastguard Worker {
462*495ae853SAndroid Build Coastguard Worker ps_part += (MAX_NUM_MB_PART);
463*495ae853SAndroid Build Coastguard Worker }
464*495ae853SAndroid Build Coastguard Worker /* Storing colocated zero information */
465*495ae853SAndroid Build Coastguard Worker if(ps_mv_nmb_start)
466*495ae853SAndroid Build Coastguard Worker {
467*495ae853SAndroid Build Coastguard Worker ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
468*495ae853SAndroid Build Coastguard Worker (UWORD8) (u1_field << 1), 4, 4);
469*495ae853SAndroid Build Coastguard Worker }
470*495ae853SAndroid Build Coastguard Worker else
471*495ae853SAndroid Build Coastguard Worker {
472*495ae853SAndroid Build Coastguard Worker return NOT_OK;
473*495ae853SAndroid Build Coastguard Worker }
474*495ae853SAndroid Build Coastguard Worker }
475*495ae853SAndroid Build Coastguard Worker }
476*495ae853SAndroid Build Coastguard Worker else
477*495ae853SAndroid Build Coastguard Worker {
478*495ae853SAndroid Build Coastguard Worker /* Storing colocated zero information */
479*495ae853SAndroid Build Coastguard Worker if(ps_mv_nmb_start)
480*495ae853SAndroid Build Coastguard Worker {
481*495ae853SAndroid Build Coastguard Worker ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0, (UWORD8) (u1_field << 1),
482*495ae853SAndroid Build Coastguard Worker 4, 4);
483*495ae853SAndroid Build Coastguard Worker }
484*495ae853SAndroid Build Coastguard Worker else
485*495ae853SAndroid Build Coastguard Worker {
486*495ae853SAndroid Build Coastguard Worker return NOT_OK;
487*495ae853SAndroid Build Coastguard Worker }
488*495ae853SAndroid Build Coastguard Worker }
489*495ae853SAndroid Build Coastguard Worker }
490*495ae853SAndroid Build Coastguard Worker
491*495ae853SAndroid Build Coastguard Worker return OK;
492*495ae853SAndroid Build Coastguard Worker }
493*495ae853SAndroid Build Coastguard Worker /*!
494*495ae853SAndroid Build Coastguard Worker **************************************************************************
495*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_update_intra_mb_inter_layer_info \endif
496*495ae853SAndroid Build Coastguard Worker *
497*495ae853SAndroid Build Coastguard Worker * \brief : IT
498*495ae853SAndroid Build Coastguard Worker * This function decodes an Inter MB fornfor ot target base layers
499*495ae853SAndroid Build Coastguard Worker * Only for Progressive : saves residual for upper enhancement layers
500*495ae853SAndroid Build Coastguard Worker *
501*495ae853SAndroid Build Coastguard Worker * \return
502*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
503*495ae853SAndroid Build Coastguard Worker **************************************************************************
504*495ae853SAndroid Build Coastguard Worker */
isvcd_update_intra_mb_inter_layer_info(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info)505*495ae853SAndroid Build Coastguard Worker void isvcd_update_intra_mb_inter_layer_info(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
506*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_cur_mb_info)
507*495ae853SAndroid Build Coastguard Worker {
508*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
509*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
510*495ae853SAndroid Build Coastguard Worker (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
511*495ae853SAndroid Build Coastguard Worker
512*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode = SVC_INTRA_MB;
513*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size = ps_cur_mb_info->u1_tran_form8x8;
514*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = 0;
515*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz = 0;
516*495ae853SAndroid Build Coastguard Worker }
517*495ae853SAndroid Build Coastguard Worker
518*495ae853SAndroid Build Coastguard Worker /*!
519*495ae853SAndroid Build Coastguard Worker **************************************************************************
520*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_update_ipcm_mb_inter_layer_info \endif
521*495ae853SAndroid Build Coastguard Worker *
522*495ae853SAndroid Build Coastguard Worker * \brief : IT
523*495ae853SAndroid Build Coastguard Worker * This function decodes an IPM MB fornfor ot target base layers
524*495ae853SAndroid Build Coastguard Worker * Only for Progressive : saves residual for upper enhancement layers
525*495ae853SAndroid Build Coastguard Worker *
526*495ae853SAndroid Build Coastguard Worker * \return
527*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
528*495ae853SAndroid Build Coastguard Worker **************************************************************************
529*495ae853SAndroid Build Coastguard Worker */
isvcd_update_ipcm_mb_inter_layer_info(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info)530*495ae853SAndroid Build Coastguard Worker void isvcd_update_ipcm_mb_inter_layer_info(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
531*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_cur_mb_info)
532*495ae853SAndroid Build Coastguard Worker {
533*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode = SVC_IPCM_MB;
534*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size = ps_cur_mb_info->u1_tran_form8x8;
535*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = 0;
536*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz = 0;
537*495ae853SAndroid Build Coastguard Worker }
538*495ae853SAndroid Build Coastguard Worker
539*495ae853SAndroid Build Coastguard Worker /*!
540*495ae853SAndroid Build Coastguard Worker **************************************************************************
541*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_update_ibl_mb_inter_layer_info \endif
542*495ae853SAndroid Build Coastguard Worker *
543*495ae853SAndroid Build Coastguard Worker * \brief : IT
544*495ae853SAndroid Build Coastguard Worker * This function decodes an IBL MB fornfor ot target base layers
545*495ae853SAndroid Build Coastguard Worker * Only for Progressive : saves residual for upper enhancement layers
546*495ae853SAndroid Build Coastguard Worker *
547*495ae853SAndroid Build Coastguard Worker * \return
548*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
549*495ae853SAndroid Build Coastguard Worker **************************************************************************
550*495ae853SAndroid Build Coastguard Worker */
isvcd_update_ibl_mb_inter_layer_info(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info)551*495ae853SAndroid Build Coastguard Worker void isvcd_update_ibl_mb_inter_layer_info(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
552*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_cur_mb_info)
553*495ae853SAndroid Build Coastguard Worker {
554*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode = SVC_IBL_MB;
555*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size = ps_cur_mb_info->u1_tran_form8x8;
556*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = 0;
557*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz = 0;
558*495ae853SAndroid Build Coastguard Worker }
559*495ae853SAndroid Build Coastguard Worker /*!
560*495ae853SAndroid Build Coastguard Worker **************************************************************************
561*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_update_inter_mb_inter_layer_info \endif
562*495ae853SAndroid Build Coastguard Worker *
563*495ae853SAndroid Build Coastguard Worker * \brief : IT
564*495ae853SAndroid Build Coastguard Worker * This function decodes an IBL MB fornfor ot target base layers
565*495ae853SAndroid Build Coastguard Worker * Only for Progressive : saves residual for upper enhancement layers
566*495ae853SAndroid Build Coastguard Worker *
567*495ae853SAndroid Build Coastguard Worker * \return
568*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
569*495ae853SAndroid Build Coastguard Worker **************************************************************************
570*495ae853SAndroid Build Coastguard Worker */
isvcd_update_inter_mb_inter_layer_info(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_inference_mode)571*495ae853SAndroid Build Coastguard Worker void isvcd_update_inter_mb_inter_layer_info(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
572*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_cur_mb_info, UWORD8 u1_inference_mode)
573*495ae853SAndroid Build Coastguard Worker {
574*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
575*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
576*495ae853SAndroid Build Coastguard Worker (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
577*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode =
578*495ae853SAndroid Build Coastguard Worker u1_inference_mode ? SVC_IBL_MB : SVC_INTER_MB;
579*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size = ps_cur_mb_info->u1_tran_form8x8;
580*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = ps_cur_mb_info->u2_luma_csbp;
581*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz =
582*495ae853SAndroid Build Coastguard Worker (UWORD8) ps_cur_mb_info->u2_chroma_csbp;
583*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 1))
584*495ae853SAndroid Build Coastguard Worker {
585*495ae853SAndroid Build Coastguard Worker /* Four bits for Cb in DC only cbp */
586*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz |= 0x0F;
587*495ae853SAndroid Build Coastguard Worker }
588*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 2))
589*495ae853SAndroid Build Coastguard Worker {
590*495ae853SAndroid Build Coastguard Worker /* Four bits for Cr in DC only cbp */
591*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz |= 0xF0;
592*495ae853SAndroid Build Coastguard Worker }
593*495ae853SAndroid Build Coastguard Worker }
594*495ae853SAndroid Build Coastguard Worker /*!
595*495ae853SAndroid Build Coastguard Worker **************************************************************************
596*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_process_inter_mb_no_rsd_pred_non_target \endif
597*495ae853SAndroid Build Coastguard Worker *
598*495ae853SAndroid Build Coastguard Worker * \brief : IT
599*495ae853SAndroid Build Coastguard Worker * This function decodes an Inter MB fornfor ot target base layers
600*495ae853SAndroid Build Coastguard Worker * Only for Progressive : saves residual for upper enhancement layers
601*495ae853SAndroid Build Coastguard Worker *
602*495ae853SAndroid Build Coastguard Worker * \return
603*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
604*495ae853SAndroid Build Coastguard Worker **************************************************************************
605*495ae853SAndroid Build Coastguard Worker */
isvcd_process_inter_mb_no_rsd_pred_non_target(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_inference_mode)606*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_process_inter_mb_no_rsd_pred_non_target(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
607*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_cur_mb_info,
608*495ae853SAndroid Build Coastguard Worker UWORD8 u1_inference_mode)
609*495ae853SAndroid Build Coastguard Worker {
610*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
611*495ae853SAndroid Build Coastguard Worker UWORD16 u2_luma_stride, u2_chroma_stride;
612*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_y_coeff, *pi2_luma_res_ptr, *pi2_chroma_res_ptr;
613*495ae853SAndroid Build Coastguard Worker UWORD32 u4_luma_dc_only_csbp = 0;
614*495ae853SAndroid Build Coastguard Worker UWORD32 u4_luma_dc_only_cbp = 0;
615*495ae853SAndroid Build Coastguard Worker
616*495ae853SAndroid Build Coastguard Worker if(0 != ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
617*495ae853SAndroid Build Coastguard Worker {
618*495ae853SAndroid Build Coastguard Worker return NOT_OK;
619*495ae853SAndroid Build Coastguard Worker }
620*495ae853SAndroid Build Coastguard Worker u2_luma_stride = ps_svc_lyr_dec->u2_residual_resample_luma_stride;
621*495ae853SAndroid Build Coastguard Worker pi2_luma_res_ptr = ps_svc_lyr_dec->pi2_il_residual_resample_mb_luma_frm_start +
622*495ae853SAndroid Build Coastguard Worker (ps_cur_mb_info->u2_mbx << 4) +
623*495ae853SAndroid Build Coastguard Worker ((ps_cur_mb_info->u2_mby << 4) * u2_luma_stride);
624*495ae853SAndroid Build Coastguard Worker
625*495ae853SAndroid Build Coastguard Worker u2_chroma_stride = ps_svc_lyr_dec->u2_residual_resample_chroma_stride;
626*495ae853SAndroid Build Coastguard Worker pi2_chroma_res_ptr = ps_svc_lyr_dec->pi2_il_residual_resample_mb_chroma_frm_start +
627*495ae853SAndroid Build Coastguard Worker (ps_cur_mb_info->u2_mbx << 4) +
628*495ae853SAndroid Build Coastguard Worker ((ps_cur_mb_info->u2_mby << 3) * u2_chroma_stride);
629*495ae853SAndroid Build Coastguard Worker
630*495ae853SAndroid Build Coastguard Worker if(!ps_cur_mb_info->u1_tran_form8x8)
631*495ae853SAndroid Build Coastguard Worker {
632*495ae853SAndroid Build Coastguard Worker u4_luma_dc_only_csbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec, ps_cur_mb_info, 0);
633*495ae853SAndroid Build Coastguard Worker }
634*495ae853SAndroid Build Coastguard Worker else
635*495ae853SAndroid Build Coastguard Worker {
636*495ae853SAndroid Build Coastguard Worker if(!ps_dec->ps_cur_pps->u1_entropy_coding_mode)
637*495ae853SAndroid Build Coastguard Worker {
638*495ae853SAndroid Build Coastguard Worker u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec, ps_cur_mb_info, 0);
639*495ae853SAndroid Build Coastguard Worker }
640*495ae853SAndroid Build Coastguard Worker else
641*495ae853SAndroid Build Coastguard Worker {
642*495ae853SAndroid Build Coastguard Worker u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff8x8_mb(ps_dec, ps_cur_mb_info);
643*495ae853SAndroid Build Coastguard Worker }
644*495ae853SAndroid Build Coastguard Worker }
645*495ae853SAndroid Build Coastguard Worker
646*495ae853SAndroid Build Coastguard Worker pi2_y_coeff = ps_dec->pi2_coeff_data;
647*495ae853SAndroid Build Coastguard Worker /* Inverse Transform and Reconstruction */
648*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_cbp & 0x0f)
649*495ae853SAndroid Build Coastguard Worker {
650*495ae853SAndroid Build Coastguard Worker if(!ps_cur_mb_info->u1_tran_form8x8)
651*495ae853SAndroid Build Coastguard Worker {
652*495ae853SAndroid Build Coastguard Worker UWORD32 i;
653*495ae853SAndroid Build Coastguard Worker WORD16 ai2_tmp[16] = {0};
654*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 16; i++)
655*495ae853SAndroid Build Coastguard Worker {
656*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(ps_cur_mb_info->u2_luma_csbp, i))
657*495ae853SAndroid Build Coastguard Worker {
658*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_level = pi2_y_coeff + (i << 4);
659*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_luma_res_ptr + ((i & 0x3) * BLK_SIZE) +
660*495ae853SAndroid Build Coastguard Worker (i >> 2) * (u2_luma_stride << 2);
661*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_IQ_IT_RECON()
662*495ae853SAndroid Build Coastguard Worker {
663*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(u4_luma_dc_only_csbp, i))
664*495ae853SAndroid Build Coastguard Worker {
665*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_luma_4x4_dc(
666*495ae853SAndroid Build Coastguard Worker pi2_level, pi2_out, u2_luma_stride,
667*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
668*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[3],
669*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0, NULL);
670*495ae853SAndroid Build Coastguard Worker }
671*495ae853SAndroid Build Coastguard Worker else
672*495ae853SAndroid Build Coastguard Worker {
673*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_luma_4x4(
674*495ae853SAndroid Build Coastguard Worker pi2_level, pi2_out, u2_luma_stride,
675*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
676*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[3],
677*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0, NULL);
678*495ae853SAndroid Build Coastguard Worker }
679*495ae853SAndroid Build Coastguard Worker }
680*495ae853SAndroid Build Coastguard Worker }
681*495ae853SAndroid Build Coastguard Worker }
682*495ae853SAndroid Build Coastguard Worker }
683*495ae853SAndroid Build Coastguard Worker else
684*495ae853SAndroid Build Coastguard Worker {
685*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_scale_matrix_ptr;
686*495ae853SAndroid Build Coastguard Worker WORD32 i;
687*495ae853SAndroid Build Coastguard Worker
688*495ae853SAndroid Build Coastguard Worker pi2_scale_matrix_ptr = ps_dec->s_high_profile.i2_scalinglist8x8[1];
689*495ae853SAndroid Build Coastguard Worker
690*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++)
691*495ae853SAndroid Build Coastguard Worker {
692*495ae853SAndroid Build Coastguard Worker WORD16 ai2_tmp[64] = {0};
693*495ae853SAndroid Build Coastguard Worker WORD16 *pi16_levelBlock =
694*495ae853SAndroid Build Coastguard Worker pi2_y_coeff + (i << 6); /* move to the next 8x8 adding 64 */
695*495ae853SAndroid Build Coastguard Worker
696*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out =
697*495ae853SAndroid Build Coastguard Worker pi2_luma_res_ptr + ((i & 0x1) * BLK8x8SIZE) + (i >> 1) * (u2_luma_stride << 3);
698*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(ps_cur_mb_info->u1_cbp, i))
699*495ae853SAndroid Build Coastguard Worker {
700*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_IQ_IT_RECON()
701*495ae853SAndroid Build Coastguard Worker {
702*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(u4_luma_dc_only_cbp, i))
703*495ae853SAndroid Build Coastguard Worker {
704*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_luma_8x8_dc(
705*495ae853SAndroid Build Coastguard Worker pi16_levelBlock, pi2_out, u2_luma_stride,
706*495ae853SAndroid Build Coastguard Worker gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
707*495ae853SAndroid Build Coastguard Worker (UWORD16 *) pi2_scale_matrix_ptr, ps_cur_mb_info->u1_qp_div6,
708*495ae853SAndroid Build Coastguard Worker ai2_tmp, 0, NULL);
709*495ae853SAndroid Build Coastguard Worker }
710*495ae853SAndroid Build Coastguard Worker else
711*495ae853SAndroid Build Coastguard Worker {
712*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_luma_8x8(
713*495ae853SAndroid Build Coastguard Worker pi16_levelBlock, pi2_out, u2_luma_stride,
714*495ae853SAndroid Build Coastguard Worker gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
715*495ae853SAndroid Build Coastguard Worker (UWORD16 *) pi2_scale_matrix_ptr, ps_cur_mb_info->u1_qp_div6,
716*495ae853SAndroid Build Coastguard Worker ai2_tmp, 0, NULL);
717*495ae853SAndroid Build Coastguard Worker }
718*495ae853SAndroid Build Coastguard Worker }
719*495ae853SAndroid Build Coastguard Worker }
720*495ae853SAndroid Build Coastguard Worker }
721*495ae853SAndroid Build Coastguard Worker }
722*495ae853SAndroid Build Coastguard Worker }
723*495ae853SAndroid Build Coastguard Worker
724*495ae853SAndroid Build Coastguard Worker /* Decode Chroma Block */
725*495ae853SAndroid Build Coastguard Worker ih264d_unpack_chroma_coeff4x4_mb(ps_dec, ps_cur_mb_info);
726*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
727*495ae853SAndroid Build Coastguard Worker /* Chroma Blocks decoding */
728*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
729*495ae853SAndroid Build Coastguard Worker {
730*495ae853SAndroid Build Coastguard Worker UWORD8 u1_chroma_cbp = (UWORD8) (ps_cur_mb_info->u1_cbp >> 4);
731*495ae853SAndroid Build Coastguard Worker
732*495ae853SAndroid Build Coastguard Worker if(u1_chroma_cbp != CBPC_ALLZERO)
733*495ae853SAndroid Build Coastguard Worker {
734*495ae853SAndroid Build Coastguard Worker UWORD32 u4_scale_u = ps_cur_mb_info->u1_qpc_div6;
735*495ae853SAndroid Build Coastguard Worker UWORD32 u4_scale_v = ps_cur_mb_info->u1_qpcr_div6;
736*495ae853SAndroid Build Coastguard Worker UWORD16 u2_chroma_csbp = ps_cur_mb_info->u2_chroma_csbp;
737*495ae853SAndroid Build Coastguard Worker
738*495ae853SAndroid Build Coastguard Worker pi2_y_coeff = ps_dec->pi2_coeff_data;
739*495ae853SAndroid Build Coastguard Worker
740*495ae853SAndroid Build Coastguard Worker {
741*495ae853SAndroid Build Coastguard Worker UWORD32 i;
742*495ae853SAndroid Build Coastguard Worker WORD16 ai2_tmp[16] = {0};
743*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++)
744*495ae853SAndroid Build Coastguard Worker {
745*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_level = pi2_y_coeff + (i << 4);
746*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_chroma_res_ptr +
747*495ae853SAndroid Build Coastguard Worker ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR) +
748*495ae853SAndroid Build Coastguard Worker (i >> 1) * (u2_chroma_stride << 2);
749*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_IQ_IT_RECON()
750*495ae853SAndroid Build Coastguard Worker {
751*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(u2_chroma_csbp, i))
752*495ae853SAndroid Build Coastguard Worker {
753*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_chroma_4x4(
754*495ae853SAndroid Build Coastguard Worker pi2_level, pi2_out, u2_chroma_stride,
755*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
756*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[4], u4_scale_u,
757*495ae853SAndroid Build Coastguard Worker ai2_tmp, pi2_level);
758*495ae853SAndroid Build Coastguard Worker }
759*495ae853SAndroid Build Coastguard Worker else if(pi2_level[0] != 0)
760*495ae853SAndroid Build Coastguard Worker {
761*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_chroma_4x4_dc(
762*495ae853SAndroid Build Coastguard Worker pi2_level, pi2_out, u2_chroma_stride,
763*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
764*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[4], u4_scale_u,
765*495ae853SAndroid Build Coastguard Worker ai2_tmp, pi2_level);
766*495ae853SAndroid Build Coastguard Worker }
767*495ae853SAndroid Build Coastguard Worker }
768*495ae853SAndroid Build Coastguard Worker }
769*495ae853SAndroid Build Coastguard Worker }
770*495ae853SAndroid Build Coastguard Worker
771*495ae853SAndroid Build Coastguard Worker pi2_y_coeff += MB_CHROM_SIZE;
772*495ae853SAndroid Build Coastguard Worker u2_chroma_csbp >>= 4;
773*495ae853SAndroid Build Coastguard Worker
774*495ae853SAndroid Build Coastguard Worker {
775*495ae853SAndroid Build Coastguard Worker UWORD32 i;
776*495ae853SAndroid Build Coastguard Worker WORD16 ai2_tmp[16] = {0};
777*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++)
778*495ae853SAndroid Build Coastguard Worker {
779*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_level = pi2_y_coeff + (i << 4);
780*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_chroma_res_ptr + 1 +
781*495ae853SAndroid Build Coastguard Worker ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR) +
782*495ae853SAndroid Build Coastguard Worker (i >> 1) * (u2_chroma_stride << 2);
783*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_IQ_IT_RECON()
784*495ae853SAndroid Build Coastguard Worker {
785*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(u2_chroma_csbp, i))
786*495ae853SAndroid Build Coastguard Worker {
787*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_chroma_4x4(
788*495ae853SAndroid Build Coastguard Worker pi2_level, pi2_out, u2_chroma_stride,
789*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
790*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[5], u4_scale_v,
791*495ae853SAndroid Build Coastguard Worker ai2_tmp, pi2_level);
792*495ae853SAndroid Build Coastguard Worker }
793*495ae853SAndroid Build Coastguard Worker else if(pi2_level[0] != 0)
794*495ae853SAndroid Build Coastguard Worker {
795*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_chroma_4x4_dc(
796*495ae853SAndroid Build Coastguard Worker pi2_level, pi2_out, u2_chroma_stride,
797*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
798*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[5], u4_scale_v,
799*495ae853SAndroid Build Coastguard Worker ai2_tmp, pi2_level);
800*495ae853SAndroid Build Coastguard Worker }
801*495ae853SAndroid Build Coastguard Worker }
802*495ae853SAndroid Build Coastguard Worker }
803*495ae853SAndroid Build Coastguard Worker }
804*495ae853SAndroid Build Coastguard Worker }
805*495ae853SAndroid Build Coastguard Worker }
806*495ae853SAndroid Build Coastguard Worker
807*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
808*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
809*495ae853SAndroid Build Coastguard Worker (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
810*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode =
811*495ae853SAndroid Build Coastguard Worker u1_inference_mode ? SVC_IBL_MB : SVC_INTER_MB;
812*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size = ps_cur_mb_info->u1_tran_form8x8;
813*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = ps_cur_mb_info->u2_luma_csbp;
814*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz =
815*495ae853SAndroid Build Coastguard Worker (UWORD8) ps_cur_mb_info->u2_chroma_csbp;
816*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 1))
817*495ae853SAndroid Build Coastguard Worker {
818*495ae853SAndroid Build Coastguard Worker /* Four bits for Cb in DC only cbp */
819*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz |= 0x0F;
820*495ae853SAndroid Build Coastguard Worker }
821*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 2))
822*495ae853SAndroid Build Coastguard Worker {
823*495ae853SAndroid Build Coastguard Worker /* Four bits for Cr in DC only cbp */
824*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz |= 0xF0;
825*495ae853SAndroid Build Coastguard Worker }
826*495ae853SAndroid Build Coastguard Worker return OK;
827*495ae853SAndroid Build Coastguard Worker }
828*495ae853SAndroid Build Coastguard Worker
829*495ae853SAndroid Build Coastguard Worker /*!
830*495ae853SAndroid Build Coastguard Worker **************************************************************************
831*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_process_inter_mb_rsd_pred_non_target \endif
832*495ae853SAndroid Build Coastguard Worker *
833*495ae853SAndroid Build Coastguard Worker * \brief : IT + Residual :
834*495ae853SAndroid Build Coastguard Worker * This function decodes an Inter MB for non target layers
835*495ae853SAndroid Build Coastguard Worker * Only for Progressive : saves residual + IT for upper enhancement layers
836*495ae853SAndroid Build Coastguard Worker *
837*495ae853SAndroid Build Coastguard Worker * \return
838*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
839*495ae853SAndroid Build Coastguard Worker **************************************************************************
840*495ae853SAndroid Build Coastguard Worker */
isvcd_process_inter_mb_rsd_pred_non_target(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_inference_mode,UWORD16 * pu2_res_luma_csbp)841*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_process_inter_mb_rsd_pred_non_target(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
842*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_cur_mb_info,
843*495ae853SAndroid Build Coastguard Worker UWORD8 u1_inference_mode,
844*495ae853SAndroid Build Coastguard Worker UWORD16 *pu2_res_luma_csbp)
845*495ae853SAndroid Build Coastguard Worker {
846*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
847*495ae853SAndroid Build Coastguard Worker UWORD16 u2_luma_stride, u2_chroma_stride;
848*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_y_coeff, *pi2_luma_res_ptr, *pi2_chroma_res_ptr;
849*495ae853SAndroid Build Coastguard Worker UWORD32 u4_luma_dc_only_csbp = 0;
850*495ae853SAndroid Build Coastguard Worker UWORD32 u4_luma_dc_only_cbp = 0;
851*495ae853SAndroid Build Coastguard Worker UWORD16 u2_res_luma_csbp = 0;
852*495ae853SAndroid Build Coastguard Worker UWORD16 u2_res_chroma_csbp = 0, u2_res_chroma_nnz = 0;
853*495ae853SAndroid Build Coastguard Worker WORD32 ret;
854*495ae853SAndroid Build Coastguard Worker
855*495ae853SAndroid Build Coastguard Worker if(0 != ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
856*495ae853SAndroid Build Coastguard Worker {
857*495ae853SAndroid Build Coastguard Worker return NOT_OK;
858*495ae853SAndroid Build Coastguard Worker }
859*495ae853SAndroid Build Coastguard Worker u2_luma_stride = ps_svc_lyr_dec->u2_residual_resample_luma_stride;
860*495ae853SAndroid Build Coastguard Worker pi2_luma_res_ptr = ps_svc_lyr_dec->pi2_il_residual_resample_mb_luma_frm_start +
861*495ae853SAndroid Build Coastguard Worker (ps_cur_mb_info->u2_mbx << 4) +
862*495ae853SAndroid Build Coastguard Worker ((ps_cur_mb_info->u2_mby << 4) * u2_luma_stride);
863*495ae853SAndroid Build Coastguard Worker
864*495ae853SAndroid Build Coastguard Worker u2_chroma_stride = ps_svc_lyr_dec->u2_residual_resample_chroma_stride;
865*495ae853SAndroid Build Coastguard Worker pi2_chroma_res_ptr = ps_svc_lyr_dec->pi2_il_residual_resample_mb_chroma_frm_start +
866*495ae853SAndroid Build Coastguard Worker (ps_cur_mb_info->u2_mbx << 4) +
867*495ae853SAndroid Build Coastguard Worker ((ps_cur_mb_info->u2_mby << 3) * u2_chroma_stride);
868*495ae853SAndroid Build Coastguard Worker
869*495ae853SAndroid Build Coastguard Worker // residual prediction SVC
870*495ae853SAndroid Build Coastguard Worker ret = isvcd_process_residual_resample_mb(ps_svc_lyr_dec, ps_cur_mb_info);
871*495ae853SAndroid Build Coastguard Worker if(ret != OK)
872*495ae853SAndroid Build Coastguard Worker {
873*495ae853SAndroid Build Coastguard Worker return ret;
874*495ae853SAndroid Build Coastguard Worker }
875*495ae853SAndroid Build Coastguard Worker
876*495ae853SAndroid Build Coastguard Worker if(!ps_cur_mb_info->u1_tran_form8x8)
877*495ae853SAndroid Build Coastguard Worker {
878*495ae853SAndroid Build Coastguard Worker u4_luma_dc_only_csbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec, ps_cur_mb_info, 0);
879*495ae853SAndroid Build Coastguard Worker }
880*495ae853SAndroid Build Coastguard Worker else
881*495ae853SAndroid Build Coastguard Worker {
882*495ae853SAndroid Build Coastguard Worker if(!ps_dec->ps_cur_pps->u1_entropy_coding_mode)
883*495ae853SAndroid Build Coastguard Worker {
884*495ae853SAndroid Build Coastguard Worker u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec, ps_cur_mb_info, 0);
885*495ae853SAndroid Build Coastguard Worker }
886*495ae853SAndroid Build Coastguard Worker else
887*495ae853SAndroid Build Coastguard Worker {
888*495ae853SAndroid Build Coastguard Worker u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff8x8_mb(ps_dec, ps_cur_mb_info);
889*495ae853SAndroid Build Coastguard Worker }
890*495ae853SAndroid Build Coastguard Worker }
891*495ae853SAndroid Build Coastguard Worker
892*495ae853SAndroid Build Coastguard Worker *pu2_res_luma_csbp = 0;
893*495ae853SAndroid Build Coastguard Worker pi2_y_coeff = ps_dec->pi2_coeff_data;
894*495ae853SAndroid Build Coastguard Worker /* Inverse Transform and Reconstruction */
895*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_cbp & 0x0f)
896*495ae853SAndroid Build Coastguard Worker {
897*495ae853SAndroid Build Coastguard Worker if(!ps_cur_mb_info->u1_tran_form8x8)
898*495ae853SAndroid Build Coastguard Worker {
899*495ae853SAndroid Build Coastguard Worker UWORD32 i;
900*495ae853SAndroid Build Coastguard Worker WORD16 ai2_tmp[16] = {0};
901*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 16; i++)
902*495ae853SAndroid Build Coastguard Worker {
903*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(ps_cur_mb_info->u2_luma_csbp, i))
904*495ae853SAndroid Build Coastguard Worker {
905*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_level = pi2_y_coeff + (i << 4);
906*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_luma_res_ptr + ((i & 0x3) * BLK_SIZE) +
907*495ae853SAndroid Build Coastguard Worker (i >> 2) * (u2_luma_stride << 2);
908*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_IQ_IT_RECON()
909*495ae853SAndroid Build Coastguard Worker {
910*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(u4_luma_dc_only_csbp, i))
911*495ae853SAndroid Build Coastguard Worker {
912*495ae853SAndroid Build Coastguard Worker u2_res_luma_csbp =
913*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_residual_luma_4x4_dc(
914*495ae853SAndroid Build Coastguard Worker pi2_level, pi2_out, pi2_out, u2_luma_stride, u2_luma_stride,
915*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
916*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[3],
917*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0, NULL);
918*495ae853SAndroid Build Coastguard Worker }
919*495ae853SAndroid Build Coastguard Worker else
920*495ae853SAndroid Build Coastguard Worker {
921*495ae853SAndroid Build Coastguard Worker u2_res_luma_csbp = ps_svc_lyr_dec->pf_iquant_itrans_residual_luma_4x4(
922*495ae853SAndroid Build Coastguard Worker pi2_level, pi2_out, pi2_out, u2_luma_stride, u2_luma_stride,
923*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
924*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[3],
925*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0, NULL);
926*495ae853SAndroid Build Coastguard Worker }
927*495ae853SAndroid Build Coastguard Worker }
928*495ae853SAndroid Build Coastguard Worker }
929*495ae853SAndroid Build Coastguard Worker else
930*495ae853SAndroid Build Coastguard Worker {
931*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_luma_res_ptr + ((i & 0x3) * BLK_SIZE) +
932*495ae853SAndroid Build Coastguard Worker (i >> 2) * (u2_luma_stride << 2);
933*495ae853SAndroid Build Coastguard Worker
934*495ae853SAndroid Build Coastguard Worker u2_res_luma_csbp =
935*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_residual_luma_4x4(pi2_out, u2_luma_stride);
936*495ae853SAndroid Build Coastguard Worker }
937*495ae853SAndroid Build Coastguard Worker *pu2_res_luma_csbp |= (u2_res_luma_csbp << i);
938*495ae853SAndroid Build Coastguard Worker }
939*495ae853SAndroid Build Coastguard Worker }
940*495ae853SAndroid Build Coastguard Worker else
941*495ae853SAndroid Build Coastguard Worker {
942*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_scale_matrix_ptr;
943*495ae853SAndroid Build Coastguard Worker WORD32 i;
944*495ae853SAndroid Build Coastguard Worker
945*495ae853SAndroid Build Coastguard Worker pi2_scale_matrix_ptr = ps_dec->s_high_profile.i2_scalinglist8x8[1];
946*495ae853SAndroid Build Coastguard Worker
947*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++)
948*495ae853SAndroid Build Coastguard Worker {
949*495ae853SAndroid Build Coastguard Worker WORD16 ai2_tmp[64] = {0};
950*495ae853SAndroid Build Coastguard Worker WORD16 *pi16_levelBlock =
951*495ae853SAndroid Build Coastguard Worker pi2_y_coeff + (i << 6); /* move to the next 8x8 adding 64 */
952*495ae853SAndroid Build Coastguard Worker
953*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out =
954*495ae853SAndroid Build Coastguard Worker pi2_luma_res_ptr + ((i & 0x1) * BLK8x8SIZE) + (i >> 1) * (u2_luma_stride << 3);
955*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(ps_cur_mb_info->u1_cbp, i))
956*495ae853SAndroid Build Coastguard Worker {
957*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_IQ_IT_RECON()
958*495ae853SAndroid Build Coastguard Worker {
959*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(u4_luma_dc_only_cbp, i))
960*495ae853SAndroid Build Coastguard Worker {
961*495ae853SAndroid Build Coastguard Worker u2_res_luma_csbp =
962*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_residual_luma_8x8_dc(
963*495ae853SAndroid Build Coastguard Worker pi16_levelBlock, pi2_out, pi2_out, u2_luma_stride,
964*495ae853SAndroid Build Coastguard Worker u2_luma_stride,
965*495ae853SAndroid Build Coastguard Worker gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
966*495ae853SAndroid Build Coastguard Worker (UWORD16 *) pi2_scale_matrix_ptr, ps_cur_mb_info->u1_qp_div6,
967*495ae853SAndroid Build Coastguard Worker ai2_tmp, 0, NULL);
968*495ae853SAndroid Build Coastguard Worker }
969*495ae853SAndroid Build Coastguard Worker else
970*495ae853SAndroid Build Coastguard Worker {
971*495ae853SAndroid Build Coastguard Worker u2_res_luma_csbp = ps_svc_lyr_dec->pf_iquant_itrans_residual_luma_8x8(
972*495ae853SAndroid Build Coastguard Worker pi16_levelBlock, pi2_out, pi2_out, u2_luma_stride, u2_luma_stride,
973*495ae853SAndroid Build Coastguard Worker gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
974*495ae853SAndroid Build Coastguard Worker (UWORD16 *) pi2_scale_matrix_ptr, ps_cur_mb_info->u1_qp_div6,
975*495ae853SAndroid Build Coastguard Worker ai2_tmp, 0, NULL);
976*495ae853SAndroid Build Coastguard Worker }
977*495ae853SAndroid Build Coastguard Worker }
978*495ae853SAndroid Build Coastguard Worker }
979*495ae853SAndroid Build Coastguard Worker else
980*495ae853SAndroid Build Coastguard Worker {
981*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_luma_res_ptr + ((i & 0x1) * BLK8x8SIZE) +
982*495ae853SAndroid Build Coastguard Worker (i >> 1) * (u2_luma_stride << 3);
983*495ae853SAndroid Build Coastguard Worker
984*495ae853SAndroid Build Coastguard Worker u2_res_luma_csbp =
985*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_residual_luma_8x8(pi2_out, u2_luma_stride);
986*495ae853SAndroid Build Coastguard Worker }
987*495ae853SAndroid Build Coastguard Worker *pu2_res_luma_csbp |= (u2_res_luma_csbp << (((i >> 1) << 3) + ((i & 0x01) << 1)));
988*495ae853SAndroid Build Coastguard Worker }
989*495ae853SAndroid Build Coastguard Worker }
990*495ae853SAndroid Build Coastguard Worker }
991*495ae853SAndroid Build Coastguard Worker else
992*495ae853SAndroid Build Coastguard Worker {
993*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_luma_res_ptr;
994*495ae853SAndroid Build Coastguard Worker
995*495ae853SAndroid Build Coastguard Worker *pu2_res_luma_csbp = ps_svc_lyr_dec->pf_residual_luma_16x16(pi2_out, u2_luma_stride);
996*495ae853SAndroid Build Coastguard Worker }
997*495ae853SAndroid Build Coastguard Worker
998*495ae853SAndroid Build Coastguard Worker /* Decode Chroma Block */
999*495ae853SAndroid Build Coastguard Worker ih264d_unpack_chroma_coeff4x4_mb(ps_dec, ps_cur_mb_info);
1000*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
1001*495ae853SAndroid Build Coastguard Worker /* Chroma Blocks decoding */
1002*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
1003*495ae853SAndroid Build Coastguard Worker {
1004*495ae853SAndroid Build Coastguard Worker UWORD8 u1_chroma_cbp = (UWORD8) (ps_cur_mb_info->u1_cbp >> 4);
1005*495ae853SAndroid Build Coastguard Worker
1006*495ae853SAndroid Build Coastguard Worker u2_res_chroma_nnz =
1007*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_residual_chroma_cb_cr_8x8(pi2_chroma_res_ptr, u2_chroma_stride);
1008*495ae853SAndroid Build Coastguard Worker
1009*495ae853SAndroid Build Coastguard Worker if(u1_chroma_cbp != CBPC_ALLZERO)
1010*495ae853SAndroid Build Coastguard Worker {
1011*495ae853SAndroid Build Coastguard Worker UWORD32 u4_scale_u = ps_cur_mb_info->u1_qpc_div6;
1012*495ae853SAndroid Build Coastguard Worker UWORD32 u4_scale_v = ps_cur_mb_info->u1_qpcr_div6;
1013*495ae853SAndroid Build Coastguard Worker UWORD16 u2_chroma_csbp = ps_cur_mb_info->u2_chroma_csbp;
1014*495ae853SAndroid Build Coastguard Worker
1015*495ae853SAndroid Build Coastguard Worker pi2_y_coeff = ps_dec->pi2_coeff_data;
1016*495ae853SAndroid Build Coastguard Worker
1017*495ae853SAndroid Build Coastguard Worker {
1018*495ae853SAndroid Build Coastguard Worker UWORD32 i;
1019*495ae853SAndroid Build Coastguard Worker WORD16 ai2_tmp[16] = {0};
1020*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++)
1021*495ae853SAndroid Build Coastguard Worker {
1022*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_level = pi2_y_coeff + (i << 4);
1023*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_chroma_res_ptr +
1024*495ae853SAndroid Build Coastguard Worker ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR) +
1025*495ae853SAndroid Build Coastguard Worker (i >> 1) * (u2_chroma_stride << 2);
1026*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_IQ_IT_RECON()
1027*495ae853SAndroid Build Coastguard Worker {
1028*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(u2_chroma_csbp, i))
1029*495ae853SAndroid Build Coastguard Worker {
1030*495ae853SAndroid Build Coastguard Worker u2_res_chroma_csbp =
1031*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_residual_chroma_4x4(
1032*495ae853SAndroid Build Coastguard Worker pi2_level, pi2_out, pi2_out, u2_chroma_stride, u2_chroma_stride,
1033*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
1034*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[4],
1035*495ae853SAndroid Build Coastguard Worker u4_scale_u, ai2_tmp, pi2_level);
1036*495ae853SAndroid Build Coastguard Worker u2_res_chroma_nnz &= (0XFF ^ (1 << i));
1037*495ae853SAndroid Build Coastguard Worker u2_res_chroma_nnz |= (u2_res_chroma_csbp << i);
1038*495ae853SAndroid Build Coastguard Worker }
1039*495ae853SAndroid Build Coastguard Worker else if(pi2_level[0] != 0)
1040*495ae853SAndroid Build Coastguard Worker {
1041*495ae853SAndroid Build Coastguard Worker u2_res_chroma_csbp =
1042*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_residual_chroma_4x4_dc(
1043*495ae853SAndroid Build Coastguard Worker pi2_level, pi2_out, pi2_out, u2_chroma_stride, u2_chroma_stride,
1044*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
1045*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[4],
1046*495ae853SAndroid Build Coastguard Worker u4_scale_u, ai2_tmp, pi2_level);
1047*495ae853SAndroid Build Coastguard Worker u2_res_chroma_nnz &= (0XFF ^ (1 << i));
1048*495ae853SAndroid Build Coastguard Worker u2_res_chroma_nnz |= (u2_res_chroma_csbp << i);
1049*495ae853SAndroid Build Coastguard Worker }
1050*495ae853SAndroid Build Coastguard Worker }
1051*495ae853SAndroid Build Coastguard Worker }
1052*495ae853SAndroid Build Coastguard Worker }
1053*495ae853SAndroid Build Coastguard Worker
1054*495ae853SAndroid Build Coastguard Worker pi2_y_coeff += MB_CHROM_SIZE;
1055*495ae853SAndroid Build Coastguard Worker u2_chroma_csbp >>= 4;
1056*495ae853SAndroid Build Coastguard Worker
1057*495ae853SAndroid Build Coastguard Worker {
1058*495ae853SAndroid Build Coastguard Worker UWORD32 i;
1059*495ae853SAndroid Build Coastguard Worker WORD16 ai2_tmp[16] = {0};
1060*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++)
1061*495ae853SAndroid Build Coastguard Worker {
1062*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_level = pi2_y_coeff + (i << 4);
1063*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_chroma_res_ptr + 1 +
1064*495ae853SAndroid Build Coastguard Worker ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR) +
1065*495ae853SAndroid Build Coastguard Worker (i >> 1) * (u2_chroma_stride << 2);
1066*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_IQ_IT_RECON()
1067*495ae853SAndroid Build Coastguard Worker {
1068*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(u2_chroma_csbp, i))
1069*495ae853SAndroid Build Coastguard Worker {
1070*495ae853SAndroid Build Coastguard Worker u2_res_chroma_csbp =
1071*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_residual_chroma_4x4(
1072*495ae853SAndroid Build Coastguard Worker pi2_level, pi2_out, pi2_out, u2_chroma_stride, u2_chroma_stride,
1073*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
1074*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[5],
1075*495ae853SAndroid Build Coastguard Worker u4_scale_v, ai2_tmp, pi2_level);
1076*495ae853SAndroid Build Coastguard Worker u2_res_chroma_nnz &= (0XFF ^ (1 << (i + 4)));
1077*495ae853SAndroid Build Coastguard Worker u2_res_chroma_nnz |= (u2_res_chroma_csbp << (i + 4));
1078*495ae853SAndroid Build Coastguard Worker }
1079*495ae853SAndroid Build Coastguard Worker else if(pi2_level[0] != 0)
1080*495ae853SAndroid Build Coastguard Worker {
1081*495ae853SAndroid Build Coastguard Worker u2_res_chroma_csbp =
1082*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_residual_chroma_4x4_dc(
1083*495ae853SAndroid Build Coastguard Worker pi2_level, pi2_out, pi2_out, u2_chroma_stride, u2_chroma_stride,
1084*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
1085*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[5],
1086*495ae853SAndroid Build Coastguard Worker u4_scale_v, ai2_tmp, pi2_level);
1087*495ae853SAndroid Build Coastguard Worker u2_res_chroma_nnz &= (0XFF ^ (1 << (i + 4)));
1088*495ae853SAndroid Build Coastguard Worker u2_res_chroma_nnz |= (u2_res_chroma_csbp << (i + 4));
1089*495ae853SAndroid Build Coastguard Worker }
1090*495ae853SAndroid Build Coastguard Worker }
1091*495ae853SAndroid Build Coastguard Worker }
1092*495ae853SAndroid Build Coastguard Worker }
1093*495ae853SAndroid Build Coastguard Worker }
1094*495ae853SAndroid Build Coastguard Worker }
1095*495ae853SAndroid Build Coastguard Worker
1096*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
1097*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
1098*495ae853SAndroid Build Coastguard Worker (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
1099*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode =
1100*495ae853SAndroid Build Coastguard Worker u1_inference_mode ? SVC_IBL_MB : SVC_INTER_MB;
1101*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size = ps_cur_mb_info->u1_tran_form8x8;
1102*495ae853SAndroid Build Coastguard Worker
1103*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = *pu2_res_luma_csbp;
1104*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz = (UWORD8) u2_res_chroma_nnz;
1105*495ae853SAndroid Build Coastguard Worker return OK;
1106*495ae853SAndroid Build Coastguard Worker }
1107*495ae853SAndroid Build Coastguard Worker /*!
1108*495ae853SAndroid Build Coastguard Worker **************************************************************************
1109*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_process_ii_mb \endif
1110*495ae853SAndroid Build Coastguard Worker *
1111*495ae853SAndroid Build Coastguard Worker * \brief
1112*495ae853SAndroid Build Coastguard Worker * This function decodes an intra inter mb
1113*495ae853SAndroid Build Coastguard Worker *
1114*495ae853SAndroid Build Coastguard Worker * \return
1115*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
1116*495ae853SAndroid Build Coastguard Worker **************************************************************************
1117*495ae853SAndroid Build Coastguard Worker */
isvcd_process_ii_mb(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info,dec_svc_mb_info_t * ps_svc_cur_mb_info,UWORD8 u1_mb_num)1118*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_process_ii_mb(svc_dec_lyr_struct_t *ps_svc_lyr_dec, dec_mb_info_t *ps_cur_mb_info,
1119*495ae853SAndroid Build Coastguard Worker dec_svc_mb_info_t *ps_svc_cur_mb_info, UWORD8 u1_mb_num)
1120*495ae853SAndroid Build Coastguard Worker {
1121*495ae853SAndroid Build Coastguard Worker res_prms_t *ps_res_prms;
1122*495ae853SAndroid Build Coastguard Worker WORD32 i4_status;
1123*495ae853SAndroid Build Coastguard Worker UWORD8 u1_ii_mb_mode = 0;
1124*495ae853SAndroid Build Coastguard Worker mb_coord_t s_mb_coord = {0};
1125*495ae853SAndroid Build Coastguard Worker mem_element_t s_ref_mb_mode = {0};
1126*495ae853SAndroid Build Coastguard Worker svc_dec_lyr_struct_t *ps_svc_dec_ref_layer;
1127*495ae853SAndroid Build Coastguard Worker
1128*495ae853SAndroid Build Coastguard Worker ps_svc_dec_ref_layer = ps_svc_lyr_dec->ps_dec_svc_ref_layer;
1129*495ae853SAndroid Build Coastguard Worker ps_res_prms = &ps_svc_lyr_dec->s_res_prms;
1130*495ae853SAndroid Build Coastguard Worker s_mb_coord.u2_mb_x = ps_cur_mb_info->u2_mbx;
1131*495ae853SAndroid Build Coastguard Worker s_mb_coord.u2_mb_y = ps_cur_mb_info->u2_mby;
1132*495ae853SAndroid Build Coastguard Worker
1133*495ae853SAndroid Build Coastguard Worker /* Restricted resolution change has significance only */
1134*495ae853SAndroid Build Coastguard Worker /* at resolution change layer */
1135*495ae853SAndroid Build Coastguard Worker if(SVCD_FALSE == ps_res_prms->u1_rstrct_res_change_flag)
1136*495ae853SAndroid Build Coastguard Worker {
1137*495ae853SAndroid Build Coastguard Worker s_ref_mb_mode.pv_buffer = ps_svc_dec_ref_layer->ps_inter_lyr_mb_prms_frm_start;
1138*495ae853SAndroid Build Coastguard Worker s_ref_mb_mode.i4_element_size = sizeof(inter_lyr_mb_prms_t);
1139*495ae853SAndroid Build Coastguard Worker s_ref_mb_mode.i4_num_element_stride = ps_svc_dec_ref_layer->u2_inter_lyr_mb_prms_stride;
1140*495ae853SAndroid Build Coastguard Worker
1141*495ae853SAndroid Build Coastguard Worker i4_status = isvcd_ii_pred_compute_flags_mb(ps_svc_lyr_dec->pv_ii_pred_ctxt, &s_ref_mb_mode,
1142*495ae853SAndroid Build Coastguard Worker &s_mb_coord, ps_cur_mb_info, ps_svc_cur_mb_info,
1143*495ae853SAndroid Build Coastguard Worker &u1_ii_mb_mode);
1144*495ae853SAndroid Build Coastguard Worker
1145*495ae853SAndroid Build Coastguard Worker if(OK != i4_status)
1146*495ae853SAndroid Build Coastguard Worker {
1147*495ae853SAndroid Build Coastguard Worker return i4_status;
1148*495ae853SAndroid Build Coastguard Worker }
1149*495ae853SAndroid Build Coastguard Worker }
1150*495ae853SAndroid Build Coastguard Worker
1151*495ae853SAndroid Build Coastguard Worker if(SVC_INTRA_INTER_MB == u1_ii_mb_mode)
1152*495ae853SAndroid Build Coastguard Worker {
1153*495ae853SAndroid Build Coastguard Worker i4_status = isvcd_process_ibl_mb(ps_svc_lyr_dec, ps_cur_mb_info, u1_mb_num, 1);
1154*495ae853SAndroid Build Coastguard Worker if(OK != i4_status)
1155*495ae853SAndroid Build Coastguard Worker {
1156*495ae853SAndroid Build Coastguard Worker return i4_status;
1157*495ae853SAndroid Build Coastguard Worker }
1158*495ae853SAndroid Build Coastguard Worker isvcd_ii_pred_mb(ps_svc_lyr_dec, ps_cur_mb_info);
1159*495ae853SAndroid Build Coastguard Worker }
1160*495ae853SAndroid Build Coastguard Worker return OK;
1161*495ae853SAndroid Build Coastguard Worker }
1162*495ae853SAndroid Build Coastguard Worker /*!
1163*495ae853SAndroid Build Coastguard Worker **************************************************************************
1164*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_decode_recon_tfr_nmb_non_base_lyr \endif
1165*495ae853SAndroid Build Coastguard Worker *
1166*495ae853SAndroid Build Coastguard Worker * \brief
1167*495ae853SAndroid Build Coastguard Worker *
1168*495ae853SAndroid Build Coastguard Worker *
1169*495ae853SAndroid Build Coastguard Worker * \return
1170*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
1171*495ae853SAndroid Build Coastguard Worker **************************************************************************
1172*495ae853SAndroid Build Coastguard Worker */
isvcd_decode_recon_tfr_nmb_non_base_lyr(svc_dec_lyr_struct_t * ps_svc_lyr_dec,UWORD8 u1_mb_idx,UWORD8 u1_num_mbs,UWORD8 u1_num_mbs_next,UWORD8 u1_tfr_n_mb,UWORD8 u1_end_of_row)1173*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_decode_recon_tfr_nmb_non_base_lyr(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
1174*495ae853SAndroid Build Coastguard Worker UWORD8 u1_mb_idx, UWORD8 u1_num_mbs,
1175*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_mbs_next, UWORD8 u1_tfr_n_mb,
1176*495ae853SAndroid Build Coastguard Worker UWORD8 u1_end_of_row)
1177*495ae853SAndroid Build Coastguard Worker {
1178*495ae853SAndroid Build Coastguard Worker WORD32 i, j;
1179*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1180*495ae853SAndroid Build Coastguard Worker UWORD32 u1_end_of_row_next;
1181*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_cur_mb_info;
1182*495ae853SAndroid Build Coastguard Worker dec_svc_mb_info_t *ps_svc_cur_mb_info;
1183*495ae853SAndroid Build Coastguard Worker UWORD16 *pu2_res_luma_csbp;
1184*495ae853SAndroid Build Coastguard Worker const UWORD32 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
1185*495ae853SAndroid Build Coastguard Worker const UWORD32 u1_slice_type = ps_dec->ps_cur_slice->u1_slice_type;
1186*495ae853SAndroid Build Coastguard Worker const WORD32 u1_skip_th =
1187*495ae853SAndroid Build Coastguard Worker ((u1_slice_type != I_SLICE) ? (ps_dec->u1_B ? B_8x8 : PRED_8x8R0) : -1);
1188*495ae853SAndroid Build Coastguard Worker const UWORD32 u1_ipcm_th = ((u1_slice_type != I_SLICE) ? (ps_dec->u1_B ? 23 : 5) : 0);
1189*495ae853SAndroid Build Coastguard Worker WORD32 ret = OK;
1190*495ae853SAndroid Build Coastguard Worker
1191*495ae853SAndroid Build Coastguard Worker if(!((0 == ps_svc_lyr_dec->u1_base_res_flag) ||
1192*495ae853SAndroid Build Coastguard Worker ((1 == ps_svc_lyr_dec->u1_base_res_flag) &&
1193*495ae853SAndroid Build Coastguard Worker (1 == ps_svc_lyr_dec->ps_nal_svc_ext->u1_no_inter_layer_pred_flag))))
1194*495ae853SAndroid Build Coastguard Worker {
1195*495ae853SAndroid Build Coastguard Worker return NOT_OK;
1196*495ae853SAndroid Build Coastguard Worker }
1197*495ae853SAndroid Build Coastguard Worker /* N Mb MC Loop */
1198*495ae853SAndroid Build Coastguard Worker for(i = u1_mb_idx; i < u1_num_mbs; i++)
1199*495ae853SAndroid Build Coastguard Worker {
1200*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info = ps_dec->ps_nmb_info + i;
1201*495ae853SAndroid Build Coastguard Worker ps_dec->u4_dma_buf_idx = 0;
1202*495ae853SAndroid Build Coastguard Worker ps_dec->u4_pred_info_idx = 0;
1203*495ae853SAndroid Build Coastguard Worker
1204*495ae853SAndroid Build Coastguard Worker /*Pointer assignment for Residual NNZ */
1205*495ae853SAndroid Build Coastguard Worker pu2_res_luma_csbp = ps_svc_lyr_dec->pu2_frm_res_luma_csbp + ps_cur_mb_info->u2_mbx;
1206*495ae853SAndroid Build Coastguard Worker pu2_res_luma_csbp += ps_cur_mb_info->u2_mby * ps_svc_lyr_dec->i4_frm_res_luma_csbp_stride;
1207*495ae853SAndroid Build Coastguard Worker
1208*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_mb_type <= u1_skip_th)
1209*495ae853SAndroid Build Coastguard Worker {
1210*495ae853SAndroid Build Coastguard Worker {
1211*495ae853SAndroid Build Coastguard Worker WORD32 pred_cnt = 0;
1212*495ae853SAndroid Build Coastguard Worker pred_info_pkd_t *ps_pred_pkd;
1213*495ae853SAndroid Build Coastguard Worker UWORD32 u4_pred_info_pkd_idx;
1214*495ae853SAndroid Build Coastguard Worker
1215*495ae853SAndroid Build Coastguard Worker u4_pred_info_pkd_idx = ps_cur_mb_info->u4_pred_info_pkd_idx;
1216*495ae853SAndroid Build Coastguard Worker
1217*495ae853SAndroid Build Coastguard Worker while(pred_cnt < ps_cur_mb_info->u1_num_pred_parts)
1218*495ae853SAndroid Build Coastguard Worker {
1219*495ae853SAndroid Build Coastguard Worker ps_pred_pkd = ps_dec->ps_pred_pkd + u4_pred_info_pkd_idx;
1220*495ae853SAndroid Build Coastguard Worker
1221*495ae853SAndroid Build Coastguard Worker ps_dec->p_form_mb_part_info(ps_pred_pkd, ps_dec, ps_cur_mb_info->u2_mbx,
1222*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u2_mby, (i >> u1_mbaff),
1223*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info);
1224*495ae853SAndroid Build Coastguard Worker u4_pred_info_pkd_idx++;
1225*495ae853SAndroid Build Coastguard Worker pred_cnt++;
1226*495ae853SAndroid Build Coastguard Worker }
1227*495ae853SAndroid Build Coastguard Worker }
1228*495ae853SAndroid Build Coastguard Worker if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
1229*495ae853SAndroid Build Coastguard Worker {
1230*495ae853SAndroid Build Coastguard Worker ps_dec->p_motion_compensate(ps_dec, ps_cur_mb_info);
1231*495ae853SAndroid Build Coastguard Worker }
1232*495ae853SAndroid Build Coastguard Worker }
1233*495ae853SAndroid Build Coastguard Worker else if(ps_cur_mb_info->u1_mb_type == MB_SKIP)
1234*495ae853SAndroid Build Coastguard Worker {
1235*495ae853SAndroid Build Coastguard Worker {
1236*495ae853SAndroid Build Coastguard Worker WORD32 pred_cnt = 0;
1237*495ae853SAndroid Build Coastguard Worker pred_info_pkd_t *ps_pred_pkd;
1238*495ae853SAndroid Build Coastguard Worker UWORD32 u4_pred_info_pkd_idx;
1239*495ae853SAndroid Build Coastguard Worker
1240*495ae853SAndroid Build Coastguard Worker u4_pred_info_pkd_idx = ps_cur_mb_info->u4_pred_info_pkd_idx;
1241*495ae853SAndroid Build Coastguard Worker
1242*495ae853SAndroid Build Coastguard Worker while(pred_cnt < ps_cur_mb_info->u1_num_pred_parts)
1243*495ae853SAndroid Build Coastguard Worker {
1244*495ae853SAndroid Build Coastguard Worker ps_pred_pkd = ps_dec->ps_pred_pkd + u4_pred_info_pkd_idx;
1245*495ae853SAndroid Build Coastguard Worker
1246*495ae853SAndroid Build Coastguard Worker ps_dec->p_form_mb_part_info(ps_pred_pkd, ps_dec, ps_cur_mb_info->u2_mbx,
1247*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u2_mby, (i >> u1_mbaff),
1248*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info);
1249*495ae853SAndroid Build Coastguard Worker
1250*495ae853SAndroid Build Coastguard Worker u4_pred_info_pkd_idx++;
1251*495ae853SAndroid Build Coastguard Worker pred_cnt++;
1252*495ae853SAndroid Build Coastguard Worker }
1253*495ae853SAndroid Build Coastguard Worker }
1254*495ae853SAndroid Build Coastguard Worker if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
1255*495ae853SAndroid Build Coastguard Worker {
1256*495ae853SAndroid Build Coastguard Worker /* Decode MB skip */
1257*495ae853SAndroid Build Coastguard Worker ps_dec->p_motion_compensate(ps_dec, ps_cur_mb_info);
1258*495ae853SAndroid Build Coastguard Worker }
1259*495ae853SAndroid Build Coastguard Worker
1260*495ae853SAndroid Build Coastguard Worker *pu2_res_luma_csbp = 0;
1261*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
1262*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
1263*495ae853SAndroid Build Coastguard Worker (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
1264*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode = SVC_INTER_MB;
1265*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size =
1266*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_tran_form8x8;
1267*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = 0;
1268*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz = 0;
1269*495ae853SAndroid Build Coastguard Worker }
1270*495ae853SAndroid Build Coastguard Worker }
1271*495ae853SAndroid Build Coastguard Worker
1272*495ae853SAndroid Build Coastguard Worker /* N Mb IQ IT RECON Loop */
1273*495ae853SAndroid Build Coastguard Worker for(j = u1_mb_idx; j < i; j++)
1274*495ae853SAndroid Build Coastguard Worker {
1275*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info = ps_dec->ps_nmb_info + j;
1276*495ae853SAndroid Build Coastguard Worker ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + j;
1277*495ae853SAndroid Build Coastguard Worker
1278*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
1279*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
1280*495ae853SAndroid Build Coastguard Worker (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
1281*495ae853SAndroid Build Coastguard Worker
1282*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_slice_id = (WORD8) ps_dec->u2_cur_slice_num;
1283*495ae853SAndroid Build Coastguard Worker
1284*495ae853SAndroid Build Coastguard Worker /*Pointer assignment for Residual NNZ */
1285*495ae853SAndroid Build Coastguard Worker pu2_res_luma_csbp = ps_svc_lyr_dec->pu2_frm_res_luma_csbp + ps_cur_mb_info->u2_mbx;
1286*495ae853SAndroid Build Coastguard Worker pu2_res_luma_csbp += ps_cur_mb_info->u2_mby * ps_svc_lyr_dec->i4_frm_res_luma_csbp_stride;
1287*495ae853SAndroid Build Coastguard Worker
1288*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_mb_type <= u1_skip_th)
1289*495ae853SAndroid Build Coastguard Worker {
1290*495ae853SAndroid Build Coastguard Worker if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
1291*495ae853SAndroid Build Coastguard Worker {
1292*495ae853SAndroid Build Coastguard Worker /* inter intra pred generation */
1293*495ae853SAndroid Build Coastguard Worker if(SVCD_FALSE == ps_svc_lyr_dec->u1_dyadic_flag)
1294*495ae853SAndroid Build Coastguard Worker {
1295*495ae853SAndroid Build Coastguard Worker ret =
1296*495ae853SAndroid Build Coastguard Worker isvcd_process_ii_mb(ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info, j);
1297*495ae853SAndroid Build Coastguard Worker if(ret != OK) return ret;
1298*495ae853SAndroid Build Coastguard Worker }
1299*495ae853SAndroid Build Coastguard Worker if(0 == ps_svc_cur_mb_info->u1_residual_prediction_flag)
1300*495ae853SAndroid Build Coastguard Worker {
1301*495ae853SAndroid Build Coastguard Worker // IT + Recon
1302*495ae853SAndroid Build Coastguard Worker ih264d_process_inter_mb(ps_dec, ps_cur_mb_info, j);
1303*495ae853SAndroid Build Coastguard Worker isvcd_update_inter_mb_inter_layer_info(ps_svc_lyr_dec, ps_cur_mb_info, 0);
1304*495ae853SAndroid Build Coastguard Worker *pu2_res_luma_csbp = ps_cur_mb_info->u2_luma_csbp;
1305*495ae853SAndroid Build Coastguard Worker }
1306*495ae853SAndroid Build Coastguard Worker else
1307*495ae853SAndroid Build Coastguard Worker {
1308*495ae853SAndroid Build Coastguard Worker // IT + Residual + Recon
1309*495ae853SAndroid Build Coastguard Worker ret = isvcd_process_inter_mb_rsd_pred_target_lyr(ps_svc_lyr_dec, ps_cur_mb_info,
1310*495ae853SAndroid Build Coastguard Worker j, 0, pu2_res_luma_csbp);
1311*495ae853SAndroid Build Coastguard Worker if(ret != OK) return ret;
1312*495ae853SAndroid Build Coastguard Worker }
1313*495ae853SAndroid Build Coastguard Worker }
1314*495ae853SAndroid Build Coastguard Worker else if(ps_svc_lyr_dec->u1_layer_identifier == MEDIAL_ENHANCEMENT_LAYER)
1315*495ae853SAndroid Build Coastguard Worker {
1316*495ae853SAndroid Build Coastguard Worker if(0 == ps_svc_cur_mb_info->u1_residual_prediction_flag)
1317*495ae853SAndroid Build Coastguard Worker {
1318*495ae853SAndroid Build Coastguard Worker // IT : to be consumed by Target
1319*495ae853SAndroid Build Coastguard Worker ret = isvcd_process_inter_mb_no_rsd_pred_non_target(ps_svc_lyr_dec,
1320*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info, 0);
1321*495ae853SAndroid Build Coastguard Worker *pu2_res_luma_csbp = ps_cur_mb_info->u2_luma_csbp;
1322*495ae853SAndroid Build Coastguard Worker if(ret != OK) return ret;
1323*495ae853SAndroid Build Coastguard Worker }
1324*495ae853SAndroid Build Coastguard Worker else
1325*495ae853SAndroid Build Coastguard Worker {
1326*495ae853SAndroid Build Coastguard Worker // IT + Residual : to be consumed by target
1327*495ae853SAndroid Build Coastguard Worker ret = isvcd_process_inter_mb_rsd_pred_non_target(ps_svc_lyr_dec, ps_cur_mb_info,
1328*495ae853SAndroid Build Coastguard Worker 0, pu2_res_luma_csbp);
1329*495ae853SAndroid Build Coastguard Worker if(ret != OK) return ret;
1330*495ae853SAndroid Build Coastguard Worker }
1331*495ae853SAndroid Build Coastguard Worker }
1332*495ae853SAndroid Build Coastguard Worker else
1333*495ae853SAndroid Build Coastguard Worker {
1334*495ae853SAndroid Build Coastguard Worker return NOT_OK;
1335*495ae853SAndroid Build Coastguard Worker }
1336*495ae853SAndroid Build Coastguard Worker }
1337*495ae853SAndroid Build Coastguard Worker else if((ps_cur_mb_info->u1_mb_type != MB_SKIP) && (ps_cur_mb_info->u1_mb_type != MB_INFER))
1338*495ae853SAndroid Build Coastguard Worker {
1339*495ae853SAndroid Build Coastguard Worker if((u1_ipcm_th + 25) != ps_cur_mb_info->u1_mb_type)
1340*495ae853SAndroid Build Coastguard Worker {
1341*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_mb_type -= (u1_skip_th + 1);
1342*495ae853SAndroid Build Coastguard Worker ih264d_process_intra_mb(ps_dec, ps_cur_mb_info, j);
1343*495ae853SAndroid Build Coastguard Worker isvcd_update_intra_mb_inter_layer_info(ps_svc_lyr_dec, ps_cur_mb_info);
1344*495ae853SAndroid Build Coastguard Worker }
1345*495ae853SAndroid Build Coastguard Worker else
1346*495ae853SAndroid Build Coastguard Worker {
1347*495ae853SAndroid Build Coastguard Worker isvcd_update_ipcm_mb_inter_layer_info(ps_svc_lyr_dec, ps_cur_mb_info);
1348*495ae853SAndroid Build Coastguard Worker }
1349*495ae853SAndroid Build Coastguard Worker *pu2_res_luma_csbp = 0;
1350*495ae853SAndroid Build Coastguard Worker }
1351*495ae853SAndroid Build Coastguard Worker else if(ps_cur_mb_info->u1_mb_type == MB_INFER)
1352*495ae853SAndroid Build Coastguard Worker {
1353*495ae853SAndroid Build Coastguard Worker /* inter layer intra prediction : intra upsample, IQ, IT ,deblock */
1354*495ae853SAndroid Build Coastguard Worker /* Intra resample for IBL mode */
1355*495ae853SAndroid Build Coastguard Worker ret = isvcd_process_ibl_mb(ps_svc_lyr_dec, ps_cur_mb_info, j, 0);
1356*495ae853SAndroid Build Coastguard Worker if(ret != OK) return ret;
1357*495ae853SAndroid Build Coastguard Worker ih264d_process_inter_mb(ps_dec, ps_cur_mb_info, j);
1358*495ae853SAndroid Build Coastguard Worker isvcd_update_inter_mb_inter_layer_info(ps_svc_lyr_dec, ps_cur_mb_info, 1);
1359*495ae853SAndroid Build Coastguard Worker *pu2_res_luma_csbp = ps_cur_mb_info->u2_luma_csbp;
1360*495ae853SAndroid Build Coastguard Worker
1361*495ae853SAndroid Build Coastguard Worker ps_dec->pi1_left_pred_mode[0] = DC;
1362*495ae853SAndroid Build Coastguard Worker ps_dec->pi1_left_pred_mode[1] = DC;
1363*495ae853SAndroid Build Coastguard Worker ps_dec->pi1_left_pred_mode[2] = DC;
1364*495ae853SAndroid Build Coastguard Worker ps_dec->pi1_left_pred_mode[3] = DC;
1365*495ae853SAndroid Build Coastguard Worker
1366*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_curmb->pi1_intrapredmodes[0] = DC;
1367*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_curmb->pi1_intrapredmodes[1] = DC;
1368*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_curmb->pi1_intrapredmodes[2] = DC;
1369*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_curmb->pi1_intrapredmodes[3] = DC;
1370*495ae853SAndroid Build Coastguard Worker
1371*495ae853SAndroid Build Coastguard Worker isvcd_update_ibl_mb_inter_layer_info(ps_svc_lyr_dec, ps_cur_mb_info);
1372*495ae853SAndroid Build Coastguard Worker }
1373*495ae853SAndroid Build Coastguard Worker
1374*495ae853SAndroid Build Coastguard Worker if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
1375*495ae853SAndroid Build Coastguard Worker {
1376*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_num_cores < 3)
1377*495ae853SAndroid Build Coastguard Worker {
1378*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_app_disable_deblk_frm == 0)
1379*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_svc_compute_bs(ps_svc_lyr_dec, ps_cur_mb_info,
1380*495ae853SAndroid Build Coastguard Worker (UWORD16) (j >> u1_mbaff));
1381*495ae853SAndroid Build Coastguard Worker }
1382*495ae853SAndroid Build Coastguard Worker }
1383*495ae853SAndroid Build Coastguard Worker else if(ps_svc_lyr_dec->u1_layer_identifier == MEDIAL_ENHANCEMENT_LAYER)
1384*495ae853SAndroid Build Coastguard Worker {
1385*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_num_cores < 3)
1386*495ae853SAndroid Build Coastguard Worker {
1387*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_app_disable_deblk_frm == 0)
1388*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_svc_compute_bs(ps_svc_lyr_dec, ps_cur_mb_info,
1389*495ae853SAndroid Build Coastguard Worker (UWORD16) (j >> u1_mbaff));
1390*495ae853SAndroid Build Coastguard Worker }
1391*495ae853SAndroid Build Coastguard Worker }
1392*495ae853SAndroid Build Coastguard Worker
1393*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_use_intrapred_line_copy)
1394*495ae853SAndroid Build Coastguard Worker {
1395*495ae853SAndroid Build Coastguard Worker ih264d_copy_intra_pred_line(ps_dec, ps_cur_mb_info, j);
1396*495ae853SAndroid Build Coastguard Worker }
1397*495ae853SAndroid Build Coastguard Worker }
1398*495ae853SAndroid Build Coastguard Worker
1399*495ae853SAndroid Build Coastguard Worker /*MB deblocking*/
1400*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_nmb_deblk == 1)
1401*495ae853SAndroid Build Coastguard Worker {
1402*495ae853SAndroid Build Coastguard Worker UWORD32 u4_wd_y, u4_wd_uv;
1403*495ae853SAndroid Build Coastguard Worker tfr_ctxt_t *ps_tfr_cxt = &(ps_dec->s_tran_addrecon);
1404*495ae853SAndroid Build Coastguard Worker UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
1405*495ae853SAndroid Build Coastguard Worker const WORD32 i4_cb_qp_idx_ofst = ps_dec->ps_cur_pps->i1_chroma_qp_index_offset;
1406*495ae853SAndroid Build Coastguard Worker const WORD32 i4_cr_qp_idx_ofst = ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset;
1407*495ae853SAndroid Build Coastguard Worker
1408*495ae853SAndroid Build Coastguard Worker u4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
1409*495ae853SAndroid Build Coastguard Worker u4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
1410*495ae853SAndroid Build Coastguard Worker
1411*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info = ps_dec->ps_nmb_info + u1_mb_idx;
1412*495ae853SAndroid Build Coastguard Worker
1413*495ae853SAndroid Build Coastguard Worker ps_dec->u4_deblk_mb_x = ps_cur_mb_info->u2_mbx;
1414*495ae853SAndroid Build Coastguard Worker ps_dec->u4_deblk_mb_y = ps_cur_mb_info->u2_mby;
1415*495ae853SAndroid Build Coastguard Worker
1416*495ae853SAndroid Build Coastguard Worker for(j = u1_mb_idx; j < i; j++)
1417*495ae853SAndroid Build Coastguard Worker {
1418*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_cur_deblk_mb_num > ps_dec->ps_cur_sps->u2_max_mb_addr)
1419*495ae853SAndroid Build Coastguard Worker {
1420*495ae853SAndroid Build Coastguard Worker return NOT_OK;
1421*495ae853SAndroid Build Coastguard Worker }
1422*495ae853SAndroid Build Coastguard Worker ih264d_deblock_mb_nonmbaff(ps_dec, ps_tfr_cxt, i4_cb_qp_idx_ofst, i4_cr_qp_idx_ofst,
1423*495ae853SAndroid Build Coastguard Worker u4_wd_y, u4_wd_uv);
1424*495ae853SAndroid Build Coastguard Worker }
1425*495ae853SAndroid Build Coastguard Worker }
1426*495ae853SAndroid Build Coastguard Worker
1427*495ae853SAndroid Build Coastguard Worker if(u1_tfr_n_mb)
1428*495ae853SAndroid Build Coastguard Worker {
1429*495ae853SAndroid Build Coastguard Worker /****************************************************************/
1430*495ae853SAndroid Build Coastguard Worker /* Check for End Of Row in Next iteration */
1431*495ae853SAndroid Build Coastguard Worker /****************************************************************/
1432*495ae853SAndroid Build Coastguard Worker u1_end_of_row_next =
1433*495ae853SAndroid Build Coastguard Worker u1_num_mbs_next && (u1_num_mbs_next <= (ps_dec->u1_recon_mb_grp >> u1_mbaff));
1434*495ae853SAndroid Build Coastguard Worker
1435*495ae853SAndroid Build Coastguard Worker /****************************************************************/
1436*495ae853SAndroid Build Coastguard Worker /* Transfer the Following things */
1437*495ae853SAndroid Build Coastguard Worker /* N-Mb DeblkParams Data ( To Ext DeblkParams Buffer ) */
1438*495ae853SAndroid Build Coastguard Worker /* N-Mb Recon Data ( To Ext Frame Buffer ) */
1439*495ae853SAndroid Build Coastguard Worker /* N-Mb Intrapredline Data ( Updated Internally) */
1440*495ae853SAndroid Build Coastguard Worker /* N-Mb MV Data ( To Ext MV Buffer ) */
1441*495ae853SAndroid Build Coastguard Worker /* N-Mb MVTop/TopRight Data ( To Int MV Top Scratch Buffers) */
1442*495ae853SAndroid Build Coastguard Worker /****************************************************************/
1443*495ae853SAndroid Build Coastguard Worker ih264d_transfer_mb_group_data(ps_dec, u1_num_mbs, u1_end_of_row, u1_end_of_row_next);
1444*495ae853SAndroid Build Coastguard Worker ps_dec->u4_num_mbs_prev_nmb = u1_num_mbs;
1445*495ae853SAndroid Build Coastguard Worker ps_dec->u4_pred_info_idx = 0;
1446*495ae853SAndroid Build Coastguard Worker ps_dec->u4_dma_buf_idx = 0;
1447*495ae853SAndroid Build Coastguard Worker }
1448*495ae853SAndroid Build Coastguard Worker return OK;
1449*495ae853SAndroid Build Coastguard Worker }
1450*495ae853SAndroid Build Coastguard Worker /*!
1451*495ae853SAndroid Build Coastguard Worker **************************************************************************
1452*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_decode_recon_tfr_nmb_base_lyr \endif
1453*495ae853SAndroid Build Coastguard Worker *
1454*495ae853SAndroid Build Coastguard Worker * \brief
1455*495ae853SAndroid Build Coastguard Worker *
1456*495ae853SAndroid Build Coastguard Worker *
1457*495ae853SAndroid Build Coastguard Worker * \return
1458*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
1459*495ae853SAndroid Build Coastguard Worker **************************************************************************
1460*495ae853SAndroid Build Coastguard Worker */
isvcd_decode_recon_tfr_nmb_base_lyr(svc_dec_lyr_struct_t * ps_svc_lyr_dec,UWORD8 u1_mb_idx,UWORD8 u1_num_mbs,UWORD8 u1_num_mbs_next,UWORD8 u1_tfr_n_mb,UWORD8 u1_end_of_row)1461*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_decode_recon_tfr_nmb_base_lyr(svc_dec_lyr_struct_t *ps_svc_lyr_dec, UWORD8 u1_mb_idx,
1462*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_mbs, UWORD8 u1_num_mbs_next,
1463*495ae853SAndroid Build Coastguard Worker UWORD8 u1_tfr_n_mb, UWORD8 u1_end_of_row)
1464*495ae853SAndroid Build Coastguard Worker {
1465*495ae853SAndroid Build Coastguard Worker WORD32 j;
1466*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1467*495ae853SAndroid Build Coastguard Worker UWORD32 u1_end_of_row_next;
1468*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_cur_mb_info;
1469*495ae853SAndroid Build Coastguard Worker const UWORD32 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
1470*495ae853SAndroid Build Coastguard Worker const UWORD32 u1_slice_type = ps_dec->ps_cur_slice->u1_slice_type;
1471*495ae853SAndroid Build Coastguard Worker const WORD32 u1_skip_th =
1472*495ae853SAndroid Build Coastguard Worker ((u1_slice_type != I_SLICE) ? (ps_dec->u1_B ? B_8x8 : PRED_8x8R0) : -1);
1473*495ae853SAndroid Build Coastguard Worker const UWORD32 u1_ipcm_th = ((u1_slice_type != I_SLICE) ? (ps_dec->u1_B ? 23 : 5) : 0);
1474*495ae853SAndroid Build Coastguard Worker WORD32 ret = OK;
1475*495ae853SAndroid Build Coastguard Worker
1476*495ae853SAndroid Build Coastguard Worker if(1 != ps_svc_lyr_dec->u1_base_res_flag)
1477*495ae853SAndroid Build Coastguard Worker {
1478*495ae853SAndroid Build Coastguard Worker return NOT_OK;
1479*495ae853SAndroid Build Coastguard Worker }
1480*495ae853SAndroid Build Coastguard Worker if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
1481*495ae853SAndroid Build Coastguard Worker {
1482*495ae853SAndroid Build Coastguard Worker return NOT_OK;
1483*495ae853SAndroid Build Coastguard Worker }
1484*495ae853SAndroid Build Coastguard Worker
1485*495ae853SAndroid Build Coastguard Worker /* N Mb IQ IT + Residual Store for Inter / + Recon for Intra Loop */
1486*495ae853SAndroid Build Coastguard Worker for(j = u1_mb_idx; j < u1_num_mbs; j++)
1487*495ae853SAndroid Build Coastguard Worker {
1488*495ae853SAndroid Build Coastguard Worker ps_dec->u4_dma_buf_idx = 0;
1489*495ae853SAndroid Build Coastguard Worker ps_dec->u4_pred_info_idx = 0;
1490*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info = ps_dec->ps_nmb_info + j;
1491*495ae853SAndroid Build Coastguard Worker
1492*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
1493*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
1494*495ae853SAndroid Build Coastguard Worker (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
1495*495ae853SAndroid Build Coastguard Worker
1496*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_slice_id = (WORD8) ps_dec->u2_cur_slice_num;
1497*495ae853SAndroid Build Coastguard Worker
1498*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_mb_type == MB_SKIP)
1499*495ae853SAndroid Build Coastguard Worker {
1500*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode = SVC_INTER_MB;
1501*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size =
1502*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_tran_form8x8;
1503*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = 0;
1504*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz = 0;
1505*495ae853SAndroid Build Coastguard Worker }
1506*495ae853SAndroid Build Coastguard Worker else if(ps_cur_mb_info->u1_mb_type <= u1_skip_th)
1507*495ae853SAndroid Build Coastguard Worker {
1508*495ae853SAndroid Build Coastguard Worker /* Only IT : Store Residual (WORD16) for Higher Layers : Base layer*/
1509*495ae853SAndroid Build Coastguard Worker ret = isvcd_process_inter_mb_no_rsd_pred_non_target(ps_svc_lyr_dec, ps_cur_mb_info, 0);
1510*495ae853SAndroid Build Coastguard Worker if(ret != OK) return ret;
1511*495ae853SAndroid Build Coastguard Worker }
1512*495ae853SAndroid Build Coastguard Worker else if(ps_cur_mb_info->u1_mb_type != MB_SKIP)
1513*495ae853SAndroid Build Coastguard Worker {
1514*495ae853SAndroid Build Coastguard Worker if((u1_ipcm_th + 25) != ps_cur_mb_info->u1_mb_type)
1515*495ae853SAndroid Build Coastguard Worker {
1516*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_mb_type -= (u1_skip_th + 1);
1517*495ae853SAndroid Build Coastguard Worker ih264d_process_intra_mb(ps_dec, ps_cur_mb_info, j);
1518*495ae853SAndroid Build Coastguard Worker isvcd_update_intra_mb_inter_layer_info(ps_svc_lyr_dec, ps_cur_mb_info);
1519*495ae853SAndroid Build Coastguard Worker }
1520*495ae853SAndroid Build Coastguard Worker else
1521*495ae853SAndroid Build Coastguard Worker {
1522*495ae853SAndroid Build Coastguard Worker isvcd_update_ipcm_mb_inter_layer_info(ps_svc_lyr_dec, ps_cur_mb_info);
1523*495ae853SAndroid Build Coastguard Worker }
1524*495ae853SAndroid Build Coastguard Worker }
1525*495ae853SAndroid Build Coastguard Worker
1526*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_use_intrapred_line_copy)
1527*495ae853SAndroid Build Coastguard Worker {
1528*495ae853SAndroid Build Coastguard Worker ih264d_copy_intra_pred_line(ps_dec, ps_cur_mb_info, j);
1529*495ae853SAndroid Build Coastguard Worker }
1530*495ae853SAndroid Build Coastguard Worker }
1531*495ae853SAndroid Build Coastguard Worker
1532*495ae853SAndroid Build Coastguard Worker /*MB deblocking*/
1533*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_nmb_deblk == 1)
1534*495ae853SAndroid Build Coastguard Worker {
1535*495ae853SAndroid Build Coastguard Worker UWORD32 u4_wd_y, u4_wd_uv;
1536*495ae853SAndroid Build Coastguard Worker tfr_ctxt_t *ps_tfr_cxt = &(ps_dec->s_tran_addrecon);
1537*495ae853SAndroid Build Coastguard Worker UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
1538*495ae853SAndroid Build Coastguard Worker const WORD32 i4_cb_qp_idx_ofst = ps_dec->ps_cur_pps->i1_chroma_qp_index_offset;
1539*495ae853SAndroid Build Coastguard Worker const WORD32 i4_cr_qp_idx_ofst = ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset;
1540*495ae853SAndroid Build Coastguard Worker
1541*495ae853SAndroid Build Coastguard Worker u4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
1542*495ae853SAndroid Build Coastguard Worker u4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
1543*495ae853SAndroid Build Coastguard Worker
1544*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info = ps_dec->ps_nmb_info + u1_mb_idx;
1545*495ae853SAndroid Build Coastguard Worker
1546*495ae853SAndroid Build Coastguard Worker ps_dec->u4_deblk_mb_x = ps_cur_mb_info->u2_mbx;
1547*495ae853SAndroid Build Coastguard Worker ps_dec->u4_deblk_mb_y = ps_cur_mb_info->u2_mby;
1548*495ae853SAndroid Build Coastguard Worker
1549*495ae853SAndroid Build Coastguard Worker for(j = u1_mb_idx; j < u1_num_mbs; j++)
1550*495ae853SAndroid Build Coastguard Worker {
1551*495ae853SAndroid Build Coastguard Worker /* IN SVC base layers only intra MB's Need to be deblocked*/
1552*495ae853SAndroid Build Coastguard Worker deblk_mb_t *ps_top_mb, *ps_left_mb, *ps_cur_mb;
1553*495ae853SAndroid Build Coastguard Worker ps_cur_mb = ps_dec->ps_cur_deblk_mb;
1554*495ae853SAndroid Build Coastguard Worker if(!(ps_cur_mb->u1_deblocking_mode & MB_DISABLE_FILTERING))
1555*495ae853SAndroid Build Coastguard Worker {
1556*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_deblk_mb_x)
1557*495ae853SAndroid Build Coastguard Worker {
1558*495ae853SAndroid Build Coastguard Worker ps_left_mb = ps_cur_mb - 1;
1559*495ae853SAndroid Build Coastguard Worker }
1560*495ae853SAndroid Build Coastguard Worker else
1561*495ae853SAndroid Build Coastguard Worker {
1562*495ae853SAndroid Build Coastguard Worker ps_left_mb = NULL;
1563*495ae853SAndroid Build Coastguard Worker }
1564*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_deblk_mb_y != 0)
1565*495ae853SAndroid Build Coastguard Worker {
1566*495ae853SAndroid Build Coastguard Worker ps_top_mb = ps_cur_mb - (ps_dec->u2_frm_wd_in_mbs);
1567*495ae853SAndroid Build Coastguard Worker }
1568*495ae853SAndroid Build Coastguard Worker else
1569*495ae853SAndroid Build Coastguard Worker {
1570*495ae853SAndroid Build Coastguard Worker ps_top_mb = NULL;
1571*495ae853SAndroid Build Coastguard Worker }
1572*495ae853SAndroid Build Coastguard Worker
1573*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb->u1_deblocking_mode & MB_DISABLE_LEFT_EDGE) ps_left_mb = NULL;
1574*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb->u1_deblocking_mode & MB_DISABLE_TOP_EDGE) ps_top_mb = NULL;
1575*495ae853SAndroid Build Coastguard Worker
1576*495ae853SAndroid Build Coastguard Worker /* Top Horizontal Edge*/
1577*495ae853SAndroid Build Coastguard Worker if(NULL != ps_top_mb)
1578*495ae853SAndroid Build Coastguard Worker {
1579*495ae853SAndroid Build Coastguard Worker if(!(ps_top_mb->u1_mb_type & D_INTRA_MB))
1580*495ae853SAndroid Build Coastguard Worker {
1581*495ae853SAndroid Build Coastguard Worker ps_cur_mb->u4_bs_table[0] = 0;
1582*495ae853SAndroid Build Coastguard Worker }
1583*495ae853SAndroid Build Coastguard Worker }
1584*495ae853SAndroid Build Coastguard Worker else
1585*495ae853SAndroid Build Coastguard Worker {
1586*495ae853SAndroid Build Coastguard Worker ps_cur_mb->u4_bs_table[0] = 0;
1587*495ae853SAndroid Build Coastguard Worker }
1588*495ae853SAndroid Build Coastguard Worker
1589*495ae853SAndroid Build Coastguard Worker /* Left Vertical Edge*/
1590*495ae853SAndroid Build Coastguard Worker if(NULL != ps_left_mb)
1591*495ae853SAndroid Build Coastguard Worker {
1592*495ae853SAndroid Build Coastguard Worker if(!(ps_left_mb->u1_mb_type & D_INTRA_MB))
1593*495ae853SAndroid Build Coastguard Worker {
1594*495ae853SAndroid Build Coastguard Worker ps_cur_mb->u4_bs_table[4] = 0;
1595*495ae853SAndroid Build Coastguard Worker }
1596*495ae853SAndroid Build Coastguard Worker }
1597*495ae853SAndroid Build Coastguard Worker else
1598*495ae853SAndroid Build Coastguard Worker {
1599*495ae853SAndroid Build Coastguard Worker ps_cur_mb->u4_bs_table[4] = 0;
1600*495ae853SAndroid Build Coastguard Worker }
1601*495ae853SAndroid Build Coastguard Worker }
1602*495ae853SAndroid Build Coastguard Worker
1603*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_cur_deblk_mb_num > ps_dec->ps_cur_sps->u2_max_mb_addr)
1604*495ae853SAndroid Build Coastguard Worker {
1605*495ae853SAndroid Build Coastguard Worker return NOT_OK;
1606*495ae853SAndroid Build Coastguard Worker }
1607*495ae853SAndroid Build Coastguard Worker
1608*495ae853SAndroid Build Coastguard Worker ih264d_deblock_mb_nonmbaff(ps_dec, ps_tfr_cxt, i4_cb_qp_idx_ofst, i4_cr_qp_idx_ofst,
1609*495ae853SAndroid Build Coastguard Worker u4_wd_y, u4_wd_uv);
1610*495ae853SAndroid Build Coastguard Worker }
1611*495ae853SAndroid Build Coastguard Worker }
1612*495ae853SAndroid Build Coastguard Worker
1613*495ae853SAndroid Build Coastguard Worker if(u1_tfr_n_mb)
1614*495ae853SAndroid Build Coastguard Worker {
1615*495ae853SAndroid Build Coastguard Worker /****************************************************************/
1616*495ae853SAndroid Build Coastguard Worker /* Check for End Of Row in Next iteration */
1617*495ae853SAndroid Build Coastguard Worker /****************************************************************/
1618*495ae853SAndroid Build Coastguard Worker u1_end_of_row_next =
1619*495ae853SAndroid Build Coastguard Worker u1_num_mbs_next && (u1_num_mbs_next <= (ps_dec->u1_recon_mb_grp >> u1_mbaff));
1620*495ae853SAndroid Build Coastguard Worker
1621*495ae853SAndroid Build Coastguard Worker /****************************************************************/
1622*495ae853SAndroid Build Coastguard Worker /* Transfer the Following things */
1623*495ae853SAndroid Build Coastguard Worker /* N-Mb DeblkParams Data ( To Ext DeblkParams Buffer ) */
1624*495ae853SAndroid Build Coastguard Worker /* N-Mb Recon Data ( To Ext Frame Buffer ) */
1625*495ae853SAndroid Build Coastguard Worker /* N-Mb Intrapredline Data ( Updated Internally) */
1626*495ae853SAndroid Build Coastguard Worker /* N-Mb MV Data ( To Ext MV Buffer ) */
1627*495ae853SAndroid Build Coastguard Worker /* N-Mb MVTop/TopRight Data ( To Int MV Top Scratch Buffers) */
1628*495ae853SAndroid Build Coastguard Worker /****************************************************************/
1629*495ae853SAndroid Build Coastguard Worker ih264d_transfer_mb_group_data(ps_dec, u1_num_mbs, u1_end_of_row, u1_end_of_row_next);
1630*495ae853SAndroid Build Coastguard Worker ps_dec->u4_num_mbs_prev_nmb = u1_num_mbs;
1631*495ae853SAndroid Build Coastguard Worker ps_dec->u4_pred_info_idx = 0;
1632*495ae853SAndroid Build Coastguard Worker ps_dec->u4_dma_buf_idx = 0;
1633*495ae853SAndroid Build Coastguard Worker }
1634*495ae853SAndroid Build Coastguard Worker return OK;
1635*495ae853SAndroid Build Coastguard Worker }
1636*495ae853SAndroid Build Coastguard Worker /*!
1637*495ae853SAndroid Build Coastguard Worker **************************************************************************
1638*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_process_ibl_mb \endif
1639*495ae853SAndroid Build Coastguard Worker *
1640*495ae853SAndroid Build Coastguard Worker * \brief
1641*495ae853SAndroid Build Coastguard Worker * This function decodes an ibl mb
1642*495ae853SAndroid Build Coastguard Worker *
1643*495ae853SAndroid Build Coastguard Worker *
1644*495ae853SAndroid Build Coastguard Worker * \return
1645*495ae853SAndroid Build Coastguard Worker *
1646*495ae853SAndroid Build Coastguard Worker **************************************************************************
1647*495ae853SAndroid Build Coastguard Worker */
isvcd_process_ibl_mb(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_mb_num,UWORD8 u1_inter_intra_mode)1648*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_process_ibl_mb(svc_dec_lyr_struct_t *ps_svc_lyr_dec, dec_mb_info_t *ps_cur_mb_info,
1649*495ae853SAndroid Build Coastguard Worker UWORD8 u1_mb_num, UWORD8 u1_inter_intra_mode)
1650*495ae853SAndroid Build Coastguard Worker {
1651*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1652*495ae853SAndroid Build Coastguard Worker intra_sampling_ctxt_t *ps_ctxt;
1653*495ae853SAndroid Build Coastguard Worker svc_dec_lyr_struct_t *ps_svc_dec_ref_layer;
1654*495ae853SAndroid Build Coastguard Worker pic_buffer_t *ps_frame_buf = ps_dec->ps_cur_pic;
1655*495ae853SAndroid Build Coastguard Worker pic_buffer_t *ps_frame_buf_ref_layer;
1656*495ae853SAndroid Build Coastguard Worker intra_samp_lyr_ctxt *ps_lyr_ctxt;
1657*495ae853SAndroid Build Coastguard Worker mem_element_t s_ref_mb_mode = {0};
1658*495ae853SAndroid Build Coastguard Worker mem_element_t s_inp_luma = {0};
1659*495ae853SAndroid Build Coastguard Worker mem_element_t s_inp_chroma = {0};
1660*495ae853SAndroid Build Coastguard Worker mem_element_t s_out_luma = {0};
1661*495ae853SAndroid Build Coastguard Worker mem_element_t s_out_chroma = {0};
1662*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_x_luma, i4_ref_y_luma, i4_luma_incr = 0;
1663*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_x_chroma, i4_ref_y_chroma, i4_chroma_incr = 0;
1664*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cur_y_stride, u4_cur_uv_stride;
1665*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ref_y_stride, u4_ref_uv_stride;
1666*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_luma_instra_sample_correction_offset = 0;
1667*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_chroma_instra_sample_correction_offset = 0;
1668*495ae853SAndroid Build Coastguard Worker ref_mb_map_t *ps_x_off_len_luma;
1669*495ae853SAndroid Build Coastguard Worker ref_mb_map_t *ps_y_off_len_luma;
1670*495ae853SAndroid Build Coastguard Worker ref_mb_map_t *ps_x_off_len_chroma;
1671*495ae853SAndroid Build Coastguard Worker ref_mb_map_t *ps_y_off_len_chroma;
1672*495ae853SAndroid Build Coastguard Worker mb_coord_t s_mb_coord = {0};
1673*495ae853SAndroid Build Coastguard Worker WORD32 ret = OK;
1674*495ae853SAndroid Build Coastguard Worker UNUSED(u1_mb_num);
1675*495ae853SAndroid Build Coastguard Worker
1676*495ae853SAndroid Build Coastguard Worker ps_ctxt = (intra_sampling_ctxt_t *) ps_svc_lyr_dec->pv_intra_sample_ctxt;
1677*495ae853SAndroid Build Coastguard Worker ps_svc_dec_ref_layer = ps_svc_lyr_dec->ps_dec_svc_ref_layer;
1678*495ae853SAndroid Build Coastguard Worker
1679*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
1680*495ae853SAndroid Build Coastguard Worker u4_cur_y_stride = ps_dec->u2_frm_wd_y;
1681*495ae853SAndroid Build Coastguard Worker u4_cur_uv_stride = ps_dec->u2_frm_wd_uv;
1682*495ae853SAndroid Build Coastguard Worker u4_ref_y_stride = ps_svc_dec_ref_layer->s_dec.u2_frm_wd_y;
1683*495ae853SAndroid Build Coastguard Worker u4_ref_uv_stride = ps_svc_dec_ref_layer->s_dec.u2_frm_wd_uv;
1684*495ae853SAndroid Build Coastguard Worker
1685*495ae853SAndroid Build Coastguard Worker ps_frame_buf_ref_layer = ps_svc_dec_ref_layer->s_dec.ps_cur_pic;
1686*495ae853SAndroid Build Coastguard Worker if(0 == u1_inter_intra_mode)
1687*495ae853SAndroid Build Coastguard Worker {
1688*495ae853SAndroid Build Coastguard Worker s_out_luma.pv_buffer = ps_frame_buf->pu1_buf1 + (ps_cur_mb_info->u2_mbx << 4) +
1689*495ae853SAndroid Build Coastguard Worker (u4_cur_y_stride * (ps_cur_mb_info->u2_mby << 4));
1690*495ae853SAndroid Build Coastguard Worker s_out_luma.i4_element_size = 1;
1691*495ae853SAndroid Build Coastguard Worker s_out_luma.i4_num_element_stride = u4_cur_y_stride;
1692*495ae853SAndroid Build Coastguard Worker
1693*495ae853SAndroid Build Coastguard Worker s_out_chroma.pv_buffer = ps_frame_buf->pu1_buf2 +
1694*495ae853SAndroid Build Coastguard Worker (ps_cur_mb_info->u2_mbx << 3) * YUV420SP_FACTOR +
1695*495ae853SAndroid Build Coastguard Worker (u4_cur_uv_stride * (ps_cur_mb_info->u2_mby << 3));
1696*495ae853SAndroid Build Coastguard Worker s_out_chroma.i4_element_size = 1;
1697*495ae853SAndroid Build Coastguard Worker s_out_chroma.i4_num_element_stride = u4_cur_uv_stride;
1698*495ae853SAndroid Build Coastguard Worker }
1699*495ae853SAndroid Build Coastguard Worker else
1700*495ae853SAndroid Build Coastguard Worker {
1701*495ae853SAndroid Build Coastguard Worker if(SVCD_TRUE == ps_svc_lyr_dec->s_res_prms.u1_dyadic_flag)
1702*495ae853SAndroid Build Coastguard Worker {
1703*495ae853SAndroid Build Coastguard Worker return NOT_OK;
1704*495ae853SAndroid Build Coastguard Worker }
1705*495ae853SAndroid Build Coastguard Worker
1706*495ae853SAndroid Build Coastguard Worker s_out_luma.pv_buffer = ps_svc_lyr_dec->pu1_ii_resamp_buffer_luma;
1707*495ae853SAndroid Build Coastguard Worker s_out_luma.i4_element_size = 1;
1708*495ae853SAndroid Build Coastguard Worker s_out_luma.i4_num_element_stride = MB_SIZE;
1709*495ae853SAndroid Build Coastguard Worker
1710*495ae853SAndroid Build Coastguard Worker s_out_chroma.pv_buffer = ps_svc_lyr_dec->pu1_ii_resamp_buffer_chroma;
1711*495ae853SAndroid Build Coastguard Worker s_out_chroma.i4_element_size = 1;
1712*495ae853SAndroid Build Coastguard Worker s_out_chroma.i4_num_element_stride = MB_SIZE;
1713*495ae853SAndroid Build Coastguard Worker }
1714*495ae853SAndroid Build Coastguard Worker
1715*495ae853SAndroid Build Coastguard Worker /* get the projected locations buffer pointers */
1716*495ae853SAndroid Build Coastguard Worker {
1717*495ae853SAndroid Build Coastguard Worker intra_samp_map_ctxt_t *ps_luma_map, *ps_chroma_map;
1718*495ae853SAndroid Build Coastguard Worker
1719*495ae853SAndroid Build Coastguard Worker ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
1720*495ae853SAndroid Build Coastguard Worker ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
1721*495ae853SAndroid Build Coastguard Worker
1722*495ae853SAndroid Build Coastguard Worker ps_x_off_len_luma = ps_luma_map->ps_x_offset_length;
1723*495ae853SAndroid Build Coastguard Worker ps_y_off_len_luma = ps_luma_map->ps_y_offset_length;
1724*495ae853SAndroid Build Coastguard Worker ps_x_off_len_chroma = ps_chroma_map->ps_x_offset_length;
1725*495ae853SAndroid Build Coastguard Worker ps_y_off_len_chroma = ps_chroma_map->ps_y_offset_length;
1726*495ae853SAndroid Build Coastguard Worker }
1727*495ae853SAndroid Build Coastguard Worker i4_ref_x_luma = ps_svc_lyr_dec->ps_intsam_luma_map_horz[ps_cur_mb_info->u2_mbx].i2_offset;
1728*495ae853SAndroid Build Coastguard Worker i4_ref_y_luma = ps_svc_lyr_dec->ps_intsam_luma_map_vert[ps_cur_mb_info->u2_mby].i2_offset;
1729*495ae853SAndroid Build Coastguard Worker
1730*495ae853SAndroid Build Coastguard Worker i4_luma_incr = ps_x_off_len_luma[ps_cur_mb_info->u2_mbx].i2_offset - i4_ref_x_luma;
1731*495ae853SAndroid Build Coastguard Worker i4_luma_incr +=
1732*495ae853SAndroid Build Coastguard Worker (ps_y_off_len_luma[ps_cur_mb_info->u2_mby].i2_offset - i4_ref_y_luma) * u4_ref_y_stride;
1733*495ae853SAndroid Build Coastguard Worker
1734*495ae853SAndroid Build Coastguard Worker i4_ref_x_chroma = ps_svc_lyr_dec->ps_intsam_chroma_map_horz[ps_cur_mb_info->u2_mbx].i2_offset;
1735*495ae853SAndroid Build Coastguard Worker i4_ref_y_chroma = ps_svc_lyr_dec->ps_intsam_chroma_map_vert[ps_cur_mb_info->u2_mby].i2_offset;
1736*495ae853SAndroid Build Coastguard Worker
1737*495ae853SAndroid Build Coastguard Worker i4_chroma_incr = ps_x_off_len_chroma[ps_cur_mb_info->u2_mbx].i2_offset - i4_ref_x_chroma;
1738*495ae853SAndroid Build Coastguard Worker i4_chroma_incr <<= 1;
1739*495ae853SAndroid Build Coastguard Worker i4_chroma_incr += (ps_y_off_len_chroma[ps_cur_mb_info->u2_mby].i2_offset - i4_ref_y_chroma) *
1740*495ae853SAndroid Build Coastguard Worker u4_ref_uv_stride;
1741*495ae853SAndroid Build Coastguard Worker if(SVCD_FALSE == ps_svc_lyr_dec->s_res_prms.u1_dyadic_flag)
1742*495ae853SAndroid Build Coastguard Worker {
1743*495ae853SAndroid Build Coastguard Worker i4_ref_x_luma = CLIP3(0, (ps_svc_dec_ref_layer->s_dec.u2_frm_wd_y - 1), i4_ref_x_luma);
1744*495ae853SAndroid Build Coastguard Worker i4_ref_y_luma = CLIP3(0, (ps_svc_dec_ref_layer->s_dec.u2_frm_ht_y - 1), i4_ref_y_luma);
1745*495ae853SAndroid Build Coastguard Worker }
1746*495ae853SAndroid Build Coastguard Worker
1747*495ae853SAndroid Build Coastguard Worker i4_ref_luma_instra_sample_correction_offset =
1748*495ae853SAndroid Build Coastguard Worker i4_ref_x_luma + (i4_ref_y_luma) * (WORD32) u4_ref_y_stride;
1749*495ae853SAndroid Build Coastguard Worker
1750*495ae853SAndroid Build Coastguard Worker s_inp_luma.pv_buffer = ps_frame_buf_ref_layer->pu1_buf1 + i4_luma_incr +
1751*495ae853SAndroid Build Coastguard Worker i4_ref_luma_instra_sample_correction_offset;
1752*495ae853SAndroid Build Coastguard Worker s_inp_luma.i4_element_size = 1;
1753*495ae853SAndroid Build Coastguard Worker s_inp_luma.i4_num_element_stride = u4_ref_y_stride;
1754*495ae853SAndroid Build Coastguard Worker
1755*495ae853SAndroid Build Coastguard Worker if(SVCD_FALSE == ps_svc_lyr_dec->s_res_prms.u1_dyadic_flag)
1756*495ae853SAndroid Build Coastguard Worker {
1757*495ae853SAndroid Build Coastguard Worker i4_ref_x_chroma = CLIP3(0, (ps_svc_dec_ref_layer->s_dec.u2_frm_wd_uv - 1), i4_ref_x_chroma);
1758*495ae853SAndroid Build Coastguard Worker i4_ref_y_chroma = CLIP3(0, (ps_svc_dec_ref_layer->s_dec.u2_frm_ht_uv - 1), i4_ref_y_chroma);
1759*495ae853SAndroid Build Coastguard Worker }
1760*495ae853SAndroid Build Coastguard Worker i4_ref_chroma_instra_sample_correction_offset =
1761*495ae853SAndroid Build Coastguard Worker (i4_ref_x_chroma << 1) + (i4_ref_y_chroma) * (WORD32) u4_ref_uv_stride;
1762*495ae853SAndroid Build Coastguard Worker
1763*495ae853SAndroid Build Coastguard Worker s_inp_chroma.pv_buffer = ps_frame_buf_ref_layer->pu1_buf2 + i4_chroma_incr +
1764*495ae853SAndroid Build Coastguard Worker i4_ref_chroma_instra_sample_correction_offset;
1765*495ae853SAndroid Build Coastguard Worker s_inp_chroma.i4_element_size = 1;
1766*495ae853SAndroid Build Coastguard Worker s_inp_chroma.i4_num_element_stride = u4_ref_uv_stride;
1767*495ae853SAndroid Build Coastguard Worker
1768*495ae853SAndroid Build Coastguard Worker s_ref_mb_mode.pv_buffer = ps_svc_dec_ref_layer->ps_inter_lyr_mb_prms_frm_start;
1769*495ae853SAndroid Build Coastguard Worker s_ref_mb_mode.i4_element_size = sizeof(inter_lyr_mb_prms_t);
1770*495ae853SAndroid Build Coastguard Worker s_ref_mb_mode.i4_num_element_stride = ps_svc_dec_ref_layer->u2_inter_lyr_mb_prms_stride;
1771*495ae853SAndroid Build Coastguard Worker
1772*495ae853SAndroid Build Coastguard Worker s_mb_coord.u2_mb_x = ps_cur_mb_info->u2_mbx;
1773*495ae853SAndroid Build Coastguard Worker s_mb_coord.u2_mb_y = ps_cur_mb_info->u2_mby;
1774*495ae853SAndroid Build Coastguard Worker
1775*495ae853SAndroid Build Coastguard Worker if(SVCD_TRUE == ps_svc_lyr_dec->s_res_prms.u1_dyadic_flag)
1776*495ae853SAndroid Build Coastguard Worker {
1777*495ae853SAndroid Build Coastguard Worker ret = isvcd_intra_resamp_mb_dyadic(ps_ctxt, &s_inp_luma, &s_inp_chroma, &s_ref_mb_mode,
1778*495ae853SAndroid Build Coastguard Worker &s_out_luma, &s_out_chroma, &s_mb_coord, ps_svc_lyr_dec);
1779*495ae853SAndroid Build Coastguard Worker }
1780*495ae853SAndroid Build Coastguard Worker else
1781*495ae853SAndroid Build Coastguard Worker {
1782*495ae853SAndroid Build Coastguard Worker ret = isvcd_intra_resamp_mb(ps_ctxt, &s_inp_luma, &s_inp_chroma, &s_ref_mb_mode,
1783*495ae853SAndroid Build Coastguard Worker &s_out_luma, &s_out_chroma, &s_mb_coord);
1784*495ae853SAndroid Build Coastguard Worker }
1785*495ae853SAndroid Build Coastguard Worker if(OK != ret) return ret;
1786*495ae853SAndroid Build Coastguard Worker return OK;
1787*495ae853SAndroid Build Coastguard Worker }
1788*495ae853SAndroid Build Coastguard Worker /*!
1789*495ae853SAndroid Build Coastguard Worker **************************************************************************
1790*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_process_residual_resample_mb \endif
1791*495ae853SAndroid Build Coastguard Worker *
1792*495ae853SAndroid Build Coastguard Worker * \brief
1793*495ae853SAndroid Build Coastguard Worker * This function decodes a residual resample mb
1794*495ae853SAndroid Build Coastguard Worker *
1795*495ae853SAndroid Build Coastguard Worker *
1796*495ae853SAndroid Build Coastguard Worker * \return
1797*495ae853SAndroid Build Coastguard Worker *
1798*495ae853SAndroid Build Coastguard Worker **************************************************************************
1799*495ae853SAndroid Build Coastguard Worker */
isvcd_process_residual_resample_mb(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info)1800*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_process_residual_resample_mb(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
1801*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_cur_mb_info)
1802*495ae853SAndroid Build Coastguard Worker {
1803*495ae853SAndroid Build Coastguard Worker residual_sampling_ctxt_t *ps_ctxt;
1804*495ae853SAndroid Build Coastguard Worker svc_dec_lyr_struct_t *ps_svc_dec_ref_layer;
1805*495ae853SAndroid Build Coastguard Worker res_lyr_ctxt *ps_lyr_ctxt;
1806*495ae853SAndroid Build Coastguard Worker mem_element_t s_ref_mb_mode = {0};
1807*495ae853SAndroid Build Coastguard Worker mem_element_t s_inp_luma = {0};
1808*495ae853SAndroid Build Coastguard Worker mem_element_t s_inp_chroma = {0};
1809*495ae853SAndroid Build Coastguard Worker mem_element_t s_out_luma = {0};
1810*495ae853SAndroid Build Coastguard Worker mem_element_t s_out_chroma = {0};
1811*495ae853SAndroid Build Coastguard Worker
1812*495ae853SAndroid Build Coastguard Worker /* projected locations pointer */
1813*495ae853SAndroid Build Coastguard Worker ref_mb_map_t *ps_x_off_len_luma;
1814*495ae853SAndroid Build Coastguard Worker ref_mb_map_t *ps_y_off_len_luma;
1815*495ae853SAndroid Build Coastguard Worker ref_mb_map_t *ps_x_off_len_chroma;
1816*495ae853SAndroid Build Coastguard Worker ref_mb_map_t *ps_y_off_len_chroma;
1817*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_x_luma, i4_ref_y_luma;
1818*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_x_chroma, i4_ref_y_chroma;
1819*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_luma_ressam_correction_offset = 0;
1820*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_chroma_ressam_correction_offset = 0;
1821*495ae853SAndroid Build Coastguard Worker WORD32 i4_inp_luma_stride, i4_inp_chroma_stride;
1822*495ae853SAndroid Build Coastguard Worker WORD32 i4_out_luma_stride, i4_out_chroma_stride;
1823*495ae853SAndroid Build Coastguard Worker WORD32 i4_inp_luma_offset = 0, i4_inp_chroma_offset = 0;
1824*495ae853SAndroid Build Coastguard Worker WORD32 ret;
1825*495ae853SAndroid Build Coastguard Worker
1826*495ae853SAndroid Build Coastguard Worker ps_svc_dec_ref_layer = ps_svc_lyr_dec->ps_dec_svc_ref_layer;
1827*495ae853SAndroid Build Coastguard Worker ps_ctxt = (residual_sampling_ctxt_t *) ps_svc_lyr_dec->pv_residual_sample_ctxt;
1828*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
1829*495ae853SAndroid Build Coastguard Worker
1830*495ae853SAndroid Build Coastguard Worker i4_inp_luma_stride = ps_svc_dec_ref_layer->u2_residual_resample_luma_stride;
1831*495ae853SAndroid Build Coastguard Worker i4_inp_chroma_stride = ps_svc_dec_ref_layer->u2_residual_resample_chroma_stride;
1832*495ae853SAndroid Build Coastguard Worker i4_out_luma_stride = ps_svc_lyr_dec->u2_residual_resample_luma_stride;
1833*495ae853SAndroid Build Coastguard Worker i4_out_chroma_stride = ps_svc_lyr_dec->u2_residual_resample_chroma_stride;
1834*495ae853SAndroid Build Coastguard Worker
1835*495ae853SAndroid Build Coastguard Worker {
1836*495ae853SAndroid Build Coastguard Worker residual_samp_map_ctxt_t *ps_luma_map, *ps_chroma_map;
1837*495ae853SAndroid Build Coastguard Worker
1838*495ae853SAndroid Build Coastguard Worker ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
1839*495ae853SAndroid Build Coastguard Worker ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
1840*495ae853SAndroid Build Coastguard Worker ps_x_off_len_luma = ps_luma_map->ps_x_offset_length;
1841*495ae853SAndroid Build Coastguard Worker ps_y_off_len_luma = ps_luma_map->ps_y_offset_length;
1842*495ae853SAndroid Build Coastguard Worker ps_x_off_len_chroma = ps_chroma_map->ps_x_offset_length;
1843*495ae853SAndroid Build Coastguard Worker ps_y_off_len_chroma = ps_chroma_map->ps_y_offset_length;
1844*495ae853SAndroid Build Coastguard Worker }
1845*495ae853SAndroid Build Coastguard Worker i4_ref_x_luma = ps_svc_lyr_dec->ps_ressam_luma_map_horz[ps_cur_mb_info->u2_mbx].i2_offset;
1846*495ae853SAndroid Build Coastguard Worker i4_ref_y_luma = ps_svc_lyr_dec->ps_ressam_luma_map_vert[ps_cur_mb_info->u2_mby].i2_offset;
1847*495ae853SAndroid Build Coastguard Worker
1848*495ae853SAndroid Build Coastguard Worker i4_ref_x_chroma = ps_svc_lyr_dec->ps_ressam_chroma_map_horz[ps_cur_mb_info->u2_mbx].i2_offset;
1849*495ae853SAndroid Build Coastguard Worker i4_ref_y_chroma = ps_svc_lyr_dec->ps_ressam_chroma_map_vert[ps_cur_mb_info->u2_mby].i2_offset;
1850*495ae853SAndroid Build Coastguard Worker
1851*495ae853SAndroid Build Coastguard Worker i4_ref_x_luma = CLIP3(0, (ps_lyr_ctxt->i4_ref_width - 1), i4_ref_x_luma);
1852*495ae853SAndroid Build Coastguard Worker i4_ref_y_luma = CLIP3(0, (ps_lyr_ctxt->i4_ref_height - 1), i4_ref_y_luma);
1853*495ae853SAndroid Build Coastguard Worker i4_ref_x_chroma = CLIP3(0, ((ps_lyr_ctxt->i4_ref_width >> 1) - 1), i4_ref_x_chroma);
1854*495ae853SAndroid Build Coastguard Worker i4_ref_y_chroma = CLIP3(0, ((ps_lyr_ctxt->i4_ref_height >> 1) - 1), i4_ref_y_chroma);
1855*495ae853SAndroid Build Coastguard Worker
1856*495ae853SAndroid Build Coastguard Worker {
1857*495ae853SAndroid Build Coastguard Worker WORD32 i4_offset_x, i4_offset_y;
1858*495ae853SAndroid Build Coastguard Worker
1859*495ae853SAndroid Build Coastguard Worker i4_offset_x = ps_x_off_len_luma[ps_cur_mb_info->u2_mbx].i2_offset;
1860*495ae853SAndroid Build Coastguard Worker i4_offset_y = ps_y_off_len_luma[ps_cur_mb_info->u2_mby].i2_offset;
1861*495ae853SAndroid Build Coastguard Worker
1862*495ae853SAndroid Build Coastguard Worker /* check for offsets inside frame dimensions */
1863*495ae853SAndroid Build Coastguard Worker if(0 <= i4_offset_x)
1864*495ae853SAndroid Build Coastguard Worker {
1865*495ae853SAndroid Build Coastguard Worker /* validity of pointer passed */
1866*495ae853SAndroid Build Coastguard Worker if(!(i4_offset_x >= i4_ref_x_luma))
1867*495ae853SAndroid Build Coastguard Worker {
1868*495ae853SAndroid Build Coastguard Worker return NOT_OK;
1869*495ae853SAndroid Build Coastguard Worker }
1870*495ae853SAndroid Build Coastguard Worker i4_inp_luma_offset += (i4_offset_x - i4_ref_x_luma);
1871*495ae853SAndroid Build Coastguard Worker }
1872*495ae853SAndroid Build Coastguard Worker
1873*495ae853SAndroid Build Coastguard Worker if(0 <= i4_offset_y)
1874*495ae853SAndroid Build Coastguard Worker {
1875*495ae853SAndroid Build Coastguard Worker /* validity of pointer passed */
1876*495ae853SAndroid Build Coastguard Worker if(!(i4_offset_y >= i4_ref_y_luma))
1877*495ae853SAndroid Build Coastguard Worker {
1878*495ae853SAndroid Build Coastguard Worker return NOT_OK;
1879*495ae853SAndroid Build Coastguard Worker }
1880*495ae853SAndroid Build Coastguard Worker i4_inp_luma_offset += (i4_offset_y - i4_ref_y_luma) * i4_inp_luma_stride;
1881*495ae853SAndroid Build Coastguard Worker }
1882*495ae853SAndroid Build Coastguard Worker
1883*495ae853SAndroid Build Coastguard Worker i4_offset_x = ps_x_off_len_chroma[ps_cur_mb_info->u2_mbx].i2_offset;
1884*495ae853SAndroid Build Coastguard Worker i4_offset_y = ps_y_off_len_chroma[ps_cur_mb_info->u2_mby].i2_offset;
1885*495ae853SAndroid Build Coastguard Worker
1886*495ae853SAndroid Build Coastguard Worker /* check for offsets inside frame dimensions */
1887*495ae853SAndroid Build Coastguard Worker if(0 <= i4_offset_x)
1888*495ae853SAndroid Build Coastguard Worker {
1889*495ae853SAndroid Build Coastguard Worker /* validity of pointer passed */
1890*495ae853SAndroid Build Coastguard Worker if(!(i4_offset_x >= i4_ref_x_chroma))
1891*495ae853SAndroid Build Coastguard Worker {
1892*495ae853SAndroid Build Coastguard Worker return NOT_OK;
1893*495ae853SAndroid Build Coastguard Worker }
1894*495ae853SAndroid Build Coastguard Worker i4_inp_chroma_offset += (i4_offset_x - i4_ref_x_chroma) << 1;
1895*495ae853SAndroid Build Coastguard Worker }
1896*495ae853SAndroid Build Coastguard Worker
1897*495ae853SAndroid Build Coastguard Worker if(0 <= i4_offset_y)
1898*495ae853SAndroid Build Coastguard Worker {
1899*495ae853SAndroid Build Coastguard Worker /* validity of pointer passed */
1900*495ae853SAndroid Build Coastguard Worker if(!(i4_offset_y >= i4_ref_y_chroma))
1901*495ae853SAndroid Build Coastguard Worker {
1902*495ae853SAndroid Build Coastguard Worker return NOT_OK;
1903*495ae853SAndroid Build Coastguard Worker }
1904*495ae853SAndroid Build Coastguard Worker i4_inp_chroma_offset += (i4_offset_y - i4_ref_y_chroma) * (i4_inp_chroma_stride << 1);
1905*495ae853SAndroid Build Coastguard Worker }
1906*495ae853SAndroid Build Coastguard Worker }
1907*495ae853SAndroid Build Coastguard Worker
1908*495ae853SAndroid Build Coastguard Worker i4_ref_luma_ressam_correction_offset = i4_ref_x_luma + (i4_ref_y_luma) *i4_inp_luma_stride;
1909*495ae853SAndroid Build Coastguard Worker
1910*495ae853SAndroid Build Coastguard Worker s_inp_luma.pv_buffer = ps_svc_dec_ref_layer->pi2_il_residual_resample_mb_luma_frm_start +
1911*495ae853SAndroid Build Coastguard Worker i4_inp_luma_offset + i4_ref_luma_ressam_correction_offset;
1912*495ae853SAndroid Build Coastguard Worker s_inp_luma.i4_element_size = 1;
1913*495ae853SAndroid Build Coastguard Worker s_inp_luma.i4_num_element_stride = i4_inp_luma_stride;
1914*495ae853SAndroid Build Coastguard Worker
1915*495ae853SAndroid Build Coastguard Worker i4_ref_chroma_ressam_correction_offset =
1916*495ae853SAndroid Build Coastguard Worker (i4_ref_x_chroma << 1) + (i4_ref_y_chroma) *i4_inp_chroma_stride;
1917*495ae853SAndroid Build Coastguard Worker
1918*495ae853SAndroid Build Coastguard Worker s_inp_chroma.pv_buffer = ps_svc_dec_ref_layer->pi2_il_residual_resample_mb_chroma_frm_start +
1919*495ae853SAndroid Build Coastguard Worker i4_inp_chroma_offset + i4_ref_chroma_ressam_correction_offset;
1920*495ae853SAndroid Build Coastguard Worker s_inp_chroma.i4_element_size = 1;
1921*495ae853SAndroid Build Coastguard Worker s_inp_chroma.i4_num_element_stride = i4_inp_luma_stride;
1922*495ae853SAndroid Build Coastguard Worker
1923*495ae853SAndroid Build Coastguard Worker s_ref_mb_mode.pv_buffer = ps_svc_dec_ref_layer->ps_inter_lyr_mb_prms_frm_start;
1924*495ae853SAndroid Build Coastguard Worker s_ref_mb_mode.i4_element_size = sizeof(inter_lyr_mb_prms_t);
1925*495ae853SAndroid Build Coastguard Worker s_ref_mb_mode.i4_num_element_stride = ps_svc_dec_ref_layer->u2_inter_lyr_mb_prms_stride;
1926*495ae853SAndroid Build Coastguard Worker
1927*495ae853SAndroid Build Coastguard Worker s_out_luma.i4_element_size = 1;
1928*495ae853SAndroid Build Coastguard Worker s_out_luma.pv_buffer =
1929*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pi2_il_residual_resample_mb_luma_frm_start +
1930*495ae853SAndroid Build Coastguard Worker ((ps_cur_mb_info->u2_mbx << 4) +
1931*495ae853SAndroid Build Coastguard Worker (i4_out_luma_stride * (ps_cur_mb_info->u2_mby << 4)) * s_out_luma.i4_element_size);
1932*495ae853SAndroid Build Coastguard Worker
1933*495ae853SAndroid Build Coastguard Worker s_out_luma.i4_num_element_stride = i4_out_luma_stride;
1934*495ae853SAndroid Build Coastguard Worker
1935*495ae853SAndroid Build Coastguard Worker s_out_chroma.i4_element_size = 1;
1936*495ae853SAndroid Build Coastguard Worker s_out_chroma.pv_buffer =
1937*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pi2_il_residual_resample_mb_chroma_frm_start +
1938*495ae853SAndroid Build Coastguard Worker ((ps_cur_mb_info->u2_mbx << 4) +
1939*495ae853SAndroid Build Coastguard Worker (i4_out_chroma_stride * (ps_cur_mb_info->u2_mby << 3)) * s_out_chroma.i4_element_size);
1940*495ae853SAndroid Build Coastguard Worker s_out_chroma.i4_num_element_stride = i4_out_chroma_stride;
1941*495ae853SAndroid Build Coastguard Worker
1942*495ae853SAndroid Build Coastguard Worker ret = ps_lyr_ctxt->pf_residual_samp_mb(ps_ctxt, &s_inp_luma, &s_inp_chroma, &s_ref_mb_mode,
1943*495ae853SAndroid Build Coastguard Worker &s_out_luma, &s_out_chroma, ps_cur_mb_info->u2_mbx,
1944*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u2_mby);
1945*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1946*495ae853SAndroid Build Coastguard Worker {
1947*495ae853SAndroid Build Coastguard Worker return ret;
1948*495ae853SAndroid Build Coastguard Worker }
1949*495ae853SAndroid Build Coastguard Worker return OK;
1950*495ae853SAndroid Build Coastguard Worker }
1951*495ae853SAndroid Build Coastguard Worker
1952*495ae853SAndroid Build Coastguard Worker /*!
1953*495ae853SAndroid Build Coastguard Worker **************************************************************************
1954*495ae853SAndroid Build Coastguard Worker * \if Function name : isvcd_process_inter_mb_rsd_pred_target_lyr \endif
1955*495ae853SAndroid Build Coastguard Worker *
1956*495ae853SAndroid Build Coastguard Worker * \brief IT+ Residual + Recon
1957*495ae853SAndroid Build Coastguard Worker * This function decodes an Inter MB.
1958*495ae853SAndroid Build Coastguard Worker *
1959*495ae853SAndroid Build Coastguard Worker *
1960*495ae853SAndroid Build Coastguard Worker * \return
1961*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
1962*495ae853SAndroid Build Coastguard Worker **************************************************************************
1963*495ae853SAndroid Build Coastguard Worker */
isvcd_process_inter_mb_rsd_pred_target_lyr(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_mb_num,UWORD8 u1_inference_mode,UWORD16 * pu2_res_luma_csbp)1964*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_process_inter_mb_rsd_pred_target_lyr(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
1965*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_cur_mb_info, UWORD8 u1_mb_num,
1966*495ae853SAndroid Build Coastguard Worker UWORD8 u1_inference_mode,
1967*495ae853SAndroid Build Coastguard Worker UWORD16 *pu2_res_luma_csbp)
1968*495ae853SAndroid Build Coastguard Worker {
1969*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_rec_y, *pu1_rec_u;
1970*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1971*495ae853SAndroid Build Coastguard Worker UWORD32 ui_rec_width, u4_recwidth_cr;
1972*495ae853SAndroid Build Coastguard Worker UWORD16 u2_luma_stride, u2_chroma_stride;
1973*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_y_coeff, *pi2_luma_res_ptr, *pi2_chroma_res_ptr;
1974*495ae853SAndroid Build Coastguard Worker UWORD32 u1_mb_field_decoding_flag;
1975*495ae853SAndroid Build Coastguard Worker const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
1976*495ae853SAndroid Build Coastguard Worker UWORD32 uc_botMb;
1977*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_pmbair;
1978*495ae853SAndroid Build Coastguard Worker tfr_ctxt_t *ps_frame_buf = ps_dec->ps_frame_buf_ip_recon;
1979*495ae853SAndroid Build Coastguard Worker UWORD32 u4_luma_dc_only_csbp = 0;
1980*495ae853SAndroid Build Coastguard Worker UWORD32 u4_luma_dc_only_cbp = 0;
1981*495ae853SAndroid Build Coastguard Worker UWORD16 u2_res_luma_csbp = 0;
1982*495ae853SAndroid Build Coastguard Worker WORD32 ret;
1983*495ae853SAndroid Build Coastguard Worker
1984*495ae853SAndroid Build Coastguard Worker if(0 != ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1985*495ae853SAndroid Build Coastguard Worker {
1986*495ae853SAndroid Build Coastguard Worker return NOT_OK;
1987*495ae853SAndroid Build Coastguard Worker }
1988*495ae853SAndroid Build Coastguard Worker uc_botMb = 1 - ps_cur_mb_info->u1_topmb;
1989*495ae853SAndroid Build Coastguard Worker u4_num_pmbair = (u1_mb_num >> u1_mbaff);
1990*495ae853SAndroid Build Coastguard Worker u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
1991*495ae853SAndroid Build Coastguard Worker
1992*495ae853SAndroid Build Coastguard Worker pu1_rec_y = ps_frame_buf->pu1_dest_y + (u4_num_pmbair << 4);
1993*495ae853SAndroid Build Coastguard Worker pu1_rec_u = ps_frame_buf->pu1_dest_u + (u4_num_pmbair << 3) * YUV420SP_FACTOR;
1994*495ae853SAndroid Build Coastguard Worker ui_rec_width = ps_dec->u2_frm_wd_y << u1_mb_field_decoding_flag;
1995*495ae853SAndroid Build Coastguard Worker u4_recwidth_cr = ps_dec->u2_frm_wd_uv << u1_mb_field_decoding_flag;
1996*495ae853SAndroid Build Coastguard Worker
1997*495ae853SAndroid Build Coastguard Worker u2_luma_stride = ps_svc_lyr_dec->u2_residual_resample_luma_stride;
1998*495ae853SAndroid Build Coastguard Worker pi2_luma_res_ptr = ps_svc_lyr_dec->pi2_il_residual_resample_mb_luma_frm_start +
1999*495ae853SAndroid Build Coastguard Worker (ps_cur_mb_info->u2_mbx << 4) +
2000*495ae853SAndroid Build Coastguard Worker ((ps_cur_mb_info->u2_mby << 4) * u2_luma_stride);
2001*495ae853SAndroid Build Coastguard Worker
2002*495ae853SAndroid Build Coastguard Worker u2_chroma_stride = ps_svc_lyr_dec->u2_residual_resample_chroma_stride;
2003*495ae853SAndroid Build Coastguard Worker pi2_chroma_res_ptr = ps_svc_lyr_dec->pi2_il_residual_resample_mb_chroma_frm_start +
2004*495ae853SAndroid Build Coastguard Worker (ps_cur_mb_info->u2_mbx << 4) +
2005*495ae853SAndroid Build Coastguard Worker ((ps_cur_mb_info->u2_mby << 3) * u2_chroma_stride);
2006*495ae853SAndroid Build Coastguard Worker
2007*495ae853SAndroid Build Coastguard Worker ret = isvcd_process_residual_resample_mb(ps_svc_lyr_dec, ps_cur_mb_info);
2008*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2009*495ae853SAndroid Build Coastguard Worker {
2010*495ae853SAndroid Build Coastguard Worker return ret;
2011*495ae853SAndroid Build Coastguard Worker }
2012*495ae853SAndroid Build Coastguard Worker if(u1_mbaff)
2013*495ae853SAndroid Build Coastguard Worker {
2014*495ae853SAndroid Build Coastguard Worker if(uc_botMb)
2015*495ae853SAndroid Build Coastguard Worker {
2016*495ae853SAndroid Build Coastguard Worker pu1_rec_y += (u1_mb_field_decoding_flag ? (ui_rec_width >> 1) : (ui_rec_width << 4));
2017*495ae853SAndroid Build Coastguard Worker pu1_rec_u +=
2018*495ae853SAndroid Build Coastguard Worker (u1_mb_field_decoding_flag ? (u4_recwidth_cr >> 1) : (u4_recwidth_cr << 3));
2019*495ae853SAndroid Build Coastguard Worker }
2020*495ae853SAndroid Build Coastguard Worker }
2021*495ae853SAndroid Build Coastguard Worker
2022*495ae853SAndroid Build Coastguard Worker if(!ps_cur_mb_info->u1_tran_form8x8)
2023*495ae853SAndroid Build Coastguard Worker {
2024*495ae853SAndroid Build Coastguard Worker u4_luma_dc_only_csbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec, ps_cur_mb_info, 0);
2025*495ae853SAndroid Build Coastguard Worker }
2026*495ae853SAndroid Build Coastguard Worker else
2027*495ae853SAndroid Build Coastguard Worker {
2028*495ae853SAndroid Build Coastguard Worker if(!ps_dec->ps_cur_pps->u1_entropy_coding_mode)
2029*495ae853SAndroid Build Coastguard Worker {
2030*495ae853SAndroid Build Coastguard Worker u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec, ps_cur_mb_info, 0);
2031*495ae853SAndroid Build Coastguard Worker }
2032*495ae853SAndroid Build Coastguard Worker else
2033*495ae853SAndroid Build Coastguard Worker {
2034*495ae853SAndroid Build Coastguard Worker u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff8x8_mb(ps_dec, ps_cur_mb_info);
2035*495ae853SAndroid Build Coastguard Worker }
2036*495ae853SAndroid Build Coastguard Worker }
2037*495ae853SAndroid Build Coastguard Worker
2038*495ae853SAndroid Build Coastguard Worker *pu2_res_luma_csbp = 0;
2039*495ae853SAndroid Build Coastguard Worker pi2_y_coeff = ps_dec->pi2_coeff_data;
2040*495ae853SAndroid Build Coastguard Worker
2041*495ae853SAndroid Build Coastguard Worker /* Inverse Transform and Reconstruction */
2042*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_cbp & 0x0f)
2043*495ae853SAndroid Build Coastguard Worker {
2044*495ae853SAndroid Build Coastguard Worker if(!ps_cur_mb_info->u1_tran_form8x8)
2045*495ae853SAndroid Build Coastguard Worker {
2046*495ae853SAndroid Build Coastguard Worker UWORD32 i;
2047*495ae853SAndroid Build Coastguard Worker WORD16 ai2_tmp[16] = {0};
2048*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 16; i++)
2049*495ae853SAndroid Build Coastguard Worker {
2050*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(ps_cur_mb_info->u2_luma_csbp, i))
2051*495ae853SAndroid Build Coastguard Worker {
2052*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_level = pi2_y_coeff + (i << 4);
2053*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred_sblk =
2054*495ae853SAndroid Build Coastguard Worker pu1_rec_y + ((i & 0x3) * BLK_SIZE) + (i >> 2) * (ui_rec_width << 2);
2055*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_luma_res_ptr + ((i & 0x3) * BLK_SIZE) +
2056*495ae853SAndroid Build Coastguard Worker (i >> 2) * (u2_luma_stride << 2);
2057*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_IQ_IT_RECON()
2058*495ae853SAndroid Build Coastguard Worker {
2059*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(u4_luma_dc_only_csbp, i))
2060*495ae853SAndroid Build Coastguard Worker {
2061*495ae853SAndroid Build Coastguard Worker u2_res_luma_csbp =
2062*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_residual_recon_luma_4x4_dc(
2063*495ae853SAndroid Build Coastguard Worker pi2_level, pu1_pred_sblk, pi2_out, pu1_pred_sblk, ui_rec_width,
2064*495ae853SAndroid Build Coastguard Worker u2_luma_stride, ui_rec_width,
2065*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
2066*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[3],
2067*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0, NULL);
2068*495ae853SAndroid Build Coastguard Worker }
2069*495ae853SAndroid Build Coastguard Worker else
2070*495ae853SAndroid Build Coastguard Worker {
2071*495ae853SAndroid Build Coastguard Worker u2_res_luma_csbp =
2072*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_residual_recon_luma_4x4(
2073*495ae853SAndroid Build Coastguard Worker pi2_level, pu1_pred_sblk, pi2_out, pu1_pred_sblk, ui_rec_width,
2074*495ae853SAndroid Build Coastguard Worker u2_luma_stride, ui_rec_width,
2075*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
2076*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[3],
2077*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0, NULL);
2078*495ae853SAndroid Build Coastguard Worker }
2079*495ae853SAndroid Build Coastguard Worker }
2080*495ae853SAndroid Build Coastguard Worker }
2081*495ae853SAndroid Build Coastguard Worker else
2082*495ae853SAndroid Build Coastguard Worker {
2083*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred_sblk =
2084*495ae853SAndroid Build Coastguard Worker pu1_rec_y + ((i & 0x3) * BLK_SIZE) + (i >> 2) * (ui_rec_width << 2);
2085*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_luma_res_ptr + ((i & 0x3) * BLK_SIZE) +
2086*495ae853SAndroid Build Coastguard Worker (i >> 2) * (u2_luma_stride << 2);
2087*495ae853SAndroid Build Coastguard Worker
2088*495ae853SAndroid Build Coastguard Worker u2_res_luma_csbp = ps_svc_lyr_dec->pf_pred_residual_recon_luma_4x4(
2089*495ae853SAndroid Build Coastguard Worker pu1_pred_sblk, pi2_out, pu1_pred_sblk, ui_rec_width, u2_luma_stride,
2090*495ae853SAndroid Build Coastguard Worker ui_rec_width);
2091*495ae853SAndroid Build Coastguard Worker }
2092*495ae853SAndroid Build Coastguard Worker *pu2_res_luma_csbp |= (u2_res_luma_csbp << i);
2093*495ae853SAndroid Build Coastguard Worker }
2094*495ae853SAndroid Build Coastguard Worker }
2095*495ae853SAndroid Build Coastguard Worker else
2096*495ae853SAndroid Build Coastguard Worker {
2097*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_scale_matrix_ptr;
2098*495ae853SAndroid Build Coastguard Worker WORD32 i;
2099*495ae853SAndroid Build Coastguard Worker
2100*495ae853SAndroid Build Coastguard Worker pi2_scale_matrix_ptr = ps_dec->s_high_profile.i2_scalinglist8x8[1];
2101*495ae853SAndroid Build Coastguard Worker
2102*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++)
2103*495ae853SAndroid Build Coastguard Worker {
2104*495ae853SAndroid Build Coastguard Worker WORD16 ai2_tmp[64] = {0};
2105*495ae853SAndroid Build Coastguard Worker WORD16 *pi16_levelBlock =
2106*495ae853SAndroid Build Coastguard Worker pi2_y_coeff + (i << 6); /* move to the next 8x8 adding 64 */
2107*495ae853SAndroid Build Coastguard Worker
2108*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred_sblk =
2109*495ae853SAndroid Build Coastguard Worker pu1_rec_y + ((i & 0x1) * BLK8x8SIZE) + (i >> 1) * (ui_rec_width << 3);
2110*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out =
2111*495ae853SAndroid Build Coastguard Worker pi2_luma_res_ptr + ((i & 0x1) * BLK8x8SIZE) + (i >> 1) * (u2_luma_stride << 3);
2112*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(ps_cur_mb_info->u1_cbp, i))
2113*495ae853SAndroid Build Coastguard Worker {
2114*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_IQ_IT_RECON()
2115*495ae853SAndroid Build Coastguard Worker {
2116*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(u4_luma_dc_only_cbp, i))
2117*495ae853SAndroid Build Coastguard Worker {
2118*495ae853SAndroid Build Coastguard Worker u2_res_luma_csbp =
2119*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_residual_recon_luma_8x8_dc(
2120*495ae853SAndroid Build Coastguard Worker pi16_levelBlock, pu1_pred_sblk, pi2_out, pu1_pred_sblk,
2121*495ae853SAndroid Build Coastguard Worker ui_rec_width, u2_luma_stride, ui_rec_width,
2122*495ae853SAndroid Build Coastguard Worker gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
2123*495ae853SAndroid Build Coastguard Worker (UWORD16 *) pi2_scale_matrix_ptr, ps_cur_mb_info->u1_qp_div6,
2124*495ae853SAndroid Build Coastguard Worker ai2_tmp, 0, NULL);
2125*495ae853SAndroid Build Coastguard Worker }
2126*495ae853SAndroid Build Coastguard Worker else
2127*495ae853SAndroid Build Coastguard Worker {
2128*495ae853SAndroid Build Coastguard Worker u2_res_luma_csbp =
2129*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_residual_recon_luma_8x8(
2130*495ae853SAndroid Build Coastguard Worker pi16_levelBlock, pu1_pred_sblk, pi2_out, pu1_pred_sblk,
2131*495ae853SAndroid Build Coastguard Worker ui_rec_width, u2_luma_stride, ui_rec_width,
2132*495ae853SAndroid Build Coastguard Worker gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
2133*495ae853SAndroid Build Coastguard Worker (UWORD16 *) pi2_scale_matrix_ptr, ps_cur_mb_info->u1_qp_div6,
2134*495ae853SAndroid Build Coastguard Worker ai2_tmp, 0, NULL);
2135*495ae853SAndroid Build Coastguard Worker }
2136*495ae853SAndroid Build Coastguard Worker }
2137*495ae853SAndroid Build Coastguard Worker }
2138*495ae853SAndroid Build Coastguard Worker else
2139*495ae853SAndroid Build Coastguard Worker {
2140*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred_sblk =
2141*495ae853SAndroid Build Coastguard Worker pu1_rec_y + ((i & 0x1) * BLK8x8SIZE) + (i >> 1) * (ui_rec_width << 3);
2142*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_luma_res_ptr + ((i & 0x1) * BLK8x8SIZE) +
2143*495ae853SAndroid Build Coastguard Worker (i >> 1) * (u2_luma_stride << 3);
2144*495ae853SAndroid Build Coastguard Worker
2145*495ae853SAndroid Build Coastguard Worker u2_res_luma_csbp = ps_svc_lyr_dec->pf_pred_residual_recon_luma_8x8(
2146*495ae853SAndroid Build Coastguard Worker pu1_pred_sblk, pi2_out, pu1_pred_sblk, ui_rec_width, u2_luma_stride,
2147*495ae853SAndroid Build Coastguard Worker ui_rec_width);
2148*495ae853SAndroid Build Coastguard Worker }
2149*495ae853SAndroid Build Coastguard Worker *pu2_res_luma_csbp |= (u2_res_luma_csbp << (((i >> 1) << 3) + ((i & 0x01) << 1)));
2150*495ae853SAndroid Build Coastguard Worker }
2151*495ae853SAndroid Build Coastguard Worker }
2152*495ae853SAndroid Build Coastguard Worker }
2153*495ae853SAndroid Build Coastguard Worker else
2154*495ae853SAndroid Build Coastguard Worker {
2155*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred_sblk = pu1_rec_y;
2156*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_luma_res_ptr;
2157*495ae853SAndroid Build Coastguard Worker
2158*495ae853SAndroid Build Coastguard Worker *pu2_res_luma_csbp = ps_svc_lyr_dec->pf_pred_residual_recon_luma_16x16(
2159*495ae853SAndroid Build Coastguard Worker pu1_pred_sblk, pi2_out, pu1_pred_sblk, ui_rec_width, u2_luma_stride, ui_rec_width);
2160*495ae853SAndroid Build Coastguard Worker }
2161*495ae853SAndroid Build Coastguard Worker
2162*495ae853SAndroid Build Coastguard Worker /* Decode Chroma Block */
2163*495ae853SAndroid Build Coastguard Worker ih264d_unpack_chroma_coeff4x4_mb(ps_dec, ps_cur_mb_info);
2164*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
2165*495ae853SAndroid Build Coastguard Worker /* Chroma Blocks decoding */
2166*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
2167*495ae853SAndroid Build Coastguard Worker {
2168*495ae853SAndroid Build Coastguard Worker UWORD8 u1_chroma_cbp = (UWORD8) (ps_cur_mb_info->u1_cbp >> 4);
2169*495ae853SAndroid Build Coastguard Worker
2170*495ae853SAndroid Build Coastguard Worker if(u1_chroma_cbp != CBPC_ALLZERO)
2171*495ae853SAndroid Build Coastguard Worker {
2172*495ae853SAndroid Build Coastguard Worker UWORD32 u4_scale_u = ps_cur_mb_info->u1_qpc_div6;
2173*495ae853SAndroid Build Coastguard Worker UWORD32 u4_scale_v = ps_cur_mb_info->u1_qpcr_div6;
2174*495ae853SAndroid Build Coastguard Worker UWORD16 u2_chroma_csbp = ps_cur_mb_info->u2_chroma_csbp;
2175*495ae853SAndroid Build Coastguard Worker
2176*495ae853SAndroid Build Coastguard Worker pi2_y_coeff = ps_dec->pi2_coeff_data;
2177*495ae853SAndroid Build Coastguard Worker
2178*495ae853SAndroid Build Coastguard Worker {
2179*495ae853SAndroid Build Coastguard Worker UWORD32 i;
2180*495ae853SAndroid Build Coastguard Worker WORD16 ai2_tmp[16] = {0};
2181*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++)
2182*495ae853SAndroid Build Coastguard Worker {
2183*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_level = pi2_y_coeff + (i << 4);
2184*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred_sblk = pu1_rec_u + ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR) +
2185*495ae853SAndroid Build Coastguard Worker (i >> 1) * (u4_recwidth_cr << 2);
2186*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_chroma_res_ptr +
2187*495ae853SAndroid Build Coastguard Worker ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR) +
2188*495ae853SAndroid Build Coastguard Worker (i >> 1) * (u2_chroma_stride << 2);
2189*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_IQ_IT_RECON()
2190*495ae853SAndroid Build Coastguard Worker {
2191*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(u2_chroma_csbp, i))
2192*495ae853SAndroid Build Coastguard Worker {
2193*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_residual_recon_chroma_4x4(
2194*495ae853SAndroid Build Coastguard Worker pi2_level, pu1_pred_sblk, pi2_out, pu1_pred_sblk, u4_recwidth_cr,
2195*495ae853SAndroid Build Coastguard Worker u2_chroma_stride, u4_recwidth_cr,
2196*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
2197*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[4], u4_scale_u,
2198*495ae853SAndroid Build Coastguard Worker ai2_tmp, pi2_level);
2199*495ae853SAndroid Build Coastguard Worker }
2200*495ae853SAndroid Build Coastguard Worker else if(pi2_level[0] != 0)
2201*495ae853SAndroid Build Coastguard Worker {
2202*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_residual_recon_chroma_4x4_dc(
2203*495ae853SAndroid Build Coastguard Worker pi2_level, pu1_pred_sblk, pi2_out, pu1_pred_sblk, u4_recwidth_cr,
2204*495ae853SAndroid Build Coastguard Worker u2_chroma_stride, u4_recwidth_cr,
2205*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
2206*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[4], u4_scale_u,
2207*495ae853SAndroid Build Coastguard Worker ai2_tmp, pi2_level);
2208*495ae853SAndroid Build Coastguard Worker }
2209*495ae853SAndroid Build Coastguard Worker else
2210*495ae853SAndroid Build Coastguard Worker {
2211*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_pred_residual_recon_chroma_4x4(
2212*495ae853SAndroid Build Coastguard Worker pu1_pred_sblk, pi2_out, pu1_pred_sblk, u4_recwidth_cr,
2213*495ae853SAndroid Build Coastguard Worker u2_chroma_stride, u4_recwidth_cr);
2214*495ae853SAndroid Build Coastguard Worker }
2215*495ae853SAndroid Build Coastguard Worker }
2216*495ae853SAndroid Build Coastguard Worker }
2217*495ae853SAndroid Build Coastguard Worker }
2218*495ae853SAndroid Build Coastguard Worker
2219*495ae853SAndroid Build Coastguard Worker pi2_y_coeff += MB_CHROM_SIZE;
2220*495ae853SAndroid Build Coastguard Worker u2_chroma_csbp >>= 4;
2221*495ae853SAndroid Build Coastguard Worker
2222*495ae853SAndroid Build Coastguard Worker {
2223*495ae853SAndroid Build Coastguard Worker UWORD32 i;
2224*495ae853SAndroid Build Coastguard Worker WORD16 ai2_tmp[16] = {0};
2225*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++)
2226*495ae853SAndroid Build Coastguard Worker {
2227*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_level = pi2_y_coeff + (i << 4);
2228*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred_sblk = pu1_rec_u + 1 +
2229*495ae853SAndroid Build Coastguard Worker ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR) +
2230*495ae853SAndroid Build Coastguard Worker (i >> 1) * (u4_recwidth_cr << 2);
2231*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_chroma_res_ptr + 1 +
2232*495ae853SAndroid Build Coastguard Worker ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR) +
2233*495ae853SAndroid Build Coastguard Worker (i >> 1) * (u2_chroma_stride << 2);
2234*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_IQ_IT_RECON()
2235*495ae853SAndroid Build Coastguard Worker {
2236*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(u2_chroma_csbp, i))
2237*495ae853SAndroid Build Coastguard Worker {
2238*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_residual_recon_chroma_4x4(
2239*495ae853SAndroid Build Coastguard Worker pi2_level, pu1_pred_sblk, pi2_out, pu1_pred_sblk, u4_recwidth_cr,
2240*495ae853SAndroid Build Coastguard Worker u2_chroma_stride, u4_recwidth_cr,
2241*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
2242*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[5], u4_scale_v,
2243*495ae853SAndroid Build Coastguard Worker ai2_tmp, pi2_level);
2244*495ae853SAndroid Build Coastguard Worker }
2245*495ae853SAndroid Build Coastguard Worker else if(pi2_level[0] != 0)
2246*495ae853SAndroid Build Coastguard Worker {
2247*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_iquant_itrans_residual_recon_chroma_4x4_dc(
2248*495ae853SAndroid Build Coastguard Worker pi2_level, pu1_pred_sblk, pi2_out, pu1_pred_sblk, u4_recwidth_cr,
2249*495ae853SAndroid Build Coastguard Worker u2_chroma_stride, u4_recwidth_cr,
2250*495ae853SAndroid Build Coastguard Worker gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
2251*495ae853SAndroid Build Coastguard Worker (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[5], u4_scale_v,
2252*495ae853SAndroid Build Coastguard Worker ai2_tmp, pi2_level);
2253*495ae853SAndroid Build Coastguard Worker }
2254*495ae853SAndroid Build Coastguard Worker else
2255*495ae853SAndroid Build Coastguard Worker {
2256*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_pred_residual_recon_chroma_4x4(
2257*495ae853SAndroid Build Coastguard Worker pu1_pred_sblk, pi2_out, pu1_pred_sblk, u4_recwidth_cr,
2258*495ae853SAndroid Build Coastguard Worker u2_chroma_stride, u4_recwidth_cr);
2259*495ae853SAndroid Build Coastguard Worker }
2260*495ae853SAndroid Build Coastguard Worker }
2261*495ae853SAndroid Build Coastguard Worker }
2262*495ae853SAndroid Build Coastguard Worker }
2263*495ae853SAndroid Build Coastguard Worker }
2264*495ae853SAndroid Build Coastguard Worker else
2265*495ae853SAndroid Build Coastguard Worker {
2266*495ae853SAndroid Build Coastguard Worker /* Cr*/
2267*495ae853SAndroid Build Coastguard Worker {
2268*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred_sblk = pu1_rec_u;
2269*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_chroma_res_ptr;
2270*495ae853SAndroid Build Coastguard Worker
2271*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_pred_residual_recon_chroma_8x8(pu1_pred_sblk, pi2_out,
2272*495ae853SAndroid Build Coastguard Worker pu1_pred_sblk, u4_recwidth_cr,
2273*495ae853SAndroid Build Coastguard Worker u2_chroma_stride, u4_recwidth_cr);
2274*495ae853SAndroid Build Coastguard Worker }
2275*495ae853SAndroid Build Coastguard Worker
2276*495ae853SAndroid Build Coastguard Worker /* Cb*/
2277*495ae853SAndroid Build Coastguard Worker {
2278*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_pred_sblk = pu1_rec_u + 1;
2279*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out = pi2_chroma_res_ptr + 1;
2280*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->pf_pred_residual_recon_chroma_8x8(pu1_pred_sblk, pi2_out,
2281*495ae853SAndroid Build Coastguard Worker pu1_pred_sblk, u4_recwidth_cr,
2282*495ae853SAndroid Build Coastguard Worker u2_chroma_stride, u4_recwidth_cr);
2283*495ae853SAndroid Build Coastguard Worker }
2284*495ae853SAndroid Build Coastguard Worker }
2285*495ae853SAndroid Build Coastguard Worker }
2286*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
2287*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
2288*495ae853SAndroid Build Coastguard Worker (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
2289*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode =
2290*495ae853SAndroid Build Coastguard Worker u1_inference_mode ? SVC_IBL_MB : SVC_INTER_MB;
2291*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size = ps_cur_mb_info->u1_tran_form8x8;
2292*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = ps_cur_mb_info->u2_luma_csbp;
2293*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz =
2294*495ae853SAndroid Build Coastguard Worker (UWORD8) ps_cur_mb_info->u2_chroma_csbp;
2295*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 1))
2296*495ae853SAndroid Build Coastguard Worker {
2297*495ae853SAndroid Build Coastguard Worker /* Four bits for Cb in DC only cbp */
2298*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz |= 0x0F;
2299*495ae853SAndroid Build Coastguard Worker }
2300*495ae853SAndroid Build Coastguard Worker if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 2))
2301*495ae853SAndroid Build Coastguard Worker {
2302*495ae853SAndroid Build Coastguard Worker /* Four bits for Cr in DC only cbp */
2303*495ae853SAndroid Build Coastguard Worker ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz |= 0xF0;
2304*495ae853SAndroid Build Coastguard Worker }
2305*495ae853SAndroid Build Coastguard Worker return (0);
2306*495ae853SAndroid Build Coastguard Worker }
2307