xref: /aosp_15_r20/external/libavc/decoder/ih264d_parse_cabac.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_parse_cabac.c
23*495ae853SAndroid Build Coastguard Worker  *
24*495ae853SAndroid Build Coastguard Worker  * \brief
25*495ae853SAndroid Build Coastguard Worker  *    This file contains cabac Residual decoding routines.
26*495ae853SAndroid Build Coastguard Worker  *
27*495ae853SAndroid Build Coastguard Worker  * \date
28*495ae853SAndroid Build Coastguard Worker  *    20/03/2003
29*495ae853SAndroid Build Coastguard Worker  *
30*495ae853SAndroid Build Coastguard Worker  * \author  NS
31*495ae853SAndroid Build Coastguard Worker  ***************************************************************************
32*495ae853SAndroid Build Coastguard Worker  */
33*495ae853SAndroid Build Coastguard Worker 
34*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
35*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
36*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
37*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
38*495ae853SAndroid Build Coastguard Worker #include "ih264d_structs.h"
39*495ae853SAndroid Build Coastguard Worker 
40*495ae853SAndroid Build Coastguard Worker #include "ih264d_cabac.h"
41*495ae853SAndroid Build Coastguard Worker #include "ih264d_bitstrm.h"
42*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_mb_header.h"
43*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
44*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
45*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
46*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cabac.h"
47*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_slice.h"
48*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
49*495ae853SAndroid Build Coastguard Worker #include "ih264d_mb_utils.h"
50*495ae853SAndroid Build Coastguard Worker #include "ih264d_utils.h"
51*495ae853SAndroid Build Coastguard Worker 
52*495ae853SAndroid Build Coastguard Worker /*!
53*495ae853SAndroid Build Coastguard Worker  ********************************************************************************
54*495ae853SAndroid Build Coastguard Worker  *   \if Function name : ih264d_read_coeff4x4_cabac \endif
55*495ae853SAndroid Build Coastguard Worker  *
56*495ae853SAndroid Build Coastguard Worker  *   \brief  This function encodes residual_block_cabac as defined in 7.3.5.3.2.
57*495ae853SAndroid Build Coastguard Worker  *
58*495ae853SAndroid Build Coastguard Worker  *   \return
59*495ae853SAndroid Build Coastguard Worker  *       Returns the index of last significant coeff.
60*495ae853SAndroid Build Coastguard Worker  *
61*495ae853SAndroid Build Coastguard Worker  ********************************************************************************
62*495ae853SAndroid Build Coastguard Worker  */
63*495ae853SAndroid Build Coastguard Worker 
ih264d_read_coeff4x4_cabac(dec_bit_stream_t * ps_bitstrm,UWORD32 u4_ctxcat,bin_ctxt_model_t * ps_ctxt_sig_coeff,dec_struct_t * ps_dec,bin_ctxt_model_t * ps_ctxt_coded)64*495ae853SAndroid Build Coastguard Worker UWORD8 ih264d_read_coeff4x4_cabac(dec_bit_stream_t *ps_bitstrm,
65*495ae853SAndroid Build Coastguard Worker                                   UWORD32 u4_ctxcat,
66*495ae853SAndroid Build Coastguard Worker                                   bin_ctxt_model_t *ps_ctxt_sig_coeff,
67*495ae853SAndroid Build Coastguard Worker                                   dec_struct_t *ps_dec, /*!< pointer to access global variables*/
68*495ae853SAndroid Build Coastguard Worker                                   bin_ctxt_model_t *ps_ctxt_coded)
69*495ae853SAndroid Build Coastguard Worker {
70*495ae853SAndroid Build Coastguard Worker 
71*495ae853SAndroid Build Coastguard Worker     decoding_envirnoment_t *ps_cab_env = &ps_dec->s_cab_dec_env;
72*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_coded_flag;
73*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_offset, *pu4_buffer;
74*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_code_int_range, u4_code_int_val_ofst;
75*495ae853SAndroid Build Coastguard Worker     tu_sblk4x4_coeff_data_t *ps_tu_4x4;
76*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_coeff_data;
77*495ae853SAndroid Build Coastguard Worker     WORD32 num_sig_coeffs = 0;
78*495ae853SAndroid Build Coastguard Worker 
79*495ae853SAndroid Build Coastguard Worker     /*loading from strcuctures*/
80*495ae853SAndroid Build Coastguard Worker 
81*495ae853SAndroid Build Coastguard Worker     ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
82*495ae853SAndroid Build Coastguard Worker     ps_tu_4x4->u2_sig_coeff_map = 0;
83*495ae853SAndroid Build Coastguard Worker     pi2_coeff_data = &ps_tu_4x4->ai2_level[0];
84*495ae853SAndroid Build Coastguard Worker 
85*495ae853SAndroid Build Coastguard Worker     u4_offset = ps_bitstrm->u4_ofst;
86*495ae853SAndroid Build Coastguard Worker     pu4_buffer = ps_bitstrm->pu4_buffer;
87*495ae853SAndroid Build Coastguard Worker 
88*495ae853SAndroid Build Coastguard Worker     u4_code_int_range = ps_cab_env->u4_code_int_range;
89*495ae853SAndroid Build Coastguard Worker     u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
90*495ae853SAndroid Build Coastguard Worker 
91*495ae853SAndroid Build Coastguard Worker     {
92*495ae853SAndroid Build Coastguard Worker 
93*495ae853SAndroid Build Coastguard Worker         /*inilined DecodeDecision_onebin begins*/
94*495ae853SAndroid Build Coastguard Worker 
95*495ae853SAndroid Build Coastguard Worker         {
96*495ae853SAndroid Build Coastguard Worker 
97*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_qnt_int_range, u4_int_range_lps;
98*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_symbol, u1_mps_state;
99*495ae853SAndroid Build Coastguard Worker 
100*495ae853SAndroid Build Coastguard Worker             UWORD32 table_lookup;
101*495ae853SAndroid Build Coastguard Worker             const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
102*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_clz;
103*495ae853SAndroid Build Coastguard Worker 
104*495ae853SAndroid Build Coastguard Worker             u1_mps_state = (ps_ctxt_coded->u1_mps_state);
105*495ae853SAndroid Build Coastguard Worker             u4_clz = CLZ(u4_code_int_range);
106*495ae853SAndroid Build Coastguard Worker             u4_qnt_int_range = u4_code_int_range << u4_clz;
107*495ae853SAndroid Build Coastguard Worker             u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
108*495ae853SAndroid Build Coastguard Worker             table_lookup =
109*495ae853SAndroid Build Coastguard Worker                             pu4_table[(u1_mps_state << 2) + u4_qnt_int_range];
110*495ae853SAndroid Build Coastguard Worker             u4_int_range_lps = table_lookup & 0xff;
111*495ae853SAndroid Build Coastguard Worker             u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
112*495ae853SAndroid Build Coastguard Worker             u4_code_int_range = u4_code_int_range - u4_int_range_lps;
113*495ae853SAndroid Build Coastguard Worker             u4_symbol = ((u1_mps_state >> 6) & 0x1);
114*495ae853SAndroid Build Coastguard Worker             u1_mps_state = (table_lookup >> 8) & 0x7F;
115*495ae853SAndroid Build Coastguard Worker 
116*495ae853SAndroid Build Coastguard Worker             CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
117*495ae853SAndroid Build Coastguard Worker                          u4_int_range_lps, u1_mps_state, table_lookup)
118*495ae853SAndroid Build Coastguard Worker 
119*495ae853SAndroid Build Coastguard Worker             if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8)
120*495ae853SAndroid Build Coastguard Worker             {
121*495ae853SAndroid Build Coastguard Worker 
122*495ae853SAndroid Build Coastguard Worker                 RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst,
123*495ae853SAndroid Build Coastguard Worker                                     u4_offset, pu4_buffer)
124*495ae853SAndroid Build Coastguard Worker             }
125*495ae853SAndroid Build Coastguard Worker 
126*495ae853SAndroid Build Coastguard Worker             ps_ctxt_coded->u1_mps_state = u1_mps_state;
127*495ae853SAndroid Build Coastguard Worker             u4_coded_flag = u4_symbol;
128*495ae853SAndroid Build Coastguard Worker 
129*495ae853SAndroid Build Coastguard Worker             /*inilined DecodeDecision_onebin ends*/
130*495ae853SAndroid Build Coastguard Worker 
131*495ae853SAndroid Build Coastguard Worker         }
132*495ae853SAndroid Build Coastguard Worker 
133*495ae853SAndroid Build Coastguard Worker     }
134*495ae853SAndroid Build Coastguard Worker 
135*495ae853SAndroid Build Coastguard Worker     if(u4_coded_flag)
136*495ae853SAndroid Build Coastguard Worker     {
137*495ae853SAndroid Build Coastguard Worker 
138*495ae853SAndroid Build Coastguard Worker         {
139*495ae853SAndroid Build Coastguard Worker             bin_ctxt_model_t *p_binCtxt_last, *p_binCtxt_last_org;
140*495ae853SAndroid Build Coastguard Worker             UWORD32 uc_last_coeff_idx;
141*495ae853SAndroid Build Coastguard Worker             UWORD32 uc_bin;
142*495ae853SAndroid Build Coastguard Worker             UWORD32 i;
143*495ae853SAndroid Build Coastguard Worker             WORD32 first_coeff_offset = 0;
144*495ae853SAndroid Build Coastguard Worker 
145*495ae853SAndroid Build Coastguard Worker             if((u4_ctxcat == CHROMA_AC_CTXCAT) || (u4_ctxcat == LUMA_AC_CTXCAT))
146*495ae853SAndroid Build Coastguard Worker             {
147*495ae853SAndroid Build Coastguard Worker                 first_coeff_offset = 1;
148*495ae853SAndroid Build Coastguard Worker             }
149*495ae853SAndroid Build Coastguard Worker 
150*495ae853SAndroid Build Coastguard Worker             i = 0;
151*495ae853SAndroid Build Coastguard Worker             if(u4_ctxcat == CHROMA_DC_CTXCAT)
152*495ae853SAndroid Build Coastguard Worker             {
153*495ae853SAndroid Build Coastguard Worker                 uc_last_coeff_idx = 3;
154*495ae853SAndroid Build Coastguard Worker             }
155*495ae853SAndroid Build Coastguard Worker             else
156*495ae853SAndroid Build Coastguard Worker             {
157*495ae853SAndroid Build Coastguard Worker                 UWORD32 u4_start;
158*495ae853SAndroid Build Coastguard Worker                 u4_start = (u4_ctxcat & 1) + (u4_ctxcat >> 2);
159*495ae853SAndroid Build Coastguard Worker                 uc_last_coeff_idx = 15 - u4_start;
160*495ae853SAndroid Build Coastguard Worker             }
161*495ae853SAndroid Build Coastguard Worker             p_binCtxt_last_org = ps_ctxt_sig_coeff
162*495ae853SAndroid Build Coastguard Worker                             + LAST_COEFF_CTXT_MINUS_SIG_COEFF_CTXT;
163*495ae853SAndroid Build Coastguard Worker 
164*495ae853SAndroid Build Coastguard Worker             do
165*495ae853SAndroid Build Coastguard Worker             {
166*495ae853SAndroid Build Coastguard Worker 
167*495ae853SAndroid Build Coastguard Worker                 /*inilined DecodeDecision_onebin begins*/
168*495ae853SAndroid Build Coastguard Worker                 {
169*495ae853SAndroid Build Coastguard Worker 
170*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_qnt_int_range, u4_int_range_lps;
171*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_symbol, u1_mps_state;
172*495ae853SAndroid Build Coastguard Worker                     UWORD32 table_lookup;
173*495ae853SAndroid Build Coastguard Worker                     const UWORD32 *pu4_table =
174*495ae853SAndroid Build Coastguard Worker                                     (const UWORD32 *)ps_cab_env->cabac_table;
175*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_clz;
176*495ae853SAndroid Build Coastguard Worker 
177*495ae853SAndroid Build Coastguard Worker                     u1_mps_state = (ps_ctxt_sig_coeff->u1_mps_state);
178*495ae853SAndroid Build Coastguard Worker 
179*495ae853SAndroid Build Coastguard Worker                     u4_clz = CLZ(u4_code_int_range);
180*495ae853SAndroid Build Coastguard Worker 
181*495ae853SAndroid Build Coastguard Worker                     u4_qnt_int_range = u4_code_int_range << u4_clz;
182*495ae853SAndroid Build Coastguard Worker                     u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
183*495ae853SAndroid Build Coastguard Worker 
184*495ae853SAndroid Build Coastguard Worker                     table_lookup = pu4_table[(u1_mps_state << 2)
185*495ae853SAndroid Build Coastguard Worker                                     + u4_qnt_int_range];
186*495ae853SAndroid Build Coastguard Worker 
187*495ae853SAndroid Build Coastguard Worker                     u4_int_range_lps = table_lookup & 0xff;
188*495ae853SAndroid Build Coastguard Worker 
189*495ae853SAndroid Build Coastguard Worker                     u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
190*495ae853SAndroid Build Coastguard Worker                     u4_code_int_range = u4_code_int_range - u4_int_range_lps;
191*495ae853SAndroid Build Coastguard Worker                     u4_symbol = ((u1_mps_state >> 6) & 0x1);
192*495ae853SAndroid Build Coastguard Worker                     u1_mps_state = (table_lookup >> 8) & 0x7F;
193*495ae853SAndroid Build Coastguard Worker 
194*495ae853SAndroid Build Coastguard Worker                     CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst,
195*495ae853SAndroid Build Coastguard Worker                                  u4_symbol, u4_int_range_lps, u1_mps_state,
196*495ae853SAndroid Build Coastguard Worker                                  table_lookup)
197*495ae853SAndroid Build Coastguard Worker 
198*495ae853SAndroid Build Coastguard Worker                     if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_14)
199*495ae853SAndroid Build Coastguard Worker                     {
200*495ae853SAndroid Build Coastguard Worker 
201*495ae853SAndroid Build Coastguard Worker                         UWORD32 read_bits, u4_clz;
202*495ae853SAndroid Build Coastguard Worker                         u4_clz = CLZ(u4_code_int_range);
203*495ae853SAndroid Build Coastguard Worker                         NEXTBITS(read_bits, (u4_offset + 23), pu4_buffer,
204*495ae853SAndroid Build Coastguard Worker                                  u4_clz)
205*495ae853SAndroid Build Coastguard Worker                         FLUSHBITS(u4_offset, (u4_clz))
206*495ae853SAndroid Build Coastguard Worker                         u4_code_int_range = u4_code_int_range << u4_clz;
207*495ae853SAndroid Build Coastguard Worker                         u4_code_int_val_ofst = (u4_code_int_val_ofst << u4_clz)
208*495ae853SAndroid Build Coastguard Worker                                         | read_bits;
209*495ae853SAndroid Build Coastguard Worker                     }
210*495ae853SAndroid Build Coastguard Worker 
211*495ae853SAndroid Build Coastguard Worker                     INC_BIN_COUNT(
212*495ae853SAndroid Build Coastguard Worker                                     ps_cab_env)
213*495ae853SAndroid Build Coastguard Worker 
214*495ae853SAndroid Build Coastguard Worker                     ps_ctxt_sig_coeff->u1_mps_state = u1_mps_state;
215*495ae853SAndroid Build Coastguard Worker                     uc_bin = u4_symbol;
216*495ae853SAndroid Build Coastguard Worker 
217*495ae853SAndroid Build Coastguard Worker                 }
218*495ae853SAndroid Build Coastguard Worker                 /*incrementing pointer to point to the context of the next bin*/
219*495ae853SAndroid Build Coastguard Worker                 ps_ctxt_sig_coeff++;
220*495ae853SAndroid Build Coastguard Worker 
221*495ae853SAndroid Build Coastguard Worker                 /*inilined DecodeDecision_onebin ends*/
222*495ae853SAndroid Build Coastguard Worker 
223*495ae853SAndroid Build Coastguard Worker                 if(uc_bin)
224*495ae853SAndroid Build Coastguard Worker                 {
225*495ae853SAndroid Build Coastguard Worker                     num_sig_coeffs++;
226*495ae853SAndroid Build Coastguard Worker                     SET_BIT(ps_tu_4x4->u2_sig_coeff_map, (i + first_coeff_offset));
227*495ae853SAndroid Build Coastguard Worker 
228*495ae853SAndroid Build Coastguard Worker                     p_binCtxt_last = p_binCtxt_last_org + i;
229*495ae853SAndroid Build Coastguard Worker 
230*495ae853SAndroid Build Coastguard Worker                     /*inilined DecodeDecision_onebin begins*/
231*495ae853SAndroid Build Coastguard Worker 
232*495ae853SAndroid Build Coastguard Worker                     {
233*495ae853SAndroid Build Coastguard Worker 
234*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_qnt_int_range, u4_int_range_lps;
235*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_symbol, u1_mps_state;
236*495ae853SAndroid Build Coastguard Worker                         UWORD32 table_lookup;
237*495ae853SAndroid Build Coastguard Worker                         const UWORD32 *pu4_table =
238*495ae853SAndroid Build Coastguard Worker                                         (const UWORD32 *)ps_cab_env->cabac_table;
239*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_clz;
240*495ae853SAndroid Build Coastguard Worker 
241*495ae853SAndroid Build Coastguard Worker                         u1_mps_state = (p_binCtxt_last->u1_mps_state);
242*495ae853SAndroid Build Coastguard Worker 
243*495ae853SAndroid Build Coastguard Worker                         u4_clz = CLZ(u4_code_int_range);
244*495ae853SAndroid Build Coastguard Worker                         u4_qnt_int_range = u4_code_int_range << u4_clz;
245*495ae853SAndroid Build Coastguard Worker                         u4_qnt_int_range = (u4_qnt_int_range >> 29)
246*495ae853SAndroid Build Coastguard Worker                                         & 0x3;
247*495ae853SAndroid Build Coastguard Worker 
248*495ae853SAndroid Build Coastguard Worker                         table_lookup = pu4_table[(u1_mps_state << 2)
249*495ae853SAndroid Build Coastguard Worker                                         + u4_qnt_int_range];
250*495ae853SAndroid Build Coastguard Worker                         u4_int_range_lps = table_lookup & 0xff;
251*495ae853SAndroid Build Coastguard Worker 
252*495ae853SAndroid Build Coastguard Worker                         u4_int_range_lps = u4_int_range_lps
253*495ae853SAndroid Build Coastguard Worker                                         << (23 - u4_clz);
254*495ae853SAndroid Build Coastguard Worker 
255*495ae853SAndroid Build Coastguard Worker                         u4_code_int_range = u4_code_int_range
256*495ae853SAndroid Build Coastguard Worker                                         - u4_int_range_lps;
257*495ae853SAndroid Build Coastguard Worker                         u4_symbol = ((u1_mps_state >> 6) & 0x1);
258*495ae853SAndroid Build Coastguard Worker                         u1_mps_state = (table_lookup >> 8) & 0x7F;
259*495ae853SAndroid Build Coastguard Worker 
260*495ae853SAndroid Build Coastguard Worker                         CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst,
261*495ae853SAndroid Build Coastguard Worker                                      u4_symbol, u4_int_range_lps,
262*495ae853SAndroid Build Coastguard Worker                                      u1_mps_state, table_lookup)
263*495ae853SAndroid Build Coastguard Worker 
264*495ae853SAndroid Build Coastguard Worker                         INC_BIN_COUNT(ps_cab_env)
265*495ae853SAndroid Build Coastguard Worker 
266*495ae853SAndroid Build Coastguard Worker                         p_binCtxt_last->u1_mps_state = u1_mps_state;
267*495ae853SAndroid Build Coastguard Worker                         uc_bin = u4_symbol;
268*495ae853SAndroid Build Coastguard Worker 
269*495ae853SAndroid Build Coastguard Worker                     }
270*495ae853SAndroid Build Coastguard Worker 
271*495ae853SAndroid Build Coastguard Worker                     /*inilined DecodeDecision_onebin ends*/
272*495ae853SAndroid Build Coastguard Worker                     if(uc_bin == 1)
273*495ae853SAndroid Build Coastguard Worker                         goto label_read_levels;
274*495ae853SAndroid Build Coastguard Worker 
275*495ae853SAndroid Build Coastguard Worker                 }
276*495ae853SAndroid Build Coastguard Worker 
277*495ae853SAndroid Build Coastguard Worker                 i = i + 1;
278*495ae853SAndroid Build Coastguard Worker 
279*495ae853SAndroid Build Coastguard Worker             }
280*495ae853SAndroid Build Coastguard Worker             while(i < uc_last_coeff_idx);
281*495ae853SAndroid Build Coastguard Worker 
282*495ae853SAndroid Build Coastguard Worker             num_sig_coeffs++;
283*495ae853SAndroid Build Coastguard Worker             SET_BIT(ps_tu_4x4->u2_sig_coeff_map, (i + first_coeff_offset));
284*495ae853SAndroid Build Coastguard Worker 
285*495ae853SAndroid Build Coastguard Worker             label_read_levels: ;
286*495ae853SAndroid Build Coastguard Worker 
287*495ae853SAndroid Build Coastguard Worker         }
288*495ae853SAndroid Build Coastguard Worker 
289*495ae853SAndroid Build Coastguard Worker         /// VALUE of No of Coeff in BLOCK = i + 1 for second case else i;
290*495ae853SAndroid Build Coastguard Worker 
291*495ae853SAndroid Build Coastguard Worker         /* Decode coeff_abs_level_minus1 and coeff_sign_flag */
292*495ae853SAndroid Build Coastguard Worker         {
293*495ae853SAndroid Build Coastguard Worker 
294*495ae853SAndroid Build Coastguard Worker             WORD32 i2_abs_lvl;
295*495ae853SAndroid Build Coastguard Worker             UWORD32 u1_abs_level_equal1 = 1, u1_abs_level_gt1 = 0;
296*495ae853SAndroid Build Coastguard Worker 
297*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_ctx_inc;
298*495ae853SAndroid Build Coastguard Worker             UWORD32 ui_prefix;
299*495ae853SAndroid Build Coastguard Worker         bin_ctxt_model_t *p_ctxt_abs_level;
300*495ae853SAndroid Build Coastguard Worker 
301*495ae853SAndroid Build Coastguard Worker 
302*495ae853SAndroid Build Coastguard Worker         p_ctxt_abs_level = ps_dec->p_coeff_abs_level_minus1_t[u4_ctxcat];
303*495ae853SAndroid Build Coastguard Worker         u4_ctx_inc = ((0x51));
304*495ae853SAndroid Build Coastguard Worker 
305*495ae853SAndroid Build Coastguard Worker         /*****************************************************/
306*495ae853SAndroid Build Coastguard Worker         /* Main Loop runs for no. of Significant coefficient */
307*495ae853SAndroid Build Coastguard Worker         /*****************************************************/
308*495ae853SAndroid Build Coastguard Worker 
309*495ae853SAndroid Build Coastguard Worker 
310*495ae853SAndroid Build Coastguard Worker         do
311*495ae853SAndroid Build Coastguard Worker             {
312*495ae853SAndroid Build Coastguard Worker 
313*495ae853SAndroid Build Coastguard Worker                 {
314*495ae853SAndroid Build Coastguard Worker                     INC_SYM_COUNT(&(ps_dec.s_cab_dec_env));
315*495ae853SAndroid Build Coastguard Worker 
316*495ae853SAndroid Build Coastguard Worker                     /*****************************************************/
317*495ae853SAndroid Build Coastguard Worker                     /* inilining a modified ih264d_decode_bins_unary     */
318*495ae853SAndroid Build Coastguard Worker                     /*****************************************************/
319*495ae853SAndroid Build Coastguard Worker 
320*495ae853SAndroid Build Coastguard Worker                     {
321*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_value;
322*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_symbol;
323*495ae853SAndroid Build Coastguard Worker                         bin_ctxt_model_t *ps_bin_ctxt;
324*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_ctx_Inc;
325*495ae853SAndroid Build Coastguard Worker 
326*495ae853SAndroid Build Coastguard Worker                         u4_value = 0;
327*495ae853SAndroid Build Coastguard Worker 
328*495ae853SAndroid Build Coastguard Worker                         u4_ctx_Inc = u4_ctx_inc & 0xf;
329*495ae853SAndroid Build Coastguard Worker                         ps_bin_ctxt = p_ctxt_abs_level + u4_ctx_Inc;
330*495ae853SAndroid Build Coastguard Worker 
331*495ae853SAndroid Build Coastguard Worker                         do
332*495ae853SAndroid Build Coastguard Worker                         {
333*495ae853SAndroid Build Coastguard Worker 
334*495ae853SAndroid Build Coastguard Worker                             {
335*495ae853SAndroid Build Coastguard Worker 
336*495ae853SAndroid Build Coastguard Worker                                 UWORD32 u4_qnt_int_range,
337*495ae853SAndroid Build Coastguard Worker                                                 u4_int_range_lps;
338*495ae853SAndroid Build Coastguard Worker                                 UWORD32 u1_mps_state;
339*495ae853SAndroid Build Coastguard Worker                                 UWORD32 table_lookup;
340*495ae853SAndroid Build Coastguard Worker                                 const UWORD32 *pu4_table =
341*495ae853SAndroid Build Coastguard Worker                                                 (const UWORD32 *)ps_cab_env->cabac_table;
342*495ae853SAndroid Build Coastguard Worker                                 UWORD32 u4_clz;
343*495ae853SAndroid Build Coastguard Worker 
344*495ae853SAndroid Build Coastguard Worker                                 u1_mps_state = (ps_bin_ctxt->u1_mps_state);
345*495ae853SAndroid Build Coastguard Worker                                 u4_clz = CLZ(u4_code_int_range);
346*495ae853SAndroid Build Coastguard Worker                                 u4_qnt_int_range = u4_code_int_range
347*495ae853SAndroid Build Coastguard Worker                                                 << u4_clz;
348*495ae853SAndroid Build Coastguard Worker                                 u4_qnt_int_range = (u4_qnt_int_range
349*495ae853SAndroid Build Coastguard Worker                                                 >> 29) & 0x3;
350*495ae853SAndroid Build Coastguard Worker                                 table_lookup = pu4_table[(u1_mps_state << 2)
351*495ae853SAndroid Build Coastguard Worker                                                 + u4_qnt_int_range];
352*495ae853SAndroid Build Coastguard Worker                                 u4_int_range_lps = table_lookup & 0xff;
353*495ae853SAndroid Build Coastguard Worker 
354*495ae853SAndroid Build Coastguard Worker                                 u4_int_range_lps = u4_int_range_lps
355*495ae853SAndroid Build Coastguard Worker                                                 << (23 - u4_clz);
356*495ae853SAndroid Build Coastguard Worker                                 u4_code_int_range = u4_code_int_range
357*495ae853SAndroid Build Coastguard Worker                                                 - u4_int_range_lps;
358*495ae853SAndroid Build Coastguard Worker                                 u4_symbol = ((u1_mps_state >> 6) & 0x1);
359*495ae853SAndroid Build Coastguard Worker                                 u1_mps_state = (table_lookup >> 8) & 0x7F;
360*495ae853SAndroid Build Coastguard Worker 
361*495ae853SAndroid Build Coastguard Worker                                 CHECK_IF_LPS(u4_code_int_range,
362*495ae853SAndroid Build Coastguard Worker                                              u4_code_int_val_ofst, u4_symbol,
363*495ae853SAndroid Build Coastguard Worker                                              u4_int_range_lps, u1_mps_state,
364*495ae853SAndroid Build Coastguard Worker                                              table_lookup)
365*495ae853SAndroid Build Coastguard Worker 
366*495ae853SAndroid Build Coastguard Worker                                 if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
367*495ae853SAndroid Build Coastguard Worker                                 {
368*495ae853SAndroid Build Coastguard Worker 
369*495ae853SAndroid Build Coastguard Worker                                     RENORM_RANGE_OFFSET(u4_code_int_range,
370*495ae853SAndroid Build Coastguard Worker                                                         u4_code_int_val_ofst,
371*495ae853SAndroid Build Coastguard Worker                                                         u4_offset, pu4_buffer)
372*495ae853SAndroid Build Coastguard Worker                                 }
373*495ae853SAndroid Build Coastguard Worker 
374*495ae853SAndroid Build Coastguard Worker                                 INC_BIN_COUNT(ps_cab_env);
375*495ae853SAndroid Build Coastguard Worker 
376*495ae853SAndroid Build Coastguard Worker                                 ps_bin_ctxt->u1_mps_state = u1_mps_state;
377*495ae853SAndroid Build Coastguard Worker                             }
378*495ae853SAndroid Build Coastguard Worker 
379*495ae853SAndroid Build Coastguard Worker                             INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);
380*495ae853SAndroid Build Coastguard Worker 
381*495ae853SAndroid Build Coastguard Worker                             u4_value++;
382*495ae853SAndroid Build Coastguard Worker                             ps_bin_ctxt = p_ctxt_abs_level + (u4_ctx_inc >> 4);
383*495ae853SAndroid Build Coastguard Worker 
384*495ae853SAndroid Build Coastguard Worker                         }
385*495ae853SAndroid Build Coastguard Worker                         while(u4_symbol && (u4_value < UCOFF_LEVEL));
386*495ae853SAndroid Build Coastguard Worker 
387*495ae853SAndroid Build Coastguard Worker                         ui_prefix = u4_value - 1 + u4_symbol;
388*495ae853SAndroid Build Coastguard Worker 
389*495ae853SAndroid Build Coastguard Worker                     }
390*495ae853SAndroid Build Coastguard Worker 
391*495ae853SAndroid Build Coastguard Worker                     if(ui_prefix == UCOFF_LEVEL)
392*495ae853SAndroid Build Coastguard Worker                     {
393*495ae853SAndroid Build Coastguard Worker                         UWORD32 ui16_sufS = 0;
394*495ae853SAndroid Build Coastguard Worker                         UWORD32 u1_max_bins;
395*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_value;
396*495ae853SAndroid Build Coastguard Worker 
397*495ae853SAndroid Build Coastguard Worker                         i2_abs_lvl = UCOFF_LEVEL;
398*495ae853SAndroid Build Coastguard Worker                         /*inlining ih264d_decode_bypass_bins_unary begins*/
399*495ae853SAndroid Build Coastguard Worker 
400*495ae853SAndroid Build Coastguard Worker                         {
401*495ae853SAndroid Build Coastguard Worker                             UWORD32 uc_bin;
402*495ae853SAndroid Build Coastguard Worker                             UWORD32 bits_to_flush;
403*495ae853SAndroid Build Coastguard Worker 
404*495ae853SAndroid Build Coastguard Worker 
405*495ae853SAndroid Build Coastguard Worker                             bits_to_flush = 0;
406*495ae853SAndroid Build Coastguard Worker                             /*renormalize to ensure there 23 bits more in the u4_code_int_val_ofst*/
407*495ae853SAndroid Build Coastguard Worker                             {
408*495ae853SAndroid Build Coastguard Worker                                 UWORD32 u4_clz, read_bits;
409*495ae853SAndroid Build Coastguard Worker 
410*495ae853SAndroid Build Coastguard Worker                                 u4_clz = CLZ(u4_code_int_range);
411*495ae853SAndroid Build Coastguard Worker                                 FLUSHBITS(u4_offset, u4_clz)
412*495ae853SAndroid Build Coastguard Worker                                 NEXTBITS(read_bits, u4_offset, pu4_buffer, CABAC_BITS_TO_READ)
413*495ae853SAndroid Build Coastguard Worker                                 u4_code_int_range = u4_code_int_range << u4_clz;
414*495ae853SAndroid Build Coastguard Worker                                 u4_code_int_val_ofst = (u4_code_int_val_ofst
415*495ae853SAndroid Build Coastguard Worker                                                 << u4_clz) | read_bits;
416*495ae853SAndroid Build Coastguard Worker 
417*495ae853SAndroid Build Coastguard Worker                             }
418*495ae853SAndroid Build Coastguard Worker 
419*495ae853SAndroid Build Coastguard Worker                             do
420*495ae853SAndroid Build Coastguard Worker                             {
421*495ae853SAndroid Build Coastguard Worker                                 bits_to_flush++;
422*495ae853SAndroid Build Coastguard Worker 
423*495ae853SAndroid Build Coastguard Worker                                 u4_code_int_range = u4_code_int_range >> 1;
424*495ae853SAndroid Build Coastguard Worker 
425*495ae853SAndroid Build Coastguard Worker                                 if(u4_code_int_val_ofst >= u4_code_int_range)
426*495ae853SAndroid Build Coastguard Worker                                 {
427*495ae853SAndroid Build Coastguard Worker                                     /* S=1 */
428*495ae853SAndroid Build Coastguard Worker                                     uc_bin = 1;
429*495ae853SAndroid Build Coastguard Worker                                     u4_code_int_val_ofst -= u4_code_int_range;
430*495ae853SAndroid Build Coastguard Worker                                 }
431*495ae853SAndroid Build Coastguard Worker                                 else
432*495ae853SAndroid Build Coastguard Worker                                 {
433*495ae853SAndroid Build Coastguard Worker                                     /* S=0 */
434*495ae853SAndroid Build Coastguard Worker                                     uc_bin = 0;
435*495ae853SAndroid Build Coastguard Worker                                 }
436*495ae853SAndroid Build Coastguard Worker 
437*495ae853SAndroid Build Coastguard Worker                                 INC_BIN_COUNT(
438*495ae853SAndroid Build Coastguard Worker                                                 ps_cab_env);INC_BYPASS_BINS(ps_cab_env);
439*495ae853SAndroid Build Coastguard Worker 
440*495ae853SAndroid Build Coastguard Worker                             }
441*495ae853SAndroid Build Coastguard Worker                             while(uc_bin && (bits_to_flush < CABAC_BITS_TO_READ));
442*495ae853SAndroid Build Coastguard Worker 
443*495ae853SAndroid Build Coastguard Worker                             u4_value = (bits_to_flush - 1);
444*495ae853SAndroid Build Coastguard Worker 
445*495ae853SAndroid Build Coastguard Worker                         }
446*495ae853SAndroid Build Coastguard Worker                         /*inlining ih264d_decode_bypass_bins_unary ends*/
447*495ae853SAndroid Build Coastguard Worker 
448*495ae853SAndroid Build Coastguard Worker                         ui16_sufS = (1 << u4_value);
449*495ae853SAndroid Build Coastguard Worker                         u1_max_bins = u4_value;
450*495ae853SAndroid Build Coastguard Worker 
451*495ae853SAndroid Build Coastguard Worker                         if(u4_value > 0)
452*495ae853SAndroid Build Coastguard Worker                         {
453*495ae853SAndroid Build Coastguard Worker 
454*495ae853SAndroid Build Coastguard Worker                             /*inline bypassbins_flc begins*/
455*495ae853SAndroid Build Coastguard Worker 
456*495ae853SAndroid Build Coastguard Worker                             if(u4_value > 10)
457*495ae853SAndroid Build Coastguard Worker                             {
458*495ae853SAndroid Build Coastguard Worker                                 UWORD32 u4_clz, read_bits;
459*495ae853SAndroid Build Coastguard Worker 
460*495ae853SAndroid Build Coastguard Worker                                 u4_clz = CLZ(u4_code_int_range);
461*495ae853SAndroid Build Coastguard Worker                                 FLUSHBITS(u4_offset, u4_clz)
462*495ae853SAndroid Build Coastguard Worker                                 NEXTBITS(read_bits, u4_offset, pu4_buffer, CABAC_BITS_TO_READ)
463*495ae853SAndroid Build Coastguard Worker                                 u4_code_int_range = u4_code_int_range << u4_clz;
464*495ae853SAndroid Build Coastguard Worker                                 u4_code_int_val_ofst = (u4_code_int_val_ofst
465*495ae853SAndroid Build Coastguard Worker                                                 << u4_clz) | read_bits;
466*495ae853SAndroid Build Coastguard Worker                             }
467*495ae853SAndroid Build Coastguard Worker 
468*495ae853SAndroid Build Coastguard Worker                             {
469*495ae853SAndroid Build Coastguard Worker                                 UWORD32 ui_bins;
470*495ae853SAndroid Build Coastguard Worker                                 UWORD32 uc_bin;
471*495ae853SAndroid Build Coastguard Worker                                 UWORD32 bits_to_flush;
472*495ae853SAndroid Build Coastguard Worker 
473*495ae853SAndroid Build Coastguard Worker                                 ui_bins = 0;
474*495ae853SAndroid Build Coastguard Worker                                 bits_to_flush = 0;
475*495ae853SAndroid Build Coastguard Worker 
476*495ae853SAndroid Build Coastguard Worker                                 do
477*495ae853SAndroid Build Coastguard Worker                                 {
478*495ae853SAndroid Build Coastguard Worker                                     bits_to_flush++;
479*495ae853SAndroid Build Coastguard Worker 
480*495ae853SAndroid Build Coastguard Worker                                     u4_code_int_range = u4_code_int_range >> 1;
481*495ae853SAndroid Build Coastguard Worker 
482*495ae853SAndroid Build Coastguard Worker                                     if(u4_code_int_val_ofst
483*495ae853SAndroid Build Coastguard Worker                                                     >= u4_code_int_range)
484*495ae853SAndroid Build Coastguard Worker                                     {
485*495ae853SAndroid Build Coastguard Worker                                         /* S=1 */
486*495ae853SAndroid Build Coastguard Worker                                         uc_bin = 1;
487*495ae853SAndroid Build Coastguard Worker                                         u4_code_int_val_ofst -=
488*495ae853SAndroid Build Coastguard Worker                                                         u4_code_int_range;
489*495ae853SAndroid Build Coastguard Worker                                     }
490*495ae853SAndroid Build Coastguard Worker                                     else
491*495ae853SAndroid Build Coastguard Worker                                     {
492*495ae853SAndroid Build Coastguard Worker                                         /* S=0 */
493*495ae853SAndroid Build Coastguard Worker                                         uc_bin = 0;
494*495ae853SAndroid Build Coastguard Worker                                     }
495*495ae853SAndroid Build Coastguard Worker 
496*495ae853SAndroid Build Coastguard Worker                                     INC_BIN_COUNT(
497*495ae853SAndroid Build Coastguard Worker                                                     ps_cab_env);INC_BYPASS_BINS(ps_cab_env);
498*495ae853SAndroid Build Coastguard Worker 
499*495ae853SAndroid Build Coastguard Worker                                     ui_bins = ((ui_bins << 1) | uc_bin);
500*495ae853SAndroid Build Coastguard Worker 
501*495ae853SAndroid Build Coastguard Worker                                 }
502*495ae853SAndroid Build Coastguard Worker                                 while(bits_to_flush < u1_max_bins);
503*495ae853SAndroid Build Coastguard Worker 
504*495ae853SAndroid Build Coastguard Worker                                 u4_value = ui_bins;
505*495ae853SAndroid Build Coastguard Worker                             }
506*495ae853SAndroid Build Coastguard Worker 
507*495ae853SAndroid Build Coastguard Worker                             /*inline bypassbins_flc ends*/
508*495ae853SAndroid Build Coastguard Worker 
509*495ae853SAndroid Build Coastguard Worker                         }
510*495ae853SAndroid Build Coastguard Worker 
511*495ae853SAndroid Build Coastguard Worker                         //Value of K
512*495ae853SAndroid Build Coastguard Worker                         ui16_sufS += u4_value;
513*495ae853SAndroid Build Coastguard Worker                         i2_abs_lvl += ui16_sufS;
514*495ae853SAndroid Build Coastguard Worker 
515*495ae853SAndroid Build Coastguard Worker                     }
516*495ae853SAndroid Build Coastguard Worker                     else
517*495ae853SAndroid Build Coastguard Worker                         i2_abs_lvl = 1 + ui_prefix;
518*495ae853SAndroid Build Coastguard Worker 
519*495ae853SAndroid Build Coastguard Worker                     if(i2_abs_lvl > 1)
520*495ae853SAndroid Build Coastguard Worker                     {
521*495ae853SAndroid Build Coastguard Worker                         u1_abs_level_gt1++;
522*495ae853SAndroid Build Coastguard Worker                     }
523*495ae853SAndroid Build Coastguard Worker                     if(!u1_abs_level_gt1)
524*495ae853SAndroid Build Coastguard Worker                     {
525*495ae853SAndroid Build Coastguard Worker                         u1_abs_level_equal1++;
526*495ae853SAndroid Build Coastguard Worker                         u4_ctx_inc = (5 << 4) + MIN(u1_abs_level_equal1, 4);
527*495ae853SAndroid Build Coastguard Worker                     }
528*495ae853SAndroid Build Coastguard Worker                     else
529*495ae853SAndroid Build Coastguard Worker                         u4_ctx_inc = (5 + MIN(u1_abs_level_gt1, 4)) << 4;
530*495ae853SAndroid Build Coastguard Worker 
531*495ae853SAndroid Build Coastguard Worker                     /*u4_ctx_inc = g_table_temp[u1_abs_level_gt1][u1_abs_level_equal1];*/
532*495ae853SAndroid Build Coastguard Worker 
533*495ae853SAndroid Build Coastguard Worker                     /* encode coeff_sign_flag[i] */
534*495ae853SAndroid Build Coastguard Worker 
535*495ae853SAndroid Build Coastguard Worker                     {
536*495ae853SAndroid Build Coastguard Worker                         u4_code_int_range = u4_code_int_range >> 1;
537*495ae853SAndroid Build Coastguard Worker 
538*495ae853SAndroid Build Coastguard Worker                         if(u4_code_int_val_ofst >= (u4_code_int_range))
539*495ae853SAndroid Build Coastguard Worker                         {
540*495ae853SAndroid Build Coastguard Worker                             /* S=1 */
541*495ae853SAndroid Build Coastguard Worker                             u4_code_int_val_ofst -= u4_code_int_range;
542*495ae853SAndroid Build Coastguard Worker                             i2_abs_lvl = (-i2_abs_lvl);
543*495ae853SAndroid Build Coastguard Worker                         }
544*495ae853SAndroid Build Coastguard Worker 
545*495ae853SAndroid Build Coastguard Worker                     }
546*495ae853SAndroid Build Coastguard Worker                     num_sig_coeffs--;
547*495ae853SAndroid Build Coastguard Worker                     *pi2_coeff_data++ = i2_abs_lvl;
548*495ae853SAndroid Build Coastguard Worker                 }
549*495ae853SAndroid Build Coastguard Worker             }
550*495ae853SAndroid Build Coastguard Worker             while(num_sig_coeffs > 0);
551*495ae853SAndroid Build Coastguard Worker         }
552*495ae853SAndroid Build Coastguard Worker     }
553*495ae853SAndroid Build Coastguard Worker 
554*495ae853SAndroid Build Coastguard Worker     if(u4_coded_flag)
555*495ae853SAndroid Build Coastguard Worker     {
556*495ae853SAndroid Build Coastguard Worker         WORD32 offset;
557*495ae853SAndroid Build Coastguard Worker         offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4;
558*495ae853SAndroid Build Coastguard Worker         offset = ALIGN4(offset);
559*495ae853SAndroid Build Coastguard Worker         ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset);
560*495ae853SAndroid Build Coastguard Worker     }
561*495ae853SAndroid Build Coastguard Worker 
562*495ae853SAndroid Build Coastguard Worker 
563*495ae853SAndroid Build Coastguard Worker     /*updating structures*/
564*495ae853SAndroid Build Coastguard Worker     ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
565*495ae853SAndroid Build Coastguard Worker     ps_cab_env->u4_code_int_range = u4_code_int_range;
566*495ae853SAndroid Build Coastguard Worker     ps_bitstrm->u4_ofst = u4_offset;
567*495ae853SAndroid Build Coastguard Worker     return (u4_coded_flag);
568*495ae853SAndroid Build Coastguard Worker }
569*495ae853SAndroid Build Coastguard Worker /*!
570*495ae853SAndroid Build Coastguard Worker  ********************************************************************************
571*495ae853SAndroid Build Coastguard Worker  *   \if Function name : ih264d_read_coeff8x8_cabac \endif
572*495ae853SAndroid Build Coastguard Worker  *
573*495ae853SAndroid Build Coastguard Worker  *   \brief  This function encodes residual_block_cabac as defined in 7.3.5.3.2.
574*495ae853SAndroid Build Coastguard Worker  when transform_8x8_flag  = 1
575*495ae853SAndroid Build Coastguard Worker  *
576*495ae853SAndroid Build Coastguard Worker  *   \return
577*495ae853SAndroid Build Coastguard Worker  *       Returns the index of last significant coeff.
578*495ae853SAndroid Build Coastguard Worker  *
579*495ae853SAndroid Build Coastguard Worker  ********************************************************************************
580*495ae853SAndroid Build Coastguard Worker  */
581*495ae853SAndroid Build Coastguard Worker 
ih264d_read_coeff8x8_cabac(dec_bit_stream_t * ps_bitstrm,dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info)582*495ae853SAndroid Build Coastguard Worker void ih264d_read_coeff8x8_cabac(dec_bit_stream_t *ps_bitstrm,
583*495ae853SAndroid Build Coastguard Worker                                 dec_struct_t *ps_dec, /*!< pointer to access global variables*/
584*495ae853SAndroid Build Coastguard Worker                                 dec_mb_info_t *ps_cur_mb_info)
585*495ae853SAndroid Build Coastguard Worker {
586*495ae853SAndroid Build Coastguard Worker     decoding_envirnoment_t *ps_cab_env = &ps_dec->s_cab_dec_env;
587*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_offset, *pu4_buffer;
588*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_code_int_range, u4_code_int_val_ofst;
589*495ae853SAndroid Build Coastguard Worker 
590*495ae853SAndroid Build Coastguard Worker     /* High profile related declarations */
591*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_field_coding_flag = ps_cur_mb_info->ps_curmb->u1_mb_fld;
592*495ae853SAndroid Build Coastguard Worker     const UWORD8 *pu1_lastcoeff_context_inc =
593*495ae853SAndroid Build Coastguard Worker                     (UWORD8 *)gau1_ih264d_lastcoeff_context_inc;
594*495ae853SAndroid Build Coastguard Worker     const UWORD8 *pu1_sigcoeff_context_inc;
595*495ae853SAndroid Build Coastguard Worker     bin_ctxt_model_t *ps_ctxt_sig_coeff;
596*495ae853SAndroid Build Coastguard Worker     WORD32 num_sig_coeffs = 0;
597*495ae853SAndroid Build Coastguard Worker     tu_blk8x8_coeff_data_t *ps_tu_8x8;
598*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_coeff_data;
599*495ae853SAndroid Build Coastguard Worker 
600*495ae853SAndroid Build Coastguard Worker     /*loading from strcuctures*/
601*495ae853SAndroid Build Coastguard Worker 
602*495ae853SAndroid Build Coastguard Worker     ps_tu_8x8 = (tu_blk8x8_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
603*495ae853SAndroid Build Coastguard Worker     ps_tu_8x8->au4_sig_coeff_map[0] = 0;
604*495ae853SAndroid Build Coastguard Worker     ps_tu_8x8->au4_sig_coeff_map[1] = 0;
605*495ae853SAndroid Build Coastguard Worker     pi2_coeff_data = &ps_tu_8x8->ai2_level[0];
606*495ae853SAndroid Build Coastguard Worker 
607*495ae853SAndroid Build Coastguard Worker 
608*495ae853SAndroid Build Coastguard Worker     if(!u1_field_coding_flag)
609*495ae853SAndroid Build Coastguard Worker     {
610*495ae853SAndroid Build Coastguard Worker         pu1_sigcoeff_context_inc =
611*495ae853SAndroid Build Coastguard Worker                         (UWORD8 *)gau1_ih264d_sigcoeff_context_inc_frame;
612*495ae853SAndroid Build Coastguard Worker 
613*495ae853SAndroid Build Coastguard Worker         /*******************************************************************/
614*495ae853SAndroid Build Coastguard Worker         /* last coefficient context is derived from significant coeff u4_flag */
615*495ae853SAndroid Build Coastguard Worker         /* only significant coefficient matrix need to be initialized      */
616*495ae853SAndroid Build Coastguard Worker         /*******************************************************************/
617*495ae853SAndroid Build Coastguard Worker         ps_ctxt_sig_coeff = ps_dec->s_high_profile.ps_sigcoeff_8x8_frame;
618*495ae853SAndroid Build Coastguard Worker     }
619*495ae853SAndroid Build Coastguard Worker     else
620*495ae853SAndroid Build Coastguard Worker     {
621*495ae853SAndroid Build Coastguard Worker         pu1_sigcoeff_context_inc =
622*495ae853SAndroid Build Coastguard Worker                         (UWORD8 *)gau1_ih264d_sigcoeff_context_inc_field;
623*495ae853SAndroid Build Coastguard Worker 
624*495ae853SAndroid Build Coastguard Worker         /*******************************************************************/
625*495ae853SAndroid Build Coastguard Worker         /* last coefficient context is derived from significant coeff u4_flag */
626*495ae853SAndroid Build Coastguard Worker         /* only significant coefficient matrix need to be initialized      */
627*495ae853SAndroid Build Coastguard Worker         /*******************************************************************/
628*495ae853SAndroid Build Coastguard Worker         ps_ctxt_sig_coeff = ps_dec->s_high_profile.ps_sigcoeff_8x8_field;
629*495ae853SAndroid Build Coastguard Worker     }
630*495ae853SAndroid Build Coastguard Worker 
631*495ae853SAndroid Build Coastguard Worker     /*loading from strcuctures*/
632*495ae853SAndroid Build Coastguard Worker 
633*495ae853SAndroid Build Coastguard Worker     u4_offset = ps_bitstrm->u4_ofst;
634*495ae853SAndroid Build Coastguard Worker     pu4_buffer = ps_bitstrm->pu4_buffer;
635*495ae853SAndroid Build Coastguard Worker 
636*495ae853SAndroid Build Coastguard Worker     u4_code_int_range = ps_cab_env->u4_code_int_range;
637*495ae853SAndroid Build Coastguard Worker     u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
638*495ae853SAndroid Build Coastguard Worker 
639*495ae853SAndroid Build Coastguard Worker     {
640*495ae853SAndroid Build Coastguard Worker         {
641*495ae853SAndroid Build Coastguard Worker             bin_ctxt_model_t *p_binCtxt_last, *p_binCtxt_last_org,
642*495ae853SAndroid Build Coastguard Worker                             *p_ctxt_sig_coeff_org;
643*495ae853SAndroid Build Coastguard Worker             UWORD32 uc_last_coeff_idx;
644*495ae853SAndroid Build Coastguard Worker             UWORD32 uc_bin;
645*495ae853SAndroid Build Coastguard Worker             UWORD32 i;
646*495ae853SAndroid Build Coastguard Worker 
647*495ae853SAndroid Build Coastguard Worker             i = 0;
648*495ae853SAndroid Build Coastguard Worker 
649*495ae853SAndroid Build Coastguard Worker             uc_last_coeff_idx = 63;
650*495ae853SAndroid Build Coastguard Worker 
651*495ae853SAndroid Build Coastguard Worker             p_binCtxt_last_org = ps_ctxt_sig_coeff
652*495ae853SAndroid Build Coastguard Worker                             + LAST_COEFF_CTXT_MINUS_SIG_COEFF_CTXT_8X8;
653*495ae853SAndroid Build Coastguard Worker 
654*495ae853SAndroid Build Coastguard Worker             p_ctxt_sig_coeff_org = ps_ctxt_sig_coeff;
655*495ae853SAndroid Build Coastguard Worker 
656*495ae853SAndroid Build Coastguard Worker             do
657*495ae853SAndroid Build Coastguard Worker             {
658*495ae853SAndroid Build Coastguard Worker                 /*inilined DecodeDecision_onebin begins*/
659*495ae853SAndroid Build Coastguard Worker                 {
660*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_qnt_int_range, u4_int_range_lps;
661*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_symbol, u1_mps_state;
662*495ae853SAndroid Build Coastguard Worker                     UWORD32 table_lookup;
663*495ae853SAndroid Build Coastguard Worker                     const UWORD32 *pu4_table =
664*495ae853SAndroid Build Coastguard Worker                                     (const UWORD32 *)ps_cab_env->cabac_table;
665*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_clz;
666*495ae853SAndroid Build Coastguard Worker 
667*495ae853SAndroid Build Coastguard Worker                     u1_mps_state = (ps_ctxt_sig_coeff->u1_mps_state);
668*495ae853SAndroid Build Coastguard Worker 
669*495ae853SAndroid Build Coastguard Worker                     u4_clz = CLZ(u4_code_int_range);
670*495ae853SAndroid Build Coastguard Worker 
671*495ae853SAndroid Build Coastguard Worker                     u4_qnt_int_range = u4_code_int_range << u4_clz;
672*495ae853SAndroid Build Coastguard Worker                     u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;
673*495ae853SAndroid Build Coastguard Worker 
674*495ae853SAndroid Build Coastguard Worker                     table_lookup = pu4_table[(u1_mps_state << 2)
675*495ae853SAndroid Build Coastguard Worker                                     + u4_qnt_int_range];
676*495ae853SAndroid Build Coastguard Worker 
677*495ae853SAndroid Build Coastguard Worker                     u4_int_range_lps = table_lookup & 0xff;
678*495ae853SAndroid Build Coastguard Worker 
679*495ae853SAndroid Build Coastguard Worker                     u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
680*495ae853SAndroid Build Coastguard Worker                     u4_code_int_range = u4_code_int_range - u4_int_range_lps;
681*495ae853SAndroid Build Coastguard Worker                     u4_symbol = ((u1_mps_state >> 6) & 0x1);
682*495ae853SAndroid Build Coastguard Worker                     u1_mps_state = (table_lookup >> 8) & 0x7F;
683*495ae853SAndroid Build Coastguard Worker 
684*495ae853SAndroid Build Coastguard Worker                     CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst,
685*495ae853SAndroid Build Coastguard Worker                                  u4_symbol, u4_int_range_lps, u1_mps_state,
686*495ae853SAndroid Build Coastguard Worker                                  table_lookup)
687*495ae853SAndroid Build Coastguard Worker 
688*495ae853SAndroid Build Coastguard Worker                     if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_14)
689*495ae853SAndroid Build Coastguard Worker                     {
690*495ae853SAndroid Build Coastguard Worker                         UWORD32 read_bits, u4_clz;
691*495ae853SAndroid Build Coastguard Worker                         u4_clz = CLZ(u4_code_int_range);
692*495ae853SAndroid Build Coastguard Worker                         NEXTBITS(read_bits, (u4_offset + 23), pu4_buffer,
693*495ae853SAndroid Build Coastguard Worker                                  u4_clz)
694*495ae853SAndroid Build Coastguard Worker                         FLUSHBITS(u4_offset, (u4_clz))
695*495ae853SAndroid Build Coastguard Worker                         u4_code_int_range = u4_code_int_range << u4_clz;
696*495ae853SAndroid Build Coastguard Worker                         u4_code_int_val_ofst = (u4_code_int_val_ofst << u4_clz)
697*495ae853SAndroid Build Coastguard Worker                                         | read_bits;
698*495ae853SAndroid Build Coastguard Worker                     }
699*495ae853SAndroid Build Coastguard Worker 
700*495ae853SAndroid Build Coastguard Worker                     ps_ctxt_sig_coeff->u1_mps_state = u1_mps_state;
701*495ae853SAndroid Build Coastguard Worker                     uc_bin = u4_symbol;
702*495ae853SAndroid Build Coastguard Worker                 }
703*495ae853SAndroid Build Coastguard Worker                 /*incrementing pointer to point to the context of the next bin*/
704*495ae853SAndroid Build Coastguard Worker                 ps_ctxt_sig_coeff = p_ctxt_sig_coeff_org
705*495ae853SAndroid Build Coastguard Worker                                 + pu1_sigcoeff_context_inc[i + 1];
706*495ae853SAndroid Build Coastguard Worker 
707*495ae853SAndroid Build Coastguard Worker                 /*inilined DecodeDecision_onebin ends*/
708*495ae853SAndroid Build Coastguard Worker                 if(uc_bin)
709*495ae853SAndroid Build Coastguard Worker                 {
710*495ae853SAndroid Build Coastguard Worker                     num_sig_coeffs++;
711*495ae853SAndroid Build Coastguard Worker                     SET_BIT(ps_tu_8x8->au4_sig_coeff_map[i>31], (i > 31 ? i - 32:i));
712*495ae853SAndroid Build Coastguard Worker 
713*495ae853SAndroid Build Coastguard Worker                     p_binCtxt_last = p_binCtxt_last_org
714*495ae853SAndroid Build Coastguard Worker                                     + pu1_lastcoeff_context_inc[i];
715*495ae853SAndroid Build Coastguard Worker 
716*495ae853SAndroid Build Coastguard Worker                     /*inilined DecodeDecision_onebin begins*/
717*495ae853SAndroid Build Coastguard Worker 
718*495ae853SAndroid Build Coastguard Worker                     {
719*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_qnt_int_range, u4_int_range_lps;
720*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_symbol, u1_mps_state;
721*495ae853SAndroid Build Coastguard Worker                         UWORD32 table_lookup;
722*495ae853SAndroid Build Coastguard Worker                         const UWORD32 *pu4_table =
723*495ae853SAndroid Build Coastguard Worker                                         (const UWORD32 *)ps_cab_env->cabac_table;
724*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_clz;
725*495ae853SAndroid Build Coastguard Worker 
726*495ae853SAndroid Build Coastguard Worker                         u1_mps_state = (p_binCtxt_last->u1_mps_state);
727*495ae853SAndroid Build Coastguard Worker 
728*495ae853SAndroid Build Coastguard Worker                         u4_clz = CLZ(u4_code_int_range);
729*495ae853SAndroid Build Coastguard Worker                         u4_qnt_int_range = u4_code_int_range << u4_clz;
730*495ae853SAndroid Build Coastguard Worker                         u4_qnt_int_range = (u4_qnt_int_range >> 29)
731*495ae853SAndroid Build Coastguard Worker                                         & 0x3;
732*495ae853SAndroid Build Coastguard Worker 
733*495ae853SAndroid Build Coastguard Worker                         table_lookup = pu4_table[(u1_mps_state << 2)
734*495ae853SAndroid Build Coastguard Worker                                         + u4_qnt_int_range];
735*495ae853SAndroid Build Coastguard Worker                         u4_int_range_lps = table_lookup & 0xff;
736*495ae853SAndroid Build Coastguard Worker 
737*495ae853SAndroid Build Coastguard Worker                         u4_int_range_lps = u4_int_range_lps
738*495ae853SAndroid Build Coastguard Worker                                         << (23 - u4_clz);
739*495ae853SAndroid Build Coastguard Worker 
740*495ae853SAndroid Build Coastguard Worker                         u4_code_int_range = u4_code_int_range
741*495ae853SAndroid Build Coastguard Worker                                         - u4_int_range_lps;
742*495ae853SAndroid Build Coastguard Worker                         u4_symbol = ((u1_mps_state >> 6) & 0x1);
743*495ae853SAndroid Build Coastguard Worker                         u1_mps_state = (table_lookup >> 8) & 0x7F;
744*495ae853SAndroid Build Coastguard Worker 
745*495ae853SAndroid Build Coastguard Worker                         CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst,
746*495ae853SAndroid Build Coastguard Worker                                      u4_symbol, u4_int_range_lps,
747*495ae853SAndroid Build Coastguard Worker                                      u1_mps_state, table_lookup)
748*495ae853SAndroid Build Coastguard Worker 
749*495ae853SAndroid Build Coastguard Worker                         p_binCtxt_last->u1_mps_state = u1_mps_state;
750*495ae853SAndroid Build Coastguard Worker                         uc_bin = u4_symbol;
751*495ae853SAndroid Build Coastguard Worker                     }
752*495ae853SAndroid Build Coastguard Worker 
753*495ae853SAndroid Build Coastguard Worker                     /*inilined DecodeDecision_onebin ends*/
754*495ae853SAndroid Build Coastguard Worker                     if(uc_bin == 1)
755*495ae853SAndroid Build Coastguard Worker                         goto label_read_levels;
756*495ae853SAndroid Build Coastguard Worker 
757*495ae853SAndroid Build Coastguard Worker                 }
758*495ae853SAndroid Build Coastguard Worker 
759*495ae853SAndroid Build Coastguard Worker                 i = i + 1;
760*495ae853SAndroid Build Coastguard Worker 
761*495ae853SAndroid Build Coastguard Worker             }
762*495ae853SAndroid Build Coastguard Worker             while(i < uc_last_coeff_idx);
763*495ae853SAndroid Build Coastguard Worker 
764*495ae853SAndroid Build Coastguard Worker             num_sig_coeffs++;
765*495ae853SAndroid Build Coastguard Worker             SET_BIT(ps_tu_8x8->au4_sig_coeff_map[i>31], (i > 31 ? i - 32:i));
766*495ae853SAndroid Build Coastguard Worker 
767*495ae853SAndroid Build Coastguard Worker             label_read_levels: ;
768*495ae853SAndroid Build Coastguard Worker         }
769*495ae853SAndroid Build Coastguard Worker 
770*495ae853SAndroid Build Coastguard Worker         /// VALUE of No of Coeff in BLOCK = i + 1 for second case else i;
771*495ae853SAndroid Build Coastguard Worker 
772*495ae853SAndroid Build Coastguard Worker         /* Decode coeff_abs_level_minus1 and coeff_sign_flag */
773*495ae853SAndroid Build Coastguard Worker         {
774*495ae853SAndroid Build Coastguard Worker             WORD32 i2_abs_lvl;
775*495ae853SAndroid Build Coastguard Worker             UWORD32 u1_abs_level_equal1 = 1, u1_abs_level_gt1 = 0;
776*495ae853SAndroid Build Coastguard Worker 
777*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_ctx_inc;
778*495ae853SAndroid Build Coastguard Worker             UWORD32 ui_prefix;
779*495ae853SAndroid Build Coastguard Worker             bin_ctxt_model_t *p_ctxt_abs_level;
780*495ae853SAndroid Build Coastguard Worker 
781*495ae853SAndroid Build Coastguard Worker             p_ctxt_abs_level =
782*495ae853SAndroid Build Coastguard Worker                             ps_dec->p_coeff_abs_level_minus1_t[LUMA_8X8_CTXCAT];
783*495ae853SAndroid Build Coastguard Worker             u4_ctx_inc = ((0x51));
784*495ae853SAndroid Build Coastguard Worker 
785*495ae853SAndroid Build Coastguard Worker             /*****************************************************/
786*495ae853SAndroid Build Coastguard Worker             /* Main Loop runs for no. of Significant coefficient */
787*495ae853SAndroid Build Coastguard Worker             /*****************************************************/
788*495ae853SAndroid Build Coastguard Worker             do
789*495ae853SAndroid Build Coastguard Worker             {
790*495ae853SAndroid Build Coastguard Worker                 {
791*495ae853SAndroid Build Coastguard Worker 
792*495ae853SAndroid Build Coastguard Worker                     /*****************************************************/
793*495ae853SAndroid Build Coastguard Worker                     /* inilining a modified ih264d_decode_bins_unary     */
794*495ae853SAndroid Build Coastguard Worker                     /*****************************************************/
795*495ae853SAndroid Build Coastguard Worker 
796*495ae853SAndroid Build Coastguard Worker                     {
797*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_value;
798*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_symbol;
799*495ae853SAndroid Build Coastguard Worker                         bin_ctxt_model_t *ps_bin_ctxt;
800*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_ctx_Inc;
801*495ae853SAndroid Build Coastguard Worker                         u4_value = 0;
802*495ae853SAndroid Build Coastguard Worker 
803*495ae853SAndroid Build Coastguard Worker                         u4_ctx_Inc = u4_ctx_inc & 0xf;
804*495ae853SAndroid Build Coastguard Worker                         ps_bin_ctxt = p_ctxt_abs_level + u4_ctx_Inc;
805*495ae853SAndroid Build Coastguard Worker 
806*495ae853SAndroid Build Coastguard Worker                         do
807*495ae853SAndroid Build Coastguard Worker                         {
808*495ae853SAndroid Build Coastguard Worker                             {
809*495ae853SAndroid Build Coastguard Worker                                 UWORD32 u4_qnt_int_range,
810*495ae853SAndroid Build Coastguard Worker                                                 u4_int_range_lps;
811*495ae853SAndroid Build Coastguard Worker                                 UWORD32 u1_mps_state;
812*495ae853SAndroid Build Coastguard Worker                                 UWORD32 table_lookup;
813*495ae853SAndroid Build Coastguard Worker                                 const UWORD32 *pu4_table =
814*495ae853SAndroid Build Coastguard Worker                                                 (const UWORD32 *)ps_cab_env->cabac_table;
815*495ae853SAndroid Build Coastguard Worker                                 UWORD32 u4_clz;
816*495ae853SAndroid Build Coastguard Worker 
817*495ae853SAndroid Build Coastguard Worker                                 u1_mps_state = (ps_bin_ctxt->u1_mps_state);
818*495ae853SAndroid Build Coastguard Worker                                 u4_clz = CLZ(u4_code_int_range);
819*495ae853SAndroid Build Coastguard Worker                                 u4_qnt_int_range = u4_code_int_range
820*495ae853SAndroid Build Coastguard Worker                                                 << u4_clz;
821*495ae853SAndroid Build Coastguard Worker                                 u4_qnt_int_range = (u4_qnt_int_range
822*495ae853SAndroid Build Coastguard Worker                                                 >> 29) & 0x3;
823*495ae853SAndroid Build Coastguard Worker                                 table_lookup = pu4_table[(u1_mps_state << 2)
824*495ae853SAndroid Build Coastguard Worker                                                 + u4_qnt_int_range];
825*495ae853SAndroid Build Coastguard Worker                                 u4_int_range_lps = table_lookup & 0xff;
826*495ae853SAndroid Build Coastguard Worker 
827*495ae853SAndroid Build Coastguard Worker                                 u4_int_range_lps = u4_int_range_lps
828*495ae853SAndroid Build Coastguard Worker                                                 << (23 - u4_clz);
829*495ae853SAndroid Build Coastguard Worker                                 u4_code_int_range = u4_code_int_range
830*495ae853SAndroid Build Coastguard Worker                                                 - u4_int_range_lps;
831*495ae853SAndroid Build Coastguard Worker                                 u4_symbol = ((u1_mps_state >> 6) & 0x1);
832*495ae853SAndroid Build Coastguard Worker                                 u1_mps_state = (table_lookup >> 8) & 0x7F;
833*495ae853SAndroid Build Coastguard Worker 
834*495ae853SAndroid Build Coastguard Worker                                 CHECK_IF_LPS(u4_code_int_range,
835*495ae853SAndroid Build Coastguard Worker                                              u4_code_int_val_ofst, u4_symbol,
836*495ae853SAndroid Build Coastguard Worker                                              u4_int_range_lps, u1_mps_state,
837*495ae853SAndroid Build Coastguard Worker                                              table_lookup)
838*495ae853SAndroid Build Coastguard Worker 
839*495ae853SAndroid Build Coastguard Worker                                 if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
840*495ae853SAndroid Build Coastguard Worker                                 {
841*495ae853SAndroid Build Coastguard Worker 
842*495ae853SAndroid Build Coastguard Worker                                     RENORM_RANGE_OFFSET(u4_code_int_range,
843*495ae853SAndroid Build Coastguard Worker                                                         u4_code_int_val_ofst,
844*495ae853SAndroid Build Coastguard Worker                                                         u4_offset, pu4_buffer)
845*495ae853SAndroid Build Coastguard Worker                                 }
846*495ae853SAndroid Build Coastguard Worker 
847*495ae853SAndroid Build Coastguard Worker                                 ps_bin_ctxt->u1_mps_state = u1_mps_state;
848*495ae853SAndroid Build Coastguard Worker                             }
849*495ae853SAndroid Build Coastguard Worker 
850*495ae853SAndroid Build Coastguard Worker                             u4_value++;
851*495ae853SAndroid Build Coastguard Worker                             ps_bin_ctxt = p_ctxt_abs_level + (u4_ctx_inc >> 4);
852*495ae853SAndroid Build Coastguard Worker 
853*495ae853SAndroid Build Coastguard Worker                         }
854*495ae853SAndroid Build Coastguard Worker                         while(u4_symbol && (u4_value < UCOFF_LEVEL));
855*495ae853SAndroid Build Coastguard Worker 
856*495ae853SAndroid Build Coastguard Worker                         ui_prefix = u4_value - 1 + u4_symbol;
857*495ae853SAndroid Build Coastguard Worker                     }
858*495ae853SAndroid Build Coastguard Worker 
859*495ae853SAndroid Build Coastguard Worker                     if(ui_prefix == UCOFF_LEVEL)
860*495ae853SAndroid Build Coastguard Worker                     {
861*495ae853SAndroid Build Coastguard Worker                         UWORD32 ui16_sufS = 0;
862*495ae853SAndroid Build Coastguard Worker                         UWORD32 u1_max_bins;
863*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_value;
864*495ae853SAndroid Build Coastguard Worker 
865*495ae853SAndroid Build Coastguard Worker                         i2_abs_lvl = UCOFF_LEVEL;
866*495ae853SAndroid Build Coastguard Worker                         /*inlining ih264d_decode_bypass_bins_unary begins*/
867*495ae853SAndroid Build Coastguard Worker 
868*495ae853SAndroid Build Coastguard Worker                         {
869*495ae853SAndroid Build Coastguard Worker                             UWORD32 uc_bin;
870*495ae853SAndroid Build Coastguard Worker                             UWORD32 bits_to_flush;
871*495ae853SAndroid Build Coastguard Worker 
872*495ae853SAndroid Build Coastguard Worker 
873*495ae853SAndroid Build Coastguard Worker                             bits_to_flush = 0;
874*495ae853SAndroid Build Coastguard Worker                             /*renormalize to ensure there 23 bits more in the u4_code_int_val_ofst*/
875*495ae853SAndroid Build Coastguard Worker                             {
876*495ae853SAndroid Build Coastguard Worker                                 UWORD32 u4_clz, read_bits;
877*495ae853SAndroid Build Coastguard Worker 
878*495ae853SAndroid Build Coastguard Worker                                 u4_clz = CLZ(u4_code_int_range);
879*495ae853SAndroid Build Coastguard Worker                                 FLUSHBITS(u4_offset, u4_clz)
880*495ae853SAndroid Build Coastguard Worker                                 NEXTBITS(read_bits, u4_offset, pu4_buffer, CABAC_BITS_TO_READ)
881*495ae853SAndroid Build Coastguard Worker                                 u4_code_int_range = u4_code_int_range << u4_clz;
882*495ae853SAndroid Build Coastguard Worker                                 u4_code_int_val_ofst = (u4_code_int_val_ofst
883*495ae853SAndroid Build Coastguard Worker                                                 << u4_clz) | read_bits;
884*495ae853SAndroid Build Coastguard Worker                             }
885*495ae853SAndroid Build Coastguard Worker 
886*495ae853SAndroid Build Coastguard Worker                             do
887*495ae853SAndroid Build Coastguard Worker                             {
888*495ae853SAndroid Build Coastguard Worker                                 bits_to_flush++;
889*495ae853SAndroid Build Coastguard Worker 
890*495ae853SAndroid Build Coastguard Worker                                 u4_code_int_range = u4_code_int_range >> 1;
891*495ae853SAndroid Build Coastguard Worker 
892*495ae853SAndroid Build Coastguard Worker                                 if(u4_code_int_val_ofst >= u4_code_int_range)
893*495ae853SAndroid Build Coastguard Worker                                 {
894*495ae853SAndroid Build Coastguard Worker                                     /* S=1 */
895*495ae853SAndroid Build Coastguard Worker                                     uc_bin = 1;
896*495ae853SAndroid Build Coastguard Worker                                     u4_code_int_val_ofst -= u4_code_int_range;
897*495ae853SAndroid Build Coastguard Worker                                 }
898*495ae853SAndroid Build Coastguard Worker                                 else
899*495ae853SAndroid Build Coastguard Worker                                 {
900*495ae853SAndroid Build Coastguard Worker                                     /* S=0 */
901*495ae853SAndroid Build Coastguard Worker                                     uc_bin = 0;
902*495ae853SAndroid Build Coastguard Worker                                 }
903*495ae853SAndroid Build Coastguard Worker 
904*495ae853SAndroid Build Coastguard Worker                             }
905*495ae853SAndroid Build Coastguard Worker                             while(uc_bin && (bits_to_flush < CABAC_BITS_TO_READ));
906*495ae853SAndroid Build Coastguard Worker 
907*495ae853SAndroid Build Coastguard Worker                             u4_value = (bits_to_flush - 1);
908*495ae853SAndroid Build Coastguard Worker                         }
909*495ae853SAndroid Build Coastguard Worker                         /*inlining ih264d_decode_bypass_bins_unary ends*/
910*495ae853SAndroid Build Coastguard Worker 
911*495ae853SAndroid Build Coastguard Worker                         ui16_sufS = (1 << u4_value);
912*495ae853SAndroid Build Coastguard Worker                         u1_max_bins = u4_value;
913*495ae853SAndroid Build Coastguard Worker 
914*495ae853SAndroid Build Coastguard Worker                         if(u4_value > 0)
915*495ae853SAndroid Build Coastguard Worker                         {
916*495ae853SAndroid Build Coastguard Worker                             /*inline bypassbins_flc begins*/
917*495ae853SAndroid Build Coastguard Worker 
918*495ae853SAndroid Build Coastguard Worker                             if(u4_value > 10)
919*495ae853SAndroid Build Coastguard Worker                             {
920*495ae853SAndroid Build Coastguard Worker                                 UWORD32 u4_clz, read_bits;
921*495ae853SAndroid Build Coastguard Worker 
922*495ae853SAndroid Build Coastguard Worker                                 u4_clz = CLZ(u4_code_int_range);
923*495ae853SAndroid Build Coastguard Worker                                 FLUSHBITS(u4_offset, u4_clz)
924*495ae853SAndroid Build Coastguard Worker                                 NEXTBITS(read_bits, u4_offset, pu4_buffer, CABAC_BITS_TO_READ)
925*495ae853SAndroid Build Coastguard Worker                                 u4_code_int_range = u4_code_int_range << u4_clz;
926*495ae853SAndroid Build Coastguard Worker                                 u4_code_int_val_ofst = (u4_code_int_val_ofst
927*495ae853SAndroid Build Coastguard Worker                                                 << u4_clz) | read_bits;
928*495ae853SAndroid Build Coastguard Worker                             }
929*495ae853SAndroid Build Coastguard Worker 
930*495ae853SAndroid Build Coastguard Worker                             {
931*495ae853SAndroid Build Coastguard Worker                                 UWORD32 ui_bins;
932*495ae853SAndroid Build Coastguard Worker                                 UWORD32 uc_bin;
933*495ae853SAndroid Build Coastguard Worker                                 UWORD32 bits_to_flush;
934*495ae853SAndroid Build Coastguard Worker 
935*495ae853SAndroid Build Coastguard Worker                                 ui_bins = 0;
936*495ae853SAndroid Build Coastguard Worker                                 bits_to_flush = 0;
937*495ae853SAndroid Build Coastguard Worker 
938*495ae853SAndroid Build Coastguard Worker                                 do
939*495ae853SAndroid Build Coastguard Worker                                 {
940*495ae853SAndroid Build Coastguard Worker                                     bits_to_flush++;
941*495ae853SAndroid Build Coastguard Worker 
942*495ae853SAndroid Build Coastguard Worker                                     u4_code_int_range = u4_code_int_range >> 1;
943*495ae853SAndroid Build Coastguard Worker 
944*495ae853SAndroid Build Coastguard Worker                                     if(u4_code_int_val_ofst
945*495ae853SAndroid Build Coastguard Worker                                                     >= u4_code_int_range)
946*495ae853SAndroid Build Coastguard Worker                                     {
947*495ae853SAndroid Build Coastguard Worker                                         /* S=1 */
948*495ae853SAndroid Build Coastguard Worker                                         uc_bin = 1;
949*495ae853SAndroid Build Coastguard Worker                                         u4_code_int_val_ofst -=
950*495ae853SAndroid Build Coastguard Worker                                                         u4_code_int_range;
951*495ae853SAndroid Build Coastguard Worker                                     }
952*495ae853SAndroid Build Coastguard Worker                                     else
953*495ae853SAndroid Build Coastguard Worker                                     {
954*495ae853SAndroid Build Coastguard Worker                                         /* S=0 */
955*495ae853SAndroid Build Coastguard Worker                                         uc_bin = 0;
956*495ae853SAndroid Build Coastguard Worker                                     }
957*495ae853SAndroid Build Coastguard Worker 
958*495ae853SAndroid Build Coastguard Worker                                     ui_bins = ((ui_bins << 1) | uc_bin);
959*495ae853SAndroid Build Coastguard Worker 
960*495ae853SAndroid Build Coastguard Worker                                 }
961*495ae853SAndroid Build Coastguard Worker                                 while(bits_to_flush < u1_max_bins);
962*495ae853SAndroid Build Coastguard Worker 
963*495ae853SAndroid Build Coastguard Worker                                 u4_value = ui_bins;
964*495ae853SAndroid Build Coastguard Worker                             }
965*495ae853SAndroid Build Coastguard Worker                             /*inline bypassbins_flc ends*/
966*495ae853SAndroid Build Coastguard Worker                         }
967*495ae853SAndroid Build Coastguard Worker 
968*495ae853SAndroid Build Coastguard Worker                         //Value of K
969*495ae853SAndroid Build Coastguard Worker                         ui16_sufS += u4_value;
970*495ae853SAndroid Build Coastguard Worker                         i2_abs_lvl += (WORD32)ui16_sufS;
971*495ae853SAndroid Build Coastguard Worker                     }
972*495ae853SAndroid Build Coastguard Worker                     else
973*495ae853SAndroid Build Coastguard Worker                     {
974*495ae853SAndroid Build Coastguard Worker                         i2_abs_lvl = 1 + ui_prefix;
975*495ae853SAndroid Build Coastguard Worker                     }
976*495ae853SAndroid Build Coastguard Worker 
977*495ae853SAndroid Build Coastguard Worker                     if(i2_abs_lvl > 1)
978*495ae853SAndroid Build Coastguard Worker                     {
979*495ae853SAndroid Build Coastguard Worker                         u1_abs_level_gt1++;
980*495ae853SAndroid Build Coastguard Worker                     }
981*495ae853SAndroid Build Coastguard Worker                     if(!u1_abs_level_gt1)
982*495ae853SAndroid Build Coastguard Worker                     {
983*495ae853SAndroid Build Coastguard Worker                         u1_abs_level_equal1++;
984*495ae853SAndroid Build Coastguard Worker                         u4_ctx_inc = (5 << 4) + MIN(u1_abs_level_equal1, 4);
985*495ae853SAndroid Build Coastguard Worker                     }
986*495ae853SAndroid Build Coastguard Worker                     else
987*495ae853SAndroid Build Coastguard Worker                     {
988*495ae853SAndroid Build Coastguard Worker                         u4_ctx_inc = (5 + MIN(u1_abs_level_gt1, 4)) << 4;
989*495ae853SAndroid Build Coastguard Worker                     }
990*495ae853SAndroid Build Coastguard Worker 
991*495ae853SAndroid Build Coastguard Worker                     /*u4_ctx_inc = g_table_temp[u1_abs_level_gt1][u1_abs_level_equal1];*/
992*495ae853SAndroid Build Coastguard Worker 
993*495ae853SAndroid Build Coastguard Worker                     /* encode coeff_sign_flag[i] */
994*495ae853SAndroid Build Coastguard Worker 
995*495ae853SAndroid Build Coastguard Worker                     {
996*495ae853SAndroid Build Coastguard Worker                         u4_code_int_range = u4_code_int_range >> 1;
997*495ae853SAndroid Build Coastguard Worker 
998*495ae853SAndroid Build Coastguard Worker                         if(u4_code_int_val_ofst >= (u4_code_int_range))
999*495ae853SAndroid Build Coastguard Worker                         {
1000*495ae853SAndroid Build Coastguard Worker                             /* S=1 */
1001*495ae853SAndroid Build Coastguard Worker                             u4_code_int_val_ofst -= u4_code_int_range;
1002*495ae853SAndroid Build Coastguard Worker                             i2_abs_lvl = (-i2_abs_lvl);
1003*495ae853SAndroid Build Coastguard Worker                         }
1004*495ae853SAndroid Build Coastguard Worker                     }
1005*495ae853SAndroid Build Coastguard Worker 
1006*495ae853SAndroid Build Coastguard Worker                     *pi2_coeff_data++ = i2_abs_lvl;
1007*495ae853SAndroid Build Coastguard Worker                     num_sig_coeffs--;
1008*495ae853SAndroid Build Coastguard Worker                 }
1009*495ae853SAndroid Build Coastguard Worker             }
1010*495ae853SAndroid Build Coastguard Worker             while(num_sig_coeffs > 0);
1011*495ae853SAndroid Build Coastguard Worker         }
1012*495ae853SAndroid Build Coastguard Worker     }
1013*495ae853SAndroid Build Coastguard Worker 
1014*495ae853SAndroid Build Coastguard Worker     {
1015*495ae853SAndroid Build Coastguard Worker         WORD32 offset;
1016*495ae853SAndroid Build Coastguard Worker         offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_8x8;
1017*495ae853SAndroid Build Coastguard Worker         offset = ALIGN4(offset);
1018*495ae853SAndroid Build Coastguard Worker         ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset);
1019*495ae853SAndroid Build Coastguard Worker     }
1020*495ae853SAndroid Build Coastguard Worker 
1021*495ae853SAndroid Build Coastguard Worker     /*updating structures*/
1022*495ae853SAndroid Build Coastguard Worker     ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
1023*495ae853SAndroid Build Coastguard Worker     ps_cab_env->u4_code_int_range = u4_code_int_range;
1024*495ae853SAndroid Build Coastguard Worker     ps_bitstrm->u4_ofst = u4_offset;
1025*495ae853SAndroid Build Coastguard Worker }
1026*495ae853SAndroid Build Coastguard Worker 
1027*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1028*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1029*495ae853SAndroid Build Coastguard Worker /*  Function Name : ih264d_cabac_parse_8x8block                                     */
1030*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1031*495ae853SAndroid Build Coastguard Worker /*  Description   : This function does the residual parsing of 4 subblocks   */
1032*495ae853SAndroid Build Coastguard Worker /*                  in a 8x8 block.                                          */
1033*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1034*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pi2_coeff_block : pointer to residual block where        */
1035*495ae853SAndroid Build Coastguard Worker /*                  decoded and inverse scan coefficients are updated        */
1036*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1037*495ae853SAndroid Build Coastguard Worker /*                  u4_sub_block_strd : indicates the number of sublocks    */
1038*495ae853SAndroid Build Coastguard Worker /*                  in a row. It is 4 for luma and 2 for chroma.             */
1039*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1040*495ae853SAndroid Build Coastguard Worker /*                  u4_ctx_cat : inidicates context category for residual    */
1041*495ae853SAndroid Build Coastguard Worker /*                  decoding.                                                */
1042*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1043*495ae853SAndroid Build Coastguard Worker /*                  ps_dec : pointer to Decstruct (decoder context)          */
1044*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1045*495ae853SAndroid Build Coastguard Worker /*                  pu1_top_nnz : top nnz pointer                            */
1046*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1047*495ae853SAndroid Build Coastguard Worker /*                  pu1_left_nnz : left nnz pointer                          */
1048*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1049*495ae853SAndroid Build Coastguard Worker /*  Globals       : No                                                       */
1050*495ae853SAndroid Build Coastguard Worker /*  Processing    : Parsing for four subblocks in unrolled, top and left nnz */
1051*495ae853SAndroid Build Coastguard Worker /*                  are updated on the fly. csbp is set in accordance to     */
1052*495ae853SAndroid Build Coastguard Worker /*                  decoded numcoeff for the subblock index in raster order  */
1053*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1054*495ae853SAndroid Build Coastguard Worker /*  Outputs       : The updated residue buffer, nnzs and csbp current block  */
1055*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1056*495ae853SAndroid Build Coastguard Worker /*  Returns       : Returns the coded sub block pattern csbp for the block   */
1057*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1058*495ae853SAndroid Build Coastguard Worker /*  Issues        : <List any issues or problems with this function>         */
1059*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1060*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1061*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1062*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1063*495ae853SAndroid Build Coastguard Worker /*         09 10 2008   Jay          Draft                                   */
1064*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1065*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_cabac_parse_8x8block(WORD16 * pi2_coeff_block,UWORD32 u4_sub_block_strd,UWORD32 u4_ctx_cat,dec_struct_t * ps_dec,UWORD8 * pu1_top_nnz,UWORD8 * pu1_left_nnz)1066*495ae853SAndroid Build Coastguard Worker UWORD32 ih264d_cabac_parse_8x8block(WORD16 *pi2_coeff_block,
1067*495ae853SAndroid Build Coastguard Worker                                     UWORD32 u4_sub_block_strd,
1068*495ae853SAndroid Build Coastguard Worker                                     UWORD32 u4_ctx_cat,
1069*495ae853SAndroid Build Coastguard Worker                                     dec_struct_t * ps_dec,
1070*495ae853SAndroid Build Coastguard Worker                                     UWORD8 *pu1_top_nnz,
1071*495ae853SAndroid Build Coastguard Worker                                     UWORD8 *pu1_left_nnz)
1072*495ae853SAndroid Build Coastguard Worker {
1073*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ctxinc, u4_subblock_coded;
1074*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_top0, u4_top1;
1075*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_csbp = 0;
1076*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_idx = 0;
1077*495ae853SAndroid Build Coastguard Worker     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1078*495ae853SAndroid Build Coastguard Worker     bin_ctxt_model_t * const ps_cbf = ps_dec->p_cbf_t[u4_ctx_cat];
1079*495ae853SAndroid Build Coastguard Worker     bin_ctxt_model_t *ps_src_bin_ctxt;
1080*495ae853SAndroid Build Coastguard Worker     bin_ctxt_model_t * const ps_sig_coeff_flag =
1081*495ae853SAndroid Build Coastguard Worker                     ps_dec->p_significant_coeff_flag_t[u4_ctx_cat];
1082*495ae853SAndroid Build Coastguard Worker 
1083*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_inv_scan = ps_dec->pu1_inv_scan;
1084*495ae853SAndroid Build Coastguard Worker 
1085*495ae853SAndroid Build Coastguard Worker     /*------------------------------------------------------*/
1086*495ae853SAndroid Build Coastguard Worker     /* Residual 4x4 decoding: SubBlock 0                    */
1087*495ae853SAndroid Build Coastguard Worker     /*------------------------------------------------------*/
1088*495ae853SAndroid Build Coastguard Worker     u4_ctxinc = ((!!pu1_top_nnz[0]) << 1) + (!!pu1_left_nnz[0]);
1089*495ae853SAndroid Build Coastguard Worker 
1090*495ae853SAndroid Build Coastguard Worker     ps_src_bin_ctxt = ps_cbf + u4_ctxinc;
1091*495ae853SAndroid Build Coastguard Worker 
1092*495ae853SAndroid Build Coastguard Worker     u4_top0 = ih264d_read_coeff4x4_cabac( ps_bitstrm,
1093*495ae853SAndroid Build Coastguard Worker                                          u4_ctx_cat, ps_sig_coeff_flag, ps_dec,
1094*495ae853SAndroid Build Coastguard Worker                                          ps_src_bin_ctxt);
1095*495ae853SAndroid Build Coastguard Worker 
1096*495ae853SAndroid Build Coastguard Worker     INSERT_BIT(u4_csbp, u4_idx, u4_top0);
1097*495ae853SAndroid Build Coastguard Worker 
1098*495ae853SAndroid Build Coastguard Worker     /*------------------------------------------------------*/
1099*495ae853SAndroid Build Coastguard Worker     /* Residual 4x4 decoding: SubBlock 1                    */
1100*495ae853SAndroid Build Coastguard Worker     /*------------------------------------------------------*/
1101*495ae853SAndroid Build Coastguard Worker     u4_idx++;
1102*495ae853SAndroid Build Coastguard Worker     pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
1103*495ae853SAndroid Build Coastguard Worker     u4_ctxinc = ((!!pu1_top_nnz[1]) << 1) + u4_top0;
1104*495ae853SAndroid Build Coastguard Worker 
1105*495ae853SAndroid Build Coastguard Worker     ps_src_bin_ctxt = ps_cbf + u4_ctxinc;
1106*495ae853SAndroid Build Coastguard Worker 
1107*495ae853SAndroid Build Coastguard Worker     u4_top1 = ih264d_read_coeff4x4_cabac(ps_bitstrm,
1108*495ae853SAndroid Build Coastguard Worker                                          u4_ctx_cat, ps_sig_coeff_flag, ps_dec,
1109*495ae853SAndroid Build Coastguard Worker                                          ps_src_bin_ctxt);
1110*495ae853SAndroid Build Coastguard Worker 
1111*495ae853SAndroid Build Coastguard Worker     INSERT_BIT(u4_csbp, u4_idx, u4_top1);
1112*495ae853SAndroid Build Coastguard Worker     pu1_left_nnz[0] = u4_top1;
1113*495ae853SAndroid Build Coastguard Worker 
1114*495ae853SAndroid Build Coastguard Worker     /*------------------------------------------------------*/
1115*495ae853SAndroid Build Coastguard Worker     /* Residual 4x4 decoding: SubBlock 2                    */
1116*495ae853SAndroid Build Coastguard Worker     /*------------------------------------------------------*/
1117*495ae853SAndroid Build Coastguard Worker     u4_idx += (u4_sub_block_strd - 1);
1118*495ae853SAndroid Build Coastguard Worker     pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK);
1119*495ae853SAndroid Build Coastguard Worker     u4_ctxinc = (u4_top0 << 1) + (!!pu1_left_nnz[1]);
1120*495ae853SAndroid Build Coastguard Worker 
1121*495ae853SAndroid Build Coastguard Worker     ps_src_bin_ctxt = ps_cbf + u4_ctxinc;
1122*495ae853SAndroid Build Coastguard Worker 
1123*495ae853SAndroid Build Coastguard Worker     u4_subblock_coded = ih264d_read_coeff4x4_cabac(ps_bitstrm, u4_ctx_cat,
1124*495ae853SAndroid Build Coastguard Worker                                                    ps_sig_coeff_flag, ps_dec,
1125*495ae853SAndroid Build Coastguard Worker                                                    ps_src_bin_ctxt);
1126*495ae853SAndroid Build Coastguard Worker 
1127*495ae853SAndroid Build Coastguard Worker     INSERT_BIT(u4_csbp, u4_idx, u4_subblock_coded);
1128*495ae853SAndroid Build Coastguard Worker     pu1_top_nnz[0] = u4_subblock_coded;
1129*495ae853SAndroid Build Coastguard Worker 
1130*495ae853SAndroid Build Coastguard Worker     /*------------------------------------------------------*/
1131*495ae853SAndroid Build Coastguard Worker     /* Residual 4x4 decoding: SubBlock 3                    */
1132*495ae853SAndroid Build Coastguard Worker     /*------------------------------------------------------*/
1133*495ae853SAndroid Build Coastguard Worker     u4_idx++;
1134*495ae853SAndroid Build Coastguard Worker     pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
1135*495ae853SAndroid Build Coastguard Worker     u4_ctxinc = (u4_top1 << 1) + u4_subblock_coded;
1136*495ae853SAndroid Build Coastguard Worker 
1137*495ae853SAndroid Build Coastguard Worker     ps_src_bin_ctxt = ps_cbf + u4_ctxinc;
1138*495ae853SAndroid Build Coastguard Worker 
1139*495ae853SAndroid Build Coastguard Worker     u4_subblock_coded = ih264d_read_coeff4x4_cabac(ps_bitstrm, u4_ctx_cat,
1140*495ae853SAndroid Build Coastguard Worker                                                    ps_sig_coeff_flag, ps_dec,
1141*495ae853SAndroid Build Coastguard Worker                                                    ps_src_bin_ctxt);
1142*495ae853SAndroid Build Coastguard Worker 
1143*495ae853SAndroid Build Coastguard Worker     INSERT_BIT(u4_csbp, u4_idx, u4_subblock_coded);
1144*495ae853SAndroid Build Coastguard Worker     pu1_top_nnz[1] = pu1_left_nnz[1] = u4_subblock_coded;
1145*495ae853SAndroid Build Coastguard Worker 
1146*495ae853SAndroid Build Coastguard Worker     return (u4_csbp);
1147*495ae853SAndroid Build Coastguard Worker }
1148*495ae853SAndroid Build Coastguard Worker 
1149*495ae853SAndroid Build Coastguard Worker /*!
1150*495ae853SAndroid Build Coastguard Worker  **************************************************************************
1151*495ae853SAndroid Build Coastguard Worker  * \if Function name : ih264d_parse_residual4x4_cabac \endif
1152*495ae853SAndroid Build Coastguard Worker  *
1153*495ae853SAndroid Build Coastguard Worker  * \brief
1154*495ae853SAndroid Build Coastguard Worker  *    This function parses CABAC syntax of a Luma and Chroma AC Residuals.
1155*495ae853SAndroid Build Coastguard Worker  *
1156*495ae853SAndroid Build Coastguard Worker  * \return
1157*495ae853SAndroid Build Coastguard Worker  *    0 on Success and Error code otherwise
1158*495ae853SAndroid Build Coastguard Worker  **************************************************************************
1159*495ae853SAndroid Build Coastguard Worker  */
1160*495ae853SAndroid Build Coastguard Worker 
ih264d_parse_residual4x4_cabac(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_offset)1161*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_parse_residual4x4_cabac(dec_struct_t * ps_dec,
1162*495ae853SAndroid Build Coastguard Worker                                       dec_mb_info_t *ps_cur_mb_info,
1163*495ae853SAndroid Build Coastguard Worker                                       UWORD8 u1_offset)
1164*495ae853SAndroid Build Coastguard Worker {
1165*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_cbp = ps_cur_mb_info->u1_cbp;
1166*495ae853SAndroid Build Coastguard Worker     UWORD16 ui16_csbp = 0;
1167*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_residual_buf;
1168*495ae853SAndroid Build Coastguard Worker     UWORD8 uc_ctx_cat;
1169*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_top_nnz = ps_cur_mb_info->ps_curmb->pu1_nnz_y;
1170*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_left_nnz = ps_dec->pu1_left_nnz_y;
1171*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_top_nnz_uv = ps_cur_mb_info->ps_curmb->pu1_nnz_uv;
1172*495ae853SAndroid Build Coastguard Worker     ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
1173*495ae853SAndroid Build Coastguard Worker     ctxt_inc_mb_info_t *ps_top_ctxt = ps_dec->p_top_ctxt_mb_info;
1174*495ae853SAndroid Build Coastguard Worker     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1175*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_nbr_avail = ps_dec->u1_mb_ngbr_availablity;
1176*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_coeff_block = NULL;
1177*495ae853SAndroid Build Coastguard Worker     bin_ctxt_model_t *ps_src_bin_ctxt;
1178*495ae853SAndroid Build Coastguard Worker 
1179*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_top_dc_csbp = (ps_top_ctxt->u1_yuv_dc_csbp) >> 1;
1180*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_left_dc_csbp = (ps_dec->pu1_left_yuv_dc_csbp[0]) >> 1;
1181*495ae853SAndroid Build Coastguard Worker 
1182*495ae853SAndroid Build Coastguard Worker 
1183*495ae853SAndroid Build Coastguard Worker     if(!(u4_nbr_avail & TOP_MB_AVAILABLE_MASK))
1184*495ae853SAndroid Build Coastguard Worker     {
1185*495ae853SAndroid Build Coastguard Worker         if(p_curr_ctxt->u1_mb_type & CAB_INTRA_MASK)
1186*495ae853SAndroid Build Coastguard Worker         {
1187*495ae853SAndroid Build Coastguard Worker             *(UWORD32 *)pu1_top_nnz = 0;
1188*495ae853SAndroid Build Coastguard Worker             u1_top_dc_csbp = 0;
1189*495ae853SAndroid Build Coastguard Worker             *(UWORD32 *)pu1_top_nnz_uv = 0;
1190*495ae853SAndroid Build Coastguard Worker         }
1191*495ae853SAndroid Build Coastguard Worker         else
1192*495ae853SAndroid Build Coastguard Worker         {
1193*495ae853SAndroid Build Coastguard Worker             *(UWORD32 *)pu1_top_nnz = 0x01010101;
1194*495ae853SAndroid Build Coastguard Worker             u1_top_dc_csbp = 0x3;
1195*495ae853SAndroid Build Coastguard Worker             *(UWORD32 *)pu1_top_nnz_uv = 0x01010101;
1196*495ae853SAndroid Build Coastguard Worker         }
1197*495ae853SAndroid Build Coastguard Worker     }
1198*495ae853SAndroid Build Coastguard Worker     else
1199*495ae853SAndroid Build Coastguard Worker     {
1200*495ae853SAndroid Build Coastguard Worker         UWORD32 *pu4_buf;
1201*495ae853SAndroid Build Coastguard Worker         UWORD8 *pu1_buf;
1202*495ae853SAndroid Build Coastguard Worker         pu1_buf = ps_cur_mb_info->ps_top_mb->pu1_nnz_y;
1203*495ae853SAndroid Build Coastguard Worker         pu4_buf = (UWORD32 *)pu1_buf;
1204*495ae853SAndroid Build Coastguard Worker         *(UWORD32 *)(pu1_top_nnz) = *pu4_buf;
1205*495ae853SAndroid Build Coastguard Worker 
1206*495ae853SAndroid Build Coastguard Worker         pu1_buf = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv;
1207*495ae853SAndroid Build Coastguard Worker         pu4_buf = (UWORD32 *)pu1_buf;
1208*495ae853SAndroid Build Coastguard Worker         *(UWORD32 *)(pu1_top_nnz_uv) = *pu4_buf;
1209*495ae853SAndroid Build Coastguard Worker 
1210*495ae853SAndroid Build Coastguard Worker     }
1211*495ae853SAndroid Build Coastguard Worker 
1212*495ae853SAndroid Build Coastguard Worker     if(!(u4_nbr_avail & LEFT_MB_AVAILABLE_MASK))
1213*495ae853SAndroid Build Coastguard Worker     {
1214*495ae853SAndroid Build Coastguard Worker         if(p_curr_ctxt->u1_mb_type & CAB_INTRA_MASK)
1215*495ae853SAndroid Build Coastguard Worker         {
1216*495ae853SAndroid Build Coastguard Worker             UWORD32 *pu4_buf;
1217*495ae853SAndroid Build Coastguard Worker             UWORD8 *pu1_buf;
1218*495ae853SAndroid Build Coastguard Worker             *(UWORD32 *)pu1_left_nnz = 0;
1219*495ae853SAndroid Build Coastguard Worker             u1_left_dc_csbp = 0;
1220*495ae853SAndroid Build Coastguard Worker             pu1_buf = ps_dec->pu1_left_nnz_uv;
1221*495ae853SAndroid Build Coastguard Worker             pu4_buf = (UWORD32 *)pu1_buf;
1222*495ae853SAndroid Build Coastguard Worker             *pu4_buf = 0;
1223*495ae853SAndroid Build Coastguard Worker         }
1224*495ae853SAndroid Build Coastguard Worker         else
1225*495ae853SAndroid Build Coastguard Worker         {
1226*495ae853SAndroid Build Coastguard Worker             UWORD32 *pu4_buf;
1227*495ae853SAndroid Build Coastguard Worker             UWORD8 *pu1_buf;
1228*495ae853SAndroid Build Coastguard Worker             *(UWORD32 *)pu1_left_nnz = 0x01010101;
1229*495ae853SAndroid Build Coastguard Worker             u1_left_dc_csbp = 0x3;
1230*495ae853SAndroid Build Coastguard Worker             pu1_buf = ps_dec->pu1_left_nnz_uv;
1231*495ae853SAndroid Build Coastguard Worker             pu4_buf = (UWORD32 *)pu1_buf;
1232*495ae853SAndroid Build Coastguard Worker             *pu4_buf = 0x01010101;
1233*495ae853SAndroid Build Coastguard Worker         }
1234*495ae853SAndroid Build Coastguard Worker     }
1235*495ae853SAndroid Build Coastguard Worker 
1236*495ae853SAndroid Build Coastguard Worker     uc_ctx_cat = u1_offset ? LUMA_AC_CTXCAT : LUMA_4X4_CTXCAT;
1237*495ae853SAndroid Build Coastguard Worker 
1238*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_info->u1_qp_div6 = ps_dec->u1_qp_y_div6;
1239*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_info->u1_qpc_div6 = ps_dec->u1_qp_u_div6;
1240*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_info->u1_qp_rem6 = ps_dec->u1_qp_y_rem6;
1241*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_info->u1_qpc_rem6 = ps_dec->u1_qp_u_rem6;
1242*495ae853SAndroid Build Coastguard Worker     // CHECK_THIS
1243*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_info->u1_qpcr_div6 = ps_dec->u1_qp_v_div6;
1244*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_info->u1_qpcr_rem6 = ps_dec->u1_qp_v_rem6;
1245*495ae853SAndroid Build Coastguard Worker 
1246*495ae853SAndroid Build Coastguard Worker     if(u1_cbp & 0x0f)
1247*495ae853SAndroid Build Coastguard Worker     {
1248*495ae853SAndroid Build Coastguard Worker         if(ps_cur_mb_info->u1_tran_form8x8 == 0)
1249*495ae853SAndroid Build Coastguard Worker         {
1250*495ae853SAndroid Build Coastguard Worker             /*******************************************************************/
1251*495ae853SAndroid Build Coastguard Worker             /* Block 0 residual decoding, check cbp and proceed (subblock = 0) */
1252*495ae853SAndroid Build Coastguard Worker             /*******************************************************************/
1253*495ae853SAndroid Build Coastguard Worker             if(!(u1_cbp & 0x1))
1254*495ae853SAndroid Build Coastguard Worker             {
1255*495ae853SAndroid Build Coastguard Worker                 *(UWORD16 *)(pu1_top_nnz) = 0;
1256*495ae853SAndroid Build Coastguard Worker                 *(UWORD16 *)(pu1_left_nnz) = 0;
1257*495ae853SAndroid Build Coastguard Worker             }
1258*495ae853SAndroid Build Coastguard Worker             else
1259*495ae853SAndroid Build Coastguard Worker             {
1260*495ae853SAndroid Build Coastguard Worker                 ui16_csbp = ih264d_cabac_parse_8x8block(pi2_coeff_block, 4,
1261*495ae853SAndroid Build Coastguard Worker                                                         uc_ctx_cat, ps_dec,
1262*495ae853SAndroid Build Coastguard Worker                                                         pu1_top_nnz,
1263*495ae853SAndroid Build Coastguard Worker                                                         pu1_left_nnz);
1264*495ae853SAndroid Build Coastguard Worker             }
1265*495ae853SAndroid Build Coastguard Worker 
1266*495ae853SAndroid Build Coastguard Worker             /*******************************************************************/
1267*495ae853SAndroid Build Coastguard Worker             /* Block 1 residual decoding, check cbp and proceed (subblock = 2) */
1268*495ae853SAndroid Build Coastguard Worker             /*******************************************************************/
1269*495ae853SAndroid Build Coastguard Worker             pi2_coeff_block += (2 * NUM_COEFFS_IN_4x4BLK);
1270*495ae853SAndroid Build Coastguard Worker             if(!(u1_cbp & 0x2))
1271*495ae853SAndroid Build Coastguard Worker             {
1272*495ae853SAndroid Build Coastguard Worker                 *(UWORD16 *)(pu1_top_nnz + 2) = 0;
1273*495ae853SAndroid Build Coastguard Worker                 *(UWORD16 *)(pu1_left_nnz) = 0;
1274*495ae853SAndroid Build Coastguard Worker             }
1275*495ae853SAndroid Build Coastguard Worker             else
1276*495ae853SAndroid Build Coastguard Worker             {
1277*495ae853SAndroid Build Coastguard Worker                 UWORD32 u4_temp = ih264d_cabac_parse_8x8block(pi2_coeff_block,
1278*495ae853SAndroid Build Coastguard Worker                                                               4, uc_ctx_cat,
1279*495ae853SAndroid Build Coastguard Worker                                                               ps_dec,
1280*495ae853SAndroid Build Coastguard Worker                                                               (pu1_top_nnz + 2),
1281*495ae853SAndroid Build Coastguard Worker                                                               pu1_left_nnz);
1282*495ae853SAndroid Build Coastguard Worker                 ui16_csbp |= (u4_temp << 2);
1283*495ae853SAndroid Build Coastguard Worker             }
1284*495ae853SAndroid Build Coastguard Worker 
1285*495ae853SAndroid Build Coastguard Worker             /*******************************************************************/
1286*495ae853SAndroid Build Coastguard Worker             /* Block 2 residual decoding, check cbp and proceed (subblock = 8) */
1287*495ae853SAndroid Build Coastguard Worker             /*******************************************************************/
1288*495ae853SAndroid Build Coastguard Worker             pi2_coeff_block += (6 * NUM_COEFFS_IN_4x4BLK);
1289*495ae853SAndroid Build Coastguard Worker             if(!(u1_cbp & 0x4))
1290*495ae853SAndroid Build Coastguard Worker             {
1291*495ae853SAndroid Build Coastguard Worker                 *(UWORD16 *)(pu1_top_nnz) = 0;
1292*495ae853SAndroid Build Coastguard Worker                 *(UWORD16 *)(pu1_left_nnz + 2) = 0;
1293*495ae853SAndroid Build Coastguard Worker             }
1294*495ae853SAndroid Build Coastguard Worker             else
1295*495ae853SAndroid Build Coastguard Worker             {
1296*495ae853SAndroid Build Coastguard Worker                 UWORD32 u4_temp = ih264d_cabac_parse_8x8block(
1297*495ae853SAndroid Build Coastguard Worker                                 pi2_coeff_block, 4, uc_ctx_cat, ps_dec,
1298*495ae853SAndroid Build Coastguard Worker                                 pu1_top_nnz, (pu1_left_nnz + 2));
1299*495ae853SAndroid Build Coastguard Worker                 ui16_csbp |= (u4_temp << 8);
1300*495ae853SAndroid Build Coastguard Worker             }
1301*495ae853SAndroid Build Coastguard Worker 
1302*495ae853SAndroid Build Coastguard Worker             /*******************************************************************/
1303*495ae853SAndroid Build Coastguard Worker             /* Block 3 residual decoding, check cbp and proceed (subblock = 10)*/
1304*495ae853SAndroid Build Coastguard Worker             /*******************************************************************/
1305*495ae853SAndroid Build Coastguard Worker             pi2_coeff_block += (2 * NUM_COEFFS_IN_4x4BLK);
1306*495ae853SAndroid Build Coastguard Worker             if(!(u1_cbp & 0x8))
1307*495ae853SAndroid Build Coastguard Worker             {
1308*495ae853SAndroid Build Coastguard Worker                 *(UWORD16 *)(pu1_top_nnz + 2) = 0;
1309*495ae853SAndroid Build Coastguard Worker                 *(UWORD16 *)(pu1_left_nnz + 2) = 0;
1310*495ae853SAndroid Build Coastguard Worker             }
1311*495ae853SAndroid Build Coastguard Worker             else
1312*495ae853SAndroid Build Coastguard Worker             {
1313*495ae853SAndroid Build Coastguard Worker                 UWORD32 u4_temp = ih264d_cabac_parse_8x8block(
1314*495ae853SAndroid Build Coastguard Worker                                 pi2_coeff_block, 4, uc_ctx_cat, ps_dec,
1315*495ae853SAndroid Build Coastguard Worker                                 (pu1_top_nnz + 2), (pu1_left_nnz + 2));
1316*495ae853SAndroid Build Coastguard Worker                 ui16_csbp |= (u4_temp << 10);
1317*495ae853SAndroid Build Coastguard Worker             }
1318*495ae853SAndroid Build Coastguard Worker 
1319*495ae853SAndroid Build Coastguard Worker         }
1320*495ae853SAndroid Build Coastguard Worker         else
1321*495ae853SAndroid Build Coastguard Worker         {
1322*495ae853SAndroid Build Coastguard Worker             ui16_csbp = 0;
1323*495ae853SAndroid Build Coastguard Worker 
1324*495ae853SAndroid Build Coastguard Worker             /*******************************************************************/
1325*495ae853SAndroid Build Coastguard Worker             /* Block 0 residual decoding, check cbp and proceed (subblock = 0) */
1326*495ae853SAndroid Build Coastguard Worker             /*******************************************************************/
1327*495ae853SAndroid Build Coastguard Worker             if(!(u1_cbp & 0x1))
1328*495ae853SAndroid Build Coastguard Worker             {
1329*495ae853SAndroid Build Coastguard Worker                 *(UWORD16 *)(pu1_top_nnz) = 0;
1330*495ae853SAndroid Build Coastguard Worker                 *(UWORD16 *)(pu1_left_nnz) = 0;
1331*495ae853SAndroid Build Coastguard Worker             }
1332*495ae853SAndroid Build Coastguard Worker             else
1333*495ae853SAndroid Build Coastguard Worker             {
1334*495ae853SAndroid Build Coastguard Worker 
1335*495ae853SAndroid Build Coastguard Worker                 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1336*495ae853SAndroid Build Coastguard Worker 
1337*495ae853SAndroid Build Coastguard Worker                 ih264d_read_coeff8x8_cabac( ps_bitstrm,
1338*495ae853SAndroid Build Coastguard Worker                                            ps_dec, ps_cur_mb_info);
1339*495ae853SAndroid Build Coastguard Worker 
1340*495ae853SAndroid Build Coastguard Worker                 pu1_left_nnz[0] = 1;
1341*495ae853SAndroid Build Coastguard Worker                 pu1_left_nnz[1] = 1;
1342*495ae853SAndroid Build Coastguard Worker 
1343*495ae853SAndroid Build Coastguard Worker                 pu1_top_nnz[0] = 1;
1344*495ae853SAndroid Build Coastguard Worker                 pu1_top_nnz[1] = 1;
1345*495ae853SAndroid Build Coastguard Worker 
1346*495ae853SAndroid Build Coastguard Worker                 /* added to be used by BS computation module */
1347*495ae853SAndroid Build Coastguard Worker                 ui16_csbp |= 0x0033;
1348*495ae853SAndroid Build Coastguard Worker             }
1349*495ae853SAndroid Build Coastguard Worker 
1350*495ae853SAndroid Build Coastguard Worker             /*******************************************************************/
1351*495ae853SAndroid Build Coastguard Worker             /* Block 1 residual decoding, check cbp and proceed (subblock = 2) */
1352*495ae853SAndroid Build Coastguard Worker             /*******************************************************************/
1353*495ae853SAndroid Build Coastguard Worker             pi2_coeff_block += 64;
1354*495ae853SAndroid Build Coastguard Worker 
1355*495ae853SAndroid Build Coastguard Worker             if(!(u1_cbp & 0x2))
1356*495ae853SAndroid Build Coastguard Worker             {
1357*495ae853SAndroid Build Coastguard Worker                 *(UWORD16 *)(pu1_top_nnz + 2) = 0;
1358*495ae853SAndroid Build Coastguard Worker                 *(UWORD16 *)(pu1_left_nnz) = 0;
1359*495ae853SAndroid Build Coastguard Worker             }
1360*495ae853SAndroid Build Coastguard Worker             else
1361*495ae853SAndroid Build Coastguard Worker             {
1362*495ae853SAndroid Build Coastguard Worker 
1363*495ae853SAndroid Build Coastguard Worker 
1364*495ae853SAndroid Build Coastguard Worker                 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1365*495ae853SAndroid Build Coastguard Worker 
1366*495ae853SAndroid Build Coastguard Worker                 ih264d_read_coeff8x8_cabac(ps_bitstrm,
1367*495ae853SAndroid Build Coastguard Worker                                            ps_dec, ps_cur_mb_info);
1368*495ae853SAndroid Build Coastguard Worker 
1369*495ae853SAndroid Build Coastguard Worker                 pu1_left_nnz[0] = 1;
1370*495ae853SAndroid Build Coastguard Worker                 pu1_left_nnz[1] = 1;
1371*495ae853SAndroid Build Coastguard Worker 
1372*495ae853SAndroid Build Coastguard Worker                 pu1_top_nnz[2] = 1;
1373*495ae853SAndroid Build Coastguard Worker                 pu1_top_nnz[3] = 1;
1374*495ae853SAndroid Build Coastguard Worker 
1375*495ae853SAndroid Build Coastguard Worker                 /* added to be used by BS computation module */
1376*495ae853SAndroid Build Coastguard Worker                 ui16_csbp |= 0x00CC;
1377*495ae853SAndroid Build Coastguard Worker 
1378*495ae853SAndroid Build Coastguard Worker             }
1379*495ae853SAndroid Build Coastguard Worker 
1380*495ae853SAndroid Build Coastguard Worker             /*******************************************************************/
1381*495ae853SAndroid Build Coastguard Worker             /* Block 2 residual decoding, check cbp and proceed (subblock = 8) */
1382*495ae853SAndroid Build Coastguard Worker             /*******************************************************************/
1383*495ae853SAndroid Build Coastguard Worker             pi2_coeff_block += 64;
1384*495ae853SAndroid Build Coastguard Worker             if(!(u1_cbp & 0x4))
1385*495ae853SAndroid Build Coastguard Worker             {
1386*495ae853SAndroid Build Coastguard Worker                 *(UWORD16 *)(pu1_top_nnz) = 0;
1387*495ae853SAndroid Build Coastguard Worker                 *(UWORD16 *)(pu1_left_nnz + 2) = 0;
1388*495ae853SAndroid Build Coastguard Worker             }
1389*495ae853SAndroid Build Coastguard Worker             else
1390*495ae853SAndroid Build Coastguard Worker             {
1391*495ae853SAndroid Build Coastguard Worker 
1392*495ae853SAndroid Build Coastguard Worker                 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1393*495ae853SAndroid Build Coastguard Worker 
1394*495ae853SAndroid Build Coastguard Worker                 ih264d_read_coeff8x8_cabac(ps_bitstrm,
1395*495ae853SAndroid Build Coastguard Worker                                            ps_dec, ps_cur_mb_info);
1396*495ae853SAndroid Build Coastguard Worker 
1397*495ae853SAndroid Build Coastguard Worker                 pu1_left_nnz[2] = 1;
1398*495ae853SAndroid Build Coastguard Worker                 pu1_left_nnz[3] = 1;
1399*495ae853SAndroid Build Coastguard Worker 
1400*495ae853SAndroid Build Coastguard Worker                 pu1_top_nnz[0] = 1;
1401*495ae853SAndroid Build Coastguard Worker                 pu1_top_nnz[1] = 1;
1402*495ae853SAndroid Build Coastguard Worker 
1403*495ae853SAndroid Build Coastguard Worker                 /* added to be used by BS computation module */
1404*495ae853SAndroid Build Coastguard Worker                 ui16_csbp |= 0x3300;
1405*495ae853SAndroid Build Coastguard Worker             }
1406*495ae853SAndroid Build Coastguard Worker 
1407*495ae853SAndroid Build Coastguard Worker             /*******************************************************************/
1408*495ae853SAndroid Build Coastguard Worker             /* Block 3 residual decoding, check cbp and proceed (subblock = 10)*/
1409*495ae853SAndroid Build Coastguard Worker             /*******************************************************************/
1410*495ae853SAndroid Build Coastguard Worker             pi2_coeff_block += 64;
1411*495ae853SAndroid Build Coastguard Worker 
1412*495ae853SAndroid Build Coastguard Worker             if(!(u1_cbp & 0x8))
1413*495ae853SAndroid Build Coastguard Worker             {
1414*495ae853SAndroid Build Coastguard Worker                 *(UWORD16 *)(pu1_top_nnz + 2) = 0;
1415*495ae853SAndroid Build Coastguard Worker                 *(UWORD16 *)(pu1_left_nnz + 2) = 0;
1416*495ae853SAndroid Build Coastguard Worker             }
1417*495ae853SAndroid Build Coastguard Worker             else
1418*495ae853SAndroid Build Coastguard Worker             {
1419*495ae853SAndroid Build Coastguard Worker 
1420*495ae853SAndroid Build Coastguard Worker                 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
1421*495ae853SAndroid Build Coastguard Worker 
1422*495ae853SAndroid Build Coastguard Worker                 ih264d_read_coeff8x8_cabac(ps_bitstrm,
1423*495ae853SAndroid Build Coastguard Worker                                            ps_dec, ps_cur_mb_info);
1424*495ae853SAndroid Build Coastguard Worker 
1425*495ae853SAndroid Build Coastguard Worker                 pu1_left_nnz[2] = 1;
1426*495ae853SAndroid Build Coastguard Worker                 pu1_left_nnz[3] = 1;
1427*495ae853SAndroid Build Coastguard Worker 
1428*495ae853SAndroid Build Coastguard Worker                 pu1_top_nnz[2] = 1;
1429*495ae853SAndroid Build Coastguard Worker                 pu1_top_nnz[3] = 1;
1430*495ae853SAndroid Build Coastguard Worker 
1431*495ae853SAndroid Build Coastguard Worker                 /* added to be used by BS computation module */
1432*495ae853SAndroid Build Coastguard Worker                 ui16_csbp |= 0xCC00;
1433*495ae853SAndroid Build Coastguard Worker             }
1434*495ae853SAndroid Build Coastguard Worker         }
1435*495ae853SAndroid Build Coastguard Worker     }
1436*495ae853SAndroid Build Coastguard Worker     else
1437*495ae853SAndroid Build Coastguard Worker     {
1438*495ae853SAndroid Build Coastguard Worker         *(UWORD32 *)(pu1_top_nnz) = 0;
1439*495ae853SAndroid Build Coastguard Worker         *(UWORD32 *)(pu1_left_nnz) = 0;
1440*495ae853SAndroid Build Coastguard Worker     }
1441*495ae853SAndroid Build Coastguard Worker     /*--------------------------------------------------------------------*/
1442*495ae853SAndroid Build Coastguard Worker     /* Store the last row of N values to top row                          */
1443*495ae853SAndroid Build Coastguard Worker     /*--------------------------------------------------------------------*/
1444*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_info->u2_luma_csbp = ui16_csbp;
1445*495ae853SAndroid Build Coastguard Worker     ps_cur_mb_info->ps_curmb->u2_luma_csbp = ui16_csbp;
1446*495ae853SAndroid Build Coastguard Worker     {
1447*495ae853SAndroid Build Coastguard Worker         WORD8 i;
1448*495ae853SAndroid Build Coastguard Worker         UWORD16 u2_chroma_csbp = 0;
1449*495ae853SAndroid Build Coastguard Worker         ps_cur_mb_info->u2_chroma_csbp = 0;
1450*495ae853SAndroid Build Coastguard Worker 
1451*495ae853SAndroid Build Coastguard Worker         u1_cbp >>= 4;
1452*495ae853SAndroid Build Coastguard Worker         pu1_top_nnz = pu1_top_nnz_uv;
1453*495ae853SAndroid Build Coastguard Worker         pu1_left_nnz = ps_dec->pu1_left_nnz_uv;
1454*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------------------------------------*/
1455*495ae853SAndroid Build Coastguard Worker         /* if Chroma Component not present OR no ac values present            */
1456*495ae853SAndroid Build Coastguard Worker         /* Set the values of N to zero                                        */
1457*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------------------------------------*/
1458*495ae853SAndroid Build Coastguard Worker         if(u1_cbp == CBPC_ALLZERO)
1459*495ae853SAndroid Build Coastguard Worker         {
1460*495ae853SAndroid Build Coastguard Worker             ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x1;
1461*495ae853SAndroid Build Coastguard Worker             *(UWORD32 *)(pu1_top_nnz) = 0;
1462*495ae853SAndroid Build Coastguard Worker             *(UWORD32 *)(pu1_left_nnz) = 0;
1463*495ae853SAndroid Build Coastguard Worker             p_curr_ctxt->u1_yuv_dc_csbp &= 0x1;
1464*495ae853SAndroid Build Coastguard Worker             return (0);
1465*495ae853SAndroid Build Coastguard Worker         }
1466*495ae853SAndroid Build Coastguard Worker 
1467*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------------------------------------*/
1468*495ae853SAndroid Build Coastguard Worker         /* Decode Chroma DC values                                            */
1469*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------------------------------------*/
1470*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < 2; i++)
1471*495ae853SAndroid Build Coastguard Worker         {
1472*495ae853SAndroid Build Coastguard Worker             UWORD8 uc_a = 1, uc_b = 1;
1473*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_ctx_inc;
1474*495ae853SAndroid Build Coastguard Worker             UWORD8 uc_codedBlockFlag;
1475*495ae853SAndroid Build Coastguard Worker             UWORD8 pu1_inv_scan[4] =
1476*495ae853SAndroid Build Coastguard Worker                 { 0, 1, 2, 3 };
1477*495ae853SAndroid Build Coastguard Worker             WORD32 u4_scale;
1478*495ae853SAndroid Build Coastguard Worker             WORD32 i4_mb_inter_inc;
1479*495ae853SAndroid Build Coastguard Worker             tu_sblk4x4_coeff_data_t *ps_tu_4x4 =
1480*495ae853SAndroid Build Coastguard Worker                             (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
1481*495ae853SAndroid Build Coastguard Worker             WORD16 *pi2_coeff_data =
1482*495ae853SAndroid Build Coastguard Worker                             (WORD16 *)ps_dec->pv_parse_tu_coeff_data;
1483*495ae853SAndroid Build Coastguard Worker             WORD16 ai2_dc_coef[4];
1484*495ae853SAndroid Build Coastguard Worker 
1485*495ae853SAndroid Build Coastguard Worker             INC_SYM_COUNT(&(ps_dec->s_cab_dec_env));
1486*495ae853SAndroid Build Coastguard Worker             u4_scale = (i) ?
1487*495ae853SAndroid Build Coastguard Worker                             (ps_dec->pu2_quant_scale_v[0]
1488*495ae853SAndroid Build Coastguard Worker                                             << ps_dec->u1_qp_v_div6) :
1489*495ae853SAndroid Build Coastguard Worker                             (ps_dec->pu2_quant_scale_u[0]
1490*495ae853SAndroid Build Coastguard Worker                                             << ps_dec->u1_qp_u_div6);
1491*495ae853SAndroid Build Coastguard Worker 
1492*495ae853SAndroid Build Coastguard Worker             /*--------------------------------------------------------------------*/
1493*495ae853SAndroid Build Coastguard Worker             /* Decode Bitstream to get the DC coeff                               */
1494*495ae853SAndroid Build Coastguard Worker             /*--------------------------------------------------------------------*/
1495*495ae853SAndroid Build Coastguard Worker             uc_a = (u1_left_dc_csbp >> i) & 0x01;
1496*495ae853SAndroid Build Coastguard Worker             uc_b = (u1_top_dc_csbp >> i) & 0x01;
1497*495ae853SAndroid Build Coastguard Worker             u4_ctx_inc = (uc_a + (uc_b << 1));
1498*495ae853SAndroid Build Coastguard Worker 
1499*495ae853SAndroid Build Coastguard Worker             ps_src_bin_ctxt = (ps_dec->p_cbf_t[CHROMA_DC_CTXCAT]) + u4_ctx_inc;
1500*495ae853SAndroid Build Coastguard Worker 
1501*495ae853SAndroid Build Coastguard Worker             uc_codedBlockFlag =
1502*495ae853SAndroid Build Coastguard Worker                             ih264d_read_coeff4x4_cabac(ps_bitstrm,
1503*495ae853SAndroid Build Coastguard Worker                                             CHROMA_DC_CTXCAT,
1504*495ae853SAndroid Build Coastguard Worker                                             ps_dec->p_significant_coeff_flag_t[CHROMA_DC_CTXCAT],
1505*495ae853SAndroid Build Coastguard Worker                                             ps_dec, ps_src_bin_ctxt);
1506*495ae853SAndroid Build Coastguard Worker 
1507*495ae853SAndroid Build Coastguard Worker             i4_mb_inter_inc = (!((ps_cur_mb_info->ps_curmb->u1_mb_type == I_4x4_MB)
1508*495ae853SAndroid Build Coastguard Worker                             || (ps_cur_mb_info->ps_curmb->u1_mb_type == I_16x16_MB)))
1509*495ae853SAndroid Build Coastguard Worker                             * 3;
1510*495ae853SAndroid Build Coastguard Worker 
1511*495ae853SAndroid Build Coastguard Worker             if(ps_dec->s_high_profile.u1_scaling_present)
1512*495ae853SAndroid Build Coastguard Worker             {
1513*495ae853SAndroid Build Coastguard Worker                 u4_scale *=
1514*495ae853SAndroid Build Coastguard Worker                                 ps_dec->s_high_profile.i2_scalinglist4x4[i4_mb_inter_inc
1515*495ae853SAndroid Build Coastguard Worker                                                 + 1 + i][0];
1516*495ae853SAndroid Build Coastguard Worker 
1517*495ae853SAndroid Build Coastguard Worker             }
1518*495ae853SAndroid Build Coastguard Worker             else
1519*495ae853SAndroid Build Coastguard Worker             {
1520*495ae853SAndroid Build Coastguard Worker                 u4_scale <<= 4;
1521*495ae853SAndroid Build Coastguard Worker             }
1522*495ae853SAndroid Build Coastguard Worker 
1523*495ae853SAndroid Build Coastguard Worker             if(uc_codedBlockFlag)
1524*495ae853SAndroid Build Coastguard Worker             {
1525*495ae853SAndroid Build Coastguard Worker                 WORD32 i_z0, i_z1, i_z2, i_z3;
1526*495ae853SAndroid Build Coastguard Worker                 WORD32 *pi4_scale;
1527*495ae853SAndroid Build Coastguard Worker 
1528*495ae853SAndroid Build Coastguard Worker                 SET_BIT(u1_top_dc_csbp, i);
1529*495ae853SAndroid Build Coastguard Worker                 SET_BIT(u1_left_dc_csbp, i);
1530*495ae853SAndroid Build Coastguard Worker 
1531*495ae853SAndroid Build Coastguard Worker                 ai2_dc_coef[0] = 0;
1532*495ae853SAndroid Build Coastguard Worker                 ai2_dc_coef[1] = 0;
1533*495ae853SAndroid Build Coastguard Worker                 ai2_dc_coef[2] = 0;
1534*495ae853SAndroid Build Coastguard Worker                 ai2_dc_coef[3] = 0;
1535*495ae853SAndroid Build Coastguard Worker 
1536*495ae853SAndroid Build Coastguard Worker                 ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4,
1537*495ae853SAndroid Build Coastguard Worker                                                  ai2_dc_coef,
1538*495ae853SAndroid Build Coastguard Worker                                                  pu1_inv_scan);
1539*495ae853SAndroid Build Coastguard Worker                 i_z0 = (ai2_dc_coef[0] + ai2_dc_coef[2]);
1540*495ae853SAndroid Build Coastguard Worker                 i_z1 = (ai2_dc_coef[0] - ai2_dc_coef[2]);
1541*495ae853SAndroid Build Coastguard Worker                 i_z2 = (ai2_dc_coef[1] - ai2_dc_coef[3]);
1542*495ae853SAndroid Build Coastguard Worker                 i_z3 = (ai2_dc_coef[1] + ai2_dc_coef[3]);
1543*495ae853SAndroid Build Coastguard Worker 
1544*495ae853SAndroid Build Coastguard Worker                 /*-----------------------------------------------------------*/
1545*495ae853SAndroid Build Coastguard Worker                 /* Scaling and storing the values back                       */
1546*495ae853SAndroid Build Coastguard Worker                 /*-----------------------------------------------------------*/
1547*495ae853SAndroid Build Coastguard Worker                 *pi2_coeff_data++ = ((i_z0 + i_z3) * u4_scale) >> 5;
1548*495ae853SAndroid Build Coastguard Worker                 *pi2_coeff_data++ = ((i_z0 - i_z3) * u4_scale) >> 5;
1549*495ae853SAndroid Build Coastguard Worker                 *pi2_coeff_data++ = ((i_z1 + i_z2) * u4_scale) >> 5;
1550*495ae853SAndroid Build Coastguard Worker                 *pi2_coeff_data++ = ((i_z1 - i_z2) * u4_scale) >> 5;
1551*495ae853SAndroid Build Coastguard Worker 
1552*495ae853SAndroid Build Coastguard Worker                 ps_dec->pv_parse_tu_coeff_data = (void *)pi2_coeff_data;
1553*495ae853SAndroid Build Coastguard Worker 
1554*495ae853SAndroid Build Coastguard Worker                 SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag,(i+1));
1555*495ae853SAndroid Build Coastguard Worker             }
1556*495ae853SAndroid Build Coastguard Worker             else
1557*495ae853SAndroid Build Coastguard Worker             {
1558*495ae853SAndroid Build Coastguard Worker                 CLEARBIT(u1_top_dc_csbp, i);
1559*495ae853SAndroid Build Coastguard Worker                 CLEARBIT(u1_left_dc_csbp, i);
1560*495ae853SAndroid Build Coastguard Worker             }
1561*495ae853SAndroid Build Coastguard Worker         }
1562*495ae853SAndroid Build Coastguard Worker 
1563*495ae853SAndroid Build Coastguard Worker         /*********************************************************************/
1564*495ae853SAndroid Build Coastguard Worker         /*                   Update the DC csbp                              */
1565*495ae853SAndroid Build Coastguard Worker         /*********************************************************************/
1566*495ae853SAndroid Build Coastguard Worker         ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x1;
1567*495ae853SAndroid Build Coastguard Worker         p_curr_ctxt->u1_yuv_dc_csbp &= 0x1;
1568*495ae853SAndroid Build Coastguard Worker         ps_dec->pu1_left_yuv_dc_csbp[0] |= (u1_left_dc_csbp << 1);
1569*495ae853SAndroid Build Coastguard Worker         p_curr_ctxt->u1_yuv_dc_csbp |= (u1_top_dc_csbp << 1);
1570*495ae853SAndroid Build Coastguard Worker         if(u1_cbp == CBPC_ACZERO)
1571*495ae853SAndroid Build Coastguard Worker         {
1572*495ae853SAndroid Build Coastguard Worker             *(UWORD32 *)(pu1_top_nnz) = 0;
1573*495ae853SAndroid Build Coastguard Worker             *(UWORD32 *)(pu1_left_nnz) = 0;
1574*495ae853SAndroid Build Coastguard Worker             return (0);
1575*495ae853SAndroid Build Coastguard Worker         }
1576*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------------------------------------*/
1577*495ae853SAndroid Build Coastguard Worker         /* Decode Chroma AC values                                            */
1578*495ae853SAndroid Build Coastguard Worker         /*--------------------------------------------------------------------*/
1579*495ae853SAndroid Build Coastguard Worker         {
1580*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_temp;
1581*495ae853SAndroid Build Coastguard Worker             /*****************************************************************/
1582*495ae853SAndroid Build Coastguard Worker             /* U Block  residual decoding, check cbp and proceed (subblock=0)*/
1583*495ae853SAndroid Build Coastguard Worker             /*****************************************************************/
1584*495ae853SAndroid Build Coastguard Worker             u2_chroma_csbp = ih264d_cabac_parse_8x8block(pi2_coeff_block, 2,
1585*495ae853SAndroid Build Coastguard Worker             CHROMA_AC_CTXCAT,
1586*495ae853SAndroid Build Coastguard Worker                                                          ps_dec, pu1_top_nnz,
1587*495ae853SAndroid Build Coastguard Worker                                                          pu1_left_nnz);
1588*495ae853SAndroid Build Coastguard Worker 
1589*495ae853SAndroid Build Coastguard Worker             pi2_coeff_block += MB_CHROM_SIZE;
1590*495ae853SAndroid Build Coastguard Worker             /*****************************************************************/
1591*495ae853SAndroid Build Coastguard Worker             /* V Block  residual decoding, check cbp and proceed (subblock=1)*/
1592*495ae853SAndroid Build Coastguard Worker             /*****************************************************************/
1593*495ae853SAndroid Build Coastguard Worker             u4_temp = ih264d_cabac_parse_8x8block(pi2_coeff_block, 2,
1594*495ae853SAndroid Build Coastguard Worker             CHROMA_AC_CTXCAT,
1595*495ae853SAndroid Build Coastguard Worker                                                   ps_dec, (pu1_top_nnz + 2),
1596*495ae853SAndroid Build Coastguard Worker                                                   (pu1_left_nnz + 2));
1597*495ae853SAndroid Build Coastguard Worker             u2_chroma_csbp |= (u4_temp << 4);
1598*495ae853SAndroid Build Coastguard Worker         }
1599*495ae853SAndroid Build Coastguard Worker         /*********************************************************************/
1600*495ae853SAndroid Build Coastguard Worker         /*                   Update the AC csbp                              */
1601*495ae853SAndroid Build Coastguard Worker         /*********************************************************************/
1602*495ae853SAndroid Build Coastguard Worker         ps_cur_mb_info->u2_chroma_csbp = u2_chroma_csbp;
1603*495ae853SAndroid Build Coastguard Worker     }
1604*495ae853SAndroid Build Coastguard Worker 
1605*495ae853SAndroid Build Coastguard Worker     return (0);
1606*495ae853SAndroid Build Coastguard Worker }
1607*495ae853SAndroid Build Coastguard Worker 
1608