xref: /aosp_15_r20/external/libavc/decoder/ih264d_process_intra_mb.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
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  **************************************************************************
22*495ae853SAndroid Build Coastguard Worker  * \file ih264d_process_intra_mb.c
23*495ae853SAndroid Build Coastguard Worker  *
24*495ae853SAndroid Build Coastguard Worker  * \brief
25*495ae853SAndroid Build Coastguard Worker  *    Contains routines that decode a I slice type
26*495ae853SAndroid Build Coastguard Worker  *
27*495ae853SAndroid Build Coastguard Worker  * Detailed_description
28*495ae853SAndroid Build Coastguard Worker  *
29*495ae853SAndroid Build Coastguard Worker  * \date
30*495ae853SAndroid Build Coastguard Worker  *    07/07/2003
31*495ae853SAndroid Build Coastguard Worker  *
32*495ae853SAndroid Build Coastguard Worker  * \author  NS
33*495ae853SAndroid Build Coastguard Worker  **************************************************************************
34*495ae853SAndroid Build Coastguard Worker  */
35*495ae853SAndroid Build Coastguard Worker 
36*495ae853SAndroid Build Coastguard Worker #include <string.h>
37*495ae853SAndroid Build Coastguard Worker #include "ih264d_bitstrm.h"
38*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
39*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
40*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
41*495ae853SAndroid Build Coastguard Worker #include "ih264d_structs.h"
42*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
43*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
44*495ae853SAndroid Build Coastguard Worker #include "ih264d_mb_utils.h"
45*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_slice.h"
46*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_intra_mb.h"
47*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
48*495ae853SAndroid Build Coastguard Worker #include "ih264d_quant_scaling.h"
49*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
50*495ae853SAndroid Build Coastguard Worker 
51*495ae853SAndroid Build Coastguard Worker /*!
52*495ae853SAndroid Build Coastguard Worker  **************************************************************************
53*495ae853SAndroid Build Coastguard Worker  * \if Function name : ih264d_itrans_recon_luma_dc \endif
54*495ae853SAndroid Build Coastguard Worker  *
55*495ae853SAndroid Build Coastguard Worker  * \brief
56*495ae853SAndroid Build Coastguard Worker  *    This function does InvTransform, scaling and reconstruction of Luma DC.
57*495ae853SAndroid Build Coastguard Worker  *
58*495ae853SAndroid Build Coastguard Worker  * \return
59*495ae853SAndroid Build Coastguard Worker  *    0 on Success and Error code otherwise
60*495ae853SAndroid Build Coastguard Worker  **************************************************************************
61*495ae853SAndroid Build Coastguard Worker  */
ih264d_itrans_recon_luma_dc(dec_struct_t * ps_dec,WORD16 * pi2_src,WORD16 * pi2_coeff_block,const UWORD16 * pu2_weigh_mat)62*495ae853SAndroid Build Coastguard Worker void ih264d_itrans_recon_luma_dc(dec_struct_t *ps_dec,
63*495ae853SAndroid Build Coastguard Worker                                  WORD16* pi2_src,
64*495ae853SAndroid Build Coastguard Worker                                  WORD16* pi2_coeff_block,
65*495ae853SAndroid Build Coastguard Worker                                  const UWORD16 *pu2_weigh_mat)
66*495ae853SAndroid Build Coastguard Worker {
67*495ae853SAndroid Build Coastguard Worker     WORD32 i;
68*495ae853SAndroid Build Coastguard Worker     WORD16 pi2_out[16];
69*495ae853SAndroid Build Coastguard Worker     WORD32 pi4_tmp[16];
70*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_out_ptr = &pi2_out[0];
71*495ae853SAndroid Build Coastguard Worker     PROFILE_DISABLE_IQ_IT_RECON_RETURN()
72*495ae853SAndroid Build Coastguard Worker     ps_dec->pf_ihadamard_scaling_4x4(pi2_src, pi2_out,
73*495ae853SAndroid Build Coastguard Worker                                      ps_dec->pu2_quant_scale_y, pu2_weigh_mat,
74*495ae853SAndroid Build Coastguard Worker                                      ps_dec->u1_qp_y_div6, pi4_tmp);
75*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < 4; i++)
76*495ae853SAndroid Build Coastguard Worker     {
77*495ae853SAndroid Build Coastguard Worker         pi2_coeff_block[0] = pi2_out_ptr[0];
78*495ae853SAndroid Build Coastguard Worker         pi2_coeff_block[4 * 16] = pi2_out_ptr[4];
79*495ae853SAndroid Build Coastguard Worker         pi2_coeff_block[8 * 16] = pi2_out_ptr[8];
80*495ae853SAndroid Build Coastguard Worker         pi2_coeff_block[12 * 16] = pi2_out_ptr[12];
81*495ae853SAndroid Build Coastguard Worker 
82*495ae853SAndroid Build Coastguard Worker         pi2_out_ptr++; /* Point to next column */
83*495ae853SAndroid Build Coastguard Worker         pi2_coeff_block += 16;
84*495ae853SAndroid Build Coastguard Worker     }
85*495ae853SAndroid Build Coastguard Worker }
86*495ae853SAndroid Build Coastguard Worker /*!
87*495ae853SAndroid Build Coastguard Worker  **************************************************************************
88*495ae853SAndroid Build Coastguard Worker  * \if Function name : ih264d_read_intra_pred_modes \endif
89*495ae853SAndroid Build Coastguard Worker  *
90*495ae853SAndroid Build Coastguard Worker  * \brief
91*495ae853SAndroid Build Coastguard Worker  *    Reads the intra pred mode related values of I4x4 MB from bitstream.
92*495ae853SAndroid Build Coastguard Worker  *
93*495ae853SAndroid Build Coastguard Worker  *    This function will read the prev intra pred mode flags and
94*495ae853SAndroid Build Coastguard Worker  *    stores it in pu1_prev_intra4x4_pred_mode_flag. If the u4_flag
95*495ae853SAndroid Build Coastguard Worker  *    indicates that most probable mode is not intra pred mode, then
96*495ae853SAndroid Build Coastguard Worker  *    the rem_intra4x4_pred_mode is read and stored in
97*495ae853SAndroid Build Coastguard Worker  *    pu1_rem_intra4x4_pred_mode array.
98*495ae853SAndroid Build Coastguard Worker  *
99*495ae853SAndroid Build Coastguard Worker  *
100*495ae853SAndroid Build Coastguard Worker  * \return
101*495ae853SAndroid Build Coastguard Worker  *    0 on success and Error code otherwise
102*495ae853SAndroid Build Coastguard Worker  *
103*495ae853SAndroid Build Coastguard Worker  **************************************************************************
104*495ae853SAndroid Build Coastguard Worker  */
ih264d_read_intra_pred_modes(dec_struct_t * ps_dec,UWORD8 * pu1_prev_intra4x4_pred_mode_flag,UWORD8 * pu1_rem_intra4x4_pred_mode,UWORD32 u4_trans_form8x8)105*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_read_intra_pred_modes(dec_struct_t * ps_dec,
106*495ae853SAndroid Build Coastguard Worker                                     UWORD8 * pu1_prev_intra4x4_pred_mode_flag,
107*495ae853SAndroid Build Coastguard Worker                                     UWORD8 * pu1_rem_intra4x4_pred_mode,
108*495ae853SAndroid Build Coastguard Worker                                     UWORD32 u4_trans_form8x8)
109*495ae853SAndroid Build Coastguard Worker {
110*495ae853SAndroid Build Coastguard Worker     WORD32 i4x4_luma_blk_idx = 0, i8x8_luma_blk_idx = 0;
111*495ae853SAndroid Build Coastguard Worker 
112*495ae853SAndroid Build Coastguard Worker     dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
113*495ae853SAndroid Build Coastguard Worker 
114*495ae853SAndroid Build Coastguard Worker     if(!u4_trans_form8x8)
115*495ae853SAndroid Build Coastguard Worker     {
116*495ae853SAndroid Build Coastguard Worker         for(i4x4_luma_blk_idx = 0; i4x4_luma_blk_idx < 16; ++i4x4_luma_blk_idx)
117*495ae853SAndroid Build Coastguard Worker         {
118*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_temp;
119*495ae853SAndroid Build Coastguard Worker             SWITCHOFFTRACE;
120*495ae853SAndroid Build Coastguard Worker 
121*495ae853SAndroid Build Coastguard Worker             GETBIT(u4_temp, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
122*495ae853SAndroid Build Coastguard Worker             *pu1_prev_intra4x4_pred_mode_flag = (UWORD8)u4_temp;
123*495ae853SAndroid Build Coastguard Worker             if(!(*pu1_prev_intra4x4_pred_mode_flag))
124*495ae853SAndroid Build Coastguard Worker             {
125*495ae853SAndroid Build Coastguard Worker                 GETBITS(u4_temp, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer, 3);
126*495ae853SAndroid Build Coastguard Worker 
127*495ae853SAndroid Build Coastguard Worker                 *(pu1_rem_intra4x4_pred_mode) = (UWORD8)u4_temp;
128*495ae853SAndroid Build Coastguard Worker             }
129*495ae853SAndroid Build Coastguard Worker 
130*495ae853SAndroid Build Coastguard Worker             pu1_prev_intra4x4_pred_mode_flag++;
131*495ae853SAndroid Build Coastguard Worker             pu1_rem_intra4x4_pred_mode++;
132*495ae853SAndroid Build Coastguard Worker         }
133*495ae853SAndroid Build Coastguard Worker     }
134*495ae853SAndroid Build Coastguard Worker     else
135*495ae853SAndroid Build Coastguard Worker     {
136*495ae853SAndroid Build Coastguard Worker         /**********************************************************************/
137*495ae853SAndroid Build Coastguard Worker         /* prev_intra4x4_pred_modes to be interpreted as                      */
138*495ae853SAndroid Build Coastguard Worker         /* prev_intra8x8_pred_modes in case of transform 8x8                  */
139*495ae853SAndroid Build Coastguard Worker         /**********************************************************************/
140*495ae853SAndroid Build Coastguard Worker         for(i8x8_luma_blk_idx = 0; i8x8_luma_blk_idx < 4; i8x8_luma_blk_idx++)
141*495ae853SAndroid Build Coastguard Worker         {
142*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_temp;
143*495ae853SAndroid Build Coastguard Worker             GETBIT(u4_temp, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
144*495ae853SAndroid Build Coastguard Worker             *pu1_prev_intra4x4_pred_mode_flag = (UWORD8)u4_temp;
145*495ae853SAndroid Build Coastguard Worker             if(!(*pu1_prev_intra4x4_pred_mode_flag))
146*495ae853SAndroid Build Coastguard Worker             {
147*495ae853SAndroid Build Coastguard Worker                 GETBITS(u4_temp, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer, 3);
148*495ae853SAndroid Build Coastguard Worker 
149*495ae853SAndroid Build Coastguard Worker                 (*pu1_rem_intra4x4_pred_mode) = (UWORD8)u4_temp;
150*495ae853SAndroid Build Coastguard Worker             }
151*495ae853SAndroid Build Coastguard Worker             pu1_prev_intra4x4_pred_mode_flag++;
152*495ae853SAndroid Build Coastguard Worker             pu1_rem_intra4x4_pred_mode++;
153*495ae853SAndroid Build Coastguard Worker         }
154*495ae853SAndroid Build Coastguard Worker     }
155*495ae853SAndroid Build Coastguard Worker     return (0);
156*495ae853SAndroid Build Coastguard Worker }
ih264d_unpack_coeff4x4_4x4blk(dec_struct_t * ps_dec,WORD16 * pi2_out_coeff_data,UWORD8 * pu1_inv_scan)157*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_unpack_coeff4x4_4x4blk(dec_struct_t * ps_dec,
158*495ae853SAndroid Build Coastguard Worker                                    WORD16 *pi2_out_coeff_data,
159*495ae853SAndroid Build Coastguard Worker                                    UWORD8 *pu1_inv_scan)
160*495ae853SAndroid Build Coastguard Worker {
161*495ae853SAndroid Build Coastguard Worker     tu_sblk4x4_coeff_data_t *ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_proc_tu_coeff_data;
162*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_sig_coeff_map = ps_tu_4x4->u2_sig_coeff_map;
163*495ae853SAndroid Build Coastguard Worker     WORD32 idx = 0;
164*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_coeff_data = &ps_tu_4x4->ai2_level[0];
165*495ae853SAndroid Build Coastguard Worker     WORD32 dc_only_flag = 0;
166*495ae853SAndroid Build Coastguard Worker     WORD32 num_coeff = 0;
167*495ae853SAndroid Build Coastguard Worker 
168*495ae853SAndroid Build Coastguard Worker     PROFILE_DISABLE_UNPACK_LUMA()
169*495ae853SAndroid Build Coastguard Worker     while(u2_sig_coeff_map)
170*495ae853SAndroid Build Coastguard Worker     {
171*495ae853SAndroid Build Coastguard Worker         idx = CLZ(u2_sig_coeff_map);
172*495ae853SAndroid Build Coastguard Worker 
173*495ae853SAndroid Build Coastguard Worker         idx = 31 - idx;
174*495ae853SAndroid Build Coastguard Worker         RESET_BIT(u2_sig_coeff_map,idx);
175*495ae853SAndroid Build Coastguard Worker 
176*495ae853SAndroid Build Coastguard Worker         idx = pu1_inv_scan[idx];
177*495ae853SAndroid Build Coastguard Worker         pi2_out_coeff_data[idx] = *pi2_coeff_data++;
178*495ae853SAndroid Build Coastguard Worker         num_coeff++;
179*495ae853SAndroid Build Coastguard Worker     }
180*495ae853SAndroid Build Coastguard Worker 
181*495ae853SAndroid Build Coastguard Worker     if((num_coeff == 1) && (idx == 0))
182*495ae853SAndroid Build Coastguard Worker     {
183*495ae853SAndroid Build Coastguard Worker         dc_only_flag = 1;
184*495ae853SAndroid Build Coastguard Worker     }
185*495ae853SAndroid Build Coastguard Worker 
186*495ae853SAndroid Build Coastguard Worker     {
187*495ae853SAndroid Build Coastguard Worker         WORD32 offset;
188*495ae853SAndroid Build Coastguard Worker         offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4;
189*495ae853SAndroid Build Coastguard Worker         offset = ALIGN4(offset);
190*495ae853SAndroid Build Coastguard Worker         ps_dec->pv_proc_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_proc_tu_coeff_data + offset);
191*495ae853SAndroid Build Coastguard Worker     }
192*495ae853SAndroid Build Coastguard Worker 
193*495ae853SAndroid Build Coastguard Worker     return dc_only_flag;
194*495ae853SAndroid Build Coastguard Worker }
195*495ae853SAndroid Build Coastguard Worker 
ih264d_unpack_coeff4x4_8x8blk(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD16 ui2_luma_csbp,WORD16 * pi2_out_coeff_data)196*495ae853SAndroid Build Coastguard Worker UWORD32 ih264d_unpack_coeff4x4_8x8blk(dec_struct_t * ps_dec,
197*495ae853SAndroid Build Coastguard Worker                                    dec_mb_info_t * ps_cur_mb_info,
198*495ae853SAndroid Build Coastguard Worker                                    UWORD16 ui2_luma_csbp,
199*495ae853SAndroid Build Coastguard Worker                                    WORD16 *pi2_out_coeff_data)
200*495ae853SAndroid Build Coastguard Worker {
201*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_inv_scan;
202*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
203*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_field_coding_flag = ps_cur_mb_info->ps_curmb->u1_mb_fld;
204*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_luma_dc_only_csbp = 0;
205*495ae853SAndroid Build Coastguard Worker     WORD32 dc_only_flag = 0;
206*495ae853SAndroid Build Coastguard Worker 
207*495ae853SAndroid Build Coastguard Worker     PROFILE_DISABLE_UNPACK_LUMA()
208*495ae853SAndroid Build Coastguard Worker     if(u1_field_coding_flag || u1_mb_field_decoding_flag)
209*495ae853SAndroid Build Coastguard Worker     {
210*495ae853SAndroid Build Coastguard Worker         pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld;
211*495ae853SAndroid Build Coastguard Worker     }
212*495ae853SAndroid Build Coastguard Worker     else
213*495ae853SAndroid Build Coastguard Worker     {
214*495ae853SAndroid Build Coastguard Worker         pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
215*495ae853SAndroid Build Coastguard Worker     }
216*495ae853SAndroid Build Coastguard Worker 
217*495ae853SAndroid Build Coastguard Worker     // sub 0
218*495ae853SAndroid Build Coastguard Worker     if(ui2_luma_csbp & 0x1)
219*495ae853SAndroid Build Coastguard Worker     {
220*495ae853SAndroid Build Coastguard Worker         memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
221*495ae853SAndroid Build Coastguard Worker         dc_only_flag = ih264d_unpack_coeff4x4_4x4blk(ps_dec,
222*495ae853SAndroid Build Coastguard Worker                                       pi2_out_coeff_data,
223*495ae853SAndroid Build Coastguard Worker                                       pu1_inv_scan);
224*495ae853SAndroid Build Coastguard Worker 
225*495ae853SAndroid Build Coastguard Worker         INSERT_BIT(u4_luma_dc_only_csbp, 0, dc_only_flag);
226*495ae853SAndroid Build Coastguard Worker     }
227*495ae853SAndroid Build Coastguard Worker 
228*495ae853SAndroid Build Coastguard Worker     pi2_out_coeff_data += 16;
229*495ae853SAndroid Build Coastguard Worker     // sub 1
230*495ae853SAndroid Build Coastguard Worker     if(ui2_luma_csbp & 0x2)
231*495ae853SAndroid Build Coastguard Worker     {
232*495ae853SAndroid Build Coastguard Worker         memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
233*495ae853SAndroid Build Coastguard Worker         dc_only_flag = ih264d_unpack_coeff4x4_4x4blk(ps_dec,
234*495ae853SAndroid Build Coastguard Worker                                       pi2_out_coeff_data,
235*495ae853SAndroid Build Coastguard Worker                                       pu1_inv_scan);
236*495ae853SAndroid Build Coastguard Worker         INSERT_BIT(u4_luma_dc_only_csbp, 1, dc_only_flag);
237*495ae853SAndroid Build Coastguard Worker     }
238*495ae853SAndroid Build Coastguard Worker 
239*495ae853SAndroid Build Coastguard Worker     pi2_out_coeff_data += 16 + 32;
240*495ae853SAndroid Build Coastguard Worker     // sub 2
241*495ae853SAndroid Build Coastguard Worker     if(ui2_luma_csbp & 0x10)
242*495ae853SAndroid Build Coastguard Worker     {
243*495ae853SAndroid Build Coastguard Worker         memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
244*495ae853SAndroid Build Coastguard Worker         dc_only_flag = ih264d_unpack_coeff4x4_4x4blk(ps_dec,
245*495ae853SAndroid Build Coastguard Worker                                       pi2_out_coeff_data,
246*495ae853SAndroid Build Coastguard Worker                                       pu1_inv_scan);
247*495ae853SAndroid Build Coastguard Worker         INSERT_BIT(u4_luma_dc_only_csbp, 4, dc_only_flag);
248*495ae853SAndroid Build Coastguard Worker     }
249*495ae853SAndroid Build Coastguard Worker 
250*495ae853SAndroid Build Coastguard Worker     pi2_out_coeff_data += 16;
251*495ae853SAndroid Build Coastguard Worker     // sub 3
252*495ae853SAndroid Build Coastguard Worker     if(ui2_luma_csbp & 0x20)
253*495ae853SAndroid Build Coastguard Worker     {
254*495ae853SAndroid Build Coastguard Worker         memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
255*495ae853SAndroid Build Coastguard Worker         dc_only_flag = ih264d_unpack_coeff4x4_4x4blk(ps_dec,
256*495ae853SAndroid Build Coastguard Worker                                       pi2_out_coeff_data,
257*495ae853SAndroid Build Coastguard Worker                                       pu1_inv_scan);
258*495ae853SAndroid Build Coastguard Worker         INSERT_BIT(u4_luma_dc_only_csbp, 5, dc_only_flag);
259*495ae853SAndroid Build Coastguard Worker     }
260*495ae853SAndroid Build Coastguard Worker     return u4_luma_dc_only_csbp;
261*495ae853SAndroid Build Coastguard Worker }
ih264d_unpack_coeff8x8_8x8blk_cavlc(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD16 ui2_luma_csbp,WORD16 * pi2_out_coeff_data)262*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_unpack_coeff8x8_8x8blk_cavlc(dec_struct_t * ps_dec,
263*495ae853SAndroid Build Coastguard Worker                                             dec_mb_info_t * ps_cur_mb_info,
264*495ae853SAndroid Build Coastguard Worker                                             UWORD16 ui2_luma_csbp,
265*495ae853SAndroid Build Coastguard Worker                                             WORD16 *pi2_out_coeff_data)
266*495ae853SAndroid Build Coastguard Worker {
267*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_inv_scan;
268*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
269*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_field_coding_flag = ps_cur_mb_info->ps_curmb->u1_mb_fld;
270*495ae853SAndroid Build Coastguard Worker     WORD32 dc_only_flag = 0;
271*495ae853SAndroid Build Coastguard Worker 
272*495ae853SAndroid Build Coastguard Worker     PROFILE_DISABLE_UNPACK_LUMA()
273*495ae853SAndroid Build Coastguard Worker     if(ui2_luma_csbp & 0x33)
274*495ae853SAndroid Build Coastguard Worker     {
275*495ae853SAndroid Build Coastguard Worker         memset(pi2_out_coeff_data,0,64*sizeof(WORD16));
276*495ae853SAndroid Build Coastguard Worker     }
277*495ae853SAndroid Build Coastguard Worker 
278*495ae853SAndroid Build Coastguard Worker     if(!u1_mb_field_decoding_flag)
279*495ae853SAndroid Build Coastguard Worker     {
280*495ae853SAndroid Build Coastguard Worker         pu1_inv_scan =
281*495ae853SAndroid Build Coastguard Worker                         (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0];
282*495ae853SAndroid Build Coastguard Worker     }
283*495ae853SAndroid Build Coastguard Worker     else
284*495ae853SAndroid Build Coastguard Worker     {
285*495ae853SAndroid Build Coastguard Worker         pu1_inv_scan =
286*495ae853SAndroid Build Coastguard Worker                         (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0];
287*495ae853SAndroid Build Coastguard Worker     }
288*495ae853SAndroid Build Coastguard Worker     // sub 0
289*495ae853SAndroid Build Coastguard Worker     if(ui2_luma_csbp & 0x1)
290*495ae853SAndroid Build Coastguard Worker     {
291*495ae853SAndroid Build Coastguard Worker         dc_only_flag = ih264d_unpack_coeff4x4_4x4blk(ps_dec,
292*495ae853SAndroid Build Coastguard Worker                                       pi2_out_coeff_data,
293*495ae853SAndroid Build Coastguard Worker                                       pu1_inv_scan);
294*495ae853SAndroid Build Coastguard Worker     }
295*495ae853SAndroid Build Coastguard Worker 
296*495ae853SAndroid Build Coastguard Worker     if(!u1_mb_field_decoding_flag)
297*495ae853SAndroid Build Coastguard Worker     {
298*495ae853SAndroid Build Coastguard Worker         pu1_inv_scan =
299*495ae853SAndroid Build Coastguard Worker                         (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1];
300*495ae853SAndroid Build Coastguard Worker     }
301*495ae853SAndroid Build Coastguard Worker     else
302*495ae853SAndroid Build Coastguard Worker     {
303*495ae853SAndroid Build Coastguard Worker         pu1_inv_scan =
304*495ae853SAndroid Build Coastguard Worker                         (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1];
305*495ae853SAndroid Build Coastguard Worker     }
306*495ae853SAndroid Build Coastguard Worker     // sub 1
307*495ae853SAndroid Build Coastguard Worker     if(ui2_luma_csbp & 0x2)
308*495ae853SAndroid Build Coastguard Worker     {
309*495ae853SAndroid Build Coastguard Worker         dc_only_flag = 0;
310*495ae853SAndroid Build Coastguard Worker         ih264d_unpack_coeff4x4_4x4blk(ps_dec,
311*495ae853SAndroid Build Coastguard Worker                                       pi2_out_coeff_data,
312*495ae853SAndroid Build Coastguard Worker                                       pu1_inv_scan);
313*495ae853SAndroid Build Coastguard Worker     }
314*495ae853SAndroid Build Coastguard Worker 
315*495ae853SAndroid Build Coastguard Worker     if(!u1_mb_field_decoding_flag)
316*495ae853SAndroid Build Coastguard Worker     {
317*495ae853SAndroid Build Coastguard Worker         pu1_inv_scan =
318*495ae853SAndroid Build Coastguard Worker                         (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2];
319*495ae853SAndroid Build Coastguard Worker     }
320*495ae853SAndroid Build Coastguard Worker     else
321*495ae853SAndroid Build Coastguard Worker     {
322*495ae853SAndroid Build Coastguard Worker         pu1_inv_scan =
323*495ae853SAndroid Build Coastguard Worker                         (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2];
324*495ae853SAndroid Build Coastguard Worker     }
325*495ae853SAndroid Build Coastguard Worker     // sub 2
326*495ae853SAndroid Build Coastguard Worker     if(ui2_luma_csbp & 0x10)
327*495ae853SAndroid Build Coastguard Worker     {
328*495ae853SAndroid Build Coastguard Worker         dc_only_flag = 0;
329*495ae853SAndroid Build Coastguard Worker         ih264d_unpack_coeff4x4_4x4blk(ps_dec,
330*495ae853SAndroid Build Coastguard Worker                                       pi2_out_coeff_data,
331*495ae853SAndroid Build Coastguard Worker                                       pu1_inv_scan);
332*495ae853SAndroid Build Coastguard Worker     }
333*495ae853SAndroid Build Coastguard Worker 
334*495ae853SAndroid Build Coastguard Worker     if(!u1_mb_field_decoding_flag)
335*495ae853SAndroid Build Coastguard Worker     {
336*495ae853SAndroid Build Coastguard Worker         pu1_inv_scan =
337*495ae853SAndroid Build Coastguard Worker                         (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3];
338*495ae853SAndroid Build Coastguard Worker     }
339*495ae853SAndroid Build Coastguard Worker     else
340*495ae853SAndroid Build Coastguard Worker     {
341*495ae853SAndroid Build Coastguard Worker         pu1_inv_scan =
342*495ae853SAndroid Build Coastguard Worker                         (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3];
343*495ae853SAndroid Build Coastguard Worker     }
344*495ae853SAndroid Build Coastguard Worker     // sub 3
345*495ae853SAndroid Build Coastguard Worker     if(ui2_luma_csbp & 0x20)
346*495ae853SAndroid Build Coastguard Worker     {
347*495ae853SAndroid Build Coastguard Worker         dc_only_flag = 0;
348*495ae853SAndroid Build Coastguard Worker         ih264d_unpack_coeff4x4_4x4blk(ps_dec,
349*495ae853SAndroid Build Coastguard Worker                                       pi2_out_coeff_data,
350*495ae853SAndroid Build Coastguard Worker                                       pu1_inv_scan);
351*495ae853SAndroid Build Coastguard Worker     }
352*495ae853SAndroid Build Coastguard Worker     return dc_only_flag;
353*495ae853SAndroid Build Coastguard Worker }
ih264d_unpack_coeff4x4_8x8blk_chroma(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD16 ui2_chroma_csbp,WORD16 * pi2_out_coeff_data)354*495ae853SAndroid Build Coastguard Worker void ih264d_unpack_coeff4x4_8x8blk_chroma(dec_struct_t * ps_dec,
355*495ae853SAndroid Build Coastguard Worker                                           dec_mb_info_t * ps_cur_mb_info,
356*495ae853SAndroid Build Coastguard Worker                                           UWORD16 ui2_chroma_csbp,
357*495ae853SAndroid Build Coastguard Worker                                           WORD16 *pi2_out_coeff_data)
358*495ae853SAndroid Build Coastguard Worker {
359*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_inv_scan;
360*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
361*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_field_coding_flag = ps_cur_mb_info->ps_curmb->u1_mb_fld;
362*495ae853SAndroid Build Coastguard Worker 
363*495ae853SAndroid Build Coastguard Worker     PROFILE_DISABLE_UNPACK_CHROMA()
364*495ae853SAndroid Build Coastguard Worker     if(u1_field_coding_flag || u1_mb_field_decoding_flag)
365*495ae853SAndroid Build Coastguard Worker     {
366*495ae853SAndroid Build Coastguard Worker         pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld;
367*495ae853SAndroid Build Coastguard Worker     }
368*495ae853SAndroid Build Coastguard Worker     else
369*495ae853SAndroid Build Coastguard Worker     {
370*495ae853SAndroid Build Coastguard Worker         pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
371*495ae853SAndroid Build Coastguard Worker     }
372*495ae853SAndroid Build Coastguard Worker 
373*495ae853SAndroid Build Coastguard Worker     if(ui2_chroma_csbp & 0x1)
374*495ae853SAndroid Build Coastguard Worker     {
375*495ae853SAndroid Build Coastguard Worker         memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
376*495ae853SAndroid Build Coastguard Worker         ih264d_unpack_coeff4x4_4x4blk(ps_dec,
377*495ae853SAndroid Build Coastguard Worker                                       pi2_out_coeff_data,
378*495ae853SAndroid Build Coastguard Worker                                       pu1_inv_scan);
379*495ae853SAndroid Build Coastguard Worker     }
380*495ae853SAndroid Build Coastguard Worker     pi2_out_coeff_data += 16;
381*495ae853SAndroid Build Coastguard Worker     if(ui2_chroma_csbp & 0x2)
382*495ae853SAndroid Build Coastguard Worker     {
383*495ae853SAndroid Build Coastguard Worker         memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
384*495ae853SAndroid Build Coastguard Worker         ih264d_unpack_coeff4x4_4x4blk(ps_dec,
385*495ae853SAndroid Build Coastguard Worker                                       pi2_out_coeff_data,
386*495ae853SAndroid Build Coastguard Worker                                       pu1_inv_scan);
387*495ae853SAndroid Build Coastguard Worker     }
388*495ae853SAndroid Build Coastguard Worker 
389*495ae853SAndroid Build Coastguard Worker     pi2_out_coeff_data += 16;
390*495ae853SAndroid Build Coastguard Worker     if(ui2_chroma_csbp & 0x4)
391*495ae853SAndroid Build Coastguard Worker     {
392*495ae853SAndroid Build Coastguard Worker         memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
393*495ae853SAndroid Build Coastguard Worker         ih264d_unpack_coeff4x4_4x4blk(ps_dec,
394*495ae853SAndroid Build Coastguard Worker                                       pi2_out_coeff_data,
395*495ae853SAndroid Build Coastguard Worker                                       pu1_inv_scan);
396*495ae853SAndroid Build Coastguard Worker     }
397*495ae853SAndroid Build Coastguard Worker 
398*495ae853SAndroid Build Coastguard Worker     pi2_out_coeff_data += 16;
399*495ae853SAndroid Build Coastguard Worker     if(ui2_chroma_csbp & 0x8)
400*495ae853SAndroid Build Coastguard Worker     {
401*495ae853SAndroid Build Coastguard Worker         memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
402*495ae853SAndroid Build Coastguard Worker         ih264d_unpack_coeff4x4_4x4blk(ps_dec,
403*495ae853SAndroid Build Coastguard Worker                                       pi2_out_coeff_data,
404*495ae853SAndroid Build Coastguard Worker                                       pu1_inv_scan);
405*495ae853SAndroid Build Coastguard Worker     }
406*495ae853SAndroid Build Coastguard Worker }
ih264d_unpack_luma_coeff4x4_mb(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 intra_flag)407*495ae853SAndroid Build Coastguard Worker UWORD32 ih264d_unpack_luma_coeff4x4_mb(dec_struct_t * ps_dec,
408*495ae853SAndroid Build Coastguard Worker                                     dec_mb_info_t * ps_cur_mb_info,
409*495ae853SAndroid Build Coastguard Worker                                     UWORD8 intra_flag)
410*495ae853SAndroid Build Coastguard Worker {
411*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
412*495ae853SAndroid Build Coastguard Worker     UWORD16 ui2_luma_csbp = ps_cur_mb_info->u2_luma_csbp;
413*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_inv_scan = ps_dec->pu1_inv_scan;
414*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_coeff_data = ps_dec->pi2_coeff_data;
415*495ae853SAndroid Build Coastguard Worker 
416*495ae853SAndroid Build Coastguard Worker     PROFILE_DISABLE_UNPACK_LUMA()
417*495ae853SAndroid Build Coastguard Worker     if(!ps_cur_mb_info->u1_tran_form8x8)
418*495ae853SAndroid Build Coastguard Worker     {
419*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_luma_dc_only_csbp = 0;
420*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_temp = 0;
421*495ae853SAndroid Build Coastguard Worker         WORD16* pi2_dc_val = NULL;
422*495ae853SAndroid Build Coastguard Worker         /*
423*495ae853SAndroid Build Coastguard Worker          * Reserve the pointer to dc vals. The dc vals will be copied
424*495ae853SAndroid Build Coastguard Worker          * after unpacking of ac vals since memset to 0 inside.
425*495ae853SAndroid Build Coastguard Worker          */
426*495ae853SAndroid Build Coastguard Worker         if(intra_flag && (u1_mb_type != I_4x4_MB))
427*495ae853SAndroid Build Coastguard Worker         {
428*495ae853SAndroid Build Coastguard Worker             if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag,0))
429*495ae853SAndroid Build Coastguard Worker             {
430*495ae853SAndroid Build Coastguard Worker                 pi2_dc_val = (WORD16 *)ps_dec->pv_proc_tu_coeff_data;
431*495ae853SAndroid Build Coastguard Worker 
432*495ae853SAndroid Build Coastguard Worker                 ps_dec->pv_proc_tu_coeff_data = (void *)(pi2_dc_val + 16);
433*495ae853SAndroid Build Coastguard Worker             }
434*495ae853SAndroid Build Coastguard Worker         }
435*495ae853SAndroid Build Coastguard Worker 
436*495ae853SAndroid Build Coastguard Worker         if(ui2_luma_csbp)
437*495ae853SAndroid Build Coastguard Worker         {
438*495ae853SAndroid Build Coastguard Worker             pi2_coeff_data = ps_dec->pi2_coeff_data;
439*495ae853SAndroid Build Coastguard Worker             u4_temp = ih264d_unpack_coeff4x4_8x8blk(ps_dec,
440*495ae853SAndroid Build Coastguard Worker                                           ps_cur_mb_info,
441*495ae853SAndroid Build Coastguard Worker                                           ui2_luma_csbp,
442*495ae853SAndroid Build Coastguard Worker                                           pi2_coeff_data);
443*495ae853SAndroid Build Coastguard Worker             u4_luma_dc_only_csbp = u4_temp;
444*495ae853SAndroid Build Coastguard Worker 
445*495ae853SAndroid Build Coastguard Worker             pi2_coeff_data += 32;
446*495ae853SAndroid Build Coastguard Worker 
447*495ae853SAndroid Build Coastguard Worker             ui2_luma_csbp = ui2_luma_csbp >> 2;
448*495ae853SAndroid Build Coastguard Worker             u4_temp = ih264d_unpack_coeff4x4_8x8blk(ps_dec,
449*495ae853SAndroid Build Coastguard Worker                                           ps_cur_mb_info,
450*495ae853SAndroid Build Coastguard Worker                                           ui2_luma_csbp,
451*495ae853SAndroid Build Coastguard Worker                                           pi2_coeff_data);
452*495ae853SAndroid Build Coastguard Worker 
453*495ae853SAndroid Build Coastguard Worker             u4_luma_dc_only_csbp |= (u4_temp << 2);
454*495ae853SAndroid Build Coastguard Worker 
455*495ae853SAndroid Build Coastguard Worker             pi2_coeff_data += 32 + 64;
456*495ae853SAndroid Build Coastguard Worker 
457*495ae853SAndroid Build Coastguard Worker             ui2_luma_csbp = ui2_luma_csbp >> 6;
458*495ae853SAndroid Build Coastguard Worker             u4_temp = ih264d_unpack_coeff4x4_8x8blk(ps_dec,
459*495ae853SAndroid Build Coastguard Worker                                           ps_cur_mb_info,
460*495ae853SAndroid Build Coastguard Worker                                           ui2_luma_csbp,
461*495ae853SAndroid Build Coastguard Worker                                           pi2_coeff_data);
462*495ae853SAndroid Build Coastguard Worker 
463*495ae853SAndroid Build Coastguard Worker             u4_luma_dc_only_csbp |= (u4_temp << 8);
464*495ae853SAndroid Build Coastguard Worker 
465*495ae853SAndroid Build Coastguard Worker             pi2_coeff_data += 32;
466*495ae853SAndroid Build Coastguard Worker 
467*495ae853SAndroid Build Coastguard Worker             ui2_luma_csbp = ui2_luma_csbp >> 2;
468*495ae853SAndroid Build Coastguard Worker             u4_temp = ih264d_unpack_coeff4x4_8x8blk(ps_dec,
469*495ae853SAndroid Build Coastguard Worker                                           ps_cur_mb_info,
470*495ae853SAndroid Build Coastguard Worker                                           ui2_luma_csbp,
471*495ae853SAndroid Build Coastguard Worker                                           pi2_coeff_data);
472*495ae853SAndroid Build Coastguard Worker             u4_luma_dc_only_csbp |= (u4_temp << 10);
473*495ae853SAndroid Build Coastguard Worker         }
474*495ae853SAndroid Build Coastguard Worker 
475*495ae853SAndroid Build Coastguard Worker         if(pi2_dc_val != NULL)
476*495ae853SAndroid Build Coastguard Worker         {
477*495ae853SAndroid Build Coastguard Worker             WORD32 i;
478*495ae853SAndroid Build Coastguard Worker             pi2_coeff_data = ps_dec->pi2_coeff_data;
479*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < 4; i++)
480*495ae853SAndroid Build Coastguard Worker             {
481*495ae853SAndroid Build Coastguard Worker                 pi2_coeff_data[0] = pi2_dc_val[0];
482*495ae853SAndroid Build Coastguard Worker                 pi2_coeff_data[4 * 16] = pi2_dc_val[4];
483*495ae853SAndroid Build Coastguard Worker                 pi2_coeff_data[8 * 16] = pi2_dc_val[8];
484*495ae853SAndroid Build Coastguard Worker                 pi2_coeff_data[12 * 16] = pi2_dc_val[12];
485*495ae853SAndroid Build Coastguard Worker 
486*495ae853SAndroid Build Coastguard Worker                 pi2_dc_val++; /* Point to next column */
487*495ae853SAndroid Build Coastguard Worker                 pi2_coeff_data += 16;
488*495ae853SAndroid Build Coastguard Worker             }
489*495ae853SAndroid Build Coastguard Worker             u4_luma_dc_only_csbp = ps_cur_mb_info->u2_luma_csbp ^ 0xFFFF;
490*495ae853SAndroid Build Coastguard Worker         }
491*495ae853SAndroid Build Coastguard Worker         return u4_luma_dc_only_csbp;
492*495ae853SAndroid Build Coastguard Worker     }
493*495ae853SAndroid Build Coastguard Worker     else
494*495ae853SAndroid Build Coastguard Worker     {
495*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_luma_dc_only_cbp = 0;
496*495ae853SAndroid Build Coastguard Worker         WORD32 dc_only_flag;
497*495ae853SAndroid Build Coastguard Worker         if(ui2_luma_csbp)
498*495ae853SAndroid Build Coastguard Worker         {
499*495ae853SAndroid Build Coastguard Worker             pi2_coeff_data = ps_dec->pi2_coeff_data;
500*495ae853SAndroid Build Coastguard Worker             dc_only_flag = ih264d_unpack_coeff8x8_8x8blk_cavlc(ps_dec,
501*495ae853SAndroid Build Coastguard Worker                                           ps_cur_mb_info,
502*495ae853SAndroid Build Coastguard Worker                                           ui2_luma_csbp,
503*495ae853SAndroid Build Coastguard Worker                                           pi2_coeff_data);
504*495ae853SAndroid Build Coastguard Worker             INSERT_BIT(u4_luma_dc_only_cbp, 0, dc_only_flag);
505*495ae853SAndroid Build Coastguard Worker 
506*495ae853SAndroid Build Coastguard Worker             pi2_coeff_data += 64;
507*495ae853SAndroid Build Coastguard Worker 
508*495ae853SAndroid Build Coastguard Worker             ui2_luma_csbp = ui2_luma_csbp >> 2;
509*495ae853SAndroid Build Coastguard Worker             dc_only_flag = ih264d_unpack_coeff8x8_8x8blk_cavlc(ps_dec,
510*495ae853SAndroid Build Coastguard Worker                                           ps_cur_mb_info,
511*495ae853SAndroid Build Coastguard Worker                                           ui2_luma_csbp,
512*495ae853SAndroid Build Coastguard Worker                                           pi2_coeff_data);
513*495ae853SAndroid Build Coastguard Worker 
514*495ae853SAndroid Build Coastguard Worker             INSERT_BIT(u4_luma_dc_only_cbp, 1, dc_only_flag);
515*495ae853SAndroid Build Coastguard Worker 
516*495ae853SAndroid Build Coastguard Worker             pi2_coeff_data += 64;
517*495ae853SAndroid Build Coastguard Worker 
518*495ae853SAndroid Build Coastguard Worker             ui2_luma_csbp = ui2_luma_csbp >> 6;
519*495ae853SAndroid Build Coastguard Worker             dc_only_flag = ih264d_unpack_coeff8x8_8x8blk_cavlc(ps_dec,
520*495ae853SAndroid Build Coastguard Worker                                           ps_cur_mb_info,
521*495ae853SAndroid Build Coastguard Worker                                           ui2_luma_csbp,
522*495ae853SAndroid Build Coastguard Worker                                           pi2_coeff_data);
523*495ae853SAndroid Build Coastguard Worker 
524*495ae853SAndroid Build Coastguard Worker             INSERT_BIT(u4_luma_dc_only_cbp, 2, dc_only_flag);
525*495ae853SAndroid Build Coastguard Worker 
526*495ae853SAndroid Build Coastguard Worker             pi2_coeff_data += 64;
527*495ae853SAndroid Build Coastguard Worker             ui2_luma_csbp = ui2_luma_csbp >> 2;
528*495ae853SAndroid Build Coastguard Worker             dc_only_flag = ih264d_unpack_coeff8x8_8x8blk_cavlc(ps_dec,
529*495ae853SAndroid Build Coastguard Worker                                           ps_cur_mb_info,
530*495ae853SAndroid Build Coastguard Worker                                           ui2_luma_csbp,
531*495ae853SAndroid Build Coastguard Worker                                           pi2_coeff_data);
532*495ae853SAndroid Build Coastguard Worker             INSERT_BIT(u4_luma_dc_only_cbp, 3, dc_only_flag);
533*495ae853SAndroid Build Coastguard Worker         }
534*495ae853SAndroid Build Coastguard Worker         return u4_luma_dc_only_cbp;
535*495ae853SAndroid Build Coastguard Worker     }
536*495ae853SAndroid Build Coastguard Worker 
537*495ae853SAndroid Build Coastguard Worker }
538*495ae853SAndroid Build Coastguard Worker 
ih264d_unpack_chroma_coeff4x4_mb(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info)539*495ae853SAndroid Build Coastguard Worker void ih264d_unpack_chroma_coeff4x4_mb(dec_struct_t * ps_dec,
540*495ae853SAndroid Build Coastguard Worker                                       dec_mb_info_t * ps_cur_mb_info)
541*495ae853SAndroid Build Coastguard Worker {
542*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
543*495ae853SAndroid Build Coastguard Worker     UWORD16 ui2_chroma_csbp = ps_cur_mb_info->u2_chroma_csbp;
544*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_inv_scan = ps_dec->pu1_inv_scan;
545*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_coeff_data = ps_dec->pi2_coeff_data;
546*495ae853SAndroid Build Coastguard Worker     WORD32 i;
547*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_dc_val_u = NULL;
548*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_dc_val_v = NULL;
549*495ae853SAndroid Build Coastguard Worker 
550*495ae853SAndroid Build Coastguard Worker     PROFILE_DISABLE_UNPACK_CHROMA()
551*495ae853SAndroid Build Coastguard Worker     if((ps_cur_mb_info->u1_cbp >> 4) == CBPC_ALLZERO)
552*495ae853SAndroid Build Coastguard Worker         return;
553*495ae853SAndroid Build Coastguard Worker 
554*495ae853SAndroid Build Coastguard Worker     /*
555*495ae853SAndroid Build Coastguard Worker      * Reserve the pointers to dc vals. The dc vals will be copied
556*495ae853SAndroid Build Coastguard Worker      * after unpacking of ac vals since memset to 0 inside.
557*495ae853SAndroid Build Coastguard Worker      */
558*495ae853SAndroid Build Coastguard Worker     if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag,1))
559*495ae853SAndroid Build Coastguard Worker     {
560*495ae853SAndroid Build Coastguard Worker         pi2_dc_val_u = (WORD16 *)ps_dec->pv_proc_tu_coeff_data;
561*495ae853SAndroid Build Coastguard Worker 
562*495ae853SAndroid Build Coastguard Worker         ps_dec->pv_proc_tu_coeff_data = (void *)(pi2_dc_val_u + 4);
563*495ae853SAndroid Build Coastguard Worker     }
564*495ae853SAndroid Build Coastguard Worker     if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag,2))
565*495ae853SAndroid Build Coastguard Worker     {
566*495ae853SAndroid Build Coastguard Worker         pi2_dc_val_v = (WORD16 *)ps_dec->pv_proc_tu_coeff_data;
567*495ae853SAndroid Build Coastguard Worker 
568*495ae853SAndroid Build Coastguard Worker         ps_dec->pv_proc_tu_coeff_data = (void *)(pi2_dc_val_v + 4);
569*495ae853SAndroid Build Coastguard Worker     }
570*495ae853SAndroid Build Coastguard Worker 
571*495ae853SAndroid Build Coastguard Worker     if((ps_cur_mb_info->u1_cbp >> 4) == CBPC_NONZERO)
572*495ae853SAndroid Build Coastguard Worker     {
573*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data = ps_dec->pi2_coeff_data;
574*495ae853SAndroid Build Coastguard Worker         ih264d_unpack_coeff4x4_8x8blk_chroma(ps_dec,
575*495ae853SAndroid Build Coastguard Worker                                              ps_cur_mb_info,
576*495ae853SAndroid Build Coastguard Worker                                              ui2_chroma_csbp,
577*495ae853SAndroid Build Coastguard Worker                                              pi2_coeff_data);
578*495ae853SAndroid Build Coastguard Worker 
579*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data += 64;
580*495ae853SAndroid Build Coastguard Worker         ui2_chroma_csbp = ui2_chroma_csbp >> 4;
581*495ae853SAndroid Build Coastguard Worker         ih264d_unpack_coeff4x4_8x8blk_chroma(ps_dec,
582*495ae853SAndroid Build Coastguard Worker                                              ps_cur_mb_info,
583*495ae853SAndroid Build Coastguard Worker                                              ui2_chroma_csbp,
584*495ae853SAndroid Build Coastguard Worker                                              pi2_coeff_data);
585*495ae853SAndroid Build Coastguard Worker 
586*495ae853SAndroid Build Coastguard Worker     }
587*495ae853SAndroid Build Coastguard Worker 
588*495ae853SAndroid Build Coastguard Worker     pi2_coeff_data = ps_dec->pi2_coeff_data;
589*495ae853SAndroid Build Coastguard Worker     if(pi2_dc_val_u != NULL)
590*495ae853SAndroid Build Coastguard Worker     {
591*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data[0] = *pi2_dc_val_u++;
592*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data[1 * 16] = *pi2_dc_val_u++;
593*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data[2 * 16] = *pi2_dc_val_u++;
594*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data[3 * 16] = *pi2_dc_val_u++;
595*495ae853SAndroid Build Coastguard Worker     }
596*495ae853SAndroid Build Coastguard Worker     else
597*495ae853SAndroid Build Coastguard Worker     {
598*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data[0] = 0;
599*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data[1 * 16] = 0;
600*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data[2 * 16] = 0;
601*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data[3 * 16] = 0;
602*495ae853SAndroid Build Coastguard Worker     }
603*495ae853SAndroid Build Coastguard Worker     pi2_coeff_data += 64;
604*495ae853SAndroid Build Coastguard Worker     if(pi2_dc_val_v != NULL)
605*495ae853SAndroid Build Coastguard Worker     {
606*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data[0] = *pi2_dc_val_v++;
607*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data[1 * 16] = *pi2_dc_val_v++;
608*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data[2 * 16] = *pi2_dc_val_v++;
609*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data[3 * 16] = *pi2_dc_val_v++;
610*495ae853SAndroid Build Coastguard Worker     }
611*495ae853SAndroid Build Coastguard Worker     else
612*495ae853SAndroid Build Coastguard Worker     {
613*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data[0] = 0;
614*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data[1 * 16] = 0;
615*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data[2 * 16] = 0;
616*495ae853SAndroid Build Coastguard Worker         pi2_coeff_data[3 * 16] = 0;
617*495ae853SAndroid Build Coastguard Worker     }
618*495ae853SAndroid Build Coastguard Worker }
ih264d_unpack_luma_coeff8x8_mb(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info)619*495ae853SAndroid Build Coastguard Worker UWORD32 ih264d_unpack_luma_coeff8x8_mb(dec_struct_t * ps_dec,
620*495ae853SAndroid Build Coastguard Worker                                     dec_mb_info_t * ps_cur_mb_info)
621*495ae853SAndroid Build Coastguard Worker {
622*495ae853SAndroid Build Coastguard Worker     WORD32 blk_8x8_cnt;
623*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_out_coeff_data = ps_dec->pi2_coeff_data;
624*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_field_coding_flag = ps_cur_mb_info->ps_curmb->u1_mb_fld;
625*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_inv_scan;
626*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_luma_dc_only_cbp = 0;
627*495ae853SAndroid Build Coastguard Worker 
628*495ae853SAndroid Build Coastguard Worker     PROFILE_DISABLE_UNPACK_LUMA()
629*495ae853SAndroid Build Coastguard Worker     if(!u1_field_coding_flag)
630*495ae853SAndroid Build Coastguard Worker     {
631*495ae853SAndroid Build Coastguard Worker         /*******************************************************************/
632*495ae853SAndroid Build Coastguard Worker         /* initializing inverse scan  matrices                             */
633*495ae853SAndroid Build Coastguard Worker         /*******************************************************************/
634*495ae853SAndroid Build Coastguard Worker         pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_prog8x8_cabac;
635*495ae853SAndroid Build Coastguard Worker     }
636*495ae853SAndroid Build Coastguard Worker     else
637*495ae853SAndroid Build Coastguard Worker     {
638*495ae853SAndroid Build Coastguard Worker         /*******************************************************************/
639*495ae853SAndroid Build Coastguard Worker         /* initializing inverse scan  matrices                             */
640*495ae853SAndroid Build Coastguard Worker         /*******************************************************************/
641*495ae853SAndroid Build Coastguard Worker         pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_int8x8_cabac;
642*495ae853SAndroid Build Coastguard Worker     }
643*495ae853SAndroid Build Coastguard Worker 
644*495ae853SAndroid Build Coastguard Worker     for(blk_8x8_cnt = 0; blk_8x8_cnt < 4; blk_8x8_cnt++)
645*495ae853SAndroid Build Coastguard Worker     {
646*495ae853SAndroid Build Coastguard Worker         if(CHECKBIT(ps_cur_mb_info->u1_cbp, blk_8x8_cnt))
647*495ae853SAndroid Build Coastguard Worker         {
648*495ae853SAndroid Build Coastguard Worker             tu_blk8x8_coeff_data_t *ps_tu_8x8 = (tu_blk8x8_coeff_data_t *)ps_dec->pv_proc_tu_coeff_data;
649*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_sig_coeff_map;
650*495ae853SAndroid Build Coastguard Worker             WORD32 idx = 0;
651*495ae853SAndroid Build Coastguard Worker             WORD16 *pi2_coeff_data = &ps_tu_8x8->ai2_level[0];
652*495ae853SAndroid Build Coastguard Worker             WORD32 num_coeff = 0;
653*495ae853SAndroid Build Coastguard Worker 
654*495ae853SAndroid Build Coastguard Worker             /* memset 64 coefficient to zero */
655*495ae853SAndroid Build Coastguard Worker             memset(pi2_out_coeff_data,0,64*sizeof(WORD16));
656*495ae853SAndroid Build Coastguard Worker 
657*495ae853SAndroid Build Coastguard Worker             u4_sig_coeff_map = ps_tu_8x8->au4_sig_coeff_map[1];
658*495ae853SAndroid Build Coastguard Worker 
659*495ae853SAndroid Build Coastguard Worker             while(u4_sig_coeff_map)
660*495ae853SAndroid Build Coastguard Worker             {
661*495ae853SAndroid Build Coastguard Worker                 idx = CLZ(u4_sig_coeff_map);
662*495ae853SAndroid Build Coastguard Worker 
663*495ae853SAndroid Build Coastguard Worker                 idx = 31 - idx;
664*495ae853SAndroid Build Coastguard Worker                 RESET_BIT(u4_sig_coeff_map,idx);
665*495ae853SAndroid Build Coastguard Worker 
666*495ae853SAndroid Build Coastguard Worker                 idx = pu1_inv_scan[idx + 32];
667*495ae853SAndroid Build Coastguard Worker                 pi2_out_coeff_data[idx] = *pi2_coeff_data++;
668*495ae853SAndroid Build Coastguard Worker                 num_coeff++;
669*495ae853SAndroid Build Coastguard Worker             }
670*495ae853SAndroid Build Coastguard Worker 
671*495ae853SAndroid Build Coastguard Worker             u4_sig_coeff_map = ps_tu_8x8->au4_sig_coeff_map[0];
672*495ae853SAndroid Build Coastguard Worker             while(u4_sig_coeff_map)
673*495ae853SAndroid Build Coastguard Worker             {
674*495ae853SAndroid Build Coastguard Worker                 idx = CLZ(u4_sig_coeff_map);
675*495ae853SAndroid Build Coastguard Worker 
676*495ae853SAndroid Build Coastguard Worker                 idx = 31 - idx;
677*495ae853SAndroid Build Coastguard Worker                 RESET_BIT(u4_sig_coeff_map,idx);
678*495ae853SAndroid Build Coastguard Worker 
679*495ae853SAndroid Build Coastguard Worker                 idx = pu1_inv_scan[idx];
680*495ae853SAndroid Build Coastguard Worker                 pi2_out_coeff_data[idx] = *pi2_coeff_data++;
681*495ae853SAndroid Build Coastguard Worker                 num_coeff++;
682*495ae853SAndroid Build Coastguard Worker             }
683*495ae853SAndroid Build Coastguard Worker 
684*495ae853SAndroid Build Coastguard Worker             if((num_coeff == 1) && (idx == 0))
685*495ae853SAndroid Build Coastguard Worker             {
686*495ae853SAndroid Build Coastguard Worker                 SET_BIT(u4_luma_dc_only_cbp,blk_8x8_cnt);
687*495ae853SAndroid Build Coastguard Worker             }
688*495ae853SAndroid Build Coastguard Worker 
689*495ae853SAndroid Build Coastguard Worker 
690*495ae853SAndroid Build Coastguard Worker             {
691*495ae853SAndroid Build Coastguard Worker                 WORD32 offset;
692*495ae853SAndroid Build Coastguard Worker                 offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_8x8;
693*495ae853SAndroid Build Coastguard Worker                 offset = ALIGN4(offset);
694*495ae853SAndroid Build Coastguard Worker                 ps_dec->pv_proc_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_proc_tu_coeff_data + offset);
695*495ae853SAndroid Build Coastguard Worker             }
696*495ae853SAndroid Build Coastguard Worker         }
697*495ae853SAndroid Build Coastguard Worker         pi2_out_coeff_data += 64;
698*495ae853SAndroid Build Coastguard Worker     }
699*495ae853SAndroid Build Coastguard Worker 
700*495ae853SAndroid Build Coastguard Worker     return u4_luma_dc_only_cbp;
701*495ae853SAndroid Build Coastguard Worker }
702*495ae853SAndroid Build Coastguard Worker /*!
703*495ae853SAndroid Build Coastguard Worker  **************************************************************************
704*495ae853SAndroid Build Coastguard Worker  * \if Function name : ih264d_process_intra_mb \endif
705*495ae853SAndroid Build Coastguard Worker  *
706*495ae853SAndroid Build Coastguard Worker  * \brief
707*495ae853SAndroid Build Coastguard Worker  *    This function decodes an I MB. Intraprediction is carried out followed
708*495ae853SAndroid Build Coastguard Worker  *    by InvTramsform. Both IntraPrediction and Reconstrucion are carried out
709*495ae853SAndroid Build Coastguard Worker  *    row buffer itself.
710*495ae853SAndroid Build Coastguard Worker  *
711*495ae853SAndroid Build Coastguard Worker  *
712*495ae853SAndroid Build Coastguard Worker  * \return
713*495ae853SAndroid Build Coastguard Worker  *    0 on Success and Error code otherwise
714*495ae853SAndroid Build Coastguard Worker  **************************************************************************
715*495ae853SAndroid Build Coastguard Worker  */
ih264d_process_intra_mb(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_mb_num)716*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_process_intra_mb(dec_struct_t * ps_dec,
717*495ae853SAndroid Build Coastguard Worker                                dec_mb_info_t * ps_cur_mb_info,
718*495ae853SAndroid Build Coastguard Worker                                UWORD8 u1_mb_num)
719*495ae853SAndroid Build Coastguard Worker {
720*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
721*495ae853SAndroid Build Coastguard Worker     UWORD8 uc_temp = ps_cur_mb_info->u1_mb_ngbr_availablity;
722*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_top_available = BOOLEAN(uc_temp & TOP_MB_AVAILABLE_MASK);
723*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_left_available = BOOLEAN(uc_temp & LEFT_MB_AVAILABLE_MASK);
724*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_use_top_right_mb = BOOLEAN(uc_temp & TOP_RIGHT_MB_AVAILABLE_MASK);
725*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_use_top_left_mb = BOOLEAN(uc_temp & TOP_LEFT_MB_AVAILABLE_MASK);
726*495ae853SAndroid Build Coastguard Worker     UWORD8 uc_useTopMB = u1_top_available;
727*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_use_left_mb = u1_left_available;
728*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_use_left_mb_pack;
729*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_luma_pred_buffer;
730*495ae853SAndroid Build Coastguard Worker     /* CHANGED CODE */
731*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_luma_rec_buffer;
732*495ae853SAndroid Build Coastguard Worker     UWORD8 *puc_top;
733*495ae853SAndroid Build Coastguard Worker 
734*495ae853SAndroid Build Coastguard Worker     mb_neigbour_params_t *ps_left_mb;
735*495ae853SAndroid Build Coastguard Worker     mb_neigbour_params_t *ps_top_mb;
736*495ae853SAndroid Build Coastguard Worker     mb_neigbour_params_t *ps_top_right_mb;
737*495ae853SAndroid Build Coastguard Worker     mb_neigbour_params_t *ps_curmb;
738*495ae853SAndroid Build Coastguard Worker 
739*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_mbx = ps_cur_mb_info->u2_mbx;
740*495ae853SAndroid Build Coastguard Worker     UWORD32 ui_pred_width, ui_rec_width;
741*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_y_coeff;
742*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_mbaff, u1_topmb, u1_mb_field_decoding_flag;
743*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_num_pmbair;
744*495ae853SAndroid Build Coastguard Worker     UWORD16 ui2_luma_csbp = ps_cur_mb_info->u2_luma_csbp;
745*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_yleft, *pu1_ytop_left;
746*495ae853SAndroid Build Coastguard Worker     /* Chroma variables*/
747*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_top_u;
748*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_uleft;
749*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_u_top_left;
750*495ae853SAndroid Build Coastguard Worker     /* CHANGED CODE */
751*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_mb_cb_rei1_buffer, *pu1_mb_cr_rei1_buffer;
752*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_recwidth_cr;
753*495ae853SAndroid Build Coastguard Worker     /* CHANGED CODE */
754*495ae853SAndroid Build Coastguard Worker     tfr_ctxt_t *ps_frame_buf = ps_dec->ps_frame_buf_ip_recon;
755*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_luma_dc_only_csbp = 0;
756*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_luma_dc_only_cbp = 0;
757*495ae853SAndroid Build Coastguard Worker 
758*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_prev_intra4x4_pred_mode_data = (UWORD8 *)ps_dec->pv_proc_tu_coeff_data;                 //Pointer to keep track of intra4x4_pred_mode data in pv_proc_tu_coeff_data buffer
759*495ae853SAndroid Build Coastguard Worker     u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
760*495ae853SAndroid Build Coastguard Worker     u1_topmb = ps_cur_mb_info->u1_topmb;
761*495ae853SAndroid Build Coastguard Worker     u4_num_pmbair = (u1_mb_num >> u1_mbaff);
762*495ae853SAndroid Build Coastguard Worker 
763*495ae853SAndroid Build Coastguard Worker 
764*495ae853SAndroid Build Coastguard Worker     /*--------------------------------------------------------------------*/
765*495ae853SAndroid Build Coastguard Worker     /* Find the current MB's mb params                                    */
766*495ae853SAndroid Build Coastguard Worker     /*--------------------------------------------------------------------*/
767*495ae853SAndroid Build Coastguard Worker     u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
768*495ae853SAndroid Build Coastguard Worker 
769*495ae853SAndroid Build Coastguard Worker     ps_curmb = ps_cur_mb_info->ps_curmb;
770*495ae853SAndroid Build Coastguard Worker     ps_top_mb = ps_cur_mb_info->ps_top_mb;
771*495ae853SAndroid Build Coastguard Worker     ps_left_mb = ps_cur_mb_info->ps_left_mb;
772*495ae853SAndroid Build Coastguard Worker     ps_top_right_mb = ps_cur_mb_info->ps_top_right_mb;
773*495ae853SAndroid Build Coastguard Worker 
774*495ae853SAndroid Build Coastguard Worker     /*--------------------------------------------------------------------*/
775*495ae853SAndroid Build Coastguard Worker     /* Check whether neighbouring MB is Inter MB and                      */
776*495ae853SAndroid Build Coastguard Worker     /* constrained intra pred is 1.                                       */
777*495ae853SAndroid Build Coastguard Worker     /*--------------------------------------------------------------------*/
778*495ae853SAndroid Build Coastguard Worker     u2_use_left_mb_pack = (u2_use_left_mb << 8) + u2_use_left_mb;
779*495ae853SAndroid Build Coastguard Worker 
780*495ae853SAndroid Build Coastguard Worker     if(ps_dec->ps_cur_pps->u1_constrained_intra_pred_flag)
781*495ae853SAndroid Build Coastguard Worker     {
782*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_left = (UWORD8)u2_use_left_mb;
783*495ae853SAndroid Build Coastguard Worker 
784*495ae853SAndroid Build Coastguard Worker         uc_useTopMB = uc_useTopMB
785*495ae853SAndroid Build Coastguard Worker                         && ((ps_top_mb->u1_mb_type != P_MB)
786*495ae853SAndroid Build Coastguard Worker                                         && (ps_top_mb->u1_mb_type != B_MB));
787*495ae853SAndroid Build Coastguard Worker         u2_use_left_mb = u2_use_left_mb
788*495ae853SAndroid Build Coastguard Worker                         && ((ps_left_mb->u1_mb_type != P_MB)
789*495ae853SAndroid Build Coastguard Worker                                         && (ps_left_mb->u1_mb_type != B_MB));
790*495ae853SAndroid Build Coastguard Worker 
791*495ae853SAndroid Build Coastguard Worker         u2_use_left_mb_pack = (u2_use_left_mb << 8) + u2_use_left_mb;
792*495ae853SAndroid Build Coastguard Worker         if(u1_mbaff)
793*495ae853SAndroid Build Coastguard Worker         {
794*495ae853SAndroid Build Coastguard Worker             if(u1_mb_field_decoding_flag ^ ps_left_mb->u1_mb_fld)
795*495ae853SAndroid Build Coastguard Worker             {
796*495ae853SAndroid Build Coastguard Worker                 u1_left = u1_left
797*495ae853SAndroid Build Coastguard Worker                                 && (((ps_left_mb + 1)->u1_mb_type != P_MB)
798*495ae853SAndroid Build Coastguard Worker                                                 && ((ps_left_mb + 1)->u1_mb_type
799*495ae853SAndroid Build Coastguard Worker                                                                 != B_MB));
800*495ae853SAndroid Build Coastguard Worker                 u2_use_left_mb = u2_use_left_mb && u1_left;
801*495ae853SAndroid Build Coastguard Worker                 if(u1_mb_field_decoding_flag)
802*495ae853SAndroid Build Coastguard Worker                     u2_use_left_mb_pack = (u1_left << 8)
803*495ae853SAndroid Build Coastguard Worker                                     + (u2_use_left_mb_pack & 0xff);
804*495ae853SAndroid Build Coastguard Worker                 else
805*495ae853SAndroid Build Coastguard Worker                     u2_use_left_mb_pack = (u2_use_left_mb << 8)
806*495ae853SAndroid Build Coastguard Worker                                     + (u2_use_left_mb);
807*495ae853SAndroid Build Coastguard Worker             }
808*495ae853SAndroid Build Coastguard Worker         }
809*495ae853SAndroid Build Coastguard Worker         u1_use_top_right_mb =
810*495ae853SAndroid Build Coastguard Worker                         u1_use_top_right_mb
811*495ae853SAndroid Build Coastguard Worker                                         && ((ps_top_right_mb->u1_mb_type != P_MB)
812*495ae853SAndroid Build Coastguard Worker                                                         && (ps_top_right_mb->u1_mb_type
813*495ae853SAndroid Build Coastguard Worker                                                                         != B_MB));
814*495ae853SAndroid Build Coastguard Worker 
815*495ae853SAndroid Build Coastguard Worker         u1_use_top_left_mb =
816*495ae853SAndroid Build Coastguard Worker                         u1_use_top_left_mb
817*495ae853SAndroid Build Coastguard Worker                                         && ((ps_cur_mb_info->u1_topleft_mbtype != P_MB)
818*495ae853SAndroid Build Coastguard Worker                                                         && (ps_cur_mb_info->u1_topleft_mbtype
819*495ae853SAndroid Build Coastguard Worker                                                                         != B_MB));
820*495ae853SAndroid Build Coastguard Worker     }
821*495ae853SAndroid Build Coastguard Worker 
822*495ae853SAndroid Build Coastguard Worker     /*********************Common pointer calculations *************************/
823*495ae853SAndroid Build Coastguard Worker     /* CHANGED CODE */
824*495ae853SAndroid Build Coastguard Worker     pu1_luma_pred_buffer = ps_dec->pu1_y;
825*495ae853SAndroid Build Coastguard Worker     pu1_luma_rec_buffer = ps_frame_buf->pu1_dest_y + (u4_num_pmbair << 4);
826*495ae853SAndroid Build Coastguard Worker     pu1_mb_cb_rei1_buffer = ps_frame_buf->pu1_dest_u
827*495ae853SAndroid Build Coastguard Worker                     + (u4_num_pmbair << 3) * YUV420SP_FACTOR;
828*495ae853SAndroid Build Coastguard Worker     pu1_mb_cr_rei1_buffer = ps_frame_buf->pu1_dest_v + (u4_num_pmbair << 3);
829*495ae853SAndroid Build Coastguard Worker     ui_pred_width = MB_SIZE;
830*495ae853SAndroid Build Coastguard Worker     ui_rec_width = ps_dec->u2_frm_wd_y << u1_mb_field_decoding_flag;
831*495ae853SAndroid Build Coastguard Worker     u4_recwidth_cr = ps_dec->u2_frm_wd_uv << u1_mb_field_decoding_flag;
832*495ae853SAndroid Build Coastguard Worker     /************* Current and top luma pointer *****************/
833*495ae853SAndroid Build Coastguard Worker 
834*495ae853SAndroid Build Coastguard Worker     if(u1_mbaff)
835*495ae853SAndroid Build Coastguard Worker     {
836*495ae853SAndroid Build Coastguard Worker         if(u1_topmb == 0)
837*495ae853SAndroid Build Coastguard Worker         {
838*495ae853SAndroid Build Coastguard Worker             pu1_luma_rec_buffer += (
839*495ae853SAndroid Build Coastguard Worker                             u1_mb_field_decoding_flag ?
840*495ae853SAndroid Build Coastguard Worker                                             (ui_rec_width >> 1) :
841*495ae853SAndroid Build Coastguard Worker                                             (ui_rec_width << 4));
842*495ae853SAndroid Build Coastguard Worker             pu1_mb_cb_rei1_buffer += (
843*495ae853SAndroid Build Coastguard Worker                             u1_mb_field_decoding_flag ?
844*495ae853SAndroid Build Coastguard Worker                                             (u4_recwidth_cr >> 1) :
845*495ae853SAndroid Build Coastguard Worker                                             (u4_recwidth_cr << 3));
846*495ae853SAndroid Build Coastguard Worker             pu1_mb_cr_rei1_buffer += (
847*495ae853SAndroid Build Coastguard Worker                             u1_mb_field_decoding_flag ?
848*495ae853SAndroid Build Coastguard Worker                                             (u4_recwidth_cr >> 1) :
849*495ae853SAndroid Build Coastguard Worker                                             (u4_recwidth_cr << 3));
850*495ae853SAndroid Build Coastguard Worker         }
851*495ae853SAndroid Build Coastguard Worker     }
852*495ae853SAndroid Build Coastguard Worker 
853*495ae853SAndroid Build Coastguard Worker     /* CHANGED CODE */
854*495ae853SAndroid Build Coastguard Worker     if(ps_dec->u4_use_intrapred_line_copy == 1)
855*495ae853SAndroid Build Coastguard Worker     {
856*495ae853SAndroid Build Coastguard Worker         puc_top = ps_dec->pu1_prev_y_intra_pred_line + (ps_cur_mb_info->u2_mbx << 4);
857*495ae853SAndroid Build Coastguard Worker         pu1_top_u = ps_dec->pu1_prev_u_intra_pred_line
858*495ae853SAndroid Build Coastguard Worker                         + (ps_cur_mb_info->u2_mbx << 3) * YUV420SP_FACTOR;
859*495ae853SAndroid Build Coastguard Worker     }
860*495ae853SAndroid Build Coastguard Worker     else
861*495ae853SAndroid Build Coastguard Worker     {
862*495ae853SAndroid Build Coastguard Worker         puc_top = pu1_luma_rec_buffer - ui_rec_width;
863*495ae853SAndroid Build Coastguard Worker         pu1_top_u = pu1_mb_cb_rei1_buffer - u4_recwidth_cr;
864*495ae853SAndroid Build Coastguard Worker     }
865*495ae853SAndroid Build Coastguard Worker     /* CHANGED CODE */
866*495ae853SAndroid Build Coastguard Worker 
867*495ae853SAndroid Build Coastguard Worker     /************* Left pointer *****************/
868*495ae853SAndroid Build Coastguard Worker     pu1_yleft = pu1_luma_rec_buffer - 1;
869*495ae853SAndroid Build Coastguard Worker     pu1_uleft = pu1_mb_cb_rei1_buffer - 1 * YUV420SP_FACTOR;
870*495ae853SAndroid Build Coastguard Worker 
871*495ae853SAndroid Build Coastguard Worker     /**************Top Left pointer calculation**********/
872*495ae853SAndroid Build Coastguard Worker     pu1_ytop_left = puc_top - 1;
873*495ae853SAndroid Build Coastguard Worker     pu1_u_top_left = pu1_top_u - 1 * YUV420SP_FACTOR;
874*495ae853SAndroid Build Coastguard Worker 
875*495ae853SAndroid Build Coastguard Worker     /* CHANGED CODE */
876*495ae853SAndroid Build Coastguard Worker     PROFILE_DISABLE_INTRA_PRED()
877*495ae853SAndroid Build Coastguard Worker     {
878*495ae853SAndroid Build Coastguard Worker         pu1_prev_intra4x4_pred_mode_data = (UWORD8 *)ps_dec->pv_proc_tu_coeff_data;
879*495ae853SAndroid Build Coastguard Worker         if(u1_mb_type == I_4x4_MB && ps_cur_mb_info->u1_tran_form8x8 == 0)
880*495ae853SAndroid Build Coastguard Worker         {
881*495ae853SAndroid Build Coastguard Worker             ps_dec->pv_proc_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_proc_tu_coeff_data + 32);
882*495ae853SAndroid Build Coastguard Worker 
883*495ae853SAndroid Build Coastguard Worker         }
884*495ae853SAndroid Build Coastguard Worker         else if (u1_mb_type == I_4x4_MB && ps_cur_mb_info->u1_tran_form8x8 == 1)
885*495ae853SAndroid Build Coastguard Worker         {
886*495ae853SAndroid Build Coastguard Worker             ps_dec->pv_proc_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_proc_tu_coeff_data + 8);
887*495ae853SAndroid Build Coastguard Worker         }
888*495ae853SAndroid Build Coastguard Worker     }
889*495ae853SAndroid Build Coastguard Worker     if(!ps_cur_mb_info->u1_tran_form8x8)
890*495ae853SAndroid Build Coastguard Worker     {
891*495ae853SAndroid Build Coastguard Worker         u4_luma_dc_only_csbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec,
892*495ae853SAndroid Build Coastguard Worker                                        ps_cur_mb_info,
893*495ae853SAndroid Build Coastguard Worker                                        1);
894*495ae853SAndroid Build Coastguard Worker     }
895*495ae853SAndroid Build Coastguard Worker     else
896*495ae853SAndroid Build Coastguard Worker     {
897*495ae853SAndroid Build Coastguard Worker         if(!ps_dec->ps_cur_pps->u1_entropy_coding_mode)
898*495ae853SAndroid Build Coastguard Worker         {
899*495ae853SAndroid Build Coastguard Worker             u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec,
900*495ae853SAndroid Build Coastguard Worker                                            ps_cur_mb_info,
901*495ae853SAndroid Build Coastguard Worker                                            1);
902*495ae853SAndroid Build Coastguard Worker         }
903*495ae853SAndroid Build Coastguard Worker         else
904*495ae853SAndroid Build Coastguard Worker         {
905*495ae853SAndroid Build Coastguard Worker             u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff8x8_mb(ps_dec,
906*495ae853SAndroid Build Coastguard Worker                                            ps_cur_mb_info);
907*495ae853SAndroid Build Coastguard Worker         }
908*495ae853SAndroid Build Coastguard Worker     }
909*495ae853SAndroid Build Coastguard Worker 
910*495ae853SAndroid Build Coastguard Worker     pi2_y_coeff = ps_dec->pi2_coeff_data;
911*495ae853SAndroid Build Coastguard Worker 
912*495ae853SAndroid Build Coastguard Worker     if(u1_mb_type != I_4x4_MB)
913*495ae853SAndroid Build Coastguard Worker     {
914*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_intrapred_mode = MB_TYPE_TO_INTRA_16x16_MODE(u1_mb_type);
915*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------------------------------------*/
916*495ae853SAndroid Build Coastguard Worker         /* 16x16 IntraPrediction                                              */
917*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------------------------------------*/
918*495ae853SAndroid Build Coastguard Worker         {
919*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_packed_modes = (u1_top_available << 1)
920*495ae853SAndroid Build Coastguard Worker                             + u1_left_available;
921*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_err_code =
922*495ae853SAndroid Build Coastguard Worker                             (u1_intrapred_mode & 1) ?
923*495ae853SAndroid Build Coastguard Worker                                             u1_intrapred_mode :
924*495ae853SAndroid Build Coastguard Worker                                             (u1_intrapred_mode ^ 2);
925*495ae853SAndroid Build Coastguard Worker 
926*495ae853SAndroid Build Coastguard Worker             if((u1_err_code & u1_packed_modes) ^ u1_err_code)
927*495ae853SAndroid Build Coastguard Worker             {
928*495ae853SAndroid Build Coastguard Worker                 u1_intrapred_mode = 0;
929*495ae853SAndroid Build Coastguard Worker                 ps_dec->i4_error_code = ERROR_INTRAPRED;
930*495ae853SAndroid Build Coastguard Worker             }
931*495ae853SAndroid Build Coastguard Worker         }
932*495ae853SAndroid Build Coastguard Worker         {
933*495ae853SAndroid Build Coastguard Worker             /* Align the size to multiple of 8, so that SIMD functions
934*495ae853SAndroid Build Coastguard Worker                can read 64 bits at a time. Only 33 bytes are actaully used */
935*495ae853SAndroid Build Coastguard Worker             UWORD8 au1_ngbr_pels[40];
936*495ae853SAndroid Build Coastguard Worker             /* Get neighbour pixels */
937*495ae853SAndroid Build Coastguard Worker             /* left pels */
938*495ae853SAndroid Build Coastguard Worker             if(u2_use_left_mb)
939*495ae853SAndroid Build Coastguard Worker             {
940*495ae853SAndroid Build Coastguard Worker                 WORD32 i;
941*495ae853SAndroid Build Coastguard Worker                 for(i = 0; i < 16; i++)
942*495ae853SAndroid Build Coastguard Worker                     au1_ngbr_pels[16 - 1 - i] = pu1_yleft[i * ui_rec_width];
943*495ae853SAndroid Build Coastguard Worker             }
944*495ae853SAndroid Build Coastguard Worker             else
945*495ae853SAndroid Build Coastguard Worker             {
946*495ae853SAndroid Build Coastguard Worker                 memset(au1_ngbr_pels, 0, 16);
947*495ae853SAndroid Build Coastguard Worker             }
948*495ae853SAndroid Build Coastguard Worker 
949*495ae853SAndroid Build Coastguard Worker             /* top left pels */
950*495ae853SAndroid Build Coastguard Worker             au1_ngbr_pels[16] = *pu1_ytop_left;
951*495ae853SAndroid Build Coastguard Worker 
952*495ae853SAndroid Build Coastguard Worker             /* top pels */
953*495ae853SAndroid Build Coastguard Worker             if(uc_useTopMB)
954*495ae853SAndroid Build Coastguard Worker             {
955*495ae853SAndroid Build Coastguard Worker                 memcpy(au1_ngbr_pels + 16 + 1, puc_top, 16);
956*495ae853SAndroid Build Coastguard Worker             }
957*495ae853SAndroid Build Coastguard Worker             else
958*495ae853SAndroid Build Coastguard Worker             {
959*495ae853SAndroid Build Coastguard Worker                 memset(au1_ngbr_pels + 16 + 1, 0, 16);
960*495ae853SAndroid Build Coastguard Worker             }
961*495ae853SAndroid Build Coastguard Worker             PROFILE_DISABLE_INTRA_PRED()
962*495ae853SAndroid Build Coastguard Worker             ps_dec->apf_intra_pred_luma_16x16[u1_intrapred_mode](
963*495ae853SAndroid Build Coastguard Worker                             au1_ngbr_pels, pu1_luma_rec_buffer, 1, ui_rec_width,
964*495ae853SAndroid Build Coastguard Worker                             ((uc_useTopMB << 2) | u2_use_left_mb));
965*495ae853SAndroid Build Coastguard Worker         }
966*495ae853SAndroid Build Coastguard Worker         {
967*495ae853SAndroid Build Coastguard Worker             UWORD32 i;
968*495ae853SAndroid Build Coastguard Worker             WORD16 ai2_tmp[16];
969*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < 16; i++)
970*495ae853SAndroid Build Coastguard Worker             {
971*495ae853SAndroid Build Coastguard Worker                 WORD16 *pi2_level = pi2_y_coeff + (i << 4);
972*495ae853SAndroid Build Coastguard Worker                 UWORD8 *pu1_pred_sblk = pu1_luma_rec_buffer
973*495ae853SAndroid Build Coastguard Worker                                 + ((i & 0x3) * BLK_SIZE)
974*495ae853SAndroid Build Coastguard Worker                                 + (i >> 2) * (ui_rec_width << 2);
975*495ae853SAndroid Build Coastguard Worker                 PROFILE_DISABLE_IQ_IT_RECON()
976*495ae853SAndroid Build Coastguard Worker                 {
977*495ae853SAndroid Build Coastguard Worker                     if(CHECKBIT(ps_cur_mb_info->u2_luma_csbp, i))
978*495ae853SAndroid Build Coastguard Worker                     {
979*495ae853SAndroid Build Coastguard Worker                         ps_dec->pf_iquant_itrans_recon_luma_4x4(
980*495ae853SAndroid Build Coastguard Worker                                         pi2_level,
981*495ae853SAndroid Build Coastguard Worker                                         pu1_pred_sblk,
982*495ae853SAndroid Build Coastguard Worker                                         pu1_pred_sblk,
983*495ae853SAndroid Build Coastguard Worker                                         ui_rec_width,
984*495ae853SAndroid Build Coastguard Worker                                         ui_rec_width,
985*495ae853SAndroid Build Coastguard Worker                                         gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
986*495ae853SAndroid Build Coastguard Worker                                         (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[0],
987*495ae853SAndroid Build Coastguard Worker                                         ps_cur_mb_info->u1_qp_div6, ai2_tmp, 1,
988*495ae853SAndroid Build Coastguard Worker                                         pi2_level);
989*495ae853SAndroid Build Coastguard Worker                     }
990*495ae853SAndroid Build Coastguard Worker                     else if((CHECKBIT(u4_luma_dc_only_csbp, i)) && pi2_level[0] != 0)
991*495ae853SAndroid Build Coastguard Worker                     {
992*495ae853SAndroid Build Coastguard Worker                         ps_dec->pf_iquant_itrans_recon_luma_4x4_dc(
993*495ae853SAndroid Build Coastguard Worker                                         pi2_level,
994*495ae853SAndroid Build Coastguard Worker                                         pu1_pred_sblk,
995*495ae853SAndroid Build Coastguard Worker                                         pu1_pred_sblk,
996*495ae853SAndroid Build Coastguard Worker                                         ui_rec_width,
997*495ae853SAndroid Build Coastguard Worker                                         ui_rec_width,
998*495ae853SAndroid Build Coastguard Worker                                         gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
999*495ae853SAndroid Build Coastguard Worker                                         (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[0],
1000*495ae853SAndroid Build Coastguard Worker                                         ps_cur_mb_info->u1_qp_div6, ai2_tmp, 1,
1001*495ae853SAndroid Build Coastguard Worker                                         pi2_level);
1002*495ae853SAndroid Build Coastguard Worker                     }
1003*495ae853SAndroid Build Coastguard Worker                 }
1004*495ae853SAndroid Build Coastguard Worker             }
1005*495ae853SAndroid Build Coastguard Worker         }
1006*495ae853SAndroid Build Coastguard Worker     }
1007*495ae853SAndroid Build Coastguard Worker     else if(!ps_cur_mb_info->u1_tran_form8x8)
1008*495ae853SAndroid Build Coastguard Worker     {
1009*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_is_left_sub_block, u1_is_top_sub_block = uc_useTopMB;
1010*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_sub_blk_x, u1_sub_blk_y, u1_sub_mb_num;
1011*495ae853SAndroid Build Coastguard Worker         WORD8 i1_top_pred_mode;
1012*495ae853SAndroid Build Coastguard Worker         WORD8 i1_left_pred_mode;
1013*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_top, *pu1_left, *pu1_top_left, *pu1_top_right;
1014*495ae853SAndroid Build Coastguard Worker         WORD8 *pi1_cur_pred_mode, *pi1_left_pred_mode, *pc_topPredMode;
1015*495ae853SAndroid Build Coastguard Worker         UWORD16 ui2_left_pred_buf_width = 0xffff;
1016*495ae853SAndroid Build Coastguard Worker         WORD8 i1_intra_pred;
1017*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_prev_intra4x4_pred_mode_flag = pu1_prev_intra4x4_pred_mode_data;
1018*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_rem_intra4x4_pred_mode = pu1_prev_intra4x4_pred_mode_data + 16;
1019*495ae853SAndroid Build Coastguard Worker         WORD16 *pi2_y_coeff1;
1020*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_cur_sub_block;
1021*495ae853SAndroid Build Coastguard Worker         UWORD16 ui2_top_rt_mask;
1022*495ae853SAndroid Build Coastguard Worker 
1023*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------------------------------------*/
1024*495ae853SAndroid Build Coastguard Worker         /* 4x4 IntraPrediction                                                */
1025*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------------------------------------*/
1026*495ae853SAndroid Build Coastguard Worker         /* Calculation of Top Right subblock mask                             */
1027*495ae853SAndroid Build Coastguard Worker         /*                                                                    */
1028*495ae853SAndroid Build Coastguard Worker         /* (a) Set it to default mask                                         */
1029*495ae853SAndroid Build Coastguard Worker         /*     [It has 0 for sublocks which will never have top-right sub block] */
1030*495ae853SAndroid Build Coastguard Worker         /*                                                                    */
1031*495ae853SAndroid Build Coastguard Worker         /* (b) If top MB is not available                                     */
1032*495ae853SAndroid Build Coastguard Worker         /*      Clear the bits of the first row sub blocks                    */
1033*495ae853SAndroid Build Coastguard Worker         /*                                                                    */
1034*495ae853SAndroid Build Coastguard Worker         /* (c) Set/Clear bit for top-right sublock of MB                      */
1035*495ae853SAndroid Build Coastguard Worker         /*      [5 sub-block in decoding order] based on TOP RIGHT MB availablity */
1036*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------------------------------------*/
1037*495ae853SAndroid Build Coastguard Worker 
1038*495ae853SAndroid Build Coastguard Worker         pu1_top = puc_top;
1039*495ae853SAndroid Build Coastguard Worker 
1040*495ae853SAndroid Build Coastguard Worker         ui2_top_rt_mask = (u1_use_top_right_mb << 3) | (0x5750);
1041*495ae853SAndroid Build Coastguard Worker         if(uc_useTopMB)
1042*495ae853SAndroid Build Coastguard Worker             ui2_top_rt_mask |= 0x7;
1043*495ae853SAndroid Build Coastguard Worker 
1044*495ae853SAndroid Build Coastguard Worker         /*Top Related initialisations*/
1045*495ae853SAndroid Build Coastguard Worker 
1046*495ae853SAndroid Build Coastguard Worker 
1047*495ae853SAndroid Build Coastguard Worker         pi1_cur_pred_mode = ps_cur_mb_info->ps_curmb->pi1_intrapredmodes;
1048*495ae853SAndroid Build Coastguard Worker         pc_topPredMode = ps_cur_mb_info->ps_top_mb->pi1_intrapredmodes;
1049*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------
1050*495ae853SAndroid Build Coastguard Worker          if(u1_mbaff)
1051*495ae853SAndroid Build Coastguard Worker          {
1052*495ae853SAndroid Build Coastguard Worker 
1053*495ae853SAndroid Build Coastguard Worker          pi1_cur_pred_mode += (u2_mbx << 2);
1054*495ae853SAndroid Build Coastguard Worker          pc_topPredMode = pi1_cur_pred_mode + ps_cur_mb_info->i1_offset;
1055*495ae853SAndroid Build Coastguard Worker          pi1_cur_pred_mode += (u1_topmb) ? 0: 4;
1056*495ae853SAndroid Build Coastguard Worker          }*/
1057*495ae853SAndroid Build Coastguard Worker 
1058*495ae853SAndroid Build Coastguard Worker         if(u1_top_available)
1059*495ae853SAndroid Build Coastguard Worker         {
1060*495ae853SAndroid Build Coastguard Worker             if(ps_top_mb->u1_mb_type == I_4x4_MB)
1061*495ae853SAndroid Build Coastguard Worker                 *(WORD32*)pi1_cur_pred_mode = *(WORD32*)pc_topPredMode;
1062*495ae853SAndroid Build Coastguard Worker             else
1063*495ae853SAndroid Build Coastguard Worker                 *(WORD32*)pi1_cur_pred_mode =
1064*495ae853SAndroid Build Coastguard Worker                                 (uc_useTopMB) ? DC_DC_DC_DC : NOT_VALID;
1065*495ae853SAndroid Build Coastguard Worker         }
1066*495ae853SAndroid Build Coastguard Worker         else
1067*495ae853SAndroid Build Coastguard Worker             *(WORD32*)pi1_cur_pred_mode = NOT_VALID;
1068*495ae853SAndroid Build Coastguard Worker         /* CHANGED CODE */
1069*495ae853SAndroid Build Coastguard Worker 
1070*495ae853SAndroid Build Coastguard Worker         /* CHANGED CODE */
1071*495ae853SAndroid Build Coastguard Worker 
1072*495ae853SAndroid Build Coastguard Worker         /*Left Related initialisations*/
1073*495ae853SAndroid Build Coastguard Worker         pi1_left_pred_mode = ps_dec->pi1_left_pred_mode;
1074*495ae853SAndroid Build Coastguard Worker         if(!u1_mbaff)
1075*495ae853SAndroid Build Coastguard Worker         {
1076*495ae853SAndroid Build Coastguard Worker 
1077*495ae853SAndroid Build Coastguard Worker             if(u1_left_available)
1078*495ae853SAndroid Build Coastguard Worker             {
1079*495ae853SAndroid Build Coastguard Worker 
1080*495ae853SAndroid Build Coastguard Worker                 if(ps_left_mb->u1_mb_type != I_4x4_MB)
1081*495ae853SAndroid Build Coastguard Worker                     *(WORD32*)pi1_left_pred_mode =
1082*495ae853SAndroid Build Coastguard Worker                                     (u2_use_left_mb_pack) ?
1083*495ae853SAndroid Build Coastguard Worker                                     DC_DC_DC_DC :
1084*495ae853SAndroid Build Coastguard Worker                                                             NOT_VALID;
1085*495ae853SAndroid Build Coastguard Worker 
1086*495ae853SAndroid Build Coastguard Worker             }
1087*495ae853SAndroid Build Coastguard Worker             else
1088*495ae853SAndroid Build Coastguard Worker             {
1089*495ae853SAndroid Build Coastguard Worker 
1090*495ae853SAndroid Build Coastguard Worker                 *(WORD32*)pi1_left_pred_mode = NOT_VALID;
1091*495ae853SAndroid Build Coastguard Worker             }
1092*495ae853SAndroid Build Coastguard Worker 
1093*495ae853SAndroid Build Coastguard Worker         }
1094*495ae853SAndroid Build Coastguard Worker         else
1095*495ae853SAndroid Build Coastguard Worker         {
1096*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_curMbfld = ps_cur_mb_info->u1_mb_field_decodingflag;
1097*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_leftMbfld = ps_left_mb->u1_mb_fld;
1098*495ae853SAndroid Build Coastguard Worker 
1099*495ae853SAndroid Build Coastguard Worker             if(u1_curMbfld ^ u1_leftMbfld)
1100*495ae853SAndroid Build Coastguard Worker             {
1101*495ae853SAndroid Build Coastguard Worker 
1102*495ae853SAndroid Build Coastguard Worker                 if(u1_topmb
1103*495ae853SAndroid Build Coastguard Worker                                 | ((u1_topmb == 0)
1104*495ae853SAndroid Build Coastguard Worker                                                 && ((ps_curmb - 1)->u1_mb_type
1105*495ae853SAndroid Build Coastguard Worker                                                                 != I_4x4_MB)))
1106*495ae853SAndroid Build Coastguard Worker                 {
1107*495ae853SAndroid Build Coastguard Worker                     if(u1_left_available)
1108*495ae853SAndroid Build Coastguard Worker                     {
1109*495ae853SAndroid Build Coastguard Worker                         if(ps_left_mb->u1_mb_type != I_4x4_MB)
1110*495ae853SAndroid Build Coastguard Worker                         {
1111*495ae853SAndroid Build Coastguard Worker                             if(CHECKBIT(u2_use_left_mb_pack,0) == 0)
1112*495ae853SAndroid Build Coastguard Worker                                 *(WORD32*)pi1_left_pred_mode = NOT_VALID;
1113*495ae853SAndroid Build Coastguard Worker                             else
1114*495ae853SAndroid Build Coastguard Worker                                 *(WORD32*)pi1_left_pred_mode = DC_DC_DC_DC;
1115*495ae853SAndroid Build Coastguard Worker                         }
1116*495ae853SAndroid Build Coastguard Worker                     }
1117*495ae853SAndroid Build Coastguard Worker                     else
1118*495ae853SAndroid Build Coastguard Worker                         *(WORD32*)pi1_left_pred_mode = NOT_VALID;
1119*495ae853SAndroid Build Coastguard Worker 
1120*495ae853SAndroid Build Coastguard Worker                     if(u1_curMbfld)
1121*495ae853SAndroid Build Coastguard Worker                     {
1122*495ae853SAndroid Build Coastguard Worker                         if(u1_left_available)
1123*495ae853SAndroid Build Coastguard Worker                         {
1124*495ae853SAndroid Build Coastguard Worker                             if((ps_left_mb + 1)->u1_mb_type != I_4x4_MB)
1125*495ae853SAndroid Build Coastguard Worker                             {
1126*495ae853SAndroid Build Coastguard Worker                                 if(u2_use_left_mb_pack >> 8)
1127*495ae853SAndroid Build Coastguard Worker                                     *(WORD32*)(pi1_left_pred_mode + 4) =
1128*495ae853SAndroid Build Coastguard Worker                                                     DC_DC_DC_DC;
1129*495ae853SAndroid Build Coastguard Worker                                 else
1130*495ae853SAndroid Build Coastguard Worker                                     *(WORD32*)(pi1_left_pred_mode + 4) =
1131*495ae853SAndroid Build Coastguard Worker                                                     NOT_VALID;
1132*495ae853SAndroid Build Coastguard Worker                             }
1133*495ae853SAndroid Build Coastguard Worker                         }
1134*495ae853SAndroid Build Coastguard Worker                         else
1135*495ae853SAndroid Build Coastguard Worker                             *(WORD32*)(pi1_left_pred_mode + 4) = NOT_VALID;
1136*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[1] = pi1_left_pred_mode[2];
1137*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[2] = pi1_left_pred_mode[4];
1138*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[3] = pi1_left_pred_mode[6];
1139*495ae853SAndroid Build Coastguard Worker                         *(WORD32*)(pi1_left_pred_mode + 4) =
1140*495ae853SAndroid Build Coastguard Worker                                         *(WORD32*)pi1_left_pred_mode;
1141*495ae853SAndroid Build Coastguard Worker                     }
1142*495ae853SAndroid Build Coastguard Worker                     else
1143*495ae853SAndroid Build Coastguard Worker                     {
1144*495ae853SAndroid Build Coastguard Worker 
1145*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[7] = pi1_left_pred_mode[3];
1146*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[6] = pi1_left_pred_mode[3];
1147*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[5] = pi1_left_pred_mode[2];
1148*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[4] = pi1_left_pred_mode[2];
1149*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[3] = pi1_left_pred_mode[1];
1150*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[2] = pi1_left_pred_mode[1];
1151*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[1] = pi1_left_pred_mode[0];
1152*495ae853SAndroid Build Coastguard Worker                     }
1153*495ae853SAndroid Build Coastguard Worker                 }
1154*495ae853SAndroid Build Coastguard Worker                 pi1_left_pred_mode += (u1_topmb) ? 0 : 4;
1155*495ae853SAndroid Build Coastguard Worker             }
1156*495ae853SAndroid Build Coastguard Worker             else
1157*495ae853SAndroid Build Coastguard Worker             {
1158*495ae853SAndroid Build Coastguard Worker 
1159*495ae853SAndroid Build Coastguard Worker                 pi1_left_pred_mode += (u1_topmb) ? 0 : 4;
1160*495ae853SAndroid Build Coastguard Worker                 if(u1_left_available)
1161*495ae853SAndroid Build Coastguard Worker                 {
1162*495ae853SAndroid Build Coastguard Worker 
1163*495ae853SAndroid Build Coastguard Worker                     if(ps_left_mb->u1_mb_type != I_4x4_MB)
1164*495ae853SAndroid Build Coastguard Worker                         *(WORD32*)pi1_left_pred_mode =
1165*495ae853SAndroid Build Coastguard Worker                                         (u2_use_left_mb_pack) ?
1166*495ae853SAndroid Build Coastguard Worker                                         DC_DC_DC_DC :
1167*495ae853SAndroid Build Coastguard Worker                                                                 NOT_VALID;
1168*495ae853SAndroid Build Coastguard Worker                 }
1169*495ae853SAndroid Build Coastguard Worker                 else
1170*495ae853SAndroid Build Coastguard Worker                     *(WORD32*)pi1_left_pred_mode = NOT_VALID;
1171*495ae853SAndroid Build Coastguard Worker             }
1172*495ae853SAndroid Build Coastguard Worker         }
1173*495ae853SAndroid Build Coastguard Worker         /* One time pointer initialisations*/
1174*495ae853SAndroid Build Coastguard Worker         pi2_y_coeff1 = pi2_y_coeff;
1175*495ae853SAndroid Build Coastguard Worker         pu1_top_left = pu1_ytop_left;
1176*495ae853SAndroid Build Coastguard Worker 
1177*495ae853SAndroid Build Coastguard Worker         /* Scan the sub-blocks in Raster Scan Order */
1178*495ae853SAndroid Build Coastguard Worker         for(u1_sub_mb_num = 0; u1_sub_mb_num < 16; u1_sub_mb_num++)
1179*495ae853SAndroid Build Coastguard Worker         {
1180*495ae853SAndroid Build Coastguard Worker             /* Align the size to multiple of 8, so that SIMD functions
1181*495ae853SAndroid Build Coastguard Worker                can read 64 bits at a time. Only 13 bytes are actaully used */
1182*495ae853SAndroid Build Coastguard Worker             UWORD8 au1_ngbr_pels[16];
1183*495ae853SAndroid Build Coastguard Worker 
1184*495ae853SAndroid Build Coastguard Worker             u1_sub_blk_x = u1_sub_mb_num & 0x3;
1185*495ae853SAndroid Build Coastguard Worker             u1_sub_blk_y = u1_sub_mb_num >> 2;
1186*495ae853SAndroid Build Coastguard Worker             i1_top_pred_mode = pi1_cur_pred_mode[u1_sub_blk_x];
1187*495ae853SAndroid Build Coastguard Worker             i1_left_pred_mode = pi1_left_pred_mode[u1_sub_blk_y];
1188*495ae853SAndroid Build Coastguard Worker             u1_use_top_right_mb = (!!CHECKBIT(ui2_top_rt_mask, u1_sub_mb_num));
1189*495ae853SAndroid Build Coastguard Worker 
1190*495ae853SAndroid Build Coastguard Worker             /*********** left subblock availability**********/
1191*495ae853SAndroid Build Coastguard Worker             if(u1_sub_blk_x)
1192*495ae853SAndroid Build Coastguard Worker                 u1_is_left_sub_block = 1;
1193*495ae853SAndroid Build Coastguard Worker             else
1194*495ae853SAndroid Build Coastguard Worker                 u1_is_left_sub_block =
1195*495ae853SAndroid Build Coastguard Worker                                 (u1_sub_blk_y < 2) ?
1196*495ae853SAndroid Build Coastguard Worker                                                 (CHECKBIT(u2_use_left_mb_pack,
1197*495ae853SAndroid Build Coastguard Worker                                                           0)) :
1198*495ae853SAndroid Build Coastguard Worker                                                 (u2_use_left_mb_pack >> 8);
1199*495ae853SAndroid Build Coastguard Worker 
1200*495ae853SAndroid Build Coastguard Worker             /* CHANGED CODE */
1201*495ae853SAndroid Build Coastguard Worker             if(u1_sub_blk_y)
1202*495ae853SAndroid Build Coastguard Worker                 u1_is_top_sub_block = 1;
1203*495ae853SAndroid Build Coastguard Worker 
1204*495ae853SAndroid Build Coastguard Worker             /* CHANGED CODE */
1205*495ae853SAndroid Build Coastguard Worker             /***************** Top *********************/
1206*495ae853SAndroid Build Coastguard Worker             if(ps_dec->u4_use_intrapred_line_copy == 1)
1207*495ae853SAndroid Build Coastguard Worker             {
1208*495ae853SAndroid Build Coastguard Worker 
1209*495ae853SAndroid Build Coastguard Worker                 if(u1_sub_blk_y)
1210*495ae853SAndroid Build Coastguard Worker                     pu1_top = pu1_luma_rec_buffer - ui_rec_width;
1211*495ae853SAndroid Build Coastguard Worker                 else
1212*495ae853SAndroid Build Coastguard Worker                     pu1_top = puc_top + (u1_sub_blk_x << 2);
1213*495ae853SAndroid Build Coastguard Worker             }
1214*495ae853SAndroid Build Coastguard Worker             else
1215*495ae853SAndroid Build Coastguard Worker             {
1216*495ae853SAndroid Build Coastguard Worker                 pu1_top = pu1_luma_rec_buffer - ui_rec_width;
1217*495ae853SAndroid Build Coastguard Worker             }
1218*495ae853SAndroid Build Coastguard Worker             /***************** Top Right *********************/
1219*495ae853SAndroid Build Coastguard Worker             pu1_top_right = pu1_top + 4;
1220*495ae853SAndroid Build Coastguard Worker             /***************** Top Left *********************/
1221*495ae853SAndroid Build Coastguard Worker             pu1_top_left = pu1_top - 1;
1222*495ae853SAndroid Build Coastguard Worker             /***************** Left *********************/
1223*495ae853SAndroid Build Coastguard Worker             pu1_left = pu1_luma_rec_buffer - 1;
1224*495ae853SAndroid Build Coastguard Worker             /* CHANGED CODE */
1225*495ae853SAndroid Build Coastguard Worker 
1226*495ae853SAndroid Build Coastguard Worker             /*---------------------------------------------------------------*/
1227*495ae853SAndroid Build Coastguard Worker             /* Calculation of Intra prediction mode                          */
1228*495ae853SAndroid Build Coastguard Worker             /*---------------------------------------------------------------*/
1229*495ae853SAndroid Build Coastguard Worker             i1_intra_pred = ((i1_left_pred_mode < 0) | (i1_top_pred_mode < 0)) ?
1230*495ae853SAndroid Build Coastguard Worker                             DC : MIN(i1_left_pred_mode, i1_top_pred_mode);
1231*495ae853SAndroid Build Coastguard Worker             {
1232*495ae853SAndroid Build Coastguard Worker                 UWORD8 u1_packed_modes = (u1_is_top_sub_block << 1)
1233*495ae853SAndroid Build Coastguard Worker                                 + u1_is_left_sub_block;
1234*495ae853SAndroid Build Coastguard Worker                 UWORD8 *pu1_intra_err_codes =
1235*495ae853SAndroid Build Coastguard Worker                                 (UWORD8 *)gau1_ih264d_intra_pred_err_code;
1236*495ae853SAndroid Build Coastguard Worker                 UWORD8 uc_b2b0 = ((u1_sub_mb_num & 4) >> 1) | (u1_sub_mb_num & 1);
1237*495ae853SAndroid Build Coastguard Worker                 UWORD8 uc_b3b1 = ((u1_sub_mb_num & 8) >> 2)
1238*495ae853SAndroid Build Coastguard Worker                                 | ((u1_sub_mb_num & 2) >> 1);
1239*495ae853SAndroid Build Coastguard Worker 
1240*495ae853SAndroid Build Coastguard Worker                 u1_cur_sub_block = (uc_b3b1 << 2) + uc_b2b0;
1241*495ae853SAndroid Build Coastguard Worker                 PROFILE_DISABLE_INTRA_PRED()
1242*495ae853SAndroid Build Coastguard Worker                 if(!pu1_prev_intra4x4_pred_mode_flag[u1_cur_sub_block])
1243*495ae853SAndroid Build Coastguard Worker                 {
1244*495ae853SAndroid Build Coastguard Worker                     i1_intra_pred =
1245*495ae853SAndroid Build Coastguard Worker                                     pu1_rem_intra4x4_pred_mode[u1_cur_sub_block]
1246*495ae853SAndroid Build Coastguard Worker                                                     + (pu1_rem_intra4x4_pred_mode[u1_cur_sub_block]
1247*495ae853SAndroid Build Coastguard Worker                                                                     >= i1_intra_pred);
1248*495ae853SAndroid Build Coastguard Worker                 }
1249*495ae853SAndroid Build Coastguard Worker                 i1_intra_pred = CLIP3(0, 8, i1_intra_pred);
1250*495ae853SAndroid Build Coastguard Worker                 {
1251*495ae853SAndroid Build Coastguard Worker                     UWORD8 u1_err_code = pu1_intra_err_codes[i1_intra_pred];
1252*495ae853SAndroid Build Coastguard Worker 
1253*495ae853SAndroid Build Coastguard Worker                     if((u1_err_code & u1_packed_modes) ^ u1_err_code)
1254*495ae853SAndroid Build Coastguard Worker                      {
1255*495ae853SAndroid Build Coastguard Worker                         i1_intra_pred = 0;
1256*495ae853SAndroid Build Coastguard Worker                         ps_dec->i4_error_code = ERROR_INTRAPRED;
1257*495ae853SAndroid Build Coastguard Worker                      }
1258*495ae853SAndroid Build Coastguard Worker 
1259*495ae853SAndroid Build Coastguard Worker                 }
1260*495ae853SAndroid Build Coastguard Worker             }
1261*495ae853SAndroid Build Coastguard Worker             {
1262*495ae853SAndroid Build Coastguard Worker                 /* Get neighbour pixels */
1263*495ae853SAndroid Build Coastguard Worker                 /* left pels */
1264*495ae853SAndroid Build Coastguard Worker                 if(u1_is_left_sub_block)
1265*495ae853SAndroid Build Coastguard Worker                 {
1266*495ae853SAndroid Build Coastguard Worker                     WORD32 i;
1267*495ae853SAndroid Build Coastguard Worker                     for(i = 0; i < 4; i++)
1268*495ae853SAndroid Build Coastguard Worker                         au1_ngbr_pels[4 - 1 - i] = pu1_left[i * ui_rec_width];
1269*495ae853SAndroid Build Coastguard Worker                 }
1270*495ae853SAndroid Build Coastguard Worker                 else
1271*495ae853SAndroid Build Coastguard Worker                 {
1272*495ae853SAndroid Build Coastguard Worker                     memset(au1_ngbr_pels, 0, 4);
1273*495ae853SAndroid Build Coastguard Worker                 }
1274*495ae853SAndroid Build Coastguard Worker 
1275*495ae853SAndroid Build Coastguard Worker                 /* top left pels */
1276*495ae853SAndroid Build Coastguard Worker                 au1_ngbr_pels[4] = *pu1_top_left;
1277*495ae853SAndroid Build Coastguard Worker 
1278*495ae853SAndroid Build Coastguard Worker                 /* top pels */
1279*495ae853SAndroid Build Coastguard Worker                 if(u1_is_top_sub_block)
1280*495ae853SAndroid Build Coastguard Worker                 {
1281*495ae853SAndroid Build Coastguard Worker                     memcpy(au1_ngbr_pels + 4 + 1, pu1_top, 4);
1282*495ae853SAndroid Build Coastguard Worker                 }
1283*495ae853SAndroid Build Coastguard Worker                 else
1284*495ae853SAndroid Build Coastguard Worker                 {
1285*495ae853SAndroid Build Coastguard Worker                     memset(au1_ngbr_pels + 4 + 1, 0, 4);
1286*495ae853SAndroid Build Coastguard Worker                 }
1287*495ae853SAndroid Build Coastguard Worker 
1288*495ae853SAndroid Build Coastguard Worker                 /* top right pels */
1289*495ae853SAndroid Build Coastguard Worker                 if(u1_use_top_right_mb)
1290*495ae853SAndroid Build Coastguard Worker                 {
1291*495ae853SAndroid Build Coastguard Worker                     memcpy(au1_ngbr_pels + 4 * 2 + 1, pu1_top_right, 4);
1292*495ae853SAndroid Build Coastguard Worker                 }
1293*495ae853SAndroid Build Coastguard Worker                 else if(u1_is_top_sub_block)
1294*495ae853SAndroid Build Coastguard Worker                 {
1295*495ae853SAndroid Build Coastguard Worker                     memset(au1_ngbr_pels + 4 * 2 + 1, au1_ngbr_pels[4 * 2], 4);
1296*495ae853SAndroid Build Coastguard Worker                 }
1297*495ae853SAndroid Build Coastguard Worker             }
1298*495ae853SAndroid Build Coastguard Worker             PROFILE_DISABLE_INTRA_PRED()
1299*495ae853SAndroid Build Coastguard Worker             ps_dec->apf_intra_pred_luma_4x4[i1_intra_pred](
1300*495ae853SAndroid Build Coastguard Worker                             au1_ngbr_pels, pu1_luma_rec_buffer, 1,
1301*495ae853SAndroid Build Coastguard Worker                             ui_rec_width,
1302*495ae853SAndroid Build Coastguard Worker                             ((u1_is_top_sub_block << 2) | u1_is_left_sub_block));
1303*495ae853SAndroid Build Coastguard Worker 
1304*495ae853SAndroid Build Coastguard Worker             /* CHANGED CODE */
1305*495ae853SAndroid Build Coastguard Worker             if(CHECKBIT(ui2_luma_csbp, u1_sub_mb_num))
1306*495ae853SAndroid Build Coastguard Worker             {
1307*495ae853SAndroid Build Coastguard Worker                 WORD16 ai2_tmp[16];
1308*495ae853SAndroid Build Coastguard Worker                 PROFILE_DISABLE_IQ_IT_RECON()
1309*495ae853SAndroid Build Coastguard Worker                 {
1310*495ae853SAndroid Build Coastguard Worker                     if(CHECKBIT(u4_luma_dc_only_csbp, u1_sub_mb_num))
1311*495ae853SAndroid Build Coastguard Worker                     {
1312*495ae853SAndroid Build Coastguard Worker                         ps_dec->pf_iquant_itrans_recon_luma_4x4_dc(
1313*495ae853SAndroid Build Coastguard Worker                                         pi2_y_coeff1,
1314*495ae853SAndroid Build Coastguard Worker                                         pu1_luma_rec_buffer,
1315*495ae853SAndroid Build Coastguard Worker                                         pu1_luma_rec_buffer,
1316*495ae853SAndroid Build Coastguard Worker                                         ui_rec_width,
1317*495ae853SAndroid Build Coastguard Worker                                         ui_rec_width,
1318*495ae853SAndroid Build Coastguard Worker                                         gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
1319*495ae853SAndroid Build Coastguard Worker                                         (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[0],
1320*495ae853SAndroid Build Coastguard Worker                                         ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0,
1321*495ae853SAndroid Build Coastguard Worker                                         NULL);
1322*495ae853SAndroid Build Coastguard Worker                     }
1323*495ae853SAndroid Build Coastguard Worker                     else
1324*495ae853SAndroid Build Coastguard Worker                     {
1325*495ae853SAndroid Build Coastguard Worker                         ps_dec->pf_iquant_itrans_recon_luma_4x4(
1326*495ae853SAndroid Build Coastguard Worker                                         pi2_y_coeff1,
1327*495ae853SAndroid Build Coastguard Worker                                         pu1_luma_rec_buffer,
1328*495ae853SAndroid Build Coastguard Worker                                         pu1_luma_rec_buffer,
1329*495ae853SAndroid Build Coastguard Worker                                         ui_rec_width,
1330*495ae853SAndroid Build Coastguard Worker                                         ui_rec_width,
1331*495ae853SAndroid Build Coastguard Worker                                         gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
1332*495ae853SAndroid Build Coastguard Worker                                         (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[0],
1333*495ae853SAndroid Build Coastguard Worker                                         ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0,
1334*495ae853SAndroid Build Coastguard Worker                                         NULL);
1335*495ae853SAndroid Build Coastguard Worker                     }
1336*495ae853SAndroid Build Coastguard Worker                 }
1337*495ae853SAndroid Build Coastguard Worker 
1338*495ae853SAndroid Build Coastguard Worker             }
1339*495ae853SAndroid Build Coastguard Worker 
1340*495ae853SAndroid Build Coastguard Worker             /*---------------------------------------------------------------*/
1341*495ae853SAndroid Build Coastguard Worker             /* Update sub block number                                       */
1342*495ae853SAndroid Build Coastguard Worker             /*---------------------------------------------------------------*/
1343*495ae853SAndroid Build Coastguard Worker             pi2_y_coeff1 += 16;
1344*495ae853SAndroid Build Coastguard Worker             pu1_luma_rec_buffer +=
1345*495ae853SAndroid Build Coastguard Worker                             (u1_sub_blk_x == 3) ? (ui_rec_width << 2) - 12 : 4;
1346*495ae853SAndroid Build Coastguard Worker             pu1_luma_pred_buffer +=
1347*495ae853SAndroid Build Coastguard Worker                             (u1_sub_blk_x == 3) ? (ui_pred_width << 2) - 12 : 4;
1348*495ae853SAndroid Build Coastguard Worker             /* CHANGED CODE */
1349*495ae853SAndroid Build Coastguard Worker             pi1_cur_pred_mode[u1_sub_blk_x] = i1_intra_pred;
1350*495ae853SAndroid Build Coastguard Worker             pi1_left_pred_mode[u1_sub_blk_y] = i1_intra_pred;
1351*495ae853SAndroid Build Coastguard Worker         }
1352*495ae853SAndroid Build Coastguard Worker     }
1353*495ae853SAndroid Build Coastguard Worker     else if((u1_mb_type == I_4x4_MB) && (ps_cur_mb_info->u1_tran_form8x8 == 1))
1354*495ae853SAndroid Build Coastguard Worker     {
1355*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_is_left_sub_block, u1_is_top_sub_block = uc_useTopMB;
1356*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_sub_blk_x, u1_sub_blk_y, u1_sub_mb_num;
1357*495ae853SAndroid Build Coastguard Worker         WORD8 i1_top_pred_mode;
1358*495ae853SAndroid Build Coastguard Worker         WORD8 i1_left_pred_mode;
1359*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_top, *pu1_left, *pu1_top_left;
1360*495ae853SAndroid Build Coastguard Worker         WORD8 *pi1_cur_pred_mode, *pi1_left_pred_mode, *pc_topPredMode;
1361*495ae853SAndroid Build Coastguard Worker         UWORD16 ui2_left_pred_buf_width = 0xffff;
1362*495ae853SAndroid Build Coastguard Worker         WORD8 i1_intra_pred;
1363*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_prev_intra4x4_pred_mode_flag = pu1_prev_intra4x4_pred_mode_data;
1364*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_rem_intra4x4_pred_mode = pu1_prev_intra4x4_pred_mode_data + 4;
1365*495ae853SAndroid Build Coastguard Worker         WORD16 *pi2_y_coeff1;
1366*495ae853SAndroid Build Coastguard Worker         UWORD16 ui2_top_rt_mask;
1367*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_4x4_left_offset = 0;
1368*495ae853SAndroid Build Coastguard Worker 
1369*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------------------------------------*/
1370*495ae853SAndroid Build Coastguard Worker         /* 8x8 IntraPrediction                                                */
1371*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------------------------------------*/
1372*495ae853SAndroid Build Coastguard Worker         /* Calculation of Top Right subblock mask                             */
1373*495ae853SAndroid Build Coastguard Worker         /*                                                                    */
1374*495ae853SAndroid Build Coastguard Worker         /* (a) Set it to default mask                                         */
1375*495ae853SAndroid Build Coastguard Worker         /*  [It has 0 for sublocks which will never have top-right sub block] */
1376*495ae853SAndroid Build Coastguard Worker         /*                                                                    */
1377*495ae853SAndroid Build Coastguard Worker         /* (b) If top MB is not available                                     */
1378*495ae853SAndroid Build Coastguard Worker         /*      Clear the bits of the first row sub blocks                    */
1379*495ae853SAndroid Build Coastguard Worker         /*                                                                    */
1380*495ae853SAndroid Build Coastguard Worker         /* (c) Set/Clear bit for top-right sublock of MB                      */
1381*495ae853SAndroid Build Coastguard Worker         /*  [5 sub-block in decoding order] based on TOP RIGHT MB availablity */
1382*495ae853SAndroid Build Coastguard Worker         /*                                                                    */
1383*495ae853SAndroid Build Coastguard Worker         /* ui2_top_rt_mask: marks availibility of top right(neighbour)         */
1384*495ae853SAndroid Build Coastguard Worker         /* in the 8x8 Block ordering                                          */
1385*495ae853SAndroid Build Coastguard Worker         /*                                                                    */
1386*495ae853SAndroid Build Coastguard Worker         /*      tr0   tr1                                                     */
1387*495ae853SAndroid Build Coastguard Worker         /*   0    1   tr3                                                     */
1388*495ae853SAndroid Build Coastguard Worker         /*   2    3                                                           */
1389*495ae853SAndroid Build Coastguard Worker         /*                                                                    */
1390*495ae853SAndroid Build Coastguard Worker         /*  Top rights for 0 is in top MB                                     */
1391*495ae853SAndroid Build Coastguard Worker         /*  top right of 1 will be in top right MB                            */
1392*495ae853SAndroid Build Coastguard Worker         /*  top right of 3 in right MB and hence not available                */
1393*495ae853SAndroid Build Coastguard Worker         /*  This corresponds to ui2_top_rt_mask  having default value 0x4      */
1394*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------------------------------------*/
1395*495ae853SAndroid Build Coastguard Worker 
1396*495ae853SAndroid Build Coastguard Worker         ui2_top_rt_mask = (u1_use_top_right_mb << 1) | (0x4);
1397*495ae853SAndroid Build Coastguard Worker 
1398*495ae853SAndroid Build Coastguard Worker         if(uc_useTopMB)
1399*495ae853SAndroid Build Coastguard Worker         {
1400*495ae853SAndroid Build Coastguard Worker             ui2_top_rt_mask |= 0x1;
1401*495ae853SAndroid Build Coastguard Worker         }
1402*495ae853SAndroid Build Coastguard Worker 
1403*495ae853SAndroid Build Coastguard Worker         /* Top Related initialisations */
1404*495ae853SAndroid Build Coastguard Worker         pi1_cur_pred_mode = ps_cur_mb_info->ps_curmb->pi1_intrapredmodes;
1405*495ae853SAndroid Build Coastguard Worker         pc_topPredMode = ps_cur_mb_info->ps_top_mb->pi1_intrapredmodes;
1406*495ae853SAndroid Build Coastguard Worker         /*
1407*495ae853SAndroid Build Coastguard Worker          if(u1_mbaff)
1408*495ae853SAndroid Build Coastguard Worker          {
1409*495ae853SAndroid Build Coastguard Worker          pi1_cur_pred_mode += (u2_mbx << 2);
1410*495ae853SAndroid Build Coastguard Worker          pc_topPredMode = pi1_cur_pred_mode + ps_cur_mb_info->i1_offset;
1411*495ae853SAndroid Build Coastguard Worker          pi1_cur_pred_mode += (u1_topmb) ? 0: 4;
1412*495ae853SAndroid Build Coastguard Worker          }
1413*495ae853SAndroid Build Coastguard Worker          */
1414*495ae853SAndroid Build Coastguard Worker         if(u1_top_available)
1415*495ae853SAndroid Build Coastguard Worker         {
1416*495ae853SAndroid Build Coastguard Worker             if(ps_top_mb->u1_mb_type == I_4x4_MB)
1417*495ae853SAndroid Build Coastguard Worker             {
1418*495ae853SAndroid Build Coastguard Worker                 *(WORD32*)pi1_cur_pred_mode = *(WORD32*)pc_topPredMode;
1419*495ae853SAndroid Build Coastguard Worker             }
1420*495ae853SAndroid Build Coastguard Worker             else
1421*495ae853SAndroid Build Coastguard Worker             {
1422*495ae853SAndroid Build Coastguard Worker                 *(WORD32*)pi1_cur_pred_mode =
1423*495ae853SAndroid Build Coastguard Worker                                 (uc_useTopMB) ? DC_DC_DC_DC : NOT_VALID;
1424*495ae853SAndroid Build Coastguard Worker             }
1425*495ae853SAndroid Build Coastguard Worker         }
1426*495ae853SAndroid Build Coastguard Worker         else
1427*495ae853SAndroid Build Coastguard Worker         {
1428*495ae853SAndroid Build Coastguard Worker             *(WORD32*)pi1_cur_pred_mode = NOT_VALID;
1429*495ae853SAndroid Build Coastguard Worker         }
1430*495ae853SAndroid Build Coastguard Worker 
1431*495ae853SAndroid Build Coastguard Worker         pu1_top = puc_top - 8;
1432*495ae853SAndroid Build Coastguard Worker 
1433*495ae853SAndroid Build Coastguard Worker         /*Left Related initialisations*/
1434*495ae853SAndroid Build Coastguard Worker         pi1_left_pred_mode = ps_dec->pi1_left_pred_mode;
1435*495ae853SAndroid Build Coastguard Worker 
1436*495ae853SAndroid Build Coastguard Worker         if(!u1_mbaff)
1437*495ae853SAndroid Build Coastguard Worker         {
1438*495ae853SAndroid Build Coastguard Worker             if(u1_left_available)
1439*495ae853SAndroid Build Coastguard Worker             {
1440*495ae853SAndroid Build Coastguard Worker                 if(ps_left_mb->u1_mb_type != I_4x4_MB)
1441*495ae853SAndroid Build Coastguard Worker                 {
1442*495ae853SAndroid Build Coastguard Worker                     *(WORD32*)pi1_left_pred_mode =
1443*495ae853SAndroid Build Coastguard Worker                                     (u2_use_left_mb_pack) ?
1444*495ae853SAndroid Build Coastguard Worker                                     DC_DC_DC_DC :
1445*495ae853SAndroid Build Coastguard Worker                                                             NOT_VALID;
1446*495ae853SAndroid Build Coastguard Worker                 }
1447*495ae853SAndroid Build Coastguard Worker             }
1448*495ae853SAndroid Build Coastguard Worker             else
1449*495ae853SAndroid Build Coastguard Worker             {
1450*495ae853SAndroid Build Coastguard Worker                 *(WORD32*)pi1_left_pred_mode = NOT_VALID;
1451*495ae853SAndroid Build Coastguard Worker             }
1452*495ae853SAndroid Build Coastguard Worker         }
1453*495ae853SAndroid Build Coastguard Worker         else
1454*495ae853SAndroid Build Coastguard Worker         {
1455*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_curMbfld = ps_cur_mb_info->u1_mb_field_decodingflag;
1456*495ae853SAndroid Build Coastguard Worker 
1457*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_leftMbfld = ps_left_mb->u1_mb_fld;
1458*495ae853SAndroid Build Coastguard Worker 
1459*495ae853SAndroid Build Coastguard Worker             if((!u1_curMbfld) && (u1_leftMbfld))
1460*495ae853SAndroid Build Coastguard Worker             {
1461*495ae853SAndroid Build Coastguard Worker                 u4_4x4_left_offset = 1;
1462*495ae853SAndroid Build Coastguard Worker             }
1463*495ae853SAndroid Build Coastguard Worker 
1464*495ae853SAndroid Build Coastguard Worker             if(u1_curMbfld ^ u1_leftMbfld)
1465*495ae853SAndroid Build Coastguard Worker             {
1466*495ae853SAndroid Build Coastguard Worker 
1467*495ae853SAndroid Build Coastguard Worker                 if(u1_topmb
1468*495ae853SAndroid Build Coastguard Worker                                 | ((u1_topmb == 0)
1469*495ae853SAndroid Build Coastguard Worker                                                 && ((ps_curmb - 1)->u1_mb_type
1470*495ae853SAndroid Build Coastguard Worker                                                                 != I_4x4_MB)))
1471*495ae853SAndroid Build Coastguard Worker 
1472*495ae853SAndroid Build Coastguard Worker                 {
1473*495ae853SAndroid Build Coastguard Worker                     if(u1_left_available)
1474*495ae853SAndroid Build Coastguard Worker                     {
1475*495ae853SAndroid Build Coastguard Worker                         if(ps_left_mb->u1_mb_type != I_4x4_MB)
1476*495ae853SAndroid Build Coastguard Worker                         {
1477*495ae853SAndroid Build Coastguard Worker                             if(CHECKBIT(u2_use_left_mb_pack,0) == 0)
1478*495ae853SAndroid Build Coastguard Worker                             {
1479*495ae853SAndroid Build Coastguard Worker                                 *(WORD32*)pi1_left_pred_mode = NOT_VALID;
1480*495ae853SAndroid Build Coastguard Worker                             }
1481*495ae853SAndroid Build Coastguard Worker                             else
1482*495ae853SAndroid Build Coastguard Worker                             {
1483*495ae853SAndroid Build Coastguard Worker                                 *(WORD32*)pi1_left_pred_mode = DC_DC_DC_DC;
1484*495ae853SAndroid Build Coastguard Worker                             }
1485*495ae853SAndroid Build Coastguard Worker                         }
1486*495ae853SAndroid Build Coastguard Worker                     }
1487*495ae853SAndroid Build Coastguard Worker                     else
1488*495ae853SAndroid Build Coastguard Worker                     {
1489*495ae853SAndroid Build Coastguard Worker                         *(WORD32*)pi1_left_pred_mode = NOT_VALID;
1490*495ae853SAndroid Build Coastguard Worker                     }
1491*495ae853SAndroid Build Coastguard Worker 
1492*495ae853SAndroid Build Coastguard Worker                     if(u1_curMbfld)
1493*495ae853SAndroid Build Coastguard Worker                     {
1494*495ae853SAndroid Build Coastguard Worker                         if(u1_left_available)
1495*495ae853SAndroid Build Coastguard Worker                         {
1496*495ae853SAndroid Build Coastguard Worker                             if((ps_left_mb + 1)->u1_mb_type != I_4x4_MB)
1497*495ae853SAndroid Build Coastguard Worker                             {
1498*495ae853SAndroid Build Coastguard Worker                                 if(u2_use_left_mb_pack >> 8)
1499*495ae853SAndroid Build Coastguard Worker                                 {
1500*495ae853SAndroid Build Coastguard Worker                                     *(WORD32*)(pi1_left_pred_mode + 4) =
1501*495ae853SAndroid Build Coastguard Worker                                                     DC_DC_DC_DC;
1502*495ae853SAndroid Build Coastguard Worker                                 }
1503*495ae853SAndroid Build Coastguard Worker                                 else
1504*495ae853SAndroid Build Coastguard Worker                                 {
1505*495ae853SAndroid Build Coastguard Worker                                     *(WORD32*)(pi1_left_pred_mode + 4) =
1506*495ae853SAndroid Build Coastguard Worker                                                     NOT_VALID;
1507*495ae853SAndroid Build Coastguard Worker                                 }
1508*495ae853SAndroid Build Coastguard Worker                             }
1509*495ae853SAndroid Build Coastguard Worker                         }
1510*495ae853SAndroid Build Coastguard Worker                         else
1511*495ae853SAndroid Build Coastguard Worker                         {
1512*495ae853SAndroid Build Coastguard Worker                             *(WORD32*)(pi1_left_pred_mode + 4) = NOT_VALID;
1513*495ae853SAndroid Build Coastguard Worker                         }
1514*495ae853SAndroid Build Coastguard Worker 
1515*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[1] = pi1_left_pred_mode[2];
1516*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[2] = pi1_left_pred_mode[4];
1517*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[3] = pi1_left_pred_mode[6];
1518*495ae853SAndroid Build Coastguard Worker                         *(WORD32*)(pi1_left_pred_mode + 4) =
1519*495ae853SAndroid Build Coastguard Worker                                         *(WORD32*)pi1_left_pred_mode;
1520*495ae853SAndroid Build Coastguard Worker                     }
1521*495ae853SAndroid Build Coastguard Worker                     else
1522*495ae853SAndroid Build Coastguard Worker                     {
1523*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[7] = pi1_left_pred_mode[3];
1524*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[6] = pi1_left_pred_mode[3];
1525*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[5] = pi1_left_pred_mode[2];
1526*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[4] = pi1_left_pred_mode[2];
1527*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[3] = pi1_left_pred_mode[1];
1528*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[2] = pi1_left_pred_mode[1];
1529*495ae853SAndroid Build Coastguard Worker                         pi1_left_pred_mode[1] = pi1_left_pred_mode[0];
1530*495ae853SAndroid Build Coastguard Worker                     }
1531*495ae853SAndroid Build Coastguard Worker                 }
1532*495ae853SAndroid Build Coastguard Worker                 pi1_left_pred_mode += (u1_topmb) ? 0 : 4;
1533*495ae853SAndroid Build Coastguard Worker             }
1534*495ae853SAndroid Build Coastguard Worker             else
1535*495ae853SAndroid Build Coastguard Worker             {
1536*495ae853SAndroid Build Coastguard Worker                 pi1_left_pred_mode += (u1_topmb) ? 0 : 4;
1537*495ae853SAndroid Build Coastguard Worker 
1538*495ae853SAndroid Build Coastguard Worker                 if(u1_left_available)
1539*495ae853SAndroid Build Coastguard Worker                 {
1540*495ae853SAndroid Build Coastguard Worker                     if(ps_left_mb->u1_mb_type != I_4x4_MB)
1541*495ae853SAndroid Build Coastguard Worker                     {
1542*495ae853SAndroid Build Coastguard Worker                         *(WORD32*)pi1_left_pred_mode =
1543*495ae853SAndroid Build Coastguard Worker                                         (u2_use_left_mb_pack) ?
1544*495ae853SAndroid Build Coastguard Worker                                         DC_DC_DC_DC :
1545*495ae853SAndroid Build Coastguard Worker                                                                 NOT_VALID;
1546*495ae853SAndroid Build Coastguard Worker                     }
1547*495ae853SAndroid Build Coastguard Worker                 }
1548*495ae853SAndroid Build Coastguard Worker                 else
1549*495ae853SAndroid Build Coastguard Worker                 {
1550*495ae853SAndroid Build Coastguard Worker                     *(WORD32*)pi1_left_pred_mode = NOT_VALID;
1551*495ae853SAndroid Build Coastguard Worker                 }
1552*495ae853SAndroid Build Coastguard Worker             }
1553*495ae853SAndroid Build Coastguard Worker         }
1554*495ae853SAndroid Build Coastguard Worker 
1555*495ae853SAndroid Build Coastguard Worker         /* One time pointer initialisations*/
1556*495ae853SAndroid Build Coastguard Worker         pi2_y_coeff1 = pi2_y_coeff;
1557*495ae853SAndroid Build Coastguard Worker 
1558*495ae853SAndroid Build Coastguard Worker         if(u1_use_top_left_mb)
1559*495ae853SAndroid Build Coastguard Worker         {
1560*495ae853SAndroid Build Coastguard Worker             pu1_top_left = pu1_ytop_left;
1561*495ae853SAndroid Build Coastguard Worker         }
1562*495ae853SAndroid Build Coastguard Worker         else
1563*495ae853SAndroid Build Coastguard Worker         {
1564*495ae853SAndroid Build Coastguard Worker             pu1_top_left = NULL;
1565*495ae853SAndroid Build Coastguard Worker         }
1566*495ae853SAndroid Build Coastguard Worker 
1567*495ae853SAndroid Build Coastguard Worker         /* Scan the sub-blocks in Raster Scan Order */
1568*495ae853SAndroid Build Coastguard Worker         for(u1_sub_mb_num = 0; u1_sub_mb_num < 4; u1_sub_mb_num++)
1569*495ae853SAndroid Build Coastguard Worker         {
1570*495ae853SAndroid Build Coastguard Worker             u1_sub_blk_x = (u1_sub_mb_num & 0x1);
1571*495ae853SAndroid Build Coastguard Worker             u1_sub_blk_y = (u1_sub_mb_num >> 1);
1572*495ae853SAndroid Build Coastguard Worker             i1_top_pred_mode = pi1_cur_pred_mode[u1_sub_blk_x << 1];
1573*495ae853SAndroid Build Coastguard Worker             i1_left_pred_mode = pi1_left_pred_mode[u1_sub_blk_y << 1];
1574*495ae853SAndroid Build Coastguard Worker 
1575*495ae853SAndroid Build Coastguard Worker             if(2 == u1_sub_mb_num)
1576*495ae853SAndroid Build Coastguard Worker             {
1577*495ae853SAndroid Build Coastguard Worker                 i1_left_pred_mode = pi1_left_pred_mode[(u1_sub_blk_y << 1)
1578*495ae853SAndroid Build Coastguard Worker                                 + u4_4x4_left_offset];
1579*495ae853SAndroid Build Coastguard Worker             }
1580*495ae853SAndroid Build Coastguard Worker 
1581*495ae853SAndroid Build Coastguard Worker             u1_use_top_right_mb = (!!CHECKBIT(ui2_top_rt_mask, u1_sub_mb_num));
1582*495ae853SAndroid Build Coastguard Worker 
1583*495ae853SAndroid Build Coastguard Worker             /*********** left subblock availability**********/
1584*495ae853SAndroid Build Coastguard Worker             if(u1_sub_blk_x)
1585*495ae853SAndroid Build Coastguard Worker             {
1586*495ae853SAndroid Build Coastguard Worker                 u1_is_left_sub_block = 1;
1587*495ae853SAndroid Build Coastguard Worker             }
1588*495ae853SAndroid Build Coastguard Worker             else
1589*495ae853SAndroid Build Coastguard Worker             {
1590*495ae853SAndroid Build Coastguard Worker                 u1_is_left_sub_block =
1591*495ae853SAndroid Build Coastguard Worker                                 (u1_sub_blk_y < 1) ?
1592*495ae853SAndroid Build Coastguard Worker                                                 (CHECKBIT(u2_use_left_mb_pack,
1593*495ae853SAndroid Build Coastguard Worker                                                           0)) :
1594*495ae853SAndroid Build Coastguard Worker                                                 (u2_use_left_mb_pack >> 8);
1595*495ae853SAndroid Build Coastguard Worker             }
1596*495ae853SAndroid Build Coastguard Worker 
1597*495ae853SAndroid Build Coastguard Worker             /***************** Top *********************/
1598*495ae853SAndroid Build Coastguard Worker             if(u1_sub_blk_y)
1599*495ae853SAndroid Build Coastguard Worker             {
1600*495ae853SAndroid Build Coastguard Worker                 u1_is_top_sub_block = 1;
1601*495ae853SAndroid Build Coastguard Worker                 // sushant
1602*495ae853SAndroid Build Coastguard Worker                 pu1_top = /*pu1_luma_pred_buffer*/pu1_luma_rec_buffer - ui_rec_width;
1603*495ae853SAndroid Build Coastguard Worker             }
1604*495ae853SAndroid Build Coastguard Worker             else
1605*495ae853SAndroid Build Coastguard Worker             {
1606*495ae853SAndroid Build Coastguard Worker                 pu1_top += 8;
1607*495ae853SAndroid Build Coastguard Worker             }
1608*495ae853SAndroid Build Coastguard Worker 
1609*495ae853SAndroid Build Coastguard Worker             /***************** Left *********************/
1610*495ae853SAndroid Build Coastguard Worker             if((u1_sub_blk_x) | (u4_num_pmbair != 0))
1611*495ae853SAndroid Build Coastguard Worker             {
1612*495ae853SAndroid Build Coastguard Worker                 // sushant
1613*495ae853SAndroid Build Coastguard Worker                 pu1_left = /*pu1_luma_pred_buffer*/pu1_luma_rec_buffer - 1;
1614*495ae853SAndroid Build Coastguard Worker                 ui2_left_pred_buf_width = ui_rec_width;
1615*495ae853SAndroid Build Coastguard Worker             }
1616*495ae853SAndroid Build Coastguard Worker             else
1617*495ae853SAndroid Build Coastguard Worker             {
1618*495ae853SAndroid Build Coastguard Worker                 pu1_left = pu1_yleft;
1619*495ae853SAndroid Build Coastguard Worker                 pu1_yleft += (ui_rec_width << 3);
1620*495ae853SAndroid Build Coastguard Worker                 ui2_left_pred_buf_width = ui_rec_width;
1621*495ae853SAndroid Build Coastguard Worker             }
1622*495ae853SAndroid Build Coastguard Worker 
1623*495ae853SAndroid Build Coastguard Worker             /***************** Top Left *********************/
1624*495ae853SAndroid Build Coastguard Worker             if(u1_sub_mb_num)
1625*495ae853SAndroid Build Coastguard Worker             {
1626*495ae853SAndroid Build Coastguard Worker                 pu1_top_left = (u1_sub_blk_x) ?
1627*495ae853SAndroid Build Coastguard Worker                                 pu1_top - 1 : pu1_left - ui_rec_width;
1628*495ae853SAndroid Build Coastguard Worker 
1629*495ae853SAndroid Build Coastguard Worker                 if((u1_sub_blk_x && (!u1_is_top_sub_block))
1630*495ae853SAndroid Build Coastguard Worker                                 || ((!u1_sub_blk_x) && (!u1_is_left_sub_block)))
1631*495ae853SAndroid Build Coastguard Worker                 {
1632*495ae853SAndroid Build Coastguard Worker                     pu1_top_left = NULL;
1633*495ae853SAndroid Build Coastguard Worker                 }
1634*495ae853SAndroid Build Coastguard Worker             }
1635*495ae853SAndroid Build Coastguard Worker 
1636*495ae853SAndroid Build Coastguard Worker             /*---------------------------------------------------------------*/
1637*495ae853SAndroid Build Coastguard Worker             /* Calculation of Intra prediction mode                          */
1638*495ae853SAndroid Build Coastguard Worker             /*---------------------------------------------------------------*/
1639*495ae853SAndroid Build Coastguard Worker             i1_intra_pred = ((i1_left_pred_mode < 0) | (i1_top_pred_mode < 0)) ?
1640*495ae853SAndroid Build Coastguard Worker                             DC : MIN(i1_left_pred_mode, i1_top_pred_mode);
1641*495ae853SAndroid Build Coastguard Worker             {
1642*495ae853SAndroid Build Coastguard Worker                 UWORD8 u1_packed_modes = (u1_is_top_sub_block << 1)
1643*495ae853SAndroid Build Coastguard Worker                                 + u1_is_left_sub_block;
1644*495ae853SAndroid Build Coastguard Worker                 UWORD8 *pu1_intra_err_codes =
1645*495ae853SAndroid Build Coastguard Worker                                 (UWORD8 *)gau1_ih264d_intra_pred_err_code;
1646*495ae853SAndroid Build Coastguard Worker 
1647*495ae853SAndroid Build Coastguard Worker                 /********************************************************************/
1648*495ae853SAndroid Build Coastguard Worker                 /* Same intra4x4_pred_mode array is filled with intra4x4_pred_mode  */
1649*495ae853SAndroid Build Coastguard Worker                 /* for a MB with 8x8 intrapredicition                               */
1650*495ae853SAndroid Build Coastguard Worker                 /********************************************************************/
1651*495ae853SAndroid Build Coastguard Worker                 PROFILE_DISABLE_INTRA_PRED()
1652*495ae853SAndroid Build Coastguard Worker                 if(!pu1_prev_intra4x4_pred_mode_flag[u1_sub_mb_num])
1653*495ae853SAndroid Build Coastguard Worker                 {
1654*495ae853SAndroid Build Coastguard Worker                     i1_intra_pred = pu1_rem_intra4x4_pred_mode[u1_sub_mb_num]
1655*495ae853SAndroid Build Coastguard Worker                                     + (pu1_rem_intra4x4_pred_mode[u1_sub_mb_num]
1656*495ae853SAndroid Build Coastguard Worker                                                     >= i1_intra_pred);
1657*495ae853SAndroid Build Coastguard Worker                 }
1658*495ae853SAndroid Build Coastguard Worker                 i1_intra_pred = CLIP3(0, 8, i1_intra_pred);
1659*495ae853SAndroid Build Coastguard Worker                 {
1660*495ae853SAndroid Build Coastguard Worker                     UWORD8 u1_err_code = pu1_intra_err_codes[i1_intra_pred];
1661*495ae853SAndroid Build Coastguard Worker 
1662*495ae853SAndroid Build Coastguard Worker                     if((u1_err_code & u1_packed_modes) ^ u1_err_code)
1663*495ae853SAndroid Build Coastguard Worker                     {
1664*495ae853SAndroid Build Coastguard Worker                         i1_intra_pred = 0;
1665*495ae853SAndroid Build Coastguard Worker                         ps_dec->i4_error_code = ERROR_INTRAPRED;
1666*495ae853SAndroid Build Coastguard Worker                     }
1667*495ae853SAndroid Build Coastguard Worker                 }
1668*495ae853SAndroid Build Coastguard Worker             }
1669*495ae853SAndroid Build Coastguard Worker 
1670*495ae853SAndroid Build Coastguard Worker             {
1671*495ae853SAndroid Build Coastguard Worker                 /* Align the size to multiple of 8, so that SIMD functions
1672*495ae853SAndroid Build Coastguard Worker                 can read 64 bits at a time. Only 25 bytes are actaully used */
1673*495ae853SAndroid Build Coastguard Worker                 UWORD8 au1_ngbr_pels[32] = {0};
1674*495ae853SAndroid Build Coastguard Worker                 WORD32 ngbr_avail;
1675*495ae853SAndroid Build Coastguard Worker                 ngbr_avail = u1_is_left_sub_block << 0;
1676*495ae853SAndroid Build Coastguard Worker                 ngbr_avail |= u1_is_top_sub_block << 2;
1677*495ae853SAndroid Build Coastguard Worker 
1678*495ae853SAndroid Build Coastguard Worker                 if(pu1_top_left)
1679*495ae853SAndroid Build Coastguard Worker                     ngbr_avail |= 1 << 1;
1680*495ae853SAndroid Build Coastguard Worker 
1681*495ae853SAndroid Build Coastguard Worker                 ngbr_avail |= u1_use_top_right_mb << 3;
1682*495ae853SAndroid Build Coastguard Worker                 PROFILE_DISABLE_INTRA_PRED()
1683*495ae853SAndroid Build Coastguard Worker                 {
1684*495ae853SAndroid Build Coastguard Worker                     ps_dec->pf_intra_pred_ref_filtering(pu1_left, pu1_top_left,
1685*495ae853SAndroid Build Coastguard Worker                                                         pu1_top, au1_ngbr_pels,
1686*495ae853SAndroid Build Coastguard Worker                                                         ui2_left_pred_buf_width,
1687*495ae853SAndroid Build Coastguard Worker                                                         ngbr_avail);
1688*495ae853SAndroid Build Coastguard Worker 
1689*495ae853SAndroid Build Coastguard Worker                     ps_dec->apf_intra_pred_luma_8x8[i1_intra_pred](
1690*495ae853SAndroid Build Coastguard Worker                                     au1_ngbr_pels, pu1_luma_rec_buffer, 1,
1691*495ae853SAndroid Build Coastguard Worker                                     ui_rec_width,
1692*495ae853SAndroid Build Coastguard Worker                                     ((u1_is_top_sub_block << 2) | u1_is_left_sub_block));
1693*495ae853SAndroid Build Coastguard Worker                 }
1694*495ae853SAndroid Build Coastguard Worker             }
1695*495ae853SAndroid Build Coastguard Worker 
1696*495ae853SAndroid Build Coastguard Worker             /* Inverse Transform and Reconstruction */
1697*495ae853SAndroid Build Coastguard Worker             if(CHECKBIT(ps_cur_mb_info->u1_cbp, u1_sub_mb_num))
1698*495ae853SAndroid Build Coastguard Worker             {
1699*495ae853SAndroid Build Coastguard Worker                 WORD16 *pi2_scale_matrix_ptr;
1700*495ae853SAndroid Build Coastguard Worker                 WORD16 ai2_tmp[64];
1701*495ae853SAndroid Build Coastguard Worker 
1702*495ae853SAndroid Build Coastguard Worker                 pi2_scale_matrix_ptr =
1703*495ae853SAndroid Build Coastguard Worker                                 ps_dec->s_high_profile.i2_scalinglist8x8[0];
1704*495ae853SAndroid Build Coastguard Worker                 PROFILE_DISABLE_IQ_IT_RECON()
1705*495ae853SAndroid Build Coastguard Worker                 {
1706*495ae853SAndroid Build Coastguard Worker                     if(CHECKBIT(u4_luma_dc_only_cbp, u1_sub_mb_num))
1707*495ae853SAndroid Build Coastguard Worker                     {
1708*495ae853SAndroid Build Coastguard Worker                         ps_dec->pf_iquant_itrans_recon_luma_8x8_dc(
1709*495ae853SAndroid Build Coastguard Worker                                         pi2_y_coeff1,
1710*495ae853SAndroid Build Coastguard Worker                                         pu1_luma_rec_buffer,
1711*495ae853SAndroid Build Coastguard Worker                                         pu1_luma_rec_buffer,
1712*495ae853SAndroid Build Coastguard Worker                                         ui_rec_width,
1713*495ae853SAndroid Build Coastguard Worker                                         ui_rec_width,
1714*495ae853SAndroid Build Coastguard Worker                                         gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
1715*495ae853SAndroid Build Coastguard Worker                                         (UWORD16 *)pi2_scale_matrix_ptr,
1716*495ae853SAndroid Build Coastguard Worker                                         ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0,
1717*495ae853SAndroid Build Coastguard Worker                                         NULL);
1718*495ae853SAndroid Build Coastguard Worker                     }
1719*495ae853SAndroid Build Coastguard Worker                     else
1720*495ae853SAndroid Build Coastguard Worker                     {
1721*495ae853SAndroid Build Coastguard Worker                         ps_dec->pf_iquant_itrans_recon_luma_8x8(
1722*495ae853SAndroid Build Coastguard Worker                                         pi2_y_coeff1,
1723*495ae853SAndroid Build Coastguard Worker                                         pu1_luma_rec_buffer,
1724*495ae853SAndroid Build Coastguard Worker                                         pu1_luma_rec_buffer,
1725*495ae853SAndroid Build Coastguard Worker                                         ui_rec_width,
1726*495ae853SAndroid Build Coastguard Worker                                         ui_rec_width,
1727*495ae853SAndroid Build Coastguard Worker                                         gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
1728*495ae853SAndroid Build Coastguard Worker                                         (UWORD16 *)pi2_scale_matrix_ptr,
1729*495ae853SAndroid Build Coastguard Worker                                         ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0,
1730*495ae853SAndroid Build Coastguard Worker                                         NULL);
1731*495ae853SAndroid Build Coastguard Worker                     }
1732*495ae853SAndroid Build Coastguard Worker                 }
1733*495ae853SAndroid Build Coastguard Worker 
1734*495ae853SAndroid Build Coastguard Worker             }
1735*495ae853SAndroid Build Coastguard Worker 
1736*495ae853SAndroid Build Coastguard Worker             /*---------------------------------------------------------------*/
1737*495ae853SAndroid Build Coastguard Worker             /* Update sub block number                                       */
1738*495ae853SAndroid Build Coastguard Worker             /*---------------------------------------------------------------*/
1739*495ae853SAndroid Build Coastguard Worker             pi2_y_coeff1 += 64;
1740*495ae853SAndroid Build Coastguard Worker 
1741*495ae853SAndroid Build Coastguard Worker             pu1_luma_rec_buffer +=
1742*495ae853SAndroid Build Coastguard Worker                             (u1_sub_blk_x == 1) ?
1743*495ae853SAndroid Build Coastguard Worker                                             (ui_rec_width << 3) - (8 * 1) : 8;
1744*495ae853SAndroid Build Coastguard Worker 
1745*495ae853SAndroid Build Coastguard Worker             /*---------------------------------------------------------------*/
1746*495ae853SAndroid Build Coastguard Worker             /* Pred mode filled in terms of 4x4 block so replicated in 2     */
1747*495ae853SAndroid Build Coastguard Worker             /* locations.                                                    */
1748*495ae853SAndroid Build Coastguard Worker             /*---------------------------------------------------------------*/
1749*495ae853SAndroid Build Coastguard Worker             pi1_cur_pred_mode[u1_sub_blk_x << 1] = i1_intra_pred;
1750*495ae853SAndroid Build Coastguard Worker             pi1_cur_pred_mode[(u1_sub_blk_x << 1) + 1] = i1_intra_pred;
1751*495ae853SAndroid Build Coastguard Worker             pi1_left_pred_mode[u1_sub_blk_y << 1] = i1_intra_pred;
1752*495ae853SAndroid Build Coastguard Worker             pi1_left_pred_mode[(u1_sub_blk_y << 1) + 1] = i1_intra_pred;
1753*495ae853SAndroid Build Coastguard Worker         }
1754*495ae853SAndroid Build Coastguard Worker     }
1755*495ae853SAndroid Build Coastguard Worker     /* Decode Chroma Block */
1756*495ae853SAndroid Build Coastguard Worker     ih264d_unpack_chroma_coeff4x4_mb(ps_dec,
1757*495ae853SAndroid Build Coastguard Worker                                      ps_cur_mb_info);
1758*495ae853SAndroid Build Coastguard Worker     /*--------------------------------------------------------------------*/
1759*495ae853SAndroid Build Coastguard Worker     /* Chroma Blocks decoding                                             */
1760*495ae853SAndroid Build Coastguard Worker     /*--------------------------------------------------------------------*/
1761*495ae853SAndroid Build Coastguard Worker     {
1762*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_intra_chrom_pred_mode;
1763*495ae853SAndroid Build Coastguard Worker         UWORD8 u1_chroma_cbp = (UWORD8)(ps_cur_mb_info->u1_cbp >> 4);
1764*495ae853SAndroid Build Coastguard Worker 
1765*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------------------------------------*/
1766*495ae853SAndroid Build Coastguard Worker         /* Perform Chroma intra prediction                                    */
1767*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------------------------------------*/
1768*495ae853SAndroid Build Coastguard Worker 
1769*495ae853SAndroid Build Coastguard Worker         u1_intra_chrom_pred_mode = CHROMA_TO_LUMA_INTRA_MODE(
1770*495ae853SAndroid Build Coastguard Worker                         ps_cur_mb_info->u1_chroma_pred_mode);
1771*495ae853SAndroid Build Coastguard Worker 
1772*495ae853SAndroid Build Coastguard Worker         {
1773*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_packed_modes = (u1_top_available << 1)
1774*495ae853SAndroid Build Coastguard Worker                             + u1_left_available;
1775*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_err_code =
1776*495ae853SAndroid Build Coastguard Worker                             (u1_intra_chrom_pred_mode & 1) ?
1777*495ae853SAndroid Build Coastguard Worker                                             u1_intra_chrom_pred_mode :
1778*495ae853SAndroid Build Coastguard Worker                                             (u1_intra_chrom_pred_mode ^ 2);
1779*495ae853SAndroid Build Coastguard Worker             if((u1_err_code & u1_packed_modes) ^ u1_err_code)
1780*495ae853SAndroid Build Coastguard Worker             {
1781*495ae853SAndroid Build Coastguard Worker                 u1_intra_chrom_pred_mode = 0;
1782*495ae853SAndroid Build Coastguard Worker                 ps_dec->i4_error_code = ERROR_INTRAPRED;
1783*495ae853SAndroid Build Coastguard Worker             }
1784*495ae853SAndroid Build Coastguard Worker         }
1785*495ae853SAndroid Build Coastguard Worker 
1786*495ae853SAndroid Build Coastguard Worker         /* CHANGED CODE */
1787*495ae853SAndroid Build Coastguard Worker         if(u1_chroma_cbp != CBPC_ALLZERO)
1788*495ae853SAndroid Build Coastguard Worker         {
1789*495ae853SAndroid Build Coastguard Worker             UWORD16 u2_chroma_csbp =
1790*495ae853SAndroid Build Coastguard Worker                             (u1_chroma_cbp == CBPC_ACZERO) ?
1791*495ae853SAndroid Build Coastguard Worker                                             0 : ps_cur_mb_info->u2_chroma_csbp;
1792*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_scale_u;
1793*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_scale_v;
1794*495ae853SAndroid Build Coastguard Worker 
1795*495ae853SAndroid Build Coastguard Worker             {
1796*495ae853SAndroid Build Coastguard Worker                 UWORD16 au2_ngbr_pels[33];
1797*495ae853SAndroid Build Coastguard Worker                 UWORD8 *pu1_ngbr_pels = (UWORD8 *)au2_ngbr_pels;
1798*495ae853SAndroid Build Coastguard Worker                 UWORD16 *pu2_left_uv;
1799*495ae853SAndroid Build Coastguard Worker                 UWORD16 *pu2_topleft_uv;
1800*495ae853SAndroid Build Coastguard Worker                 WORD32 use_left1 = (u2_use_left_mb_pack & 0x0ff);
1801*495ae853SAndroid Build Coastguard Worker                 WORD32 use_left2 = (u2_use_left_mb_pack & 0xff00) >> 8;
1802*495ae853SAndroid Build Coastguard Worker 
1803*495ae853SAndroid Build Coastguard Worker                 pu2_left_uv = (UWORD16 *)pu1_uleft;
1804*495ae853SAndroid Build Coastguard Worker                 pu2_topleft_uv = (UWORD16 *)pu1_u_top_left;
1805*495ae853SAndroid Build Coastguard Worker                 /* Get neighbour pixels */
1806*495ae853SAndroid Build Coastguard Worker                 /* left pels */
1807*495ae853SAndroid Build Coastguard Worker                 if(u2_use_left_mb_pack)
1808*495ae853SAndroid Build Coastguard Worker                 {
1809*495ae853SAndroid Build Coastguard Worker                     WORD32 i;
1810*495ae853SAndroid Build Coastguard Worker                     if(use_left1)
1811*495ae853SAndroid Build Coastguard Worker                     {
1812*495ae853SAndroid Build Coastguard Worker                         for(i = 0; i < 4; i++)
1813*495ae853SAndroid Build Coastguard Worker                             au2_ngbr_pels[8 - 1 - i] = pu2_left_uv[i
1814*495ae853SAndroid Build Coastguard Worker                                             * u4_recwidth_cr / YUV420SP_FACTOR];
1815*495ae853SAndroid Build Coastguard Worker                     }
1816*495ae853SAndroid Build Coastguard Worker                     else
1817*495ae853SAndroid Build Coastguard Worker                     {
1818*495ae853SAndroid Build Coastguard Worker                         memset(au2_ngbr_pels + 4, 0, 4 * sizeof(UWORD16));
1819*495ae853SAndroid Build Coastguard Worker                     }
1820*495ae853SAndroid Build Coastguard Worker 
1821*495ae853SAndroid Build Coastguard Worker                     if(use_left2)
1822*495ae853SAndroid Build Coastguard Worker                     {
1823*495ae853SAndroid Build Coastguard Worker                         for(i = 4; i < 8; i++)
1824*495ae853SAndroid Build Coastguard Worker                             au2_ngbr_pels[8 - 1 - i] = pu2_left_uv[i
1825*495ae853SAndroid Build Coastguard Worker                                             * u4_recwidth_cr / YUV420SP_FACTOR];
1826*495ae853SAndroid Build Coastguard Worker                     }
1827*495ae853SAndroid Build Coastguard Worker                     else
1828*495ae853SAndroid Build Coastguard Worker                     {
1829*495ae853SAndroid Build Coastguard Worker                         memset(au2_ngbr_pels, 0, 4 * sizeof(UWORD16));
1830*495ae853SAndroid Build Coastguard Worker                     }
1831*495ae853SAndroid Build Coastguard Worker                 }
1832*495ae853SAndroid Build Coastguard Worker                 else
1833*495ae853SAndroid Build Coastguard Worker                 {
1834*495ae853SAndroid Build Coastguard Worker                     memset(au2_ngbr_pels, 0, 8 * sizeof(UWORD16));
1835*495ae853SAndroid Build Coastguard Worker                 }
1836*495ae853SAndroid Build Coastguard Worker 
1837*495ae853SAndroid Build Coastguard Worker                 /* top left pels */
1838*495ae853SAndroid Build Coastguard Worker                 au2_ngbr_pels[8] = *pu2_topleft_uv;
1839*495ae853SAndroid Build Coastguard Worker 
1840*495ae853SAndroid Build Coastguard Worker                 /* top pels */
1841*495ae853SAndroid Build Coastguard Worker                 if(uc_useTopMB)
1842*495ae853SAndroid Build Coastguard Worker                 {
1843*495ae853SAndroid Build Coastguard Worker                     memcpy(au2_ngbr_pels + 8 + 1, pu1_top_u,
1844*495ae853SAndroid Build Coastguard Worker                            8 * sizeof(UWORD16));
1845*495ae853SAndroid Build Coastguard Worker                 }
1846*495ae853SAndroid Build Coastguard Worker                 else
1847*495ae853SAndroid Build Coastguard Worker                 {
1848*495ae853SAndroid Build Coastguard Worker                     memset(au2_ngbr_pels + 8 + 1, 0, 8 * sizeof(UWORD16));
1849*495ae853SAndroid Build Coastguard Worker                 }
1850*495ae853SAndroid Build Coastguard Worker 
1851*495ae853SAndroid Build Coastguard Worker                 PROFILE_DISABLE_INTRA_PRED()
1852*495ae853SAndroid Build Coastguard Worker                 ps_dec->apf_intra_pred_chroma[u1_intra_chrom_pred_mode](
1853*495ae853SAndroid Build Coastguard Worker                                 pu1_ngbr_pels,
1854*495ae853SAndroid Build Coastguard Worker                                 pu1_mb_cb_rei1_buffer,
1855*495ae853SAndroid Build Coastguard Worker                                 1,
1856*495ae853SAndroid Build Coastguard Worker                                 u4_recwidth_cr,
1857*495ae853SAndroid Build Coastguard Worker                                 ((uc_useTopMB << 2) | (use_left2 << 4)
1858*495ae853SAndroid Build Coastguard Worker                                                 | use_left1));
1859*495ae853SAndroid Build Coastguard Worker             }
1860*495ae853SAndroid Build Coastguard Worker             u4_scale_u = ps_cur_mb_info->u1_qpc_div6;
1861*495ae853SAndroid Build Coastguard Worker             u4_scale_v = ps_cur_mb_info->u1_qpcr_div6;
1862*495ae853SAndroid Build Coastguard Worker             pi2_y_coeff = ps_dec->pi2_coeff_data;
1863*495ae853SAndroid Build Coastguard Worker 
1864*495ae853SAndroid Build Coastguard Worker             {
1865*495ae853SAndroid Build Coastguard Worker                 UWORD32 i;
1866*495ae853SAndroid Build Coastguard Worker                 WORD16 ai2_tmp[16];
1867*495ae853SAndroid Build Coastguard Worker                 for(i = 0; i < 4; i++)
1868*495ae853SAndroid Build Coastguard Worker                 {
1869*495ae853SAndroid Build Coastguard Worker                     WORD16 *pi2_level = pi2_y_coeff + (i << 4);
1870*495ae853SAndroid Build Coastguard Worker                     UWORD8 *pu1_pred_sblk = pu1_mb_cb_rei1_buffer
1871*495ae853SAndroid Build Coastguard Worker                                     + ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR)
1872*495ae853SAndroid Build Coastguard Worker                                     + (i >> 1) * (u4_recwidth_cr << 2);
1873*495ae853SAndroid Build Coastguard Worker                     PROFILE_DISABLE_IQ_IT_RECON()
1874*495ae853SAndroid Build Coastguard Worker                     {
1875*495ae853SAndroid Build Coastguard Worker                         if(CHECKBIT(u2_chroma_csbp, i))
1876*495ae853SAndroid Build Coastguard Worker                         {
1877*495ae853SAndroid Build Coastguard Worker                             ps_dec->pf_iquant_itrans_recon_chroma_4x4(
1878*495ae853SAndroid Build Coastguard Worker                                             pi2_level,
1879*495ae853SAndroid Build Coastguard Worker                                             pu1_pred_sblk,
1880*495ae853SAndroid Build Coastguard Worker                                             pu1_pred_sblk,
1881*495ae853SAndroid Build Coastguard Worker                                             u4_recwidth_cr,
1882*495ae853SAndroid Build Coastguard Worker                                             u4_recwidth_cr,
1883*495ae853SAndroid Build Coastguard Worker                                             gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
1884*495ae853SAndroid Build Coastguard Worker                                             (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[1],
1885*495ae853SAndroid Build Coastguard Worker                                             u4_scale_u, ai2_tmp, pi2_level);
1886*495ae853SAndroid Build Coastguard Worker                         }
1887*495ae853SAndroid Build Coastguard Worker                         else if(pi2_level[0] != 0)
1888*495ae853SAndroid Build Coastguard Worker                         {
1889*495ae853SAndroid Build Coastguard Worker                             ps_dec->pf_iquant_itrans_recon_chroma_4x4_dc(
1890*495ae853SAndroid Build Coastguard Worker                                             pi2_level,
1891*495ae853SAndroid Build Coastguard Worker                                             pu1_pred_sblk,
1892*495ae853SAndroid Build Coastguard Worker                                             pu1_pred_sblk,
1893*495ae853SAndroid Build Coastguard Worker                                             u4_recwidth_cr,
1894*495ae853SAndroid Build Coastguard Worker                                             u4_recwidth_cr,
1895*495ae853SAndroid Build Coastguard Worker                                             gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
1896*495ae853SAndroid Build Coastguard Worker                                             (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[1],
1897*495ae853SAndroid Build Coastguard Worker                                             u4_scale_u, ai2_tmp, pi2_level);
1898*495ae853SAndroid Build Coastguard Worker                         }
1899*495ae853SAndroid Build Coastguard Worker                     }
1900*495ae853SAndroid Build Coastguard Worker 
1901*495ae853SAndroid Build Coastguard Worker                 }
1902*495ae853SAndroid Build Coastguard Worker             }
1903*495ae853SAndroid Build Coastguard Worker 
1904*495ae853SAndroid Build Coastguard Worker             pi2_y_coeff += MB_CHROM_SIZE;
1905*495ae853SAndroid Build Coastguard Worker             u2_chroma_csbp = u2_chroma_csbp >> 4;
1906*495ae853SAndroid Build Coastguard Worker             {
1907*495ae853SAndroid Build Coastguard Worker                 UWORD32 i;
1908*495ae853SAndroid Build Coastguard Worker                 WORD16 ai2_tmp[16];
1909*495ae853SAndroid Build Coastguard Worker                 for(i = 0; i < 4; i++)
1910*495ae853SAndroid Build Coastguard Worker                 {
1911*495ae853SAndroid Build Coastguard Worker                     WORD16 *pi2_level = pi2_y_coeff + (i << 4);
1912*495ae853SAndroid Build Coastguard Worker                     UWORD8 *pu1_pred_sblk = pu1_mb_cb_rei1_buffer + 1
1913*495ae853SAndroid Build Coastguard Worker                                     + ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR)
1914*495ae853SAndroid Build Coastguard Worker                                     + (i >> 1) * (u4_recwidth_cr << 2);
1915*495ae853SAndroid Build Coastguard Worker                     PROFILE_DISABLE_IQ_IT_RECON()
1916*495ae853SAndroid Build Coastguard Worker                     {
1917*495ae853SAndroid Build Coastguard Worker                         if(CHECKBIT(u2_chroma_csbp, i))
1918*495ae853SAndroid Build Coastguard Worker                         {
1919*495ae853SAndroid Build Coastguard Worker                             ps_dec->pf_iquant_itrans_recon_chroma_4x4(
1920*495ae853SAndroid Build Coastguard Worker                                             pi2_level,
1921*495ae853SAndroid Build Coastguard Worker                                             pu1_pred_sblk,
1922*495ae853SAndroid Build Coastguard Worker                                             pu1_pred_sblk,
1923*495ae853SAndroid Build Coastguard Worker                                             u4_recwidth_cr,
1924*495ae853SAndroid Build Coastguard Worker                                             u4_recwidth_cr,
1925*495ae853SAndroid Build Coastguard Worker                                             gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
1926*495ae853SAndroid Build Coastguard Worker                                             (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[2],
1927*495ae853SAndroid Build Coastguard Worker                                             u4_scale_v, ai2_tmp, pi2_level);
1928*495ae853SAndroid Build Coastguard Worker                         }
1929*495ae853SAndroid Build Coastguard Worker                         else if(pi2_level[0] != 0)
1930*495ae853SAndroid Build Coastguard Worker                         {
1931*495ae853SAndroid Build Coastguard Worker                             ps_dec->pf_iquant_itrans_recon_chroma_4x4_dc(
1932*495ae853SAndroid Build Coastguard Worker                                             pi2_level,
1933*495ae853SAndroid Build Coastguard Worker                                             pu1_pred_sblk,
1934*495ae853SAndroid Build Coastguard Worker                                             pu1_pred_sblk,
1935*495ae853SAndroid Build Coastguard Worker                                             u4_recwidth_cr,
1936*495ae853SAndroid Build Coastguard Worker                                             u4_recwidth_cr,
1937*495ae853SAndroid Build Coastguard Worker                                             gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
1938*495ae853SAndroid Build Coastguard Worker                                             (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[2],
1939*495ae853SAndroid Build Coastguard Worker                                             u4_scale_v, ai2_tmp, pi2_level);
1940*495ae853SAndroid Build Coastguard Worker                         }
1941*495ae853SAndroid Build Coastguard Worker                     }
1942*495ae853SAndroid Build Coastguard Worker                 }
1943*495ae853SAndroid Build Coastguard Worker             }
1944*495ae853SAndroid Build Coastguard Worker 
1945*495ae853SAndroid Build Coastguard Worker         }
1946*495ae853SAndroid Build Coastguard Worker         else
1947*495ae853SAndroid Build Coastguard Worker         {
1948*495ae853SAndroid Build Coastguard Worker             /* If no inverse transform is needed, pass recon buffer pointer */
1949*495ae853SAndroid Build Coastguard Worker             /* to Intraprediction module instead of pred buffer pointer     */
1950*495ae853SAndroid Build Coastguard Worker             {
1951*495ae853SAndroid Build Coastguard Worker                 UWORD16 au2_ngbr_pels[33];
1952*495ae853SAndroid Build Coastguard Worker                 UWORD8 *pu1_ngbr_pels = (UWORD8 *)au2_ngbr_pels;
1953*495ae853SAndroid Build Coastguard Worker                 UWORD16 *pu2_left_uv;
1954*495ae853SAndroid Build Coastguard Worker                 UWORD16 *pu2_topleft_uv;
1955*495ae853SAndroid Build Coastguard Worker                 WORD32 use_left1 = (u2_use_left_mb_pack & 0x0ff);
1956*495ae853SAndroid Build Coastguard Worker                 WORD32 use_left2 = (u2_use_left_mb_pack & 0xff00) >> 8;
1957*495ae853SAndroid Build Coastguard Worker 
1958*495ae853SAndroid Build Coastguard Worker                 pu2_topleft_uv = (UWORD16 *)pu1_u_top_left;
1959*495ae853SAndroid Build Coastguard Worker                 pu2_left_uv = (UWORD16 *)pu1_uleft;
1960*495ae853SAndroid Build Coastguard Worker 
1961*495ae853SAndroid Build Coastguard Worker                 /* Get neighbour pixels */
1962*495ae853SAndroid Build Coastguard Worker                 /* left pels */
1963*495ae853SAndroid Build Coastguard Worker                 if(u2_use_left_mb_pack)
1964*495ae853SAndroid Build Coastguard Worker                 {
1965*495ae853SAndroid Build Coastguard Worker                     WORD32 i;
1966*495ae853SAndroid Build Coastguard Worker                     if(use_left1)
1967*495ae853SAndroid Build Coastguard Worker                     {
1968*495ae853SAndroid Build Coastguard Worker                         for(i = 0; i < 4; i++)
1969*495ae853SAndroid Build Coastguard Worker                             au2_ngbr_pels[8 - 1 - i] = pu2_left_uv[i
1970*495ae853SAndroid Build Coastguard Worker                                             * u4_recwidth_cr / YUV420SP_FACTOR];
1971*495ae853SAndroid Build Coastguard Worker                     }
1972*495ae853SAndroid Build Coastguard Worker                     else
1973*495ae853SAndroid Build Coastguard Worker                     {
1974*495ae853SAndroid Build Coastguard Worker                         memset(au2_ngbr_pels + 4, 0, 4 * sizeof(UWORD16));
1975*495ae853SAndroid Build Coastguard Worker                     }
1976*495ae853SAndroid Build Coastguard Worker 
1977*495ae853SAndroid Build Coastguard Worker                     if(use_left2)
1978*495ae853SAndroid Build Coastguard Worker                     {
1979*495ae853SAndroid Build Coastguard Worker                         for(i = 4; i < 8; i++)
1980*495ae853SAndroid Build Coastguard Worker                             au2_ngbr_pels[8 - 1 - i] = pu2_left_uv[i
1981*495ae853SAndroid Build Coastguard Worker                                             * u4_recwidth_cr / YUV420SP_FACTOR];
1982*495ae853SAndroid Build Coastguard Worker                     }
1983*495ae853SAndroid Build Coastguard Worker                     else
1984*495ae853SAndroid Build Coastguard Worker                     {
1985*495ae853SAndroid Build Coastguard Worker                         memset(au2_ngbr_pels, 0, 4 * sizeof(UWORD16));
1986*495ae853SAndroid Build Coastguard Worker                     }
1987*495ae853SAndroid Build Coastguard Worker 
1988*495ae853SAndroid Build Coastguard Worker                 }
1989*495ae853SAndroid Build Coastguard Worker                 else
1990*495ae853SAndroid Build Coastguard Worker                 {
1991*495ae853SAndroid Build Coastguard Worker                     memset(au2_ngbr_pels, 0, 8 * sizeof(UWORD16));
1992*495ae853SAndroid Build Coastguard Worker                 }
1993*495ae853SAndroid Build Coastguard Worker 
1994*495ae853SAndroid Build Coastguard Worker                 /* top left pels */
1995*495ae853SAndroid Build Coastguard Worker                 au2_ngbr_pels[8] = *pu2_topleft_uv;
1996*495ae853SAndroid Build Coastguard Worker 
1997*495ae853SAndroid Build Coastguard Worker                 /* top pels */
1998*495ae853SAndroid Build Coastguard Worker                 if(uc_useTopMB)
1999*495ae853SAndroid Build Coastguard Worker                 {
2000*495ae853SAndroid Build Coastguard Worker                     memcpy(au2_ngbr_pels + 8 + 1, pu1_top_u,
2001*495ae853SAndroid Build Coastguard Worker                            8 * sizeof(UWORD16));
2002*495ae853SAndroid Build Coastguard Worker                 }
2003*495ae853SAndroid Build Coastguard Worker                 else
2004*495ae853SAndroid Build Coastguard Worker                 {
2005*495ae853SAndroid Build Coastguard Worker                     memset(au2_ngbr_pels + 8 + 1, 0, 8 * sizeof(UWORD16));
2006*495ae853SAndroid Build Coastguard Worker                 }
2007*495ae853SAndroid Build Coastguard Worker 
2008*495ae853SAndroid Build Coastguard Worker                 PROFILE_DISABLE_INTRA_PRED()
2009*495ae853SAndroid Build Coastguard Worker                 ps_dec->apf_intra_pred_chroma[u1_intra_chrom_pred_mode](
2010*495ae853SAndroid Build Coastguard Worker                                 pu1_ngbr_pels,
2011*495ae853SAndroid Build Coastguard Worker                                 pu1_mb_cb_rei1_buffer,
2012*495ae853SAndroid Build Coastguard Worker                                 1,
2013*495ae853SAndroid Build Coastguard Worker                                 u4_recwidth_cr,
2014*495ae853SAndroid Build Coastguard Worker                                 ((uc_useTopMB << 2) | (use_left2 << 4)
2015*495ae853SAndroid Build Coastguard Worker                                                 | use_left1));
2016*495ae853SAndroid Build Coastguard Worker             }
2017*495ae853SAndroid Build Coastguard Worker 
2018*495ae853SAndroid Build Coastguard Worker         }
2019*495ae853SAndroid Build Coastguard Worker 
2020*495ae853SAndroid Build Coastguard Worker     }
2021*495ae853SAndroid Build Coastguard Worker     return OK;
2022*495ae853SAndroid Build Coastguard Worker }
2023