xref: /aosp_15_r20/external/libavc/decoder/svc/isvcd_compute_bs.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2022 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
23*495ae853SAndroid Build Coastguard Worker  *  isvcd_compute_bs.c
24*495ae853SAndroid Build Coastguard Worker  *
25*495ae853SAndroid Build Coastguard Worker  * @brief
26*495ae853SAndroid Build Coastguard Worker  *  This file contains bit flags and info on target layer.
27*495ae853SAndroid Build Coastguard Worker  *
28*495ae853SAndroid Build Coastguard Worker  * @author
29*495ae853SAndroid Build Coastguard Worker  *  Kishore
30*495ae853SAndroid Build Coastguard Worker  *
31*495ae853SAndroid Build Coastguard Worker  * @par List of Functions:
32*495ae853SAndroid Build Coastguard Worker  *  - isvcd_deblk_extract_bit_flags()
33*495ae853SAndroid Build Coastguard Worker  *  - isvcd_fill_bs_ibl()
34*495ae853SAndroid Build Coastguard Worker  *  - isvcd_compute_bs_non_mbaff_target_lyr_no_inter_layer()
35*495ae853SAndroid Build Coastguard Worker  *  - isvcd_compute_bs_non_mbaff()
36*495ae853SAndroid Build Coastguard Worker  *  - isvcd_compute_bs_non_mbaff_target_lyr()
37*495ae853SAndroid Build Coastguard Worker  *  - isvcd_compute_bs_non_mbaff_medial_lyr()
38*495ae853SAndroid Build Coastguard Worker  *
39*495ae853SAndroid Build Coastguard Worker  * @remarks
40*495ae853SAndroid Build Coastguard Worker  *  None
41*495ae853SAndroid Build Coastguard Worker  *
42*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
43*495ae853SAndroid Build Coastguard Worker  */
44*495ae853SAndroid Build Coastguard Worker 
45*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
46*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
47*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
48*495ae853SAndroid Build Coastguard Worker #include "isvcd_structs.h"
49*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
50*495ae853SAndroid Build Coastguard Worker #include "ih264d_deblocking.h"
51*495ae853SAndroid Build Coastguard Worker #include "string.h"
52*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
53*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
54*495ae853SAndroid Build Coastguard Worker UWORD16 ih264d_update_csbp_8x8(UWORD16 u2_luma_csbp);
55*495ae853SAndroid Build Coastguard Worker void ih264d_fill_bs2_horz_vert(UWORD32 *pu4_bs,        /* Base pointer of BS table */
56*495ae853SAndroid Build Coastguard Worker                                WORD32 u4_left_mb_csbp, /* csbp of left mb */
57*495ae853SAndroid Build Coastguard Worker                                WORD32 u4_top_mb_csbp,  /* csbp of top mb */
58*495ae853SAndroid Build Coastguard Worker                                WORD32 u4_cur_mb_csbp,  /* csbp of current mb */
59*495ae853SAndroid Build Coastguard Worker                                const UWORD32 *pu4_packed_bs2, const UWORD16 *pu2_4x4_v2h_reorder);
60*495ae853SAndroid Build Coastguard Worker const UWORD32 g_au4_extract_set[NUM_SUB_MB_PARTS] = {0x00000000F, 0x0000000F0, 0x000000F00,
61*495ae853SAndroid Build Coastguard Worker                                                      0x00000F000};
62*495ae853SAndroid Build Coastguard Worker 
63*495ae853SAndroid Build Coastguard Worker /** \brief extracts the bits from given offset and packs it to last 4 bits  */
isvcd_deblk_extract_bit_flags(UWORD16 u2_bit_field,WORD32 i4_initial_bit_mask)64*495ae853SAndroid Build Coastguard Worker UWORD16 isvcd_deblk_extract_bit_flags(UWORD16 u2_bit_field, WORD32 i4_initial_bit_mask)
65*495ae853SAndroid Build Coastguard Worker {
66*495ae853SAndroid Build Coastguard Worker     WORD32 i4_i;
67*495ae853SAndroid Build Coastguard Worker     WORD32 i4_bit_mask;
68*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_result = 0;
69*495ae853SAndroid Build Coastguard Worker 
70*495ae853SAndroid Build Coastguard Worker     i4_bit_mask = i4_initial_bit_mask;
71*495ae853SAndroid Build Coastguard Worker 
72*495ae853SAndroid Build Coastguard Worker     for(i4_i = 0; i4_i < NUM_SUB_MB_PARTS; i4_i++)
73*495ae853SAndroid Build Coastguard Worker     {
74*495ae853SAndroid Build Coastguard Worker         WORD32 i4_bit;
75*495ae853SAndroid Build Coastguard Worker         /* extract the bits of the last column 4x4 blocks */
76*495ae853SAndroid Build Coastguard Worker         if(0 == (i4_bit_mask & u2_bit_field))
77*495ae853SAndroid Build Coastguard Worker         {
78*495ae853SAndroid Build Coastguard Worker             i4_bit = 0;
79*495ae853SAndroid Build Coastguard Worker         }
80*495ae853SAndroid Build Coastguard Worker         else
81*495ae853SAndroid Build Coastguard Worker         {
82*495ae853SAndroid Build Coastguard Worker             i4_bit = 1;
83*495ae853SAndroid Build Coastguard Worker         }
84*495ae853SAndroid Build Coastguard Worker         /* store the result */
85*495ae853SAndroid Build Coastguard Worker         u2_result |= i4_bit << i4_i;
86*495ae853SAndroid Build Coastguard Worker         i4_bit_mask <<= 4;
87*495ae853SAndroid Build Coastguard Worker 
88*495ae853SAndroid Build Coastguard Worker     } /* end of loop over num sub Mb parts */
89*495ae853SAndroid Build Coastguard Worker     return (u2_result);
90*495ae853SAndroid Build Coastguard Worker }
91*495ae853SAndroid Build Coastguard Worker 
92*495ae853SAndroid Build Coastguard Worker /** \brief Fills the BS for edges falling on a IBL boundary  */
isvcd_fill_bs_ibl(deblk_mb_t * ps_deblk_mb,UWORD8 u1_top_mb_type,UWORD8 u1_left_mb_type,dec_mb_info_t * ps_cur_mb_info,UWORD16 * pu2_curr_res_luma_csbp,UWORD16 * pu2_left_res_luma_csbp,UWORD16 * pu2_top_res_luma_csbp)93*495ae853SAndroid Build Coastguard Worker void isvcd_fill_bs_ibl(deblk_mb_t *ps_deblk_mb, UWORD8 u1_top_mb_type, UWORD8 u1_left_mb_type,
94*495ae853SAndroid Build Coastguard Worker                        dec_mb_info_t *ps_cur_mb_info, UWORD16 *pu2_curr_res_luma_csbp,
95*495ae853SAndroid Build Coastguard Worker                        UWORD16 *pu2_left_res_luma_csbp, UWORD16 *pu2_top_res_luma_csbp)
96*495ae853SAndroid Build Coastguard Worker {
97*495ae853SAndroid Build Coastguard Worker     /*! Flow of the module is as follows                                  */
98*495ae853SAndroid Build Coastguard Worker     /*! 1. checks if MB edge is falling on IBL boundary                   */
99*495ae853SAndroid Build Coastguard Worker     /*! 2. if only Mb edge then it fills the BS based on INTRA or INTER
100*495ae853SAndroid Build Coastguard Worker            stauts                                                         */
101*495ae853SAndroid Build Coastguard Worker     /*! 3. if the current MB is IBL and neighbours are also neighbours
102*495ae853SAndroid Build Coastguard Worker            then it uses the current layer t_coeff flag to decide the
103*495ae853SAndroid Build Coastguard Worker            BS of a particular edge                                        */
104*495ae853SAndroid Build Coastguard Worker     /*!4. fills the BS for all the edges in curretn MB if IBL             */
105*495ae853SAndroid Build Coastguard Worker 
106*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_top_horz_nnz;
107*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_top_mb_ibl, u1_left_mb_ibl;
108*495ae853SAndroid Build Coastguard Worker     UWORD32 i4_i, i4_edge;
109*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_bs;
110*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_cnd;
111*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_top_intra;
112*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_left_intra;
113*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_p_nnz, u1_q_nnz;
114*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_curr_mb_ibl;
115*495ae853SAndroid Build Coastguard Worker     UWORD32 *pu4_bs_table;
116*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_curr_nnz;
117*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_left_mb_nnz = 0, u1_left_nnz;
118*495ae853SAndroid Build Coastguard Worker     WORD32 i4_horz_start = 0;
119*495ae853SAndroid Build Coastguard Worker     WORD32 i4_vertical_start = 0;
120*495ae853SAndroid Build Coastguard Worker 
121*495ae853SAndroid Build Coastguard Worker     pu4_bs_table = &(ps_deblk_mb->u4_bs_table[0]);
122*495ae853SAndroid Build Coastguard Worker 
123*495ae853SAndroid Build Coastguard Worker     u1_top_mb_ibl = u1_top_mb_type & D_INTRA_IBL;
124*495ae853SAndroid Build Coastguard Worker     u1_left_mb_ibl = u1_left_mb_type & D_INTRA_IBL;
125*495ae853SAndroid Build Coastguard Worker 
126*495ae853SAndroid Build Coastguard Worker     u1_curr_mb_ibl = ps_deblk_mb->u1_mb_type & D_INTRA_IBL;
127*495ae853SAndroid Build Coastguard Worker 
128*495ae853SAndroid Build Coastguard Worker     u1_top_intra = u1_top_mb_type & D_INTRA_MB;
129*495ae853SAndroid Build Coastguard Worker     u1_left_intra = u1_left_mb_type & D_INTRA_MB;
130*495ae853SAndroid Build Coastguard Worker 
131*495ae853SAndroid Build Coastguard Worker     /* return if none of the current top and left is IBL */
132*495ae853SAndroid Build Coastguard Worker     if((0 == u1_curr_mb_ibl) && (0 == u1_top_mb_ibl) && (0 == u1_left_mb_ibl))
133*495ae853SAndroid Build Coastguard Worker     {
134*495ae853SAndroid Build Coastguard Worker         return;
135*495ae853SAndroid Build Coastguard Worker     }
136*495ae853SAndroid Build Coastguard Worker 
137*495ae853SAndroid Build Coastguard Worker     /* set up the vertical and horz MB edge skip flags */
138*495ae853SAndroid Build Coastguard Worker     if(0 != u1_curr_mb_ibl)
139*495ae853SAndroid Build Coastguard Worker     {
140*495ae853SAndroid Build Coastguard Worker         /* if top is not IBL */
141*495ae853SAndroid Build Coastguard Worker         if(0 == u1_top_mb_ibl)
142*495ae853SAndroid Build Coastguard Worker         {
143*495ae853SAndroid Build Coastguard Worker             i4_horz_start = 1;
144*495ae853SAndroid Build Coastguard Worker         }
145*495ae853SAndroid Build Coastguard Worker 
146*495ae853SAndroid Build Coastguard Worker         /* if left in not IBL */
147*495ae853SAndroid Build Coastguard Worker         if(0 == u1_left_mb_ibl)
148*495ae853SAndroid Build Coastguard Worker         {
149*495ae853SAndroid Build Coastguard Worker             i4_vertical_start = 1;
150*495ae853SAndroid Build Coastguard Worker         }
151*495ae853SAndroid Build Coastguard Worker     }
152*495ae853SAndroid Build Coastguard Worker 
153*495ae853SAndroid Build Coastguard Worker     /*******************************************************/
154*495ae853SAndroid Build Coastguard Worker     /* Fill BS for mb egdex assuming non IBL case          */
155*495ae853SAndroid Build Coastguard Worker     /*******************************************************/
156*495ae853SAndroid Build Coastguard Worker 
157*495ae853SAndroid Build Coastguard Worker     /* only the  MB edges fall across IBL boundary */
158*495ae853SAndroid Build Coastguard Worker     if((0 != u1_curr_mb_ibl) || (0 != u1_top_mb_ibl) || (0 != u1_left_mb_ibl))
159*495ae853SAndroid Build Coastguard Worker     {
160*495ae853SAndroid Build Coastguard Worker         UWORD16 u2_temp, u2_i;
161*495ae853SAndroid Build Coastguard Worker         u2_temp = *pu2_left_res_luma_csbp;
162*495ae853SAndroid Build Coastguard Worker         for(u2_i = 0; u2_i < 4; u2_i++)
163*495ae853SAndroid Build Coastguard Worker         {
164*495ae853SAndroid Build Coastguard Worker             u1_left_mb_nnz |= ((u2_temp & 0x08) >> (3 - u2_i));
165*495ae853SAndroid Build Coastguard Worker             u2_temp >>= 4;
166*495ae853SAndroid Build Coastguard Worker         }
167*495ae853SAndroid Build Coastguard Worker         u2_curr_nnz = *pu2_curr_res_luma_csbp;
168*495ae853SAndroid Build Coastguard Worker         u2_top_horz_nnz = *pu2_top_res_luma_csbp >> 12;
169*495ae853SAndroid Build Coastguard Worker 
170*495ae853SAndroid Build Coastguard Worker         /* top is intra and not ibl */
171*495ae853SAndroid Build Coastguard Worker         if(0 != u1_top_intra)
172*495ae853SAndroid Build Coastguard Worker         {
173*495ae853SAndroid Build Coastguard Worker             pu4_bs_table[0] = 0x04040404;
174*495ae853SAndroid Build Coastguard Worker         }
175*495ae853SAndroid Build Coastguard Worker         /* left is intra and not ibl */
176*495ae853SAndroid Build Coastguard Worker         if(0 != u1_left_intra)
177*495ae853SAndroid Build Coastguard Worker         {
178*495ae853SAndroid Build Coastguard Worker             pu4_bs_table[4] = 0x04040404;
179*495ae853SAndroid Build Coastguard Worker         }
180*495ae853SAndroid Build Coastguard Worker 
181*495ae853SAndroid Build Coastguard Worker         /* assume neighbours are inter and update bs */
182*495ae853SAndroid Build Coastguard Worker 
183*495ae853SAndroid Build Coastguard Worker         /* Edge = 0 means Vert Edges and Edge = 1 means Horz edges */
184*495ae853SAndroid Build Coastguard Worker         for(i4_edge = 0; i4_edge < 2; i4_edge++)
185*495ae853SAndroid Build Coastguard Worker         {
186*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_p_nnz, u1_q_nnz;
187*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_bs_edge = 0;
188*495ae853SAndroid Build Coastguard Worker             WORD32 i4_bit_mask;
189*495ae853SAndroid Build Coastguard Worker             WORD32 i4_curr_intra_flag;
190*495ae853SAndroid Build Coastguard Worker             WORD32 i4_neibor_intra_flag;
191*495ae853SAndroid Build Coastguard Worker 
192*495ae853SAndroid Build Coastguard Worker             i4_curr_intra_flag = (0 != u1_curr_mb_ibl);
193*495ae853SAndroid Build Coastguard Worker 
194*495ae853SAndroid Build Coastguard Worker             if(0 != i4_edge)
195*495ae853SAndroid Build Coastguard Worker             {
196*495ae853SAndroid Build Coastguard Worker                 /* Initialize for the TOP edge */
197*495ae853SAndroid Build Coastguard Worker                 u1_p_nnz = (UWORD8) u2_top_horz_nnz;
198*495ae853SAndroid Build Coastguard Worker                 u1_q_nnz = (UWORD8) (u2_curr_nnz & g_au4_extract_set[0]);
199*495ae853SAndroid Build Coastguard Worker                 i4_neibor_intra_flag = (u1_top_mb_ibl || u1_top_intra);
200*495ae853SAndroid Build Coastguard Worker             }
201*495ae853SAndroid Build Coastguard Worker             else
202*495ae853SAndroid Build Coastguard Worker             {
203*495ae853SAndroid Build Coastguard Worker                 u1_p_nnz = u1_left_mb_nnz;
204*495ae853SAndroid Build Coastguard Worker                 u1_q_nnz = (UWORD8) isvcd_deblk_extract_bit_flags(u2_curr_nnz, 0x01);
205*495ae853SAndroid Build Coastguard Worker                 i4_neibor_intra_flag = (u1_left_mb_ibl || u1_left_intra);
206*495ae853SAndroid Build Coastguard Worker             }
207*495ae853SAndroid Build Coastguard Worker 
208*495ae853SAndroid Build Coastguard Worker             i4_bit_mask = 1;
209*495ae853SAndroid Build Coastguard Worker             /* find bs of 4 edges */
210*495ae853SAndroid Build Coastguard Worker             for(i4_i = 0; i4_i < 4; i4_i++)
211*495ae853SAndroid Build Coastguard Worker             {
212*495ae853SAndroid Build Coastguard Worker                 UWORD8 u1_p_nnz_temp, u1_q_nnz_temp;
213*495ae853SAndroid Build Coastguard Worker 
214*495ae853SAndroid Build Coastguard Worker                 u1_p_nnz_temp = (u1_p_nnz & i4_bit_mask);
215*495ae853SAndroid Build Coastguard Worker                 u1_q_nnz_temp = (u1_q_nnz & i4_bit_mask);
216*495ae853SAndroid Build Coastguard Worker 
217*495ae853SAndroid Build Coastguard Worker                 u1_cnd = ((u1_p_nnz_temp && (!i4_neibor_intra_flag)) ||
218*495ae853SAndroid Build Coastguard Worker                           (u1_q_nnz_temp && (!i4_curr_intra_flag)));
219*495ae853SAndroid Build Coastguard Worker 
220*495ae853SAndroid Build Coastguard Worker                 u1_bs = u1_cnd ? 2 : 1;
221*495ae853SAndroid Build Coastguard Worker 
222*495ae853SAndroid Build Coastguard Worker                 /* update the bs of the edge */
223*495ae853SAndroid Build Coastguard Worker                 u4_bs_edge = (u4_bs_edge << 8) + u1_bs;
224*495ae853SAndroid Build Coastguard Worker                 i4_bit_mask <<= 1;
225*495ae853SAndroid Build Coastguard Worker 
226*495ae853SAndroid Build Coastguard Worker             } /* end of loop over blk edges */
227*495ae853SAndroid Build Coastguard Worker 
228*495ae853SAndroid Build Coastguard Worker             /* update the bs of edges */
229*495ae853SAndroid Build Coastguard Worker             if(i4_edge && !u1_top_intra)
230*495ae853SAndroid Build Coastguard Worker             {
231*495ae853SAndroid Build Coastguard Worker                 pu4_bs_table[0] = u4_bs_edge;
232*495ae853SAndroid Build Coastguard Worker             }
233*495ae853SAndroid Build Coastguard Worker             else if(!i4_edge && !u1_left_intra)
234*495ae853SAndroid Build Coastguard Worker             {
235*495ae853SAndroid Build Coastguard Worker                 pu4_bs_table[4] = u4_bs_edge;
236*495ae853SAndroid Build Coastguard Worker             }
237*495ae853SAndroid Build Coastguard Worker         } /* end of loop over v1 vetical and horizontal edge */
238*495ae853SAndroid Build Coastguard Worker     }
239*495ae853SAndroid Build Coastguard Worker     /* current MB is IBL */
240*495ae853SAndroid Build Coastguard Worker     if(0 != u1_curr_mb_ibl)
241*495ae853SAndroid Build Coastguard Worker     {
242*495ae853SAndroid Build Coastguard Worker         UWORD16 u2_temp, u2_i;
243*495ae853SAndroid Build Coastguard Worker         WORD32 i4_bit_mask_edge = 1;
244*495ae853SAndroid Build Coastguard Worker 
245*495ae853SAndroid Build Coastguard Worker         u1_left_mb_nnz = 0;
246*495ae853SAndroid Build Coastguard Worker         u2_temp = ps_cur_mb_info->ps_left_mb->u2_luma_csbp;
247*495ae853SAndroid Build Coastguard Worker         for(u2_i = 0; u2_i < 4; u2_i++)
248*495ae853SAndroid Build Coastguard Worker         {
249*495ae853SAndroid Build Coastguard Worker             u1_left_mb_nnz |= ((u2_temp & 0x08) >> (3 - u2_i));
250*495ae853SAndroid Build Coastguard Worker             u2_temp >>= 4;
251*495ae853SAndroid Build Coastguard Worker         }
252*495ae853SAndroid Build Coastguard Worker         u2_curr_nnz = ps_cur_mb_info->ps_curmb->u2_luma_csbp;
253*495ae853SAndroid Build Coastguard Worker         u2_top_horz_nnz = ps_cur_mb_info->ps_top_mb->u2_luma_csbp >> 12;
254*495ae853SAndroid Build Coastguard Worker         /* all are IBL edges then use only t_coeff of current layer*/
255*495ae853SAndroid Build Coastguard Worker         /* loop over all edges */
256*495ae853SAndroid Build Coastguard Worker         for(i4_edge = 0; i4_edge < 4; i4_edge++)
257*495ae853SAndroid Build Coastguard Worker         {
258*495ae853SAndroid Build Coastguard Worker             UWORD16 u2_curr_horz_nnz = 0;
259*495ae853SAndroid Build Coastguard Worker             WORD32 i4_bit_mask = 1;
260*495ae853SAndroid Build Coastguard Worker 
261*495ae853SAndroid Build Coastguard Worker             u2_curr_horz_nnz = u2_curr_nnz & g_au4_extract_set[i4_edge];
262*495ae853SAndroid Build Coastguard Worker 
263*495ae853SAndroid Build Coastguard Worker             u2_curr_horz_nnz = (u2_curr_horz_nnz >> (i4_edge * 4));
264*495ae853SAndroid Build Coastguard Worker 
265*495ae853SAndroid Build Coastguard Worker             u1_left_nnz = (u1_left_mb_nnz & i4_bit_mask_edge);
266*495ae853SAndroid Build Coastguard Worker 
267*495ae853SAndroid Build Coastguard Worker             for(i4_i = 0; i4_i < 4; i4_i++)
268*495ae853SAndroid Build Coastguard Worker             {
269*495ae853SAndroid Build Coastguard Worker                 UWORD8 u1_curr_nnz, u1_top_nnz;
270*495ae853SAndroid Build Coastguard Worker 
271*495ae853SAndroid Build Coastguard Worker                 u1_curr_nnz = (u2_curr_horz_nnz & i4_bit_mask);
272*495ae853SAndroid Build Coastguard Worker                 u1_top_nnz = (u2_top_horz_nnz & i4_bit_mask);
273*495ae853SAndroid Build Coastguard Worker                 /* update bs horizontal */
274*495ae853SAndroid Build Coastguard Worker 
275*495ae853SAndroid Build Coastguard Worker                 if(!((1 == i4_horz_start) && (0 == i4_edge)))
276*495ae853SAndroid Build Coastguard Worker                 {
277*495ae853SAndroid Build Coastguard Worker                     u1_p_nnz = u1_top_nnz;
278*495ae853SAndroid Build Coastguard Worker                     u1_q_nnz = u1_curr_nnz;
279*495ae853SAndroid Build Coastguard Worker                     u1_cnd = !(u1_p_nnz || u1_q_nnz);
280*495ae853SAndroid Build Coastguard Worker                     u1_bs = u1_cnd ? 0 : 1;
281*495ae853SAndroid Build Coastguard Worker                     pu4_bs_table[i4_edge] = (pu4_bs_table[i4_edge] << 8) + u1_bs;
282*495ae853SAndroid Build Coastguard Worker                 }
283*495ae853SAndroid Build Coastguard Worker 
284*495ae853SAndroid Build Coastguard Worker                 /* update bs vertical */
285*495ae853SAndroid Build Coastguard Worker                 if(!((1 == i4_vertical_start) && (0 == i4_i)))
286*495ae853SAndroid Build Coastguard Worker                 {
287*495ae853SAndroid Build Coastguard Worker                     u1_p_nnz = u1_left_nnz;
288*495ae853SAndroid Build Coastguard Worker                     u1_q_nnz = u1_curr_nnz;
289*495ae853SAndroid Build Coastguard Worker                     u1_cnd = !(u1_p_nnz || u1_q_nnz);
290*495ae853SAndroid Build Coastguard Worker                     u1_bs = u1_cnd ? 0 : 1;
291*495ae853SAndroid Build Coastguard Worker                     pu4_bs_table[i4_i + 4] = (pu4_bs_table[i4_i + 4] << 8) + u1_bs;
292*495ae853SAndroid Build Coastguard Worker                 }
293*495ae853SAndroid Build Coastguard Worker                 /* store the current nnz to left nnz */
294*495ae853SAndroid Build Coastguard Worker                 u1_left_nnz = u1_curr_nnz;
295*495ae853SAndroid Build Coastguard Worker                 i4_bit_mask <<= 1;
296*495ae853SAndroid Build Coastguard Worker             }
297*495ae853SAndroid Build Coastguard Worker             /* store the current row nnz to top row nnz */
298*495ae853SAndroid Build Coastguard Worker             u2_top_horz_nnz = u2_curr_horz_nnz;
299*495ae853SAndroid Build Coastguard Worker             i4_bit_mask_edge <<= 1;
300*495ae853SAndroid Build Coastguard Worker         }
301*495ae853SAndroid Build Coastguard Worker     }
302*495ae853SAndroid Build Coastguard Worker     return;
303*495ae853SAndroid Build Coastguard Worker }
304*495ae853SAndroid Build Coastguard Worker 
305*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
306*495ae853SAndroid Build Coastguard Worker /*                                                                           */
307*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_compute_bs_non_mbaff_target_lyr_no_inter_layer     */
308*495ae853SAndroid Build Coastguard Worker /*                                                                           */
309*495ae853SAndroid Build Coastguard Worker /*  Description   : This function computes the pointers of left,top & current*/
310*495ae853SAndroid Build Coastguard Worker /*                : Nnz, MvPred & deblk_mb_t and supplies to FillBs function */
311*495ae853SAndroid Build Coastguard Worker /*                : for Boundary Strength Calculation                        */
312*495ae853SAndroid Build Coastguard Worker /*  Inputs        : <What inputs does the function take?>                    */
313*495ae853SAndroid Build Coastguard Worker /*  Processing    : This functions calls deblock MB in the MB increment order*/
314*495ae853SAndroid Build Coastguard Worker /*                                                                           */
315*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Produces the Boundary Strength for Current Mb            */
316*495ae853SAndroid Build Coastguard Worker /*  Returns       : None                                                     */
317*495ae853SAndroid Build Coastguard Worker /*                                                                           */
318*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
319*495ae853SAndroid Build Coastguard Worker /*                                                                           */
320*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
321*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore                                              */
322*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
323*495ae853SAndroid Build Coastguard Worker 
isvcd_compute_bs_non_mbaff_target_lyr_no_inter_layer(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info,const UWORD16 u2_mbxn_mb)324*495ae853SAndroid Build Coastguard Worker void isvcd_compute_bs_non_mbaff_target_lyr_no_inter_layer(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
325*495ae853SAndroid Build Coastguard Worker                                                           dec_mb_info_t *ps_cur_mb_info,
326*495ae853SAndroid Build Coastguard Worker                                                           const UWORD16 u2_mbxn_mb)
327*495ae853SAndroid Build Coastguard Worker {
328*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
329*495ae853SAndroid Build Coastguard Worker     /* Mvpred and Nnz for top and Courrent */
330*495ae853SAndroid Build Coastguard Worker     mv_pred_t *ps_cur_mv_pred, *ps_top_mv_pred = NULL, *ps_left_mv_pred;
331*495ae853SAndroid Build Coastguard Worker     /* deblk_mb_t Params */
332*495ae853SAndroid Build Coastguard Worker     deblk_mb_t *ps_cur_mb_params; /*< Parameters of current MacroBlock */
333*495ae853SAndroid Build Coastguard Worker     deblkmb_neighbour_t *ps_deblk_top_mb;
334*495ae853SAndroid Build Coastguard Worker 
335*495ae853SAndroid Build Coastguard Worker     /* Reference Index to POC mapping*/
336*495ae853SAndroid Build Coastguard Worker     void **apv_map_ref_idx_to_poc;
337*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_leftmbtype;
338*495ae853SAndroid Build Coastguard Worker 
339*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_left_csbp, u2_top_csbp, u2_cur_csbp;
340*495ae853SAndroid Build Coastguard Worker 
341*495ae853SAndroid Build Coastguard Worker     /* Set of flags */
342*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cur_mb_intra, u1_top_mb_typ, u4_cur_mb_fld;
343*495ae853SAndroid Build Coastguard Worker     UWORD32 u1_cur_mb_type;
344*495ae853SAndroid Build Coastguard Worker     UWORD32 *pu4_bs_table;
345*495ae853SAndroid Build Coastguard Worker 
346*495ae853SAndroid Build Coastguard Worker     /* Neighbour availability */
347*495ae853SAndroid Build Coastguard Worker     /* Initialization */
348*495ae853SAndroid Build Coastguard Worker     const UWORD32 u2_mbx = ps_cur_mb_info->u2_mbx;
349*495ae853SAndroid Build Coastguard Worker     const UWORD32 u2_mby = ps_cur_mb_info->u2_mby;
350*495ae853SAndroid Build Coastguard Worker     const UWORD32 u1_pingpong = u2_mbx & 0x01;
351*495ae853SAndroid Build Coastguard Worker 
352*495ae853SAndroid Build Coastguard Worker     PROFILE_DISABLE_BOUNDARY_STRENGTH()
353*495ae853SAndroid Build Coastguard Worker 
354*495ae853SAndroid Build Coastguard Worker     ps_deblk_top_mb = ps_dec->ps_deblk_top_mb + u2_mbx;
355*495ae853SAndroid Build Coastguard Worker 
356*495ae853SAndroid Build Coastguard Worker     /* Pointer assignment for Current DeblkMB, Current Mv Pred  */
357*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_params = ps_dec->ps_deblk_mbn + u2_mbxn_mb;
358*495ae853SAndroid Build Coastguard Worker     ps_cur_mv_pred = ps_dec->ps_mv_cur + (u2_mbxn_mb << 4);
359*495ae853SAndroid Build Coastguard Worker 
360*495ae853SAndroid Build Coastguard Worker     apv_map_ref_idx_to_poc = ps_dec->ppv_map_ref_idx_to_poc + 1;
361*495ae853SAndroid Build Coastguard Worker     u1_cur_mb_type = ps_cur_mb_params->u1_mb_type;
362*495ae853SAndroid Build Coastguard Worker     u1_top_mb_typ = ps_deblk_top_mb->u1_mb_type;
363*495ae853SAndroid Build Coastguard Worker     ps_deblk_top_mb->u1_mb_type = u1_cur_mb_type;
364*495ae853SAndroid Build Coastguard Worker 
365*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_params->u1_topmb_qp = ps_deblk_top_mb->u1_mb_qp;
366*495ae853SAndroid Build Coastguard Worker     ps_deblk_top_mb->u1_mb_qp = ps_cur_mb_params->u1_mb_qp;
367*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_params->u1_left_mb_qp = ps_dec->deblk_left_mb[1].u1_mb_qp;
368*495ae853SAndroid Build Coastguard Worker     ps_dec->deblk_left_mb[1].u1_mb_qp = ps_cur_mb_params->u1_mb_qp;
369*495ae853SAndroid Build Coastguard Worker 
370*495ae853SAndroid Build Coastguard Worker     /* if no deblocking required for current Mb then continue */
371*495ae853SAndroid Build Coastguard Worker     /* Check next Mbs   in Mb group                           */
372*495ae853SAndroid Build Coastguard Worker     if(ps_cur_mb_params->u1_deblocking_mode & MB_DISABLE_FILTERING)
373*495ae853SAndroid Build Coastguard Worker     {
374*495ae853SAndroid Build Coastguard Worker         void **pu4_map_ref_idx_to_poc_l1 = apv_map_ref_idx_to_poc + POC_LIST_L0_TO_L1_DIFF;
375*495ae853SAndroid Build Coastguard Worker         {
376*495ae853SAndroid Build Coastguard Worker             /* Store Parameter for Top MvPred refernce frame Address */
377*495ae853SAndroid Build Coastguard Worker 
378*495ae853SAndroid Build Coastguard Worker             void **ppv_top_mv_pred_addr = ps_cur_mb_info->ps_curmb->u4_pic_addrress;
379*495ae853SAndroid Build Coastguard Worker             WORD8 *p1_refTop0 = (ps_cur_mv_pred + 12)->i1_ref_frame;
380*495ae853SAndroid Build Coastguard Worker             WORD8 *p1_refTop1 = (ps_cur_mv_pred + 14)->i1_ref_frame;
381*495ae853SAndroid Build Coastguard Worker 
382*495ae853SAndroid Build Coastguard Worker             /* Store Left addresses for Next Mb   */
383*495ae853SAndroid Build Coastguard Worker             void **ppv_left_mv_pred_addr = ps_dec->ps_left_mvpred_addr[!u1_pingpong][1].u4_add;
384*495ae853SAndroid Build Coastguard Worker             WORD8 *p1_refleft0 = (ps_cur_mv_pred + 3)->i1_ref_frame;
385*495ae853SAndroid Build Coastguard Worker 
386*495ae853SAndroid Build Coastguard Worker             ppv_top_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refTop0[0]];
387*495ae853SAndroid Build Coastguard Worker             ppv_top_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refTop0[1]];
388*495ae853SAndroid Build Coastguard Worker 
389*495ae853SAndroid Build Coastguard Worker             ppv_left_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
390*495ae853SAndroid Build Coastguard Worker             ppv_top_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
391*495ae853SAndroid Build Coastguard Worker             ppv_left_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
392*495ae853SAndroid Build Coastguard Worker             ppv_top_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
393*495ae853SAndroid Build Coastguard Worker 
394*495ae853SAndroid Build Coastguard Worker             ppv_left_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refleft0[0]];
395*495ae853SAndroid Build Coastguard Worker             ppv_left_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refleft0[1]];
396*495ae853SAndroid Build Coastguard Worker             /* Storing the leftMbtype for next Mb */
397*495ae853SAndroid Build Coastguard Worker             ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type;
398*495ae853SAndroid Build Coastguard Worker         }
399*495ae853SAndroid Build Coastguard Worker 
400*495ae853SAndroid Build Coastguard Worker         return;
401*495ae853SAndroid Build Coastguard Worker     }
402*495ae853SAndroid Build Coastguard Worker 
403*495ae853SAndroid Build Coastguard Worker     /* Flag for extra left Edge */
404*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_params->u1_single_call = 1;
405*495ae853SAndroid Build Coastguard Worker 
406*495ae853SAndroid Build Coastguard Worker     /* Update the Left deblk_mb_t and Left MvPred Parameters           */
407*495ae853SAndroid Build Coastguard Worker     if(!u2_mbx)
408*495ae853SAndroid Build Coastguard Worker     {
409*495ae853SAndroid Build Coastguard Worker         u4_leftmbtype = 0;
410*495ae853SAndroid Build Coastguard Worker 
411*495ae853SAndroid Build Coastguard Worker         /* Initialize the ps_left_mv_pred with Junk but Valid Location */
412*495ae853SAndroid Build Coastguard Worker         /* to avoid invalid memory access                           */
413*495ae853SAndroid Build Coastguard Worker         /* this is read only pointer                                */
414*495ae853SAndroid Build Coastguard Worker         ps_left_mv_pred = ps_dec->ps_mv_cur + 3;
415*495ae853SAndroid Build Coastguard Worker     }
416*495ae853SAndroid Build Coastguard Worker     else
417*495ae853SAndroid Build Coastguard Worker     {
418*495ae853SAndroid Build Coastguard Worker         u4_leftmbtype = ps_dec->deblk_left_mb[1].u1_mb_type;
419*495ae853SAndroid Build Coastguard Worker 
420*495ae853SAndroid Build Coastguard Worker         /* Come to Left Most Edge of the MB */
421*495ae853SAndroid Build Coastguard Worker         ps_left_mv_pred =
422*495ae853SAndroid Build Coastguard Worker             (u2_mbxn_mb) ? ps_dec->ps_mv_cur + ((u2_mbxn_mb - 1) << 4) + 3 : ps_dec->ps_mv_left + 3;
423*495ae853SAndroid Build Coastguard Worker     }
424*495ae853SAndroid Build Coastguard Worker 
425*495ae853SAndroid Build Coastguard Worker     if(!u2_mby) u1_top_mb_typ = 0;
426*495ae853SAndroid Build Coastguard Worker 
427*495ae853SAndroid Build Coastguard Worker     /* MvPred Pointer Calculation */
428*495ae853SAndroid Build Coastguard Worker     ps_top_mv_pred = ps_cur_mv_pred - (ps_dec->u2_frm_wd_in_mbs << 4) + 12;
429*495ae853SAndroid Build Coastguard Worker 
430*495ae853SAndroid Build Coastguard Worker     u4_cur_mb_intra = u1_cur_mb_type & D_INTRA_MB;
431*495ae853SAndroid Build Coastguard Worker     u4_cur_mb_fld = !!(u1_cur_mb_type & D_FLD_MB);
432*495ae853SAndroid Build Coastguard Worker     /* Compute BS function */
433*495ae853SAndroid Build Coastguard Worker     pu4_bs_table = ps_cur_mb_params->u4_bs_table;
434*495ae853SAndroid Build Coastguard Worker 
435*495ae853SAndroid Build Coastguard Worker     u2_cur_csbp = ps_cur_mb_info->ps_curmb->u2_luma_csbp;
436*495ae853SAndroid Build Coastguard Worker     u2_left_csbp = ps_cur_mb_info->ps_left_mb->u2_luma_csbp;
437*495ae853SAndroid Build Coastguard Worker     u2_top_csbp = ps_cur_mb_info->ps_top_mb->u2_luma_csbp;
438*495ae853SAndroid Build Coastguard Worker     /* Compute BS function */
439*495ae853SAndroid Build Coastguard Worker     if((ps_dec->ps_cur_sps->u1_profile_idc == HIGH_PROFILE_IDC) ||
440*495ae853SAndroid Build Coastguard Worker        (ps_dec->ps_cur_sps->u1_profile_idc == SCALABLE_HIGH_PROFILE_IDC) ||
441*495ae853SAndroid Build Coastguard Worker        (ps_dec->ps_cur_sps->u1_profile_idc == SCALABLE_BASELINE_PROFILE_IDC))
442*495ae853SAndroid Build Coastguard Worker     {
443*495ae853SAndroid Build Coastguard Worker         if(ps_cur_mb_info->u1_tran_form8x8 == 1)
444*495ae853SAndroid Build Coastguard Worker         {
445*495ae853SAndroid Build Coastguard Worker             u2_cur_csbp = ih264d_update_csbp_8x8(ps_cur_mb_info->ps_curmb->u2_luma_csbp);
446*495ae853SAndroid Build Coastguard Worker         }
447*495ae853SAndroid Build Coastguard Worker 
448*495ae853SAndroid Build Coastguard Worker         if(ps_cur_mb_info->ps_left_mb->u1_tran_form8x8 == 1)
449*495ae853SAndroid Build Coastguard Worker         {
450*495ae853SAndroid Build Coastguard Worker             u2_left_csbp = ih264d_update_csbp_8x8(ps_cur_mb_info->ps_left_mb->u2_luma_csbp);
451*495ae853SAndroid Build Coastguard Worker         }
452*495ae853SAndroid Build Coastguard Worker 
453*495ae853SAndroid Build Coastguard Worker         if(ps_cur_mb_info->ps_top_mb->u1_tran_form8x8 == 1)
454*495ae853SAndroid Build Coastguard Worker         {
455*495ae853SAndroid Build Coastguard Worker             u2_top_csbp = ih264d_update_csbp_8x8(ps_cur_mb_info->ps_top_mb->u2_luma_csbp);
456*495ae853SAndroid Build Coastguard Worker         }
457*495ae853SAndroid Build Coastguard Worker     }
458*495ae853SAndroid Build Coastguard Worker     if(u4_cur_mb_intra)
459*495ae853SAndroid Build Coastguard Worker     {
460*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[4] = 0x04040404;
461*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[0] = u4_cur_mb_fld ? 0x03030303 : 0x04040404;
462*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[1] = 0x03030303;
463*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[2] = 0x03030303;
464*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[3] = 0x03030303;
465*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[5] = 0x03030303;
466*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[6] = 0x03030303;
467*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[7] = 0x03030303;
468*495ae853SAndroid Build Coastguard Worker     }
469*495ae853SAndroid Build Coastguard Worker     else
470*495ae853SAndroid Build Coastguard Worker     {
471*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_is_non16x16 = !!(u1_cur_mb_type & D_PRED_NON_16x16);
472*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_is_b = ps_dec->u1_B;
473*495ae853SAndroid Build Coastguard Worker 
474*495ae853SAndroid Build Coastguard Worker         ih264d_fill_bs2_horz_vert(pu4_bs_table, u2_left_csbp, u2_top_csbp, u2_cur_csbp,
475*495ae853SAndroid Build Coastguard Worker                                   (const UWORD32 *) (gau4_ih264d_packed_bs2),
476*495ae853SAndroid Build Coastguard Worker                                   (const UWORD16 *) (gau2_ih264d_4x4_v2h_reorder));
477*495ae853SAndroid Build Coastguard Worker 
478*495ae853SAndroid Build Coastguard Worker         if(u4_leftmbtype & D_INTRA_MB) pu4_bs_table[4] = 0x04040404;
479*495ae853SAndroid Build Coastguard Worker 
480*495ae853SAndroid Build Coastguard Worker         if(u1_top_mb_typ & D_INTRA_MB) pu4_bs_table[0] = u4_cur_mb_fld ? 0x03030303 : 0x04040404;
481*495ae853SAndroid Build Coastguard Worker 
482*495ae853SAndroid Build Coastguard Worker         ps_dec->pf_fill_bs1[u4_is_b][u4_is_non16x16](
483*495ae853SAndroid Build Coastguard Worker             ps_cur_mv_pred, ps_top_mv_pred, apv_map_ref_idx_to_poc, pu4_bs_table, ps_left_mv_pred,
484*495ae853SAndroid Build Coastguard Worker             &(ps_dec->ps_left_mvpred_addr[u1_pingpong][1]),
485*495ae853SAndroid Build Coastguard Worker             ps_cur_mb_info->ps_top_mb->u4_pic_addrress, (4 >> u4_cur_mb_fld));
486*495ae853SAndroid Build Coastguard Worker     }
487*495ae853SAndroid Build Coastguard Worker 
488*495ae853SAndroid Build Coastguard Worker     {
489*495ae853SAndroid Build Coastguard Worker         void **pu4_map_ref_idx_to_poc_l1 = apv_map_ref_idx_to_poc + POC_LIST_L0_TO_L1_DIFF;
490*495ae853SAndroid Build Coastguard Worker         {
491*495ae853SAndroid Build Coastguard Worker             /* Store Parameter for Top MvPred refernce frame Address */
492*495ae853SAndroid Build Coastguard Worker 
493*495ae853SAndroid Build Coastguard Worker             void **ppv_top_mv_pred_addr = ps_cur_mb_info->ps_curmb->u4_pic_addrress;
494*495ae853SAndroid Build Coastguard Worker             WORD8 *p1_refTop0 = (ps_cur_mv_pred + 12)->i1_ref_frame;
495*495ae853SAndroid Build Coastguard Worker             WORD8 *p1_refTop1 = (ps_cur_mv_pred + 14)->i1_ref_frame;
496*495ae853SAndroid Build Coastguard Worker 
497*495ae853SAndroid Build Coastguard Worker             /* Store Left addresses for Next Mb   */
498*495ae853SAndroid Build Coastguard Worker             void **ppv_left_mv_pred_addr = ps_dec->ps_left_mvpred_addr[!u1_pingpong][1].u4_add;
499*495ae853SAndroid Build Coastguard Worker             WORD8 *p1_refleft0 = (ps_cur_mv_pred + 3)->i1_ref_frame;
500*495ae853SAndroid Build Coastguard Worker 
501*495ae853SAndroid Build Coastguard Worker             ppv_top_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refTop0[0]];
502*495ae853SAndroid Build Coastguard Worker             ppv_top_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refTop0[1]];
503*495ae853SAndroid Build Coastguard Worker 
504*495ae853SAndroid Build Coastguard Worker             ppv_left_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
505*495ae853SAndroid Build Coastguard Worker             ppv_top_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
506*495ae853SAndroid Build Coastguard Worker             ppv_left_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
507*495ae853SAndroid Build Coastguard Worker             ppv_top_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
508*495ae853SAndroid Build Coastguard Worker 
509*495ae853SAndroid Build Coastguard Worker             ppv_left_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refleft0[0]];
510*495ae853SAndroid Build Coastguard Worker             ppv_left_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refleft0[1]];
511*495ae853SAndroid Build Coastguard Worker 
512*495ae853SAndroid Build Coastguard Worker             /* Storing the leftMbtype for next Mb */
513*495ae853SAndroid Build Coastguard Worker             ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type;
514*495ae853SAndroid Build Coastguard Worker         }
515*495ae853SAndroid Build Coastguard Worker     }
516*495ae853SAndroid Build Coastguard Worker 
517*495ae853SAndroid Build Coastguard Worker     /* For transform 8x8 disable deblocking of the intrernal edges of a 8x8 block */
518*495ae853SAndroid Build Coastguard Worker     if(ps_cur_mb_info->u1_tran_form8x8)
519*495ae853SAndroid Build Coastguard Worker     {
520*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[1] = 0;
521*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[3] = 0;
522*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[5] = 0;
523*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[7] = 0;
524*495ae853SAndroid Build Coastguard Worker     }
525*495ae853SAndroid Build Coastguard Worker }
526*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
527*495ae853SAndroid Build Coastguard Worker /*                                                                           */
528*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_compute_bs_non_mbaff                               */
529*495ae853SAndroid Build Coastguard Worker /*                                                                           */
530*495ae853SAndroid Build Coastguard Worker /*  Description   : This function computes the pointers of left,top & current*/
531*495ae853SAndroid Build Coastguard Worker /*                : Nnz, MvPred & deblk_mb_t and supplies to FillBs function */
532*495ae853SAndroid Build Coastguard Worker /*                : for Boundary Strength Calculation                        */
533*495ae853SAndroid Build Coastguard Worker /*  Inputs        : <What inputs does the function take?>                    */
534*495ae853SAndroid Build Coastguard Worker /*  Processing    : This functions calls deblock MB in the MB increment order*/
535*495ae853SAndroid Build Coastguard Worker /*                                                                           */
536*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Produces the Boundary Strength for Current Mb            */
537*495ae853SAndroid Build Coastguard Worker /*  Returns       : None                                                     */
538*495ae853SAndroid Build Coastguard Worker /*                                                                           */
539*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
540*495ae853SAndroid Build Coastguard Worker /*                                                                           */
541*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
542*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore                                              */
543*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
544*495ae853SAndroid Build Coastguard Worker 
isvcd_compute_bs_non_mbaff(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info,const UWORD16 u2_mbxn_mb)545*495ae853SAndroid Build Coastguard Worker void isvcd_compute_bs_non_mbaff(svc_dec_lyr_struct_t *ps_svc_lyr_dec, dec_mb_info_t *ps_cur_mb_info,
546*495ae853SAndroid Build Coastguard Worker                                 const UWORD16 u2_mbxn_mb)
547*495ae853SAndroid Build Coastguard Worker {
548*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
549*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_compute_bs(ps_dec, ps_cur_mb_info, u2_mbxn_mb);
550*495ae853SAndroid Build Coastguard Worker }
551*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
552*495ae853SAndroid Build Coastguard Worker /*                                                                           */
553*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_compute_bs_non_mbaff_target_lyr                    */
554*495ae853SAndroid Build Coastguard Worker /*                                                                           */
555*495ae853SAndroid Build Coastguard Worker /*  Description   : This function computes the pointers of left,top & current*/
556*495ae853SAndroid Build Coastguard Worker /*                : Nnz, MvPred & deblk_mb_t and supplies to FillBs function */
557*495ae853SAndroid Build Coastguard Worker /*                : for Boundary Strength Calculation                        */
558*495ae853SAndroid Build Coastguard Worker /*  Inputs        : <What inputs does the function take?>                    */
559*495ae853SAndroid Build Coastguard Worker /*  Processing    : This functions calls deblock MB in the MB increment order*/
560*495ae853SAndroid Build Coastguard Worker /*                                                                           */
561*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Produces the Boundary Strength for Current Mb            */
562*495ae853SAndroid Build Coastguard Worker /*  Returns       : None                                                     */
563*495ae853SAndroid Build Coastguard Worker /*                                                                           */
564*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
565*495ae853SAndroid Build Coastguard Worker /*                                                                           */
566*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
567*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore                                              */
568*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
569*495ae853SAndroid Build Coastguard Worker 
isvcd_compute_bs_non_mbaff_target_lyr(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info,const UWORD16 u2_mbxn_mb)570*495ae853SAndroid Build Coastguard Worker void isvcd_compute_bs_non_mbaff_target_lyr(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
571*495ae853SAndroid Build Coastguard Worker                                            dec_mb_info_t *ps_cur_mb_info, const UWORD16 u2_mbxn_mb)
572*495ae853SAndroid Build Coastguard Worker {
573*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
574*495ae853SAndroid Build Coastguard Worker     /* Mvpred and Nnz for top and Courrent */
575*495ae853SAndroid Build Coastguard Worker     mv_pred_t *ps_cur_mv_pred, *ps_top_mv_pred = NULL, *ps_left_mv_pred;
576*495ae853SAndroid Build Coastguard Worker     /* deblk_mb_t Params */
577*495ae853SAndroid Build Coastguard Worker     deblk_mb_t *ps_cur_mb_params; /*< Parameters of current MacroBlock */
578*495ae853SAndroid Build Coastguard Worker     deblkmb_neighbour_t *ps_deblk_top_mb;
579*495ae853SAndroid Build Coastguard Worker 
580*495ae853SAndroid Build Coastguard Worker     /* Reference Index to POC mapping*/
581*495ae853SAndroid Build Coastguard Worker     void **apv_map_ref_idx_to_poc;
582*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_leftmbtype;
583*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_left_csbp, u2_top_csbp, u2_cur_csbp;
584*495ae853SAndroid Build Coastguard Worker 
585*495ae853SAndroid Build Coastguard Worker     /* Set of flags */
586*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cur_mb_intra, u1_top_mb_typ, u4_cur_mb_fld;
587*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cur_mb_ibl;
588*495ae853SAndroid Build Coastguard Worker     UWORD32 u1_cur_mb_type;
589*495ae853SAndroid Build Coastguard Worker     UWORD32 *pu4_bs_table;
590*495ae853SAndroid Build Coastguard Worker 
591*495ae853SAndroid Build Coastguard Worker     UWORD16 *pu2_curr_res_luma_csbp;
592*495ae853SAndroid Build Coastguard Worker     UWORD16 *pu2_left_res_luma_csbp;
593*495ae853SAndroid Build Coastguard Worker     UWORD16 *pu2_top_res_luma_csbp;
594*495ae853SAndroid Build Coastguard Worker 
595*495ae853SAndroid Build Coastguard Worker     /* Neighbour availability */
596*495ae853SAndroid Build Coastguard Worker     /* Initialization */
597*495ae853SAndroid Build Coastguard Worker     const UWORD32 u2_mbx = ps_cur_mb_info->u2_mbx;
598*495ae853SAndroid Build Coastguard Worker     const UWORD32 u2_mby = ps_cur_mb_info->u2_mby;
599*495ae853SAndroid Build Coastguard Worker     const UWORD32 u1_pingpong = u2_mbx & 0x01;
600*495ae853SAndroid Build Coastguard Worker 
601*495ae853SAndroid Build Coastguard Worker     PROFILE_DISABLE_BOUNDARY_STRENGTH()
602*495ae853SAndroid Build Coastguard Worker 
603*495ae853SAndroid Build Coastguard Worker     ps_deblk_top_mb = ps_dec->ps_deblk_top_mb + u2_mbx;
604*495ae853SAndroid Build Coastguard Worker 
605*495ae853SAndroid Build Coastguard Worker     /* Pointer assignment for Current DeblkMB, Current Mv Pred  */
606*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_params = ps_dec->ps_deblk_mbn + u2_mbxn_mb;
607*495ae853SAndroid Build Coastguard Worker     ps_cur_mv_pred = ps_dec->ps_mv_cur + (u2_mbxn_mb << 4);
608*495ae853SAndroid Build Coastguard Worker 
609*495ae853SAndroid Build Coastguard Worker     /*Pointer assignment for Residual NNZ */
610*495ae853SAndroid Build Coastguard Worker     pu2_curr_res_luma_csbp = ps_svc_lyr_dec->pu2_frm_res_luma_csbp + ps_cur_mb_info->u2_mbx;
611*495ae853SAndroid Build Coastguard Worker     pu2_curr_res_luma_csbp += ps_cur_mb_info->u2_mby * ps_svc_lyr_dec->i4_frm_res_luma_csbp_stride;
612*495ae853SAndroid Build Coastguard Worker 
613*495ae853SAndroid Build Coastguard Worker     pu2_left_res_luma_csbp = pu2_curr_res_luma_csbp - (ps_cur_mb_info->u2_mbx != 0);
614*495ae853SAndroid Build Coastguard Worker     pu2_top_res_luma_csbp = pu2_curr_res_luma_csbp - ((ps_cur_mb_info->u2_mby != 0) *
615*495ae853SAndroid Build Coastguard Worker                                                       ps_svc_lyr_dec->i4_frm_res_luma_csbp_stride);
616*495ae853SAndroid Build Coastguard Worker 
617*495ae853SAndroid Build Coastguard Worker     apv_map_ref_idx_to_poc = ps_dec->ppv_map_ref_idx_to_poc + 1;
618*495ae853SAndroid Build Coastguard Worker     u1_cur_mb_type = ps_cur_mb_params->u1_mb_type;
619*495ae853SAndroid Build Coastguard Worker     u1_top_mb_typ = ps_deblk_top_mb->u1_mb_type;
620*495ae853SAndroid Build Coastguard Worker     ps_deblk_top_mb->u1_mb_type = u1_cur_mb_type;
621*495ae853SAndroid Build Coastguard Worker 
622*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_params->u1_topmb_qp = ps_deblk_top_mb->u1_mb_qp;
623*495ae853SAndroid Build Coastguard Worker     ps_deblk_top_mb->u1_mb_qp = ps_cur_mb_params->u1_mb_qp;
624*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_params->u1_left_mb_qp = ps_dec->deblk_left_mb[1].u1_mb_qp;
625*495ae853SAndroid Build Coastguard Worker     ps_dec->deblk_left_mb[1].u1_mb_qp = ps_cur_mb_params->u1_mb_qp;
626*495ae853SAndroid Build Coastguard Worker 
627*495ae853SAndroid Build Coastguard Worker     /* if no deblocking required for current Mb then continue */
628*495ae853SAndroid Build Coastguard Worker     /* Check next Mbs   in Mb group                           */
629*495ae853SAndroid Build Coastguard Worker     if(ps_cur_mb_params->u1_deblocking_mode & MB_DISABLE_FILTERING)
630*495ae853SAndroid Build Coastguard Worker     {
631*495ae853SAndroid Build Coastguard Worker         void **pu4_map_ref_idx_to_poc_l1 = apv_map_ref_idx_to_poc + POC_LIST_L0_TO_L1_DIFF;
632*495ae853SAndroid Build Coastguard Worker 
633*495ae853SAndroid Build Coastguard Worker         /* Store Parameter for Top MvPred refernce frame Address */
634*495ae853SAndroid Build Coastguard Worker         void **ppv_top_mv_pred_addr = ps_cur_mb_info->ps_curmb->u4_pic_addrress;
635*495ae853SAndroid Build Coastguard Worker         WORD8 *p1_refTop0 = (ps_cur_mv_pred + 12)->i1_ref_frame;
636*495ae853SAndroid Build Coastguard Worker         WORD8 *p1_refTop1 = (ps_cur_mv_pred + 14)->i1_ref_frame;
637*495ae853SAndroid Build Coastguard Worker 
638*495ae853SAndroid Build Coastguard Worker         /* Store Left addresses for Next Mb   */
639*495ae853SAndroid Build Coastguard Worker         void **ppv_left_mv_pred_addr = ps_dec->ps_left_mvpred_addr[!u1_pingpong][1].u4_add;
640*495ae853SAndroid Build Coastguard Worker         WORD8 *p1_refleft0 = (ps_cur_mv_pred + 3)->i1_ref_frame;
641*495ae853SAndroid Build Coastguard Worker 
642*495ae853SAndroid Build Coastguard Worker         ppv_top_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refTop0[0]];
643*495ae853SAndroid Build Coastguard Worker         ppv_top_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refTop0[1]];
644*495ae853SAndroid Build Coastguard Worker 
645*495ae853SAndroid Build Coastguard Worker         ppv_left_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
646*495ae853SAndroid Build Coastguard Worker         ppv_top_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
647*495ae853SAndroid Build Coastguard Worker         ppv_left_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
648*495ae853SAndroid Build Coastguard Worker         ppv_top_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
649*495ae853SAndroid Build Coastguard Worker 
650*495ae853SAndroid Build Coastguard Worker         ppv_left_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refleft0[0]];
651*495ae853SAndroid Build Coastguard Worker         ppv_left_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refleft0[1]];
652*495ae853SAndroid Build Coastguard Worker         /* Storing the leftMbtype for next Mb */
653*495ae853SAndroid Build Coastguard Worker         ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type;
654*495ae853SAndroid Build Coastguard Worker 
655*495ae853SAndroid Build Coastguard Worker         return;
656*495ae853SAndroid Build Coastguard Worker     }
657*495ae853SAndroid Build Coastguard Worker 
658*495ae853SAndroid Build Coastguard Worker     /* Flag for extra left Edge */
659*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_params->u1_single_call = 1;
660*495ae853SAndroid Build Coastguard Worker 
661*495ae853SAndroid Build Coastguard Worker     /* Update the Left deblk_mb_t and Left MvPred Parameters           */
662*495ae853SAndroid Build Coastguard Worker     if(!u2_mbx)
663*495ae853SAndroid Build Coastguard Worker     {
664*495ae853SAndroid Build Coastguard Worker         u4_leftmbtype = 0;
665*495ae853SAndroid Build Coastguard Worker 
666*495ae853SAndroid Build Coastguard Worker         /* Initialize the ps_left_mv_pred with Junk but Valid Location */
667*495ae853SAndroid Build Coastguard Worker         /* to avoid invalid memory access                           */
668*495ae853SAndroid Build Coastguard Worker         /* this is read only pointer                                */
669*495ae853SAndroid Build Coastguard Worker         ps_left_mv_pred = ps_dec->ps_mv_cur + 3;
670*495ae853SAndroid Build Coastguard Worker     }
671*495ae853SAndroid Build Coastguard Worker     else
672*495ae853SAndroid Build Coastguard Worker     {
673*495ae853SAndroid Build Coastguard Worker         u4_leftmbtype = ps_dec->deblk_left_mb[1].u1_mb_type;
674*495ae853SAndroid Build Coastguard Worker 
675*495ae853SAndroid Build Coastguard Worker         /* Come to Left Most Edge of the MB */
676*495ae853SAndroid Build Coastguard Worker         ps_left_mv_pred =
677*495ae853SAndroid Build Coastguard Worker             (u2_mbxn_mb) ? ps_dec->ps_mv_cur + ((u2_mbxn_mb - 1) << 4) + 3 : ps_dec->ps_mv_left + 3;
678*495ae853SAndroid Build Coastguard Worker     }
679*495ae853SAndroid Build Coastguard Worker 
680*495ae853SAndroid Build Coastguard Worker     if(!u2_mby) u1_top_mb_typ = 0;
681*495ae853SAndroid Build Coastguard Worker 
682*495ae853SAndroid Build Coastguard Worker     /* MvPred Pointer Calculation */
683*495ae853SAndroid Build Coastguard Worker     ps_top_mv_pred = ps_cur_mv_pred - (ps_dec->u2_frm_wd_in_mbs << 4) + 12;
684*495ae853SAndroid Build Coastguard Worker     u4_cur_mb_intra = u1_cur_mb_type & D_INTRA_MB;
685*495ae853SAndroid Build Coastguard Worker     u4_cur_mb_ibl = u1_cur_mb_type & D_INTRA_IBL;
686*495ae853SAndroid Build Coastguard Worker     u4_cur_mb_fld = !!(u1_cur_mb_type & D_FLD_MB);
687*495ae853SAndroid Build Coastguard Worker     /* Compute BS function */
688*495ae853SAndroid Build Coastguard Worker     pu4_bs_table = ps_cur_mb_params->u4_bs_table;
689*495ae853SAndroid Build Coastguard Worker 
690*495ae853SAndroid Build Coastguard Worker     u2_cur_csbp = ps_cur_mb_info->ps_curmb->u2_luma_csbp;
691*495ae853SAndroid Build Coastguard Worker     u2_left_csbp = ps_cur_mb_info->ps_left_mb->u2_luma_csbp;
692*495ae853SAndroid Build Coastguard Worker     u2_top_csbp = ps_cur_mb_info->ps_top_mb->u2_luma_csbp;
693*495ae853SAndroid Build Coastguard Worker     /* Compute BS function */
694*495ae853SAndroid Build Coastguard Worker     if((ps_dec->ps_cur_sps->u1_profile_idc == HIGH_PROFILE_IDC) ||
695*495ae853SAndroid Build Coastguard Worker        (ps_dec->ps_cur_sps->u1_profile_idc == SCALABLE_HIGH_PROFILE_IDC) ||
696*495ae853SAndroid Build Coastguard Worker        (ps_dec->ps_cur_sps->u1_profile_idc == SCALABLE_BASELINE_PROFILE_IDC))
697*495ae853SAndroid Build Coastguard Worker     {
698*495ae853SAndroid Build Coastguard Worker         if(ps_cur_mb_info->u1_tran_form8x8 == 1)
699*495ae853SAndroid Build Coastguard Worker         {
700*495ae853SAndroid Build Coastguard Worker             u2_cur_csbp = ih264d_update_csbp_8x8(ps_cur_mb_info->ps_curmb->u2_luma_csbp);
701*495ae853SAndroid Build Coastguard Worker             ps_cur_mb_info->ps_curmb->u2_luma_csbp = u2_cur_csbp;
702*495ae853SAndroid Build Coastguard Worker         }
703*495ae853SAndroid Build Coastguard Worker     }
704*495ae853SAndroid Build Coastguard Worker     u2_cur_csbp |= *pu2_curr_res_luma_csbp;
705*495ae853SAndroid Build Coastguard Worker     u2_left_csbp |= *pu2_left_res_luma_csbp;
706*495ae853SAndroid Build Coastguard Worker     u2_top_csbp |= *pu2_top_res_luma_csbp;
707*495ae853SAndroid Build Coastguard Worker 
708*495ae853SAndroid Build Coastguard Worker     if(u4_cur_mb_intra)
709*495ae853SAndroid Build Coastguard Worker     {
710*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[4] = 0x04040404;
711*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[0] = u4_cur_mb_fld ? 0x03030303 : 0x04040404;
712*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[1] = 0x03030303;
713*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[2] = 0x03030303;
714*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[3] = 0x03030303;
715*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[5] = 0x03030303;
716*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[6] = 0x03030303;
717*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[7] = 0x03030303;
718*495ae853SAndroid Build Coastguard Worker     }
719*495ae853SAndroid Build Coastguard Worker     else
720*495ae853SAndroid Build Coastguard Worker     {
721*495ae853SAndroid Build Coastguard Worker         isvcd_fill_bs_ibl(ps_cur_mb_params, u1_top_mb_typ, u4_leftmbtype, ps_cur_mb_info,
722*495ae853SAndroid Build Coastguard Worker                           pu2_curr_res_luma_csbp, pu2_left_res_luma_csbp, pu2_top_res_luma_csbp);
723*495ae853SAndroid Build Coastguard Worker 
724*495ae853SAndroid Build Coastguard Worker         if(!u4_cur_mb_ibl)
725*495ae853SAndroid Build Coastguard Worker         {
726*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_is_non16x16 = !!(u1_cur_mb_type & D_PRED_NON_16x16);
727*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_is_b = ps_dec->u1_B;
728*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_bs_0, u4_bs_4;
729*495ae853SAndroid Build Coastguard Worker 
730*495ae853SAndroid Build Coastguard Worker             u4_bs_0 = pu4_bs_table[0];
731*495ae853SAndroid Build Coastguard Worker             u4_bs_4 = pu4_bs_table[4];
732*495ae853SAndroid Build Coastguard Worker 
733*495ae853SAndroid Build Coastguard Worker             ih264d_fill_bs2_horz_vert(pu4_bs_table, u2_left_csbp, u2_top_csbp, u2_cur_csbp,
734*495ae853SAndroid Build Coastguard Worker                                       (const UWORD32 *) (gau4_ih264d_packed_bs2),
735*495ae853SAndroid Build Coastguard Worker                                       (const UWORD16 *) (gau2_ih264d_4x4_v2h_reorder));
736*495ae853SAndroid Build Coastguard Worker 
737*495ae853SAndroid Build Coastguard Worker             if(u4_leftmbtype & D_INTRA_MB)
738*495ae853SAndroid Build Coastguard Worker             {
739*495ae853SAndroid Build Coastguard Worker                 pu4_bs_table[4] = 0x04040404;
740*495ae853SAndroid Build Coastguard Worker             }
741*495ae853SAndroid Build Coastguard Worker             else if(u4_leftmbtype & D_INTRA_IBL)
742*495ae853SAndroid Build Coastguard Worker             {
743*495ae853SAndroid Build Coastguard Worker                 pu4_bs_table[4] = u4_bs_4;
744*495ae853SAndroid Build Coastguard Worker             }
745*495ae853SAndroid Build Coastguard Worker 
746*495ae853SAndroid Build Coastguard Worker             if(u1_top_mb_typ & D_INTRA_MB)
747*495ae853SAndroid Build Coastguard Worker             {
748*495ae853SAndroid Build Coastguard Worker                 pu4_bs_table[0] = u4_cur_mb_fld ? 0x03030303 : 0x04040404;
749*495ae853SAndroid Build Coastguard Worker             }
750*495ae853SAndroid Build Coastguard Worker             else if(u1_top_mb_typ & D_INTRA_IBL)
751*495ae853SAndroid Build Coastguard Worker             {
752*495ae853SAndroid Build Coastguard Worker                 pu4_bs_table[0] = u4_bs_0;
753*495ae853SAndroid Build Coastguard Worker             }
754*495ae853SAndroid Build Coastguard Worker 
755*495ae853SAndroid Build Coastguard Worker             ps_dec->pf_fill_bs1[u4_is_b][u4_is_non16x16](
756*495ae853SAndroid Build Coastguard Worker                 ps_cur_mv_pred, ps_top_mv_pred, apv_map_ref_idx_to_poc, pu4_bs_table,
757*495ae853SAndroid Build Coastguard Worker                 ps_left_mv_pred, &(ps_dec->ps_left_mvpred_addr[u1_pingpong][1]),
758*495ae853SAndroid Build Coastguard Worker                 ps_cur_mb_info->ps_top_mb->u4_pic_addrress, (4 >> u4_cur_mb_fld));
759*495ae853SAndroid Build Coastguard Worker         }
760*495ae853SAndroid Build Coastguard Worker     }
761*495ae853SAndroid Build Coastguard Worker 
762*495ae853SAndroid Build Coastguard Worker     {
763*495ae853SAndroid Build Coastguard Worker         void **pu4_map_ref_idx_to_poc_l1 = apv_map_ref_idx_to_poc + POC_LIST_L0_TO_L1_DIFF;
764*495ae853SAndroid Build Coastguard Worker         /* Store Parameter for Top MvPred refernce frame Address */
765*495ae853SAndroid Build Coastguard Worker         void **ppv_top_mv_pred_addr = ps_cur_mb_info->ps_curmb->u4_pic_addrress;
766*495ae853SAndroid Build Coastguard Worker         WORD8 *p1_refTop0 = (ps_cur_mv_pred + 12)->i1_ref_frame;
767*495ae853SAndroid Build Coastguard Worker         WORD8 *p1_refTop1 = (ps_cur_mv_pred + 14)->i1_ref_frame;
768*495ae853SAndroid Build Coastguard Worker 
769*495ae853SAndroid Build Coastguard Worker         /* Store Left addresses for Next Mb   */
770*495ae853SAndroid Build Coastguard Worker         void **ppv_left_mv_pred_addr = ps_dec->ps_left_mvpred_addr[!u1_pingpong][1].u4_add;
771*495ae853SAndroid Build Coastguard Worker         WORD8 *p1_refleft0 = (ps_cur_mv_pred + 3)->i1_ref_frame;
772*495ae853SAndroid Build Coastguard Worker 
773*495ae853SAndroid Build Coastguard Worker         ppv_top_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refTop0[0]];
774*495ae853SAndroid Build Coastguard Worker         ppv_top_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refTop0[1]];
775*495ae853SAndroid Build Coastguard Worker 
776*495ae853SAndroid Build Coastguard Worker         ppv_left_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
777*495ae853SAndroid Build Coastguard Worker         ppv_top_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
778*495ae853SAndroid Build Coastguard Worker         ppv_left_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
779*495ae853SAndroid Build Coastguard Worker         ppv_top_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
780*495ae853SAndroid Build Coastguard Worker 
781*495ae853SAndroid Build Coastguard Worker         ppv_left_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refleft0[0]];
782*495ae853SAndroid Build Coastguard Worker         ppv_left_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refleft0[1]];
783*495ae853SAndroid Build Coastguard Worker 
784*495ae853SAndroid Build Coastguard Worker         /* Storing the leftMbtype for next Mb */
785*495ae853SAndroid Build Coastguard Worker         ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type;
786*495ae853SAndroid Build Coastguard Worker     }
787*495ae853SAndroid Build Coastguard Worker 
788*495ae853SAndroid Build Coastguard Worker     /* For transform 8x8 disable deblocking of the intrernal edges of a 8x8 block */
789*495ae853SAndroid Build Coastguard Worker     if(ps_cur_mb_info->u1_tran_form8x8)
790*495ae853SAndroid Build Coastguard Worker     {
791*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[1] = 0;
792*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[3] = 0;
793*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[5] = 0;
794*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[7] = 0;
795*495ae853SAndroid Build Coastguard Worker     }
796*495ae853SAndroid Build Coastguard Worker }
797*495ae853SAndroid Build Coastguard Worker 
798*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
799*495ae853SAndroid Build Coastguard Worker /*                                                                           */
800*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_compute_bs_non_mbaff_medial_lyr                    */
801*495ae853SAndroid Build Coastguard Worker /*                                                                           */
802*495ae853SAndroid Build Coastguard Worker /*  Description   : This function computes the pointers of left,top & current*/
803*495ae853SAndroid Build Coastguard Worker /*                : Nnz, MvPred & deblk_mb_t and supplies to FillBs function */
804*495ae853SAndroid Build Coastguard Worker /*                : for Boundary Strength Calculation                        */
805*495ae853SAndroid Build Coastguard Worker /*  Inputs        : <What inputs does the function take?>                    */
806*495ae853SAndroid Build Coastguard Worker /*  Processing    : This functions calls deblock MB in the MB increment order*/
807*495ae853SAndroid Build Coastguard Worker /*                                                                           */
808*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Produces the Boundary Strength for Current Mb            */
809*495ae853SAndroid Build Coastguard Worker /*  Returns       : None                                                     */
810*495ae853SAndroid Build Coastguard Worker /*                                                                           */
811*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
812*495ae853SAndroid Build Coastguard Worker /*                                                                           */
813*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
814*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore                                              */
815*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
816*495ae853SAndroid Build Coastguard Worker 
isvcd_compute_bs_non_mbaff_medial_lyr(svc_dec_lyr_struct_t * ps_svc_lyr_dec,dec_mb_info_t * ps_cur_mb_info,const UWORD16 u2_mbxn_mb)817*495ae853SAndroid Build Coastguard Worker void isvcd_compute_bs_non_mbaff_medial_lyr(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
818*495ae853SAndroid Build Coastguard Worker                                            dec_mb_info_t *ps_cur_mb_info, const UWORD16 u2_mbxn_mb)
819*495ae853SAndroid Build Coastguard Worker {
820*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
821*495ae853SAndroid Build Coastguard Worker     /* deblk_mb_t Params */
822*495ae853SAndroid Build Coastguard Worker     deblk_mb_t *ps_cur_mb_params; /*< Parameters of current MacroBlock */
823*495ae853SAndroid Build Coastguard Worker     deblkmb_neighbour_t *ps_deblk_top_mb;
824*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_leftmbtype;
825*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_cur_csbp;
826*495ae853SAndroid Build Coastguard Worker 
827*495ae853SAndroid Build Coastguard Worker     /* Set of flags */
828*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_cur_mb_intra, u1_top_mb_typ, u4_cur_mb_fld;
829*495ae853SAndroid Build Coastguard Worker     UWORD32 u1_cur_mb_type;
830*495ae853SAndroid Build Coastguard Worker     UWORD32 *pu4_bs_table;
831*495ae853SAndroid Build Coastguard Worker     UWORD32 mb_type_intra = 0;
832*495ae853SAndroid Build Coastguard Worker 
833*495ae853SAndroid Build Coastguard Worker     UWORD16 *pu2_curr_res_luma_csbp;
834*495ae853SAndroid Build Coastguard Worker     UWORD16 *pu2_left_res_luma_csbp;
835*495ae853SAndroid Build Coastguard Worker     UWORD16 *pu2_top_res_luma_csbp;
836*495ae853SAndroid Build Coastguard Worker 
837*495ae853SAndroid Build Coastguard Worker     /* Neighbour availability */
838*495ae853SAndroid Build Coastguard Worker     const UWORD32 u2_mbx = ps_cur_mb_info->u2_mbx;
839*495ae853SAndroid Build Coastguard Worker     const UWORD32 u2_mby = ps_cur_mb_info->u2_mby;
840*495ae853SAndroid Build Coastguard Worker 
841*495ae853SAndroid Build Coastguard Worker     PROFILE_DISABLE_BOUNDARY_STRENGTH()
842*495ae853SAndroid Build Coastguard Worker 
843*495ae853SAndroid Build Coastguard Worker     ps_deblk_top_mb = ps_dec->ps_deblk_top_mb + u2_mbx;
844*495ae853SAndroid Build Coastguard Worker 
845*495ae853SAndroid Build Coastguard Worker     /* Pointer assignment for Current DeblkMB, Current Mv Pred  */
846*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_params = ps_dec->ps_deblk_mbn + u2_mbxn_mb;
847*495ae853SAndroid Build Coastguard Worker 
848*495ae853SAndroid Build Coastguard Worker     /*Pointer assignment for Residual NNZ */
849*495ae853SAndroid Build Coastguard Worker     pu2_curr_res_luma_csbp = ps_svc_lyr_dec->pu2_frm_res_luma_csbp + ps_cur_mb_info->u2_mbx;
850*495ae853SAndroid Build Coastguard Worker     pu2_curr_res_luma_csbp += ps_cur_mb_info->u2_mby * ps_svc_lyr_dec->i4_frm_res_luma_csbp_stride;
851*495ae853SAndroid Build Coastguard Worker 
852*495ae853SAndroid Build Coastguard Worker     pu2_left_res_luma_csbp = pu2_curr_res_luma_csbp - (ps_cur_mb_info->u2_mbx != 0);
853*495ae853SAndroid Build Coastguard Worker     pu2_top_res_luma_csbp = pu2_curr_res_luma_csbp - ((ps_cur_mb_info->u2_mby != 0) *
854*495ae853SAndroid Build Coastguard Worker                                                       ps_svc_lyr_dec->i4_frm_res_luma_csbp_stride);
855*495ae853SAndroid Build Coastguard Worker 
856*495ae853SAndroid Build Coastguard Worker     u1_cur_mb_type = ps_cur_mb_params->u1_mb_type;
857*495ae853SAndroid Build Coastguard Worker     u1_top_mb_typ = ps_deblk_top_mb->u1_mb_type;
858*495ae853SAndroid Build Coastguard Worker     ps_deblk_top_mb->u1_mb_type = u1_cur_mb_type;
859*495ae853SAndroid Build Coastguard Worker 
860*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_params->u1_topmb_qp = ps_deblk_top_mb->u1_mb_qp;
861*495ae853SAndroid Build Coastguard Worker     ps_deblk_top_mb->u1_mb_qp = ps_cur_mb_params->u1_mb_qp;
862*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_params->u1_left_mb_qp = ps_dec->deblk_left_mb[1].u1_mb_qp;
863*495ae853SAndroid Build Coastguard Worker     ps_dec->deblk_left_mb[1].u1_mb_qp = ps_cur_mb_params->u1_mb_qp;
864*495ae853SAndroid Build Coastguard Worker 
865*495ae853SAndroid Build Coastguard Worker     /* if no deblocking required for current Mb then continue */
866*495ae853SAndroid Build Coastguard Worker     /* Check next Mbs   in Mb group                           */
867*495ae853SAndroid Build Coastguard Worker     if(ps_cur_mb_params->u1_deblocking_mode & MB_DISABLE_FILTERING)
868*495ae853SAndroid Build Coastguard Worker     {
869*495ae853SAndroid Build Coastguard Worker         /* Storing the leftMbtype for next Mb */
870*495ae853SAndroid Build Coastguard Worker         ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type;
871*495ae853SAndroid Build Coastguard Worker         return;
872*495ae853SAndroid Build Coastguard Worker     }
873*495ae853SAndroid Build Coastguard Worker 
874*495ae853SAndroid Build Coastguard Worker     /* Flag for extra left Edge */
875*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_params->u1_single_call = 1;
876*495ae853SAndroid Build Coastguard Worker 
877*495ae853SAndroid Build Coastguard Worker     /* Update the Left deblk_mb_t */
878*495ae853SAndroid Build Coastguard Worker     if(!u2_mbx)
879*495ae853SAndroid Build Coastguard Worker     {
880*495ae853SAndroid Build Coastguard Worker         u4_leftmbtype = 0;
881*495ae853SAndroid Build Coastguard Worker     }
882*495ae853SAndroid Build Coastguard Worker     else
883*495ae853SAndroid Build Coastguard Worker     {
884*495ae853SAndroid Build Coastguard Worker         u4_leftmbtype = ps_dec->deblk_left_mb[1].u1_mb_type;
885*495ae853SAndroid Build Coastguard Worker     }
886*495ae853SAndroid Build Coastguard Worker 
887*495ae853SAndroid Build Coastguard Worker     if(!u2_mby) u1_top_mb_typ = 0;
888*495ae853SAndroid Build Coastguard Worker 
889*495ae853SAndroid Build Coastguard Worker     u4_cur_mb_intra = u1_cur_mb_type & D_INTRA_MB;
890*495ae853SAndroid Build Coastguard Worker     u4_cur_mb_fld = !!(u1_cur_mb_type & D_FLD_MB);
891*495ae853SAndroid Build Coastguard Worker     /* Compute BS function */
892*495ae853SAndroid Build Coastguard Worker     pu4_bs_table = ps_cur_mb_params->u4_bs_table;
893*495ae853SAndroid Build Coastguard Worker 
894*495ae853SAndroid Build Coastguard Worker     u2_cur_csbp = ps_cur_mb_info->ps_curmb->u2_luma_csbp;
895*495ae853SAndroid Build Coastguard Worker     /* Compute BS function */
896*495ae853SAndroid Build Coastguard Worker     if((ps_dec->ps_cur_sps->u1_profile_idc == HIGH_PROFILE_IDC) ||
897*495ae853SAndroid Build Coastguard Worker        (ps_dec->ps_cur_sps->u1_profile_idc == SCALABLE_HIGH_PROFILE_IDC) ||
898*495ae853SAndroid Build Coastguard Worker        (ps_dec->ps_cur_sps->u1_profile_idc == SCALABLE_BASELINE_PROFILE_IDC))
899*495ae853SAndroid Build Coastguard Worker     {
900*495ae853SAndroid Build Coastguard Worker         if(ps_cur_mb_info->u1_tran_form8x8 == 1)
901*495ae853SAndroid Build Coastguard Worker         {
902*495ae853SAndroid Build Coastguard Worker             u2_cur_csbp = ih264d_update_csbp_8x8(ps_cur_mb_info->ps_curmb->u2_luma_csbp);
903*495ae853SAndroid Build Coastguard Worker             ps_cur_mb_info->ps_curmb->u2_luma_csbp = u2_cur_csbp;
904*495ae853SAndroid Build Coastguard Worker         }
905*495ae853SAndroid Build Coastguard Worker     }
906*495ae853SAndroid Build Coastguard Worker     u2_cur_csbp |= *pu2_curr_res_luma_csbp;
907*495ae853SAndroid Build Coastguard Worker 
908*495ae853SAndroid Build Coastguard Worker     if(u4_cur_mb_intra)
909*495ae853SAndroid Build Coastguard Worker     {
910*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[4] = 0x04040404;
911*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[0] = u4_cur_mb_fld ? 0x03030303 : 0x04040404;
912*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[1] = 0x03030303;
913*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[2] = 0x03030303;
914*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[3] = 0x03030303;
915*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[5] = 0x03030303;
916*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[6] = 0x03030303;
917*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[7] = 0x03030303;
918*495ae853SAndroid Build Coastguard Worker     }
919*495ae853SAndroid Build Coastguard Worker     else
920*495ae853SAndroid Build Coastguard Worker     {
921*495ae853SAndroid Build Coastguard Worker         isvcd_fill_bs_ibl(ps_cur_mb_params, u1_top_mb_typ, u4_leftmbtype, ps_cur_mb_info,
922*495ae853SAndroid Build Coastguard Worker                           pu2_curr_res_luma_csbp, pu2_left_res_luma_csbp, pu2_top_res_luma_csbp);
923*495ae853SAndroid Build Coastguard Worker     }
924*495ae853SAndroid Build Coastguard Worker 
925*495ae853SAndroid Build Coastguard Worker     mb_type_intra = (u1_top_mb_typ & D_INTRA_MB) || (u1_top_mb_typ & D_INTRA_IBL);
926*495ae853SAndroid Build Coastguard Worker 
927*495ae853SAndroid Build Coastguard Worker     /* if Top MB or current MB is INTER */
928*495ae853SAndroid Build Coastguard Worker     if(!mb_type_intra)
929*495ae853SAndroid Build Coastguard Worker     {
930*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[0] = 0;
931*495ae853SAndroid Build Coastguard Worker         /* disable the processing of top edge  */
932*495ae853SAndroid Build Coastguard Worker         ps_cur_mb_params->u1_deblocking_mode |= MB_DISABLE_TOP_EDGE;
933*495ae853SAndroid Build Coastguard Worker     }
934*495ae853SAndroid Build Coastguard Worker 
935*495ae853SAndroid Build Coastguard Worker     mb_type_intra = (u4_leftmbtype & D_INTRA_MB) || (u4_leftmbtype & D_INTRA_IBL);
936*495ae853SAndroid Build Coastguard Worker     /* if Left MB current MB is INTER */
937*495ae853SAndroid Build Coastguard Worker     if(!mb_type_intra)
938*495ae853SAndroid Build Coastguard Worker     {
939*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[4] = 0;
940*495ae853SAndroid Build Coastguard Worker         /* disable the processing of left edge  */
941*495ae853SAndroid Build Coastguard Worker         ps_cur_mb_params->u1_deblocking_mode |= MB_DISABLE_LEFT_EDGE;
942*495ae853SAndroid Build Coastguard Worker     }
943*495ae853SAndroid Build Coastguard Worker 
944*495ae853SAndroid Build Coastguard Worker     /* overwrite the BS 0 values for corner cases */
945*495ae853SAndroid Build Coastguard Worker     if(0 == u2_mbx)
946*495ae853SAndroid Build Coastguard Worker     {
947*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[4] = 0;
948*495ae853SAndroid Build Coastguard Worker     }
949*495ae853SAndroid Build Coastguard Worker     if(0 == u2_mby)
950*495ae853SAndroid Build Coastguard Worker     {
951*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[0] = 0;
952*495ae853SAndroid Build Coastguard Worker     }
953*495ae853SAndroid Build Coastguard Worker 
954*495ae853SAndroid Build Coastguard Worker     /* Storing the leftMbtype for next Mb */
955*495ae853SAndroid Build Coastguard Worker     ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type;
956*495ae853SAndroid Build Coastguard Worker 
957*495ae853SAndroid Build Coastguard Worker     /* For transform 8x8 disable deblocking of the intrernal edges of a 8x8 block */
958*495ae853SAndroid Build Coastguard Worker     if(ps_cur_mb_info->u1_tran_form8x8)
959*495ae853SAndroid Build Coastguard Worker     {
960*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[1] = 0;
961*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[3] = 0;
962*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[5] = 0;
963*495ae853SAndroid Build Coastguard Worker         pu4_bs_table[7] = 0;
964*495ae853SAndroid Build Coastguard Worker     }
965*495ae853SAndroid Build Coastguard Worker }
966