1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker *
5*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker *
9*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker *
11*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker *
17*495ae853SAndroid Build Coastguard Worker *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker /*!
21*495ae853SAndroid Build Coastguard Worker **************************************************************************
22*495ae853SAndroid Build Coastguard Worker * \file ih264d_thread_parse_decode.c
23*495ae853SAndroid Build Coastguard Worker *
24*495ae853SAndroid Build Coastguard Worker * \brief
25*495ae853SAndroid Build Coastguard Worker * Contains routines that for multi-thread decoder
26*495ae853SAndroid Build Coastguard Worker *
27*495ae853SAndroid Build Coastguard Worker * Detailed_description
28*495ae853SAndroid Build Coastguard Worker *
29*495ae853SAndroid Build Coastguard Worker * \date
30*495ae853SAndroid Build Coastguard Worker * 20/02/2012
31*495ae853SAndroid Build Coastguard Worker *
32*495ae853SAndroid Build Coastguard Worker * \author ZR
33*495ae853SAndroid Build Coastguard Worker **************************************************************************
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 "ithread.h"
39*495ae853SAndroid Build Coastguard Worker #include <string.h>
40*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
41*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
42*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
43*495ae853SAndroid Build Coastguard Worker #include "ih264d_structs.h"
44*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
45*495ae853SAndroid Build Coastguard Worker #include "ih264d_mb_utils.h"
46*495ae853SAndroid Build Coastguard Worker #include "ih264d_thread_parse_decode.h"
47*495ae853SAndroid Build Coastguard Worker #include "ih264d_inter_pred.h"
48*495ae853SAndroid Build Coastguard Worker
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_deblocking.h"
52*495ae853SAndroid Build Coastguard Worker #include "ih264d_format_conv.h"
53*495ae853SAndroid Build Coastguard Worker
54*495ae853SAndroid Build Coastguard Worker void ih264d_deblock_mb_level(dec_struct_t *ps_dec,
55*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_cur_mb_info,
56*495ae853SAndroid Build Coastguard Worker UWORD32 nmb_index);
57*495ae853SAndroid Build Coastguard Worker
58*495ae853SAndroid Build Coastguard Worker void ih264d_copy_intra_pred_line(dec_struct_t *ps_dec,
59*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_cur_mb_info,
60*495ae853SAndroid Build Coastguard Worker UWORD32 nmb_index);
61*495ae853SAndroid Build Coastguard Worker
ih264d_parse_tfr_nmb(dec_struct_t * ps_dec,UWORD8 u1_mb_idx,UWORD8 u1_num_mbs,UWORD8 u1_num_mbs_next,UWORD8 u1_tfr_n_mb,UWORD8 u1_end_of_row)62*495ae853SAndroid Build Coastguard Worker void ih264d_parse_tfr_nmb(dec_struct_t * ps_dec,
63*495ae853SAndroid Build Coastguard Worker UWORD8 u1_mb_idx,
64*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_mbs,
65*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_mbs_next,
66*495ae853SAndroid Build Coastguard Worker UWORD8 u1_tfr_n_mb,
67*495ae853SAndroid Build Coastguard Worker UWORD8 u1_end_of_row)
68*495ae853SAndroid Build Coastguard Worker {
69*495ae853SAndroid Build Coastguard Worker WORD32 i, u4_mb_num;
70*495ae853SAndroid Build Coastguard Worker
71*495ae853SAndroid Build Coastguard Worker const UWORD32 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
72*495ae853SAndroid Build Coastguard Worker UWORD32 u4_n_mb_start;
73*495ae853SAndroid Build Coastguard Worker
74*495ae853SAndroid Build Coastguard Worker UNUSED(u1_mb_idx);
75*495ae853SAndroid Build Coastguard Worker UNUSED(u1_num_mbs_next);
76*495ae853SAndroid Build Coastguard Worker if(u1_tfr_n_mb)
77*495ae853SAndroid Build Coastguard Worker {
78*495ae853SAndroid Build Coastguard Worker
79*495ae853SAndroid Build Coastguard Worker
80*495ae853SAndroid Build Coastguard Worker u4_n_mb_start = (ps_dec->u2_cur_mb_addr + 1) - u1_num_mbs;
81*495ae853SAndroid Build Coastguard Worker
82*495ae853SAndroid Build Coastguard Worker // copy into s_frmMbInfo
83*495ae853SAndroid Build Coastguard Worker
84*495ae853SAndroid Build Coastguard Worker u4_mb_num = u4_n_mb_start;
85*495ae853SAndroid Build Coastguard Worker u4_mb_num = (ps_dec->u2_cur_mb_addr + 1) - u1_num_mbs;
86*495ae853SAndroid Build Coastguard Worker
87*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u1_num_mbs; i++)
88*495ae853SAndroid Build Coastguard Worker {
89*495ae853SAndroid Build Coastguard Worker UPDATE_SLICE_NUM_MAP(ps_dec->pu2_slice_num_map, u4_mb_num,
90*495ae853SAndroid Build Coastguard Worker ps_dec->u2_cur_slice_num);
91*495ae853SAndroid Build Coastguard Worker DATA_SYNC();
92*495ae853SAndroid Build Coastguard Worker UPDATE_MB_MAP_MBNUM_BYTE(ps_dec->pu1_dec_mb_map, u4_mb_num);
93*495ae853SAndroid Build Coastguard Worker
94*495ae853SAndroid Build Coastguard Worker u4_mb_num++;
95*495ae853SAndroid Build Coastguard Worker }
96*495ae853SAndroid Build Coastguard Worker
97*495ae853SAndroid Build Coastguard Worker /****************************************************************/
98*495ae853SAndroid Build Coastguard Worker /* Check for End Of Row in Next iteration */
99*495ae853SAndroid Build Coastguard Worker /****************************************************************/
100*495ae853SAndroid Build Coastguard Worker
101*495ae853SAndroid Build Coastguard Worker /****************************************************************/
102*495ae853SAndroid Build Coastguard Worker /* Transfer the Following things */
103*495ae853SAndroid Build Coastguard Worker /* N-Mb DeblkParams Data ( To Ext DeblkParams Buffer ) */
104*495ae853SAndroid Build Coastguard Worker /* N-Mb Recon Data ( To Ext Frame Buffer ) */
105*495ae853SAndroid Build Coastguard Worker /* N-Mb Intrapredline Data ( Updated Internally) */
106*495ae853SAndroid Build Coastguard Worker /* N-Mb MV Data ( To Ext MV Buffer ) */
107*495ae853SAndroid Build Coastguard Worker /* N-Mb MVTop/TopRight Data ( To Int MV Top Scratch Buffers) */
108*495ae853SAndroid Build Coastguard Worker /****************************************************************/
109*495ae853SAndroid Build Coastguard Worker
110*495ae853SAndroid Build Coastguard Worker /* Swap top and current pointers */
111*495ae853SAndroid Build Coastguard Worker
112*495ae853SAndroid Build Coastguard Worker ps_dec->s_tran_addrecon_parse.pu1_dest_y +=
113*495ae853SAndroid Build Coastguard Worker ps_dec->s_tran_addrecon_parse.u4_inc_y[u1_end_of_row];
114*495ae853SAndroid Build Coastguard Worker ps_dec->s_tran_addrecon_parse.pu1_dest_u +=
115*495ae853SAndroid Build Coastguard Worker ps_dec->s_tran_addrecon_parse.u4_inc_uv[u1_end_of_row];
116*495ae853SAndroid Build Coastguard Worker ps_dec->s_tran_addrecon_parse.pu1_dest_v +=
117*495ae853SAndroid Build Coastguard Worker ps_dec->s_tran_addrecon_parse.u4_inc_uv[u1_end_of_row];
118*495ae853SAndroid Build Coastguard Worker
119*495ae853SAndroid Build Coastguard Worker if(u1_end_of_row)
120*495ae853SAndroid Build Coastguard Worker {
121*495ae853SAndroid Build Coastguard Worker UWORD16 u2_mb_y;
122*495ae853SAndroid Build Coastguard Worker UWORD32 u4_frame_stride, y_offset;
123*495ae853SAndroid Build Coastguard Worker
124*495ae853SAndroid Build Coastguard Worker ps_dec->ps_top_mb_row = ps_dec->ps_cur_mb_row;
125*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_mb_row += ((ps_dec->u2_frm_wd_in_mbs) << u1_mbaff);
126*495ae853SAndroid Build Coastguard Worker
127*495ae853SAndroid Build Coastguard Worker u2_mb_y = ps_dec->u2_mby + (1 + u1_mbaff);
128*495ae853SAndroid Build Coastguard Worker u4_frame_stride = ps_dec->u2_frm_wd_y
129*495ae853SAndroid Build Coastguard Worker << ps_dec->ps_cur_slice->u1_field_pic_flag;
130*495ae853SAndroid Build Coastguard Worker y_offset = (u2_mb_y * u4_frame_stride) << 4;
131*495ae853SAndroid Build Coastguard Worker ps_dec->s_tran_addrecon_parse.pu1_dest_y =
132*495ae853SAndroid Build Coastguard Worker ps_dec->s_cur_pic.pu1_buf1 + y_offset;
133*495ae853SAndroid Build Coastguard Worker
134*495ae853SAndroid Build Coastguard Worker u4_frame_stride = ps_dec->u2_frm_wd_uv
135*495ae853SAndroid Build Coastguard Worker << ps_dec->ps_cur_slice->u1_field_pic_flag;
136*495ae853SAndroid Build Coastguard Worker y_offset = (u2_mb_y * u4_frame_stride) << 3;
137*495ae853SAndroid Build Coastguard Worker ps_dec->s_tran_addrecon_parse.pu1_dest_u =
138*495ae853SAndroid Build Coastguard Worker ps_dec->s_cur_pic.pu1_buf2 + y_offset;
139*495ae853SAndroid Build Coastguard Worker ps_dec->s_tran_addrecon_parse.pu1_dest_v =
140*495ae853SAndroid Build Coastguard Worker ps_dec->s_cur_pic.pu1_buf3 + y_offset;
141*495ae853SAndroid Build Coastguard Worker
142*495ae853SAndroid Build Coastguard Worker }
143*495ae853SAndroid Build Coastguard Worker
144*495ae853SAndroid Build Coastguard Worker ps_dec->ps_deblk_mbn += u1_num_mbs;
145*495ae853SAndroid Build Coastguard Worker
146*495ae853SAndroid Build Coastguard Worker /*
147*495ae853SAndroid Build Coastguard Worker * The Slice boundary is also a valid condition to transfer. So recalculate
148*495ae853SAndroid Build Coastguard Worker * the Left increment, in case the number of MBs is lesser than the
149*495ae853SAndroid Build Coastguard Worker * N MB value. c_numMbs will be equal to N of N MB if the entire N Mb is
150*495ae853SAndroid Build Coastguard Worker * decoded.
151*495ae853SAndroid Build Coastguard Worker */
152*495ae853SAndroid Build Coastguard Worker ps_dec->s_tran_addrecon.u2_mv_left_inc = ((u1_num_mbs >> u1_mbaff) - 1)
153*495ae853SAndroid Build Coastguard Worker << (4 + u1_mbaff);
154*495ae853SAndroid Build Coastguard Worker ps_dec->s_tran_addrecon.u2_mv_top_left_inc = (u1_num_mbs << 2) - 1
155*495ae853SAndroid Build Coastguard Worker - (u1_mbaff << 2);
156*495ae853SAndroid Build Coastguard Worker
157*495ae853SAndroid Build Coastguard Worker /* reassign left MV and cur MV pointers */
158*495ae853SAndroid Build Coastguard Worker ps_dec->ps_mv_left = ps_dec->ps_mv_cur
159*495ae853SAndroid Build Coastguard Worker + ps_dec->s_tran_addrecon.u2_mv_left_inc;
160*495ae853SAndroid Build Coastguard Worker
161*495ae853SAndroid Build Coastguard Worker ps_dec->ps_mv_cur += (u1_num_mbs << 4);
162*495ae853SAndroid Build Coastguard Worker ps_dec->u4_num_mbs_prev_nmb = u1_num_mbs;
163*495ae853SAndroid Build Coastguard Worker
164*495ae853SAndroid Build Coastguard Worker }
165*495ae853SAndroid Build Coastguard Worker }
166*495ae853SAndroid Build Coastguard Worker
ih264d_decode_tfr_nmb(dec_struct_t * ps_dec,UWORD8 u1_num_mbs,UWORD8 u1_num_mbs_next,UWORD8 u1_end_of_row)167*495ae853SAndroid Build Coastguard Worker void ih264d_decode_tfr_nmb(dec_struct_t * ps_dec,
168*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_mbs,
169*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_mbs_next,
170*495ae853SAndroid Build Coastguard Worker UWORD8 u1_end_of_row)
171*495ae853SAndroid Build Coastguard Worker {
172*495ae853SAndroid Build Coastguard Worker
173*495ae853SAndroid Build Coastguard Worker UWORD32 u1_end_of_row_next;
174*495ae853SAndroid Build Coastguard Worker
175*495ae853SAndroid Build Coastguard Worker const UWORD32 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
176*495ae853SAndroid Build Coastguard Worker
177*495ae853SAndroid Build Coastguard Worker /****************************************************************/
178*495ae853SAndroid Build Coastguard Worker /* Check for End Of Row in Next iteration */
179*495ae853SAndroid Build Coastguard Worker /****************************************************************/
180*495ae853SAndroid Build Coastguard Worker u1_end_of_row_next = u1_num_mbs_next &&
181*495ae853SAndroid Build Coastguard Worker ((u1_num_mbs_next) <= (ps_dec->u1_recon_mb_grp >> u1_mbaff));
182*495ae853SAndroid Build Coastguard Worker
183*495ae853SAndroid Build Coastguard Worker /****************************************************************/
184*495ae853SAndroid Build Coastguard Worker /* Transfer the Following things */
185*495ae853SAndroid Build Coastguard Worker /* N-Mb DeblkParams Data ( To Ext DeblkParams Buffer ) */
186*495ae853SAndroid Build Coastguard Worker /* N-Mb Recon Data ( To Ext Frame Buffer ) */
187*495ae853SAndroid Build Coastguard Worker /* N-Mb Intrapredline Data ( Updated Internally) */
188*495ae853SAndroid Build Coastguard Worker /* N-Mb MV Data ( To Ext MV Buffer ) */
189*495ae853SAndroid Build Coastguard Worker /* N-Mb MVTop/TopRight Data ( To Int MV Top Scratch Buffers) */
190*495ae853SAndroid Build Coastguard Worker /****************************************************************/
191*495ae853SAndroid Build Coastguard Worker if(u1_end_of_row)
192*495ae853SAndroid Build Coastguard Worker {
193*495ae853SAndroid Build Coastguard Worker ps_dec->i2_dec_thread_mb_y += (1 << u1_mbaff);
194*495ae853SAndroid Build Coastguard Worker }
195*495ae853SAndroid Build Coastguard Worker ih264d_transfer_mb_group_data(ps_dec, u1_num_mbs, u1_end_of_row,
196*495ae853SAndroid Build Coastguard Worker u1_end_of_row_next);
197*495ae853SAndroid Build Coastguard Worker
198*495ae853SAndroid Build Coastguard Worker }
199*495ae853SAndroid Build Coastguard Worker
ih264d_decode_recon_tfr_nmb_thread(dec_struct_t * ps_dec,UWORD8 u1_num_mbs,UWORD8 u1_num_mbs_next,UWORD8 u1_end_of_row)200*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_decode_recon_tfr_nmb_thread(dec_struct_t * ps_dec,
201*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_mbs,
202*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_mbs_next,
203*495ae853SAndroid Build Coastguard Worker UWORD8 u1_end_of_row)
204*495ae853SAndroid Build Coastguard Worker {
205*495ae853SAndroid Build Coastguard Worker WORD32 i,j;
206*495ae853SAndroid Build Coastguard Worker dec_mb_info_t * ps_cur_mb_info;
207*495ae853SAndroid Build Coastguard Worker UWORD32 u4_update_mbaff = 0;
208*495ae853SAndroid Build Coastguard Worker const UWORD32 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
209*495ae853SAndroid Build Coastguard Worker UWORD32 u1_slice_type, u1_B;
210*495ae853SAndroid Build Coastguard Worker WORD32 u1_skip_th;
211*495ae853SAndroid Build Coastguard Worker UWORD32 u1_ipcm_th;
212*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cond;
213*495ae853SAndroid Build Coastguard Worker UWORD16 u2_slice_num,u2_cur_dec_mb_num;
214*495ae853SAndroid Build Coastguard Worker WORD32 ret;
215*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mb_num;
216*495ae853SAndroid Build Coastguard Worker WORD32 nop_cnt = 8*128;
217*495ae853SAndroid Build Coastguard Worker u1_slice_type = ps_dec->ps_decode_cur_slice->slice_type;
218*495ae853SAndroid Build Coastguard Worker
219*495ae853SAndroid Build Coastguard Worker u1_B = (u1_slice_type == B_SLICE);
220*495ae853SAndroid Build Coastguard Worker
221*495ae853SAndroid Build Coastguard Worker u1_skip_th = ((u1_slice_type != I_SLICE) ?
222*495ae853SAndroid Build Coastguard Worker (u1_B ? B_8x8 : PRED_8x8R0) : -1);
223*495ae853SAndroid Build Coastguard Worker
224*495ae853SAndroid Build Coastguard Worker u1_ipcm_th = ((u1_slice_type != I_SLICE) ? (u1_B ? 23 : 5) : 0);
225*495ae853SAndroid Build Coastguard Worker
226*495ae853SAndroid Build Coastguard Worker u2_cur_dec_mb_num = ps_dec->cur_dec_mb_num;
227*495ae853SAndroid Build Coastguard Worker
228*495ae853SAndroid Build Coastguard Worker while(1)
229*495ae853SAndroid Build Coastguard Worker {
230*495ae853SAndroid Build Coastguard Worker
231*495ae853SAndroid Build Coastguard Worker UWORD32 u4_max_mb = (UWORD32)(ps_dec->i2_dec_thread_mb_y + (1 << u1_mbaff)) * ps_dec->u2_frm_wd_in_mbs - 1;
232*495ae853SAndroid Build Coastguard Worker u4_mb_num = u2_cur_dec_mb_num;
233*495ae853SAndroid Build Coastguard Worker /*introducing 1 MB delay*/
234*495ae853SAndroid Build Coastguard Worker u4_mb_num = MIN(u4_mb_num + u1_num_mbs + 1, u4_max_mb);
235*495ae853SAndroid Build Coastguard Worker
236*495ae853SAndroid Build Coastguard Worker CHECK_MB_MAP_BYTE(u4_mb_num, ps_dec->pu1_dec_mb_map, u4_cond);
237*495ae853SAndroid Build Coastguard Worker if(u4_cond)
238*495ae853SAndroid Build Coastguard Worker {
239*495ae853SAndroid Build Coastguard Worker break;
240*495ae853SAndroid Build Coastguard Worker }
241*495ae853SAndroid Build Coastguard Worker else
242*495ae853SAndroid Build Coastguard Worker {
243*495ae853SAndroid Build Coastguard Worker if(nop_cnt > 0)
244*495ae853SAndroid Build Coastguard Worker {
245*495ae853SAndroid Build Coastguard Worker nop_cnt -= 128;
246*495ae853SAndroid Build Coastguard Worker NOP(128);
247*495ae853SAndroid Build Coastguard Worker }
248*495ae853SAndroid Build Coastguard Worker else
249*495ae853SAndroid Build Coastguard Worker {
250*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_output_present && (2 == ps_dec->u4_num_cores) &&
251*495ae853SAndroid Build Coastguard Worker (ps_dec->u4_fmt_conv_cur_row < ps_dec->s_disp_frame_info.u4_y_ht))
252*495ae853SAndroid Build Coastguard Worker {
253*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows =
254*495ae853SAndroid Build Coastguard Worker MIN(FMT_CONV_NUM_ROWS,
255*495ae853SAndroid Build Coastguard Worker (ps_dec->s_disp_frame_info.u4_y_ht
256*495ae853SAndroid Build Coastguard Worker - ps_dec->u4_fmt_conv_cur_row));
257*495ae853SAndroid Build Coastguard Worker ih264d_format_convert(ps_dec, &(ps_dec->s_disp_op),
258*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row,
259*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows);
260*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row += ps_dec->u4_fmt_conv_num_rows;
261*495ae853SAndroid Build Coastguard Worker }
262*495ae853SAndroid Build Coastguard Worker else
263*495ae853SAndroid Build Coastguard Worker {
264*495ae853SAndroid Build Coastguard Worker nop_cnt = 8*128;
265*495ae853SAndroid Build Coastguard Worker ithread_yield();
266*495ae853SAndroid Build Coastguard Worker }
267*495ae853SAndroid Build Coastguard Worker }
268*495ae853SAndroid Build Coastguard Worker }
269*495ae853SAndroid Build Coastguard Worker }
270*495ae853SAndroid Build Coastguard Worker /* N Mb MC Loop */
271*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u1_num_mbs; i++)
272*495ae853SAndroid Build Coastguard Worker {
273*495ae853SAndroid Build Coastguard Worker u4_mb_num = u2_cur_dec_mb_num;
274*495ae853SAndroid Build Coastguard Worker
275*495ae853SAndroid Build Coastguard Worker GET_SLICE_NUM_MAP(ps_dec->pu2_slice_num_map, u2_cur_dec_mb_num,
276*495ae853SAndroid Build Coastguard Worker u2_slice_num);
277*495ae853SAndroid Build Coastguard Worker
278*495ae853SAndroid Build Coastguard Worker if(u2_slice_num != ps_dec->u2_cur_slice_num_dec_thread)
279*495ae853SAndroid Build Coastguard Worker {
280*495ae853SAndroid Build Coastguard Worker ps_dec->u4_cur_slice_decode_done = 1;
281*495ae853SAndroid Build Coastguard Worker break;
282*495ae853SAndroid Build Coastguard Worker }
283*495ae853SAndroid Build Coastguard Worker
284*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info = &ps_dec->ps_frm_mb_info[u2_cur_dec_mb_num];
285*495ae853SAndroid Build Coastguard Worker
286*495ae853SAndroid Build Coastguard Worker ps_dec->u4_dma_buf_idx = 0;
287*495ae853SAndroid Build Coastguard Worker ps_dec->u4_pred_info_idx = 0;
288*495ae853SAndroid Build Coastguard Worker
289*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_mb_type <= u1_skip_th)
290*495ae853SAndroid Build Coastguard Worker {
291*495ae853SAndroid Build Coastguard Worker WORD32 pred_cnt = 0;
292*495ae853SAndroid Build Coastguard Worker pred_info_pkd_t *ps_pred_pkd;
293*495ae853SAndroid Build Coastguard Worker UWORD32 u4_pred_info_pkd_idx;
294*495ae853SAndroid Build Coastguard Worker WORD8 i1_pred;
295*495ae853SAndroid Build Coastguard Worker
296*495ae853SAndroid Build Coastguard Worker u4_pred_info_pkd_idx = ps_cur_mb_info->u4_pred_info_pkd_idx;
297*495ae853SAndroid Build Coastguard Worker
298*495ae853SAndroid Build Coastguard Worker while(pred_cnt < ps_cur_mb_info->u1_num_pred_parts)
299*495ae853SAndroid Build Coastguard Worker {
300*495ae853SAndroid Build Coastguard Worker ps_pred_pkd = ps_dec->ps_pred_pkd + u4_pred_info_pkd_idx;
301*495ae853SAndroid Build Coastguard Worker
302*495ae853SAndroid Build Coastguard Worker ps_dec->p_form_mb_part_info_thread(ps_pred_pkd,ps_dec,
303*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u2_mbx,
304*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u2_mby,
305*495ae853SAndroid Build Coastguard Worker (i >> u1_mbaff),
306*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info);
307*495ae853SAndroid Build Coastguard Worker
308*495ae853SAndroid Build Coastguard Worker u4_pred_info_pkd_idx++;
309*495ae853SAndroid Build Coastguard Worker pred_cnt++;
310*495ae853SAndroid Build Coastguard Worker }
311*495ae853SAndroid Build Coastguard Worker ps_dec->p_mc_dec_thread(ps_dec, ps_cur_mb_info);
312*495ae853SAndroid Build Coastguard Worker }
313*495ae853SAndroid Build Coastguard Worker else if(ps_cur_mb_info->u1_mb_type == MB_SKIP)
314*495ae853SAndroid Build Coastguard Worker {
315*495ae853SAndroid Build Coastguard Worker WORD32 pred_cnt = 0;
316*495ae853SAndroid Build Coastguard Worker pred_info_pkd_t *ps_pred_pkd;
317*495ae853SAndroid Build Coastguard Worker UWORD32 u4_pred_info_pkd_idx;
318*495ae853SAndroid Build Coastguard Worker WORD8 i1_pred;
319*495ae853SAndroid Build Coastguard Worker
320*495ae853SAndroid Build Coastguard Worker u4_pred_info_pkd_idx = ps_cur_mb_info->u4_pred_info_pkd_idx;
321*495ae853SAndroid Build Coastguard Worker
322*495ae853SAndroid Build Coastguard Worker while(pred_cnt < ps_cur_mb_info->u1_num_pred_parts)
323*495ae853SAndroid Build Coastguard Worker {
324*495ae853SAndroid Build Coastguard Worker ps_pred_pkd = ps_dec->ps_pred_pkd + u4_pred_info_pkd_idx;
325*495ae853SAndroid Build Coastguard Worker
326*495ae853SAndroid Build Coastguard Worker ps_dec->p_form_mb_part_info_thread(ps_pred_pkd,ps_dec,
327*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u2_mbx,
328*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u2_mby,
329*495ae853SAndroid Build Coastguard Worker (i >> u1_mbaff),
330*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info);
331*495ae853SAndroid Build Coastguard Worker
332*495ae853SAndroid Build Coastguard Worker u4_pred_info_pkd_idx++;
333*495ae853SAndroid Build Coastguard Worker pred_cnt++;
334*495ae853SAndroid Build Coastguard Worker }
335*495ae853SAndroid Build Coastguard Worker /* Decode MB skip */
336*495ae853SAndroid Build Coastguard Worker ps_dec->p_mc_dec_thread(ps_dec, ps_cur_mb_info);
337*495ae853SAndroid Build Coastguard Worker }
338*495ae853SAndroid Build Coastguard Worker
339*495ae853SAndroid Build Coastguard Worker u2_cur_dec_mb_num++;
340*495ae853SAndroid Build Coastguard Worker }
341*495ae853SAndroid Build Coastguard Worker
342*495ae853SAndroid Build Coastguard Worker /* N Mb IQ IT RECON Loop */
343*495ae853SAndroid Build Coastguard Worker for(j = 0; j < i; j++)
344*495ae853SAndroid Build Coastguard Worker {
345*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info = &ps_dec->ps_frm_mb_info[ps_dec->cur_dec_mb_num];
346*495ae853SAndroid Build Coastguard Worker
347*495ae853SAndroid Build Coastguard Worker if((ps_dec->u4_num_cores == 2) || !ps_dec->i1_recon_in_thread3_flag)
348*495ae853SAndroid Build Coastguard Worker {
349*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_mb_type <= u1_skip_th)
350*495ae853SAndroid Build Coastguard Worker {
351*495ae853SAndroid Build Coastguard Worker ih264d_process_inter_mb(ps_dec, ps_cur_mb_info, j);
352*495ae853SAndroid Build Coastguard Worker }
353*495ae853SAndroid Build Coastguard Worker else if(ps_cur_mb_info->u1_mb_type != MB_SKIP)
354*495ae853SAndroid Build Coastguard Worker {
355*495ae853SAndroid Build Coastguard Worker if((u1_ipcm_th + 25) != ps_cur_mb_info->u1_mb_type)
356*495ae853SAndroid Build Coastguard Worker {
357*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_mb_type -= (u1_skip_th + 1);
358*495ae853SAndroid Build Coastguard Worker ih264d_process_intra_mb(ps_dec, ps_cur_mb_info, j);
359*495ae853SAndroid Build Coastguard Worker }
360*495ae853SAndroid Build Coastguard Worker }
361*495ae853SAndroid Build Coastguard Worker
362*495ae853SAndroid Build Coastguard Worker
363*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_use_intrapred_line_copy == 1)
364*495ae853SAndroid Build Coastguard Worker ih264d_copy_intra_pred_line(ps_dec, ps_cur_mb_info, j);
365*495ae853SAndroid Build Coastguard Worker }
366*495ae853SAndroid Build Coastguard Worker
367*495ae853SAndroid Build Coastguard Worker DATA_SYNC();
368*495ae853SAndroid Build Coastguard Worker
369*495ae853SAndroid Build Coastguard Worker if(u1_mbaff)
370*495ae853SAndroid Build Coastguard Worker {
371*495ae853SAndroid Build Coastguard Worker if(u4_update_mbaff)
372*495ae853SAndroid Build Coastguard Worker {
373*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mb_num = ps_cur_mb_info->u2_mbx
374*495ae853SAndroid Build Coastguard Worker + ps_dec->u2_frm_wd_in_mbs
375*495ae853SAndroid Build Coastguard Worker * (ps_cur_mb_info->u2_mby >> 1);
376*495ae853SAndroid Build Coastguard Worker UPDATE_MB_MAP_MBNUM_BYTE(ps_dec->pu1_recon_mb_map, u4_mb_num);
377*495ae853SAndroid Build Coastguard Worker u4_update_mbaff = 0;
378*495ae853SAndroid Build Coastguard Worker }
379*495ae853SAndroid Build Coastguard Worker else
380*495ae853SAndroid Build Coastguard Worker {
381*495ae853SAndroid Build Coastguard Worker u4_update_mbaff = 1;
382*495ae853SAndroid Build Coastguard Worker }
383*495ae853SAndroid Build Coastguard Worker }
384*495ae853SAndroid Build Coastguard Worker else
385*495ae853SAndroid Build Coastguard Worker {
386*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mb_num = ps_cur_mb_info->u2_mbx
387*495ae853SAndroid Build Coastguard Worker + ps_dec->u2_frm_wd_in_mbs * ps_cur_mb_info->u2_mby;
388*495ae853SAndroid Build Coastguard Worker UPDATE_MB_MAP_MBNUM_BYTE(ps_dec->pu1_recon_mb_map, u4_mb_num);
389*495ae853SAndroid Build Coastguard Worker }
390*495ae853SAndroid Build Coastguard Worker ps_dec->cur_dec_mb_num++;
391*495ae853SAndroid Build Coastguard Worker }
392*495ae853SAndroid Build Coastguard Worker
393*495ae853SAndroid Build Coastguard Worker /*N MB deblocking*/
394*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_nmb_deblk == 1)
395*495ae853SAndroid Build Coastguard Worker {
396*495ae853SAndroid Build Coastguard Worker UWORD32 u4_wd_y, u4_wd_uv;
397*495ae853SAndroid Build Coastguard Worker tfr_ctxt_t *ps_tfr_cxt = &(ps_dec->s_tran_addrecon);
398*495ae853SAndroid Build Coastguard Worker UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
399*495ae853SAndroid Build Coastguard Worker const WORD32 i4_cb_qp_idx_ofst =
400*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_pps->i1_chroma_qp_index_offset;
401*495ae853SAndroid Build Coastguard Worker const WORD32 i4_cr_qp_idx_ofst =
402*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset;
403*495ae853SAndroid Build Coastguard Worker
404*495ae853SAndroid Build Coastguard Worker u4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
405*495ae853SAndroid Build Coastguard Worker u4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
406*495ae853SAndroid Build Coastguard Worker
407*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info = &ps_dec->ps_frm_mb_info[ps_dec->u4_cur_deblk_mb_num];
408*495ae853SAndroid Build Coastguard Worker
409*495ae853SAndroid Build Coastguard Worker ps_dec->u4_deblk_mb_x = ps_cur_mb_info->u2_mbx;
410*495ae853SAndroid Build Coastguard Worker ps_dec->u4_deblk_mb_y = ps_cur_mb_info->u2_mby;
411*495ae853SAndroid Build Coastguard Worker
412*495ae853SAndroid Build Coastguard Worker
413*495ae853SAndroid Build Coastguard Worker for(j = 0; j < i; j++)
414*495ae853SAndroid Build Coastguard Worker {
415*495ae853SAndroid Build Coastguard Worker ih264d_deblock_mb_nonmbaff(ps_dec, ps_tfr_cxt,
416*495ae853SAndroid Build Coastguard Worker i4_cb_qp_idx_ofst, i4_cr_qp_idx_ofst,
417*495ae853SAndroid Build Coastguard Worker u4_wd_y, u4_wd_uv);
418*495ae853SAndroid Build Coastguard Worker
419*495ae853SAndroid Build Coastguard Worker }
420*495ae853SAndroid Build Coastguard Worker }
421*495ae853SAndroid Build Coastguard Worker
422*495ae853SAndroid Build Coastguard Worker /*handle the last mb in picture case*/
423*495ae853SAndroid Build Coastguard Worker if(ps_dec->cur_dec_mb_num > ps_dec->ps_cur_sps->u2_max_mb_addr)
424*495ae853SAndroid Build Coastguard Worker ps_dec->u4_cur_slice_decode_done = 1;
425*495ae853SAndroid Build Coastguard Worker
426*495ae853SAndroid Build Coastguard Worker if(i != u1_num_mbs)
427*495ae853SAndroid Build Coastguard Worker {
428*495ae853SAndroid Build Coastguard Worker u1_end_of_row = 0;
429*495ae853SAndroid Build Coastguard Worker /*Number of MB's left in row*/
430*495ae853SAndroid Build Coastguard Worker u1_num_mbs_next = u1_num_mbs_next + ((u1_num_mbs - i) >> u1_mbaff);
431*495ae853SAndroid Build Coastguard Worker }
432*495ae853SAndroid Build Coastguard Worker
433*495ae853SAndroid Build Coastguard Worker ih264d_decode_tfr_nmb(ps_dec, (i), u1_num_mbs_next, u1_end_of_row);
434*495ae853SAndroid Build Coastguard Worker
435*495ae853SAndroid Build Coastguard Worker return OK;
436*495ae853SAndroid Build Coastguard Worker }
437*495ae853SAndroid Build Coastguard Worker
ih264d_decode_slice_thread(dec_struct_t * ps_dec)438*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_decode_slice_thread(dec_struct_t *ps_dec)
439*495ae853SAndroid Build Coastguard Worker {
440*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_mbs_next, u1_num_mbsleft, u1_end_of_row = 0;
441*495ae853SAndroid Build Coastguard Worker const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
442*495ae853SAndroid Build Coastguard Worker UWORD8 u1_mbaff, u1_num_mbs;
443*495ae853SAndroid Build Coastguard Worker
444*495ae853SAndroid Build Coastguard Worker UWORD16 u2_first_mb_in_slice;
445*495ae853SAndroid Build Coastguard Worker UWORD16 i16_mb_x, i16_mb_y;
446*495ae853SAndroid Build Coastguard Worker UWORD8 u1_field_pic;
447*495ae853SAndroid Build Coastguard Worker UWORD32 u4_frame_stride, x_offset, y_offset;
448*495ae853SAndroid Build Coastguard Worker WORD32 ret;
449*495ae853SAndroid Build Coastguard Worker
450*495ae853SAndroid Build Coastguard Worker tfr_ctxt_t *ps_trns_addr;
451*495ae853SAndroid Build Coastguard Worker
452*495ae853SAndroid Build Coastguard Worker /*check for mb map of first mb in slice to ensure slice header is parsed*/
453*495ae853SAndroid Build Coastguard Worker while(1)
454*495ae853SAndroid Build Coastguard Worker {
455*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mb_num = ps_dec->cur_dec_mb_num;
456*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cond = 0;
457*495ae853SAndroid Build Coastguard Worker WORD32 nop_cnt = 8 * 128;
458*495ae853SAndroid Build Coastguard Worker CHECK_MB_MAP_BYTE(u4_mb_num, ps_dec->pu1_dec_mb_map, u4_cond);
459*495ae853SAndroid Build Coastguard Worker if(u4_cond)
460*495ae853SAndroid Build Coastguard Worker {
461*495ae853SAndroid Build Coastguard Worker break;
462*495ae853SAndroid Build Coastguard Worker }
463*495ae853SAndroid Build Coastguard Worker else
464*495ae853SAndroid Build Coastguard Worker {
465*495ae853SAndroid Build Coastguard Worker if(nop_cnt > 0)
466*495ae853SAndroid Build Coastguard Worker {
467*495ae853SAndroid Build Coastguard Worker nop_cnt -= 128;
468*495ae853SAndroid Build Coastguard Worker NOP(128);
469*495ae853SAndroid Build Coastguard Worker }
470*495ae853SAndroid Build Coastguard Worker else if(ps_dec->u4_output_present && (2 == ps_dec->u4_num_cores) &&
471*495ae853SAndroid Build Coastguard Worker (ps_dec->u4_fmt_conv_cur_row < ps_dec->s_disp_frame_info.u4_y_ht))
472*495ae853SAndroid Build Coastguard Worker {
473*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows =
474*495ae853SAndroid Build Coastguard Worker MIN(FMT_CONV_NUM_ROWS,
475*495ae853SAndroid Build Coastguard Worker (ps_dec->s_disp_frame_info.u4_y_ht
476*495ae853SAndroid Build Coastguard Worker - ps_dec->u4_fmt_conv_cur_row));
477*495ae853SAndroid Build Coastguard Worker ih264d_format_convert(ps_dec, &(ps_dec->s_disp_op),
478*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row,
479*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows);
480*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row += ps_dec->u4_fmt_conv_num_rows;
481*495ae853SAndroid Build Coastguard Worker }
482*495ae853SAndroid Build Coastguard Worker else
483*495ae853SAndroid Build Coastguard Worker {
484*495ae853SAndroid Build Coastguard Worker nop_cnt = 8*128;
485*495ae853SAndroid Build Coastguard Worker ithread_yield();
486*495ae853SAndroid Build Coastguard Worker }
487*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,
488*495ae853SAndroid Build Coastguard Worker ps_dec->u2_cur_mb_addr);
489*495ae853SAndroid Build Coastguard Worker
490*495ae853SAndroid Build Coastguard Worker }
491*495ae853SAndroid Build Coastguard Worker }
492*495ae853SAndroid Build Coastguard Worker
493*495ae853SAndroid Build Coastguard Worker
494*495ae853SAndroid Build Coastguard Worker
495*495ae853SAndroid Build Coastguard Worker u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
496*495ae853SAndroid Build Coastguard Worker
497*495ae853SAndroid Build Coastguard Worker u2_first_mb_in_slice = ps_dec->ps_decode_cur_slice->u4_first_mb_in_slice;
498*495ae853SAndroid Build Coastguard Worker
499*495ae853SAndroid Build Coastguard Worker i16_mb_x = MOD(u2_first_mb_in_slice, i2_pic_wdin_mbs);
500*495ae853SAndroid Build Coastguard Worker i16_mb_y = DIV(u2_first_mb_in_slice, i2_pic_wdin_mbs);
501*495ae853SAndroid Build Coastguard Worker i16_mb_y <<= u1_mbaff;
502*495ae853SAndroid Build Coastguard Worker ps_dec->i2_dec_thread_mb_y = i16_mb_y;
503*495ae853SAndroid Build Coastguard Worker
504*495ae853SAndroid Build Coastguard Worker
505*495ae853SAndroid Build Coastguard Worker ps_dec->cur_dec_mb_num = u2_first_mb_in_slice << u1_mbaff;
506*495ae853SAndroid Build Coastguard Worker
507*495ae853SAndroid Build Coastguard Worker if((ps_dec->u4_num_cores == 2) || !ps_dec->i1_recon_in_thread3_flag)
508*495ae853SAndroid Build Coastguard Worker {
509*495ae853SAndroid Build Coastguard Worker ps_dec->pv_proc_tu_coeff_data =
510*495ae853SAndroid Build Coastguard Worker (void *) ps_dec->ps_decode_cur_slice->pv_tu_coeff_data_start;
511*495ae853SAndroid Build Coastguard Worker }
512*495ae853SAndroid Build Coastguard Worker
513*495ae853SAndroid Build Coastguard Worker // recalculate recon pointers
514*495ae853SAndroid Build Coastguard Worker u1_field_pic = ps_dec->ps_cur_slice->u1_field_pic_flag;
515*495ae853SAndroid Build Coastguard Worker u4_frame_stride = ps_dec->u2_frm_wd_y << u1_field_pic;
516*495ae853SAndroid Build Coastguard Worker x_offset = i16_mb_x << 4;
517*495ae853SAndroid Build Coastguard Worker y_offset = (i16_mb_y * u4_frame_stride) << 4;
518*495ae853SAndroid Build Coastguard Worker
519*495ae853SAndroid Build Coastguard Worker ps_trns_addr = &(ps_dec->s_tran_addrecon);
520*495ae853SAndroid Build Coastguard Worker
521*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + x_offset + y_offset;
522*495ae853SAndroid Build Coastguard Worker
523*495ae853SAndroid Build Coastguard Worker u4_frame_stride = ps_dec->u2_frm_wd_uv << u1_field_pic;
524*495ae853SAndroid Build Coastguard Worker x_offset >>= 1;
525*495ae853SAndroid Build Coastguard Worker y_offset = (i16_mb_y * u4_frame_stride) << 3;
526*495ae853SAndroid Build Coastguard Worker
527*495ae853SAndroid Build Coastguard Worker x_offset *= YUV420SP_FACTOR;
528*495ae853SAndroid Build Coastguard Worker
529*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + x_offset + y_offset;
530*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + x_offset + y_offset;
531*495ae853SAndroid Build Coastguard Worker
532*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
533*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
534*495ae853SAndroid Build Coastguard Worker ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
535*495ae853SAndroid Build Coastguard Worker
536*495ae853SAndroid Build Coastguard Worker
537*495ae853SAndroid Build Coastguard Worker /* Initialise MC and formMbPartInfo fn ptrs one time based on profile_idc */
538*495ae853SAndroid Build Coastguard Worker {
539*495ae853SAndroid Build Coastguard Worker ps_dec->p_mc_dec_thread = ih264d_motion_compensate_bp;
540*495ae853SAndroid Build Coastguard Worker ps_dec->p_form_mb_part_info_thread = ih264d_form_mb_part_info_bp;
541*495ae853SAndroid Build Coastguard Worker }
542*495ae853SAndroid Build Coastguard Worker {
543*495ae853SAndroid Build Coastguard Worker UWORD8 uc_nofield_nombaff;
544*495ae853SAndroid Build Coastguard Worker uc_nofield_nombaff = ((ps_dec->ps_cur_slice->u1_field_pic_flag == 0)
545*495ae853SAndroid Build Coastguard Worker && (ps_dec->ps_cur_slice->u1_mbaff_frame_flag == 0)
546*495ae853SAndroid Build Coastguard Worker && (ps_dec->ps_decode_cur_slice->slice_type != B_SLICE)
547*495ae853SAndroid Build Coastguard Worker && (ps_dec->ps_cur_pps->u1_wted_pred_flag == 0));
548*495ae853SAndroid Build Coastguard Worker
549*495ae853SAndroid Build Coastguard Worker if(uc_nofield_nombaff == 0)
550*495ae853SAndroid Build Coastguard Worker {
551*495ae853SAndroid Build Coastguard Worker ps_dec->p_mc_dec_thread = ih264d_motion_compensate_mp;
552*495ae853SAndroid Build Coastguard Worker ps_dec->p_form_mb_part_info_thread = ih264d_form_mb_part_info_mp;
553*495ae853SAndroid Build Coastguard Worker }
554*495ae853SAndroid Build Coastguard Worker
555*495ae853SAndroid Build Coastguard Worker }
556*495ae853SAndroid Build Coastguard Worker
557*495ae853SAndroid Build Coastguard Worker ps_dec->u4_cur_slice_decode_done = 0;
558*495ae853SAndroid Build Coastguard Worker
559*495ae853SAndroid Build Coastguard Worker
560*495ae853SAndroid Build Coastguard Worker while(ps_dec->u4_cur_slice_decode_done != 1)
561*495ae853SAndroid Build Coastguard Worker {
562*495ae853SAndroid Build Coastguard Worker
563*495ae853SAndroid Build Coastguard Worker u1_num_mbsleft = ((i2_pic_wdin_mbs - i16_mb_x) << u1_mbaff);
564*495ae853SAndroid Build Coastguard Worker
565*495ae853SAndroid Build Coastguard Worker if(u1_num_mbsleft <= ps_dec->u1_recon_mb_grp)
566*495ae853SAndroid Build Coastguard Worker {
567*495ae853SAndroid Build Coastguard Worker u1_num_mbs = u1_num_mbsleft;
568*495ae853SAndroid Build Coastguard Worker
569*495ae853SAndroid Build Coastguard Worker /*Indicate number of mb's left in a row*/
570*495ae853SAndroid Build Coastguard Worker u1_num_mbs_next = 0;
571*495ae853SAndroid Build Coastguard Worker u1_end_of_row = 1;
572*495ae853SAndroid Build Coastguard Worker i16_mb_x = 0;
573*495ae853SAndroid Build Coastguard Worker }
574*495ae853SAndroid Build Coastguard Worker else
575*495ae853SAndroid Build Coastguard Worker {
576*495ae853SAndroid Build Coastguard Worker u1_num_mbs = ps_dec->u1_recon_mb_grp;
577*495ae853SAndroid Build Coastguard Worker
578*495ae853SAndroid Build Coastguard Worker /*Indicate number of mb's left in a row*/
579*495ae853SAndroid Build Coastguard Worker u1_num_mbs_next = i2_pic_wdin_mbs - i16_mb_x
580*495ae853SAndroid Build Coastguard Worker - (ps_dec->u1_recon_mb_grp >> u1_mbaff);
581*495ae853SAndroid Build Coastguard Worker i16_mb_x += (u1_num_mbs >> u1_mbaff);
582*495ae853SAndroid Build Coastguard Worker u1_end_of_row = 0;
583*495ae853SAndroid Build Coastguard Worker
584*495ae853SAndroid Build Coastguard Worker }
585*495ae853SAndroid Build Coastguard Worker ret = ih264d_decode_recon_tfr_nmb_thread(ps_dec, u1_num_mbs, u1_num_mbs_next,
586*495ae853SAndroid Build Coastguard Worker u1_end_of_row);
587*495ae853SAndroid Build Coastguard Worker if(ret != OK)
588*495ae853SAndroid Build Coastguard Worker return ret;
589*495ae853SAndroid Build Coastguard Worker }
590*495ae853SAndroid Build Coastguard Worker return OK;
591*495ae853SAndroid Build Coastguard Worker }
592*495ae853SAndroid Build Coastguard Worker
ih264d_decode_picture_thread(dec_struct_t * ps_dec)593*495ae853SAndroid Build Coastguard Worker void ih264d_decode_picture_thread(dec_struct_t *ps_dec )
594*495ae853SAndroid Build Coastguard Worker {
595*495ae853SAndroid Build Coastguard Worker ithread_set_name("ih264d_decode_picture_thread");
596*495ae853SAndroid Build Coastguard Worker
597*495ae853SAndroid Build Coastguard Worker while(1)
598*495ae853SAndroid Build Coastguard Worker {
599*495ae853SAndroid Build Coastguard Worker WORD32 ret;
600*495ae853SAndroid Build Coastguard Worker if(ps_dec->i4_threads_active)
601*495ae853SAndroid Build Coastguard Worker {
602*495ae853SAndroid Build Coastguard Worker ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[0]);
603*495ae853SAndroid Build Coastguard Worker if(OK != ret)
604*495ae853SAndroid Build Coastguard Worker break;
605*495ae853SAndroid Build Coastguard Worker
606*495ae853SAndroid Build Coastguard Worker while(ps_dec->ai4_process_start[0] != PROC_START)
607*495ae853SAndroid Build Coastguard Worker {
608*495ae853SAndroid Build Coastguard Worker ithread_cond_wait(ps_dec->apv_proc_start_condition[0],
609*495ae853SAndroid Build Coastguard Worker ps_dec->apv_proc_start_mutex[0]);
610*495ae853SAndroid Build Coastguard Worker }
611*495ae853SAndroid Build Coastguard Worker ps_dec->ai4_process_start[0] = PROC_IN_PROGRESS;
612*495ae853SAndroid Build Coastguard Worker
613*495ae853SAndroid Build Coastguard Worker ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[0]);
614*495ae853SAndroid Build Coastguard Worker if(OK != ret || ps_dec->i4_break_threads == 1)
615*495ae853SAndroid Build Coastguard Worker break;
616*495ae853SAndroid Build Coastguard Worker }
617*495ae853SAndroid Build Coastguard Worker while(1)
618*495ae853SAndroid Build Coastguard Worker {
619*495ae853SAndroid Build Coastguard Worker /*Complete all writes before processing next slice*/
620*495ae853SAndroid Build Coastguard Worker
621*495ae853SAndroid Build Coastguard Worker DEBUG_THREADS_PRINTF(" Entering decode slice\n");
622*495ae853SAndroid Build Coastguard Worker
623*495ae853SAndroid Build Coastguard Worker ih264d_decode_slice_thread(ps_dec);
624*495ae853SAndroid Build Coastguard Worker DEBUG_THREADS_PRINTF(" Exit ih264d_decode_slice_thread \n");
625*495ae853SAndroid Build Coastguard Worker
626*495ae853SAndroid Build Coastguard Worker
627*495ae853SAndroid Build Coastguard Worker if(ps_dec->cur_dec_mb_num
628*495ae853SAndroid Build Coastguard Worker > ps_dec->ps_cur_sps->u2_max_mb_addr)
629*495ae853SAndroid Build Coastguard Worker {
630*495ae853SAndroid Build Coastguard Worker /*Last slice in frame*/
631*495ae853SAndroid Build Coastguard Worker break;
632*495ae853SAndroid Build Coastguard Worker }
633*495ae853SAndroid Build Coastguard Worker else
634*495ae853SAndroid Build Coastguard Worker {
635*495ae853SAndroid Build Coastguard Worker ps_dec->ps_decode_cur_slice++;
636*495ae853SAndroid Build Coastguard Worker ps_dec->u2_cur_slice_num_dec_thread++;
637*495ae853SAndroid Build Coastguard Worker }
638*495ae853SAndroid Build Coastguard Worker
639*495ae853SAndroid Build Coastguard Worker }
640*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_output_present && (2 == ps_dec->u4_num_cores) &&
641*495ae853SAndroid Build Coastguard Worker (ps_dec->u4_fmt_conv_cur_row < ps_dec->s_disp_frame_info.u4_y_ht))
642*495ae853SAndroid Build Coastguard Worker {
643*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows =
644*495ae853SAndroid Build Coastguard Worker (ps_dec->s_disp_frame_info.u4_y_ht
645*495ae853SAndroid Build Coastguard Worker - ps_dec->u4_fmt_conv_cur_row);
646*495ae853SAndroid Build Coastguard Worker ih264d_format_convert(ps_dec, &(ps_dec->s_disp_op),
647*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row,
648*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_num_rows);
649*495ae853SAndroid Build Coastguard Worker ps_dec->u4_fmt_conv_cur_row += ps_dec->u4_fmt_conv_num_rows;
650*495ae853SAndroid Build Coastguard Worker }
651*495ae853SAndroid Build Coastguard Worker
652*495ae853SAndroid Build Coastguard Worker if(ps_dec->i4_threads_active)
653*495ae853SAndroid Build Coastguard Worker {
654*495ae853SAndroid Build Coastguard Worker ret = ithread_mutex_lock(ps_dec->apv_proc_done_mutex[0]);
655*495ae853SAndroid Build Coastguard Worker if(OK != ret)
656*495ae853SAndroid Build Coastguard Worker break;
657*495ae853SAndroid Build Coastguard Worker
658*495ae853SAndroid Build Coastguard Worker ps_dec->ai4_process_done[0] = PROC_DONE;
659*495ae853SAndroid Build Coastguard Worker ithread_cond_signal(ps_dec->apv_proc_done_condition[0]);
660*495ae853SAndroid Build Coastguard Worker
661*495ae853SAndroid Build Coastguard Worker ret = ithread_mutex_unlock(ps_dec->apv_proc_done_mutex[0]);
662*495ae853SAndroid Build Coastguard Worker if(OK != ret)
663*495ae853SAndroid Build Coastguard Worker break;
664*495ae853SAndroid Build Coastguard Worker }
665*495ae853SAndroid Build Coastguard Worker else
666*495ae853SAndroid Build Coastguard Worker {
667*495ae853SAndroid Build Coastguard Worker break;
668*495ae853SAndroid Build Coastguard Worker }
669*495ae853SAndroid Build Coastguard Worker }
670*495ae853SAndroid Build Coastguard Worker }
671*495ae853SAndroid Build Coastguard Worker
ih264d_signal_decode_thread(dec_struct_t * ps_dec)672*495ae853SAndroid Build Coastguard Worker void ih264d_signal_decode_thread(dec_struct_t *ps_dec)
673*495ae853SAndroid Build Coastguard Worker {
674*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_dec_thread_created == 1)
675*495ae853SAndroid Build Coastguard Worker {
676*495ae853SAndroid Build Coastguard Worker if(ps_dec->i4_threads_active)
677*495ae853SAndroid Build Coastguard Worker {
678*495ae853SAndroid Build Coastguard Worker proc_state_t i4_process_state;
679*495ae853SAndroid Build Coastguard Worker ithread_mutex_lock(ps_dec->apv_proc_start_mutex[0]);
680*495ae853SAndroid Build Coastguard Worker i4_process_state = ps_dec->ai4_process_start[0];
681*495ae853SAndroid Build Coastguard Worker ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[0]);
682*495ae853SAndroid Build Coastguard Worker
683*495ae853SAndroid Build Coastguard Worker // only wait if the thread has started decoding
684*495ae853SAndroid Build Coastguard Worker if(i4_process_state != PROC_INIT)
685*495ae853SAndroid Build Coastguard Worker {
686*495ae853SAndroid Build Coastguard Worker ithread_mutex_lock(ps_dec->apv_proc_done_mutex[0]);
687*495ae853SAndroid Build Coastguard Worker
688*495ae853SAndroid Build Coastguard Worker while(ps_dec->ai4_process_done[0] != PROC_DONE)
689*495ae853SAndroid Build Coastguard Worker {
690*495ae853SAndroid Build Coastguard Worker ithread_cond_wait(ps_dec->apv_proc_done_condition[0],
691*495ae853SAndroid Build Coastguard Worker ps_dec->apv_proc_done_mutex[0]);
692*495ae853SAndroid Build Coastguard Worker }
693*495ae853SAndroid Build Coastguard Worker ps_dec->ai4_process_done[0] = PROC_INIT;
694*495ae853SAndroid Build Coastguard Worker ithread_mutex_unlock(ps_dec->apv_proc_done_mutex[0]);
695*495ae853SAndroid Build Coastguard Worker }
696*495ae853SAndroid Build Coastguard Worker }
697*495ae853SAndroid Build Coastguard Worker else
698*495ae853SAndroid Build Coastguard Worker {
699*495ae853SAndroid Build Coastguard Worker ithread_join(ps_dec->pv_dec_thread_handle, NULL);
700*495ae853SAndroid Build Coastguard Worker ps_dec->u4_dec_thread_created = 0;
701*495ae853SAndroid Build Coastguard Worker }
702*495ae853SAndroid Build Coastguard Worker }
703*495ae853SAndroid Build Coastguard Worker }
ih264d_signal_bs_deblk_thread(dec_struct_t * ps_dec)704*495ae853SAndroid Build Coastguard Worker void ih264d_signal_bs_deblk_thread(dec_struct_t *ps_dec)
705*495ae853SAndroid Build Coastguard Worker {
706*495ae853SAndroid Build Coastguard Worker if(ps_dec->u4_bs_deblk_thread_created)
707*495ae853SAndroid Build Coastguard Worker {
708*495ae853SAndroid Build Coastguard Worker if(ps_dec->i4_threads_active)
709*495ae853SAndroid Build Coastguard Worker {
710*495ae853SAndroid Build Coastguard Worker proc_state_t i4_process_state;
711*495ae853SAndroid Build Coastguard Worker ithread_mutex_lock(ps_dec->apv_proc_start_mutex[1]);
712*495ae853SAndroid Build Coastguard Worker i4_process_state = ps_dec->ai4_process_start[1];
713*495ae853SAndroid Build Coastguard Worker ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[1]);
714*495ae853SAndroid Build Coastguard Worker
715*495ae853SAndroid Build Coastguard Worker // only wait if the thread has started deblking
716*495ae853SAndroid Build Coastguard Worker if(i4_process_state != PROC_INIT)
717*495ae853SAndroid Build Coastguard Worker {
718*495ae853SAndroid Build Coastguard Worker ithread_mutex_lock(ps_dec->apv_proc_done_mutex[1]);
719*495ae853SAndroid Build Coastguard Worker
720*495ae853SAndroid Build Coastguard Worker while(ps_dec->ai4_process_done[1] != PROC_DONE)
721*495ae853SAndroid Build Coastguard Worker {
722*495ae853SAndroid Build Coastguard Worker ithread_cond_wait(ps_dec->apv_proc_done_condition[1],
723*495ae853SAndroid Build Coastguard Worker ps_dec->apv_proc_done_mutex[1]);
724*495ae853SAndroid Build Coastguard Worker }
725*495ae853SAndroid Build Coastguard Worker ps_dec->ai4_process_done[1] = PROC_INIT;
726*495ae853SAndroid Build Coastguard Worker ithread_mutex_unlock(ps_dec->apv_proc_done_mutex[1]);
727*495ae853SAndroid Build Coastguard Worker }
728*495ae853SAndroid Build Coastguard Worker }
729*495ae853SAndroid Build Coastguard Worker else
730*495ae853SAndroid Build Coastguard Worker {
731*495ae853SAndroid Build Coastguard Worker ithread_join(ps_dec->pv_bs_deblk_thread_handle, NULL);
732*495ae853SAndroid Build Coastguard Worker ps_dec->u4_bs_deblk_thread_created = 0;
733*495ae853SAndroid Build Coastguard Worker }
734*495ae853SAndroid Build Coastguard Worker }
735*495ae853SAndroid Build Coastguard Worker
736*495ae853SAndroid Build Coastguard Worker }
737