1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker *
5*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker *
9*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker *
11*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker *
17*495ae853SAndroid Build Coastguard Worker *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker
21*495ae853SAndroid Build Coastguard Worker /*!
22*495ae853SAndroid Build Coastguard Worker **************************************************************************
23*495ae853SAndroid Build Coastguard Worker * \file ih264d_thread_compute_bs.c
24*495ae853SAndroid Build Coastguard Worker *
25*495ae853SAndroid Build Coastguard Worker * \brief
26*495ae853SAndroid Build Coastguard Worker * Contains routines that for multi-thread decoder
27*495ae853SAndroid Build Coastguard Worker *
28*495ae853SAndroid Build Coastguard Worker * Detailed_description
29*495ae853SAndroid Build Coastguard Worker *
30*495ae853SAndroid Build Coastguard Worker * \date
31*495ae853SAndroid Build Coastguard Worker * 20/02/2012
32*495ae853SAndroid Build Coastguard Worker *
33*495ae853SAndroid Build Coastguard Worker * \author ZR
34*495ae853SAndroid Build Coastguard Worker **************************************************************************
35*495ae853SAndroid Build Coastguard Worker */
36*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
37*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
38*495ae853SAndroid Build Coastguard Worker #include <string.h>
39*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
40*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
41*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
42*495ae853SAndroid Build Coastguard Worker #include "ih264d_structs.h"
43*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
44*495ae853SAndroid Build Coastguard Worker #include "ih264d_mb_utils.h"
45*495ae853SAndroid Build Coastguard Worker
46*495ae853SAndroid Build Coastguard Worker #include "ih264d_thread_compute_bs.h"
47*495ae853SAndroid Build Coastguard Worker #include "ithread.h"
48*495ae853SAndroid Build Coastguard Worker #include "ih264d_deblocking.h"
49*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_pslice.h"
50*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_intra_mb.h"
51*495ae853SAndroid Build Coastguard Worker #include "ih264d_mb_utils.h"
52*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
53*495ae853SAndroid Build Coastguard Worker #include "ih264d_format_conv.h"
54*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
55*495ae853SAndroid Build Coastguard Worker UWORD16 ih264d_update_csbp_8x8(UWORD16 u2_luma_csbp);
56*495ae853SAndroid Build Coastguard Worker void ih264d_fill_bs2_horz_vert(UWORD32 *pu4_bs, /* Base pointer of BS table */
57*495ae853SAndroid Build Coastguard Worker WORD32 u4_left_mb_csbp, /* csbp of left mb */
58*495ae853SAndroid Build Coastguard Worker WORD32 u4_top_mb_csbp, /* csbp of top mb */
59*495ae853SAndroid Build Coastguard Worker WORD32 u4_cur_mb_csbp, /* csbp of current mb */
60*495ae853SAndroid Build Coastguard Worker const UWORD32 *pu4_packed_bs2, const UWORD16 *pu2_4x4_v2h_reorder);
61*495ae853SAndroid Build Coastguard Worker void ih264d_copy_intra_pred_line(dec_struct_t *ps_dec,
62*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_cur_mb_info,
63*495ae853SAndroid Build Coastguard Worker UWORD32 nmb_index);
64*495ae853SAndroid Build Coastguard Worker
65*495ae853SAndroid Build Coastguard Worker #define BS_MB_GROUP 4
66*495ae853SAndroid Build Coastguard Worker #define DEBLK_MB_GROUP 1
67*495ae853SAndroid Build Coastguard Worker #define FORMAT_CONV_MB_GROUP 4
68*495ae853SAndroid Build Coastguard Worker
69*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
70*495ae853SAndroid Build Coastguard Worker /* */
71*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_compute_bs_non_mbaff_thread */
72*495ae853SAndroid Build Coastguard Worker /* */
73*495ae853SAndroid Build Coastguard Worker /* Description : This function computes the pointers of left,top & current*/
74*495ae853SAndroid Build Coastguard Worker /* : Nnz, MvPred & deblk_mb_t and supplies to FillBs function for*/
75*495ae853SAndroid Build Coastguard Worker /* : Boundary Strength Calculation .this function is used */
76*495ae853SAndroid Build Coastguard Worker /* : BS being calculated in separate thread */
77*495ae853SAndroid Build Coastguard Worker /* Inputs : pointer to decoder context,cur_mb_info,u4_mb_num */
78*495ae853SAndroid Build Coastguard Worker /* Processing : */
79*495ae853SAndroid Build Coastguard Worker /* */
80*495ae853SAndroid Build Coastguard Worker /* Outputs : Produces the Boundary Strength for Current Mb */
81*495ae853SAndroid Build Coastguard Worker /* Returns : None */
82*495ae853SAndroid Build Coastguard Worker /* */
83*495ae853SAndroid Build Coastguard Worker /* Revision History: */
84*495ae853SAndroid Build Coastguard Worker /* */
85*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
86*495ae853SAndroid Build Coastguard Worker /* ITTIAM */
87*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
88*495ae853SAndroid Build Coastguard Worker
ih264d_compute_bs_non_mbaff_thread(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD32 u4_mb_num)89*495ae853SAndroid Build Coastguard Worker void ih264d_compute_bs_non_mbaff_thread(dec_struct_t * ps_dec,
90*495ae853SAndroid Build Coastguard Worker dec_mb_info_t * ps_cur_mb_info,
91*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mb_num)
92*495ae853SAndroid Build Coastguard Worker {
93*495ae853SAndroid Build Coastguard Worker /* Mvpred and Nnz for top and Courrent */
94*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_cur_mv_pred, *ps_top_mv_pred = NULL, *ps_left_mv_pred;
95*495ae853SAndroid Build Coastguard Worker /* deblk_mb_t Params */
96*495ae853SAndroid Build Coastguard Worker deblk_mb_t *ps_cur_mb_params; /*< Parameters of current MacroBlock */
97*495ae853SAndroid Build Coastguard Worker deblkmb_neighbour_t *ps_deblk_top_mb;
98*495ae853SAndroid Build Coastguard Worker
99*495ae853SAndroid Build Coastguard Worker /* Reference Index to POC mapping*/
100*495ae853SAndroid Build Coastguard Worker void ** apv_map_ref_idx_to_poc;
101*495ae853SAndroid Build Coastguard Worker UWORD32 u4_leftmbtype;
102*495ae853SAndroid Build Coastguard Worker
103*495ae853SAndroid Build Coastguard Worker UWORD16 u2_left_csbp, u2_top_csbp, u2_cur_csbp;
104*495ae853SAndroid Build Coastguard Worker
105*495ae853SAndroid Build Coastguard Worker /* Set of flags */
106*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cur_mb_intra, u1_top_mb_typ, u4_cur_mb_fld;
107*495ae853SAndroid Build Coastguard Worker UWORD32 u1_cur_mb_type;
108*495ae853SAndroid Build Coastguard Worker UWORD32 * pu4_bs_table;
109*495ae853SAndroid Build Coastguard Worker
110*495ae853SAndroid Build Coastguard Worker /* Neighbour availability */
111*495ae853SAndroid Build Coastguard Worker /* Initialization */
112*495ae853SAndroid Build Coastguard Worker const UWORD32 u2_mbx = ps_cur_mb_info->u2_mbx;
113*495ae853SAndroid Build Coastguard Worker const UWORD32 u2_mby = ps_cur_mb_info->u2_mby;
114*495ae853SAndroid Build Coastguard Worker const UWORD32 u1_pingpong = u2_mbx & 0x01;
115*495ae853SAndroid Build Coastguard Worker
116*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_BOUNDARY_STRENGTH()
117*495ae853SAndroid Build Coastguard Worker ps_deblk_top_mb = ps_dec->ps_deblk_top_mb + u2_mbx;
118*495ae853SAndroid Build Coastguard Worker
119*495ae853SAndroid Build Coastguard Worker /* Pointer assignment for Current DeblkMB, Current Mv Pred */
120*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params = ps_dec->ps_deblk_pic + u4_mb_num;
121*495ae853SAndroid Build Coastguard Worker ps_cur_mv_pred = ps_dec->s_cur_pic.ps_mv + (u4_mb_num << 4);
122*495ae853SAndroid Build Coastguard Worker
123*495ae853SAndroid Build Coastguard Worker apv_map_ref_idx_to_poc =
124*495ae853SAndroid Build Coastguard Worker (void **)ps_dec->ps_computebs_cur_slice->ppv_map_ref_idx_to_poc
125*495ae853SAndroid Build Coastguard Worker + 1;
126*495ae853SAndroid Build Coastguard Worker u1_cur_mb_type = ps_cur_mb_params->u1_mb_type;
127*495ae853SAndroid Build Coastguard Worker u1_top_mb_typ = ps_deblk_top_mb->u1_mb_type;
128*495ae853SAndroid Build Coastguard Worker ps_deblk_top_mb->u1_mb_type = u1_cur_mb_type;
129*495ae853SAndroid Build Coastguard Worker
130*495ae853SAndroid Build Coastguard Worker {
131*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params->u1_topmb_qp = ps_deblk_top_mb->u1_mb_qp;
132*495ae853SAndroid Build Coastguard Worker ps_deblk_top_mb->u1_mb_qp = ps_cur_mb_params->u1_mb_qp;
133*495ae853SAndroid Build Coastguard Worker
134*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params->u1_left_mb_qp = ps_dec->deblk_left_mb[1].u1_mb_qp;
135*495ae853SAndroid Build Coastguard Worker ps_dec->deblk_left_mb[1].u1_mb_qp = ps_cur_mb_params->u1_mb_qp;
136*495ae853SAndroid Build Coastguard Worker
137*495ae853SAndroid Build Coastguard Worker }
138*495ae853SAndroid Build Coastguard Worker
139*495ae853SAndroid Build Coastguard Worker /* if no deblocking required for current Mb then continue */
140*495ae853SAndroid Build Coastguard Worker /* Check next Mbs in Mb group */
141*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_params->u1_deblocking_mode & MB_DISABLE_FILTERING)
142*495ae853SAndroid Build Coastguard Worker {
143*495ae853SAndroid Build Coastguard Worker void ** pu4_map_ref_idx_to_poc_l1 = apv_map_ref_idx_to_poc +
144*495ae853SAndroid Build Coastguard Worker POC_LIST_L0_TO_L1_DIFF;
145*495ae853SAndroid Build Coastguard Worker {
146*495ae853SAndroid Build Coastguard Worker /* Store Parameter for Top MvPred refernce frame Address */
147*495ae853SAndroid Build Coastguard Worker
148*495ae853SAndroid Build Coastguard Worker void ** ppv_top_mv_pred_addr = ps_cur_mb_info->ps_curmb->u4_pic_addrress;
149*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refTop0 = (ps_cur_mv_pred + 12)->i1_ref_frame;
150*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refTop1 = (ps_cur_mv_pred + 14)->i1_ref_frame;
151*495ae853SAndroid Build Coastguard Worker
152*495ae853SAndroid Build Coastguard Worker /* Store Left addresses for Next Mb */
153*495ae853SAndroid Build Coastguard Worker void ** ppv_left_mv_pred_addr =
154*495ae853SAndroid Build Coastguard Worker ps_dec->ps_left_mvpred_addr[!u1_pingpong][1].u4_add;
155*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refleft0 = (ps_cur_mv_pred + 3)->i1_ref_frame;
156*495ae853SAndroid Build Coastguard Worker
157*495ae853SAndroid Build Coastguard Worker
158*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refTop0[0]];
159*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refTop0[1]];
160*495ae853SAndroid Build Coastguard Worker
161*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
162*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
163*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
164*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
165*495ae853SAndroid Build Coastguard Worker
166*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refleft0[0]];
167*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refleft0[1]];
168*495ae853SAndroid Build Coastguard Worker //}
169*495ae853SAndroid Build Coastguard Worker /* Storing the leftMbtype for next Mb */
170*495ae853SAndroid Build Coastguard Worker ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type;
171*495ae853SAndroid Build Coastguard Worker }
172*495ae853SAndroid Build Coastguard Worker
173*495ae853SAndroid Build Coastguard Worker return;
174*495ae853SAndroid Build Coastguard Worker }
175*495ae853SAndroid Build Coastguard Worker
176*495ae853SAndroid Build Coastguard Worker /* Flag for extra left Edge */
177*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params->u1_single_call = 1;
178*495ae853SAndroid Build Coastguard Worker
179*495ae853SAndroid Build Coastguard Worker /* Update the Left deblk_mb_t and Left MvPred Parameters */
180*495ae853SAndroid Build Coastguard Worker if(!u2_mbx)
181*495ae853SAndroid Build Coastguard Worker {
182*495ae853SAndroid Build Coastguard Worker u4_leftmbtype = 0;
183*495ae853SAndroid Build Coastguard Worker
184*495ae853SAndroid Build Coastguard Worker /* Initialize the ps_left_mv_pred with Junk but Valid Location */
185*495ae853SAndroid Build Coastguard Worker /* to avoid invalid memory access */
186*495ae853SAndroid Build Coastguard Worker /* this is read only pointer */
187*495ae853SAndroid Build Coastguard Worker ps_left_mv_pred = ps_cur_mv_pred + 3;
188*495ae853SAndroid Build Coastguard Worker }
189*495ae853SAndroid Build Coastguard Worker else
190*495ae853SAndroid Build Coastguard Worker {
191*495ae853SAndroid Build Coastguard Worker u4_leftmbtype = ps_dec->deblk_left_mb[1].u1_mb_type;
192*495ae853SAndroid Build Coastguard Worker
193*495ae853SAndroid Build Coastguard Worker /* Come to Left Most Edge of the MB */
194*495ae853SAndroid Build Coastguard Worker ps_left_mv_pred = ps_cur_mv_pred - (1 << 4) + 3;
195*495ae853SAndroid Build Coastguard Worker }
196*495ae853SAndroid Build Coastguard Worker
197*495ae853SAndroid Build Coastguard Worker if(!u2_mby)
198*495ae853SAndroid Build Coastguard Worker u1_top_mb_typ = 0;
199*495ae853SAndroid Build Coastguard Worker
200*495ae853SAndroid Build Coastguard Worker /* MvPred Pointer Calculation */
201*495ae853SAndroid Build Coastguard Worker /* CHANGED CODE */
202*495ae853SAndroid Build Coastguard Worker ps_top_mv_pred = ps_cur_mv_pred - (ps_dec->u2_frm_wd_in_mbs << 4) + 12;
203*495ae853SAndroid Build Coastguard Worker
204*495ae853SAndroid Build Coastguard Worker u4_cur_mb_intra = u1_cur_mb_type & D_INTRA_MB;
205*495ae853SAndroid Build Coastguard Worker u4_cur_mb_fld = !!(u1_cur_mb_type & D_FLD_MB);
206*495ae853SAndroid Build Coastguard Worker /* Compute BS function */
207*495ae853SAndroid Build Coastguard Worker pu4_bs_table = ps_cur_mb_params->u4_bs_table;
208*495ae853SAndroid Build Coastguard Worker
209*495ae853SAndroid Build Coastguard Worker u2_cur_csbp = ps_cur_mb_info->ps_curmb->u2_luma_csbp;
210*495ae853SAndroid Build Coastguard Worker u2_left_csbp = ps_cur_mb_info->ps_left_mb->u2_luma_csbp;
211*495ae853SAndroid Build Coastguard Worker u2_top_csbp = ps_cur_mb_info->ps_top_mb->u2_luma_csbp;
212*495ae853SAndroid Build Coastguard Worker
213*495ae853SAndroid Build Coastguard Worker /* Compute BS function */
214*495ae853SAndroid Build Coastguard Worker if(ps_dec->ps_cur_sps->u1_profile_idc == HIGH_PROFILE_IDC)
215*495ae853SAndroid Build Coastguard Worker {
216*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_tran_form8x8 == 1)
217*495ae853SAndroid Build Coastguard Worker {
218*495ae853SAndroid Build Coastguard Worker u2_cur_csbp = ih264d_update_csbp_8x8(
219*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_curmb->u2_luma_csbp);
220*495ae853SAndroid Build Coastguard Worker }
221*495ae853SAndroid Build Coastguard Worker
222*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->ps_left_mb->u1_tran_form8x8 == 1)
223*495ae853SAndroid Build Coastguard Worker {
224*495ae853SAndroid Build Coastguard Worker u2_left_csbp = ih264d_update_csbp_8x8(
225*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_left_mb->u2_luma_csbp);
226*495ae853SAndroid Build Coastguard Worker }
227*495ae853SAndroid Build Coastguard Worker
228*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->ps_top_mb->u1_tran_form8x8 == 1)
229*495ae853SAndroid Build Coastguard Worker {
230*495ae853SAndroid Build Coastguard Worker u2_top_csbp = ih264d_update_csbp_8x8(
231*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_top_mb->u2_luma_csbp);
232*495ae853SAndroid Build Coastguard Worker }
233*495ae853SAndroid Build Coastguard Worker }
234*495ae853SAndroid Build Coastguard Worker if(u4_cur_mb_intra)
235*495ae853SAndroid Build Coastguard Worker {
236*495ae853SAndroid Build Coastguard Worker
237*495ae853SAndroid Build Coastguard Worker pu4_bs_table[4] = 0x04040404;
238*495ae853SAndroid Build Coastguard Worker pu4_bs_table[0] = u4_cur_mb_fld ? 0x03030303 : 0x04040404;
239*495ae853SAndroid Build Coastguard Worker pu4_bs_table[1] = 0x03030303;
240*495ae853SAndroid Build Coastguard Worker pu4_bs_table[2] = 0x03030303;
241*495ae853SAndroid Build Coastguard Worker pu4_bs_table[3] = 0x03030303;
242*495ae853SAndroid Build Coastguard Worker pu4_bs_table[5] = 0x03030303;
243*495ae853SAndroid Build Coastguard Worker pu4_bs_table[6] = 0x03030303;
244*495ae853SAndroid Build Coastguard Worker pu4_bs_table[7] = 0x03030303;
245*495ae853SAndroid Build Coastguard Worker }
246*495ae853SAndroid Build Coastguard Worker else
247*495ae853SAndroid Build Coastguard Worker {
248*495ae853SAndroid Build Coastguard Worker UWORD32 u4_is_non16x16 = !!(u1_cur_mb_type & D_PRED_NON_16x16);
249*495ae853SAndroid Build Coastguard Worker UWORD32 u4_is_b =
250*495ae853SAndroid Build Coastguard Worker (ps_dec->ps_computebs_cur_slice->slice_type == B_SLICE);
251*495ae853SAndroid Build Coastguard Worker
252*495ae853SAndroid Build Coastguard Worker
253*495ae853SAndroid Build Coastguard Worker
254*495ae853SAndroid Build Coastguard Worker
255*495ae853SAndroid Build Coastguard Worker
256*495ae853SAndroid Build Coastguard Worker
257*495ae853SAndroid Build Coastguard Worker ih264d_fill_bs2_horz_vert(pu4_bs_table, u2_left_csbp, u2_top_csbp,
258*495ae853SAndroid Build Coastguard Worker u2_cur_csbp, gau4_ih264d_packed_bs2,
259*495ae853SAndroid Build Coastguard Worker gau2_ih264d_4x4_v2h_reorder);
260*495ae853SAndroid Build Coastguard Worker
261*495ae853SAndroid Build Coastguard Worker if(u4_leftmbtype & D_INTRA_MB)
262*495ae853SAndroid Build Coastguard Worker pu4_bs_table[4] = 0x04040404;
263*495ae853SAndroid Build Coastguard Worker
264*495ae853SAndroid Build Coastguard Worker if(u1_top_mb_typ & D_INTRA_MB)
265*495ae853SAndroid Build Coastguard Worker pu4_bs_table[0] = u4_cur_mb_fld ? 0x03030303 : 0x04040404;
266*495ae853SAndroid Build Coastguard Worker
267*495ae853SAndroid Build Coastguard Worker ps_dec->pf_fill_bs1[u4_is_b][u4_is_non16x16](
268*495ae853SAndroid Build Coastguard Worker ps_cur_mv_pred, ps_top_mv_pred, apv_map_ref_idx_to_poc,
269*495ae853SAndroid Build Coastguard Worker pu4_bs_table, ps_left_mv_pred,
270*495ae853SAndroid Build Coastguard Worker &(ps_dec->ps_left_mvpred_addr[u1_pingpong][1]),
271*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_top_mb->u4_pic_addrress,
272*495ae853SAndroid Build Coastguard Worker (4 >> u4_cur_mb_fld));
273*495ae853SAndroid Build Coastguard Worker }
274*495ae853SAndroid Build Coastguard Worker
275*495ae853SAndroid Build Coastguard Worker {
276*495ae853SAndroid Build Coastguard Worker void ** pu4_map_ref_idx_to_poc_l1 = apv_map_ref_idx_to_poc +
277*495ae853SAndroid Build Coastguard Worker POC_LIST_L0_TO_L1_DIFF;
278*495ae853SAndroid Build Coastguard Worker {
279*495ae853SAndroid Build Coastguard Worker /* Store Parameter for Top MvPred refernce frame Address */
280*495ae853SAndroid Build Coastguard Worker
281*495ae853SAndroid Build Coastguard Worker void ** ppv_top_mv_pred_addr = ps_cur_mb_info->ps_curmb->u4_pic_addrress;
282*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refTop0 = (ps_cur_mv_pred + 12)->i1_ref_frame;
283*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refTop1 = (ps_cur_mv_pred + 14)->i1_ref_frame;
284*495ae853SAndroid Build Coastguard Worker
285*495ae853SAndroid Build Coastguard Worker /* Store Left addresses for Next Mb */
286*495ae853SAndroid Build Coastguard Worker void ** ppv_left_mv_pred_addr =
287*495ae853SAndroid Build Coastguard Worker ps_dec->ps_left_mvpred_addr[!u1_pingpong][1].u4_add;
288*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refleft0 = (ps_cur_mv_pred + 3)->i1_ref_frame;
289*495ae853SAndroid Build Coastguard Worker
290*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refTop0[0]];
291*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refTop0[1]];
292*495ae853SAndroid Build Coastguard Worker
293*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
294*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
295*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
296*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
297*495ae853SAndroid Build Coastguard Worker
298*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refleft0[0]];
299*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refleft0[1]];
300*495ae853SAndroid Build Coastguard Worker
301*495ae853SAndroid Build Coastguard Worker /* Storing the leftMbtype for next Mb */
302*495ae853SAndroid Build Coastguard Worker ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type;
303*495ae853SAndroid Build Coastguard Worker
304*495ae853SAndroid Build Coastguard Worker }
305*495ae853SAndroid Build Coastguard Worker }
306*495ae853SAndroid Build Coastguard Worker
307*495ae853SAndroid Build Coastguard Worker /* For transform 8x8 disable deblocking of the intrernal edges of a 8x8 block */
308*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_tran_form8x8)
309*495ae853SAndroid Build Coastguard Worker {
310*495ae853SAndroid Build Coastguard Worker pu4_bs_table[1] = 0;
311*495ae853SAndroid Build Coastguard Worker pu4_bs_table[3] = 0;
312*495ae853SAndroid Build Coastguard Worker pu4_bs_table[5] = 0;
313*495ae853SAndroid Build Coastguard Worker pu4_bs_table[7] = 0;
314*495ae853SAndroid Build Coastguard Worker }
315*495ae853SAndroid Build Coastguard Worker }
316*495ae853SAndroid Build Coastguard Worker
317*495ae853SAndroid Build Coastguard Worker
ih264d_check_mb_map_deblk(dec_struct_t * ps_dec,UWORD32 deblk_mb_grp,tfr_ctxt_t * ps_tfr_cxt,UWORD32 u4_check_mb_map)318*495ae853SAndroid Build Coastguard Worker void ih264d_check_mb_map_deblk(dec_struct_t *ps_dec,
319*495ae853SAndroid Build Coastguard Worker UWORD32 deblk_mb_grp,
320*495ae853SAndroid Build Coastguard Worker tfr_ctxt_t *ps_tfr_cxt,
321*495ae853SAndroid Build Coastguard Worker UWORD32 u4_check_mb_map)
322*495ae853SAndroid Build Coastguard Worker {
323*495ae853SAndroid Build Coastguard Worker UWORD32 i = 0;
324*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mb_num;
325*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cond;
326*495ae853SAndroid Build Coastguard Worker volatile UWORD8 *mb_map = ps_dec->pu1_recon_mb_map;
327*495ae853SAndroid Build Coastguard Worker const WORD32 i4_cb_qp_idx_ofst =
328*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_pps->i1_chroma_qp_index_offset;
329*495ae853SAndroid Build Coastguard Worker const WORD32 i4_cr_qp_idx_ofst =
330*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset;
331*495ae853SAndroid Build Coastguard Worker
332*495ae853SAndroid Build Coastguard Worker UWORD32 u4_wd_y, u4_wd_uv;
333*495ae853SAndroid Build Coastguard Worker UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
334*495ae853SAndroid Build Coastguard Worker
335*495ae853SAndroid Build Coastguard Worker
336*495ae853SAndroid Build Coastguard Worker u4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
337*495ae853SAndroid Build Coastguard Worker u4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
338*495ae853SAndroid Build Coastguard Worker
339*495ae853SAndroid Build Coastguard Worker
340*495ae853SAndroid Build Coastguard Worker for(i = 0; i < deblk_mb_grp; i++)
341*495ae853SAndroid Build Coastguard Worker {
342*495ae853SAndroid Build Coastguard Worker WORD32 nop_cnt = 8*128;
343*495ae853SAndroid Build Coastguard Worker while(u4_check_mb_map == 1)
344*495ae853SAndroid Build Coastguard Worker {
345*495ae853SAndroid Build Coastguard Worker u4_mb_num = ps_dec->u4_cur_deblk_mb_num;
346*495ae853SAndroid Build Coastguard Worker /*we wait for the right mb because of intra pred data dependency*/
347*495ae853SAndroid Build Coastguard Worker u4_mb_num = MIN(u4_mb_num + 1, (ps_dec->u4_deblk_mb_y + 1) * ps_dec->u2_frm_wd_in_mbs - 1);
348*495ae853SAndroid Build Coastguard Worker CHECK_MB_MAP_BYTE(u4_mb_num, mb_map, u4_cond);
349*495ae853SAndroid Build Coastguard Worker
350*495ae853SAndroid Build Coastguard Worker if(u4_cond)
351*495ae853SAndroid Build Coastguard Worker {
352*495ae853SAndroid Build Coastguard Worker break;
353*495ae853SAndroid Build Coastguard Worker }
354*495ae853SAndroid Build Coastguard Worker else
355*495ae853SAndroid Build Coastguard Worker {
356*495ae853SAndroid Build Coastguard Worker if(nop_cnt > 0)
357*495ae853SAndroid Build Coastguard Worker {
358*495ae853SAndroid Build Coastguard Worker nop_cnt -= 128;
359*495ae853SAndroid Build Coastguard Worker NOP(128);
360*495ae853SAndroid Build Coastguard Worker }
361*495ae853SAndroid Build Coastguard Worker else
362*495ae853SAndroid Build Coastguard Worker {
363*495ae853SAndroid Build Coastguard Worker nop_cnt = 8*128;
364*495ae853SAndroid Build Coastguard Worker ithread_yield();
365*495ae853SAndroid Build Coastguard Worker }
366*495ae853SAndroid Build Coastguard Worker }
367*495ae853SAndroid Build Coastguard Worker }
368*495ae853SAndroid Build Coastguard Worker
369*495ae853SAndroid Build Coastguard Worker ih264d_deblock_mb_nonmbaff(ps_dec, ps_tfr_cxt,
370*495ae853SAndroid Build Coastguard Worker i4_cb_qp_idx_ofst, i4_cr_qp_idx_ofst,
371*495ae853SAndroid Build Coastguard Worker u4_wd_y, u4_wd_uv);
372*495ae853SAndroid Build Coastguard Worker
373*495ae853SAndroid Build Coastguard Worker
374*495ae853SAndroid Build Coastguard Worker }
375*495ae853SAndroid Build Coastguard Worker
376*495ae853SAndroid Build Coastguard Worker
377*495ae853SAndroid Build Coastguard Worker }
ih264d_recon_deblk_slice(dec_struct_t * ps_dec,tfr_ctxt_t * ps_tfr_cxt)378*495ae853SAndroid Build Coastguard Worker void ih264d_recon_deblk_slice(dec_struct_t *ps_dec, tfr_ctxt_t *ps_tfr_cxt)
379*495ae853SAndroid Build Coastguard Worker {
380*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *p_cur_mb;
381*495ae853SAndroid Build Coastguard Worker UWORD32 u4_max_addr;
382*495ae853SAndroid Build Coastguard Worker WORD32 i;
383*495ae853SAndroid Build Coastguard Worker UWORD32 u1_mb_aff;
384*495ae853SAndroid Build Coastguard Worker UWORD16 u2_slice_num;
385*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mb_num;
386*495ae853SAndroid Build Coastguard Worker UWORD16 u2_first_mb_in_slice;
387*495ae853SAndroid Build Coastguard Worker UWORD32 i2_pic_wdin_mbs;
388*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_mbsleft, u1_end_of_row;
389*495ae853SAndroid Build Coastguard Worker UWORD8 u1_mbaff;
390*495ae853SAndroid Build Coastguard Worker UWORD16 i16_mb_x, i16_mb_y;
391*495ae853SAndroid Build Coastguard Worker WORD32 j;
392*495ae853SAndroid Build Coastguard Worker dec_mb_info_t * ps_cur_mb_info;
393*495ae853SAndroid Build Coastguard Worker UWORD32 u1_slice_type, u1_B;
394*495ae853SAndroid Build Coastguard Worker WORD32 u1_skip_th;
395*495ae853SAndroid Build Coastguard Worker UWORD32 u1_ipcm_th;
396*495ae853SAndroid Build Coastguard Worker WORD32 ret;
397*495ae853SAndroid Build Coastguard Worker tfr_ctxt_t *ps_trns_addr;
398*495ae853SAndroid Build Coastguard Worker UWORD32 u4_frame_stride;
399*495ae853SAndroid Build Coastguard Worker UWORD32 x_offset, y_offset;
400*495ae853SAndroid Build Coastguard Worker UWORD32 u4_slice_end;
401*495ae853SAndroid Build Coastguard Worker pad_mgr_t *ps_pad_mgr ;
402*495ae853SAndroid Build Coastguard Worker
403*495ae853SAndroid Build Coastguard Worker /*check for mb map of first mb in slice to ensure slice header is parsed*/
404*495ae853SAndroid Build Coastguard Worker while(1)
405*495ae853SAndroid Build Coastguard Worker {
406*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mb_num = ps_dec->cur_recon_mb_num;
407*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cond = 0;
408*495ae853SAndroid Build Coastguard Worker WORD32 nop_cnt = 8*128;
409*495ae853SAndroid Build Coastguard Worker
410*495ae853SAndroid Build Coastguard Worker CHECK_MB_MAP_BYTE(u4_mb_num, ps_dec->pu1_recon_mb_map, u4_cond);
411*495ae853SAndroid Build Coastguard Worker if(u4_cond)
412*495ae853SAndroid Build Coastguard Worker {
413*495ae853SAndroid Build Coastguard Worker break;
414*495ae853SAndroid Build Coastguard Worker }
415*495ae853SAndroid Build Coastguard Worker else
416*495ae853SAndroid Build Coastguard Worker {
417*495ae853SAndroid Build Coastguard Worker if(nop_cnt > 0)
418*495ae853SAndroid Build Coastguard Worker {
419*495ae853SAndroid Build Coastguard Worker nop_cnt -= 128;
420*495ae853SAndroid Build Coastguard Worker NOP(128);
421*495ae853SAndroid Build Coastguard Worker }
422*495ae853SAndroid Build Coastguard Worker else
423*495ae853SAndroid Build Coastguard Worker {
424*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_output_present &&
425*495ae853SAndroid Build Coastguard Worker (ps_dec->u4_fmt_conv_cur_row < ps_dec->s_disp_frame_info.u4_y_ht))
426*495ae853SAndroid Build Coastguard Worker {
427*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows =
428*495ae853SAndroid Build Coastguard Worker MIN(FMT_CONV_NUM_ROWS,
429*495ae853SAndroid Build Coastguard Worker (ps_dec->s_disp_frame_info.u4_y_ht
430*495ae853SAndroid Build Coastguard Worker - ps_dec->u4_fmt_conv_cur_row));
431*495ae853SAndroid Build Coastguard Worker ih264d_format_convert(ps_dec, &(ps_dec->s_disp_op),
432*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row,
433*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows);
434*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row += ps_dec->u4_fmt_conv_num_rows;
435*495ae853SAndroid Build Coastguard Worker }
436*495ae853SAndroid Build Coastguard Worker else
437*495ae853SAndroid Build Coastguard Worker {
438*495ae853SAndroid Build Coastguard Worker nop_cnt = 8*128;
439*495ae853SAndroid Build Coastguard Worker ithread_yield();
440*495ae853SAndroid Build Coastguard Worker }
441*495ae853SAndroid Build Coastguard Worker }
442*495ae853SAndroid Build Coastguard Worker DEBUG_THREADS_PRINTF("waiting for mb mapcur_dec_mb_num = %d,ps_dec->u2_cur_mb_addr = %d\n",u2_cur_dec_mb_num,
443*495ae853SAndroid Build Coastguard Worker ps_dec->u2_cur_mb_addr);
444*495ae853SAndroid Build Coastguard Worker
445*495ae853SAndroid Build Coastguard Worker }
446*495ae853SAndroid Build Coastguard Worker }
447*495ae853SAndroid Build Coastguard Worker
448*495ae853SAndroid Build Coastguard Worker u4_max_addr = ps_dec->ps_cur_sps->u2_max_mb_addr;
449*495ae853SAndroid Build Coastguard Worker u1_mb_aff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
450*495ae853SAndroid Build Coastguard Worker u2_first_mb_in_slice = ps_dec->ps_computebs_cur_slice->u4_first_mb_in_slice;
451*495ae853SAndroid Build Coastguard Worker i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
452*495ae853SAndroid Build Coastguard Worker u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
453*495ae853SAndroid Build Coastguard Worker ps_pad_mgr = &ps_dec->s_pad_mgr;
454*495ae853SAndroid Build Coastguard Worker
455*495ae853SAndroid Build Coastguard Worker if(u2_first_mb_in_slice == 0)
456*495ae853SAndroid Build Coastguard Worker ih264d_init_deblk_tfr_ctxt(ps_dec, ps_pad_mgr, ps_tfr_cxt,
457*495ae853SAndroid Build Coastguard Worker ps_dec->u2_frm_wd_in_mbs, 0);
458*495ae853SAndroid Build Coastguard Worker
459*495ae853SAndroid Build Coastguard Worker
460*495ae853SAndroid Build Coastguard Worker i16_mb_x = MOD(u2_first_mb_in_slice, i2_pic_wdin_mbs);
461*495ae853SAndroid Build Coastguard Worker i16_mb_y = DIV(u2_first_mb_in_slice, i2_pic_wdin_mbs);
462*495ae853SAndroid Build Coastguard Worker i16_mb_y <<= u1_mbaff;
463*495ae853SAndroid Build Coastguard Worker ps_dec->i2_recon_thread_mb_y = i16_mb_y;
464*495ae853SAndroid Build Coastguard Worker u4_frame_stride = ps_dec->u2_frm_wd_y
465*495ae853SAndroid Build Coastguard Worker << ps_dec->ps_cur_slice->u1_field_pic_flag;
466*495ae853SAndroid Build Coastguard Worker
467*495ae853SAndroid Build Coastguard Worker x_offset = i16_mb_x << 4;
468*495ae853SAndroid Build Coastguard Worker y_offset = (i16_mb_y * u4_frame_stride) << 4;
469*495ae853SAndroid Build Coastguard Worker ps_trns_addr = &ps_dec->s_tran_iprecon;
470*495ae853SAndroid Build Coastguard Worker
471*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + x_offset + y_offset;
472*495ae853SAndroid Build Coastguard Worker
473*495ae853SAndroid Build Coastguard Worker u4_frame_stride = ps_dec->u2_frm_wd_uv
474*495ae853SAndroid Build Coastguard Worker << ps_dec->ps_cur_slice->u1_field_pic_flag;
475*495ae853SAndroid Build Coastguard Worker x_offset >>= 1;
476*495ae853SAndroid Build Coastguard Worker y_offset = (i16_mb_y * u4_frame_stride) << 3;
477*495ae853SAndroid Build Coastguard Worker
478*495ae853SAndroid Build Coastguard Worker x_offset *= YUV420SP_FACTOR;
479*495ae853SAndroid Build Coastguard Worker
480*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + x_offset + y_offset;
481*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + x_offset + y_offset;
482*495ae853SAndroid Build Coastguard Worker
483*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
484*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
485*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
486*495ae853SAndroid Build Coastguard Worker
487*495ae853SAndroid Build Coastguard Worker ps_dec->cur_recon_mb_num = u2_first_mb_in_slice << u1_mbaff;
488*495ae853SAndroid Build Coastguard Worker
489*495ae853SAndroid Build Coastguard Worker u4_slice_end = 0;
490*495ae853SAndroid Build Coastguard Worker ps_dec->u4_bs_cur_slice_num_mbs = 0;
491*495ae853SAndroid Build Coastguard Worker ps_dec->u4_cur_bs_mb_num =
492*495ae853SAndroid Build Coastguard Worker (ps_dec->ps_computebs_cur_slice->u4_first_mb_in_slice)
493*495ae853SAndroid Build Coastguard Worker << u1_mb_aff;
494*495ae853SAndroid Build Coastguard Worker
495*495ae853SAndroid Build Coastguard Worker if(ps_dec->i1_recon_in_thread3_flag)
496*495ae853SAndroid Build Coastguard Worker {
497*495ae853SAndroid Build Coastguard Worker ps_dec->pv_proc_tu_coeff_data =
498*495ae853SAndroid Build Coastguard Worker (void *) ps_dec->ps_computebs_cur_slice->pv_tu_coeff_data_start;
499*495ae853SAndroid Build Coastguard Worker }
500*495ae853SAndroid Build Coastguard Worker
501*495ae853SAndroid Build Coastguard Worker u1_slice_type = ps_dec->ps_computebs_cur_slice->slice_type;
502*495ae853SAndroid Build Coastguard Worker
503*495ae853SAndroid Build Coastguard Worker u1_B = (u1_slice_type == B_SLICE);
504*495ae853SAndroid Build Coastguard Worker
505*495ae853SAndroid Build Coastguard Worker u1_skip_th = ((u1_slice_type != I_SLICE) ?
506*495ae853SAndroid Build Coastguard Worker (u1_B ? B_8x8 : PRED_8x8R0) : -1);
507*495ae853SAndroid Build Coastguard Worker
508*495ae853SAndroid Build Coastguard Worker u1_ipcm_th = ((u1_slice_type != I_SLICE) ? (u1_B ? 23 : 5) : 0);
509*495ae853SAndroid Build Coastguard Worker
510*495ae853SAndroid Build Coastguard Worker
511*495ae853SAndroid Build Coastguard Worker
512*495ae853SAndroid Build Coastguard Worker while(u4_slice_end != 1)
513*495ae853SAndroid Build Coastguard Worker {
514*495ae853SAndroid Build Coastguard Worker WORD32 recon_mb_grp,bs_mb_grp;
515*495ae853SAndroid Build Coastguard Worker WORD32 nop_cnt = 8*128;
516*495ae853SAndroid Build Coastguard Worker u1_num_mbsleft = ((i2_pic_wdin_mbs - i16_mb_x) << u1_mbaff);
517*495ae853SAndroid Build Coastguard Worker if(u1_num_mbsleft <= ps_dec->u1_recon_mb_grp)
518*495ae853SAndroid Build Coastguard Worker {
519*495ae853SAndroid Build Coastguard Worker recon_mb_grp = u1_num_mbsleft;
520*495ae853SAndroid Build Coastguard Worker u1_end_of_row = 1;
521*495ae853SAndroid Build Coastguard Worker i16_mb_x = 0;
522*495ae853SAndroid Build Coastguard Worker }
523*495ae853SAndroid Build Coastguard Worker else
524*495ae853SAndroid Build Coastguard Worker {
525*495ae853SAndroid Build Coastguard Worker recon_mb_grp = ps_dec->u1_recon_mb_grp;
526*495ae853SAndroid Build Coastguard Worker u1_end_of_row = 0;
527*495ae853SAndroid Build Coastguard Worker i16_mb_x += (recon_mb_grp >> u1_mbaff);
528*495ae853SAndroid Build Coastguard Worker }
529*495ae853SAndroid Build Coastguard Worker
530*495ae853SAndroid Build Coastguard Worker
531*495ae853SAndroid Build Coastguard Worker while(1)
532*495ae853SAndroid Build Coastguard Worker {
533*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cond = 0;
534*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mb_num = ps_dec->cur_recon_mb_num + recon_mb_grp - 1;
535*495ae853SAndroid Build Coastguard Worker
536*495ae853SAndroid Build Coastguard Worker /*
537*495ae853SAndroid Build Coastguard Worker * Wait for one extra mb of MC, because some chroma IQ-IT functions
538*495ae853SAndroid Build Coastguard Worker * sometimes loads the pixels of the right mb and stores with the loaded
539*495ae853SAndroid Build Coastguard Worker * values.
540*495ae853SAndroid Build Coastguard Worker */
541*495ae853SAndroid Build Coastguard Worker u4_mb_num = MIN(u4_mb_num + 1, (ps_dec->i2_recon_thread_mb_y + 1) * i2_pic_wdin_mbs - 1);
542*495ae853SAndroid Build Coastguard Worker
543*495ae853SAndroid Build Coastguard Worker CHECK_MB_MAP_BYTE(u4_mb_num, ps_dec->pu1_recon_mb_map, u4_cond);
544*495ae853SAndroid Build Coastguard Worker if(u4_cond)
545*495ae853SAndroid Build Coastguard Worker {
546*495ae853SAndroid Build Coastguard Worker break;
547*495ae853SAndroid Build Coastguard Worker }
548*495ae853SAndroid Build Coastguard Worker else
549*495ae853SAndroid Build Coastguard Worker {
550*495ae853SAndroid Build Coastguard Worker if(nop_cnt > 0)
551*495ae853SAndroid Build Coastguard Worker {
552*495ae853SAndroid Build Coastguard Worker nop_cnt -= 128;
553*495ae853SAndroid Build Coastguard Worker NOP(128);
554*495ae853SAndroid Build Coastguard Worker }
555*495ae853SAndroid Build Coastguard Worker else
556*495ae853SAndroid Build Coastguard Worker {
557*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_output_present &&
558*495ae853SAndroid Build Coastguard Worker (ps_dec->u4_fmt_conv_cur_row < ps_dec->s_disp_frame_info.u4_y_ht))
559*495ae853SAndroid Build Coastguard Worker {
560*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows =
561*495ae853SAndroid Build Coastguard Worker MIN(FMT_CONV_NUM_ROWS,
562*495ae853SAndroid Build Coastguard Worker (ps_dec->s_disp_frame_info.u4_y_ht
563*495ae853SAndroid Build Coastguard Worker - ps_dec->u4_fmt_conv_cur_row));
564*495ae853SAndroid Build Coastguard Worker ih264d_format_convert(ps_dec, &(ps_dec->s_disp_op),
565*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row,
566*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows);
567*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row += ps_dec->u4_fmt_conv_num_rows;
568*495ae853SAndroid Build Coastguard Worker }
569*495ae853SAndroid Build Coastguard Worker else
570*495ae853SAndroid Build Coastguard Worker {
571*495ae853SAndroid Build Coastguard Worker nop_cnt = 8*128;
572*495ae853SAndroid Build Coastguard Worker ithread_yield();
573*495ae853SAndroid Build Coastguard Worker }
574*495ae853SAndroid Build Coastguard Worker }
575*495ae853SAndroid Build Coastguard Worker }
576*495ae853SAndroid Build Coastguard Worker }
577*495ae853SAndroid Build Coastguard Worker
578*495ae853SAndroid Build Coastguard Worker for(j = 0; j < recon_mb_grp; j++)
579*495ae853SAndroid Build Coastguard Worker {
580*495ae853SAndroid Build Coastguard Worker GET_SLICE_NUM_MAP(ps_dec->pu2_slice_num_map, ps_dec->cur_recon_mb_num,
581*495ae853SAndroid Build Coastguard Worker u2_slice_num);
582*495ae853SAndroid Build Coastguard Worker
583*495ae853SAndroid Build Coastguard Worker if(u2_slice_num != ps_dec->u2_cur_slice_num_bs)
584*495ae853SAndroid Build Coastguard Worker {
585*495ae853SAndroid Build Coastguard Worker u4_slice_end = 1;
586*495ae853SAndroid Build Coastguard Worker break;
587*495ae853SAndroid Build Coastguard Worker }
588*495ae853SAndroid Build Coastguard Worker if(ps_dec->i1_recon_in_thread3_flag)
589*495ae853SAndroid Build Coastguard Worker {
590*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info = &ps_dec->ps_frm_mb_info[ps_dec->cur_recon_mb_num];
591*495ae853SAndroid Build Coastguard Worker
592*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_mb_type <= u1_skip_th)
593*495ae853SAndroid Build Coastguard Worker {
594*495ae853SAndroid Build Coastguard Worker ih264d_process_inter_mb(ps_dec, ps_cur_mb_info, j);
595*495ae853SAndroid Build Coastguard Worker }
596*495ae853SAndroid Build Coastguard Worker else if(ps_cur_mb_info->u1_mb_type != MB_SKIP)
597*495ae853SAndroid Build Coastguard Worker {
598*495ae853SAndroid Build Coastguard Worker if((u1_ipcm_th + 25) != ps_cur_mb_info->u1_mb_type)
599*495ae853SAndroid Build Coastguard Worker {
600*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_mb_type -= (u1_skip_th + 1);
601*495ae853SAndroid Build Coastguard Worker ih264d_process_intra_mb(ps_dec, ps_cur_mb_info, j);
602*495ae853SAndroid Build Coastguard Worker }
603*495ae853SAndroid Build Coastguard Worker }
604*495ae853SAndroid Build Coastguard Worker
605*495ae853SAndroid Build Coastguard Worker ih264d_copy_intra_pred_line(ps_dec, ps_cur_mb_info, j);
606*495ae853SAndroid Build Coastguard Worker }
607*495ae853SAndroid Build Coastguard Worker ps_dec->cur_recon_mb_num++;
608*495ae853SAndroid Build Coastguard Worker }
609*495ae853SAndroid Build Coastguard Worker
610*495ae853SAndroid Build Coastguard Worker if(j != recon_mb_grp)
611*495ae853SAndroid Build Coastguard Worker {
612*495ae853SAndroid Build Coastguard Worker u1_end_of_row = 0;
613*495ae853SAndroid Build Coastguard Worker }
614*495ae853SAndroid Build Coastguard Worker
615*495ae853SAndroid Build Coastguard Worker {
616*495ae853SAndroid Build Coastguard Worker tfr_ctxt_t *ps_trns_addr = &ps_dec->s_tran_iprecon;
617*495ae853SAndroid Build Coastguard Worker UWORD16 u2_mb_y;
618*495ae853SAndroid Build Coastguard Worker
619*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_dest_y += ps_trns_addr->u4_inc_y[u1_end_of_row];
620*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_dest_u += ps_trns_addr->u4_inc_uv[u1_end_of_row];
621*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_dest_v += ps_trns_addr->u4_inc_uv[u1_end_of_row];
622*495ae853SAndroid Build Coastguard Worker
623*495ae853SAndroid Build Coastguard Worker if(u1_end_of_row)
624*495ae853SAndroid Build Coastguard Worker {
625*495ae853SAndroid Build Coastguard Worker ps_dec->i2_recon_thread_mb_y += (1 << u1_mbaff);
626*495ae853SAndroid Build Coastguard Worker u2_mb_y = ps_dec->i2_recon_thread_mb_y;
627*495ae853SAndroid Build Coastguard Worker y_offset = (u2_mb_y * u4_frame_stride) << 4;
628*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + y_offset;
629*495ae853SAndroid Build Coastguard Worker
630*495ae853SAndroid Build Coastguard Worker u4_frame_stride = ps_dec->u2_frm_wd_uv
631*495ae853SAndroid Build Coastguard Worker << ps_dec->ps_cur_slice->u1_field_pic_flag;
632*495ae853SAndroid Build Coastguard Worker y_offset = (u2_mb_y * u4_frame_stride) << 3;
633*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + y_offset;
634*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + y_offset;
635*495ae853SAndroid Build Coastguard Worker
636*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
637*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
638*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
639*495ae853SAndroid Build Coastguard Worker
640*495ae853SAndroid Build Coastguard Worker }
641*495ae853SAndroid Build Coastguard Worker }
642*495ae853SAndroid Build Coastguard Worker
643*495ae853SAndroid Build Coastguard Worker bs_mb_grp = j;
644*495ae853SAndroid Build Coastguard Worker /* Compute BS for NMB group*/
645*495ae853SAndroid Build Coastguard Worker for(i = 0; i < bs_mb_grp; i++)
646*495ae853SAndroid Build Coastguard Worker {
647*495ae853SAndroid Build Coastguard Worker p_cur_mb = &ps_dec->ps_frm_mb_info[ps_dec->u4_cur_bs_mb_num];
648*495ae853SAndroid Build Coastguard Worker
649*495ae853SAndroid Build Coastguard Worker DEBUG_THREADS_PRINTF("ps_dec->u4_cur_bs_mb_num = %d\n",ps_dec->u4_cur_bs_mb_num);
650*495ae853SAndroid Build Coastguard Worker ih264d_compute_bs_non_mbaff_thread(ps_dec, p_cur_mb,
651*495ae853SAndroid Build Coastguard Worker ps_dec->u4_cur_bs_mb_num);
652*495ae853SAndroid Build Coastguard Worker ps_dec->u4_cur_bs_mb_num++;
653*495ae853SAndroid Build Coastguard Worker ps_dec->u4_bs_cur_slice_num_mbs++;
654*495ae853SAndroid Build Coastguard Worker
655*495ae853SAndroid Build Coastguard Worker }
656*495ae853SAndroid Build Coastguard Worker
657*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_cur_bs_mb_num > u4_max_addr)
658*495ae853SAndroid Build Coastguard Worker {
659*495ae853SAndroid Build Coastguard Worker u4_slice_end = 1;
660*495ae853SAndroid Build Coastguard Worker }
661*495ae853SAndroid Build Coastguard Worker
662*495ae853SAndroid Build Coastguard Worker /*deblock MB group*/
663*495ae853SAndroid Build Coastguard Worker {
664*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_mbs;
665*495ae853SAndroid Build Coastguard Worker
666*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_cur_bs_mb_num > ps_dec->u4_cur_deblk_mb_num)
667*495ae853SAndroid Build Coastguard Worker {
668*495ae853SAndroid Build Coastguard Worker if(u1_end_of_row)
669*495ae853SAndroid Build Coastguard Worker {
670*495ae853SAndroid Build Coastguard Worker u4_num_mbs = ps_dec->u4_cur_bs_mb_num
671*495ae853SAndroid Build Coastguard Worker - ps_dec->u4_cur_deblk_mb_num;
672*495ae853SAndroid Build Coastguard Worker }
673*495ae853SAndroid Build Coastguard Worker else
674*495ae853SAndroid Build Coastguard Worker {
675*495ae853SAndroid Build Coastguard Worker u4_num_mbs = ps_dec->u4_cur_bs_mb_num
676*495ae853SAndroid Build Coastguard Worker - ps_dec->u4_cur_deblk_mb_num - 1;
677*495ae853SAndroid Build Coastguard Worker }
678*495ae853SAndroid Build Coastguard Worker }
679*495ae853SAndroid Build Coastguard Worker else
680*495ae853SAndroid Build Coastguard Worker u4_num_mbs = 0;
681*495ae853SAndroid Build Coastguard Worker
682*495ae853SAndroid Build Coastguard Worker ih264d_check_mb_map_deblk(ps_dec, u4_num_mbs, ps_tfr_cxt,0);
683*495ae853SAndroid Build Coastguard Worker }
684*495ae853SAndroid Build Coastguard Worker
685*495ae853SAndroid Build Coastguard Worker }
686*495ae853SAndroid Build Coastguard Worker }
687*495ae853SAndroid Build Coastguard Worker
ih264d_recon_deblk_thread(dec_struct_t * ps_dec)688*495ae853SAndroid Build Coastguard Worker void ih264d_recon_deblk_thread(dec_struct_t *ps_dec)
689*495ae853SAndroid Build Coastguard Worker {
690*495ae853SAndroid Build Coastguard Worker tfr_ctxt_t s_tfr_ctxt;
691*495ae853SAndroid Build Coastguard Worker tfr_ctxt_t *ps_tfr_cxt = &s_tfr_ctxt; // = &ps_dec->s_tran_addrecon;
692*495ae853SAndroid Build Coastguard Worker
693*495ae853SAndroid Build Coastguard Worker
694*495ae853SAndroid Build Coastguard Worker UWORD32 yield_cnt = 0;
695*495ae853SAndroid Build Coastguard Worker UWORD32 ret;
696*495ae853SAndroid Build Coastguard Worker
697*495ae853SAndroid Build Coastguard Worker ithread_set_name("ih264d_recon_deblk_thread");
698*495ae853SAndroid Build Coastguard Worker
699*495ae853SAndroid Build Coastguard Worker while(1)
700*495ae853SAndroid Build Coastguard Worker {
701*495ae853SAndroid Build Coastguard Worker if(ps_dec->i4_threads_active)
702*495ae853SAndroid Build Coastguard Worker {
703*495ae853SAndroid Build Coastguard Worker ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[1]);
704*495ae853SAndroid Build Coastguard Worker if(OK != ret)
705*495ae853SAndroid Build Coastguard Worker break;
706*495ae853SAndroid Build Coastguard Worker
707*495ae853SAndroid Build Coastguard Worker while(ps_dec->ai4_process_start[1] != PROC_START)
708*495ae853SAndroid Build Coastguard Worker {
709*495ae853SAndroid Build Coastguard Worker ithread_cond_wait(ps_dec->apv_proc_start_condition[1],
710*495ae853SAndroid Build Coastguard Worker ps_dec->apv_proc_start_mutex[1]);
711*495ae853SAndroid Build Coastguard Worker }
712*495ae853SAndroid Build Coastguard Worker ps_dec->ai4_process_start[1] = PROC_IN_PROGRESS;
713*495ae853SAndroid Build Coastguard Worker
714*495ae853SAndroid Build Coastguard Worker ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[1]);
715*495ae853SAndroid Build Coastguard Worker if(OK != ret || ps_dec->i4_break_threads == 1)
716*495ae853SAndroid Build Coastguard Worker break;
717*495ae853SAndroid Build Coastguard Worker }
718*495ae853SAndroid Build Coastguard Worker
719*495ae853SAndroid Build Coastguard Worker while(1)
720*495ae853SAndroid Build Coastguard Worker {
721*495ae853SAndroid Build Coastguard Worker
722*495ae853SAndroid Build Coastguard Worker DEBUG_THREADS_PRINTF(" Entering compute bs slice\n");
723*495ae853SAndroid Build Coastguard Worker ih264d_recon_deblk_slice(ps_dec, ps_tfr_cxt);
724*495ae853SAndroid Build Coastguard Worker
725*495ae853SAndroid Build Coastguard Worker DEBUG_THREADS_PRINTF(" Exit compute bs slice \n");
726*495ae853SAndroid Build Coastguard Worker
727*495ae853SAndroid Build Coastguard Worker if(ps_dec->cur_recon_mb_num > ps_dec->ps_cur_sps->u2_max_mb_addr)
728*495ae853SAndroid Build Coastguard Worker {
729*495ae853SAndroid Build Coastguard Worker break;
730*495ae853SAndroid Build Coastguard Worker }
731*495ae853SAndroid Build Coastguard Worker else
732*495ae853SAndroid Build Coastguard Worker {
733*495ae853SAndroid Build Coastguard Worker ps_dec->ps_computebs_cur_slice++;
734*495ae853SAndroid Build Coastguard Worker ps_dec->u2_cur_slice_num_bs++;
735*495ae853SAndroid Build Coastguard Worker }
736*495ae853SAndroid Build Coastguard Worker DEBUG_THREADS_PRINTF("CBS thread:Got next slice/end of frame signal \n ");
737*495ae853SAndroid Build Coastguard Worker
738*495ae853SAndroid Build Coastguard Worker }
739*495ae853SAndroid Build Coastguard Worker
740*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_output_present &&
741*495ae853SAndroid Build Coastguard Worker (3 == ps_dec->u4_num_cores) &&
742*495ae853SAndroid Build Coastguard Worker (ps_dec->u4_fmt_conv_cur_row < ps_dec->s_disp_frame_info.u4_y_ht))
743*495ae853SAndroid Build Coastguard Worker {
744*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows =
745*495ae853SAndroid Build Coastguard Worker (ps_dec->s_disp_frame_info.u4_y_ht
746*495ae853SAndroid Build Coastguard Worker - ps_dec->u4_fmt_conv_cur_row);
747*495ae853SAndroid Build Coastguard Worker ih264d_format_convert(ps_dec, &(ps_dec->s_disp_op),
748*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row,
749*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows);
750*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row += ps_dec->u4_fmt_conv_num_rows;
751*495ae853SAndroid Build Coastguard Worker
752*495ae853SAndroid Build Coastguard Worker }
753*495ae853SAndroid Build Coastguard Worker if(ps_dec->i4_threads_active)
754*495ae853SAndroid Build Coastguard Worker {
755*495ae853SAndroid Build Coastguard Worker ret = ithread_mutex_lock(ps_dec->apv_proc_done_mutex[1]);
756*495ae853SAndroid Build Coastguard Worker if(OK != ret)
757*495ae853SAndroid Build Coastguard Worker break;
758*495ae853SAndroid Build Coastguard Worker
759*495ae853SAndroid Build Coastguard Worker ps_dec->ai4_process_done[1] = PROC_DONE;
760*495ae853SAndroid Build Coastguard Worker ithread_cond_signal(ps_dec->apv_proc_done_condition[1]);
761*495ae853SAndroid Build Coastguard Worker
762*495ae853SAndroid Build Coastguard Worker ret = ithread_mutex_unlock(ps_dec->apv_proc_done_mutex[1]);
763*495ae853SAndroid Build Coastguard Worker if(OK != ret)
764*495ae853SAndroid Build Coastguard Worker break;
765*495ae853SAndroid Build Coastguard Worker }
766*495ae853SAndroid Build Coastguard Worker else
767*495ae853SAndroid Build Coastguard Worker {
768*495ae853SAndroid Build Coastguard Worker break;
769*495ae853SAndroid Build Coastguard Worker }
770*495ae853SAndroid Build Coastguard Worker }
771*495ae853SAndroid Build Coastguard Worker }
772*495ae853SAndroid Build Coastguard Worker
773*495ae853SAndroid Build Coastguard Worker
774