1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker *
5*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker *
9*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker *
11*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker *
17*495ae853SAndroid Build Coastguard Worker *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker
21*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
22*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
23*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
24*495ae853SAndroid Build Coastguard Worker #include "ih264d_structs.h"
25*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
26*495ae853SAndroid Build Coastguard Worker #include "ih264d_deblocking.h"
27*495ae853SAndroid Build Coastguard Worker #include "string.h"
28*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
29*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
30*495ae853SAndroid Build Coastguard Worker
ih264d_update_csbp_8x8(UWORD16 u2_luma_csbp)31*495ae853SAndroid Build Coastguard Worker UWORD16 ih264d_update_csbp_8x8(UWORD16 u2_luma_csbp)
32*495ae853SAndroid Build Coastguard Worker {
33*495ae853SAndroid Build Coastguard Worker UWORD16 u2_mod_csbp;
34*495ae853SAndroid Build Coastguard Worker
35*495ae853SAndroid Build Coastguard Worker u2_mod_csbp = u2_luma_csbp;
36*495ae853SAndroid Build Coastguard Worker
37*495ae853SAndroid Build Coastguard Worker if(u2_mod_csbp & 0x0033)
38*495ae853SAndroid Build Coastguard Worker {
39*495ae853SAndroid Build Coastguard Worker u2_mod_csbp |= 0x0033;
40*495ae853SAndroid Build Coastguard Worker }
41*495ae853SAndroid Build Coastguard Worker
42*495ae853SAndroid Build Coastguard Worker if(u2_mod_csbp & 0x00CC)
43*495ae853SAndroid Build Coastguard Worker {
44*495ae853SAndroid Build Coastguard Worker u2_mod_csbp |= 0x00CC;
45*495ae853SAndroid Build Coastguard Worker }
46*495ae853SAndroid Build Coastguard Worker
47*495ae853SAndroid Build Coastguard Worker if(u2_mod_csbp & 0x3300)
48*495ae853SAndroid Build Coastguard Worker {
49*495ae853SAndroid Build Coastguard Worker u2_mod_csbp |= 0x3300;
50*495ae853SAndroid Build Coastguard Worker }
51*495ae853SAndroid Build Coastguard Worker
52*495ae853SAndroid Build Coastguard Worker if(u2_mod_csbp & 0xCC00)
53*495ae853SAndroid Build Coastguard Worker {
54*495ae853SAndroid Build Coastguard Worker u2_mod_csbp |= 0xCC00;
55*495ae853SAndroid Build Coastguard Worker }
56*495ae853SAndroid Build Coastguard Worker
57*495ae853SAndroid Build Coastguard Worker return u2_mod_csbp;
58*495ae853SAndroid Build Coastguard Worker }
59*495ae853SAndroid Build Coastguard Worker
60*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
61*495ae853SAndroid Build Coastguard Worker /* */
62*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_fill_bs2_horz_vert */
63*495ae853SAndroid Build Coastguard Worker /* */
64*495ae853SAndroid Build Coastguard Worker /* Description : This function fills boundray strength (=2) for all horz */
65*495ae853SAndroid Build Coastguard Worker /* and vert edges of current mb based on coded sub block */
66*495ae853SAndroid Build Coastguard Worker /* pattern of current, top and left mb */
67*495ae853SAndroid Build Coastguard Worker /* Inputs : */
68*495ae853SAndroid Build Coastguard Worker /* pu4_bs : Base pointer of BS table which gets updated */
69*495ae853SAndroid Build Coastguard Worker /* u4_left_mb_csbp : left mb's coded sub block pattern */
70*495ae853SAndroid Build Coastguard Worker /* u4_top_mb_csbp : top mb's coded sub block pattern */
71*495ae853SAndroid Build Coastguard Worker /* u4_cur_mb_csbp : current mb's coded sub block pattern */
72*495ae853SAndroid Build Coastguard Worker /* */
73*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
74*495ae853SAndroid Build Coastguard Worker /* Processing : */
75*495ae853SAndroid Build Coastguard Worker /* */
76*495ae853SAndroid Build Coastguard Worker /* csbp for each 4x4 block in a mb is bit packet in reverse */
77*495ae853SAndroid Build Coastguard Worker /* raster scan order for each mb as shown below: */
78*495ae853SAndroid Build Coastguard Worker /* 15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0. */
79*495ae853SAndroid Build Coastguard Worker /* */
80*495ae853SAndroid Build Coastguard Worker /* BS=2 for a 4x4 edge if any of adjacent blocks forming edge */
81*495ae853SAndroid Build Coastguard Worker /* are coded. Keeping this in mind, bs=2 for all horz and vert */
82*495ae853SAndroid Build Coastguard Worker /* edges can be derived using a lookup table for each edge */
83*495ae853SAndroid Build Coastguard Worker /* after "ORing" the csbp values as follows: */
84*495ae853SAndroid Build Coastguard Worker /* (C means current Mb, T means top mb and L means left mb) */
85*495ae853SAndroid Build Coastguard Worker /* */
86*495ae853SAndroid Build Coastguard Worker /* All Horz edges: */
87*495ae853SAndroid Build Coastguard Worker /* 15C|14C|13C|12C|11C|10C|9C|8C|7C|6C|5C|4C|3C |2C |1C |0C */
88*495ae853SAndroid Build Coastguard Worker /* (or with) 11C|10C| 9C| 8C| 7C|6C |5C|4C|3C|2C|1C|0C|15T|14T|13T|12T */
89*495ae853SAndroid Build Coastguard Worker /* -----BS[3]-----|----BS[2]----|---BS[1]---|----BS[0]-----| */
90*495ae853SAndroid Build Coastguard Worker /* */
91*495ae853SAndroid Build Coastguard Worker /* All Vert edges: */
92*495ae853SAndroid Build Coastguard Worker /* 15C|14C|13C|12C|11C|10C|9C| 8C|7C|6C|5C|4C|3C |2C |1C |0C */
93*495ae853SAndroid Build Coastguard Worker /* (or with) 14C|13C|12C|15L|10C| 9C|8C|11L|6C|5C|4C|7L|2C |1C |0C |3L */
94*495ae853SAndroid Build Coastguard Worker /* Do 4x4 transpose of resulting pattern to get vertBS[4]-BS[7] */
95*495ae853SAndroid Build Coastguard Worker /* */
96*495ae853SAndroid Build Coastguard Worker /* Outputs : <What does the function produce?> */
97*495ae853SAndroid Build Coastguard Worker /* Returns : <What does the function return?> */
98*495ae853SAndroid Build Coastguard Worker /* */
99*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
100*495ae853SAndroid Build Coastguard Worker /* */
101*495ae853SAndroid Build Coastguard Worker /* Revision History: */
102*495ae853SAndroid Build Coastguard Worker /* */
103*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
104*495ae853SAndroid Build Coastguard Worker /* 16 10 2008 Jay Draft */
105*495ae853SAndroid Build Coastguard Worker /* */
106*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
107*495ae853SAndroid Build Coastguard Worker #define CSBP_LEFT_BLOCK_MASK 0x1111
108*495ae853SAndroid Build Coastguard Worker #define CSBP_RIGHT_BLOCK_MASK 0x8888
109*495ae853SAndroid Build Coastguard Worker
ih264d_fill_bs2_horz_vert(UWORD32 * pu4_bs,WORD32 u4_left_mb_csbp,WORD32 u4_top_mb_csbp,WORD32 u4_cur_mb_csbp,const UWORD32 * pu4_packed_bs2,const UWORD16 * pu2_4x4_v2h_reorder)110*495ae853SAndroid Build Coastguard Worker void ih264d_fill_bs2_horz_vert(UWORD32 *pu4_bs, /* Base pointer of BS table */
111*495ae853SAndroid Build Coastguard Worker WORD32 u4_left_mb_csbp, /* csbp of left mb */
112*495ae853SAndroid Build Coastguard Worker WORD32 u4_top_mb_csbp, /* csbp of top mb */
113*495ae853SAndroid Build Coastguard Worker WORD32 u4_cur_mb_csbp, /* csbp of current mb */
114*495ae853SAndroid Build Coastguard Worker const UWORD32 *pu4_packed_bs2, const UWORD16 *pu2_4x4_v2h_reorder)
115*495ae853SAndroid Build Coastguard Worker {
116*495ae853SAndroid Build Coastguard Worker /*************************************************************************/
117*495ae853SAndroid Build Coastguard Worker /*u4_nbr_horz_csbp=11C|10C|9C|8C|7C|6C|5C|4C|3C|2C|1C|0C|15T|14T|13T|12T */
118*495ae853SAndroid Build Coastguard Worker /*************************************************************************/
119*495ae853SAndroid Build Coastguard Worker UWORD32 u4_nbr_horz_csbp = (u4_cur_mb_csbp << 4) | (u4_top_mb_csbp >> 12);
120*495ae853SAndroid Build Coastguard Worker UWORD32 u4_horz_bs2_dec = u4_cur_mb_csbp | u4_nbr_horz_csbp;
121*495ae853SAndroid Build Coastguard Worker
122*495ae853SAndroid Build Coastguard Worker /*************************************************************************/
123*495ae853SAndroid Build Coastguard Worker /*u4_left_mb_masked_csbp = 15L|0|0|0|11L|0|0|0|7L|0|0|0|3L|0|0|0 */
124*495ae853SAndroid Build Coastguard Worker /*************************************************************************/
125*495ae853SAndroid Build Coastguard Worker UWORD32 u4_left_mb_masked_csbp = u4_left_mb_csbp & CSBP_RIGHT_BLOCK_MASK;
126*495ae853SAndroid Build Coastguard Worker
127*495ae853SAndroid Build Coastguard Worker /*************************************************************************/
128*495ae853SAndroid Build Coastguard Worker /*u4_cur_mb_masked_csbp =14C|13C|12C|x|10C|9C|8C|x|6C|5C|4C|x|2C|1C|0C|x */
129*495ae853SAndroid Build Coastguard Worker /*************************************************************************/
130*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cur_mb_masked_csbp = (u4_cur_mb_csbp << 1)
131*495ae853SAndroid Build Coastguard Worker & (~CSBP_LEFT_BLOCK_MASK);
132*495ae853SAndroid Build Coastguard Worker
133*495ae853SAndroid Build Coastguard Worker /*************************************************************************/
134*495ae853SAndroid Build Coastguard Worker /*u4_nbr_vert_csbp=14C|13C|12C|15L|10C|9C|8C|11L|6C|5C|4C|7L|2C|1C|0C|3L */
135*495ae853SAndroid Build Coastguard Worker /*************************************************************************/
136*495ae853SAndroid Build Coastguard Worker UWORD32 u4_nbr_vert_csbp = (u4_cur_mb_masked_csbp)
137*495ae853SAndroid Build Coastguard Worker | (u4_left_mb_masked_csbp >> 3);
138*495ae853SAndroid Build Coastguard Worker
139*495ae853SAndroid Build Coastguard Worker UWORD32 u4_vert_bs2_dec = u4_cur_mb_csbp | u4_nbr_vert_csbp;
140*495ae853SAndroid Build Coastguard Worker
141*495ae853SAndroid Build Coastguard Worker UWORD32 u4_reordered_vert_bs2_dec, u4_temp;
142*495ae853SAndroid Build Coastguard Worker
143*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_BOUNDARY_STRENGTH()
144*495ae853SAndroid Build Coastguard Worker
145*495ae853SAndroid Build Coastguard Worker /*************************************************************************/
146*495ae853SAndroid Build Coastguard Worker /* Fill horz edges (0,1,2,3) boundary strengths 2 using look up table */
147*495ae853SAndroid Build Coastguard Worker /*************************************************************************/
148*495ae853SAndroid Build Coastguard Worker pu4_bs[0] = pu4_packed_bs2[u4_horz_bs2_dec & 0xF];
149*495ae853SAndroid Build Coastguard Worker pu4_bs[1] = pu4_packed_bs2[(u4_horz_bs2_dec >> 4) & 0xF];
150*495ae853SAndroid Build Coastguard Worker pu4_bs[2] = pu4_packed_bs2[(u4_horz_bs2_dec >> 8) & 0xF];
151*495ae853SAndroid Build Coastguard Worker pu4_bs[3] = pu4_packed_bs2[(u4_horz_bs2_dec >> 12) & 0xF];
152*495ae853SAndroid Build Coastguard Worker
153*495ae853SAndroid Build Coastguard Worker /*************************************************************************/
154*495ae853SAndroid Build Coastguard Worker /* Do 4x4 tranpose of u4_vert_bs2_dec by using look up table for reorder */
155*495ae853SAndroid Build Coastguard Worker /*************************************************************************/
156*495ae853SAndroid Build Coastguard Worker u4_reordered_vert_bs2_dec = pu2_4x4_v2h_reorder[u4_vert_bs2_dec & 0xF];
157*495ae853SAndroid Build Coastguard Worker u4_temp = pu2_4x4_v2h_reorder[(u4_vert_bs2_dec >> 4) & 0xF];
158*495ae853SAndroid Build Coastguard Worker u4_reordered_vert_bs2_dec |= (u4_temp << 1);
159*495ae853SAndroid Build Coastguard Worker u4_temp = pu2_4x4_v2h_reorder[(u4_vert_bs2_dec >> 8) & 0xF];
160*495ae853SAndroid Build Coastguard Worker u4_reordered_vert_bs2_dec |= (u4_temp << 2);
161*495ae853SAndroid Build Coastguard Worker u4_temp = pu2_4x4_v2h_reorder[(u4_vert_bs2_dec >> 12) & 0xF];
162*495ae853SAndroid Build Coastguard Worker u4_reordered_vert_bs2_dec |= (u4_temp << 3);
163*495ae853SAndroid Build Coastguard Worker
164*495ae853SAndroid Build Coastguard Worker /*************************************************************************/
165*495ae853SAndroid Build Coastguard Worker /* Fill vert edges (4,5,6,7) boundary strengths 2 using look up table */
166*495ae853SAndroid Build Coastguard Worker /*************************************************************************/
167*495ae853SAndroid Build Coastguard Worker pu4_bs[4] = pu4_packed_bs2[u4_reordered_vert_bs2_dec & 0xF];
168*495ae853SAndroid Build Coastguard Worker pu4_bs[5] = pu4_packed_bs2[(u4_reordered_vert_bs2_dec >> 4) & 0xF];
169*495ae853SAndroid Build Coastguard Worker pu4_bs[6] = pu4_packed_bs2[(u4_reordered_vert_bs2_dec >> 8) & 0xF];
170*495ae853SAndroid Build Coastguard Worker pu4_bs[7] = pu4_packed_bs2[(u4_reordered_vert_bs2_dec >> 12) & 0xF];
171*495ae853SAndroid Build Coastguard Worker }
172*495ae853SAndroid Build Coastguard Worker
173*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
174*495ae853SAndroid Build Coastguard Worker /* */
175*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_fill_bs1_16x16mb_pslice */
176*495ae853SAndroid Build Coastguard Worker /* */
177*495ae853SAndroid Build Coastguard Worker /* Description : This function fills boundray strength (=1) for those */
178*495ae853SAndroid Build Coastguard Worker /* horz and vert mb edges of 16x16mb which are set to 0 by */
179*495ae853SAndroid Build Coastguard Worker /* ih264d_fill_bs2_horz_vert. This function is used for p slices */
180*495ae853SAndroid Build Coastguard Worker /* */
181*495ae853SAndroid Build Coastguard Worker /* Inputs : <What inputs does the function take?> */
182*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
183*495ae853SAndroid Build Coastguard Worker /* Processing : If any motion vector component of adjacent 4x4 blocks */
184*495ae853SAndroid Build Coastguard Worker /* differs by more than 1 integer pel or if reference */
185*495ae853SAndroid Build Coastguard Worker /* pictures are different, Bs is set to 1. */
186*495ae853SAndroid Build Coastguard Worker /* */
187*495ae853SAndroid Build Coastguard Worker /* Outputs : <What does the function produce?> */
188*495ae853SAndroid Build Coastguard Worker /* Returns : <What does the function return?> */
189*495ae853SAndroid Build Coastguard Worker /* */
190*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
191*495ae853SAndroid Build Coastguard Worker /* */
192*495ae853SAndroid Build Coastguard Worker /* Revision History: */
193*495ae853SAndroid Build Coastguard Worker /* */
194*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
195*495ae853SAndroid Build Coastguard Worker /* 16 10 2008 Jay Draft */
196*495ae853SAndroid Build Coastguard Worker /* */
197*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_fill_bs1_16x16mb_pslice(mv_pred_t * ps_cur_mv_pred,mv_pred_t * ps_top_mv_pred,void ** ppv_map_ref_idx_to_poc,UWORD32 * pu4_bs_table,mv_pred_t * ps_leftmost_mv_pred,neighbouradd_t * ps_left_addr,void ** u4_pic_addrress,WORD32 i4_ver_mvlimit)198*495ae853SAndroid Build Coastguard Worker void ih264d_fill_bs1_16x16mb_pslice(mv_pred_t *ps_cur_mv_pred,
199*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_top_mv_pred,
200*495ae853SAndroid Build Coastguard Worker void **ppv_map_ref_idx_to_poc,
201*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bs_table, /* pointer to the BsTable array */
202*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_leftmost_mv_pred,
203*495ae853SAndroid Build Coastguard Worker neighbouradd_t *ps_left_addr,
204*495ae853SAndroid Build Coastguard Worker void **u4_pic_addrress, /* picture address for BS calc */
205*495ae853SAndroid Build Coastguard Worker WORD32 i4_ver_mvlimit)
206*495ae853SAndroid Build Coastguard Worker {
207*495ae853SAndroid Build Coastguard Worker WORD16 i2_q_mv0, i2_q_mv1;
208*495ae853SAndroid Build Coastguard Worker WORD16 i2_p_mv0, i2_p_mv1;
209*495ae853SAndroid Build Coastguard Worker void *pv_cur_pic_addr0, *pv_cur_pic_addr1;
210*495ae853SAndroid Build Coastguard Worker void *pv_nbr_pic_addr0, *pv_nbr_pic_addr1;
211*495ae853SAndroid Build Coastguard Worker void **ppv_map_ref_idx_to_poc_l0; //,*ppv_map_ref_idx_to_poc_l1;
212*495ae853SAndroid Build Coastguard Worker UWORD32 i;
213*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_horz = pu4_bs_table[0];
214*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_vert = pu4_bs_table[4];
215*495ae853SAndroid Build Coastguard Worker
216*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_BOUNDARY_STRENGTH()
217*495ae853SAndroid Build Coastguard Worker
218*495ae853SAndroid Build Coastguard Worker ppv_map_ref_idx_to_poc_l0 = ppv_map_ref_idx_to_poc;
219*495ae853SAndroid Build Coastguard Worker
220*495ae853SAndroid Build Coastguard Worker i2_q_mv0 = ps_cur_mv_pred->i2_mv[0];
221*495ae853SAndroid Build Coastguard Worker i2_q_mv1 = ps_cur_mv_pred->i2_mv[1];
222*495ae853SAndroid Build Coastguard Worker pv_cur_pic_addr0 = ppv_map_ref_idx_to_poc_l0[ps_cur_mv_pred->i1_ref_frame[0]];
223*495ae853SAndroid Build Coastguard Worker pv_cur_pic_addr1 = 0;
224*495ae853SAndroid Build Coastguard Worker
225*495ae853SAndroid Build Coastguard Worker /*********************************/
226*495ae853SAndroid Build Coastguard Worker /* Computing Bs for the top edge */
227*495ae853SAndroid Build Coastguard Worker /*********************************/
228*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++, ps_top_mv_pred++)
229*495ae853SAndroid Build Coastguard Worker {
230*495ae853SAndroid Build Coastguard Worker UWORD32 u4_idx = 24 - (i << 3);
231*495ae853SAndroid Build Coastguard Worker
232*495ae853SAndroid Build Coastguard Worker /*********************************/
233*495ae853SAndroid Build Coastguard Worker /* check if Bs is already set */
234*495ae853SAndroid Build Coastguard Worker /*********************************/
235*495ae853SAndroid Build Coastguard Worker if(!((u4_bs_horz >> u4_idx) & 0xf))
236*495ae853SAndroid Build Coastguard Worker {
237*495ae853SAndroid Build Coastguard Worker /************************************************************/
238*495ae853SAndroid Build Coastguard Worker /* If Bs is not set, use left edge and current edge mvs and */
239*495ae853SAndroid Build Coastguard Worker /* reference pictures addresses to evaluate Bs==1 */
240*495ae853SAndroid Build Coastguard Worker /************************************************************/
241*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_temp1;
242*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs;
243*495ae853SAndroid Build Coastguard Worker
244*495ae853SAndroid Build Coastguard Worker /*********************************************************/
245*495ae853SAndroid Build Coastguard Worker /* If any motion vector component differs by more than 1 */
246*495ae853SAndroid Build Coastguard Worker /* integer pel or if reference pictures are different Bs */
247*495ae853SAndroid Build Coastguard Worker /* is set to 1. Note that this condition shall be met for*/
248*495ae853SAndroid Build Coastguard Worker /* both (fwd-fwd,bwd-bwd) and (fwd-bwd,bwd-fwd) direction*/
249*495ae853SAndroid Build Coastguard Worker /*********************************************************/
250*495ae853SAndroid Build Coastguard Worker i2_p_mv0 = ps_top_mv_pred->i2_mv[0];
251*495ae853SAndroid Build Coastguard Worker i2_p_mv1 = ps_top_mv_pred->i2_mv[1];
252*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr0 = u4_pic_addrress[i & 2];
253*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr1 = u4_pic_addrress[1 + (i & 2)];
254*495ae853SAndroid Build Coastguard Worker
255*495ae853SAndroid Build Coastguard Worker u4_bs_temp1 = ((ABS((i2_p_mv0 - i2_q_mv0)) >= 4) ||
256*495ae853SAndroid Build Coastguard Worker (ABS((i2_p_mv1 - i2_q_mv1)) >= i4_ver_mvlimit));
257*495ae853SAndroid Build Coastguard Worker
258*495ae853SAndroid Build Coastguard Worker u4_bs = ((pv_cur_pic_addr0 != pv_nbr_pic_addr0)
259*495ae853SAndroid Build Coastguard Worker || (pv_cur_pic_addr1 != pv_nbr_pic_addr1)
260*495ae853SAndroid Build Coastguard Worker || u4_bs_temp1);
261*495ae853SAndroid Build Coastguard Worker
262*495ae853SAndroid Build Coastguard Worker u4_bs_horz |= (u4_bs << u4_idx);
263*495ae853SAndroid Build Coastguard Worker }
264*495ae853SAndroid Build Coastguard Worker }
265*495ae853SAndroid Build Coastguard Worker pu4_bs_table[0] = u4_bs_horz;
266*495ae853SAndroid Build Coastguard Worker
267*495ae853SAndroid Build Coastguard Worker /***********************************/
268*495ae853SAndroid Build Coastguard Worker /* Computing Bs for the left edge */
269*495ae853SAndroid Build Coastguard Worker /***********************************/
270*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++, ps_leftmost_mv_pred += 4)
271*495ae853SAndroid Build Coastguard Worker {
272*495ae853SAndroid Build Coastguard Worker UWORD32 u4_idx = 24 - (i << 3);
273*495ae853SAndroid Build Coastguard Worker
274*495ae853SAndroid Build Coastguard Worker /*********************************/
275*495ae853SAndroid Build Coastguard Worker /* check if Bs is already set */
276*495ae853SAndroid Build Coastguard Worker /*********************************/
277*495ae853SAndroid Build Coastguard Worker if(!((u4_bs_vert >> u4_idx) & 0xf))
278*495ae853SAndroid Build Coastguard Worker {
279*495ae853SAndroid Build Coastguard Worker /****************************************************/
280*495ae853SAndroid Build Coastguard Worker /* If Bs is not set, evalaute conditions for Bs=1 */
281*495ae853SAndroid Build Coastguard Worker /****************************************************/
282*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_temp1;
283*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs;
284*495ae853SAndroid Build Coastguard Worker /*********************************************************/
285*495ae853SAndroid Build Coastguard Worker /* If any motion vector component differs by more than 1 */
286*495ae853SAndroid Build Coastguard Worker /* integer pel or if reference pictures are different Bs */
287*495ae853SAndroid Build Coastguard Worker /* is set to 1. Note that this condition shall be met for*/
288*495ae853SAndroid Build Coastguard Worker /* both (fwd-fwd,bwd-bwd) and (fwd-bwd,bwd-fwd) direction*/
289*495ae853SAndroid Build Coastguard Worker /*********************************************************/
290*495ae853SAndroid Build Coastguard Worker
291*495ae853SAndroid Build Coastguard Worker i2_p_mv0 = ps_leftmost_mv_pred->i2_mv[0];
292*495ae853SAndroid Build Coastguard Worker i2_p_mv1 = ps_leftmost_mv_pred->i2_mv[1];
293*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr0 = ps_left_addr->u4_add[i & 2];
294*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr1 = ps_left_addr->u4_add[1 + (i & 2)];
295*495ae853SAndroid Build Coastguard Worker
296*495ae853SAndroid Build Coastguard Worker u4_bs_temp1 =
297*495ae853SAndroid Build Coastguard Worker ((ABS((i2_p_mv0 - i2_q_mv0))
298*495ae853SAndroid Build Coastguard Worker >= 4)
299*495ae853SAndroid Build Coastguard Worker | (ABS((i2_p_mv1 - i2_q_mv1))
300*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit));
301*495ae853SAndroid Build Coastguard Worker
302*495ae853SAndroid Build Coastguard Worker u4_bs = ((pv_cur_pic_addr0 != pv_nbr_pic_addr0)
303*495ae853SAndroid Build Coastguard Worker || (pv_cur_pic_addr1 != pv_nbr_pic_addr1)
304*495ae853SAndroid Build Coastguard Worker || u4_bs_temp1);
305*495ae853SAndroid Build Coastguard Worker
306*495ae853SAndroid Build Coastguard Worker u4_bs_vert |= (u4_bs << u4_idx);
307*495ae853SAndroid Build Coastguard Worker }
308*495ae853SAndroid Build Coastguard Worker }
309*495ae853SAndroid Build Coastguard Worker pu4_bs_table[4] = u4_bs_vert;
310*495ae853SAndroid Build Coastguard Worker
311*495ae853SAndroid Build Coastguard Worker return;
312*495ae853SAndroid Build Coastguard Worker }
313*495ae853SAndroid Build Coastguard Worker
314*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
315*495ae853SAndroid Build Coastguard Worker /* */
316*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_fill_bs1_non16x16mb_pslice */
317*495ae853SAndroid Build Coastguard Worker /* */
318*495ae853SAndroid Build Coastguard Worker /* Description : This function fills boundray strength (=1) for those */
319*495ae853SAndroid Build Coastguard Worker /* horz and vert edges of non16x16mb which are set to 0 by */
320*495ae853SAndroid Build Coastguard Worker /* ih264d_fill_bs2_horz_vert. This function is used for p slices */
321*495ae853SAndroid Build Coastguard Worker /* */
322*495ae853SAndroid Build Coastguard Worker /* Inputs : <What inputs does the function take?> */
323*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
324*495ae853SAndroid Build Coastguard Worker /* Processing : If any motion vector component of adjacent 4x4 blocks */
325*495ae853SAndroid Build Coastguard Worker /* differs by more than 1 integer pel or if reference */
326*495ae853SAndroid Build Coastguard Worker /* pictures are different, Bs is set to 1. */
327*495ae853SAndroid Build Coastguard Worker /* */
328*495ae853SAndroid Build Coastguard Worker /* Outputs : <What does the function produce?> */
329*495ae853SAndroid Build Coastguard Worker /* Returns : <What does the function return?> */
330*495ae853SAndroid Build Coastguard Worker /* */
331*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
332*495ae853SAndroid Build Coastguard Worker /* */
333*495ae853SAndroid Build Coastguard Worker /* Revision History: */
334*495ae853SAndroid Build Coastguard Worker /* */
335*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
336*495ae853SAndroid Build Coastguard Worker /* 16 10 2008 Jay Draft */
337*495ae853SAndroid Build Coastguard Worker /* */
338*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_fill_bs1_non16x16mb_pslice(mv_pred_t * ps_cur_mv_pred,mv_pred_t * ps_top_mv_pred,void ** ppv_map_ref_idx_to_poc,UWORD32 * pu4_bs_table,mv_pred_t * ps_leftmost_mv_pred,neighbouradd_t * ps_left_addr,void ** u4_pic_addrress,WORD32 i4_ver_mvlimit)339*495ae853SAndroid Build Coastguard Worker void ih264d_fill_bs1_non16x16mb_pslice(mv_pred_t *ps_cur_mv_pred,
340*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_top_mv_pred,
341*495ae853SAndroid Build Coastguard Worker void **ppv_map_ref_idx_to_poc,
342*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bs_table, /* pointer to the BsTable array */
343*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_leftmost_mv_pred,
344*495ae853SAndroid Build Coastguard Worker neighbouradd_t *ps_left_addr,
345*495ae853SAndroid Build Coastguard Worker void **u4_pic_addrress,
346*495ae853SAndroid Build Coastguard Worker WORD32 i4_ver_mvlimit)
347*495ae853SAndroid Build Coastguard Worker {
348*495ae853SAndroid Build Coastguard Worker UWORD32 edge;
349*495ae853SAndroid Build Coastguard Worker void **ppv_map_ref_idx_to_poc_l0; //,*ppv_map_ref_idx_to_poc_l1;
350*495ae853SAndroid Build Coastguard Worker
351*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_BOUNDARY_STRENGTH()
352*495ae853SAndroid Build Coastguard Worker
353*495ae853SAndroid Build Coastguard Worker ppv_map_ref_idx_to_poc_l0 = ppv_map_ref_idx_to_poc;
354*495ae853SAndroid Build Coastguard Worker
355*495ae853SAndroid Build Coastguard Worker
356*495ae853SAndroid Build Coastguard Worker for(edge = 0; edge < 4; edge++, ps_top_mv_pred = ps_cur_mv_pred - 4)
357*495ae853SAndroid Build Coastguard Worker {
358*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
359*495ae853SAndroid Build Coastguard Worker /* Each iteration of this loop fills the four BS values of one HORIZ */
360*495ae853SAndroid Build Coastguard Worker /* edge and one BS value for each of the four VERT edges. */
361*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
362*495ae853SAndroid Build Coastguard Worker WORD32 i;
363*495ae853SAndroid Build Coastguard Worker UWORD32 u4_vert_idx = 24 - (edge << 3);
364*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_horz = pu4_bs_table[edge];
365*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_left_mv_pred = ps_leftmost_mv_pred + (edge << 2);
366*495ae853SAndroid Build Coastguard Worker
367*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++, ps_top_mv_pred++, ps_cur_mv_pred++)
368*495ae853SAndroid Build Coastguard Worker {
369*495ae853SAndroid Build Coastguard Worker WORD16 i2_cur_mv0, i2_cur_mv1;
370*495ae853SAndroid Build Coastguard Worker WORD8 i1_cur_ref0;
371*495ae853SAndroid Build Coastguard Worker void *pv_cur_pic_addr0, *pv_cur_pic_addr1 = 0;
372*495ae853SAndroid Build Coastguard Worker void *pv_nbr_pic_addr0, *pv_nbr_pic_addr1;
373*495ae853SAndroid Build Coastguard Worker
374*495ae853SAndroid Build Coastguard Worker /******************************************************/
375*495ae853SAndroid Build Coastguard Worker /* Each iteration of this inner loop computes a HORIZ */
376*495ae853SAndroid Build Coastguard Worker /* and a VERT BS value for a 4x4 block */
377*495ae853SAndroid Build Coastguard Worker /******************************************************/
378*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_vert = (pu4_bs_table[i + 4] >> u4_vert_idx) & 0xf;
379*495ae853SAndroid Build Coastguard Worker UWORD32 u4_horz_idx = 24 - (i << 3);
380*495ae853SAndroid Build Coastguard Worker
381*495ae853SAndroid Build Coastguard Worker /*****************************************************/
382*495ae853SAndroid Build Coastguard Worker /* check if vert Bs for this block is already set */
383*495ae853SAndroid Build Coastguard Worker /*****************************************************/
384*495ae853SAndroid Build Coastguard Worker if(!u4_bs_vert)
385*495ae853SAndroid Build Coastguard Worker {
386*495ae853SAndroid Build Coastguard Worker WORD16 i2_left_mv0, i2_left_mv1;
387*495ae853SAndroid Build Coastguard Worker /************************************************************/
388*495ae853SAndroid Build Coastguard Worker /* If Bs is not set, use left edge and current edge mvs and */
389*495ae853SAndroid Build Coastguard Worker /* reference pictures addresses to evaluate Bs==1 */
390*495ae853SAndroid Build Coastguard Worker /************************************************************/
391*495ae853SAndroid Build Coastguard Worker i2_left_mv0 = ps_left_mv_pred->i2_mv[0];
392*495ae853SAndroid Build Coastguard Worker i2_left_mv1 = ps_left_mv_pred->i2_mv[1];
393*495ae853SAndroid Build Coastguard Worker
394*495ae853SAndroid Build Coastguard Worker i2_cur_mv0 = ps_cur_mv_pred->i2_mv[0];
395*495ae853SAndroid Build Coastguard Worker i2_cur_mv1 = ps_cur_mv_pred->i2_mv[1];
396*495ae853SAndroid Build Coastguard Worker
397*495ae853SAndroid Build Coastguard Worker i1_cur_ref0 = ps_cur_mv_pred->i1_ref_frame[0];
398*495ae853SAndroid Build Coastguard Worker
399*495ae853SAndroid Build Coastguard Worker pv_cur_pic_addr0 = ppv_map_ref_idx_to_poc_l0[i1_cur_ref0];
400*495ae853SAndroid Build Coastguard Worker if(i)
401*495ae853SAndroid Build Coastguard Worker {
402*495ae853SAndroid Build Coastguard Worker WORD8 i1_left_ref0 = ps_left_mv_pred->i1_ref_frame[0];
403*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr0 = ppv_map_ref_idx_to_poc_l0[i1_left_ref0];
404*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr1 = 0;
405*495ae853SAndroid Build Coastguard Worker }
406*495ae853SAndroid Build Coastguard Worker else
407*495ae853SAndroid Build Coastguard Worker {
408*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr0 = ps_left_addr->u4_add[edge & 2];
409*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr1 = ps_left_addr->u4_add[1 + (edge & 2)];
410*495ae853SAndroid Build Coastguard Worker }
411*495ae853SAndroid Build Coastguard Worker
412*495ae853SAndroid Build Coastguard Worker {
413*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_temp1;
414*495ae853SAndroid Build Coastguard Worker /*********************************************************/
415*495ae853SAndroid Build Coastguard Worker /* If any motion vector component differs by more than 1 */
416*495ae853SAndroid Build Coastguard Worker /* integer pel or if reference pictures are different Bs */
417*495ae853SAndroid Build Coastguard Worker /* is set to 1. Note that this condition shall be met for*/
418*495ae853SAndroid Build Coastguard Worker /* both (fwd-fwd,bwd-bwd) and (fwd-bwd,bwd-fwd) direction*/
419*495ae853SAndroid Build Coastguard Worker /*********************************************************/
420*495ae853SAndroid Build Coastguard Worker
421*495ae853SAndroid Build Coastguard Worker u4_bs_temp1 =
422*495ae853SAndroid Build Coastguard Worker ((ABS((i2_left_mv0 - i2_cur_mv0))
423*495ae853SAndroid Build Coastguard Worker >= 4)
424*495ae853SAndroid Build Coastguard Worker | (ABS((i2_left_mv1
425*495ae853SAndroid Build Coastguard Worker - i2_cur_mv1))
426*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit));
427*495ae853SAndroid Build Coastguard Worker
428*495ae853SAndroid Build Coastguard Worker u4_bs_vert = ((pv_nbr_pic_addr0 != pv_cur_pic_addr0)
429*495ae853SAndroid Build Coastguard Worker || (pv_nbr_pic_addr1 != pv_cur_pic_addr1)
430*495ae853SAndroid Build Coastguard Worker || u4_bs_temp1);
431*495ae853SAndroid Build Coastguard Worker
432*495ae853SAndroid Build Coastguard Worker pu4_bs_table[i + 4] |= (u4_bs_vert << u4_vert_idx);
433*495ae853SAndroid Build Coastguard Worker }
434*495ae853SAndroid Build Coastguard Worker }
435*495ae853SAndroid Build Coastguard Worker
436*495ae853SAndroid Build Coastguard Worker /*****************************************************/
437*495ae853SAndroid Build Coastguard Worker /* check if horz Bs for this block is already set */
438*495ae853SAndroid Build Coastguard Worker /*****************************************************/
439*495ae853SAndroid Build Coastguard Worker if(!((u4_bs_horz >> u4_horz_idx) & 0xf))
440*495ae853SAndroid Build Coastguard Worker {
441*495ae853SAndroid Build Coastguard Worker WORD16 i2_top_mv0, i2_top_mv1;
442*495ae853SAndroid Build Coastguard Worker /************************************************************/
443*495ae853SAndroid Build Coastguard Worker /* If Bs is not set, use top edge and current edge mvs and */
444*495ae853SAndroid Build Coastguard Worker /* reference pictures addresses to evaluate Bs==1 */
445*495ae853SAndroid Build Coastguard Worker /************************************************************/
446*495ae853SAndroid Build Coastguard Worker i2_cur_mv0 = ps_cur_mv_pred->i2_mv[0];
447*495ae853SAndroid Build Coastguard Worker i2_cur_mv1 = ps_cur_mv_pred->i2_mv[1];
448*495ae853SAndroid Build Coastguard Worker
449*495ae853SAndroid Build Coastguard Worker i1_cur_ref0 = ps_cur_mv_pred->i1_ref_frame[0];
450*495ae853SAndroid Build Coastguard Worker
451*495ae853SAndroid Build Coastguard Worker i2_top_mv0 = ps_top_mv_pred->i2_mv[0];
452*495ae853SAndroid Build Coastguard Worker i2_top_mv1 = ps_top_mv_pred->i2_mv[1];
453*495ae853SAndroid Build Coastguard Worker
454*495ae853SAndroid Build Coastguard Worker pv_cur_pic_addr0 = ppv_map_ref_idx_to_poc_l0[i1_cur_ref0];
455*495ae853SAndroid Build Coastguard Worker if(edge)
456*495ae853SAndroid Build Coastguard Worker {
457*495ae853SAndroid Build Coastguard Worker WORD8 i1_top_ref0 = ps_top_mv_pred->i1_ref_frame[0];
458*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr0 = ppv_map_ref_idx_to_poc_l0[i1_top_ref0];
459*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr1 = 0;
460*495ae853SAndroid Build Coastguard Worker }
461*495ae853SAndroid Build Coastguard Worker else
462*495ae853SAndroid Build Coastguard Worker {
463*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr0 = u4_pic_addrress[i & 2];
464*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr1 = u4_pic_addrress[1 + (i & 2)];
465*495ae853SAndroid Build Coastguard Worker }
466*495ae853SAndroid Build Coastguard Worker
467*495ae853SAndroid Build Coastguard Worker {
468*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_temp1;
469*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs;
470*495ae853SAndroid Build Coastguard Worker /*********************************************************/
471*495ae853SAndroid Build Coastguard Worker /* If any motion vector component differs by more than 1 */
472*495ae853SAndroid Build Coastguard Worker /* integer pel or if reference pictures are different Bs */
473*495ae853SAndroid Build Coastguard Worker /* is set to 1. Note that this condition shall be met for*/
474*495ae853SAndroid Build Coastguard Worker /* both (fwd-fwd,bwd-bwd) and (fwd-bwd,bwd-fwd) direction*/
475*495ae853SAndroid Build Coastguard Worker /*********************************************************/
476*495ae853SAndroid Build Coastguard Worker
477*495ae853SAndroid Build Coastguard Worker u4_bs_temp1 =
478*495ae853SAndroid Build Coastguard Worker ((ABS((i2_top_mv0 - i2_cur_mv0))
479*495ae853SAndroid Build Coastguard Worker >= 4)
480*495ae853SAndroid Build Coastguard Worker | (ABS((i2_top_mv1
481*495ae853SAndroid Build Coastguard Worker - i2_cur_mv1))
482*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit));
483*495ae853SAndroid Build Coastguard Worker
484*495ae853SAndroid Build Coastguard Worker u4_bs = ((pv_nbr_pic_addr0 != pv_cur_pic_addr0)
485*495ae853SAndroid Build Coastguard Worker || (pv_nbr_pic_addr1 != pv_cur_pic_addr1)
486*495ae853SAndroid Build Coastguard Worker || u4_bs_temp1);
487*495ae853SAndroid Build Coastguard Worker
488*495ae853SAndroid Build Coastguard Worker u4_bs_horz |= (u4_bs << u4_horz_idx);
489*495ae853SAndroid Build Coastguard Worker }
490*495ae853SAndroid Build Coastguard Worker }
491*495ae853SAndroid Build Coastguard Worker
492*495ae853SAndroid Build Coastguard Worker ps_left_mv_pred = ps_cur_mv_pred;
493*495ae853SAndroid Build Coastguard Worker }
494*495ae853SAndroid Build Coastguard Worker
495*495ae853SAndroid Build Coastguard Worker pu4_bs_table[edge] = u4_bs_horz;
496*495ae853SAndroid Build Coastguard Worker }
497*495ae853SAndroid Build Coastguard Worker }
498*495ae853SAndroid Build Coastguard Worker
499*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
500*495ae853SAndroid Build Coastguard Worker /* */
501*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_fill_bs1_16x16mb_bslice */
502*495ae853SAndroid Build Coastguard Worker /* */
503*495ae853SAndroid Build Coastguard Worker /* Description : This function fills boundray strength (=1) for those */
504*495ae853SAndroid Build Coastguard Worker /* horz and vert mb edges of 16x16mb which are set to 0 by */
505*495ae853SAndroid Build Coastguard Worker /* ih264d_fill_bs2_horz_vert. This function is used for b slices */
506*495ae853SAndroid Build Coastguard Worker /* */
507*495ae853SAndroid Build Coastguard Worker /* Inputs : <What inputs does the function take?> */
508*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
509*495ae853SAndroid Build Coastguard Worker /* Processing : If any motion vector component of adjacent 4x4 blocks */
510*495ae853SAndroid Build Coastguard Worker /* differs by more than 1 integer pel or if reference */
511*495ae853SAndroid Build Coastguard Worker /* pictures are different, Bs is set to 1. */
512*495ae853SAndroid Build Coastguard Worker /* */
513*495ae853SAndroid Build Coastguard Worker /* Outputs : <What does the function produce?> */
514*495ae853SAndroid Build Coastguard Worker /* Returns : <What does the function return?> */
515*495ae853SAndroid Build Coastguard Worker /* */
516*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
517*495ae853SAndroid Build Coastguard Worker /* */
518*495ae853SAndroid Build Coastguard Worker /* Revision History: */
519*495ae853SAndroid Build Coastguard Worker /* */
520*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
521*495ae853SAndroid Build Coastguard Worker /* 16 10 2008 Jay Draft */
522*495ae853SAndroid Build Coastguard Worker /* */
523*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_fill_bs1_16x16mb_bslice(mv_pred_t * ps_cur_mv_pred,mv_pred_t * ps_top_mv_pred,void ** ppv_map_ref_idx_to_poc,UWORD32 * pu4_bs_table,mv_pred_t * ps_leftmost_mv_pred,neighbouradd_t * ps_left_addr,void ** u4_pic_addrress,WORD32 i4_ver_mvlimit)524*495ae853SAndroid Build Coastguard Worker void ih264d_fill_bs1_16x16mb_bslice(mv_pred_t *ps_cur_mv_pred,
525*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_top_mv_pred,
526*495ae853SAndroid Build Coastguard Worker void **ppv_map_ref_idx_to_poc,
527*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bs_table, /* pointer to the BsTable array */
528*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_leftmost_mv_pred,
529*495ae853SAndroid Build Coastguard Worker neighbouradd_t *ps_left_addr,
530*495ae853SAndroid Build Coastguard Worker void **u4_pic_addrress,
531*495ae853SAndroid Build Coastguard Worker WORD32 i4_ver_mvlimit)
532*495ae853SAndroid Build Coastguard Worker {
533*495ae853SAndroid Build Coastguard Worker WORD16 i2_q_mv0, i2_q_mv1, i2_q_mv2, i2_q_mv3;
534*495ae853SAndroid Build Coastguard Worker WORD16 i2_p_mv0, i2_p_mv1, i2_p_mv2, i2_p_mv3;
535*495ae853SAndroid Build Coastguard Worker void *pv_cur_pic_addr0, *pv_cur_pic_addr1;
536*495ae853SAndroid Build Coastguard Worker void *pv_nbr_pic_addr0, *pv_nbr_pic_addr1;
537*495ae853SAndroid Build Coastguard Worker void **ppv_map_ref_idx_to_poc_l0, **ppv_map_ref_idx_to_poc_l1;
538*495ae853SAndroid Build Coastguard Worker UWORD32 i;
539*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_horz = pu4_bs_table[0];
540*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_vert = pu4_bs_table[4];
541*495ae853SAndroid Build Coastguard Worker
542*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_BOUNDARY_STRENGTH()
543*495ae853SAndroid Build Coastguard Worker
544*495ae853SAndroid Build Coastguard Worker ppv_map_ref_idx_to_poc_l0 = ppv_map_ref_idx_to_poc;
545*495ae853SAndroid Build Coastguard Worker ppv_map_ref_idx_to_poc_l1 = ppv_map_ref_idx_to_poc + POC_LIST_L0_TO_L1_DIFF;
546*495ae853SAndroid Build Coastguard Worker i2_q_mv0 = ps_cur_mv_pred->i2_mv[0];
547*495ae853SAndroid Build Coastguard Worker i2_q_mv1 = ps_cur_mv_pred->i2_mv[1];
548*495ae853SAndroid Build Coastguard Worker i2_q_mv2 = ps_cur_mv_pred->i2_mv[2];
549*495ae853SAndroid Build Coastguard Worker i2_q_mv3 = ps_cur_mv_pred->i2_mv[3];
550*495ae853SAndroid Build Coastguard Worker pv_cur_pic_addr0 = ppv_map_ref_idx_to_poc_l0[ps_cur_mv_pred->i1_ref_frame[0]];
551*495ae853SAndroid Build Coastguard Worker pv_cur_pic_addr1 = ppv_map_ref_idx_to_poc_l1[ps_cur_mv_pred->i1_ref_frame[1]];
552*495ae853SAndroid Build Coastguard Worker
553*495ae853SAndroid Build Coastguard Worker /*********************************/
554*495ae853SAndroid Build Coastguard Worker /* Computing Bs for the top edge */
555*495ae853SAndroid Build Coastguard Worker /*********************************/
556*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++, ps_top_mv_pred++)
557*495ae853SAndroid Build Coastguard Worker {
558*495ae853SAndroid Build Coastguard Worker UWORD32 u4_idx = 24 - (i << 3);
559*495ae853SAndroid Build Coastguard Worker
560*495ae853SAndroid Build Coastguard Worker /*********************************/
561*495ae853SAndroid Build Coastguard Worker /* check if Bs is already set */
562*495ae853SAndroid Build Coastguard Worker /*********************************/
563*495ae853SAndroid Build Coastguard Worker if(!((u4_bs_horz >> u4_idx) & 0xf))
564*495ae853SAndroid Build Coastguard Worker {
565*495ae853SAndroid Build Coastguard Worker /************************************************************/
566*495ae853SAndroid Build Coastguard Worker /* If Bs is not set, use left edge and current edge mvs and */
567*495ae853SAndroid Build Coastguard Worker /* reference pictures addresses to evaluate Bs==1 */
568*495ae853SAndroid Build Coastguard Worker /************************************************************/
569*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_temp1, u4_bs_temp2;
570*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs;
571*495ae853SAndroid Build Coastguard Worker
572*495ae853SAndroid Build Coastguard Worker /*********************************************************/
573*495ae853SAndroid Build Coastguard Worker /* If any motion vector component differs by more than 1 */
574*495ae853SAndroid Build Coastguard Worker /* integer pel or if reference pictures are different Bs */
575*495ae853SAndroid Build Coastguard Worker /* is set to 1. Note that this condition shall be met for*/
576*495ae853SAndroid Build Coastguard Worker /* both (fwd-fwd,bwd-bwd) and (fwd-bwd,bwd-fwd) direction*/
577*495ae853SAndroid Build Coastguard Worker /*********************************************************/
578*495ae853SAndroid Build Coastguard Worker i2_p_mv0 = ps_top_mv_pred->i2_mv[0];
579*495ae853SAndroid Build Coastguard Worker i2_p_mv1 = ps_top_mv_pred->i2_mv[1];
580*495ae853SAndroid Build Coastguard Worker i2_p_mv2 = ps_top_mv_pred->i2_mv[2];
581*495ae853SAndroid Build Coastguard Worker i2_p_mv3 = ps_top_mv_pred->i2_mv[3];
582*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr0 = u4_pic_addrress[i & 2];
583*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr1 = u4_pic_addrress[1 + (i & 2)];
584*495ae853SAndroid Build Coastguard Worker
585*495ae853SAndroid Build Coastguard Worker u4_bs_temp1 =
586*495ae853SAndroid Build Coastguard Worker ((ABS((i2_p_mv0 - i2_q_mv0))
587*495ae853SAndroid Build Coastguard Worker >= 4)
588*495ae853SAndroid Build Coastguard Worker | (ABS((i2_p_mv1 - i2_q_mv1))
589*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit)
590*495ae853SAndroid Build Coastguard Worker | (ABS((i2_p_mv2 - i2_q_mv2))
591*495ae853SAndroid Build Coastguard Worker >= 4)
592*495ae853SAndroid Build Coastguard Worker | (ABS((i2_p_mv3 - i2_q_mv3))
593*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit));
594*495ae853SAndroid Build Coastguard Worker
595*495ae853SAndroid Build Coastguard Worker u4_bs_temp2 =
596*495ae853SAndroid Build Coastguard Worker ((ABS((i2_p_mv0 - i2_q_mv2))
597*495ae853SAndroid Build Coastguard Worker >= 4)
598*495ae853SAndroid Build Coastguard Worker | (ABS((i2_p_mv1 - i2_q_mv3))
599*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit)
600*495ae853SAndroid Build Coastguard Worker | (ABS((i2_p_mv2 - i2_q_mv0))
601*495ae853SAndroid Build Coastguard Worker >= 4)
602*495ae853SAndroid Build Coastguard Worker | (ABS((i2_p_mv3 - i2_q_mv1))
603*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit));
604*495ae853SAndroid Build Coastguard Worker
605*495ae853SAndroid Build Coastguard Worker u4_bs = ((pv_cur_pic_addr0 != pv_nbr_pic_addr0)
606*495ae853SAndroid Build Coastguard Worker || (pv_cur_pic_addr1 != pv_nbr_pic_addr1)
607*495ae853SAndroid Build Coastguard Worker || u4_bs_temp1)
608*495ae853SAndroid Build Coastguard Worker && ((pv_cur_pic_addr0 != pv_nbr_pic_addr1)
609*495ae853SAndroid Build Coastguard Worker || (pv_cur_pic_addr1
610*495ae853SAndroid Build Coastguard Worker != pv_nbr_pic_addr0)
611*495ae853SAndroid Build Coastguard Worker || u4_bs_temp2);
612*495ae853SAndroid Build Coastguard Worker
613*495ae853SAndroid Build Coastguard Worker u4_bs_horz |= (u4_bs << u4_idx);
614*495ae853SAndroid Build Coastguard Worker }
615*495ae853SAndroid Build Coastguard Worker }
616*495ae853SAndroid Build Coastguard Worker pu4_bs_table[0] = u4_bs_horz;
617*495ae853SAndroid Build Coastguard Worker
618*495ae853SAndroid Build Coastguard Worker /***********************************/
619*495ae853SAndroid Build Coastguard Worker /* Computing Bs for the left edge */
620*495ae853SAndroid Build Coastguard Worker /***********************************/
621*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++, ps_leftmost_mv_pred += 4)
622*495ae853SAndroid Build Coastguard Worker {
623*495ae853SAndroid Build Coastguard Worker UWORD32 u4_idx = 24 - (i << 3);
624*495ae853SAndroid Build Coastguard Worker
625*495ae853SAndroid Build Coastguard Worker /*********************************/
626*495ae853SAndroid Build Coastguard Worker /* check if Bs is already set */
627*495ae853SAndroid Build Coastguard Worker /*********************************/
628*495ae853SAndroid Build Coastguard Worker if(!((u4_bs_vert >> u4_idx) & 0xf))
629*495ae853SAndroid Build Coastguard Worker {
630*495ae853SAndroid Build Coastguard Worker /****************************************************/
631*495ae853SAndroid Build Coastguard Worker /* If Bs is not set, evalaute conditions for Bs=1 */
632*495ae853SAndroid Build Coastguard Worker /****************************************************/
633*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_temp1, u4_bs_temp2;
634*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs;
635*495ae853SAndroid Build Coastguard Worker /*********************************************************/
636*495ae853SAndroid Build Coastguard Worker /* If any motion vector component differs by more than 1 */
637*495ae853SAndroid Build Coastguard Worker /* integer pel or if reference pictures are different Bs */
638*495ae853SAndroid Build Coastguard Worker /* is set to 1. Note that this condition shall be met for*/
639*495ae853SAndroid Build Coastguard Worker /* both (fwd-fwd,bwd-bwd) and (fwd-bwd,bwd-fwd) direction*/
640*495ae853SAndroid Build Coastguard Worker /*********************************************************/
641*495ae853SAndroid Build Coastguard Worker
642*495ae853SAndroid Build Coastguard Worker i2_p_mv0 = ps_leftmost_mv_pred->i2_mv[0];
643*495ae853SAndroid Build Coastguard Worker i2_p_mv1 = ps_leftmost_mv_pred->i2_mv[1];
644*495ae853SAndroid Build Coastguard Worker i2_p_mv2 = ps_leftmost_mv_pred->i2_mv[2];
645*495ae853SAndroid Build Coastguard Worker i2_p_mv3 = ps_leftmost_mv_pred->i2_mv[3];
646*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr0 = ps_left_addr->u4_add[i & 2];
647*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr1 = ps_left_addr->u4_add[1 + (i & 2)];
648*495ae853SAndroid Build Coastguard Worker
649*495ae853SAndroid Build Coastguard Worker u4_bs_temp1 =
650*495ae853SAndroid Build Coastguard Worker ((ABS((i2_p_mv0 - i2_q_mv0))
651*495ae853SAndroid Build Coastguard Worker >= 4)
652*495ae853SAndroid Build Coastguard Worker | (ABS((i2_p_mv1 - i2_q_mv1))
653*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit)
654*495ae853SAndroid Build Coastguard Worker | (ABS((i2_p_mv2 - i2_q_mv2))
655*495ae853SAndroid Build Coastguard Worker >= 4)
656*495ae853SAndroid Build Coastguard Worker | (ABS((i2_p_mv3 - i2_q_mv3))
657*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit));
658*495ae853SAndroid Build Coastguard Worker
659*495ae853SAndroid Build Coastguard Worker u4_bs_temp2 =
660*495ae853SAndroid Build Coastguard Worker ((ABS((i2_p_mv0 - i2_q_mv2))
661*495ae853SAndroid Build Coastguard Worker >= 4)
662*495ae853SAndroid Build Coastguard Worker | (ABS((i2_p_mv1 - i2_q_mv3))
663*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit)
664*495ae853SAndroid Build Coastguard Worker | (ABS((i2_p_mv2 - i2_q_mv0))
665*495ae853SAndroid Build Coastguard Worker >= 4)
666*495ae853SAndroid Build Coastguard Worker | (ABS((i2_p_mv3 - i2_q_mv1))
667*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit));
668*495ae853SAndroid Build Coastguard Worker
669*495ae853SAndroid Build Coastguard Worker u4_bs = ((pv_cur_pic_addr0 != pv_nbr_pic_addr0)
670*495ae853SAndroid Build Coastguard Worker || (pv_cur_pic_addr1 != pv_nbr_pic_addr1)
671*495ae853SAndroid Build Coastguard Worker || u4_bs_temp1)
672*495ae853SAndroid Build Coastguard Worker && ((pv_cur_pic_addr0 != pv_nbr_pic_addr1)
673*495ae853SAndroid Build Coastguard Worker || (pv_cur_pic_addr1
674*495ae853SAndroid Build Coastguard Worker != pv_nbr_pic_addr0)
675*495ae853SAndroid Build Coastguard Worker || u4_bs_temp2);
676*495ae853SAndroid Build Coastguard Worker
677*495ae853SAndroid Build Coastguard Worker u4_bs_vert |= (u4_bs << u4_idx);
678*495ae853SAndroid Build Coastguard Worker }
679*495ae853SAndroid Build Coastguard Worker }
680*495ae853SAndroid Build Coastguard Worker pu4_bs_table[4] = u4_bs_vert;
681*495ae853SAndroid Build Coastguard Worker
682*495ae853SAndroid Build Coastguard Worker return;
683*495ae853SAndroid Build Coastguard Worker }
684*495ae853SAndroid Build Coastguard Worker
685*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
686*495ae853SAndroid Build Coastguard Worker /* */
687*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_fill_bs1_non16x16mb_bslice */
688*495ae853SAndroid Build Coastguard Worker /* */
689*495ae853SAndroid Build Coastguard Worker /* Description : This function fills boundray strength (=1) for those */
690*495ae853SAndroid Build Coastguard Worker /* horz and vert edges of non16x16mb which are set to 0 by */
691*495ae853SAndroid Build Coastguard Worker /* ih264d_fill_bs2_horz_vert. This function is used for b slices */
692*495ae853SAndroid Build Coastguard Worker /* */
693*495ae853SAndroid Build Coastguard Worker /* Inputs : <What inputs does the function take?> */
694*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
695*495ae853SAndroid Build Coastguard Worker /* Processing : If any motion vector component of adjacent 4x4 blocks */
696*495ae853SAndroid Build Coastguard Worker /* differs by more than 1 integer pel or if reference */
697*495ae853SAndroid Build Coastguard Worker /* pictures are different, Bs is set to 1. */
698*495ae853SAndroid Build Coastguard Worker /* */
699*495ae853SAndroid Build Coastguard Worker /* Outputs : <What does the function produce?> */
700*495ae853SAndroid Build Coastguard Worker /* Returns : <What does the function return?> */
701*495ae853SAndroid Build Coastguard Worker /* */
702*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
703*495ae853SAndroid Build Coastguard Worker /* */
704*495ae853SAndroid Build Coastguard Worker /* Revision History: */
705*495ae853SAndroid Build Coastguard Worker /* */
706*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
707*495ae853SAndroid Build Coastguard Worker /* 16 10 2008 Jay Draft */
708*495ae853SAndroid Build Coastguard Worker /* */
709*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_fill_bs1_non16x16mb_bslice(mv_pred_t * ps_cur_mv_pred,mv_pred_t * ps_top_mv_pred,void ** ppv_map_ref_idx_to_poc,UWORD32 * pu4_bs_table,mv_pred_t * ps_leftmost_mv_pred,neighbouradd_t * ps_left_addr,void ** u4_pic_addrress,WORD32 i4_ver_mvlimit)710*495ae853SAndroid Build Coastguard Worker void ih264d_fill_bs1_non16x16mb_bslice(mv_pred_t *ps_cur_mv_pred,
711*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_top_mv_pred,
712*495ae853SAndroid Build Coastguard Worker void **ppv_map_ref_idx_to_poc,
713*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bs_table, /* pointer to the BsTable array */
714*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_leftmost_mv_pred,
715*495ae853SAndroid Build Coastguard Worker neighbouradd_t *ps_left_addr,
716*495ae853SAndroid Build Coastguard Worker void **u4_pic_addrress,
717*495ae853SAndroid Build Coastguard Worker WORD32 i4_ver_mvlimit)
718*495ae853SAndroid Build Coastguard Worker {
719*495ae853SAndroid Build Coastguard Worker UWORD32 edge;
720*495ae853SAndroid Build Coastguard Worker void **ppv_map_ref_idx_to_poc_l0, **ppv_map_ref_idx_to_poc_l1;
721*495ae853SAndroid Build Coastguard Worker ppv_map_ref_idx_to_poc_l0 = ppv_map_ref_idx_to_poc;
722*495ae853SAndroid Build Coastguard Worker ppv_map_ref_idx_to_poc_l1 = ppv_map_ref_idx_to_poc + POC_LIST_L0_TO_L1_DIFF;
723*495ae853SAndroid Build Coastguard Worker
724*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_BOUNDARY_STRENGTH()
725*495ae853SAndroid Build Coastguard Worker
726*495ae853SAndroid Build Coastguard Worker for(edge = 0; edge < 4; edge++, ps_top_mv_pred = ps_cur_mv_pred - 4)
727*495ae853SAndroid Build Coastguard Worker {
728*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
729*495ae853SAndroid Build Coastguard Worker /* Each iteration of this loop fills the four BS values of one HORIZ */
730*495ae853SAndroid Build Coastguard Worker /* edge and one BS value for each of the four VERT edges. */
731*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
732*495ae853SAndroid Build Coastguard Worker WORD32 i;
733*495ae853SAndroid Build Coastguard Worker UWORD32 u4_vert_idx = 24 - (edge << 3);
734*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_horz = pu4_bs_table[edge];
735*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_left_mv_pred = ps_leftmost_mv_pred + (edge << 2);
736*495ae853SAndroid Build Coastguard Worker
737*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++, ps_top_mv_pred++, ps_cur_mv_pred++)
738*495ae853SAndroid Build Coastguard Worker {
739*495ae853SAndroid Build Coastguard Worker WORD16 i2_cur_mv0, i2_cur_mv1, i16_curMv2, i16_curMv3;
740*495ae853SAndroid Build Coastguard Worker WORD8 i1_cur_ref0, i1_cur_ref1;
741*495ae853SAndroid Build Coastguard Worker void *pv_cur_pic_addr0, *pv_cur_pic_addr1;
742*495ae853SAndroid Build Coastguard Worker void *pv_nbr_pic_addr0, *pv_nbr_pic_addr1;
743*495ae853SAndroid Build Coastguard Worker
744*495ae853SAndroid Build Coastguard Worker /******************************************************/
745*495ae853SAndroid Build Coastguard Worker /* Each iteration of this inner loop computes a HORIZ */
746*495ae853SAndroid Build Coastguard Worker /* and a VERT BS value for a 4x4 block */
747*495ae853SAndroid Build Coastguard Worker /******************************************************/
748*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_vert = (pu4_bs_table[i + 4] >> u4_vert_idx) & 0xf;
749*495ae853SAndroid Build Coastguard Worker UWORD32 u4_horz_idx = 24 - (i << 3);
750*495ae853SAndroid Build Coastguard Worker
751*495ae853SAndroid Build Coastguard Worker /*****************************************************/
752*495ae853SAndroid Build Coastguard Worker /* check if vert Bs for this block is already set */
753*495ae853SAndroid Build Coastguard Worker /*****************************************************/
754*495ae853SAndroid Build Coastguard Worker if(!u4_bs_vert)
755*495ae853SAndroid Build Coastguard Worker {
756*495ae853SAndroid Build Coastguard Worker WORD16 i2_left_mv0, i2_left_mv1, i2_left_mv2, i2_left_mv3;
757*495ae853SAndroid Build Coastguard Worker /************************************************************/
758*495ae853SAndroid Build Coastguard Worker /* If Bs is not set, use left edge and current edge mvs and */
759*495ae853SAndroid Build Coastguard Worker /* reference pictures addresses to evaluate Bs==1 */
760*495ae853SAndroid Build Coastguard Worker /************************************************************/
761*495ae853SAndroid Build Coastguard Worker i2_left_mv0 = ps_left_mv_pred->i2_mv[0];
762*495ae853SAndroid Build Coastguard Worker i2_left_mv1 = ps_left_mv_pred->i2_mv[1];
763*495ae853SAndroid Build Coastguard Worker i2_left_mv2 = ps_left_mv_pred->i2_mv[2];
764*495ae853SAndroid Build Coastguard Worker i2_left_mv3 = ps_left_mv_pred->i2_mv[3];
765*495ae853SAndroid Build Coastguard Worker
766*495ae853SAndroid Build Coastguard Worker i2_cur_mv0 = ps_cur_mv_pred->i2_mv[0];
767*495ae853SAndroid Build Coastguard Worker i2_cur_mv1 = ps_cur_mv_pred->i2_mv[1];
768*495ae853SAndroid Build Coastguard Worker i16_curMv2 = ps_cur_mv_pred->i2_mv[2];
769*495ae853SAndroid Build Coastguard Worker i16_curMv3 = ps_cur_mv_pred->i2_mv[3];
770*495ae853SAndroid Build Coastguard Worker i1_cur_ref0 = ps_cur_mv_pred->i1_ref_frame[0];
771*495ae853SAndroid Build Coastguard Worker i1_cur_ref1 = ps_cur_mv_pred->i1_ref_frame[1];
772*495ae853SAndroid Build Coastguard Worker pv_cur_pic_addr0 = ppv_map_ref_idx_to_poc_l0[i1_cur_ref0];
773*495ae853SAndroid Build Coastguard Worker pv_cur_pic_addr1 = ppv_map_ref_idx_to_poc_l1[i1_cur_ref1];
774*495ae853SAndroid Build Coastguard Worker
775*495ae853SAndroid Build Coastguard Worker if(i)
776*495ae853SAndroid Build Coastguard Worker {
777*495ae853SAndroid Build Coastguard Worker WORD8 i1_left_ref0, i1_left_ref1;
778*495ae853SAndroid Build Coastguard Worker i1_left_ref0 = ps_left_mv_pred->i1_ref_frame[0];
779*495ae853SAndroid Build Coastguard Worker i1_left_ref1 = ps_left_mv_pred->i1_ref_frame[1];
780*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr0 = ppv_map_ref_idx_to_poc_l0[i1_left_ref0];
781*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr1 = ppv_map_ref_idx_to_poc_l1[i1_left_ref1];
782*495ae853SAndroid Build Coastguard Worker }
783*495ae853SAndroid Build Coastguard Worker else
784*495ae853SAndroid Build Coastguard Worker {
785*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr0 = ps_left_addr->u4_add[edge & 2];
786*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr1 = ps_left_addr->u4_add[1 + (edge & 2)];
787*495ae853SAndroid Build Coastguard Worker }
788*495ae853SAndroid Build Coastguard Worker
789*495ae853SAndroid Build Coastguard Worker {
790*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_temp1, u4_bs_temp2;
791*495ae853SAndroid Build Coastguard Worker /*********************************************************/
792*495ae853SAndroid Build Coastguard Worker /* If any motion vector component differs by more than 1 */
793*495ae853SAndroid Build Coastguard Worker /* integer pel or if reference pictures are different Bs */
794*495ae853SAndroid Build Coastguard Worker /* is set to 1. Note that this condition shall be met for*/
795*495ae853SAndroid Build Coastguard Worker /* both (fwd-fwd,bwd-bwd) and (fwd-bwd,bwd-fwd) direction*/
796*495ae853SAndroid Build Coastguard Worker /*********************************************************/
797*495ae853SAndroid Build Coastguard Worker
798*495ae853SAndroid Build Coastguard Worker u4_bs_temp1 =
799*495ae853SAndroid Build Coastguard Worker ((ABS((i2_left_mv0 - i2_cur_mv0))
800*495ae853SAndroid Build Coastguard Worker >= 4)
801*495ae853SAndroid Build Coastguard Worker | (ABS((i2_left_mv1
802*495ae853SAndroid Build Coastguard Worker - i2_cur_mv1))
803*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit)
804*495ae853SAndroid Build Coastguard Worker | (ABS((i2_left_mv2
805*495ae853SAndroid Build Coastguard Worker - i16_curMv2))
806*495ae853SAndroid Build Coastguard Worker >= 4)
807*495ae853SAndroid Build Coastguard Worker | (ABS((i2_left_mv3
808*495ae853SAndroid Build Coastguard Worker - i16_curMv3))
809*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit));
810*495ae853SAndroid Build Coastguard Worker
811*495ae853SAndroid Build Coastguard Worker u4_bs_temp2 =
812*495ae853SAndroid Build Coastguard Worker ((ABS((i2_left_mv0 - i16_curMv2))
813*495ae853SAndroid Build Coastguard Worker >= 4)
814*495ae853SAndroid Build Coastguard Worker | (ABS((i2_left_mv1
815*495ae853SAndroid Build Coastguard Worker - i16_curMv3))
816*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit)
817*495ae853SAndroid Build Coastguard Worker | (ABS((i2_left_mv2
818*495ae853SAndroid Build Coastguard Worker - i2_cur_mv0))
819*495ae853SAndroid Build Coastguard Worker >= 4)
820*495ae853SAndroid Build Coastguard Worker | (ABS((i2_left_mv3
821*495ae853SAndroid Build Coastguard Worker - i2_cur_mv1))
822*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit));
823*495ae853SAndroid Build Coastguard Worker
824*495ae853SAndroid Build Coastguard Worker u4_bs_vert =
825*495ae853SAndroid Build Coastguard Worker ((pv_nbr_pic_addr0 != pv_cur_pic_addr0)
826*495ae853SAndroid Build Coastguard Worker || (pv_nbr_pic_addr1
827*495ae853SAndroid Build Coastguard Worker != pv_cur_pic_addr1)
828*495ae853SAndroid Build Coastguard Worker || u4_bs_temp1)
829*495ae853SAndroid Build Coastguard Worker && ((pv_nbr_pic_addr0
830*495ae853SAndroid Build Coastguard Worker != pv_cur_pic_addr1)
831*495ae853SAndroid Build Coastguard Worker || (pv_nbr_pic_addr1
832*495ae853SAndroid Build Coastguard Worker != pv_cur_pic_addr0)
833*495ae853SAndroid Build Coastguard Worker || u4_bs_temp2);
834*495ae853SAndroid Build Coastguard Worker
835*495ae853SAndroid Build Coastguard Worker pu4_bs_table[i + 4] |= (u4_bs_vert << u4_vert_idx);
836*495ae853SAndroid Build Coastguard Worker }
837*495ae853SAndroid Build Coastguard Worker }
838*495ae853SAndroid Build Coastguard Worker
839*495ae853SAndroid Build Coastguard Worker /*****************************************************/
840*495ae853SAndroid Build Coastguard Worker /* check if horz Bs for this block is already set */
841*495ae853SAndroid Build Coastguard Worker /*****************************************************/
842*495ae853SAndroid Build Coastguard Worker if(!((u4_bs_horz >> u4_horz_idx) & 0xf))
843*495ae853SAndroid Build Coastguard Worker {
844*495ae853SAndroid Build Coastguard Worker WORD16 i2_top_mv0, i2_top_mv1, i16_topMv2, i16_topMv3;
845*495ae853SAndroid Build Coastguard Worker /************************************************************/
846*495ae853SAndroid Build Coastguard Worker /* If Bs is not set, use top edge and current edge mvs and */
847*495ae853SAndroid Build Coastguard Worker /* reference pictures addresses to evaluate Bs==1 */
848*495ae853SAndroid Build Coastguard Worker /************************************************************/
849*495ae853SAndroid Build Coastguard Worker i2_cur_mv0 = ps_cur_mv_pred->i2_mv[0];
850*495ae853SAndroid Build Coastguard Worker i2_cur_mv1 = ps_cur_mv_pred->i2_mv[1];
851*495ae853SAndroid Build Coastguard Worker i16_curMv2 = ps_cur_mv_pred->i2_mv[2];
852*495ae853SAndroid Build Coastguard Worker i16_curMv3 = ps_cur_mv_pred->i2_mv[3];
853*495ae853SAndroid Build Coastguard Worker i1_cur_ref0 = ps_cur_mv_pred->i1_ref_frame[0];
854*495ae853SAndroid Build Coastguard Worker i1_cur_ref1 = ps_cur_mv_pred->i1_ref_frame[1];
855*495ae853SAndroid Build Coastguard Worker
856*495ae853SAndroid Build Coastguard Worker i2_top_mv0 = ps_top_mv_pred->i2_mv[0];
857*495ae853SAndroid Build Coastguard Worker i2_top_mv1 = ps_top_mv_pred->i2_mv[1];
858*495ae853SAndroid Build Coastguard Worker i16_topMv2 = ps_top_mv_pred->i2_mv[2];
859*495ae853SAndroid Build Coastguard Worker i16_topMv3 = ps_top_mv_pred->i2_mv[3];
860*495ae853SAndroid Build Coastguard Worker pv_cur_pic_addr0 = ppv_map_ref_idx_to_poc_l0[i1_cur_ref0];
861*495ae853SAndroid Build Coastguard Worker pv_cur_pic_addr1 = ppv_map_ref_idx_to_poc_l1[i1_cur_ref1];
862*495ae853SAndroid Build Coastguard Worker if(edge)
863*495ae853SAndroid Build Coastguard Worker {
864*495ae853SAndroid Build Coastguard Worker WORD8 i1_top_ref0, i1_top_ref1;
865*495ae853SAndroid Build Coastguard Worker i1_top_ref0 = ps_top_mv_pred->i1_ref_frame[0];
866*495ae853SAndroid Build Coastguard Worker i1_top_ref1 = ps_top_mv_pred->i1_ref_frame[1];
867*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr0 = ppv_map_ref_idx_to_poc_l0[i1_top_ref0];
868*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr1 = ppv_map_ref_idx_to_poc_l1[i1_top_ref1];
869*495ae853SAndroid Build Coastguard Worker }
870*495ae853SAndroid Build Coastguard Worker else
871*495ae853SAndroid Build Coastguard Worker {
872*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr0 = u4_pic_addrress[i & 2];
873*495ae853SAndroid Build Coastguard Worker pv_nbr_pic_addr1 = u4_pic_addrress[1 + (i & 2)];
874*495ae853SAndroid Build Coastguard Worker }
875*495ae853SAndroid Build Coastguard Worker
876*495ae853SAndroid Build Coastguard Worker {
877*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_temp1, u4_bs_temp2;
878*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs;
879*495ae853SAndroid Build Coastguard Worker /*********************************************************/
880*495ae853SAndroid Build Coastguard Worker /* If any motion vector component differs by more than 1 */
881*495ae853SAndroid Build Coastguard Worker /* integer pel or if reference pictures are different Bs */
882*495ae853SAndroid Build Coastguard Worker /* is set to 1. Note that this condition shall be met for*/
883*495ae853SAndroid Build Coastguard Worker /* both (fwd-fwd,bwd-bwd) and (fwd-bwd,bwd-fwd) direction*/
884*495ae853SAndroid Build Coastguard Worker /*********************************************************/
885*495ae853SAndroid Build Coastguard Worker
886*495ae853SAndroid Build Coastguard Worker u4_bs_temp1 =
887*495ae853SAndroid Build Coastguard Worker ((ABS((i2_top_mv0 - i2_cur_mv0))
888*495ae853SAndroid Build Coastguard Worker >= 4)
889*495ae853SAndroid Build Coastguard Worker | (ABS((i2_top_mv1
890*495ae853SAndroid Build Coastguard Worker - i2_cur_mv1))
891*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit)
892*495ae853SAndroid Build Coastguard Worker | (ABS((i16_topMv2
893*495ae853SAndroid Build Coastguard Worker - i16_curMv2))
894*495ae853SAndroid Build Coastguard Worker >= 4)
895*495ae853SAndroid Build Coastguard Worker | (ABS((i16_topMv3
896*495ae853SAndroid Build Coastguard Worker - i16_curMv3))
897*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit));
898*495ae853SAndroid Build Coastguard Worker
899*495ae853SAndroid Build Coastguard Worker u4_bs_temp2 =
900*495ae853SAndroid Build Coastguard Worker ((ABS((i2_top_mv0 - i16_curMv2))
901*495ae853SAndroid Build Coastguard Worker >= 4)
902*495ae853SAndroid Build Coastguard Worker | (ABS((i2_top_mv1
903*495ae853SAndroid Build Coastguard Worker - i16_curMv3))
904*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit)
905*495ae853SAndroid Build Coastguard Worker | (ABS((i16_topMv2
906*495ae853SAndroid Build Coastguard Worker - i2_cur_mv0))
907*495ae853SAndroid Build Coastguard Worker >= 4)
908*495ae853SAndroid Build Coastguard Worker | (ABS((i16_topMv3
909*495ae853SAndroid Build Coastguard Worker - i2_cur_mv1))
910*495ae853SAndroid Build Coastguard Worker >= i4_ver_mvlimit));
911*495ae853SAndroid Build Coastguard Worker
912*495ae853SAndroid Build Coastguard Worker u4_bs =
913*495ae853SAndroid Build Coastguard Worker ((pv_nbr_pic_addr0 != pv_cur_pic_addr0)
914*495ae853SAndroid Build Coastguard Worker || (pv_nbr_pic_addr1
915*495ae853SAndroid Build Coastguard Worker != pv_cur_pic_addr1)
916*495ae853SAndroid Build Coastguard Worker || u4_bs_temp1)
917*495ae853SAndroid Build Coastguard Worker && ((pv_nbr_pic_addr0
918*495ae853SAndroid Build Coastguard Worker != pv_cur_pic_addr1)
919*495ae853SAndroid Build Coastguard Worker || (pv_nbr_pic_addr1
920*495ae853SAndroid Build Coastguard Worker != pv_cur_pic_addr0)
921*495ae853SAndroid Build Coastguard Worker || u4_bs_temp2);
922*495ae853SAndroid Build Coastguard Worker
923*495ae853SAndroid Build Coastguard Worker u4_bs_horz |= (u4_bs << u4_horz_idx);
924*495ae853SAndroid Build Coastguard Worker }
925*495ae853SAndroid Build Coastguard Worker }
926*495ae853SAndroid Build Coastguard Worker
927*495ae853SAndroid Build Coastguard Worker ps_left_mv_pred = ps_cur_mv_pred;
928*495ae853SAndroid Build Coastguard Worker }
929*495ae853SAndroid Build Coastguard Worker
930*495ae853SAndroid Build Coastguard Worker pu4_bs_table[edge] = u4_bs_horz;
931*495ae853SAndroid Build Coastguard Worker }
932*495ae853SAndroid Build Coastguard Worker }
933*495ae853SAndroid Build Coastguard Worker
934*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
935*495ae853SAndroid Build Coastguard Worker /* */
936*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_fill_bs_xtra_left_edge_cur_fld */
937*495ae853SAndroid Build Coastguard Worker /* */
938*495ae853SAndroid Build Coastguard Worker /* Description : This function fills boundray strength (= 2 or 1) for */
939*495ae853SAndroid Build Coastguard Worker /* xtra left mb edge when cur mb is field and left mb is */
940*495ae853SAndroid Build Coastguard Worker /* frame. */
941*495ae853SAndroid Build Coastguard Worker /* Inputs : */
942*495ae853SAndroid Build Coastguard Worker /* */
943*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
944*495ae853SAndroid Build Coastguard Worker /* Processing : */
945*495ae853SAndroid Build Coastguard Worker /* */
946*495ae853SAndroid Build Coastguard Worker /* */
947*495ae853SAndroid Build Coastguard Worker /* Outputs : <What does the function produce?> */
948*495ae853SAndroid Build Coastguard Worker /* Returns : <What does the function return?> */
949*495ae853SAndroid Build Coastguard Worker /* */
950*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
951*495ae853SAndroid Build Coastguard Worker /* */
952*495ae853SAndroid Build Coastguard Worker /* Revision History: */
953*495ae853SAndroid Build Coastguard Worker /* */
954*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
955*495ae853SAndroid Build Coastguard Worker /* 16 10 2008 Jay Draft */
956*495ae853SAndroid Build Coastguard Worker /* */
957*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_fill_bs_xtra_left_edge_cur_fld(UWORD32 * pu4_bs,WORD32 u4_left_mb_t_csbp,WORD32 u4_left_mb_b_csbp,WORD32 u4_cur_mb_csbp,UWORD32 u4_cur_mb_top)958*495ae853SAndroid Build Coastguard Worker void ih264d_fill_bs_xtra_left_edge_cur_fld(UWORD32 *pu4_bs, /* Base pointer of BS table */
959*495ae853SAndroid Build Coastguard Worker WORD32 u4_left_mb_t_csbp, /* left mbpair's top csbp */
960*495ae853SAndroid Build Coastguard Worker WORD32 u4_left_mb_b_csbp, /* left mbpair's bottom csbp*/
961*495ae853SAndroid Build Coastguard Worker WORD32 u4_cur_mb_csbp, /* csbp of current mb */
962*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cur_mb_top /* is top or bottom mb */
963*495ae853SAndroid Build Coastguard Worker
964*495ae853SAndroid Build Coastguard Worker )
965*495ae853SAndroid Build Coastguard Worker {
966*495ae853SAndroid Build Coastguard Worker const UWORD32 *pu4_packed_bs = (const UWORD32 *)gau4_ih264d_packed_bs2;
967*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cur, u4_left, u4_or;
968*495ae853SAndroid Build Coastguard Worker UNUSED(u4_cur_mb_top);
969*495ae853SAndroid Build Coastguard Worker
970*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_BOUNDARY_STRENGTH()
971*495ae853SAndroid Build Coastguard Worker
972*495ae853SAndroid Build Coastguard Worker u4_left_mb_t_csbp = ((u4_left_mb_t_csbp & 0x0008) >> 3)
973*495ae853SAndroid Build Coastguard Worker + ((u4_left_mb_t_csbp & 0x0080) >> 6)
974*495ae853SAndroid Build Coastguard Worker + ((u4_left_mb_t_csbp & 0x0800) >> 9)
975*495ae853SAndroid Build Coastguard Worker + ((u4_left_mb_t_csbp & 0x8000) >> 12);
976*495ae853SAndroid Build Coastguard Worker
977*495ae853SAndroid Build Coastguard Worker u4_left_mb_b_csbp = ((u4_left_mb_b_csbp & 0x0008) << 1)
978*495ae853SAndroid Build Coastguard Worker + ((u4_left_mb_b_csbp & 0x0080) >> 2)
979*495ae853SAndroid Build Coastguard Worker + ((u4_left_mb_b_csbp & 0x0800) >> 5)
980*495ae853SAndroid Build Coastguard Worker + ((u4_left_mb_b_csbp & 0x8000) >> 8);
981*495ae853SAndroid Build Coastguard Worker
982*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
983*495ae853SAndroid Build Coastguard Worker /* u4_cur = 0|0|0|0|0|0|0|0|12C|12C|8C|8C|4C|4C|0C|0C */
984*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
985*495ae853SAndroid Build Coastguard Worker u4_cur = (u4_cur_mb_csbp & 0x0001) + ((u4_cur_mb_csbp & 0x0001) << 1)
986*495ae853SAndroid Build Coastguard Worker + ((u4_cur_mb_csbp & 0x0010) >> 2)
987*495ae853SAndroid Build Coastguard Worker + ((u4_cur_mb_csbp & 0x0010) >> 1)
988*495ae853SAndroid Build Coastguard Worker + ((u4_cur_mb_csbp & 0x0100) >> 4)
989*495ae853SAndroid Build Coastguard Worker + ((u4_cur_mb_csbp & 0x0100) >> 3)
990*495ae853SAndroid Build Coastguard Worker + ((u4_cur_mb_csbp & 0x1000) >> 6)
991*495ae853SAndroid Build Coastguard Worker + ((u4_cur_mb_csbp & 0x1000) >> 5);
992*495ae853SAndroid Build Coastguard Worker
993*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
994*495ae853SAndroid Build Coastguard Worker /* u4_left =0|0|0|0|0|0|0|0|15Lb|11Lb|7Lb|3Lb|15Lt|11Lt|7Lt|3Lt */
995*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
996*495ae853SAndroid Build Coastguard Worker u4_left = u4_left_mb_t_csbp + u4_left_mb_b_csbp;
997*495ae853SAndroid Build Coastguard Worker
998*495ae853SAndroid Build Coastguard Worker u4_or = (u4_cur | u4_left);
999*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
1000*495ae853SAndroid Build Coastguard Worker /* Fill vert edges (4,9) boundary strengths using look up table */
1001*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
1002*495ae853SAndroid Build Coastguard Worker pu4_packed_bs += 16;
1003*495ae853SAndroid Build Coastguard Worker pu4_bs[4] = pu4_packed_bs[u4_or & 0xF];
1004*495ae853SAndroid Build Coastguard Worker pu4_bs[9] = pu4_packed_bs[(u4_or >> 4)];
1005*495ae853SAndroid Build Coastguard Worker }
1006*495ae853SAndroid Build Coastguard Worker
1007*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1008*495ae853SAndroid Build Coastguard Worker /* */
1009*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_fill_bs_xtra_left_edge_cur_frm */
1010*495ae853SAndroid Build Coastguard Worker /* */
1011*495ae853SAndroid Build Coastguard Worker /* Description : This function fills boundray strength (= 2 or 1) for */
1012*495ae853SAndroid Build Coastguard Worker /* xtra left mb edge when cur mb is frame and left mb is */
1013*495ae853SAndroid Build Coastguard Worker /* field. */
1014*495ae853SAndroid Build Coastguard Worker /* Inputs : */
1015*495ae853SAndroid Build Coastguard Worker /* */
1016*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
1017*495ae853SAndroid Build Coastguard Worker /* Processing : */
1018*495ae853SAndroid Build Coastguard Worker /* */
1019*495ae853SAndroid Build Coastguard Worker /* */
1020*495ae853SAndroid Build Coastguard Worker /* Outputs : <What does the function produce?> */
1021*495ae853SAndroid Build Coastguard Worker /* Returns : <What does the function return?> */
1022*495ae853SAndroid Build Coastguard Worker /* */
1023*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
1024*495ae853SAndroid Build Coastguard Worker /* */
1025*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1026*495ae853SAndroid Build Coastguard Worker /* */
1027*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1028*495ae853SAndroid Build Coastguard Worker /* 16 10 2008 Jay Draft */
1029*495ae853SAndroid Build Coastguard Worker /* */
1030*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_fill_bs_xtra_left_edge_cur_frm(UWORD32 * pu4_bs,WORD32 u4_left_mb_t_csbp,WORD32 u4_left_mb_b_csbp,WORD32 u4_cur_mb_csbp,UWORD32 u4_cur_mb_bot)1031*495ae853SAndroid Build Coastguard Worker void ih264d_fill_bs_xtra_left_edge_cur_frm(UWORD32 *pu4_bs, /* Base pointer of BS table */
1032*495ae853SAndroid Build Coastguard Worker WORD32 u4_left_mb_t_csbp, /* left mbpair's top csbp */
1033*495ae853SAndroid Build Coastguard Worker WORD32 u4_left_mb_b_csbp, /* left mbpair's bottom csbp*/
1034*495ae853SAndroid Build Coastguard Worker WORD32 u4_cur_mb_csbp, /* csbp of current mb */
1035*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cur_mb_bot /* is top or bottom mb */
1036*495ae853SAndroid Build Coastguard Worker
1037*495ae853SAndroid Build Coastguard Worker )
1038*495ae853SAndroid Build Coastguard Worker {
1039*495ae853SAndroid Build Coastguard Worker const UWORD32 *pu4_packed_bs = (const UWORD32 *)gau4_ih264d_packed_bs2;
1040*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cur, u4_left, u4_or;
1041*495ae853SAndroid Build Coastguard Worker UWORD32 u4_right_shift = (u4_cur_mb_bot << 3);
1042*495ae853SAndroid Build Coastguard Worker
1043*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_BOUNDARY_STRENGTH()
1044*495ae853SAndroid Build Coastguard Worker
1045*495ae853SAndroid Build Coastguard Worker u4_left_mb_t_csbp >>= u4_right_shift;
1046*495ae853SAndroid Build Coastguard Worker u4_left_mb_b_csbp >>= u4_right_shift;
1047*495ae853SAndroid Build Coastguard Worker
1048*495ae853SAndroid Build Coastguard Worker u4_left_mb_t_csbp = ((u4_left_mb_t_csbp & 0x08) >> 3)
1049*495ae853SAndroid Build Coastguard Worker + ((u4_left_mb_t_csbp & 0x08) >> 2)
1050*495ae853SAndroid Build Coastguard Worker + ((u4_left_mb_t_csbp & 0x80) >> 5)
1051*495ae853SAndroid Build Coastguard Worker + ((u4_left_mb_t_csbp & 0x80) >> 4);
1052*495ae853SAndroid Build Coastguard Worker
1053*495ae853SAndroid Build Coastguard Worker u4_left_mb_b_csbp = ((u4_left_mb_b_csbp & 0x08) << 1)
1054*495ae853SAndroid Build Coastguard Worker + ((u4_left_mb_b_csbp & 0x08) << 2)
1055*495ae853SAndroid Build Coastguard Worker + ((u4_left_mb_b_csbp & 0x80) >> 1)
1056*495ae853SAndroid Build Coastguard Worker + ((u4_left_mb_b_csbp & 0x80));
1057*495ae853SAndroid Build Coastguard Worker
1058*495ae853SAndroid Build Coastguard Worker u4_cur = ((u4_cur_mb_csbp & 0x0001)) + ((u4_cur_mb_csbp & 0x0010) >> 3)
1059*495ae853SAndroid Build Coastguard Worker + ((u4_cur_mb_csbp & 0x0100) >> 6)
1060*495ae853SAndroid Build Coastguard Worker + ((u4_cur_mb_csbp & 0x1000) >> 9);
1061*495ae853SAndroid Build Coastguard Worker
1062*495ae853SAndroid Build Coastguard Worker u4_cur += (u4_cur << 4);
1063*495ae853SAndroid Build Coastguard Worker
1064*495ae853SAndroid Build Coastguard Worker u4_left = u4_left_mb_t_csbp + u4_left_mb_b_csbp;
1065*495ae853SAndroid Build Coastguard Worker
1066*495ae853SAndroid Build Coastguard Worker u4_or = (u4_cur | u4_left);
1067*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
1068*495ae853SAndroid Build Coastguard Worker /* Fill vert edges (4,9) boundary strengths using look up table */
1069*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
1070*495ae853SAndroid Build Coastguard Worker pu4_packed_bs += 16;
1071*495ae853SAndroid Build Coastguard Worker pu4_bs[4] = pu4_packed_bs[u4_or & 0xF];
1072*495ae853SAndroid Build Coastguard Worker pu4_bs[9] = pu4_packed_bs[(u4_or >> 4)];
1073*495ae853SAndroid Build Coastguard Worker }
1074*495ae853SAndroid Build Coastguard Worker
1075*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1076*495ae853SAndroid Build Coastguard Worker /* */
1077*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_fill_bs_xtra_top_edge */
1078*495ae853SAndroid Build Coastguard Worker /* */
1079*495ae853SAndroid Build Coastguard Worker /* Description : This function fills boundray strength (= 2 or 1) for */
1080*495ae853SAndroid Build Coastguard Worker /* xtra top mb edge when cur mb is top mb of frame mb pair */
1081*495ae853SAndroid Build Coastguard Worker /* and top mbpair is field coded. */
1082*495ae853SAndroid Build Coastguard Worker /* Inputs : */
1083*495ae853SAndroid Build Coastguard Worker /* */
1084*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
1085*495ae853SAndroid Build Coastguard Worker /* Processing : */
1086*495ae853SAndroid Build Coastguard Worker /* */
1087*495ae853SAndroid Build Coastguard Worker /* */
1088*495ae853SAndroid Build Coastguard Worker /* Outputs : <What does the function produce?> */
1089*495ae853SAndroid Build Coastguard Worker /* Returns : <What does the function return?> */
1090*495ae853SAndroid Build Coastguard Worker /* */
1091*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
1092*495ae853SAndroid Build Coastguard Worker /* */
1093*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1094*495ae853SAndroid Build Coastguard Worker /* */
1095*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1096*495ae853SAndroid Build Coastguard Worker /* 16 10 2008 Jay Draft */
1097*495ae853SAndroid Build Coastguard Worker /* */
1098*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_fill_bs_xtra_top_edge(UWORD32 * pu4_bs,WORD32 u4_topmb_t_csbp,WORD32 u4_topmb_b_csbp,WORD32 u4_cur_mb_csbp)1099*495ae853SAndroid Build Coastguard Worker void ih264d_fill_bs_xtra_top_edge(UWORD32 *pu4_bs, /* Base pointer of BS table */
1100*495ae853SAndroid Build Coastguard Worker WORD32 u4_topmb_t_csbp, /* top mbpair's top csbp */
1101*495ae853SAndroid Build Coastguard Worker WORD32 u4_topmb_b_csbp, /* top mbpair's bottom csbp*/
1102*495ae853SAndroid Build Coastguard Worker WORD32 u4_cur_mb_csbp /* csbp of current mb */
1103*495ae853SAndroid Build Coastguard Worker
1104*495ae853SAndroid Build Coastguard Worker )
1105*495ae853SAndroid Build Coastguard Worker {
1106*495ae853SAndroid Build Coastguard Worker const UWORD32 *pu4_packed_bs = (const UWORD32 *)gau4_ih264d_packed_bs2;
1107*495ae853SAndroid Build Coastguard Worker UWORD32 u4_or;
1108*495ae853SAndroid Build Coastguard Worker
1109*495ae853SAndroid Build Coastguard Worker u4_cur_mb_csbp &= 0xf;
1110*495ae853SAndroid Build Coastguard Worker u4_topmb_t_csbp >>= 12;
1111*495ae853SAndroid Build Coastguard Worker u4_topmb_b_csbp >>= 12;
1112*495ae853SAndroid Build Coastguard Worker
1113*495ae853SAndroid Build Coastguard Worker u4_or = (u4_cur_mb_csbp | u4_topmb_t_csbp);
1114*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
1115*495ae853SAndroid Build Coastguard Worker /* Fill vert edges (0,8) boundary strengths using look up table */
1116*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
1117*495ae853SAndroid Build Coastguard Worker pu4_packed_bs += 16;
1118*495ae853SAndroid Build Coastguard Worker pu4_bs[8] = pu4_packed_bs[u4_or];
1119*495ae853SAndroid Build Coastguard Worker
1120*495ae853SAndroid Build Coastguard Worker u4_or = (u4_cur_mb_csbp | u4_topmb_b_csbp);
1121*495ae853SAndroid Build Coastguard Worker pu4_bs[0] = pu4_packed_bs[u4_or];
1122*495ae853SAndroid Build Coastguard Worker }
1123*495ae853SAndroid Build Coastguard Worker
1124*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1125*495ae853SAndroid Build Coastguard Worker /* */
1126*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_compute_bs_non_mbaff */
1127*495ae853SAndroid Build Coastguard Worker /* */
1128*495ae853SAndroid Build Coastguard Worker /* Description : This function computes the pointers of left,top & current*/
1129*495ae853SAndroid Build Coastguard Worker /* : Nnz, MvPred & deblk_mb_t and supplies to FillBs function for*/
1130*495ae853SAndroid Build Coastguard Worker /* : Boundary Strength Calculation */
1131*495ae853SAndroid Build Coastguard Worker /* Inputs : <What inputs does the function take?> */
1132*495ae853SAndroid Build Coastguard Worker /* Processing : This functions calls deblock MB in the MB increment order*/
1133*495ae853SAndroid Build Coastguard Worker /* */
1134*495ae853SAndroid Build Coastguard Worker /* Outputs : Produces the Boundary Strength for Current Mb */
1135*495ae853SAndroid Build Coastguard Worker /* Returns : None */
1136*495ae853SAndroid Build Coastguard Worker /* */
1137*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1138*495ae853SAndroid Build Coastguard Worker /* */
1139*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1140*495ae853SAndroid Build Coastguard Worker /* ITTIAM */
1141*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1142*495ae853SAndroid Build Coastguard Worker
ih264d_compute_bs_non_mbaff(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,const UWORD16 u2_mbxn_mb)1143*495ae853SAndroid Build Coastguard Worker void ih264d_compute_bs_non_mbaff(dec_struct_t * ps_dec,
1144*495ae853SAndroid Build Coastguard Worker dec_mb_info_t * ps_cur_mb_info,
1145*495ae853SAndroid Build Coastguard Worker const UWORD16 u2_mbxn_mb)
1146*495ae853SAndroid Build Coastguard Worker {
1147*495ae853SAndroid Build Coastguard Worker /* Mvpred and Nnz for top and Courrent */
1148*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_cur_mv_pred, *ps_top_mv_pred = NULL, *ps_left_mv_pred;
1149*495ae853SAndroid Build Coastguard Worker /* deblk_mb_t Params */
1150*495ae853SAndroid Build Coastguard Worker deblk_mb_t *ps_cur_mb_params; /*< Parameters of current MacroBlock */
1151*495ae853SAndroid Build Coastguard Worker deblkmb_neighbour_t *ps_deblk_top_mb;
1152*495ae853SAndroid Build Coastguard Worker
1153*495ae853SAndroid Build Coastguard Worker /* Reference Index to POC mapping*/
1154*495ae853SAndroid Build Coastguard Worker void ** apv_map_ref_idx_to_poc;
1155*495ae853SAndroid Build Coastguard Worker UWORD32 u4_leftmbtype;
1156*495ae853SAndroid Build Coastguard Worker
1157*495ae853SAndroid Build Coastguard Worker UWORD16 u2_left_csbp, u2_top_csbp, u2_cur_csbp;
1158*495ae853SAndroid Build Coastguard Worker
1159*495ae853SAndroid Build Coastguard Worker /* Set of flags */
1160*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cur_mb_intra, u1_top_mb_typ, u4_cur_mb_fld;
1161*495ae853SAndroid Build Coastguard Worker UWORD32 u1_cur_mb_type;
1162*495ae853SAndroid Build Coastguard Worker UWORD32 * pu4_bs_table;
1163*495ae853SAndroid Build Coastguard Worker
1164*495ae853SAndroid Build Coastguard Worker /* Neighbour availability */
1165*495ae853SAndroid Build Coastguard Worker /* Initialization */
1166*495ae853SAndroid Build Coastguard Worker const UWORD32 u2_mbx = ps_cur_mb_info->u2_mbx;
1167*495ae853SAndroid Build Coastguard Worker const UWORD32 u2_mby = ps_cur_mb_info->u2_mby;
1168*495ae853SAndroid Build Coastguard Worker const UWORD32 u1_pingpong = u2_mbx & 0x01;
1169*495ae853SAndroid Build Coastguard Worker
1170*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_BOUNDARY_STRENGTH()
1171*495ae853SAndroid Build Coastguard Worker
1172*495ae853SAndroid Build Coastguard Worker ps_deblk_top_mb = ps_dec->ps_deblk_top_mb + u2_mbx;
1173*495ae853SAndroid Build Coastguard Worker
1174*495ae853SAndroid Build Coastguard Worker
1175*495ae853SAndroid Build Coastguard Worker /* Pointer assignment for Current DeblkMB, Current Mv Pred */
1176*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params = ps_dec->ps_deblk_mbn + u2_mbxn_mb;
1177*495ae853SAndroid Build Coastguard Worker ps_cur_mv_pred = ps_dec->ps_mv_cur + (u2_mbxn_mb << 4);
1178*495ae853SAndroid Build Coastguard Worker
1179*495ae853SAndroid Build Coastguard Worker apv_map_ref_idx_to_poc = ps_dec->ppv_map_ref_idx_to_poc + 1;
1180*495ae853SAndroid Build Coastguard Worker u1_cur_mb_type = ps_cur_mb_params->u1_mb_type;
1181*495ae853SAndroid Build Coastguard Worker u1_top_mb_typ = ps_deblk_top_mb->u1_mb_type;
1182*495ae853SAndroid Build Coastguard Worker ps_deblk_top_mb->u1_mb_type = u1_cur_mb_type;
1183*495ae853SAndroid Build Coastguard Worker
1184*495ae853SAndroid Build Coastguard Worker {
1185*495ae853SAndroid Build Coastguard Worker UWORD8 mb_qp_temp;
1186*495ae853SAndroid Build Coastguard Worker
1187*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params->u1_topmb_qp = ps_deblk_top_mb->u1_mb_qp;
1188*495ae853SAndroid Build Coastguard Worker ps_deblk_top_mb->u1_mb_qp = ps_cur_mb_params->u1_mb_qp;
1189*495ae853SAndroid Build Coastguard Worker
1190*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params->u1_left_mb_qp = ps_dec->deblk_left_mb[1].u1_mb_qp;
1191*495ae853SAndroid Build Coastguard Worker ps_dec->deblk_left_mb[1].u1_mb_qp = ps_cur_mb_params->u1_mb_qp;
1192*495ae853SAndroid Build Coastguard Worker
1193*495ae853SAndroid Build Coastguard Worker }
1194*495ae853SAndroid Build Coastguard Worker
1195*495ae853SAndroid Build Coastguard Worker /* if no deblocking required for current Mb then continue */
1196*495ae853SAndroid Build Coastguard Worker /* Check next Mbs in Mb group */
1197*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_params->u1_deblocking_mode & MB_DISABLE_FILTERING)
1198*495ae853SAndroid Build Coastguard Worker {
1199*495ae853SAndroid Build Coastguard Worker void ** pu4_map_ref_idx_to_poc_l1 = apv_map_ref_idx_to_poc +
1200*495ae853SAndroid Build Coastguard Worker POC_LIST_L0_TO_L1_DIFF;
1201*495ae853SAndroid Build Coastguard Worker {
1202*495ae853SAndroid Build Coastguard Worker /* Store Parameter for Top MvPred refernce frame Address */
1203*495ae853SAndroid Build Coastguard Worker
1204*495ae853SAndroid Build Coastguard Worker void ** ppv_top_mv_pred_addr = ps_cur_mb_info->ps_curmb->u4_pic_addrress;
1205*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refTop0 = (ps_cur_mv_pred + 12)->i1_ref_frame;
1206*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refTop1 = (ps_cur_mv_pred + 14)->i1_ref_frame;
1207*495ae853SAndroid Build Coastguard Worker
1208*495ae853SAndroid Build Coastguard Worker /* Store Left addresses for Next Mb */
1209*495ae853SAndroid Build Coastguard Worker void ** ppv_left_mv_pred_addr =
1210*495ae853SAndroid Build Coastguard Worker ps_dec->ps_left_mvpred_addr[!u1_pingpong][1].u4_add;
1211*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refleft0 = (ps_cur_mv_pred + 3)->i1_ref_frame;
1212*495ae853SAndroid Build Coastguard Worker
1213*495ae853SAndroid Build Coastguard Worker
1214*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refTop0[0]];
1215*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refTop0[1]];
1216*495ae853SAndroid Build Coastguard Worker
1217*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
1218*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
1219*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
1220*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
1221*495ae853SAndroid Build Coastguard Worker
1222*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refleft0[0]];
1223*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refleft0[1]];
1224*495ae853SAndroid Build Coastguard Worker //}
1225*495ae853SAndroid Build Coastguard Worker /* Storing the leftMbtype for next Mb */
1226*495ae853SAndroid Build Coastguard Worker ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type;
1227*495ae853SAndroid Build Coastguard Worker }
1228*495ae853SAndroid Build Coastguard Worker
1229*495ae853SAndroid Build Coastguard Worker return;
1230*495ae853SAndroid Build Coastguard Worker }
1231*495ae853SAndroid Build Coastguard Worker
1232*495ae853SAndroid Build Coastguard Worker /* Flag for extra left Edge */
1233*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params->u1_single_call = 1;
1234*495ae853SAndroid Build Coastguard Worker
1235*495ae853SAndroid Build Coastguard Worker /* Update the Left deblk_mb_t and Left MvPred Parameters */
1236*495ae853SAndroid Build Coastguard Worker if(!u2_mbx)
1237*495ae853SAndroid Build Coastguard Worker {
1238*495ae853SAndroid Build Coastguard Worker u4_leftmbtype = 0;
1239*495ae853SAndroid Build Coastguard Worker
1240*495ae853SAndroid Build Coastguard Worker /* Initialize the ps_left_mv_pred with Junk but Valid Location */
1241*495ae853SAndroid Build Coastguard Worker /* to avoid invalid memory access */
1242*495ae853SAndroid Build Coastguard Worker /* this is read only pointer */
1243*495ae853SAndroid Build Coastguard Worker ps_left_mv_pred = ps_dec->ps_mv_cur + 3;
1244*495ae853SAndroid Build Coastguard Worker }
1245*495ae853SAndroid Build Coastguard Worker else
1246*495ae853SAndroid Build Coastguard Worker {
1247*495ae853SAndroid Build Coastguard Worker u4_leftmbtype = ps_dec->deblk_left_mb[1].u1_mb_type;
1248*495ae853SAndroid Build Coastguard Worker
1249*495ae853SAndroid Build Coastguard Worker /* Come to Left Most Edge of the MB */
1250*495ae853SAndroid Build Coastguard Worker ps_left_mv_pred = (u2_mbxn_mb) ?
1251*495ae853SAndroid Build Coastguard Worker ps_dec->ps_mv_cur + ((u2_mbxn_mb - 1) << 4) + 3 :
1252*495ae853SAndroid Build Coastguard Worker ps_dec->ps_mv_left + 3;
1253*495ae853SAndroid Build Coastguard Worker }
1254*495ae853SAndroid Build Coastguard Worker
1255*495ae853SAndroid Build Coastguard Worker if(!u2_mby)
1256*495ae853SAndroid Build Coastguard Worker u1_top_mb_typ = 0;
1257*495ae853SAndroid Build Coastguard Worker
1258*495ae853SAndroid Build Coastguard Worker /* MvPred Pointer Calculation */
1259*495ae853SAndroid Build Coastguard Worker /* CHANGED CODE */
1260*495ae853SAndroid Build Coastguard Worker ps_top_mv_pred = ps_cur_mv_pred - (ps_dec->u2_frm_wd_in_mbs << 4) + 12;
1261*495ae853SAndroid Build Coastguard Worker
1262*495ae853SAndroid Build Coastguard Worker u4_cur_mb_intra = u1_cur_mb_type & D_INTRA_MB;
1263*495ae853SAndroid Build Coastguard Worker u4_cur_mb_fld = !!(u1_cur_mb_type & D_FLD_MB);
1264*495ae853SAndroid Build Coastguard Worker /* Compute BS function */
1265*495ae853SAndroid Build Coastguard Worker pu4_bs_table = ps_cur_mb_params->u4_bs_table;
1266*495ae853SAndroid Build Coastguard Worker
1267*495ae853SAndroid Build Coastguard Worker u2_cur_csbp = ps_cur_mb_info->ps_curmb->u2_luma_csbp;
1268*495ae853SAndroid Build Coastguard Worker u2_left_csbp = ps_cur_mb_info->ps_left_mb->u2_luma_csbp;
1269*495ae853SAndroid Build Coastguard Worker u2_top_csbp = ps_cur_mb_info->ps_top_mb->u2_luma_csbp;
1270*495ae853SAndroid Build Coastguard Worker /* Compute BS function */
1271*495ae853SAndroid Build Coastguard Worker if(ps_dec->ps_cur_sps->u1_profile_idc == HIGH_PROFILE_IDC)
1272*495ae853SAndroid Build Coastguard Worker {
1273*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_tran_form8x8 == 1)
1274*495ae853SAndroid Build Coastguard Worker {
1275*495ae853SAndroid Build Coastguard Worker u2_cur_csbp = ih264d_update_csbp_8x8(
1276*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_curmb->u2_luma_csbp);
1277*495ae853SAndroid Build Coastguard Worker }
1278*495ae853SAndroid Build Coastguard Worker
1279*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->ps_left_mb->u1_tran_form8x8 == 1)
1280*495ae853SAndroid Build Coastguard Worker {
1281*495ae853SAndroid Build Coastguard Worker u2_left_csbp = ih264d_update_csbp_8x8(
1282*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_left_mb->u2_luma_csbp);
1283*495ae853SAndroid Build Coastguard Worker }
1284*495ae853SAndroid Build Coastguard Worker
1285*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->ps_top_mb->u1_tran_form8x8 == 1)
1286*495ae853SAndroid Build Coastguard Worker {
1287*495ae853SAndroid Build Coastguard Worker u2_top_csbp = ih264d_update_csbp_8x8(
1288*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_top_mb->u2_luma_csbp);
1289*495ae853SAndroid Build Coastguard Worker }
1290*495ae853SAndroid Build Coastguard Worker }
1291*495ae853SAndroid Build Coastguard Worker if(u4_cur_mb_intra)
1292*495ae853SAndroid Build Coastguard Worker {
1293*495ae853SAndroid Build Coastguard Worker
1294*495ae853SAndroid Build Coastguard Worker pu4_bs_table[4] = 0x04040404;
1295*495ae853SAndroid Build Coastguard Worker pu4_bs_table[0] = u4_cur_mb_fld ? 0x03030303 : 0x04040404;
1296*495ae853SAndroid Build Coastguard Worker pu4_bs_table[1] = 0x03030303;
1297*495ae853SAndroid Build Coastguard Worker pu4_bs_table[2] = 0x03030303;
1298*495ae853SAndroid Build Coastguard Worker pu4_bs_table[3] = 0x03030303;
1299*495ae853SAndroid Build Coastguard Worker pu4_bs_table[5] = 0x03030303;
1300*495ae853SAndroid Build Coastguard Worker pu4_bs_table[6] = 0x03030303;
1301*495ae853SAndroid Build Coastguard Worker pu4_bs_table[7] = 0x03030303;
1302*495ae853SAndroid Build Coastguard Worker }
1303*495ae853SAndroid Build Coastguard Worker else
1304*495ae853SAndroid Build Coastguard Worker {
1305*495ae853SAndroid Build Coastguard Worker UWORD32 u4_is_non16x16 = !!(u1_cur_mb_type & D_PRED_NON_16x16);
1306*495ae853SAndroid Build Coastguard Worker UWORD32 u4_is_b = ps_dec->u1_B;
1307*495ae853SAndroid Build Coastguard Worker
1308*495ae853SAndroid Build Coastguard Worker ih264d_fill_bs2_horz_vert(
1309*495ae853SAndroid Build Coastguard Worker pu4_bs_table, u2_left_csbp, u2_top_csbp, u2_cur_csbp,
1310*495ae853SAndroid Build Coastguard Worker (const UWORD32 *)(gau4_ih264d_packed_bs2),
1311*495ae853SAndroid Build Coastguard Worker (const UWORD16 *)(gau2_ih264d_4x4_v2h_reorder));
1312*495ae853SAndroid Build Coastguard Worker
1313*495ae853SAndroid Build Coastguard Worker if(u4_leftmbtype & D_INTRA_MB)
1314*495ae853SAndroid Build Coastguard Worker pu4_bs_table[4] = 0x04040404;
1315*495ae853SAndroid Build Coastguard Worker
1316*495ae853SAndroid Build Coastguard Worker if(u1_top_mb_typ & D_INTRA_MB)
1317*495ae853SAndroid Build Coastguard Worker pu4_bs_table[0] = u4_cur_mb_fld ? 0x03030303 : 0x04040404;
1318*495ae853SAndroid Build Coastguard Worker
1319*495ae853SAndroid Build Coastguard Worker ps_dec->pf_fill_bs1[u4_is_b][u4_is_non16x16](
1320*495ae853SAndroid Build Coastguard Worker ps_cur_mv_pred, ps_top_mv_pred, apv_map_ref_idx_to_poc,
1321*495ae853SAndroid Build Coastguard Worker pu4_bs_table, ps_left_mv_pred,
1322*495ae853SAndroid Build Coastguard Worker &(ps_dec->ps_left_mvpred_addr[u1_pingpong][1]),
1323*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_top_mb->u4_pic_addrress,
1324*495ae853SAndroid Build Coastguard Worker (4 >> u4_cur_mb_fld));
1325*495ae853SAndroid Build Coastguard Worker }
1326*495ae853SAndroid Build Coastguard Worker
1327*495ae853SAndroid Build Coastguard Worker {
1328*495ae853SAndroid Build Coastguard Worker void ** pu4_map_ref_idx_to_poc_l1 = apv_map_ref_idx_to_poc +
1329*495ae853SAndroid Build Coastguard Worker POC_LIST_L0_TO_L1_DIFF;
1330*495ae853SAndroid Build Coastguard Worker {
1331*495ae853SAndroid Build Coastguard Worker /* Store Parameter for Top MvPred refernce frame Address */
1332*495ae853SAndroid Build Coastguard Worker
1333*495ae853SAndroid Build Coastguard Worker void ** ppv_top_mv_pred_addr = ps_cur_mb_info->ps_curmb->u4_pic_addrress;
1334*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refTop0 = (ps_cur_mv_pred + 12)->i1_ref_frame;
1335*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refTop1 = (ps_cur_mv_pred + 14)->i1_ref_frame;
1336*495ae853SAndroid Build Coastguard Worker
1337*495ae853SAndroid Build Coastguard Worker /* Store Left addresses for Next Mb */
1338*495ae853SAndroid Build Coastguard Worker void ** ppv_left_mv_pred_addr =
1339*495ae853SAndroid Build Coastguard Worker ps_dec->ps_left_mvpred_addr[!u1_pingpong][1].u4_add;
1340*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refleft0 = (ps_cur_mv_pred + 3)->i1_ref_frame;
1341*495ae853SAndroid Build Coastguard Worker
1342*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refTop0[0]];
1343*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refTop0[1]];
1344*495ae853SAndroid Build Coastguard Worker
1345*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
1346*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
1347*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
1348*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
1349*495ae853SAndroid Build Coastguard Worker
1350*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refleft0[0]];
1351*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refleft0[1]];
1352*495ae853SAndroid Build Coastguard Worker
1353*495ae853SAndroid Build Coastguard Worker /* Storing the leftMbtype for next Mb */
1354*495ae853SAndroid Build Coastguard Worker ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type;
1355*495ae853SAndroid Build Coastguard Worker
1356*495ae853SAndroid Build Coastguard Worker }
1357*495ae853SAndroid Build Coastguard Worker }
1358*495ae853SAndroid Build Coastguard Worker
1359*495ae853SAndroid Build Coastguard Worker /* For transform 8x8 disable deblocking of the intrernal edges of a 8x8 block */
1360*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_tran_form8x8)
1361*495ae853SAndroid Build Coastguard Worker {
1362*495ae853SAndroid Build Coastguard Worker pu4_bs_table[1] = 0;
1363*495ae853SAndroid Build Coastguard Worker pu4_bs_table[3] = 0;
1364*495ae853SAndroid Build Coastguard Worker pu4_bs_table[5] = 0;
1365*495ae853SAndroid Build Coastguard Worker pu4_bs_table[7] = 0;
1366*495ae853SAndroid Build Coastguard Worker }
1367*495ae853SAndroid Build Coastguard Worker }
1368*495ae853SAndroid Build Coastguard Worker
1369*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1370*495ae853SAndroid Build Coastguard Worker /* */
1371*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_compute_bs_mbaff */
1372*495ae853SAndroid Build Coastguard Worker /* */
1373*495ae853SAndroid Build Coastguard Worker /* Description : This function computes the pointers of left,top & current*/
1374*495ae853SAndroid Build Coastguard Worker /* : Nnz, MvPred & deblk_mb_t and supplies to FillBs function for*/
1375*495ae853SAndroid Build Coastguard Worker /* : Boundary Strength Calculation */
1376*495ae853SAndroid Build Coastguard Worker /* Inputs : <What inputs does the function take?> */
1377*495ae853SAndroid Build Coastguard Worker /* Processing : This functions calls deblock MB in the MB increment order*/
1378*495ae853SAndroid Build Coastguard Worker /* */
1379*495ae853SAndroid Build Coastguard Worker /* Outputs : Produces the Boundary Strength for Current Mb */
1380*495ae853SAndroid Build Coastguard Worker /* Returns : None */
1381*495ae853SAndroid Build Coastguard Worker /* */
1382*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1383*495ae853SAndroid Build Coastguard Worker /* */
1384*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1385*495ae853SAndroid Build Coastguard Worker /* ITTIAM */
1386*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1387*495ae853SAndroid Build Coastguard Worker
ih264d_compute_bs_mbaff(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,const UWORD16 u2_mbxn_mb)1388*495ae853SAndroid Build Coastguard Worker void ih264d_compute_bs_mbaff(dec_struct_t * ps_dec,
1389*495ae853SAndroid Build Coastguard Worker dec_mb_info_t * ps_cur_mb_info,
1390*495ae853SAndroid Build Coastguard Worker const UWORD16 u2_mbxn_mb)
1391*495ae853SAndroid Build Coastguard Worker {
1392*495ae853SAndroid Build Coastguard Worker /* Mvpred and Nnz for top and Courrent */
1393*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_cur_mv_pred, *ps_top_mv_pred = NULL, *ps_left_mv_pred;
1394*495ae853SAndroid Build Coastguard Worker /* deblk_mb_t Params */
1395*495ae853SAndroid Build Coastguard Worker deblk_mb_t *ps_cur_mb_params; /*< Parameters of current MacroBlock */
1396*495ae853SAndroid Build Coastguard Worker neighbouradd_t * ps_left_ngbr;
1397*495ae853SAndroid Build Coastguard Worker deblkmb_neighbour_t *ps_deblk_top_mb;
1398*495ae853SAndroid Build Coastguard Worker /* Reference Index to POC mapping*/
1399*495ae853SAndroid Build Coastguard Worker void ** apv_map_ref_idx_to_poc;
1400*495ae853SAndroid Build Coastguard Worker
1401*495ae853SAndroid Build Coastguard Worker UWORD32 u4_leftmbtype;
1402*495ae853SAndroid Build Coastguard Worker
1403*495ae853SAndroid Build Coastguard Worker
1404*495ae853SAndroid Build Coastguard Worker UWORD16 u2_left_csbp, u2_top_csbp, u2_cur_csbp;
1405*495ae853SAndroid Build Coastguard Worker
1406*495ae853SAndroid Build Coastguard Worker /* Set of flags */
1407*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cur_mb_intra, u4_cur_mb_fld, u4_top_mb_fld, u1_top_mb_typ, u4_left_mb_fld;
1408*495ae853SAndroid Build Coastguard Worker UWORD32 u1_cur_mb_type;
1409*495ae853SAndroid Build Coastguard Worker UWORD32 * pu4_bs_table;
1410*495ae853SAndroid Build Coastguard Worker const UWORD32 u4_bot_mb = (1 - ps_cur_mb_info->u1_topmb);
1411*495ae853SAndroid Build Coastguard Worker /* Initialization */
1412*495ae853SAndroid Build Coastguard Worker const UWORD32 u2_mbx = ps_cur_mb_info->u2_mbx;
1413*495ae853SAndroid Build Coastguard Worker const UWORD32 u2_mby = ps_cur_mb_info->u2_mby;
1414*495ae853SAndroid Build Coastguard Worker /* Load From u1_pingpong and Store in !u1_pingpong */
1415*495ae853SAndroid Build Coastguard Worker const UWORD32 u1_pingpong = u2_mbx & 0x01;
1416*495ae853SAndroid Build Coastguard Worker
1417*495ae853SAndroid Build Coastguard Worker PROFILE_DISABLE_BOUNDARY_STRENGTH()
1418*495ae853SAndroid Build Coastguard Worker
1419*495ae853SAndroid Build Coastguard Worker ps_deblk_top_mb = ps_dec->ps_deblk_top_mb + (u2_mbx << 1);
1420*495ae853SAndroid Build Coastguard Worker
1421*495ae853SAndroid Build Coastguard Worker
1422*495ae853SAndroid Build Coastguard Worker /************************************************/
1423*495ae853SAndroid Build Coastguard Worker /* Initialize the left Mb type */
1424*495ae853SAndroid Build Coastguard Worker /* Left MvPred */
1425*495ae853SAndroid Build Coastguard Worker /************************************************/
1426*495ae853SAndroid Build Coastguard Worker
1427*495ae853SAndroid Build Coastguard Worker if(!u2_mbx)
1428*495ae853SAndroid Build Coastguard Worker {
1429*495ae853SAndroid Build Coastguard Worker /************************************************************/
1430*495ae853SAndroid Build Coastguard Worker /* Initialize the ps_left_mv_pred with Junk but Valid Location */
1431*495ae853SAndroid Build Coastguard Worker /* to avoid invalid memory access */
1432*495ae853SAndroid Build Coastguard Worker /* this is read only pointer */
1433*495ae853SAndroid Build Coastguard Worker /************************************************************/
1434*495ae853SAndroid Build Coastguard Worker ps_left_mv_pred = ps_dec->ps_mv_cur + 16;
1435*495ae853SAndroid Build Coastguard Worker }
1436*495ae853SAndroid Build Coastguard Worker else
1437*495ae853SAndroid Build Coastguard Worker {
1438*495ae853SAndroid Build Coastguard Worker /* Come to Left Most Edge of the MB */
1439*495ae853SAndroid Build Coastguard Worker ps_left_mv_pred = (u2_mbxn_mb) ?
1440*495ae853SAndroid Build Coastguard Worker ps_dec->ps_mv_cur + ((u2_mbxn_mb - 1) << 5) + 3 :
1441*495ae853SAndroid Build Coastguard Worker ps_dec->ps_mv_left + 3;
1442*495ae853SAndroid Build Coastguard Worker
1443*495ae853SAndroid Build Coastguard Worker ps_left_mv_pred += (u4_bot_mb << 4);
1444*495ae853SAndroid Build Coastguard Worker }
1445*495ae853SAndroid Build Coastguard Worker
1446*495ae853SAndroid Build Coastguard Worker u4_leftmbtype = ps_dec->deblk_left_mb[u4_bot_mb].u1_mb_type;
1447*495ae853SAndroid Build Coastguard Worker
1448*495ae853SAndroid Build Coastguard Worker ps_left_ngbr = &(ps_dec->ps_left_mvpred_addr[u1_pingpong][u4_bot_mb]);
1449*495ae853SAndroid Build Coastguard Worker
1450*495ae853SAndroid Build Coastguard Worker /************************************************/
1451*495ae853SAndroid Build Coastguard Worker /* Pointer Assignment for Current Mb Parameters */
1452*495ae853SAndroid Build Coastguard Worker /* Pointer Assignment for Current MvPred */
1453*495ae853SAndroid Build Coastguard Worker /************************************************/
1454*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params = ps_dec->ps_deblk_mbn + (u2_mbxn_mb << 1) + u4_bot_mb;
1455*495ae853SAndroid Build Coastguard Worker u1_cur_mb_type = ps_cur_mb_params->u1_mb_type;
1456*495ae853SAndroid Build Coastguard Worker
1457*495ae853SAndroid Build Coastguard Worker ps_cur_mv_pred = ps_dec->ps_mv_cur + (u2_mbxn_mb << 5);
1458*495ae853SAndroid Build Coastguard Worker ps_cur_mv_pred += (u4_bot_mb << 4);
1459*495ae853SAndroid Build Coastguard Worker
1460*495ae853SAndroid Build Coastguard Worker /********************************************/
1461*495ae853SAndroid Build Coastguard Worker /* Pointer Assignment for Top Mb Parameters */
1462*495ae853SAndroid Build Coastguard Worker /* Pointer Assignment for Top MvPred and */
1463*495ae853SAndroid Build Coastguard Worker /* Pointer Assignment for Top Nnz */
1464*495ae853SAndroid Build Coastguard Worker /********************************************/
1465*495ae853SAndroid Build Coastguard Worker
1466*495ae853SAndroid Build Coastguard Worker /* CHANGED CODE */
1467*495ae853SAndroid Build Coastguard Worker ps_top_mv_pred = ps_cur_mv_pred - (ps_dec->u2_frm_wd_in_mbs << 5) + 12;
1468*495ae853SAndroid Build Coastguard Worker
1469*495ae853SAndroid Build Coastguard Worker u4_cur_mb_fld = !!(u1_cur_mb_type & D_FLD_MB);
1470*495ae853SAndroid Build Coastguard Worker u4_left_mb_fld = !!(ps_dec->deblk_left_mb[0].u1_mb_type & D_FLD_MB);
1471*495ae853SAndroid Build Coastguard Worker
1472*495ae853SAndroid Build Coastguard Worker if(u4_left_mb_fld != u4_cur_mb_fld)
1473*495ae853SAndroid Build Coastguard Worker {
1474*495ae853SAndroid Build Coastguard Worker /* Flag for extra left Edge */
1475*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params->u1_single_call = 0;
1476*495ae853SAndroid Build Coastguard Worker
1477*495ae853SAndroid Build Coastguard Worker if(u4_bot_mb)
1478*495ae853SAndroid Build Coastguard Worker {
1479*495ae853SAndroid Build Coastguard Worker ps_left_ngbr--;
1480*495ae853SAndroid Build Coastguard Worker ps_left_mv_pred -= 16;
1481*495ae853SAndroid Build Coastguard Worker }
1482*495ae853SAndroid Build Coastguard Worker }
1483*495ae853SAndroid Build Coastguard Worker else
1484*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params->u1_single_call = 1;
1485*495ae853SAndroid Build Coastguard Worker
1486*495ae853SAndroid Build Coastguard Worker apv_map_ref_idx_to_poc = ps_dec->ppv_map_ref_idx_to_poc + 1;
1487*495ae853SAndroid Build Coastguard Worker if(u4_cur_mb_fld)
1488*495ae853SAndroid Build Coastguard Worker {
1489*495ae853SAndroid Build Coastguard Worker if(u4_bot_mb)
1490*495ae853SAndroid Build Coastguard Worker {
1491*495ae853SAndroid Build Coastguard Worker apv_map_ref_idx_to_poc += BOT_LIST_FLD_L0;
1492*495ae853SAndroid Build Coastguard Worker }
1493*495ae853SAndroid Build Coastguard Worker else
1494*495ae853SAndroid Build Coastguard Worker {
1495*495ae853SAndroid Build Coastguard Worker apv_map_ref_idx_to_poc += TOP_LIST_FLD_L0;
1496*495ae853SAndroid Build Coastguard Worker }
1497*495ae853SAndroid Build Coastguard Worker }
1498*495ae853SAndroid Build Coastguard Worker
1499*495ae853SAndroid Build Coastguard Worker /**********************************************************/
1500*495ae853SAndroid Build Coastguard Worker /* if no deblocking required for current Mb then continue */
1501*495ae853SAndroid Build Coastguard Worker /**********************************************************/
1502*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_params->u1_deblocking_mode & MB_DISABLE_FILTERING)
1503*495ae853SAndroid Build Coastguard Worker {
1504*495ae853SAndroid Build Coastguard Worker void ** pu4_map_ref_idx_to_poc_l1 = apv_map_ref_idx_to_poc +
1505*495ae853SAndroid Build Coastguard Worker POC_LIST_L0_TO_L1_DIFF;
1506*495ae853SAndroid Build Coastguard Worker
1507*495ae853SAndroid Build Coastguard Worker {
1508*495ae853SAndroid Build Coastguard Worker /* Store Parameter for Top MvPred refernce frame Address */
1509*495ae853SAndroid Build Coastguard Worker
1510*495ae853SAndroid Build Coastguard Worker void ** ppv_top_mv_pred_addr = ps_cur_mb_info->ps_curmb->u4_pic_addrress;
1511*495ae853SAndroid Build Coastguard Worker void ** ppv_left_mv_pred_addr =
1512*495ae853SAndroid Build Coastguard Worker ps_dec->ps_left_mvpred_addr[!u1_pingpong][u4_bot_mb].u4_add;
1513*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refTop0 = (ps_cur_mv_pred + 12)->i1_ref_frame;
1514*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refTop1 = (ps_cur_mv_pred + 14)->i1_ref_frame;
1515*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refLeft0 = (ps_cur_mv_pred + 3)->i1_ref_frame;
1516*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refTop0[0]];
1517*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refTop0[1]];
1518*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
1519*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
1520*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
1521*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
1522*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refLeft0[0]];
1523*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refLeft0[1]];
1524*495ae853SAndroid Build Coastguard Worker }
1525*495ae853SAndroid Build Coastguard Worker if(u4_bot_mb)
1526*495ae853SAndroid Build Coastguard Worker {
1527*495ae853SAndroid Build Coastguard Worker /* store The Left Mb Type*/
1528*495ae853SAndroid Build Coastguard Worker ps_dec->deblk_left_mb[0].u1_mb_type =
1529*495ae853SAndroid Build Coastguard Worker (ps_cur_mb_params - 1)->u1_mb_type;
1530*495ae853SAndroid Build Coastguard Worker ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type;
1531*495ae853SAndroid Build Coastguard Worker
1532*495ae853SAndroid Build Coastguard Worker }
1533*495ae853SAndroid Build Coastguard Worker ps_deblk_top_mb[u4_bot_mb].u1_mb_type = u1_cur_mb_type;
1534*495ae853SAndroid Build Coastguard Worker return;
1535*495ae853SAndroid Build Coastguard Worker }
1536*495ae853SAndroid Build Coastguard Worker
1537*495ae853SAndroid Build Coastguard Worker if(u2_mby)
1538*495ae853SAndroid Build Coastguard Worker {
1539*495ae853SAndroid Build Coastguard Worker u1_top_mb_typ = ps_deblk_top_mb[1].u1_mb_type;
1540*495ae853SAndroid Build Coastguard Worker u4_top_mb_fld = !!(u1_top_mb_typ & D_FLD_MB);
1541*495ae853SAndroid Build Coastguard Worker
1542*495ae853SAndroid Build Coastguard Worker if(!u4_bot_mb)
1543*495ae853SAndroid Build Coastguard Worker {
1544*495ae853SAndroid Build Coastguard Worker if(u4_top_mb_fld & u4_cur_mb_fld)
1545*495ae853SAndroid Build Coastguard Worker u1_top_mb_typ = ps_deblk_top_mb[0].u1_mb_type;
1546*495ae853SAndroid Build Coastguard Worker else
1547*495ae853SAndroid Build Coastguard Worker {
1548*495ae853SAndroid Build Coastguard Worker ps_top_mv_pred += 16;
1549*495ae853SAndroid Build Coastguard Worker }
1550*495ae853SAndroid Build Coastguard Worker }
1551*495ae853SAndroid Build Coastguard Worker }
1552*495ae853SAndroid Build Coastguard Worker else
1553*495ae853SAndroid Build Coastguard Worker {
1554*495ae853SAndroid Build Coastguard Worker u4_top_mb_fld = u4_cur_mb_fld;
1555*495ae853SAndroid Build Coastguard Worker u1_top_mb_typ = 0;
1556*495ae853SAndroid Build Coastguard Worker }
1557*495ae853SAndroid Build Coastguard Worker
1558*495ae853SAndroid Build Coastguard Worker if(u4_bot_mb & !u4_cur_mb_fld)
1559*495ae853SAndroid Build Coastguard Worker {
1560*495ae853SAndroid Build Coastguard Worker u1_top_mb_typ = ps_deblk_top_mb[0].u1_mb_type;
1561*495ae853SAndroid Build Coastguard Worker u4_top_mb_fld = u4_cur_mb_fld;
1562*495ae853SAndroid Build Coastguard Worker ps_top_mv_pred = ps_cur_mv_pred - 4;
1563*495ae853SAndroid Build Coastguard Worker }
1564*495ae853SAndroid Build Coastguard Worker
1565*495ae853SAndroid Build Coastguard Worker pu4_bs_table = ps_cur_mb_params->u4_bs_table;
1566*495ae853SAndroid Build Coastguard Worker u4_cur_mb_intra = u1_cur_mb_type & D_INTRA_MB;
1567*495ae853SAndroid Build Coastguard Worker
1568*495ae853SAndroid Build Coastguard Worker u2_cur_csbp = ps_cur_mb_info->ps_curmb->u2_luma_csbp;
1569*495ae853SAndroid Build Coastguard Worker u2_left_csbp = ps_cur_mb_info->ps_left_mb->u2_luma_csbp;
1570*495ae853SAndroid Build Coastguard Worker u2_top_csbp = ps_cur_mb_info->ps_top_mb->u2_luma_csbp;
1571*495ae853SAndroid Build Coastguard Worker /* Compute BS function */
1572*495ae853SAndroid Build Coastguard Worker if(ps_dec->ps_cur_sps->u1_profile_idc == HIGH_PROFILE_IDC)
1573*495ae853SAndroid Build Coastguard Worker {
1574*495ae853SAndroid Build Coastguard Worker
1575*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_tran_form8x8 == 1)
1576*495ae853SAndroid Build Coastguard Worker {
1577*495ae853SAndroid Build Coastguard Worker u2_cur_csbp = ih264d_update_csbp_8x8(
1578*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_curmb->u2_luma_csbp);
1579*495ae853SAndroid Build Coastguard Worker }
1580*495ae853SAndroid Build Coastguard Worker
1581*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->ps_left_mb->u1_tran_form8x8 == 1)
1582*495ae853SAndroid Build Coastguard Worker {
1583*495ae853SAndroid Build Coastguard Worker u2_left_csbp = ih264d_update_csbp_8x8(
1584*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_left_mb->u2_luma_csbp);
1585*495ae853SAndroid Build Coastguard Worker }
1586*495ae853SAndroid Build Coastguard Worker
1587*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->ps_top_mb->u1_tran_form8x8 == 1)
1588*495ae853SAndroid Build Coastguard Worker {
1589*495ae853SAndroid Build Coastguard Worker u2_top_csbp = ih264d_update_csbp_8x8(
1590*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_top_mb->u2_luma_csbp);
1591*495ae853SAndroid Build Coastguard Worker }
1592*495ae853SAndroid Build Coastguard Worker }
1593*495ae853SAndroid Build Coastguard Worker if(u4_cur_mb_intra)
1594*495ae853SAndroid Build Coastguard Worker {
1595*495ae853SAndroid Build Coastguard Worker
1596*495ae853SAndroid Build Coastguard Worker pu4_bs_table[4] = 0x04040404;
1597*495ae853SAndroid Build Coastguard Worker if((0 == u4_cur_mb_fld) && (0 == u4_top_mb_fld))
1598*495ae853SAndroid Build Coastguard Worker {
1599*495ae853SAndroid Build Coastguard Worker pu4_bs_table[0] = 0x04040404;
1600*495ae853SAndroid Build Coastguard Worker }
1601*495ae853SAndroid Build Coastguard Worker else
1602*495ae853SAndroid Build Coastguard Worker {
1603*495ae853SAndroid Build Coastguard Worker pu4_bs_table[0] = 0x03030303;
1604*495ae853SAndroid Build Coastguard Worker }
1605*495ae853SAndroid Build Coastguard Worker
1606*495ae853SAndroid Build Coastguard Worker pu4_bs_table[1] = 0x03030303;
1607*495ae853SAndroid Build Coastguard Worker pu4_bs_table[2] = 0x03030303;
1608*495ae853SAndroid Build Coastguard Worker pu4_bs_table[3] = 0x03030303;
1609*495ae853SAndroid Build Coastguard Worker pu4_bs_table[5] = 0x03030303;
1610*495ae853SAndroid Build Coastguard Worker pu4_bs_table[6] = 0x03030303;
1611*495ae853SAndroid Build Coastguard Worker pu4_bs_table[7] = 0x03030303;
1612*495ae853SAndroid Build Coastguard Worker
1613*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
1614*495ae853SAndroid Build Coastguard Worker /* Fill Bs of xtra top and left edge unconditionally to avoid checks */
1615*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
1616*495ae853SAndroid Build Coastguard Worker pu4_bs_table[8] = 0x03030303;
1617*495ae853SAndroid Build Coastguard Worker pu4_bs_table[9] = 0x04040404;
1618*495ae853SAndroid Build Coastguard Worker }
1619*495ae853SAndroid Build Coastguard Worker else
1620*495ae853SAndroid Build Coastguard Worker {
1621*495ae853SAndroid Build Coastguard Worker UWORD32 u4_is_non16x16 = !!(u1_cur_mb_type & D_PRED_NON_16x16);
1622*495ae853SAndroid Build Coastguard Worker UWORD32 u4_is_b = ps_dec->u1_B;
1623*495ae853SAndroid Build Coastguard Worker
1624*495ae853SAndroid Build Coastguard Worker ih264d_fill_bs2_horz_vert(
1625*495ae853SAndroid Build Coastguard Worker pu4_bs_table, u2_left_csbp, u2_top_csbp, u2_cur_csbp,
1626*495ae853SAndroid Build Coastguard Worker (const UWORD32 *)(gau4_ih264d_packed_bs2),
1627*495ae853SAndroid Build Coastguard Worker (const UWORD16 *)(gau2_ih264d_4x4_v2h_reorder));
1628*495ae853SAndroid Build Coastguard Worker
1629*495ae853SAndroid Build Coastguard Worker if(u4_leftmbtype & D_INTRA_MB)
1630*495ae853SAndroid Build Coastguard Worker pu4_bs_table[4] = 0x04040404;
1631*495ae853SAndroid Build Coastguard Worker
1632*495ae853SAndroid Build Coastguard Worker if(u1_top_mb_typ & D_INTRA_MB)
1633*495ae853SAndroid Build Coastguard Worker pu4_bs_table[0] = u4_cur_mb_fld ? 0x03030303 : 0x04040404;
1634*495ae853SAndroid Build Coastguard Worker else if(u4_cur_mb_fld != u4_top_mb_fld)
1635*495ae853SAndroid Build Coastguard Worker {
1636*495ae853SAndroid Build Coastguard Worker /****************************************************/
1637*495ae853SAndroid Build Coastguard Worker /* Setting BS for mixed mode edge=1 when (Bs!=2) */
1638*495ae853SAndroid Build Coastguard Worker /****************************************************/
1639*495ae853SAndroid Build Coastguard Worker pu4_bs_table[0] = (pu4_bs_table[0] >> 1) + 0x01010101;
1640*495ae853SAndroid Build Coastguard Worker }
1641*495ae853SAndroid Build Coastguard Worker
1642*495ae853SAndroid Build Coastguard Worker {
1643*495ae853SAndroid Build Coastguard Worker /* Call to Compute Boundary Strength for Extra Left Edge */
1644*495ae853SAndroid Build Coastguard Worker if(u2_mbx
1645*495ae853SAndroid Build Coastguard Worker && !(ps_cur_mb_params->u1_deblocking_mode
1646*495ae853SAndroid Build Coastguard Worker & MB_DISABLE_LEFT_EDGE))
1647*495ae853SAndroid Build Coastguard Worker {
1648*495ae853SAndroid Build Coastguard Worker if(u4_cur_mb_fld != u4_left_mb_fld)
1649*495ae853SAndroid Build Coastguard Worker {
1650*495ae853SAndroid Build Coastguard Worker UWORD32 u4_left_mb_t_csbp =
1651*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_left_mb[0].u2_luma_csbp;
1652*495ae853SAndroid Build Coastguard Worker UWORD32 u4_left_mb_b_csbp =
1653*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_left_mb[1].u2_luma_csbp;
1654*495ae853SAndroid Build Coastguard Worker if(1 == ps_cur_mb_info->ps_left_mb[0].u1_tran_form8x8)
1655*495ae853SAndroid Build Coastguard Worker {
1656*495ae853SAndroid Build Coastguard Worker u4_left_mb_t_csbp = (UWORD32)ih264d_update_csbp_8x8(
1657*495ae853SAndroid Build Coastguard Worker (UWORD16)u4_left_mb_t_csbp);
1658*495ae853SAndroid Build Coastguard Worker }
1659*495ae853SAndroid Build Coastguard Worker
1660*495ae853SAndroid Build Coastguard Worker if(1 == ps_cur_mb_info->ps_left_mb[1].u1_tran_form8x8)
1661*495ae853SAndroid Build Coastguard Worker {
1662*495ae853SAndroid Build Coastguard Worker u4_left_mb_b_csbp = (UWORD32)ih264d_update_csbp_8x8(
1663*495ae853SAndroid Build Coastguard Worker (UWORD16)u4_left_mb_b_csbp);
1664*495ae853SAndroid Build Coastguard Worker }
1665*495ae853SAndroid Build Coastguard Worker ps_dec->pf_fill_bs_xtra_left_edge[u4_cur_mb_fld](
1666*495ae853SAndroid Build Coastguard Worker pu4_bs_table, u4_left_mb_t_csbp,
1667*495ae853SAndroid Build Coastguard Worker u4_left_mb_b_csbp, u2_cur_csbp, u4_bot_mb);
1668*495ae853SAndroid Build Coastguard Worker
1669*495ae853SAndroid Build Coastguard Worker if(ps_dec->deblk_left_mb[0].u1_mb_type & D_INTRA_MB)
1670*495ae853SAndroid Build Coastguard Worker pu4_bs_table[4] = 0x04040404;
1671*495ae853SAndroid Build Coastguard Worker
1672*495ae853SAndroid Build Coastguard Worker if(ps_dec->deblk_left_mb[1].u1_mb_type & D_INTRA_MB)
1673*495ae853SAndroid Build Coastguard Worker pu4_bs_table[9] = 0x04040404;
1674*495ae853SAndroid Build Coastguard Worker
1675*495ae853SAndroid Build Coastguard Worker }
1676*495ae853SAndroid Build Coastguard Worker }
1677*495ae853SAndroid Build Coastguard Worker /* Call to Compute Boundary Strength for Extra Top Edge */
1678*495ae853SAndroid Build Coastguard Worker if(u2_mby
1679*495ae853SAndroid Build Coastguard Worker && !(ps_cur_mb_params->u1_deblocking_mode
1680*495ae853SAndroid Build Coastguard Worker & MB_DISABLE_TOP_EDGE))
1681*495ae853SAndroid Build Coastguard Worker {
1682*495ae853SAndroid Build Coastguard Worker if((((!u4_bot_mb) & (!u4_cur_mb_fld)) && u4_top_mb_fld))
1683*495ae853SAndroid Build Coastguard Worker {
1684*495ae853SAndroid Build Coastguard Worker UWORD32 u4_topmb_t_csbp =
1685*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_top_mb[-1].u2_luma_csbp;
1686*495ae853SAndroid Build Coastguard Worker UWORD32 u4_topmb_b_csbp =
1687*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_top_mb[0].u2_luma_csbp;
1688*495ae853SAndroid Build Coastguard Worker if(1 == ps_cur_mb_info->ps_top_mb[-1].u1_tran_form8x8)
1689*495ae853SAndroid Build Coastguard Worker {
1690*495ae853SAndroid Build Coastguard Worker u4_topmb_t_csbp = (UWORD32)ih264d_update_csbp_8x8(
1691*495ae853SAndroid Build Coastguard Worker (UWORD16)u4_topmb_t_csbp);
1692*495ae853SAndroid Build Coastguard Worker }
1693*495ae853SAndroid Build Coastguard Worker
1694*495ae853SAndroid Build Coastguard Worker if(1 == ps_cur_mb_info->ps_top_mb[0].u1_tran_form8x8)
1695*495ae853SAndroid Build Coastguard Worker {
1696*495ae853SAndroid Build Coastguard Worker u4_topmb_b_csbp = (UWORD32)ih264d_update_csbp_8x8(
1697*495ae853SAndroid Build Coastguard Worker (UWORD16)u4_topmb_b_csbp);
1698*495ae853SAndroid Build Coastguard Worker }
1699*495ae853SAndroid Build Coastguard Worker ih264d_fill_bs_xtra_top_edge(pu4_bs_table, u4_topmb_t_csbp,
1700*495ae853SAndroid Build Coastguard Worker u4_topmb_b_csbp, u2_cur_csbp);
1701*495ae853SAndroid Build Coastguard Worker
1702*495ae853SAndroid Build Coastguard Worker if(ps_deblk_top_mb[0].u1_mb_type & D_INTRA_MB)
1703*495ae853SAndroid Build Coastguard Worker pu4_bs_table[8] = 0x03030303;
1704*495ae853SAndroid Build Coastguard Worker
1705*495ae853SAndroid Build Coastguard Worker if(ps_deblk_top_mb[1].u1_mb_type & D_INTRA_MB)
1706*495ae853SAndroid Build Coastguard Worker pu4_bs_table[0] = 0x03030303;
1707*495ae853SAndroid Build Coastguard Worker }
1708*495ae853SAndroid Build Coastguard Worker }
1709*495ae853SAndroid Build Coastguard Worker }
1710*495ae853SAndroid Build Coastguard Worker
1711*495ae853SAndroid Build Coastguard Worker ps_dec->pf_fill_bs1[u4_is_b][u4_is_non16x16](
1712*495ae853SAndroid Build Coastguard Worker ps_cur_mv_pred, ps_top_mv_pred, apv_map_ref_idx_to_poc,
1713*495ae853SAndroid Build Coastguard Worker pu4_bs_table, ps_left_mv_pred, ps_left_ngbr,
1714*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_top_mb->u4_pic_addrress,
1715*495ae853SAndroid Build Coastguard Worker (4 >> u4_cur_mb_fld));
1716*495ae853SAndroid Build Coastguard Worker }
1717*495ae853SAndroid Build Coastguard Worker
1718*495ae853SAndroid Build Coastguard Worker {
1719*495ae853SAndroid Build Coastguard Worker void ** pu4_map_ref_idx_to_poc_l1 = apv_map_ref_idx_to_poc +
1720*495ae853SAndroid Build Coastguard Worker POC_LIST_L0_TO_L1_DIFF;
1721*495ae853SAndroid Build Coastguard Worker
1722*495ae853SAndroid Build Coastguard Worker {
1723*495ae853SAndroid Build Coastguard Worker /* Store Parameter for Top MvPred refernce frame Address */
1724*495ae853SAndroid Build Coastguard Worker void ** ppv_top_mv_pred_addr = ps_cur_mb_info->ps_curmb->u4_pic_addrress;
1725*495ae853SAndroid Build Coastguard Worker void ** ppv_left_mv_pred_addr =
1726*495ae853SAndroid Build Coastguard Worker ps_dec->ps_left_mvpred_addr[!u1_pingpong][u4_bot_mb].u4_add;
1727*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refTop0 = (ps_cur_mv_pred + 12)->i1_ref_frame;
1728*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refTop1 = (ps_cur_mv_pred + 14)->i1_ref_frame;
1729*495ae853SAndroid Build Coastguard Worker WORD8 * p1_refLeft0 = (ps_cur_mv_pred + 3)->i1_ref_frame;
1730*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refTop0[0]];
1731*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refTop0[1]];
1732*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
1733*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]];
1734*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
1735*495ae853SAndroid Build Coastguard Worker ppv_top_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]];
1736*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refLeft0[0]];
1737*495ae853SAndroid Build Coastguard Worker ppv_left_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refLeft0[1]];
1738*495ae853SAndroid Build Coastguard Worker }
1739*495ae853SAndroid Build Coastguard Worker if(u4_bot_mb)
1740*495ae853SAndroid Build Coastguard Worker {
1741*495ae853SAndroid Build Coastguard Worker /* store The Left Mb Type*/
1742*495ae853SAndroid Build Coastguard Worker ps_dec->deblk_left_mb[0].u1_mb_type =
1743*495ae853SAndroid Build Coastguard Worker (ps_cur_mb_params - 1)->u1_mb_type;
1744*495ae853SAndroid Build Coastguard Worker ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type;
1745*495ae853SAndroid Build Coastguard Worker
1746*495ae853SAndroid Build Coastguard Worker }
1747*495ae853SAndroid Build Coastguard Worker ps_deblk_top_mb[u4_bot_mb].u1_mb_type = u1_cur_mb_type;
1748*495ae853SAndroid Build Coastguard Worker }
1749*495ae853SAndroid Build Coastguard Worker /* For transform 8x8 disable deblocking of the intrernal edges of a 8x8 block */
1750*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_tran_form8x8)
1751*495ae853SAndroid Build Coastguard Worker {
1752*495ae853SAndroid Build Coastguard Worker pu4_bs_table[1] = 0;
1753*495ae853SAndroid Build Coastguard Worker pu4_bs_table[3] = 0;
1754*495ae853SAndroid Build Coastguard Worker pu4_bs_table[5] = 0;
1755*495ae853SAndroid Build Coastguard Worker pu4_bs_table[7] = 0;
1756*495ae853SAndroid Build Coastguard Worker }
1757*495ae853SAndroid Build Coastguard Worker
1758*495ae853SAndroid Build Coastguard Worker }
1759*495ae853SAndroid Build Coastguard Worker
1760*495ae853SAndroid Build Coastguard Worker
1761*495ae853SAndroid Build Coastguard Worker
1762*495ae853SAndroid Build Coastguard Worker /*!
1763*495ae853SAndroid Build Coastguard Worker **************************************************************************
1764*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_fill_bs_for_mb \endif
1765*495ae853SAndroid Build Coastguard Worker *
1766*495ae853SAndroid Build Coastguard Worker * \brief
1767*495ae853SAndroid Build Coastguard Worker * Determines the boundary strength (Bs), for the complete MB. Bs is
1768*495ae853SAndroid Build Coastguard Worker * determined for each block boundary between two neighbouring 4x4
1769*495ae853SAndroid Build Coastguard Worker * luma blocks, then packed in a UWORD32, first Bs placed in MSB and
1770*495ae853SAndroid Build Coastguard Worker * so on. Such packed Bs values for all 8 edges are kept in an array.
1771*495ae853SAndroid Build Coastguard Worker *
1772*495ae853SAndroid Build Coastguard Worker * \return
1773*495ae853SAndroid Build Coastguard Worker * Returns the packed boundary strength(Bs) MSB -> LSB Bs0|Bs1|Bs2|Bs3
1774*495ae853SAndroid Build Coastguard Worker *
1775*495ae853SAndroid Build Coastguard Worker **************************************************************************
1776*495ae853SAndroid Build Coastguard Worker */
1777*495ae853SAndroid Build Coastguard Worker
ih264d_fill_bs_for_mb(deblk_mb_t * ps_cur_mb_params,deblk_mb_t * ps_top_mb_params,deblk_mb_t * ps_left_mb_params,mv_pred_t * ps_cur_mv_pred,mv_pred_t * ps_top_mv_pred,UWORD8 * puc_cur_nnz,UWORD8 * puc_top_nnz,void ** ppv_map_ref_idx_to_poc,UWORD32 ui_mbAff,UWORD32 ui_bs_table[],mv_pred_t * ps_leftmost_mv_pred,neighbouradd_t * ps_left_addr,neighbouradd_t * ps_top_add)1778*495ae853SAndroid Build Coastguard Worker void ih264d_fill_bs_for_mb(deblk_mb_t * ps_cur_mb_params,
1779*495ae853SAndroid Build Coastguard Worker deblk_mb_t * ps_top_mb_params,
1780*495ae853SAndroid Build Coastguard Worker deblk_mb_t * ps_left_mb_params,
1781*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_cur_mv_pred,
1782*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_top_mv_pred,
1783*495ae853SAndroid Build Coastguard Worker UWORD8 *puc_cur_nnz,
1784*495ae853SAndroid Build Coastguard Worker UWORD8 *puc_top_nnz,
1785*495ae853SAndroid Build Coastguard Worker void **ppv_map_ref_idx_to_poc,
1786*495ae853SAndroid Build Coastguard Worker UWORD32 ui_mbAff,
1787*495ae853SAndroid Build Coastguard Worker UWORD32 ui_bs_table[], /* pointer to the BsTable array */
1788*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_leftmost_mv_pred,
1789*495ae853SAndroid Build Coastguard Worker neighbouradd_t *ps_left_addr,
1790*495ae853SAndroid Build Coastguard Worker neighbouradd_t *ps_top_add)
1791*495ae853SAndroid Build Coastguard Worker {
1792*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs_horz = 0;
1793*495ae853SAndroid Build Coastguard Worker UWORD8 edge, u1_top_intra = 0, u1_left_intra = 0;
1794*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_left_mv_pred;
1795*495ae853SAndroid Build Coastguard Worker WORD16 i2_cur_mv0, i2_cur_mv1, i16_curMv2, i16_curMv3;
1796*495ae853SAndroid Build Coastguard Worker WORD16 i2_left_mv0, i2_left_mv1, i2_left_mv2, i2_left_mv3;
1797*495ae853SAndroid Build Coastguard Worker WORD16 i2_top_mv0, i2_top_mv1, i16_topMv2, i16_topMv3;
1798*495ae853SAndroid Build Coastguard Worker WORD8 i1_cur_ref0, i1_cur_ref1, i1_left_ref0, i1_left_ref1, i1_top_ref0, i1_top_ref1;
1799*495ae853SAndroid Build Coastguard Worker UWORD8 uc_cur_nnz, uc_left_nnz, uc_top_nnz, u1_mb_type, uc_Bslice;
1800*495ae853SAndroid Build Coastguard Worker void **ppv_map_ref_idx_to_poc_l0, **ppv_map_ref_idx_to_poc_l1;
1801*495ae853SAndroid Build Coastguard Worker UWORD8 uc_temp;
1802*495ae853SAndroid Build Coastguard Worker UWORD8 uc_cur_mb_fld, uc_top_mb_fld;
1803*495ae853SAndroid Build Coastguard Worker UWORD32 c_mv_limit;
1804*495ae853SAndroid Build Coastguard Worker
1805*495ae853SAndroid Build Coastguard Worker u1_mb_type = ps_cur_mb_params->u1_mb_type;
1806*495ae853SAndroid Build Coastguard Worker uc_Bslice = u1_mb_type & D_B_SLICE;
1807*495ae853SAndroid Build Coastguard Worker ppv_map_ref_idx_to_poc_l0 = ppv_map_ref_idx_to_poc;
1808*495ae853SAndroid Build Coastguard Worker ppv_map_ref_idx_to_poc_l1 = ppv_map_ref_idx_to_poc + POC_LIST_L0_TO_L1_DIFF;
1809*495ae853SAndroid Build Coastguard Worker
1810*495ae853SAndroid Build Coastguard Worker ps_top_mb_params = ps_top_mb_params ? ps_top_mb_params : ps_cur_mb_params;
1811*495ae853SAndroid Build Coastguard Worker u1_top_intra = ps_top_mb_params->u1_mb_type & D_INTRA_MB;
1812*495ae853SAndroid Build Coastguard Worker u1_left_intra = ps_left_mb_params->u1_mb_type & D_INTRA_MB;
1813*495ae853SAndroid Build Coastguard Worker
1814*495ae853SAndroid Build Coastguard Worker ui_bs_table[4] = 0x04040404; //Default for INTRA MB Boundary edges.
1815*495ae853SAndroid Build Coastguard Worker uc_cur_mb_fld = (ps_cur_mb_params->u1_mb_type & D_FLD_MB) >> 7;
1816*495ae853SAndroid Build Coastguard Worker uc_top_mb_fld = (ps_top_mb_params->u1_mb_type & D_FLD_MB) >> 7;
1817*495ae853SAndroid Build Coastguard Worker
1818*495ae853SAndroid Build Coastguard Worker c_mv_limit = 4 >> uc_cur_mb_fld;
1819*495ae853SAndroid Build Coastguard Worker if((0 == uc_cur_mb_fld) && (0 == uc_top_mb_fld))
1820*495ae853SAndroid Build Coastguard Worker {
1821*495ae853SAndroid Build Coastguard Worker ui_bs_table[0] = 0x04040404;
1822*495ae853SAndroid Build Coastguard Worker }
1823*495ae853SAndroid Build Coastguard Worker else
1824*495ae853SAndroid Build Coastguard Worker {
1825*495ae853SAndroid Build Coastguard Worker ui_bs_table[0] = 0x03030303;
1826*495ae853SAndroid Build Coastguard Worker }
1827*495ae853SAndroid Build Coastguard Worker
1828*495ae853SAndroid Build Coastguard Worker for(edge = 0; edge < 4;
1829*495ae853SAndroid Build Coastguard Worker edge++, ps_top_mv_pred = ps_cur_mv_pred - 4, puc_top_nnz =
1830*495ae853SAndroid Build Coastguard Worker puc_cur_nnz - 4)
1831*495ae853SAndroid Build Coastguard Worker {
1832*495ae853SAndroid Build Coastguard Worker //Each iteration of this loop fills the four BS values of one HORIZ edge and
1833*495ae853SAndroid Build Coastguard Worker //one BS value for each of the four VERT edges.
1834*495ae853SAndroid Build Coastguard Worker WORD8 i = 0;
1835*495ae853SAndroid Build Coastguard Worker UWORD8 uc_bs_horiz, uc_bs_vert;
1836*495ae853SAndroid Build Coastguard Worker UWORD32 ui_cnd;
1837*495ae853SAndroid Build Coastguard Worker void *ui_ref_pic_addr[4];
1838*495ae853SAndroid Build Coastguard Worker UWORD8 uc_mixed_mode_edge;
1839*495ae853SAndroid Build Coastguard Worker
1840*495ae853SAndroid Build Coastguard Worker uc_mixed_mode_edge = 0;
1841*495ae853SAndroid Build Coastguard Worker
1842*495ae853SAndroid Build Coastguard Worker uc_temp = (ui_mbAff << 4) + 13;
1843*495ae853SAndroid Build Coastguard Worker
1844*495ae853SAndroid Build Coastguard Worker uc_cur_nnz = *(puc_cur_nnz - uc_temp);
1845*495ae853SAndroid Build Coastguard Worker ps_left_mv_pred = ps_leftmost_mv_pred + (edge << 2);
1846*495ae853SAndroid Build Coastguard Worker
1847*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 4; i++, ps_top_mv_pred++, ps_cur_mv_pred++)
1848*495ae853SAndroid Build Coastguard Worker {
1849*495ae853SAndroid Build Coastguard Worker //Each iteration of this inner loop computes a HORIZ
1850*495ae853SAndroid Build Coastguard Worker //and a VERT BS value for a 4x4 block
1851*495ae853SAndroid Build Coastguard Worker
1852*495ae853SAndroid Build Coastguard Worker uc_left_nnz = uc_cur_nnz;
1853*495ae853SAndroid Build Coastguard Worker uc_cur_nnz = *puc_cur_nnz++;
1854*495ae853SAndroid Build Coastguard Worker uc_top_nnz = *puc_top_nnz++;
1855*495ae853SAndroid Build Coastguard Worker
1856*495ae853SAndroid Build Coastguard Worker //VERT edge is assigned BS values first
1857*495ae853SAndroid Build Coastguard Worker ui_cnd = !(uc_left_nnz || uc_cur_nnz);
1858*495ae853SAndroid Build Coastguard Worker uc_bs_vert = 2;
1859*495ae853SAndroid Build Coastguard Worker
1860*495ae853SAndroid Build Coastguard Worker if(ui_cnd)
1861*495ae853SAndroid Build Coastguard Worker {
1862*495ae853SAndroid Build Coastguard Worker i2_left_mv0 = ps_left_mv_pred->i2_mv[0];
1863*495ae853SAndroid Build Coastguard Worker i2_left_mv1 = ps_left_mv_pred->i2_mv[1];
1864*495ae853SAndroid Build Coastguard Worker i2_left_mv2 = ps_left_mv_pred->i2_mv[2];
1865*495ae853SAndroid Build Coastguard Worker i2_left_mv3 = ps_left_mv_pred->i2_mv[3];
1866*495ae853SAndroid Build Coastguard Worker
1867*495ae853SAndroid Build Coastguard Worker i2_cur_mv0 = ps_cur_mv_pred->i2_mv[0];
1868*495ae853SAndroid Build Coastguard Worker i2_cur_mv1 = ps_cur_mv_pred->i2_mv[1];
1869*495ae853SAndroid Build Coastguard Worker i16_curMv2 = ps_cur_mv_pred->i2_mv[2];
1870*495ae853SAndroid Build Coastguard Worker i16_curMv3 = ps_cur_mv_pred->i2_mv[3];
1871*495ae853SAndroid Build Coastguard Worker i1_cur_ref0 = ps_cur_mv_pred->i1_ref_frame[0];
1872*495ae853SAndroid Build Coastguard Worker i1_cur_ref1 = ps_cur_mv_pred->i1_ref_frame[1];
1873*495ae853SAndroid Build Coastguard Worker ui_ref_pic_addr[2] = ppv_map_ref_idx_to_poc_l0[i1_cur_ref0];
1874*495ae853SAndroid Build Coastguard Worker ui_ref_pic_addr[3] = ppv_map_ref_idx_to_poc_l1[i1_cur_ref1];
1875*495ae853SAndroid Build Coastguard Worker
1876*495ae853SAndroid Build Coastguard Worker if(i)
1877*495ae853SAndroid Build Coastguard Worker {
1878*495ae853SAndroid Build Coastguard Worker i1_left_ref0 = ps_left_mv_pred->i1_ref_frame[0];
1879*495ae853SAndroid Build Coastguard Worker i1_left_ref1 = ps_left_mv_pred->i1_ref_frame[1];
1880*495ae853SAndroid Build Coastguard Worker ui_ref_pic_addr[0] = ppv_map_ref_idx_to_poc_l0[i1_left_ref0];
1881*495ae853SAndroid Build Coastguard Worker ui_ref_pic_addr[1] = ppv_map_ref_idx_to_poc_l1[i1_left_ref1];
1882*495ae853SAndroid Build Coastguard Worker }
1883*495ae853SAndroid Build Coastguard Worker else
1884*495ae853SAndroid Build Coastguard Worker {
1885*495ae853SAndroid Build Coastguard Worker ui_ref_pic_addr[0] = ps_left_addr->u4_add[edge & 2];
1886*495ae853SAndroid Build Coastguard Worker ui_ref_pic_addr[1] = ps_left_addr->u4_add[1 + (edge & 2)];
1887*495ae853SAndroid Build Coastguard Worker }
1888*495ae853SAndroid Build Coastguard Worker if(!uc_Bslice)
1889*495ae853SAndroid Build Coastguard Worker {
1890*495ae853SAndroid Build Coastguard Worker uc_bs_vert =
1891*495ae853SAndroid Build Coastguard Worker (ui_ref_pic_addr[0] != ui_ref_pic_addr[2])
1892*495ae853SAndroid Build Coastguard Worker | (ABS((i2_left_mv0
1893*495ae853SAndroid Build Coastguard Worker - i2_cur_mv0))
1894*495ae853SAndroid Build Coastguard Worker >= 4)
1895*495ae853SAndroid Build Coastguard Worker | (ABS((i2_left_mv1
1896*495ae853SAndroid Build Coastguard Worker - i2_cur_mv1))
1897*495ae853SAndroid Build Coastguard Worker >= (UWORD8)c_mv_limit);
1898*495ae853SAndroid Build Coastguard Worker }
1899*495ae853SAndroid Build Coastguard Worker else
1900*495ae853SAndroid Build Coastguard Worker {
1901*495ae853SAndroid Build Coastguard Worker UWORD8 uc_bs_temp1, uc_bs_temp2;
1902*495ae853SAndroid Build Coastguard Worker
1903*495ae853SAndroid Build Coastguard Worker uc_bs_vert = 1;
1904*495ae853SAndroid Build Coastguard Worker
1905*495ae853SAndroid Build Coastguard Worker uc_bs_temp1 =
1906*495ae853SAndroid Build Coastguard Worker ((ABS((i2_left_mv0 - i2_cur_mv0))
1907*495ae853SAndroid Build Coastguard Worker >= 4)
1908*495ae853SAndroid Build Coastguard Worker | (ABS((i2_left_mv1
1909*495ae853SAndroid Build Coastguard Worker - i2_cur_mv1))
1910*495ae853SAndroid Build Coastguard Worker >= (UWORD8)c_mv_limit)
1911*495ae853SAndroid Build Coastguard Worker | (ABS((i2_left_mv2
1912*495ae853SAndroid Build Coastguard Worker - i16_curMv2))
1913*495ae853SAndroid Build Coastguard Worker >= 4)
1914*495ae853SAndroid Build Coastguard Worker | (ABS((i2_left_mv3
1915*495ae853SAndroid Build Coastguard Worker - i16_curMv3))
1916*495ae853SAndroid Build Coastguard Worker >= (UWORD8)c_mv_limit));
1917*495ae853SAndroid Build Coastguard Worker
1918*495ae853SAndroid Build Coastguard Worker uc_bs_temp2 =
1919*495ae853SAndroid Build Coastguard Worker ((ABS((i2_left_mv0 - i16_curMv2))
1920*495ae853SAndroid Build Coastguard Worker >= 4)
1921*495ae853SAndroid Build Coastguard Worker | (ABS((i2_left_mv1
1922*495ae853SAndroid Build Coastguard Worker - i16_curMv3))
1923*495ae853SAndroid Build Coastguard Worker >= (UWORD8)c_mv_limit)
1924*495ae853SAndroid Build Coastguard Worker | (ABS((i2_left_mv2
1925*495ae853SAndroid Build Coastguard Worker - i2_cur_mv0))
1926*495ae853SAndroid Build Coastguard Worker >= 4)
1927*495ae853SAndroid Build Coastguard Worker | (ABS((i2_left_mv3
1928*495ae853SAndroid Build Coastguard Worker - i2_cur_mv1))
1929*495ae853SAndroid Build Coastguard Worker >= (UWORD8)c_mv_limit));
1930*495ae853SAndroid Build Coastguard Worker
1931*495ae853SAndroid Build Coastguard Worker uc_bs_vert =
1932*495ae853SAndroid Build Coastguard Worker (((ui_ref_pic_addr[0] != ui_ref_pic_addr[2])
1933*495ae853SAndroid Build Coastguard Worker || (ui_ref_pic_addr[1]
1934*495ae853SAndroid Build Coastguard Worker != ui_ref_pic_addr[3]))
1935*495ae853SAndroid Build Coastguard Worker || (uc_bs_temp1))
1936*495ae853SAndroid Build Coastguard Worker && (((ui_ref_pic_addr[0]
1937*495ae853SAndroid Build Coastguard Worker != ui_ref_pic_addr[3])
1938*495ae853SAndroid Build Coastguard Worker || (ui_ref_pic_addr[1]
1939*495ae853SAndroid Build Coastguard Worker != ui_ref_pic_addr[2]))
1940*495ae853SAndroid Build Coastguard Worker || (uc_bs_temp2));
1941*495ae853SAndroid Build Coastguard Worker
1942*495ae853SAndroid Build Coastguard Worker }
1943*495ae853SAndroid Build Coastguard Worker }
1944*495ae853SAndroid Build Coastguard Worker //Fill the VERT BS, only if valid i.e.,
1945*495ae853SAndroid Build Coastguard Worker //if it is a non-edge OR it is an edge, which is not yet filled
1946*495ae853SAndroid Build Coastguard Worker uc_bs_vert = (!i && u1_left_intra) ? 4 : uc_bs_vert;
1947*495ae853SAndroid Build Coastguard Worker ui_bs_table[i + 4] = (ui_bs_table[i + 4] << 8) | uc_bs_vert;
1948*495ae853SAndroid Build Coastguard Worker
1949*495ae853SAndroid Build Coastguard Worker //HORIZ edge is assigned BS values next
1950*495ae853SAndroid Build Coastguard Worker ui_cnd = !(uc_top_nnz || uc_cur_nnz);
1951*495ae853SAndroid Build Coastguard Worker uc_bs_horiz = 2;
1952*495ae853SAndroid Build Coastguard Worker
1953*495ae853SAndroid Build Coastguard Worker if(ui_cnd)
1954*495ae853SAndroid Build Coastguard Worker {
1955*495ae853SAndroid Build Coastguard Worker uc_mixed_mode_edge =
1956*495ae853SAndroid Build Coastguard Worker (0 == edge) ? (uc_top_mb_fld != uc_cur_mb_fld) : 0;
1957*495ae853SAndroid Build Coastguard Worker ui_cnd = 1 - uc_mixed_mode_edge;
1958*495ae853SAndroid Build Coastguard Worker uc_bs_horiz = uc_mixed_mode_edge;
1959*495ae853SAndroid Build Coastguard Worker }
1960*495ae853SAndroid Build Coastguard Worker
1961*495ae853SAndroid Build Coastguard Worker if(ui_cnd)
1962*495ae853SAndroid Build Coastguard Worker {
1963*495ae853SAndroid Build Coastguard Worker i2_cur_mv0 = ps_cur_mv_pred->i2_mv[0];
1964*495ae853SAndroid Build Coastguard Worker i2_cur_mv1 = ps_cur_mv_pred->i2_mv[1];
1965*495ae853SAndroid Build Coastguard Worker i16_curMv2 = ps_cur_mv_pred->i2_mv[2];
1966*495ae853SAndroid Build Coastguard Worker i16_curMv3 = ps_cur_mv_pred->i2_mv[3];
1967*495ae853SAndroid Build Coastguard Worker i1_cur_ref0 = ps_cur_mv_pred->i1_ref_frame[0];
1968*495ae853SAndroid Build Coastguard Worker i1_cur_ref1 = ps_cur_mv_pred->i1_ref_frame[1];
1969*495ae853SAndroid Build Coastguard Worker
1970*495ae853SAndroid Build Coastguard Worker i2_top_mv0 = ps_top_mv_pred->i2_mv[0];
1971*495ae853SAndroid Build Coastguard Worker i2_top_mv1 = ps_top_mv_pred->i2_mv[1];
1972*495ae853SAndroid Build Coastguard Worker i16_topMv2 = ps_top_mv_pred->i2_mv[2];
1973*495ae853SAndroid Build Coastguard Worker i16_topMv3 = ps_top_mv_pred->i2_mv[3];
1974*495ae853SAndroid Build Coastguard Worker ui_ref_pic_addr[2] = ppv_map_ref_idx_to_poc_l0[i1_cur_ref0];
1975*495ae853SAndroid Build Coastguard Worker ui_ref_pic_addr[3] = ppv_map_ref_idx_to_poc_l1[i1_cur_ref1];
1976*495ae853SAndroid Build Coastguard Worker if(edge)
1977*495ae853SAndroid Build Coastguard Worker {
1978*495ae853SAndroid Build Coastguard Worker i1_top_ref0 = ps_top_mv_pred->i1_ref_frame[0];
1979*495ae853SAndroid Build Coastguard Worker i1_top_ref1 = ps_top_mv_pred->i1_ref_frame[1];
1980*495ae853SAndroid Build Coastguard Worker ui_ref_pic_addr[0] = ppv_map_ref_idx_to_poc_l0[i1_top_ref0];
1981*495ae853SAndroid Build Coastguard Worker ui_ref_pic_addr[1] = ppv_map_ref_idx_to_poc_l1[i1_top_ref1];
1982*495ae853SAndroid Build Coastguard Worker }
1983*495ae853SAndroid Build Coastguard Worker else
1984*495ae853SAndroid Build Coastguard Worker {
1985*495ae853SAndroid Build Coastguard Worker ui_ref_pic_addr[0] = ps_top_add->u4_add[i & 2];
1986*495ae853SAndroid Build Coastguard Worker ui_ref_pic_addr[1] = ps_top_add->u4_add[1 + (i & 2)];
1987*495ae853SAndroid Build Coastguard Worker }
1988*495ae853SAndroid Build Coastguard Worker if(!uc_Bslice)
1989*495ae853SAndroid Build Coastguard Worker {
1990*495ae853SAndroid Build Coastguard Worker uc_bs_horiz =
1991*495ae853SAndroid Build Coastguard Worker (ui_ref_pic_addr[0] != ui_ref_pic_addr[2])
1992*495ae853SAndroid Build Coastguard Worker | (ABS((i2_top_mv0
1993*495ae853SAndroid Build Coastguard Worker - i2_cur_mv0))
1994*495ae853SAndroid Build Coastguard Worker >= 4)
1995*495ae853SAndroid Build Coastguard Worker | (ABS((i2_top_mv1
1996*495ae853SAndroid Build Coastguard Worker - i2_cur_mv1))
1997*495ae853SAndroid Build Coastguard Worker >= (UWORD8)c_mv_limit);
1998*495ae853SAndroid Build Coastguard Worker }
1999*495ae853SAndroid Build Coastguard Worker else
2000*495ae853SAndroid Build Coastguard Worker {
2001*495ae853SAndroid Build Coastguard Worker UWORD8 uc_bs_temp1, uc_bs_temp2;
2002*495ae853SAndroid Build Coastguard Worker
2003*495ae853SAndroid Build Coastguard Worker uc_bs_horiz = 1;
2004*495ae853SAndroid Build Coastguard Worker
2005*495ae853SAndroid Build Coastguard Worker uc_bs_temp1 =
2006*495ae853SAndroid Build Coastguard Worker ((ABS((i2_top_mv0 - i2_cur_mv0))
2007*495ae853SAndroid Build Coastguard Worker >= 4)
2008*495ae853SAndroid Build Coastguard Worker | (ABS((i2_top_mv1
2009*495ae853SAndroid Build Coastguard Worker - i2_cur_mv1))
2010*495ae853SAndroid Build Coastguard Worker >= (UWORD8)c_mv_limit)
2011*495ae853SAndroid Build Coastguard Worker | (ABS((i16_topMv2
2012*495ae853SAndroid Build Coastguard Worker - i16_curMv2))
2013*495ae853SAndroid Build Coastguard Worker >= 4)
2014*495ae853SAndroid Build Coastguard Worker | (ABS((i16_topMv3
2015*495ae853SAndroid Build Coastguard Worker - i16_curMv3))
2016*495ae853SAndroid Build Coastguard Worker >= (UWORD8)c_mv_limit));
2017*495ae853SAndroid Build Coastguard Worker
2018*495ae853SAndroid Build Coastguard Worker uc_bs_temp2 =
2019*495ae853SAndroid Build Coastguard Worker ((ABS((i2_top_mv0 - i16_curMv2))
2020*495ae853SAndroid Build Coastguard Worker >= 4)
2021*495ae853SAndroid Build Coastguard Worker | (ABS((i2_top_mv1
2022*495ae853SAndroid Build Coastguard Worker - i16_curMv3))
2023*495ae853SAndroid Build Coastguard Worker >= (UWORD8)c_mv_limit)
2024*495ae853SAndroid Build Coastguard Worker | (ABS((i16_topMv2
2025*495ae853SAndroid Build Coastguard Worker - i2_cur_mv0))
2026*495ae853SAndroid Build Coastguard Worker >= 4)
2027*495ae853SAndroid Build Coastguard Worker | (ABS((i16_topMv3
2028*495ae853SAndroid Build Coastguard Worker - i2_cur_mv1))
2029*495ae853SAndroid Build Coastguard Worker >= (UWORD8)c_mv_limit));
2030*495ae853SAndroid Build Coastguard Worker
2031*495ae853SAndroid Build Coastguard Worker uc_bs_horiz =
2032*495ae853SAndroid Build Coastguard Worker (((ui_ref_pic_addr[0] != ui_ref_pic_addr[2])
2033*495ae853SAndroid Build Coastguard Worker || (ui_ref_pic_addr[1]
2034*495ae853SAndroid Build Coastguard Worker != ui_ref_pic_addr[3]))
2035*495ae853SAndroid Build Coastguard Worker || (uc_bs_temp1))
2036*495ae853SAndroid Build Coastguard Worker && (((ui_ref_pic_addr[0]
2037*495ae853SAndroid Build Coastguard Worker != ui_ref_pic_addr[3])
2038*495ae853SAndroid Build Coastguard Worker || (ui_ref_pic_addr[1]
2039*495ae853SAndroid Build Coastguard Worker != ui_ref_pic_addr[2]))
2040*495ae853SAndroid Build Coastguard Worker || (uc_bs_temp2));
2041*495ae853SAndroid Build Coastguard Worker
2042*495ae853SAndroid Build Coastguard Worker }
2043*495ae853SAndroid Build Coastguard Worker }
2044*495ae853SAndroid Build Coastguard Worker ps_left_mv_pred = ps_cur_mv_pred;
2045*495ae853SAndroid Build Coastguard Worker u4_bs_horz = (u4_bs_horz << 8) + uc_bs_horiz;
2046*495ae853SAndroid Build Coastguard Worker }
2047*495ae853SAndroid Build Coastguard Worker //Fill the HORIZ BS, only if valid i.e.,
2048*495ae853SAndroid Build Coastguard Worker //if it is a non-edge OR it is an edge, which is not yet filled
2049*495ae853SAndroid Build Coastguard Worker if(edge || (!edge && !u1_top_intra))
2050*495ae853SAndroid Build Coastguard Worker ui_bs_table[edge] = u4_bs_horz;
2051*495ae853SAndroid Build Coastguard Worker }
2052*495ae853SAndroid Build Coastguard Worker }
2053*495ae853SAndroid Build Coastguard Worker
2054*495ae853SAndroid Build Coastguard Worker /*!
2055*495ae853SAndroid Build Coastguard Worker **************************************************************************
2056*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_fill_bs_for_extra_left_edge \endif
2057*495ae853SAndroid Build Coastguard Worker *
2058*495ae853SAndroid Build Coastguard Worker * \brief
2059*495ae853SAndroid Build Coastguard Worker * Fills the boundary strength (Bs), for the top extra edge. ock
2060*495ae853SAndroid Build Coastguard Worker *
2061*495ae853SAndroid Build Coastguard Worker * \return
2062*495ae853SAndroid Build Coastguard Worker * Returns the packed boundary strength(Bs) MSB -> LSB Bs0|Bs1|Bs2|Bs3
2063*495ae853SAndroid Build Coastguard Worker *
2064*495ae853SAndroid Build Coastguard Worker **************************************************************************
2065*495ae853SAndroid Build Coastguard Worker */
ih264d_fill_bs_for_extra_left_edge(deblk_mb_t * ps_cur_deblk_mb,deblk_mb_t * ps_leftDeblkMb,UWORD8 * puc_cur_nnz,UWORD8 uc_botMb)2066*495ae853SAndroid Build Coastguard Worker void ih264d_fill_bs_for_extra_left_edge(deblk_mb_t *ps_cur_deblk_mb,
2067*495ae853SAndroid Build Coastguard Worker deblk_mb_t *ps_leftDeblkMb,
2068*495ae853SAndroid Build Coastguard Worker UWORD8* puc_cur_nnz,
2069*495ae853SAndroid Build Coastguard Worker UWORD8 uc_botMb)
2070*495ae853SAndroid Build Coastguard Worker {
2071*495ae853SAndroid Build Coastguard Worker /* Set the Flag in uc_deblocking_mode variable of current MB*/
2072*495ae853SAndroid Build Coastguard Worker /* for mixed mode edge*/
2073*495ae853SAndroid Build Coastguard Worker ps_cur_deblk_mb->u1_single_call = 0;
2074*495ae853SAndroid Build Coastguard Worker
2075*495ae853SAndroid Build Coastguard Worker if(ps_cur_deblk_mb->u1_mb_type & D_INTRA_MB)
2076*495ae853SAndroid Build Coastguard Worker {
2077*495ae853SAndroid Build Coastguard Worker ps_cur_deblk_mb->u4_bs_table[4] = 0x04040404;
2078*495ae853SAndroid Build Coastguard Worker ps_cur_deblk_mb->u4_bs_table[9] = 0x04040404;
2079*495ae853SAndroid Build Coastguard Worker }
2080*495ae853SAndroid Build Coastguard Worker else if((ps_leftDeblkMb->u1_mb_type & D_INTRA_MB)
2081*495ae853SAndroid Build Coastguard Worker && ((ps_leftDeblkMb + 1)->u1_mb_type & D_INTRA_MB))
2082*495ae853SAndroid Build Coastguard Worker {
2083*495ae853SAndroid Build Coastguard Worker ps_cur_deblk_mb->u4_bs_table[4] = 0x04040404;
2084*495ae853SAndroid Build Coastguard Worker ps_cur_deblk_mb->u4_bs_table[9] = 0x04040404;
2085*495ae853SAndroid Build Coastguard Worker }
2086*495ae853SAndroid Build Coastguard Worker else
2087*495ae853SAndroid Build Coastguard Worker {
2088*495ae853SAndroid Build Coastguard Worker /* Get strengths of left MB edge */
2089*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs;
2090*495ae853SAndroid Build Coastguard Worker UWORD8 uc_Bs;
2091*495ae853SAndroid Build Coastguard Worker WORD32 i;
2092*495ae853SAndroid Build Coastguard Worker UWORD32 ui_curMbFld;
2093*495ae853SAndroid Build Coastguard Worker UWORD8 *puc_left_nnz;
2094*495ae853SAndroid Build Coastguard Worker UWORD32 ui_bs_left_edge[2];
2095*495ae853SAndroid Build Coastguard Worker
2096*495ae853SAndroid Build Coastguard Worker ui_curMbFld = (ps_cur_deblk_mb->u1_mb_type & D_FLD_MB) >> 7;
2097*495ae853SAndroid Build Coastguard Worker
2098*495ae853SAndroid Build Coastguard Worker puc_left_nnz = puc_cur_nnz - 29;
2099*495ae853SAndroid Build Coastguard Worker if((ui_curMbFld == 0) && uc_botMb)
2100*495ae853SAndroid Build Coastguard Worker {
2101*495ae853SAndroid Build Coastguard Worker puc_left_nnz -= 8;
2102*495ae853SAndroid Build Coastguard Worker }
2103*495ae853SAndroid Build Coastguard Worker else if(ui_curMbFld && uc_botMb)
2104*495ae853SAndroid Build Coastguard Worker {
2105*495ae853SAndroid Build Coastguard Worker puc_left_nnz -= 16;
2106*495ae853SAndroid Build Coastguard Worker }
2107*495ae853SAndroid Build Coastguard Worker
2108*495ae853SAndroid Build Coastguard Worker if(ui_curMbFld)
2109*495ae853SAndroid Build Coastguard Worker {
2110*495ae853SAndroid Build Coastguard Worker if(ps_leftDeblkMb->u1_mb_type & D_INTRA_MB)
2111*495ae853SAndroid Build Coastguard Worker {
2112*495ae853SAndroid Build Coastguard Worker ui_bs_left_edge[0] = 0x04040404;
2113*495ae853SAndroid Build Coastguard Worker puc_left_nnz += 16;
2114*495ae853SAndroid Build Coastguard Worker puc_cur_nnz += 8;
2115*495ae853SAndroid Build Coastguard Worker }
2116*495ae853SAndroid Build Coastguard Worker else
2117*495ae853SAndroid Build Coastguard Worker {
2118*495ae853SAndroid Build Coastguard Worker u4_bs = 0;
2119*495ae853SAndroid Build Coastguard Worker for(i = 4; i > 0; i--)
2120*495ae853SAndroid Build Coastguard Worker {
2121*495ae853SAndroid Build Coastguard Worker uc_Bs = ((*puc_cur_nnz || *puc_left_nnz)) ? 2 : 1;
2122*495ae853SAndroid Build Coastguard Worker u4_bs = (u4_bs << 8) | uc_Bs;
2123*495ae853SAndroid Build Coastguard Worker puc_left_nnz += 4;
2124*495ae853SAndroid Build Coastguard Worker if(i & 0x01)
2125*495ae853SAndroid Build Coastguard Worker puc_cur_nnz += 4;
2126*495ae853SAndroid Build Coastguard Worker }
2127*495ae853SAndroid Build Coastguard Worker ui_bs_left_edge[0] = u4_bs;
2128*495ae853SAndroid Build Coastguard Worker }
2129*495ae853SAndroid Build Coastguard Worker
2130*495ae853SAndroid Build Coastguard Worker if((ps_leftDeblkMb + 1)->u1_mb_type & D_INTRA_MB)
2131*495ae853SAndroid Build Coastguard Worker {
2132*495ae853SAndroid Build Coastguard Worker ui_bs_left_edge[1] = 0x04040404;
2133*495ae853SAndroid Build Coastguard Worker }
2134*495ae853SAndroid Build Coastguard Worker else
2135*495ae853SAndroid Build Coastguard Worker {
2136*495ae853SAndroid Build Coastguard Worker u4_bs = 0;
2137*495ae853SAndroid Build Coastguard Worker for(i = 4; i > 0; i--)
2138*495ae853SAndroid Build Coastguard Worker {
2139*495ae853SAndroid Build Coastguard Worker uc_Bs = ((*puc_cur_nnz || *puc_left_nnz)) ? 2 : 1;
2140*495ae853SAndroid Build Coastguard Worker u4_bs = (u4_bs << 8) | uc_Bs;
2141*495ae853SAndroid Build Coastguard Worker puc_left_nnz += 4;
2142*495ae853SAndroid Build Coastguard Worker if(i & 0x01)
2143*495ae853SAndroid Build Coastguard Worker puc_cur_nnz += 4;
2144*495ae853SAndroid Build Coastguard Worker }
2145*495ae853SAndroid Build Coastguard Worker ui_bs_left_edge[1] = u4_bs;
2146*495ae853SAndroid Build Coastguard Worker }
2147*495ae853SAndroid Build Coastguard Worker }
2148*495ae853SAndroid Build Coastguard Worker else
2149*495ae853SAndroid Build Coastguard Worker {
2150*495ae853SAndroid Build Coastguard Worker UWORD8 *puc_curNnzB, *puc_leftNnzB;
2151*495ae853SAndroid Build Coastguard Worker puc_curNnzB = puc_cur_nnz;
2152*495ae853SAndroid Build Coastguard Worker puc_leftNnzB = puc_left_nnz + 16;
2153*495ae853SAndroid Build Coastguard Worker if(ps_leftDeblkMb->u1_mb_type & D_INTRA_MB)
2154*495ae853SAndroid Build Coastguard Worker {
2155*495ae853SAndroid Build Coastguard Worker ui_bs_left_edge[0] = 0x04040404;
2156*495ae853SAndroid Build Coastguard Worker }
2157*495ae853SAndroid Build Coastguard Worker else
2158*495ae853SAndroid Build Coastguard Worker {
2159*495ae853SAndroid Build Coastguard Worker u4_bs = 0;
2160*495ae853SAndroid Build Coastguard Worker for(i = 4; i > 0; i--, puc_cur_nnz += 4)
2161*495ae853SAndroid Build Coastguard Worker {
2162*495ae853SAndroid Build Coastguard Worker uc_Bs = ((*puc_cur_nnz || *puc_left_nnz)) ? 2 : 1;
2163*495ae853SAndroid Build Coastguard Worker u4_bs = (u4_bs << 8) | uc_Bs;
2164*495ae853SAndroid Build Coastguard Worker if(i & 0x01)
2165*495ae853SAndroid Build Coastguard Worker puc_left_nnz += 4;
2166*495ae853SAndroid Build Coastguard Worker }
2167*495ae853SAndroid Build Coastguard Worker ui_bs_left_edge[0] = u4_bs;
2168*495ae853SAndroid Build Coastguard Worker }
2169*495ae853SAndroid Build Coastguard Worker
2170*495ae853SAndroid Build Coastguard Worker if((ps_leftDeblkMb + 1)->u1_mb_type & D_INTRA_MB)
2171*495ae853SAndroid Build Coastguard Worker {
2172*495ae853SAndroid Build Coastguard Worker ui_bs_left_edge[1] = 0x04040404;
2173*495ae853SAndroid Build Coastguard Worker }
2174*495ae853SAndroid Build Coastguard Worker else
2175*495ae853SAndroid Build Coastguard Worker {
2176*495ae853SAndroid Build Coastguard Worker u4_bs = 0;
2177*495ae853SAndroid Build Coastguard Worker for(i = 4; i > 0; i--, puc_curNnzB += 4)
2178*495ae853SAndroid Build Coastguard Worker {
2179*495ae853SAndroid Build Coastguard Worker uc_Bs = ((*puc_curNnzB || *puc_leftNnzB)) ? 2 : 1;
2180*495ae853SAndroid Build Coastguard Worker u4_bs = (u4_bs << 8) | uc_Bs;
2181*495ae853SAndroid Build Coastguard Worker if(i & 0x01)
2182*495ae853SAndroid Build Coastguard Worker puc_leftNnzB += 4;
2183*495ae853SAndroid Build Coastguard Worker }
2184*495ae853SAndroid Build Coastguard Worker ui_bs_left_edge[1] = u4_bs;
2185*495ae853SAndroid Build Coastguard Worker }
2186*495ae853SAndroid Build Coastguard Worker }
2187*495ae853SAndroid Build Coastguard Worker /* Copy The Values in Cur Deblk Mb Parameters */
2188*495ae853SAndroid Build Coastguard Worker ps_cur_deblk_mb->u4_bs_table[4] = ui_bs_left_edge[0];
2189*495ae853SAndroid Build Coastguard Worker ps_cur_deblk_mb->u4_bs_table[9] = ui_bs_left_edge[1];
2190*495ae853SAndroid Build Coastguard Worker }
2191*495ae853SAndroid Build Coastguard Worker
2192*495ae853SAndroid Build Coastguard Worker }
2193*495ae853SAndroid Build Coastguard Worker
2194*495ae853SAndroid Build Coastguard Worker /*!
2195*495ae853SAndroid Build Coastguard Worker **************************************************************************
2196*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_fill_bs_for_extra_top_edge \endif
2197*495ae853SAndroid Build Coastguard Worker *
2198*495ae853SAndroid Build Coastguard Worker * \brief
2199*495ae853SAndroid Build Coastguard Worker * Fills the boundary strength (Bs), for the top extra edge. ock
2200*495ae853SAndroid Build Coastguard Worker *
2201*495ae853SAndroid Build Coastguard Worker * \return
2202*495ae853SAndroid Build Coastguard Worker * Returns the packed boundary strength(Bs) MSB -> LSB Bs0|Bs1|Bs2|Bs3
2203*495ae853SAndroid Build Coastguard Worker *
2204*495ae853SAndroid Build Coastguard Worker **************************************************************************
2205*495ae853SAndroid Build Coastguard Worker */
ih264d_fill_bs_for_extra_top_edge(deblk_mb_t * ps_cur_mb_params,UWORD8 u1_Edge0_mb_typ,UWORD8 u1_Edge1_mb_typ,UWORD8 * pu1_curNnz,UWORD8 * pu1_topNnz)2206*495ae853SAndroid Build Coastguard Worker void ih264d_fill_bs_for_extra_top_edge(deblk_mb_t *ps_cur_mb_params,
2207*495ae853SAndroid Build Coastguard Worker UWORD8 u1_Edge0_mb_typ,
2208*495ae853SAndroid Build Coastguard Worker UWORD8 u1_Edge1_mb_typ,
2209*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_curNnz,
2210*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_topNnz)
2211*495ae853SAndroid Build Coastguard Worker {
2212*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bs;
2213*495ae853SAndroid Build Coastguard Worker UWORD8 uc_Bs;
2214*495ae853SAndroid Build Coastguard Worker WORD32 i;
2215*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_cur_nnz_tmp;
2216*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_top_nnz_tmp;
2217*495ae853SAndroid Build Coastguard Worker UWORD8 u1_top_edge;
2218*495ae853SAndroid Build Coastguard Worker UWORD8 u1_top_mb_type;
2219*495ae853SAndroid Build Coastguard Worker for(u1_top_edge = 0; u1_top_edge < 2; u1_top_edge++)
2220*495ae853SAndroid Build Coastguard Worker {
2221*495ae853SAndroid Build Coastguard Worker u1_top_mb_type = u1_top_edge ? u1_Edge1_mb_typ : u1_Edge0_mb_typ;
2222*495ae853SAndroid Build Coastguard Worker pu1_cur_nnz_tmp = pu1_curNnz;
2223*495ae853SAndroid Build Coastguard Worker pu1_top_nnz_tmp = pu1_topNnz + (u1_top_edge << 2);
2224*495ae853SAndroid Build Coastguard Worker
2225*495ae853SAndroid Build Coastguard Worker if((ps_cur_mb_params->u1_mb_type & D_INTRA_MB)
2226*495ae853SAndroid Build Coastguard Worker + (u1_top_mb_type & D_INTRA_MB))
2227*495ae853SAndroid Build Coastguard Worker {
2228*495ae853SAndroid Build Coastguard Worker u4_bs = 0x03030303;
2229*495ae853SAndroid Build Coastguard Worker }
2230*495ae853SAndroid Build Coastguard Worker else
2231*495ae853SAndroid Build Coastguard Worker {
2232*495ae853SAndroid Build Coastguard Worker u4_bs = 0;
2233*495ae853SAndroid Build Coastguard Worker for(i = 4; i > 0; i--, pu1_cur_nnz_tmp += 1, pu1_top_nnz_tmp += 1)
2234*495ae853SAndroid Build Coastguard Worker {
2235*495ae853SAndroid Build Coastguard Worker uc_Bs = ((*pu1_cur_nnz_tmp || *pu1_top_nnz_tmp)) ? 2 : 1;
2236*495ae853SAndroid Build Coastguard Worker u4_bs = (u4_bs << 8) | uc_Bs;
2237*495ae853SAndroid Build Coastguard Worker }
2238*495ae853SAndroid Build Coastguard Worker }
2239*495ae853SAndroid Build Coastguard Worker if(u1_top_edge)
2240*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params->u4_bs_table[0] = u4_bs;
2241*495ae853SAndroid Build Coastguard Worker else
2242*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params->u4_bs_table[8] = u4_bs;
2243*495ae853SAndroid Build Coastguard Worker }
2244*495ae853SAndroid Build Coastguard Worker }
2245*495ae853SAndroid Build Coastguard Worker
2246*495ae853SAndroid Build Coastguard Worker
ih264d_fill_bs_mbedge_4(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,const UWORD16 u2_mbxn_mb)2247*495ae853SAndroid Build Coastguard Worker void ih264d_fill_bs_mbedge_4(dec_struct_t * ps_dec,
2248*495ae853SAndroid Build Coastguard Worker dec_mb_info_t * ps_cur_mb_info,
2249*495ae853SAndroid Build Coastguard Worker const UWORD16 u2_mbxn_mb)
2250*495ae853SAndroid Build Coastguard Worker {
2251*495ae853SAndroid Build Coastguard Worker
2252*495ae853SAndroid Build Coastguard Worker /* deblk_mb_t Params */
2253*495ae853SAndroid Build Coastguard Worker deblk_mb_t *ps_cur_mb_params; /*< Parameters of current MacroBlock */
2254*495ae853SAndroid Build Coastguard Worker deblkmb_neighbour_t *ps_deblk_top_mb;
2255*495ae853SAndroid Build Coastguard Worker UWORD32 * pu4_bs_table;
2256*495ae853SAndroid Build Coastguard Worker UWORD8 u1_cur_mb_type;
2257*495ae853SAndroid Build Coastguard Worker
2258*495ae853SAndroid Build Coastguard Worker /* Neighbour availability */
2259*495ae853SAndroid Build Coastguard Worker /* Initialization */
2260*495ae853SAndroid Build Coastguard Worker const UWORD32 u2_mbx = ps_cur_mb_info->u2_mbx;
2261*495ae853SAndroid Build Coastguard Worker const UWORD32 u2_mby = ps_cur_mb_info->u2_mby;
2262*495ae853SAndroid Build Coastguard Worker const UWORD32 u1_pingpong = u2_mbx & 0x01;
2263*495ae853SAndroid Build Coastguard Worker ps_deblk_top_mb = ps_dec->ps_deblk_top_mb + u2_mbx;
2264*495ae853SAndroid Build Coastguard Worker
2265*495ae853SAndroid Build Coastguard Worker
2266*495ae853SAndroid Build Coastguard Worker /* Pointer assignment for Current DeblkMB, Current Mv Pred */
2267*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params = ps_dec->ps_deblk_mbn + u2_mbxn_mb;
2268*495ae853SAndroid Build Coastguard Worker
2269*495ae853SAndroid Build Coastguard Worker u1_cur_mb_type = ps_cur_mb_params->u1_mb_type;
2270*495ae853SAndroid Build Coastguard Worker
2271*495ae853SAndroid Build Coastguard Worker ps_deblk_top_mb->u1_mb_type = u1_cur_mb_type;
2272*495ae853SAndroid Build Coastguard Worker
2273*495ae853SAndroid Build Coastguard Worker {
2274*495ae853SAndroid Build Coastguard Worker UWORD8 mb_qp_temp;
2275*495ae853SAndroid Build Coastguard Worker
2276*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params->u1_topmb_qp = ps_deblk_top_mb->u1_mb_qp;
2277*495ae853SAndroid Build Coastguard Worker ps_deblk_top_mb->u1_mb_qp = ps_cur_mb_params->u1_mb_qp;
2278*495ae853SAndroid Build Coastguard Worker
2279*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params->u1_left_mb_qp = ps_dec->deblk_left_mb[1].u1_mb_qp;
2280*495ae853SAndroid Build Coastguard Worker ps_dec->deblk_left_mb[1].u1_mb_qp = ps_cur_mb_params->u1_mb_qp;
2281*495ae853SAndroid Build Coastguard Worker
2282*495ae853SAndroid Build Coastguard Worker }
2283*495ae853SAndroid Build Coastguard Worker
2284*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params->u1_single_call = 1;
2285*495ae853SAndroid Build Coastguard Worker
2286*495ae853SAndroid Build Coastguard Worker ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type;
2287*495ae853SAndroid Build Coastguard Worker /* if no deblocking required for current Mb then continue */
2288*495ae853SAndroid Build Coastguard Worker /* Check next Mbs in Mb group */
2289*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_params->u1_deblocking_mode & MB_DISABLE_FILTERING)
2290*495ae853SAndroid Build Coastguard Worker {
2291*495ae853SAndroid Build Coastguard Worker /* Storing the leftMbtype for next Mb */
2292*495ae853SAndroid Build Coastguard Worker return;
2293*495ae853SAndroid Build Coastguard Worker }
2294*495ae853SAndroid Build Coastguard Worker
2295*495ae853SAndroid Build Coastguard Worker /* Compute BS function */
2296*495ae853SAndroid Build Coastguard Worker pu4_bs_table = ps_cur_mb_params->u4_bs_table;
2297*495ae853SAndroid Build Coastguard Worker
2298*495ae853SAndroid Build Coastguard Worker pu4_bs_table[4] = 0x04040404;
2299*495ae853SAndroid Build Coastguard Worker pu4_bs_table[0] = 0x04040404;
2300*495ae853SAndroid Build Coastguard Worker pu4_bs_table[1] = 0;
2301*495ae853SAndroid Build Coastguard Worker pu4_bs_table[2] = 0;
2302*495ae853SAndroid Build Coastguard Worker pu4_bs_table[3] = 0;
2303*495ae853SAndroid Build Coastguard Worker pu4_bs_table[5] = 0;
2304*495ae853SAndroid Build Coastguard Worker pu4_bs_table[6] = 0;
2305*495ae853SAndroid Build Coastguard Worker pu4_bs_table[7] = 0;
2306*495ae853SAndroid Build Coastguard Worker
2307*495ae853SAndroid Build Coastguard Worker }
2308*495ae853SAndroid Build Coastguard Worker
ih264d_fill_bs_mbedge_2(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,const UWORD16 u2_mbxn_mb)2309*495ae853SAndroid Build Coastguard Worker void ih264d_fill_bs_mbedge_2(dec_struct_t * ps_dec,
2310*495ae853SAndroid Build Coastguard Worker dec_mb_info_t * ps_cur_mb_info,
2311*495ae853SAndroid Build Coastguard Worker const UWORD16 u2_mbxn_mb)
2312*495ae853SAndroid Build Coastguard Worker {
2313*495ae853SAndroid Build Coastguard Worker
2314*495ae853SAndroid Build Coastguard Worker /* deblk_mb_t Params */
2315*495ae853SAndroid Build Coastguard Worker deblk_mb_t *ps_cur_mb_params; /*< Parameters of current MacroBlock */
2316*495ae853SAndroid Build Coastguard Worker deblkmb_neighbour_t *ps_deblk_top_mb;
2317*495ae853SAndroid Build Coastguard Worker UWORD32 * pu4_bs_table;
2318*495ae853SAndroid Build Coastguard Worker UWORD8 u1_cur_mb_type;
2319*495ae853SAndroid Build Coastguard Worker
2320*495ae853SAndroid Build Coastguard Worker /* Neighbour availability */
2321*495ae853SAndroid Build Coastguard Worker /* Initialization */
2322*495ae853SAndroid Build Coastguard Worker const UWORD32 u2_mbx = ps_cur_mb_info->u2_mbx;
2323*495ae853SAndroid Build Coastguard Worker const UWORD32 u2_mby = ps_cur_mb_info->u2_mby;
2324*495ae853SAndroid Build Coastguard Worker const UWORD32 u1_pingpong = u2_mbx & 0x01;
2325*495ae853SAndroid Build Coastguard Worker ps_deblk_top_mb = ps_dec->ps_deblk_top_mb + u2_mbx;
2326*495ae853SAndroid Build Coastguard Worker
2327*495ae853SAndroid Build Coastguard Worker
2328*495ae853SAndroid Build Coastguard Worker /* Pointer assignment for Current DeblkMB, Current Mv Pred */
2329*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params = ps_dec->ps_deblk_mbn + u2_mbxn_mb;
2330*495ae853SAndroid Build Coastguard Worker
2331*495ae853SAndroid Build Coastguard Worker u1_cur_mb_type = ps_cur_mb_params->u1_mb_type;
2332*495ae853SAndroid Build Coastguard Worker
2333*495ae853SAndroid Build Coastguard Worker ps_deblk_top_mb->u1_mb_type = u1_cur_mb_type;
2334*495ae853SAndroid Build Coastguard Worker
2335*495ae853SAndroid Build Coastguard Worker {
2336*495ae853SAndroid Build Coastguard Worker UWORD8 mb_qp_temp;
2337*495ae853SAndroid Build Coastguard Worker
2338*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params->u1_topmb_qp = ps_deblk_top_mb->u1_mb_qp;
2339*495ae853SAndroid Build Coastguard Worker ps_deblk_top_mb->u1_mb_qp = ps_cur_mb_params->u1_mb_qp;
2340*495ae853SAndroid Build Coastguard Worker
2341*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params->u1_left_mb_qp = ps_dec->deblk_left_mb[1].u1_mb_qp;
2342*495ae853SAndroid Build Coastguard Worker ps_dec->deblk_left_mb[1].u1_mb_qp = ps_cur_mb_params->u1_mb_qp;
2343*495ae853SAndroid Build Coastguard Worker
2344*495ae853SAndroid Build Coastguard Worker }
2345*495ae853SAndroid Build Coastguard Worker
2346*495ae853SAndroid Build Coastguard Worker ps_cur_mb_params->u1_single_call = 1;
2347*495ae853SAndroid Build Coastguard Worker
2348*495ae853SAndroid Build Coastguard Worker ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type;
2349*495ae853SAndroid Build Coastguard Worker /* if no deblocking required for current Mb then continue */
2350*495ae853SAndroid Build Coastguard Worker /* Check next Mbs in Mb group */
2351*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_params->u1_deblocking_mode & MB_DISABLE_FILTERING)
2352*495ae853SAndroid Build Coastguard Worker {
2353*495ae853SAndroid Build Coastguard Worker /* Storing the leftMbtype for next Mb */
2354*495ae853SAndroid Build Coastguard Worker return;
2355*495ae853SAndroid Build Coastguard Worker }
2356*495ae853SAndroid Build Coastguard Worker
2357*495ae853SAndroid Build Coastguard Worker /* Compute BS function */
2358*495ae853SAndroid Build Coastguard Worker pu4_bs_table = ps_cur_mb_params->u4_bs_table;
2359*495ae853SAndroid Build Coastguard Worker
2360*495ae853SAndroid Build Coastguard Worker {
2361*495ae853SAndroid Build Coastguard Worker UWORD32 top_mb_csbp, left_mb_csbp, cur_mb_csbp;
2362*495ae853SAndroid Build Coastguard Worker UWORD32 top_edge, left_edge;
2363*495ae853SAndroid Build Coastguard Worker
2364*495ae853SAndroid Build Coastguard Worker top_mb_csbp = ps_cur_mb_info->ps_top_mb->u2_luma_csbp;
2365*495ae853SAndroid Build Coastguard Worker left_mb_csbp = ps_cur_mb_info->ps_left_mb->u2_luma_csbp;
2366*495ae853SAndroid Build Coastguard Worker cur_mb_csbp = ps_cur_mb_info->ps_curmb->u2_luma_csbp;
2367*495ae853SAndroid Build Coastguard Worker
2368*495ae853SAndroid Build Coastguard Worker top_mb_csbp = top_mb_csbp >> 12;
2369*495ae853SAndroid Build Coastguard Worker top_edge = top_mb_csbp | (cur_mb_csbp & 0xf);
2370*495ae853SAndroid Build Coastguard Worker
2371*495ae853SAndroid Build Coastguard Worker if(top_edge)
2372*495ae853SAndroid Build Coastguard Worker pu4_bs_table[0] = 0x02020202;
2373*495ae853SAndroid Build Coastguard Worker else
2374*495ae853SAndroid Build Coastguard Worker pu4_bs_table[0] = 0;
2375*495ae853SAndroid Build Coastguard Worker
2376*495ae853SAndroid Build Coastguard Worker cur_mb_csbp = cur_mb_csbp & CSBP_LEFT_BLOCK_MASK;
2377*495ae853SAndroid Build Coastguard Worker left_mb_csbp = left_mb_csbp & CSBP_RIGHT_BLOCK_MASK;
2378*495ae853SAndroid Build Coastguard Worker
2379*495ae853SAndroid Build Coastguard Worker left_edge = cur_mb_csbp | left_mb_csbp;
2380*495ae853SAndroid Build Coastguard Worker
2381*495ae853SAndroid Build Coastguard Worker if(left_edge)
2382*495ae853SAndroid Build Coastguard Worker pu4_bs_table[4] = 0x02020202;
2383*495ae853SAndroid Build Coastguard Worker else
2384*495ae853SAndroid Build Coastguard Worker pu4_bs_table[4] = 0;
2385*495ae853SAndroid Build Coastguard Worker
2386*495ae853SAndroid Build Coastguard Worker pu4_bs_table[1] = 0;
2387*495ae853SAndroid Build Coastguard Worker pu4_bs_table[2] = 0;
2388*495ae853SAndroid Build Coastguard Worker pu4_bs_table[3] = 0;
2389*495ae853SAndroid Build Coastguard Worker pu4_bs_table[5] = 0;
2390*495ae853SAndroid Build Coastguard Worker pu4_bs_table[6] = 0;
2391*495ae853SAndroid Build Coastguard Worker pu4_bs_table[7] = 0;
2392*495ae853SAndroid Build Coastguard Worker }
2393*495ae853SAndroid Build Coastguard Worker
2394*495ae853SAndroid Build Coastguard Worker }
2395