Coverage Report

Created: 2026-08-13 07:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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