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