Coverage Report

Created: 2026-08-14 07:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/decoder/svc/isvcd_thread_compute_bs.c
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Copyright (C) 2022 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
 * @file
23
 *  isvcd_thread_compute_bs.c
24
 *
25
 * @brief
26
 *  Contains routines that for multi-thread decoder
27
 *
28
 * @author
29
 *  Kishore
30
 *
31
 * @remarks
32
 *  None
33
 *
34
 *******************************************************************************
35
 */
36
37
#include <string.h>
38
#include "ih264d_error_handler.h"
39
#include "ih264d_debug.h"
40
#include "ih264d_defs.h"
41
#include "ih264d_debug.h"
42
#include "ih264d_tables.h"
43
#include "isvcd_structs.h"
44
#include "ih264d_defs.h"
45
#include "ih264d_mb_utils.h"
46
#include "ih264d_thread_compute_bs.h"
47
#include "isvcd_thread_compute_bs.h"
48
#include "ithread.h"
49
#include "ih264d_deblocking.h"
50
#include "ih264d_process_pslice.h"
51
#include "isvcd_process_epslice.h"
52
#include "ih264d_process_intra_mb.h"
53
#include "ih264d_mb_utils.h"
54
#include "ih264d_tables.h"
55
#include "ih264d_format_conv.h"
56
#include "ih264d_defs.h"
57
58
UWORD16 ih264d_update_csbp_8x8(UWORD16 u2_luma_csbp);
59
void ih264d_fill_bs2_horz_vert(UWORD32 *pu4_bs,        /* Base pointer of BS table */
60
                               WORD32 u4_left_mb_csbp, /* csbp of left mb */
61
                               WORD32 u4_top_mb_csbp,  /* csbp of top mb */
62
                               WORD32 u4_cur_mb_csbp,  /* csbp of current mb */
63
                               const UWORD32 *pu4_packed_bs2, const UWORD16 *pu2_4x4_v2h_reorder);
64
void isvcd_fill_bs_ibl(deblk_mb_t *ps_deblk_mb, UWORD8 u1_top_mb_type, UWORD8 u1_left_mb_type,
65
                       dec_mb_info_t *ps_cur_mb_info, UWORD16 *pu2_curr_res_luma_csbp,
66
                       UWORD16 *pu2_left_res_luma_csbp, UWORD16 *pu2_top_res_luma_csbp);
67
68
/*****************************************************************************/
69
/*                                                                           */
70
/*  Function Name : isvcd_compute_bs_non_mbaff_thread */
71
/*                                                                           */
72
/*  Description   : This function computes the pointers of left,top & current*/
73
/*                : Nnz, MvPred & deblk_mb_t and supplies to FillBs function
74
 * 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 isvcd_compute_bs_non_mbaff_thread(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
90
                                       dec_mb_info_t *ps_cur_mb_info, UWORD32 u4_mb_num)
91
1.02M
{
92
1.02M
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
93
    /* Mvpred and Nnz for top and Courrent */
94
1.02M
    mv_pred_t *ps_cur_mv_pred, *ps_top_mv_pred = NULL, *ps_left_mv_pred;
95
    /* deblk_mb_t Params */
96
1.02M
    deblk_mb_t *ps_cur_mb_params; /*< Parameters of current MacroBlock */
97
1.02M
    deblkmb_neighbour_t *ps_deblk_top_mb;
98
99
    /* Reference Index to POC mapping*/
100
1.02M
    void **apv_map_ref_idx_to_poc;
101
1.02M
    UWORD32 u4_leftmbtype;
102
103
1.02M
    UWORD16 u2_left_csbp, u2_top_csbp, u2_cur_csbp;
104
105
    /* Set of flags */
106
1.02M
    UWORD32 u4_cur_mb_intra, u1_top_mb_typ, u4_cur_mb_fld;
107
1.02M
    UWORD32 u4_cur_mb_ibl;
108
1.02M
    UWORD32 u1_cur_mb_type;
109
1.02M
    UWORD32 *pu4_bs_table;
110
111
1.02M
    UWORD16 *pu2_curr_res_luma_csbp;
112
1.02M
    UWORD16 *pu2_left_res_luma_csbp;
113
1.02M
    UWORD16 *pu2_top_res_luma_csbp;
114
115
    /* Neighbour availability */
116
    /* Initialization */
117
1.02M
    const UWORD32 u2_mbx = ps_cur_mb_info->u2_mbx;
118
1.02M
    const UWORD32 u2_mby = ps_cur_mb_info->u2_mby;
119
1.02M
    const UWORD32 u1_pingpong = u2_mbx & 0x01;
120
121
1.02M
    PROFILE_DISABLE_BOUNDARY_STRENGTH()
122
1.02M
    ps_deblk_top_mb = ps_dec->ps_deblk_top_mb + u2_mbx;
123
124
    /* Pointer assignment for Current DeblkMB, Current Mv Pred  */
125
1.02M
    ps_cur_mb_params = ps_dec->ps_deblk_pic + u4_mb_num;
126
1.02M
    ps_cur_mv_pred = ps_dec->s_cur_pic.ps_mv + (u4_mb_num << 4);
127
128
    /*Pointer assignment for Residual NNZ */
129
1.02M
    pu2_curr_res_luma_csbp = ps_svc_lyr_dec->pu2_frm_res_luma_csbp + ps_cur_mb_info->u2_mbx;
130
1.02M
    pu2_curr_res_luma_csbp += ps_cur_mb_info->u2_mby * ps_svc_lyr_dec->i4_frm_res_luma_csbp_stride;
131
132
1.02M
    pu2_left_res_luma_csbp = pu2_curr_res_luma_csbp - (ps_cur_mb_info->u2_mbx != 0);
133
1.02M
    pu2_top_res_luma_csbp = pu2_curr_res_luma_csbp - ((ps_cur_mb_info->u2_mby != 0) *
134
1.02M
                                                      ps_svc_lyr_dec->i4_frm_res_luma_csbp_stride);
135
136
1.02M
    apv_map_ref_idx_to_poc = (void **) ps_dec->ps_computebs_cur_slice->ppv_map_ref_idx_to_poc + 1;
137
1.02M
    u1_cur_mb_type = ps_cur_mb_params->u1_mb_type;
138
1.02M
    u1_top_mb_typ = ps_deblk_top_mb->u1_mb_type;
139
1.02M
    ps_deblk_top_mb->u1_mb_type = u1_cur_mb_type;
140
141
1.02M
    ps_cur_mb_params->u1_topmb_qp = ps_deblk_top_mb->u1_mb_qp;
142
1.02M
    ps_deblk_top_mb->u1_mb_qp = ps_cur_mb_params->u1_mb_qp;
143
1.02M
    ps_cur_mb_params->u1_left_mb_qp = ps_dec->deblk_left_mb[1].u1_mb_qp;
144
1.02M
    ps_dec->deblk_left_mb[1].u1_mb_qp = ps_cur_mb_params->u1_mb_qp;
145
146
    /* if no deblocking required for current Mb then continue */
147
    /* Check next Mbs   in Mb group                           */
148
1.02M
    if(ps_cur_mb_params->u1_deblocking_mode & MB_DISABLE_FILTERING)
149
4.97k
    {
150
4.97k
        void **pu4_map_ref_idx_to_poc_l1 = apv_map_ref_idx_to_poc + POC_LIST_L0_TO_L1_DIFF;
151
4.97k
        {
152
            /* Store Parameter for Top MvPred refernce frame Address */
153
4.97k
            void **ppv_top_mv_pred_addr = ps_cur_mb_info->ps_curmb->u4_pic_addrress;
154
4.97k
            WORD8 *p1_refTop0 = (ps_cur_mv_pred + 12)->i1_ref_frame;
155
4.97k
            WORD8 *p1_refTop1 = (ps_cur_mv_pred + 14)->i1_ref_frame;
156
157
            /* Store Left addresses for Next Mb   */
158
4.97k
            void **ppv_left_mv_pred_addr = ps_dec->ps_left_mvpred_addr[!u1_pingpong][1].u4_add;
159
4.97k
            WORD8 *p1_refleft0 = (ps_cur_mv_pred + 3)->i1_ref_frame;
160
161
4.97k
            ppv_top_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refTop0[0]];
162
4.97k
            ppv_top_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refTop0[1]];
163
164
4.97k
            ppv_left_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
165
4.97k
            ppv_top_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
166
4.97k
            ppv_left_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
167
4.97k
            ppv_top_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
168
169
4.97k
            ppv_left_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refleft0[0]];
170
4.97k
            ppv_left_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refleft0[1]];
171
172
            /* Storing the leftMbtype for next Mb */
173
4.97k
            ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type;
174
4.97k
        }
175
176
4.97k
        return;
177
4.97k
    }
178
179
    /* Flag for extra left Edge */
180
1.01M
    ps_cur_mb_params->u1_single_call = 1;
181
182
    /* Update the Left deblk_mb_t and Left MvPred Parameters */
183
1.01M
    if(!u2_mbx)
184
100k
    {
185
100k
        u4_leftmbtype = 0;
186
187
        /* Initialize the ps_left_mv_pred with Junk but Valid Location */
188
        /* to avoid invalid memory access                           */
189
        /* this is read only pointer                                */
190
100k
        ps_left_mv_pred = ps_cur_mv_pred + 3;
191
100k
    }
192
916k
    else
193
916k
    {
194
916k
        u4_leftmbtype = ps_dec->deblk_left_mb[1].u1_mb_type;
195
196
        /* Come to Left Most Edge of the MB */
197
916k
        ps_left_mv_pred = ps_cur_mv_pred - (1 << 4) + 3;
198
916k
    }
199
200
1.01M
    if(!u2_mby) u1_top_mb_typ = 0;
201
202
    /* MvPred Pointer Calculation */
203
1.01M
    ps_top_mv_pred = ps_cur_mv_pred - (ps_dec->u2_frm_wd_in_mbs << 4) + 12;
204
1.01M
    u4_cur_mb_intra = u1_cur_mb_type & D_INTRA_MB;
205
1.01M
    u4_cur_mb_ibl = u1_cur_mb_type & D_INTRA_IBL;
206
1.01M
    u4_cur_mb_fld = !!(u1_cur_mb_type & D_FLD_MB);
207
    /* Compute BS function */
208
1.01M
    pu4_bs_table = ps_cur_mb_params->u4_bs_table;
209
210
1.01M
    u2_cur_csbp = ps_cur_mb_info->ps_curmb->u2_luma_csbp;
211
1.01M
    u2_left_csbp = ps_cur_mb_info->ps_left_mb->u2_luma_csbp;
212
1.01M
    u2_top_csbp = ps_cur_mb_info->ps_top_mb->u2_luma_csbp;
213
214
    /* Compute BS function */
215
1.01M
    if((ps_dec->ps_cur_sps->u1_profile_idc == HIGH_PROFILE_IDC) ||
216
622k
       (ps_dec->ps_cur_sps->u1_profile_idc == HIGH_PROFILE_IDC) ||
217
622k
       (ps_dec->ps_cur_sps->u1_profile_idc == SCALABLE_HIGH_PROFILE_IDC) ||
218
606k
       (ps_dec->ps_cur_sps->u1_profile_idc == SCALABLE_BASELINE_PROFILE_IDC))
219
425k
    {
220
425k
        if(ps_cur_mb_info->u1_tran_form8x8 == 1)
221
9.40k
        {
222
9.40k
            u2_cur_csbp = ih264d_update_csbp_8x8(ps_cur_mb_info->ps_curmb->u2_luma_csbp);
223
9.40k
            ps_cur_mb_info->ps_curmb->u2_luma_csbp = u2_cur_csbp;
224
9.40k
        }
225
425k
    }
226
1.01M
    u2_cur_csbp |= *pu2_curr_res_luma_csbp;
227
1.01M
    u2_left_csbp |= *pu2_left_res_luma_csbp;
228
1.01M
    u2_top_csbp |= *pu2_top_res_luma_csbp;
229
230
1.01M
    if(u4_cur_mb_intra)
231
16.3k
    {
232
16.3k
        pu4_bs_table[4] = 0x04040404;
233
16.3k
        pu4_bs_table[0] = u4_cur_mb_fld ? 0x03030303 : 0x04040404;
234
16.3k
        pu4_bs_table[1] = 0x03030303;
235
16.3k
        pu4_bs_table[2] = 0x03030303;
236
16.3k
        pu4_bs_table[3] = 0x03030303;
237
16.3k
        pu4_bs_table[5] = 0x03030303;
238
16.3k
        pu4_bs_table[6] = 0x03030303;
239
16.3k
        pu4_bs_table[7] = 0x03030303;
240
16.3k
    }
241
1.00M
    else
242
1.00M
    {
243
1.00M
        isvcd_fill_bs_ibl(ps_cur_mb_params, u1_top_mb_typ, u4_leftmbtype, ps_cur_mb_info,
244
1.00M
                          pu2_curr_res_luma_csbp, pu2_left_res_luma_csbp, pu2_top_res_luma_csbp);
245
246
1.00M
        if(!u4_cur_mb_ibl)
247
981k
        {
248
981k
            UWORD32 u4_is_non16x16 = !!(u1_cur_mb_type & D_PRED_NON_16x16);
249
981k
            UWORD32 u4_is_b = (ps_dec->ps_computebs_cur_slice->slice_type == B_SLICE);
250
981k
            UWORD32 u4_bs_0, u4_bs_4;
251
252
981k
            u4_bs_0 = pu4_bs_table[0];
253
981k
            u4_bs_4 = pu4_bs_table[4];
254
255
981k
            ih264d_fill_bs2_horz_vert(pu4_bs_table, u2_left_csbp, u2_top_csbp, u2_cur_csbp,
256
981k
                                      gau4_ih264d_packed_bs2, gau2_ih264d_4x4_v2h_reorder);
257
258
981k
            if(u4_leftmbtype & D_INTRA_MB)
259
1.14k
            {
260
1.14k
                pu4_bs_table[4] = 0x04040404;
261
1.14k
            }
262
980k
            else if(u4_leftmbtype & D_INTRA_IBL)
263
2.50k
            {
264
2.50k
                pu4_bs_table[4] = u4_bs_4;
265
2.50k
            }
266
267
981k
            if(u1_top_mb_typ & D_INTRA_MB)
268
1.40k
            {
269
1.40k
                pu4_bs_table[0] = u4_cur_mb_fld ? 0x03030303 : 0x04040404;
270
1.40k
            }
271
980k
            else if(u1_top_mb_typ & D_INTRA_IBL)
272
4.97k
            {
273
4.97k
                pu4_bs_table[0] = u4_bs_0;
274
4.97k
            }
275
276
981k
            ps_dec->pf_fill_bs1[u4_is_b][u4_is_non16x16](
277
981k
                ps_cur_mv_pred, ps_top_mv_pred, apv_map_ref_idx_to_poc, pu4_bs_table,
278
981k
                ps_left_mv_pred, &(ps_dec->ps_left_mvpred_addr[u1_pingpong][1]),
279
981k
                ps_cur_mb_info->ps_top_mb->u4_pic_addrress, (4 >> u4_cur_mb_fld));
280
981k
        }
281
1.00M
    }
282
283
1.01M
    {
284
1.01M
        void **pu4_map_ref_idx_to_poc_l1 = apv_map_ref_idx_to_poc + POC_LIST_L0_TO_L1_DIFF;
285
1.01M
        {
286
            /* Store Parameter for Top MvPred refernce frame Address */
287
1.01M
            void **ppv_top_mv_pred_addr = ps_cur_mb_info->ps_curmb->u4_pic_addrress;
288
1.01M
            WORD8 *p1_refTop0 = (ps_cur_mv_pred + 12)->i1_ref_frame;
289
1.01M
            WORD8 *p1_refTop1 = (ps_cur_mv_pred + 14)->i1_ref_frame;
290
291
            /* Store Left addresses for Next Mb   */
292
1.01M
            void **ppv_left_mv_pred_addr = ps_dec->ps_left_mvpred_addr[!u1_pingpong][1].u4_add;
293
1.01M
            WORD8 *p1_refleft0 = (ps_cur_mv_pred + 3)->i1_ref_frame;
294
295
1.01M
            ppv_top_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refTop0[0]];
296
1.01M
            ppv_top_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refTop0[1]];
297
298
1.01M
            ppv_left_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
299
1.01M
            ppv_top_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
300
1.01M
            ppv_left_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
301
1.01M
            ppv_top_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
302
303
1.01M
            ppv_left_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refleft0[0]];
304
1.01M
            ppv_left_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refleft0[1]];
305
306
            /* Storing the leftMbtype for next Mb */
307
1.01M
            ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type;
308
1.01M
        }
309
1.01M
    }
310
311
    /* For transform 8x8 disable deblocking of the intrernal edges of a 8x8 block */
312
1.01M
    if(ps_cur_mb_info->u1_tran_form8x8)
313
12.0k
    {
314
12.0k
        pu4_bs_table[1] = 0;
315
12.0k
        pu4_bs_table[3] = 0;
316
12.0k
        pu4_bs_table[5] = 0;
317
12.0k
        pu4_bs_table[7] = 0;
318
12.0k
    }
319
1.01M
}