xref: /aosp_15_r20/external/libavc/decoder/ih264d_thread_parse_decode.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
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