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