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_cavlc.c
23*495ae853SAndroid Build Coastguard Worker *
24*495ae853SAndroid Build Coastguard Worker * \brief
25*495ae853SAndroid Build Coastguard Worker * This file contains UVLC related functions.
26*495ae853SAndroid Build Coastguard Worker *
27*495ae853SAndroid Build Coastguard Worker * \date
28*495ae853SAndroid Build Coastguard Worker * 20/11/2002
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 <string.h>
35*495ae853SAndroid Build Coastguard Worker #include <stdio.h>
36*495ae853SAndroid Build Coastguard Worker
37*495ae853SAndroid Build Coastguard Worker #include "ih264d_bitstrm.h"
38*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
39*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
40*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
41*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
42*495ae853SAndroid Build Coastguard Worker #include "ih264d_cabac.h"
43*495ae853SAndroid Build Coastguard Worker #include "ih264d_structs.h"
44*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
45*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
46*495ae853SAndroid Build Coastguard Worker #include "ih264d_mb_utils.h"
47*495ae853SAndroid Build Coastguard Worker
48*495ae853SAndroid Build Coastguard Worker void ih264d_unpack_coeff4x4_dc_4x4blk(tu_sblk4x4_coeff_data_t *ps_tu_4x4,
49*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out_coeff_data,
50*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_inv_scan);
51*495ae853SAndroid Build Coastguard Worker
52*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
53*495ae853SAndroid Build Coastguard Worker /* */
54*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_uev */
55*495ae853SAndroid Build Coastguard Worker /* */
56*495ae853SAndroid Build Coastguard Worker /* Description : Reads the unsigned Exp Golomb codec syntax from the */
57*495ae853SAndroid Build Coastguard Worker /* ps_bitstrm as specified in section 9.1 of H264 standard */
58*495ae853SAndroid Build Coastguard Worker /* It also increases bitstream u4_ofst by the number of bits */
59*495ae853SAndroid Build Coastguard Worker /* parsed for UEV decode operation */
60*495ae853SAndroid Build Coastguard Worker /* */
61*495ae853SAndroid Build Coastguard Worker /* Inputs : bitstream base pointer and bitsream u4_ofst in bits */
62*495ae853SAndroid Build Coastguard Worker /* Globals : None */
63*495ae853SAndroid Build Coastguard Worker /* Processing : */
64*495ae853SAndroid Build Coastguard Worker /* Outputs : UEV decoded syntax element and incremented ps_bitstrm u4_ofst */
65*495ae853SAndroid Build Coastguard Worker /* Returns : UEV decoded syntax element */
66*495ae853SAndroid Build Coastguard Worker /* */
67*495ae853SAndroid Build Coastguard Worker /* Issues : Does not check if ps_bitstrm u4_ofst exceeds max ps_bitstrm i4_size */
68*495ae853SAndroid Build Coastguard Worker /* for performamce. Caller might have to do error resilence */
69*495ae853SAndroid Build Coastguard Worker /* check for bitstream overflow */
70*495ae853SAndroid Build Coastguard Worker /* */
71*495ae853SAndroid Build Coastguard Worker /* Revision History: */
72*495ae853SAndroid Build Coastguard Worker /* */
73*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
74*495ae853SAndroid Build Coastguard Worker /* 19 09 2008 Jay Draft */
75*495ae853SAndroid Build Coastguard Worker /* */
76*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_uev(UWORD32 * pu4_bitstrm_ofst,UWORD32 * pu4_bitstrm_buf)77*495ae853SAndroid Build Coastguard Worker UWORD32 ih264d_uev(UWORD32 *pu4_bitstrm_ofst, UWORD32 *pu4_bitstrm_buf)
78*495ae853SAndroid Build Coastguard Worker {
79*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
80*495ae853SAndroid Build Coastguard Worker UWORD32 u4_word, u4_ldz;
81*495ae853SAndroid Build Coastguard Worker
82*495ae853SAndroid Build Coastguard Worker /***************************************************************/
83*495ae853SAndroid Build Coastguard Worker /* Find leading zeros in next 32 bits */
84*495ae853SAndroid Build Coastguard Worker /***************************************************************/
85*495ae853SAndroid Build Coastguard Worker NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
86*495ae853SAndroid Build Coastguard Worker u4_ldz = CLZ(u4_word);
87*495ae853SAndroid Build Coastguard Worker /* Flush the ps_bitstrm */
88*495ae853SAndroid Build Coastguard Worker u4_bitstream_offset += (u4_ldz + 1);
89*495ae853SAndroid Build Coastguard Worker /* Read the suffix from the ps_bitstrm */
90*495ae853SAndroid Build Coastguard Worker u4_word = 0;
91*495ae853SAndroid Build Coastguard Worker if(u4_ldz)
92*495ae853SAndroid Build Coastguard Worker GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
93*495ae853SAndroid Build Coastguard Worker *pu4_bitstrm_ofst = u4_bitstream_offset;
94*495ae853SAndroid Build Coastguard Worker return ((1 << u4_ldz) + u4_word - 1);
95*495ae853SAndroid Build Coastguard Worker }
96*495ae853SAndroid Build Coastguard Worker
97*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
98*495ae853SAndroid Build Coastguard Worker /* */
99*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_sev */
100*495ae853SAndroid Build Coastguard Worker /* */
101*495ae853SAndroid Build Coastguard Worker /* Description : Reads the signed Exp Golomb codec syntax from the ps_bitstrm */
102*495ae853SAndroid Build Coastguard Worker /* as specified in section 9.1 of H264 standard. */
103*495ae853SAndroid Build Coastguard Worker /* It also increases bitstream u4_ofst by the number of bits */
104*495ae853SAndroid Build Coastguard Worker /* parsed for SEV decode operation */
105*495ae853SAndroid Build Coastguard Worker /* */
106*495ae853SAndroid Build Coastguard Worker /* Inputs : bitstream base pointer and bitsream u4_ofst in bits */
107*495ae853SAndroid Build Coastguard Worker /* Globals : None */
108*495ae853SAndroid Build Coastguard Worker /* Processing : */
109*495ae853SAndroid Build Coastguard Worker /* Outputs : SEV decoded syntax element and incremented ps_bitstrm u4_ofst */
110*495ae853SAndroid Build Coastguard Worker /* Returns : SEV decoded syntax element */
111*495ae853SAndroid Build Coastguard Worker /* */
112*495ae853SAndroid Build Coastguard Worker /* Issues : Does not check if ps_bitstrm u4_ofst exceeds max ps_bitstrm i4_size */
113*495ae853SAndroid Build Coastguard Worker /* for performamce. Caller might have to do error resilence */
114*495ae853SAndroid Build Coastguard Worker /* check for bitstream overflow */
115*495ae853SAndroid Build Coastguard Worker /* */
116*495ae853SAndroid Build Coastguard Worker /* Revision History: */
117*495ae853SAndroid Build Coastguard Worker /* */
118*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
119*495ae853SAndroid Build Coastguard Worker /* 19 09 2008 Jay Draft */
120*495ae853SAndroid Build Coastguard Worker /* */
121*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_sev(UWORD32 * pu4_bitstrm_ofst,UWORD32 * pu4_bitstrm_buf)122*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_sev(UWORD32 *pu4_bitstrm_ofst, UWORD32 *pu4_bitstrm_buf)
123*495ae853SAndroid Build Coastguard Worker {
124*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
125*495ae853SAndroid Build Coastguard Worker UWORD32 u4_word, u4_ldz, u4_abs_val;
126*495ae853SAndroid Build Coastguard Worker
127*495ae853SAndroid Build Coastguard Worker /***************************************************************/
128*495ae853SAndroid Build Coastguard Worker /* Find leading zeros in next 32 bits */
129*495ae853SAndroid Build Coastguard Worker /***************************************************************/
130*495ae853SAndroid Build Coastguard Worker NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
131*495ae853SAndroid Build Coastguard Worker u4_ldz = CLZ(u4_word);
132*495ae853SAndroid Build Coastguard Worker
133*495ae853SAndroid Build Coastguard Worker /* Flush the ps_bitstrm */
134*495ae853SAndroid Build Coastguard Worker u4_bitstream_offset += (u4_ldz + 1);
135*495ae853SAndroid Build Coastguard Worker
136*495ae853SAndroid Build Coastguard Worker /* Read the suffix from the ps_bitstrm */
137*495ae853SAndroid Build Coastguard Worker u4_word = 0;
138*495ae853SAndroid Build Coastguard Worker if(u4_ldz)
139*495ae853SAndroid Build Coastguard Worker GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
140*495ae853SAndroid Build Coastguard Worker
141*495ae853SAndroid Build Coastguard Worker *pu4_bitstrm_ofst = u4_bitstream_offset;
142*495ae853SAndroid Build Coastguard Worker u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
143*495ae853SAndroid Build Coastguard Worker
144*495ae853SAndroid Build Coastguard Worker if(u4_word & 0x1)
145*495ae853SAndroid Build Coastguard Worker return (-(WORD32)u4_abs_val);
146*495ae853SAndroid Build Coastguard Worker else
147*495ae853SAndroid Build Coastguard Worker return (u4_abs_val);
148*495ae853SAndroid Build Coastguard Worker }
149*495ae853SAndroid Build Coastguard Worker
150*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
151*495ae853SAndroid Build Coastguard Worker /* */
152*495ae853SAndroid Build Coastguard Worker /* Function Name : get_tev_range_1 */
153*495ae853SAndroid Build Coastguard Worker /* */
154*495ae853SAndroid Build Coastguard Worker /* Description : Reads the TEV Exp Golomb codec syntax from the ps_bitstrm */
155*495ae853SAndroid Build Coastguard Worker /* as specified in section 9.1 of H264 standard. This will */
156*495ae853SAndroid Build Coastguard Worker /* called only when the input range is 1 for TEV decode. */
157*495ae853SAndroid Build Coastguard Worker /* If range is more than 1, then UEV decode is done */
158*495ae853SAndroid Build Coastguard Worker /* */
159*495ae853SAndroid Build Coastguard Worker /* Inputs : bitstream base pointer and bitsream u4_ofst in bits */
160*495ae853SAndroid Build Coastguard Worker /* Globals : None */
161*495ae853SAndroid Build Coastguard Worker /* Processing : */
162*495ae853SAndroid Build Coastguard Worker /* Outputs : TEV decoded syntax element and incremented ps_bitstrm u4_ofst */
163*495ae853SAndroid Build Coastguard Worker /* Returns : TEV decoded syntax element */
164*495ae853SAndroid Build Coastguard Worker /* */
165*495ae853SAndroid Build Coastguard Worker /* Issues : Does not check if ps_bitstrm u4_ofst exceeds max ps_bitstrm i4_size */
166*495ae853SAndroid Build Coastguard Worker /* for performamce. Caller might have to do error resilence */
167*495ae853SAndroid Build Coastguard Worker /* check for bitstream overflow */
168*495ae853SAndroid Build Coastguard Worker /* */
169*495ae853SAndroid Build Coastguard Worker /* Revision History: */
170*495ae853SAndroid Build Coastguard Worker /* */
171*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
172*495ae853SAndroid Build Coastguard Worker /* 19 09 2008 Jay Draft */
173*495ae853SAndroid Build Coastguard Worker /* */
174*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_tev_range1(UWORD32 * pu4_bitstrm_ofst,UWORD32 * pu4_bitstrm_buf)175*495ae853SAndroid Build Coastguard Worker UWORD32 ih264d_tev_range1(UWORD32 *pu4_bitstrm_ofst, UWORD32 *pu4_bitstrm_buf)
176*495ae853SAndroid Build Coastguard Worker {
177*495ae853SAndroid Build Coastguard Worker UWORD32 u4_code;
178*495ae853SAndroid Build Coastguard Worker GETBIT(u4_code, *pu4_bitstrm_ofst, pu4_bitstrm_buf);
179*495ae853SAndroid Build Coastguard Worker return (!u4_code);
180*495ae853SAndroid Build Coastguard Worker }
181*495ae853SAndroid Build Coastguard Worker
182*495ae853SAndroid Build Coastguard Worker /*!
183*495ae853SAndroid Build Coastguard Worker **************************************************************************
184*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_uvlc \endif
185*495ae853SAndroid Build Coastguard Worker *
186*495ae853SAndroid Build Coastguard Worker * \brief
187*495ae853SAndroid Build Coastguard Worker *
188*495ae853SAndroid Build Coastguard Worker * Reads the unsigned/signed/truncated integer Exp-Golomb-coded syntax element
189*495ae853SAndroid Build Coastguard Worker * with the left bit first. The parsing process for this descriptor is specified
190*495ae853SAndroid Build Coastguard Worker * in subclause 9.1.
191*495ae853SAndroid Build Coastguard Worker *
192*495ae853SAndroid Build Coastguard Worker * \param ps_bitstrm : Pointer to Bitstream Structure .
193*495ae853SAndroid Build Coastguard Worker * \param u4_range : Range value in case of Truncated Exp-Golomb-code
194*495ae853SAndroid Build Coastguard Worker * \param pi_bitstrm_ofst : Pointer to the local copy of Bitstream u4_ofst
195*495ae853SAndroid Build Coastguard Worker * \param u1_flag : Flag indicating the case of UEV,SEV or TEV
196*495ae853SAndroid Build Coastguard Worker * \param u4_bitstrm_ofst : Local copy of Bitstream u4_ofst
197*495ae853SAndroid Build Coastguard Worker * \param pu4_bitstrm_buf : Pointer to the Bitstream buffer
198*495ae853SAndroid Build Coastguard Worker *
199*495ae853SAndroid Build Coastguard Worker * \return
200*495ae853SAndroid Build Coastguard Worker * Returns Code Value.
201*495ae853SAndroid Build Coastguard Worker *
202*495ae853SAndroid Build Coastguard Worker **************************************************************************
203*495ae853SAndroid Build Coastguard Worker */
204*495ae853SAndroid Build Coastguard Worker
ih264d_uvlc(dec_bit_stream_t * ps_bitstrm,UWORD32 u4_range,UWORD32 * pi_bitstrm_ofst,UWORD8 u1_flag,UWORD32 u4_bitstrm_ofst,UWORD32 * pu4_bitstrm_buf)205*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_uvlc(dec_bit_stream_t *ps_bitstrm,
206*495ae853SAndroid Build Coastguard Worker UWORD32 u4_range,
207*495ae853SAndroid Build Coastguard Worker UWORD32 *pi_bitstrm_ofst,
208*495ae853SAndroid Build Coastguard Worker UWORD8 u1_flag,
209*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bitstrm_ofst,
210*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf)
211*495ae853SAndroid Build Coastguard Worker {
212*495ae853SAndroid Build Coastguard Worker UWORD32 word, word2, cur_bit, cur_word, code_val, code_num, clz;
213*495ae853SAndroid Build Coastguard Worker
214*495ae853SAndroid Build Coastguard Worker SWITCHOFFTRACE;
215*495ae853SAndroid Build Coastguard Worker cur_bit = u4_bitstrm_ofst & 0x1F;
216*495ae853SAndroid Build Coastguard Worker cur_word = u4_bitstrm_ofst >> 5;
217*495ae853SAndroid Build Coastguard Worker word = pu4_bitstrm_buf[cur_word];
218*495ae853SAndroid Build Coastguard Worker word2 = pu4_bitstrm_buf[cur_word + 1];
219*495ae853SAndroid Build Coastguard Worker
220*495ae853SAndroid Build Coastguard Worker if(cur_bit != 0)
221*495ae853SAndroid Build Coastguard Worker {
222*495ae853SAndroid Build Coastguard Worker word <<= cur_bit;
223*495ae853SAndroid Build Coastguard Worker word2 >>= (32 - cur_bit);
224*495ae853SAndroid Build Coastguard Worker word |= word2;
225*495ae853SAndroid Build Coastguard Worker }
226*495ae853SAndroid Build Coastguard Worker
227*495ae853SAndroid Build Coastguard Worker if(u1_flag == TEV && u4_range == 1)
228*495ae853SAndroid Build Coastguard Worker {
229*495ae853SAndroid Build Coastguard Worker word >>= 31;
230*495ae853SAndroid Build Coastguard Worker word = 1 - word;
231*495ae853SAndroid Build Coastguard Worker (*pi_bitstrm_ofst)++;
232*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_ofst = *pi_bitstrm_ofst;
233*495ae853SAndroid Build Coastguard Worker return (WORD32)word;
234*495ae853SAndroid Build Coastguard Worker }
235*495ae853SAndroid Build Coastguard Worker
236*495ae853SAndroid Build Coastguard Worker //finding clz
237*495ae853SAndroid Build Coastguard Worker {
238*495ae853SAndroid Build Coastguard Worker UWORD32 ui32_code, ui32_mask;
239*495ae853SAndroid Build Coastguard Worker
240*495ae853SAndroid Build Coastguard Worker ui32_code = word;
241*495ae853SAndroid Build Coastguard Worker ui32_mask = 0x80000000;
242*495ae853SAndroid Build Coastguard Worker clz = 0;
243*495ae853SAndroid Build Coastguard Worker
244*495ae853SAndroid Build Coastguard Worker /* DSP implements this with LMBD instruction */
245*495ae853SAndroid Build Coastguard Worker /* so there we don't need to break the loop */
246*495ae853SAndroid Build Coastguard Worker while(!(ui32_code & ui32_mask))
247*495ae853SAndroid Build Coastguard Worker {
248*495ae853SAndroid Build Coastguard Worker clz++;
249*495ae853SAndroid Build Coastguard Worker ui32_mask >>= 1;
250*495ae853SAndroid Build Coastguard Worker if(0 == ui32_mask)
251*495ae853SAndroid Build Coastguard Worker break;
252*495ae853SAndroid Build Coastguard Worker }
253*495ae853SAndroid Build Coastguard Worker }
254*495ae853SAndroid Build Coastguard Worker
255*495ae853SAndroid Build Coastguard Worker if(clz == 0)
256*495ae853SAndroid Build Coastguard Worker {
257*495ae853SAndroid Build Coastguard Worker *pi_bitstrm_ofst = *pi_bitstrm_ofst + (2 * clz) + 1;
258*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_ofst = *pi_bitstrm_ofst;
259*495ae853SAndroid Build Coastguard Worker return 0;
260*495ae853SAndroid Build Coastguard Worker }
261*495ae853SAndroid Build Coastguard Worker
262*495ae853SAndroid Build Coastguard Worker word <<= (clz + 1);
263*495ae853SAndroid Build Coastguard Worker word >>= (32 - clz);
264*495ae853SAndroid Build Coastguard Worker code_num = (1 << clz) + word - 1;
265*495ae853SAndroid Build Coastguard Worker *pi_bitstrm_ofst = *pi_bitstrm_ofst + (2 * clz) + 1;
266*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_ofst = *pi_bitstrm_ofst;
267*495ae853SAndroid Build Coastguard Worker
268*495ae853SAndroid Build Coastguard Worker if(u1_flag == TEV || u1_flag == UEV)
269*495ae853SAndroid Build Coastguard Worker return (WORD32)code_num;
270*495ae853SAndroid Build Coastguard Worker
271*495ae853SAndroid Build Coastguard Worker code_val = (code_num + 1) >> 1;
272*495ae853SAndroid Build Coastguard Worker if(!(code_num & 0x01))
273*495ae853SAndroid Build Coastguard Worker return -((WORD32)code_val);
274*495ae853SAndroid Build Coastguard Worker return (WORD32)code_val;
275*495ae853SAndroid Build Coastguard Worker
276*495ae853SAndroid Build Coastguard Worker }
277*495ae853SAndroid Build Coastguard Worker
278*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
279*495ae853SAndroid Build Coastguard Worker /* */
280*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_cavlc_4x4res_block_totalcoeff_1 */
281*495ae853SAndroid Build Coastguard Worker /* */
282*495ae853SAndroid Build Coastguard Worker /* Description : This function does cavlc decoding of 4x4 block residual */
283*495ae853SAndroid Build Coastguard Worker /* coefficient when total coeff is equal to 1. The parsing */
284*495ae853SAndroid Build Coastguard Worker /* is done as defined in section 9.2.2 and 9.2.3 of the */
285*495ae853SAndroid Build Coastguard Worker /* H264 standard. */
286*495ae853SAndroid Build Coastguard Worker /* */
287*495ae853SAndroid Build Coastguard Worker /* Inputs : <What inputs does the function take?> */
288*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
289*495ae853SAndroid Build Coastguard Worker /* Processing : <Describe how the function operates - include algorithm */
290*495ae853SAndroid Build Coastguard Worker /* description> */
291*495ae853SAndroid Build Coastguard Worker /* Outputs : <What does the function produce?> */
292*495ae853SAndroid Build Coastguard Worker /* Returns : <What does the function return?> */
293*495ae853SAndroid Build Coastguard Worker /* */
294*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
295*495ae853SAndroid Build Coastguard Worker /* */
296*495ae853SAndroid Build Coastguard Worker /* Revision History: */
297*495ae853SAndroid Build Coastguard Worker /* */
298*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
299*495ae853SAndroid Build Coastguard Worker /* 25 09 2008 Jay Draft */
300*495ae853SAndroid Build Coastguard Worker /* */
301*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_cavlc_4x4res_block_totalcoeff_1(UWORD32 u4_isdc,UWORD32 u4_total_coeff_trail_one,dec_bit_stream_t * ps_bitstrm)302*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_cavlc_4x4res_block_totalcoeff_1(UWORD32 u4_isdc,
303*495ae853SAndroid Build Coastguard Worker UWORD32 u4_total_coeff_trail_one,
304*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t *ps_bitstrm)
305*495ae853SAndroid Build Coastguard Worker {
306*495ae853SAndroid Build Coastguard Worker
307*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
308*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
309*495ae853SAndroid Build Coastguard Worker UWORD32 u4_trailing_ones = u4_total_coeff_trail_one & 0xFFFF;
310*495ae853SAndroid Build Coastguard Worker WORD32 i2_level;
311*495ae853SAndroid Build Coastguard Worker UWORD32 u4_tot_zero, u4_ldz, u4_scan_pos;
312*495ae853SAndroid Build Coastguard Worker
313*495ae853SAndroid Build Coastguard Worker tu_sblk4x4_coeff_data_t *ps_tu_4x4;
314*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_coeff_data;
315*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;
316*495ae853SAndroid Build Coastguard Worker
317*495ae853SAndroid Build Coastguard Worker ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
318*495ae853SAndroid Build Coastguard Worker ps_tu_4x4->u2_sig_coeff_map = 0;
319*495ae853SAndroid Build Coastguard Worker pi2_coeff_data = &ps_tu_4x4->ai2_level[0];
320*495ae853SAndroid Build Coastguard Worker
321*495ae853SAndroid Build Coastguard Worker
322*495ae853SAndroid Build Coastguard Worker if(u4_trailing_ones)
323*495ae853SAndroid Build Coastguard Worker {
324*495ae853SAndroid Build Coastguard Worker UWORD32 u4_sign;
325*495ae853SAndroid Build Coastguard Worker /****************************************************************/
326*495ae853SAndroid Build Coastguard Worker /* Decode Trailing One as in section 9.2.2 */
327*495ae853SAndroid Build Coastguard Worker /****************************************************************/
328*495ae853SAndroid Build Coastguard Worker GETBIT(u4_sign, u4_bitstream_offset, pu4_bitstrm_buf);
329*495ae853SAndroid Build Coastguard Worker i2_level = u4_sign ? -1 : 1;
330*495ae853SAndroid Build Coastguard Worker }
331*495ae853SAndroid Build Coastguard Worker else
332*495ae853SAndroid Build Coastguard Worker {
333*495ae853SAndroid Build Coastguard Worker /****************************************************************/
334*495ae853SAndroid Build Coastguard Worker /* Decoding Level based on prefix and suffix as in 9.2.2 */
335*495ae853SAndroid Build Coastguard Worker /****************************************************************/
336*495ae853SAndroid Build Coastguard Worker UWORD32 u4_lev_suffix, u4_lev_suffix_size;
337*495ae853SAndroid Build Coastguard Worker WORD32 u2_lev_code, u2_abs_value;
338*495ae853SAndroid Build Coastguard Worker UWORD32 u4_lev_prefix;
339*495ae853SAndroid Build Coastguard Worker /***************************************************************/
340*495ae853SAndroid Build Coastguard Worker /* Find leading zeros in next 32 bits */
341*495ae853SAndroid Build Coastguard Worker /***************************************************************/
342*495ae853SAndroid Build Coastguard Worker FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
343*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
344*495ae853SAndroid Build Coastguard Worker u2_lev_code = (2 + MIN(u4_lev_prefix, 15));
345*495ae853SAndroid Build Coastguard Worker
346*495ae853SAndroid Build Coastguard Worker if(14 == u4_lev_prefix)
347*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size = 4;
348*495ae853SAndroid Build Coastguard Worker else if(15 <= u4_lev_prefix)
349*495ae853SAndroid Build Coastguard Worker {
350*495ae853SAndroid Build Coastguard Worker u2_lev_code += 15;
351*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size = u4_lev_prefix - 3;
352*495ae853SAndroid Build Coastguard Worker }
353*495ae853SAndroid Build Coastguard Worker else
354*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size = 0;
355*495ae853SAndroid Build Coastguard Worker
356*495ae853SAndroid Build Coastguard Worker //HP_LEVEL_PREFIX
357*495ae853SAndroid Build Coastguard Worker if(16 <= u4_lev_prefix)
358*495ae853SAndroid Build Coastguard Worker {
359*495ae853SAndroid Build Coastguard Worker u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
360*495ae853SAndroid Build Coastguard Worker }
361*495ae853SAndroid Build Coastguard Worker if(u4_lev_suffix_size)
362*495ae853SAndroid Build Coastguard Worker {
363*495ae853SAndroid Build Coastguard Worker GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
364*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size);
365*495ae853SAndroid Build Coastguard Worker u2_lev_code += u4_lev_suffix;
366*495ae853SAndroid Build Coastguard Worker }
367*495ae853SAndroid Build Coastguard Worker
368*495ae853SAndroid Build Coastguard Worker u2_abs_value = (u2_lev_code + 2) >> 1;
369*495ae853SAndroid Build Coastguard Worker /*********************************************************/
370*495ae853SAndroid Build Coastguard Worker /* If Level code is odd, level is negative else positive */
371*495ae853SAndroid Build Coastguard Worker /*********************************************************/
372*495ae853SAndroid Build Coastguard Worker i2_level = (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;
373*495ae853SAndroid Build Coastguard Worker
374*495ae853SAndroid Build Coastguard Worker }
375*495ae853SAndroid Build Coastguard Worker
376*495ae853SAndroid Build Coastguard Worker /****************************************************************/
377*495ae853SAndroid Build Coastguard Worker /* Decoding total zeros as in section 9.2.3, table 9.7 */
378*495ae853SAndroid Build Coastguard Worker /****************************************************************/
379*495ae853SAndroid Build Coastguard Worker FIND_ONE_IN_STREAM_LEN(u4_ldz, u4_bitstream_offset, pu4_bitstrm_buf, 8);
380*495ae853SAndroid Build Coastguard Worker
381*495ae853SAndroid Build Coastguard Worker if(u4_ldz)
382*495ae853SAndroid Build Coastguard Worker {
383*495ae853SAndroid Build Coastguard Worker GETBIT(u4_tot_zero, u4_bitstream_offset, pu4_bitstrm_buf);
384*495ae853SAndroid Build Coastguard Worker u4_tot_zero = (u4_ldz << 1) - u4_tot_zero;
385*495ae853SAndroid Build Coastguard Worker }
386*495ae853SAndroid Build Coastguard Worker else
387*495ae853SAndroid Build Coastguard Worker u4_tot_zero = 0;
388*495ae853SAndroid Build Coastguard Worker
389*495ae853SAndroid Build Coastguard Worker /***********************************************************************/
390*495ae853SAndroid Build Coastguard Worker /* Inverse scan and store residual coeff. Update the bitstream u4_ofst */
391*495ae853SAndroid Build Coastguard Worker /***********************************************************************/
392*495ae853SAndroid Build Coastguard Worker u4_scan_pos = u4_tot_zero + u4_isdc;
393*495ae853SAndroid Build Coastguard Worker if(u4_scan_pos > 15)
394*495ae853SAndroid Build Coastguard Worker return -1;
395*495ae853SAndroid Build Coastguard Worker
396*495ae853SAndroid Build Coastguard Worker SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
397*495ae853SAndroid Build Coastguard Worker *pi2_coeff_data++ = i2_level;
398*495ae853SAndroid Build Coastguard Worker
399*495ae853SAndroid Build Coastguard Worker
400*495ae853SAndroid Build Coastguard Worker {
401*495ae853SAndroid Build Coastguard Worker WORD32 offset;
402*495ae853SAndroid Build Coastguard Worker offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4;
403*495ae853SAndroid Build Coastguard Worker offset = ALIGN4(offset);
404*495ae853SAndroid Build Coastguard Worker ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset);
405*495ae853SAndroid Build Coastguard Worker }
406*495ae853SAndroid Build Coastguard Worker
407*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_ofst = u4_bitstream_offset;
408*495ae853SAndroid Build Coastguard Worker return 0;
409*495ae853SAndroid Build Coastguard Worker }
410*495ae853SAndroid Build Coastguard Worker
411*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
412*495ae853SAndroid Build Coastguard Worker /* */
413*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_cavlc_4x4res_block_totalcoeff_2to10 */
414*495ae853SAndroid Build Coastguard Worker /* */
415*495ae853SAndroid Build Coastguard Worker /* Description : This function does cavlc decoding of 4x4 block residual */
416*495ae853SAndroid Build Coastguard Worker /* coefficient when total coeffs are between two and ten */
417*495ae853SAndroid Build Coastguard Worker /* inclusive. Parsing is done as defined in section 9.2.2 */
418*495ae853SAndroid Build Coastguard Worker /* and 9.2.3 the H264 standard. */
419*495ae853SAndroid Build Coastguard Worker /* */
420*495ae853SAndroid Build Coastguard Worker /* Inputs : <What inputs does the function take?> */
421*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
422*495ae853SAndroid Build Coastguard Worker /* Processing : <Describe how the function operates - include algorithm */
423*495ae853SAndroid Build Coastguard Worker /* description> */
424*495ae853SAndroid Build Coastguard Worker /* Outputs : <What does the function produce?> */
425*495ae853SAndroid Build Coastguard Worker /* Returns : <What does the function return?> */
426*495ae853SAndroid Build Coastguard Worker /* */
427*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
428*495ae853SAndroid Build Coastguard Worker /* */
429*495ae853SAndroid Build Coastguard Worker /* Revision History: */
430*495ae853SAndroid Build Coastguard Worker /* */
431*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
432*495ae853SAndroid Build Coastguard Worker /* 25 09 2008 Jay Draft */
433*495ae853SAndroid Build Coastguard Worker /* */
434*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
435*495ae853SAndroid Build Coastguard Worker
ih264d_cavlc_4x4res_block_totalcoeff_2to10(UWORD32 u4_isdc,UWORD32 u4_total_coeff_trail_one,dec_bit_stream_t * ps_bitstrm)436*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_cavlc_4x4res_block_totalcoeff_2to10(UWORD32 u4_isdc,
437*495ae853SAndroid Build Coastguard Worker UWORD32 u4_total_coeff_trail_one, /*!<TotalCoefficients<<16+trailingones*/
438*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t *ps_bitstrm)
439*495ae853SAndroid Build Coastguard Worker {
440*495ae853SAndroid Build Coastguard Worker UWORD32 u4_total_zeroes;
441*495ae853SAndroid Build Coastguard Worker WORD32 i;
442*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
443*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
444*495ae853SAndroid Build Coastguard Worker UWORD32 u4_trailing_ones = u4_total_coeff_trail_one & 0xFFFF;
445*495ae853SAndroid Build Coastguard Worker UWORD32 u4_total_coeff = u4_total_coeff_trail_one >> 16;
446*495ae853SAndroid Build Coastguard Worker // To avoid error check at 4x4 level, allocating for 3 extra levels(16+3)
447*495ae853SAndroid Build Coastguard Worker // since u4_trailing_ones can at the max be 3. This will be required when
448*495ae853SAndroid Build Coastguard Worker // u4_total_coeff is less than u4_trailing_ones
449*495ae853SAndroid Build Coastguard Worker WORD16 ai2_level_arr[19];
450*495ae853SAndroid Build Coastguard Worker WORD16 *i2_level_arr = &ai2_level_arr[3];
451*495ae853SAndroid Build Coastguard Worker
452*495ae853SAndroid Build Coastguard Worker tu_sblk4x4_coeff_data_t *ps_tu_4x4;
453*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_coeff_data;
454*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;
455*495ae853SAndroid Build Coastguard Worker
456*495ae853SAndroid Build Coastguard Worker ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
457*495ae853SAndroid Build Coastguard Worker ps_tu_4x4->u2_sig_coeff_map = 0;
458*495ae853SAndroid Build Coastguard Worker pi2_coeff_data = &ps_tu_4x4->ai2_level[0];
459*495ae853SAndroid Build Coastguard Worker
460*495ae853SAndroid Build Coastguard Worker i = u4_total_coeff - 1;
461*495ae853SAndroid Build Coastguard Worker
462*495ae853SAndroid Build Coastguard Worker if(u4_trailing_ones)
463*495ae853SAndroid Build Coastguard Worker {
464*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
465*495ae853SAndroid Build Coastguard Worker /* Decode Trailing Ones */
466*495ae853SAndroid Build Coastguard Worker /* read the sign of T1's and put them in level array */
467*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
468*495ae853SAndroid Build Coastguard Worker UWORD32 u4_signs, u4_cnt = u4_trailing_ones;
469*495ae853SAndroid Build Coastguard Worker WORD16 (*ppi2_trlone_lkup)[3] =
470*495ae853SAndroid Build Coastguard Worker (WORD16 (*)[3])gai2_ih264d_trailing_one_level;
471*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_trlone_lkup;
472*495ae853SAndroid Build Coastguard Worker
473*495ae853SAndroid Build Coastguard Worker GETBITS(u4_signs, u4_bitstream_offset, pu4_bitstrm_buf, u4_cnt);
474*495ae853SAndroid Build Coastguard Worker
475*495ae853SAndroid Build Coastguard Worker pi2_trlone_lkup = ppi2_trlone_lkup[(1 << u4_cnt) - 2 + u4_signs];
476*495ae853SAndroid Build Coastguard Worker
477*495ae853SAndroid Build Coastguard Worker while(u4_cnt)
478*495ae853SAndroid Build Coastguard Worker {
479*495ae853SAndroid Build Coastguard Worker i2_level_arr[i--] = *pi2_trlone_lkup++;
480*495ae853SAndroid Build Coastguard Worker u4_cnt--;
481*495ae853SAndroid Build Coastguard Worker }
482*495ae853SAndroid Build Coastguard Worker }
483*495ae853SAndroid Build Coastguard Worker
484*495ae853SAndroid Build Coastguard Worker /****************************************************************/
485*495ae853SAndroid Build Coastguard Worker /* Decoding Levels Begins */
486*495ae853SAndroid Build Coastguard Worker /****************************************************************/
487*495ae853SAndroid Build Coastguard Worker if(i >= 0)
488*495ae853SAndroid Build Coastguard Worker {
489*495ae853SAndroid Build Coastguard Worker /****************************************************************/
490*495ae853SAndroid Build Coastguard Worker /* First level is decoded outside the loop as it has lot of */
491*495ae853SAndroid Build Coastguard Worker /* special cases. */
492*495ae853SAndroid Build Coastguard Worker /****************************************************************/
493*495ae853SAndroid Build Coastguard Worker UWORD32 u4_lev_suffix, u4_suffix_len, u4_lev_suffix_size;
494*495ae853SAndroid Build Coastguard Worker WORD32 u2_lev_code, u2_abs_value;
495*495ae853SAndroid Build Coastguard Worker UWORD32 u4_lev_prefix;
496*495ae853SAndroid Build Coastguard Worker
497*495ae853SAndroid Build Coastguard Worker /***************************************************************/
498*495ae853SAndroid Build Coastguard Worker /* u4_suffix_len = 0, Find leading zeros in next 32 bits */
499*495ae853SAndroid Build Coastguard Worker /***************************************************************/
500*495ae853SAndroid Build Coastguard Worker FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
501*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
502*495ae853SAndroid Build Coastguard Worker
503*495ae853SAndroid Build Coastguard Worker /*********************************************************/
504*495ae853SAndroid Build Coastguard Worker /* Special decoding case when trailing ones are 3 */
505*495ae853SAndroid Build Coastguard Worker /*********************************************************/
506*495ae853SAndroid Build Coastguard Worker u2_lev_code = MIN(15, u4_lev_prefix);
507*495ae853SAndroid Build Coastguard Worker
508*495ae853SAndroid Build Coastguard Worker u2_lev_code += (3 == u4_trailing_ones) ? 0 : 2;
509*495ae853SAndroid Build Coastguard Worker
510*495ae853SAndroid Build Coastguard Worker if(14 == u4_lev_prefix)
511*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size = 4;
512*495ae853SAndroid Build Coastguard Worker else if(15 <= u4_lev_prefix)
513*495ae853SAndroid Build Coastguard Worker {
514*495ae853SAndroid Build Coastguard Worker u2_lev_code += 15;
515*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size = u4_lev_prefix - 3;
516*495ae853SAndroid Build Coastguard Worker }
517*495ae853SAndroid Build Coastguard Worker else
518*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size = 0;
519*495ae853SAndroid Build Coastguard Worker
520*495ae853SAndroid Build Coastguard Worker //HP_LEVEL_PREFIX
521*495ae853SAndroid Build Coastguard Worker if(16 <= u4_lev_prefix)
522*495ae853SAndroid Build Coastguard Worker {
523*495ae853SAndroid Build Coastguard Worker u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
524*495ae853SAndroid Build Coastguard Worker }
525*495ae853SAndroid Build Coastguard Worker if(u4_lev_suffix_size)
526*495ae853SAndroid Build Coastguard Worker {
527*495ae853SAndroid Build Coastguard Worker GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
528*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size);
529*495ae853SAndroid Build Coastguard Worker u2_lev_code += u4_lev_suffix;
530*495ae853SAndroid Build Coastguard Worker }
531*495ae853SAndroid Build Coastguard Worker
532*495ae853SAndroid Build Coastguard Worker u2_abs_value = (u2_lev_code + 2) >> 1;
533*495ae853SAndroid Build Coastguard Worker /*********************************************************/
534*495ae853SAndroid Build Coastguard Worker /* If Level code is odd, level is negative else positive */
535*495ae853SAndroid Build Coastguard Worker /*********************************************************/
536*495ae853SAndroid Build Coastguard Worker i2_level_arr[i--] = (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;
537*495ae853SAndroid Build Coastguard Worker
538*495ae853SAndroid Build Coastguard Worker u4_suffix_len = (u2_abs_value > 3) ? 2 : 1;
539*495ae853SAndroid Build Coastguard Worker
540*495ae853SAndroid Build Coastguard Worker /*********************************************************/
541*495ae853SAndroid Build Coastguard Worker /* Now loop over the remaining levels */
542*495ae853SAndroid Build Coastguard Worker /*********************************************************/
543*495ae853SAndroid Build Coastguard Worker while(i >= 0)
544*495ae853SAndroid Build Coastguard Worker {
545*495ae853SAndroid Build Coastguard Worker
546*495ae853SAndroid Build Coastguard Worker /***************************************************************/
547*495ae853SAndroid Build Coastguard Worker /* Find leading zeros in next 32 bits */
548*495ae853SAndroid Build Coastguard Worker /***************************************************************/
549*495ae853SAndroid Build Coastguard Worker FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
550*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
551*495ae853SAndroid Build Coastguard Worker
552*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size =
553*495ae853SAndroid Build Coastguard Worker (15 <= u4_lev_prefix) ?
554*495ae853SAndroid Build Coastguard Worker (u4_lev_prefix - 3) : u4_suffix_len;
555*495ae853SAndroid Build Coastguard Worker
556*495ae853SAndroid Build Coastguard Worker /*********************************************************/
557*495ae853SAndroid Build Coastguard Worker /* Compute level code using prefix and suffix */
558*495ae853SAndroid Build Coastguard Worker /*********************************************************/
559*495ae853SAndroid Build Coastguard Worker GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
560*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size);
561*495ae853SAndroid Build Coastguard Worker u2_lev_code = (MIN(15,u4_lev_prefix) << u4_suffix_len)
562*495ae853SAndroid Build Coastguard Worker + u4_lev_suffix;
563*495ae853SAndroid Build Coastguard Worker
564*495ae853SAndroid Build Coastguard Worker //HP_LEVEL_PREFIX
565*495ae853SAndroid Build Coastguard Worker if(16 <= u4_lev_prefix)
566*495ae853SAndroid Build Coastguard Worker {
567*495ae853SAndroid Build Coastguard Worker u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
568*495ae853SAndroid Build Coastguard Worker }
569*495ae853SAndroid Build Coastguard Worker u2_abs_value = (u2_lev_code + 2) >> 1;
570*495ae853SAndroid Build Coastguard Worker
571*495ae853SAndroid Build Coastguard Worker /*********************************************************/
572*495ae853SAndroid Build Coastguard Worker /* If Level code is odd, level is negative else positive */
573*495ae853SAndroid Build Coastguard Worker /*********************************************************/
574*495ae853SAndroid Build Coastguard Worker i2_level_arr[i--] =
575*495ae853SAndroid Build Coastguard Worker (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;
576*495ae853SAndroid Build Coastguard Worker
577*495ae853SAndroid Build Coastguard Worker /*********************************************************/
578*495ae853SAndroid Build Coastguard Worker /* Increment suffix length if required */
579*495ae853SAndroid Build Coastguard Worker /*********************************************************/
580*495ae853SAndroid Build Coastguard Worker u4_suffix_len +=
581*495ae853SAndroid Build Coastguard Worker (u4_suffix_len < 6) ?
582*495ae853SAndroid Build Coastguard Worker (u2_abs_value
583*495ae853SAndroid Build Coastguard Worker > (3
584*495ae853SAndroid Build Coastguard Worker << (u4_suffix_len
585*495ae853SAndroid Build Coastguard Worker - 1))) :
586*495ae853SAndroid Build Coastguard Worker 0;
587*495ae853SAndroid Build Coastguard Worker }
588*495ae853SAndroid Build Coastguard Worker
589*495ae853SAndroid Build Coastguard Worker /****************************************************************/
590*495ae853SAndroid Build Coastguard Worker /* Decoding Levels Ends */
591*495ae853SAndroid Build Coastguard Worker /****************************************************************/
592*495ae853SAndroid Build Coastguard Worker }
593*495ae853SAndroid Build Coastguard Worker
594*495ae853SAndroid Build Coastguard Worker /****************************************************************/
595*495ae853SAndroid Build Coastguard Worker /* Decoding total zeros as in section 9.2.3, table 9.7 */
596*495ae853SAndroid Build Coastguard Worker /****************************************************************/
597*495ae853SAndroid Build Coastguard Worker {
598*495ae853SAndroid Build Coastguard Worker UWORD32 u4_index;
599*495ae853SAndroid Build Coastguard Worker const UWORD8 (*ppu1_total_zero_lkup)[64] =
600*495ae853SAndroid Build Coastguard Worker (const UWORD8 (*)[64])gau1_ih264d_table_total_zero_2to10;
601*495ae853SAndroid Build Coastguard Worker
602*495ae853SAndroid Build Coastguard Worker NEXTBITS(u4_index, u4_bitstream_offset, pu4_bitstrm_buf, 6);
603*495ae853SAndroid Build Coastguard Worker u4_total_zeroes = ppu1_total_zero_lkup[u4_total_coeff - 2][u4_index];
604*495ae853SAndroid Build Coastguard Worker
605*495ae853SAndroid Build Coastguard Worker FLUSHBITS(u4_bitstream_offset, (u4_total_zeroes >> 4));
606*495ae853SAndroid Build Coastguard Worker u4_total_zeroes &= 0xf;
607*495ae853SAndroid Build Coastguard Worker }
608*495ae853SAndroid Build Coastguard Worker
609*495ae853SAndroid Build Coastguard Worker /**************************************************************/
610*495ae853SAndroid Build Coastguard Worker /* Decode the runs and form the coefficient buffer */
611*495ae853SAndroid Build Coastguard Worker /**************************************************************/
612*495ae853SAndroid Build Coastguard Worker {
613*495ae853SAndroid Build Coastguard Worker const UWORD8 *pu1_table_runbefore;
614*495ae853SAndroid Build Coastguard Worker UWORD32 u4_run;
615*495ae853SAndroid Build Coastguard Worker WORD32 k;
616*495ae853SAndroid Build Coastguard Worker WORD32 u4_scan_pos = u4_total_coeff + u4_total_zeroes - 1 + u4_isdc;
617*495ae853SAndroid Build Coastguard Worker WORD32 u4_zeroes_left = u4_total_zeroes;
618*495ae853SAndroid Build Coastguard Worker k = u4_total_coeff - 1;
619*495ae853SAndroid Build Coastguard Worker
620*495ae853SAndroid Build Coastguard Worker /**************************************************************/
621*495ae853SAndroid Build Coastguard Worker /* Decoding Runs Begin for zeros left > 6 */
622*495ae853SAndroid Build Coastguard Worker /**************************************************************/
623*495ae853SAndroid Build Coastguard Worker while((u4_zeroes_left > 6) && k)
624*495ae853SAndroid Build Coastguard Worker {
625*495ae853SAndroid Build Coastguard Worker UWORD32 u4_code;
626*495ae853SAndroid Build Coastguard Worker
627*495ae853SAndroid Build Coastguard Worker NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 3);
628*495ae853SAndroid Build Coastguard Worker
629*495ae853SAndroid Build Coastguard Worker if(u4_code != 0)
630*495ae853SAndroid Build Coastguard Worker {
631*495ae853SAndroid Build Coastguard Worker FLUSHBITS(u4_bitstream_offset, 3);
632*495ae853SAndroid Build Coastguard Worker u4_run = (7 - u4_code);
633*495ae853SAndroid Build Coastguard Worker }
634*495ae853SAndroid Build Coastguard Worker else
635*495ae853SAndroid Build Coastguard Worker {
636*495ae853SAndroid Build Coastguard Worker
637*495ae853SAndroid Build Coastguard Worker FIND_ONE_IN_STREAM_LEN(u4_code, u4_bitstream_offset,
638*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf, 11);
639*495ae853SAndroid Build Coastguard Worker u4_run = (4 + u4_code);
640*495ae853SAndroid Build Coastguard Worker }
641*495ae853SAndroid Build Coastguard Worker
642*495ae853SAndroid Build Coastguard Worker SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
643*495ae853SAndroid Build Coastguard Worker *pi2_coeff_data++ = i2_level_arr[k--];
644*495ae853SAndroid Build Coastguard Worker u4_zeroes_left -= (WORD32)u4_run;
645*495ae853SAndroid Build Coastguard Worker u4_scan_pos -= (WORD32)(u4_run + 1);
646*495ae853SAndroid Build Coastguard Worker }
647*495ae853SAndroid Build Coastguard Worker
648*495ae853SAndroid Build Coastguard Worker if (u4_zeroes_left < 0 || u4_scan_pos < 0)
649*495ae853SAndroid Build Coastguard Worker return -1;
650*495ae853SAndroid Build Coastguard Worker
651*495ae853SAndroid Build Coastguard Worker /**************************************************************/
652*495ae853SAndroid Build Coastguard Worker /* Decoding Runs for 0 < zeros left <=6 */
653*495ae853SAndroid Build Coastguard Worker /**************************************************************/
654*495ae853SAndroid Build Coastguard Worker pu1_table_runbefore = (UWORD8 *)gau1_ih264d_table_run_before;
655*495ae853SAndroid Build Coastguard Worker while((u4_zeroes_left > 0) && k)
656*495ae853SAndroid Build Coastguard Worker {
657*495ae853SAndroid Build Coastguard Worker UWORD32 u4_code;
658*495ae853SAndroid Build Coastguard Worker NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 3);
659*495ae853SAndroid Build Coastguard Worker
660*495ae853SAndroid Build Coastguard Worker u4_code = pu1_table_runbefore[u4_code + (u4_zeroes_left << 3)];
661*495ae853SAndroid Build Coastguard Worker u4_run = u4_code >> 2;
662*495ae853SAndroid Build Coastguard Worker
663*495ae853SAndroid Build Coastguard Worker FLUSHBITS(u4_bitstream_offset, (u4_code & 0x03));
664*495ae853SAndroid Build Coastguard Worker
665*495ae853SAndroid Build Coastguard Worker SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
666*495ae853SAndroid Build Coastguard Worker *pi2_coeff_data++ = i2_level_arr[k--];
667*495ae853SAndroid Build Coastguard Worker u4_zeroes_left -= (WORD32)u4_run;
668*495ae853SAndroid Build Coastguard Worker u4_scan_pos -= (WORD32)(u4_run + 1);
669*495ae853SAndroid Build Coastguard Worker }
670*495ae853SAndroid Build Coastguard Worker if (u4_zeroes_left < 0 || u4_scan_pos < 0)
671*495ae853SAndroid Build Coastguard Worker return -1;
672*495ae853SAndroid Build Coastguard Worker /**************************************************************/
673*495ae853SAndroid Build Coastguard Worker /* Decoding Runs End */
674*495ae853SAndroid Build Coastguard Worker /**************************************************************/
675*495ae853SAndroid Build Coastguard Worker
676*495ae853SAndroid Build Coastguard Worker /**************************************************************/
677*495ae853SAndroid Build Coastguard Worker /* Copy the remaining coefficients */
678*495ae853SAndroid Build Coastguard Worker /**************************************************************/
679*495ae853SAndroid Build Coastguard Worker while(k >= 0)
680*495ae853SAndroid Build Coastguard Worker {
681*495ae853SAndroid Build Coastguard Worker
682*495ae853SAndroid Build Coastguard Worker SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
683*495ae853SAndroid Build Coastguard Worker *pi2_coeff_data++ = i2_level_arr[k--];
684*495ae853SAndroid Build Coastguard Worker u4_scan_pos--;
685*495ae853SAndroid Build Coastguard Worker }
686*495ae853SAndroid Build Coastguard Worker }
687*495ae853SAndroid Build Coastguard Worker
688*495ae853SAndroid Build Coastguard Worker {
689*495ae853SAndroid Build Coastguard Worker WORD32 offset;
690*495ae853SAndroid Build Coastguard Worker offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4;
691*495ae853SAndroid Build Coastguard Worker offset = ALIGN4(offset);
692*495ae853SAndroid Build Coastguard Worker ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset);
693*495ae853SAndroid Build Coastguard Worker }
694*495ae853SAndroid Build Coastguard Worker
695*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_ofst = u4_bitstream_offset;
696*495ae853SAndroid Build Coastguard Worker return 0;
697*495ae853SAndroid Build Coastguard Worker }
698*495ae853SAndroid Build Coastguard Worker
699*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
700*495ae853SAndroid Build Coastguard Worker /* */
701*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_cavlc_4x4res_block_totalcoeff_11to16 */
702*495ae853SAndroid Build Coastguard Worker /* */
703*495ae853SAndroid Build Coastguard Worker /* Description : This function does cavlc decoding of 4x4 block residual */
704*495ae853SAndroid Build Coastguard Worker /* coefficient when total coeffs are greater than ten. */
705*495ae853SAndroid Build Coastguard Worker /* Parsing is done as defined in section 9.2.2 and 9.2.3 of */
706*495ae853SAndroid Build Coastguard Worker /* the H264 standard. */
707*495ae853SAndroid Build Coastguard Worker /* */
708*495ae853SAndroid Build Coastguard Worker /* Inputs : <What inputs does the function take?> */
709*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
710*495ae853SAndroid Build Coastguard Worker /* Processing : <Describe how the function operates - include algorithm */
711*495ae853SAndroid Build Coastguard Worker /* description> */
712*495ae853SAndroid Build Coastguard Worker /* Outputs : <What does the function produce?> */
713*495ae853SAndroid Build Coastguard Worker /* Returns : <What does the function return?> */
714*495ae853SAndroid Build Coastguard Worker /* */
715*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
716*495ae853SAndroid Build Coastguard Worker /* */
717*495ae853SAndroid Build Coastguard Worker /* Revision History: */
718*495ae853SAndroid Build Coastguard Worker /* */
719*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
720*495ae853SAndroid Build Coastguard Worker /* 25 09 2008 Jay Draft */
721*495ae853SAndroid Build Coastguard Worker /* */
722*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
723*495ae853SAndroid Build Coastguard Worker
ih264d_cavlc_4x4res_block_totalcoeff_11to16(UWORD32 u4_isdc,UWORD32 u4_total_coeff_trail_one,dec_bit_stream_t * ps_bitstrm)724*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_cavlc_4x4res_block_totalcoeff_11to16(UWORD32 u4_isdc,
725*495ae853SAndroid Build Coastguard Worker UWORD32 u4_total_coeff_trail_one, /*!<TotalCoefficients<<16+trailingones*/
726*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t *ps_bitstrm )
727*495ae853SAndroid Build Coastguard Worker {
728*495ae853SAndroid Build Coastguard Worker UWORD32 u4_total_zeroes;
729*495ae853SAndroid Build Coastguard Worker WORD32 i;
730*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
731*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
732*495ae853SAndroid Build Coastguard Worker UWORD32 u4_trailing_ones = u4_total_coeff_trail_one & 0xFFFF;
733*495ae853SAndroid Build Coastguard Worker UWORD32 u4_total_coeff = u4_total_coeff_trail_one >> 16;
734*495ae853SAndroid Build Coastguard Worker // To avoid error check at 4x4 level, allocating for 3 extra levels(16+3)
735*495ae853SAndroid Build Coastguard Worker // since u4_trailing_ones can at the max be 3. This will be required when
736*495ae853SAndroid Build Coastguard Worker // u4_total_coeff is less than u4_trailing_ones
737*495ae853SAndroid Build Coastguard Worker WORD16 ai2_level_arr[19];//
738*495ae853SAndroid Build Coastguard Worker WORD16 *i2_level_arr = &ai2_level_arr[3];
739*495ae853SAndroid Build Coastguard Worker
740*495ae853SAndroid Build Coastguard Worker tu_sblk4x4_coeff_data_t *ps_tu_4x4;
741*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_coeff_data;
742*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;
743*495ae853SAndroid Build Coastguard Worker
744*495ae853SAndroid Build Coastguard Worker ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
745*495ae853SAndroid Build Coastguard Worker ps_tu_4x4->u2_sig_coeff_map = 0;
746*495ae853SAndroid Build Coastguard Worker pi2_coeff_data = &ps_tu_4x4->ai2_level[0];
747*495ae853SAndroid Build Coastguard Worker
748*495ae853SAndroid Build Coastguard Worker i = u4_total_coeff - 1;
749*495ae853SAndroid Build Coastguard Worker if(u4_trailing_ones)
750*495ae853SAndroid Build Coastguard Worker {
751*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
752*495ae853SAndroid Build Coastguard Worker /* Decode Trailing Ones */
753*495ae853SAndroid Build Coastguard Worker /* read the sign of T1's and put them in level array */
754*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
755*495ae853SAndroid Build Coastguard Worker UWORD32 u4_signs, u4_cnt = u4_trailing_ones;
756*495ae853SAndroid Build Coastguard Worker WORD16 (*ppi2_trlone_lkup)[3] =
757*495ae853SAndroid Build Coastguard Worker (WORD16 (*)[3])gai2_ih264d_trailing_one_level;
758*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_trlone_lkup;
759*495ae853SAndroid Build Coastguard Worker
760*495ae853SAndroid Build Coastguard Worker GETBITS(u4_signs, u4_bitstream_offset, pu4_bitstrm_buf, u4_cnt);
761*495ae853SAndroid Build Coastguard Worker
762*495ae853SAndroid Build Coastguard Worker pi2_trlone_lkup = ppi2_trlone_lkup[(1 << u4_cnt) - 2 + u4_signs];
763*495ae853SAndroid Build Coastguard Worker
764*495ae853SAndroid Build Coastguard Worker while(u4_cnt)
765*495ae853SAndroid Build Coastguard Worker {
766*495ae853SAndroid Build Coastguard Worker i2_level_arr[i--] = *pi2_trlone_lkup++;
767*495ae853SAndroid Build Coastguard Worker u4_cnt--;
768*495ae853SAndroid Build Coastguard Worker }
769*495ae853SAndroid Build Coastguard Worker }
770*495ae853SAndroid Build Coastguard Worker
771*495ae853SAndroid Build Coastguard Worker /****************************************************************/
772*495ae853SAndroid Build Coastguard Worker /* Decoding Levels Begins */
773*495ae853SAndroid Build Coastguard Worker /****************************************************************/
774*495ae853SAndroid Build Coastguard Worker if(i >= 0)
775*495ae853SAndroid Build Coastguard Worker {
776*495ae853SAndroid Build Coastguard Worker /****************************************************************/
777*495ae853SAndroid Build Coastguard Worker /* First level is decoded outside the loop as it has lot of */
778*495ae853SAndroid Build Coastguard Worker /* special cases. */
779*495ae853SAndroid Build Coastguard Worker /****************************************************************/
780*495ae853SAndroid Build Coastguard Worker UWORD32 u4_lev_suffix, u4_suffix_len, u4_lev_suffix_size;
781*495ae853SAndroid Build Coastguard Worker UWORD16 u2_lev_code, u2_abs_value;
782*495ae853SAndroid Build Coastguard Worker UWORD32 u4_lev_prefix;
783*495ae853SAndroid Build Coastguard Worker
784*495ae853SAndroid Build Coastguard Worker if(u4_trailing_ones < 3)
785*495ae853SAndroid Build Coastguard Worker {
786*495ae853SAndroid Build Coastguard Worker /*********************************************************/
787*495ae853SAndroid Build Coastguard Worker /* u4_suffix_len = 1 */
788*495ae853SAndroid Build Coastguard Worker /*********************************************************/
789*495ae853SAndroid Build Coastguard Worker /***************************************************************/
790*495ae853SAndroid Build Coastguard Worker /* Find leading zeros in next 32 bits */
791*495ae853SAndroid Build Coastguard Worker /***************************************************************/
792*495ae853SAndroid Build Coastguard Worker FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
793*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
794*495ae853SAndroid Build Coastguard Worker
795*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size =
796*495ae853SAndroid Build Coastguard Worker (15 <= u4_lev_prefix) ? (u4_lev_prefix - 3) : 1;
797*495ae853SAndroid Build Coastguard Worker
798*495ae853SAndroid Build Coastguard Worker GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
799*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size);
800*495ae853SAndroid Build Coastguard Worker u2_lev_code = 2 + (MIN(u4_lev_prefix,15) << 1) + u4_lev_suffix;
801*495ae853SAndroid Build Coastguard Worker
802*495ae853SAndroid Build Coastguard Worker //HP_LEVEL_PREFIX
803*495ae853SAndroid Build Coastguard Worker if(16 <= u4_lev_prefix)
804*495ae853SAndroid Build Coastguard Worker {
805*495ae853SAndroid Build Coastguard Worker u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
806*495ae853SAndroid Build Coastguard Worker }
807*495ae853SAndroid Build Coastguard Worker }
808*495ae853SAndroid Build Coastguard Worker else
809*495ae853SAndroid Build Coastguard Worker {
810*495ae853SAndroid Build Coastguard Worker /*********************************************************/
811*495ae853SAndroid Build Coastguard Worker /*u4_suffix_len = 0 */
812*495ae853SAndroid Build Coastguard Worker /*********************************************************/
813*495ae853SAndroid Build Coastguard Worker /***************************************************************/
814*495ae853SAndroid Build Coastguard Worker /* Find leading zeros in next 32 bits */
815*495ae853SAndroid Build Coastguard Worker /***************************************************************/
816*495ae853SAndroid Build Coastguard Worker FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
817*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
818*495ae853SAndroid Build Coastguard Worker
819*495ae853SAndroid Build Coastguard Worker /*********************************************************/
820*495ae853SAndroid Build Coastguard Worker /* Special decoding case when trailing ones are 3 */
821*495ae853SAndroid Build Coastguard Worker /*********************************************************/
822*495ae853SAndroid Build Coastguard Worker u2_lev_code = MIN(15, u4_lev_prefix);
823*495ae853SAndroid Build Coastguard Worker
824*495ae853SAndroid Build Coastguard Worker u2_lev_code += (3 == u4_trailing_ones) ? 0 : (2);
825*495ae853SAndroid Build Coastguard Worker
826*495ae853SAndroid Build Coastguard Worker if(14 == u4_lev_prefix)
827*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size = 4;
828*495ae853SAndroid Build Coastguard Worker else if(15 <= u4_lev_prefix)
829*495ae853SAndroid Build Coastguard Worker {
830*495ae853SAndroid Build Coastguard Worker u2_lev_code += 15;
831*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size = (u4_lev_prefix - 3);
832*495ae853SAndroid Build Coastguard Worker }
833*495ae853SAndroid Build Coastguard Worker else
834*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size = 0;
835*495ae853SAndroid Build Coastguard Worker
836*495ae853SAndroid Build Coastguard Worker //HP_LEVEL_PREFIX
837*495ae853SAndroid Build Coastguard Worker if(16 <= u4_lev_prefix)
838*495ae853SAndroid Build Coastguard Worker {
839*495ae853SAndroid Build Coastguard Worker u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
840*495ae853SAndroid Build Coastguard Worker }
841*495ae853SAndroid Build Coastguard Worker if(u4_lev_suffix_size)
842*495ae853SAndroid Build Coastguard Worker {
843*495ae853SAndroid Build Coastguard Worker GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
844*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size);
845*495ae853SAndroid Build Coastguard Worker u2_lev_code += u4_lev_suffix;
846*495ae853SAndroid Build Coastguard Worker }
847*495ae853SAndroid Build Coastguard Worker }
848*495ae853SAndroid Build Coastguard Worker
849*495ae853SAndroid Build Coastguard Worker u2_abs_value = (u2_lev_code + 2) >> 1;
850*495ae853SAndroid Build Coastguard Worker /*********************************************************/
851*495ae853SAndroid Build Coastguard Worker /* If Level code is odd, level is negative else positive */
852*495ae853SAndroid Build Coastguard Worker /*********************************************************/
853*495ae853SAndroid Build Coastguard Worker i2_level_arr[i--] = (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;
854*495ae853SAndroid Build Coastguard Worker
855*495ae853SAndroid Build Coastguard Worker u4_suffix_len = (u2_abs_value > 3) ? 2 : 1;
856*495ae853SAndroid Build Coastguard Worker
857*495ae853SAndroid Build Coastguard Worker /*********************************************************/
858*495ae853SAndroid Build Coastguard Worker /* Now loop over the remaining levels */
859*495ae853SAndroid Build Coastguard Worker /*********************************************************/
860*495ae853SAndroid Build Coastguard Worker while(i >= 0)
861*495ae853SAndroid Build Coastguard Worker {
862*495ae853SAndroid Build Coastguard Worker
863*495ae853SAndroid Build Coastguard Worker /***************************************************************/
864*495ae853SAndroid Build Coastguard Worker /* Find leading zeros in next 32 bits */
865*495ae853SAndroid Build Coastguard Worker /***************************************************************/
866*495ae853SAndroid Build Coastguard Worker FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
867*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
868*495ae853SAndroid Build Coastguard Worker
869*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size =
870*495ae853SAndroid Build Coastguard Worker (15 <= u4_lev_prefix) ?
871*495ae853SAndroid Build Coastguard Worker (u4_lev_prefix - 3) : u4_suffix_len;
872*495ae853SAndroid Build Coastguard Worker
873*495ae853SAndroid Build Coastguard Worker /*********************************************************/
874*495ae853SAndroid Build Coastguard Worker /* Compute level code using prefix and suffix */
875*495ae853SAndroid Build Coastguard Worker /*********************************************************/
876*495ae853SAndroid Build Coastguard Worker GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
877*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size);
878*495ae853SAndroid Build Coastguard Worker u2_lev_code = (MIN(15,u4_lev_prefix) << u4_suffix_len)
879*495ae853SAndroid Build Coastguard Worker + u4_lev_suffix;
880*495ae853SAndroid Build Coastguard Worker
881*495ae853SAndroid Build Coastguard Worker //HP_LEVEL_PREFIX
882*495ae853SAndroid Build Coastguard Worker if(16 <= u4_lev_prefix)
883*495ae853SAndroid Build Coastguard Worker {
884*495ae853SAndroid Build Coastguard Worker u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
885*495ae853SAndroid Build Coastguard Worker }
886*495ae853SAndroid Build Coastguard Worker u2_abs_value = (u2_lev_code + 2) >> 1;
887*495ae853SAndroid Build Coastguard Worker
888*495ae853SAndroid Build Coastguard Worker /*********************************************************/
889*495ae853SAndroid Build Coastguard Worker /* If Level code is odd, level is negative else positive */
890*495ae853SAndroid Build Coastguard Worker /*********************************************************/
891*495ae853SAndroid Build Coastguard Worker i2_level_arr[i--] =
892*495ae853SAndroid Build Coastguard Worker (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;
893*495ae853SAndroid Build Coastguard Worker
894*495ae853SAndroid Build Coastguard Worker /*********************************************************/
895*495ae853SAndroid Build Coastguard Worker /* Increment suffix length if required */
896*495ae853SAndroid Build Coastguard Worker /*********************************************************/
897*495ae853SAndroid Build Coastguard Worker u4_suffix_len +=
898*495ae853SAndroid Build Coastguard Worker (u4_suffix_len < 6) ?
899*495ae853SAndroid Build Coastguard Worker (u2_abs_value
900*495ae853SAndroid Build Coastguard Worker > (3
901*495ae853SAndroid Build Coastguard Worker << (u4_suffix_len
902*495ae853SAndroid Build Coastguard Worker - 1))) :
903*495ae853SAndroid Build Coastguard Worker 0;
904*495ae853SAndroid Build Coastguard Worker }
905*495ae853SAndroid Build Coastguard Worker
906*495ae853SAndroid Build Coastguard Worker /****************************************************************/
907*495ae853SAndroid Build Coastguard Worker /* Decoding Levels Ends */
908*495ae853SAndroid Build Coastguard Worker /****************************************************************/
909*495ae853SAndroid Build Coastguard Worker }
910*495ae853SAndroid Build Coastguard Worker
911*495ae853SAndroid Build Coastguard Worker if(u4_total_coeff < (16 - u4_isdc))
912*495ae853SAndroid Build Coastguard Worker {
913*495ae853SAndroid Build Coastguard Worker UWORD32 u4_index;
914*495ae853SAndroid Build Coastguard Worker const UWORD8 (*ppu1_total_zero_lkup)[16] =
915*495ae853SAndroid Build Coastguard Worker (const UWORD8 (*)[16])gau1_ih264d_table_total_zero_11to15;
916*495ae853SAndroid Build Coastguard Worker
917*495ae853SAndroid Build Coastguard Worker NEXTBITS(u4_index, u4_bitstream_offset, pu4_bitstrm_buf, 4);
918*495ae853SAndroid Build Coastguard Worker u4_total_zeroes = ppu1_total_zero_lkup[u4_total_coeff - 11][u4_index];
919*495ae853SAndroid Build Coastguard Worker
920*495ae853SAndroid Build Coastguard Worker FLUSHBITS(u4_bitstream_offset, (u4_total_zeroes >> 4));
921*495ae853SAndroid Build Coastguard Worker u4_total_zeroes &= 0xf;
922*495ae853SAndroid Build Coastguard Worker }
923*495ae853SAndroid Build Coastguard Worker else
924*495ae853SAndroid Build Coastguard Worker u4_total_zeroes = 0;
925*495ae853SAndroid Build Coastguard Worker
926*495ae853SAndroid Build Coastguard Worker /**************************************************************/
927*495ae853SAndroid Build Coastguard Worker /* Decode the runs and form the coefficient buffer */
928*495ae853SAndroid Build Coastguard Worker /**************************************************************/
929*495ae853SAndroid Build Coastguard Worker {
930*495ae853SAndroid Build Coastguard Worker const UWORD8 *pu1_table_runbefore;
931*495ae853SAndroid Build Coastguard Worker UWORD32 u4_run;
932*495ae853SAndroid Build Coastguard Worker WORD32 k;
933*495ae853SAndroid Build Coastguard Worker WORD32 u4_scan_pos = u4_total_coeff + u4_total_zeroes - 1 + u4_isdc;
934*495ae853SAndroid Build Coastguard Worker WORD32 u4_zeroes_left = u4_total_zeroes;
935*495ae853SAndroid Build Coastguard Worker k = u4_total_coeff - 1;
936*495ae853SAndroid Build Coastguard Worker
937*495ae853SAndroid Build Coastguard Worker /**************************************************************/
938*495ae853SAndroid Build Coastguard Worker /* Decoding Runs for 0 < zeros left <=6 */
939*495ae853SAndroid Build Coastguard Worker /**************************************************************/
940*495ae853SAndroid Build Coastguard Worker pu1_table_runbefore = (UWORD8 *)gau1_ih264d_table_run_before;
941*495ae853SAndroid Build Coastguard Worker while((u4_zeroes_left > 0) && k)
942*495ae853SAndroid Build Coastguard Worker {
943*495ae853SAndroid Build Coastguard Worker UWORD32 u4_code;
944*495ae853SAndroid Build Coastguard Worker NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 3);
945*495ae853SAndroid Build Coastguard Worker
946*495ae853SAndroid Build Coastguard Worker u4_code = pu1_table_runbefore[u4_code + (u4_zeroes_left << 3)];
947*495ae853SAndroid Build Coastguard Worker u4_run = u4_code >> 2;
948*495ae853SAndroid Build Coastguard Worker
949*495ae853SAndroid Build Coastguard Worker FLUSHBITS(u4_bitstream_offset, (u4_code & 0x03));
950*495ae853SAndroid Build Coastguard Worker SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
951*495ae853SAndroid Build Coastguard Worker *pi2_coeff_data++ = i2_level_arr[k--];
952*495ae853SAndroid Build Coastguard Worker u4_zeroes_left -= (WORD32)u4_run;
953*495ae853SAndroid Build Coastguard Worker u4_scan_pos -= (WORD32)(u4_run + 1);
954*495ae853SAndroid Build Coastguard Worker }
955*495ae853SAndroid Build Coastguard Worker if (u4_zeroes_left < 0 || u4_scan_pos < 0)
956*495ae853SAndroid Build Coastguard Worker return -1;
957*495ae853SAndroid Build Coastguard Worker
958*495ae853SAndroid Build Coastguard Worker /**************************************************************/
959*495ae853SAndroid Build Coastguard Worker /* Decoding Runs End */
960*495ae853SAndroid Build Coastguard Worker /**************************************************************/
961*495ae853SAndroid Build Coastguard Worker
962*495ae853SAndroid Build Coastguard Worker /**************************************************************/
963*495ae853SAndroid Build Coastguard Worker /* Copy the remaining coefficients */
964*495ae853SAndroid Build Coastguard Worker /**************************************************************/
965*495ae853SAndroid Build Coastguard Worker while(k >= 0)
966*495ae853SAndroid Build Coastguard Worker {
967*495ae853SAndroid Build Coastguard Worker SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
968*495ae853SAndroid Build Coastguard Worker *pi2_coeff_data++ = i2_level_arr[k--];
969*495ae853SAndroid Build Coastguard Worker u4_scan_pos--;
970*495ae853SAndroid Build Coastguard Worker }
971*495ae853SAndroid Build Coastguard Worker }
972*495ae853SAndroid Build Coastguard Worker
973*495ae853SAndroid Build Coastguard Worker {
974*495ae853SAndroid Build Coastguard Worker WORD32 offset;
975*495ae853SAndroid Build Coastguard Worker offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4;
976*495ae853SAndroid Build Coastguard Worker offset = ALIGN4(offset);
977*495ae853SAndroid Build Coastguard Worker ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset);
978*495ae853SAndroid Build Coastguard Worker }
979*495ae853SAndroid Build Coastguard Worker
980*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_ofst = u4_bitstream_offset;
981*495ae853SAndroid Build Coastguard Worker return 0;
982*495ae853SAndroid Build Coastguard Worker }
983*495ae853SAndroid Build Coastguard Worker
984*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
985*495ae853SAndroid Build Coastguard Worker /* */
986*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_rest_of_residual_cav_chroma_dc_block */
987*495ae853SAndroid Build Coastguard Worker /* */
988*495ae853SAndroid Build Coastguard Worker /* Description : This function does the Cavlc parsing of the bitstream */
989*495ae853SAndroid Build Coastguard Worker /* for chroma dc coefficients */
990*495ae853SAndroid Build Coastguard Worker /* Inputs : <What inputs does the function take?> */
991*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
992*495ae853SAndroid Build Coastguard Worker /* Processing : <Describe how the function operates - include algorithm */
993*495ae853SAndroid Build Coastguard Worker /* description> */
994*495ae853SAndroid Build Coastguard Worker /* Outputs : <What does the function produce?> */
995*495ae853SAndroid Build Coastguard Worker /* Returns : <What does the function return?> */
996*495ae853SAndroid Build Coastguard Worker /* */
997*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
998*495ae853SAndroid Build Coastguard Worker /* */
999*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1000*495ae853SAndroid Build Coastguard Worker /* */
1001*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1002*495ae853SAndroid Build Coastguard Worker /* 15 09 2008 Jay Draft */
1003*495ae853SAndroid Build Coastguard Worker /* */
1004*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_rest_of_residual_cav_chroma_dc_block(UWORD32 u4_total_coeff_trail_one,dec_bit_stream_t * ps_bitstrm)1005*495ae853SAndroid Build Coastguard Worker void ih264d_rest_of_residual_cav_chroma_dc_block(UWORD32 u4_total_coeff_trail_one,
1006*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t *ps_bitstrm)
1007*495ae853SAndroid Build Coastguard Worker {
1008*495ae853SAndroid Build Coastguard Worker UWORD32 u4_total_zeroes;
1009*495ae853SAndroid Build Coastguard Worker WORD16 i;
1010*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1011*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
1012*495ae853SAndroid Build Coastguard Worker UWORD32 u4_trailing_ones = u4_total_coeff_trail_one & 0xFFFF;
1013*495ae853SAndroid Build Coastguard Worker UWORD32 u4_total_coeff = u4_total_coeff_trail_one >> 16;
1014*495ae853SAndroid Build Coastguard Worker // To avoid error check at 4x4 level, allocating for 3 extra levels(4+3)
1015*495ae853SAndroid Build Coastguard Worker // since u4_trailing_ones can at the max be 3. This will be required when
1016*495ae853SAndroid Build Coastguard Worker // u4_total_coeff is less than u4_trailing_ones
1017*495ae853SAndroid Build Coastguard Worker WORD16 ai2_level_arr[7];//
1018*495ae853SAndroid Build Coastguard Worker WORD16 *i2_level_arr = &ai2_level_arr[3];
1019*495ae853SAndroid Build Coastguard Worker
1020*495ae853SAndroid Build Coastguard Worker tu_sblk4x4_coeff_data_t *ps_tu_4x4;
1021*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_coeff_data;
1022*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;
1023*495ae853SAndroid Build Coastguard Worker
1024*495ae853SAndroid Build Coastguard Worker ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
1025*495ae853SAndroid Build Coastguard Worker ps_tu_4x4->u2_sig_coeff_map = 0;
1026*495ae853SAndroid Build Coastguard Worker pi2_coeff_data = &ps_tu_4x4->ai2_level[0];
1027*495ae853SAndroid Build Coastguard Worker
1028*495ae853SAndroid Build Coastguard Worker i = u4_total_coeff - 1;
1029*495ae853SAndroid Build Coastguard Worker if(u4_trailing_ones)
1030*495ae853SAndroid Build Coastguard Worker {
1031*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
1032*495ae853SAndroid Build Coastguard Worker /* Decode Trailing Ones */
1033*495ae853SAndroid Build Coastguard Worker /* read the sign of T1's and put them in level array */
1034*495ae853SAndroid Build Coastguard Worker /*********************************************************************/
1035*495ae853SAndroid Build Coastguard Worker UWORD32 u4_signs, u4_cnt = u4_trailing_ones;
1036*495ae853SAndroid Build Coastguard Worker WORD16 (*ppi2_trlone_lkup)[3] =
1037*495ae853SAndroid Build Coastguard Worker (WORD16 (*)[3])gai2_ih264d_trailing_one_level;
1038*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_trlone_lkup;
1039*495ae853SAndroid Build Coastguard Worker
1040*495ae853SAndroid Build Coastguard Worker GETBITS(u4_signs, u4_bitstream_offset, pu4_bitstrm_buf, u4_cnt);
1041*495ae853SAndroid Build Coastguard Worker
1042*495ae853SAndroid Build Coastguard Worker pi2_trlone_lkup = ppi2_trlone_lkup[(1 << u4_cnt) - 2 + u4_signs];
1043*495ae853SAndroid Build Coastguard Worker
1044*495ae853SAndroid Build Coastguard Worker while(u4_cnt)
1045*495ae853SAndroid Build Coastguard Worker {
1046*495ae853SAndroid Build Coastguard Worker i2_level_arr[i--] = *pi2_trlone_lkup++;
1047*495ae853SAndroid Build Coastguard Worker u4_cnt--;
1048*495ae853SAndroid Build Coastguard Worker }
1049*495ae853SAndroid Build Coastguard Worker }
1050*495ae853SAndroid Build Coastguard Worker
1051*495ae853SAndroid Build Coastguard Worker /****************************************************************/
1052*495ae853SAndroid Build Coastguard Worker /* Decoding Levels Begins */
1053*495ae853SAndroid Build Coastguard Worker /****************************************************************/
1054*495ae853SAndroid Build Coastguard Worker if(i >= 0)
1055*495ae853SAndroid Build Coastguard Worker {
1056*495ae853SAndroid Build Coastguard Worker /****************************************************************/
1057*495ae853SAndroid Build Coastguard Worker /* First level is decoded outside the loop as it has lot of */
1058*495ae853SAndroid Build Coastguard Worker /* special cases. */
1059*495ae853SAndroid Build Coastguard Worker /****************************************************************/
1060*495ae853SAndroid Build Coastguard Worker UWORD32 u4_lev_suffix, u4_suffix_len, u4_lev_suffix_size;
1061*495ae853SAndroid Build Coastguard Worker UWORD16 u2_lev_code, u2_abs_value;
1062*495ae853SAndroid Build Coastguard Worker UWORD32 u4_lev_prefix;
1063*495ae853SAndroid Build Coastguard Worker
1064*495ae853SAndroid Build Coastguard Worker /***************************************************************/
1065*495ae853SAndroid Build Coastguard Worker /* u4_suffix_len = 0, Find leading zeros in next 32 bits */
1066*495ae853SAndroid Build Coastguard Worker /***************************************************************/
1067*495ae853SAndroid Build Coastguard Worker FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
1068*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
1069*495ae853SAndroid Build Coastguard Worker
1070*495ae853SAndroid Build Coastguard Worker /*********************************************************/
1071*495ae853SAndroid Build Coastguard Worker /* Special decoding case when trailing ones are 3 */
1072*495ae853SAndroid Build Coastguard Worker /*********************************************************/
1073*495ae853SAndroid Build Coastguard Worker u2_lev_code = MIN(15, u4_lev_prefix);
1074*495ae853SAndroid Build Coastguard Worker
1075*495ae853SAndroid Build Coastguard Worker u2_lev_code += (3 == u4_trailing_ones) ? 0 : (2);
1076*495ae853SAndroid Build Coastguard Worker
1077*495ae853SAndroid Build Coastguard Worker if(14 == u4_lev_prefix)
1078*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size = 4;
1079*495ae853SAndroid Build Coastguard Worker else if(15 <= u4_lev_prefix)
1080*495ae853SAndroid Build Coastguard Worker {
1081*495ae853SAndroid Build Coastguard Worker u2_lev_code += 15;
1082*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size = u4_lev_prefix - 3;
1083*495ae853SAndroid Build Coastguard Worker }
1084*495ae853SAndroid Build Coastguard Worker else
1085*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size = 0;
1086*495ae853SAndroid Build Coastguard Worker
1087*495ae853SAndroid Build Coastguard Worker //HP_LEVEL_PREFIX
1088*495ae853SAndroid Build Coastguard Worker if(16 <= u4_lev_prefix)
1089*495ae853SAndroid Build Coastguard Worker {
1090*495ae853SAndroid Build Coastguard Worker u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
1091*495ae853SAndroid Build Coastguard Worker }
1092*495ae853SAndroid Build Coastguard Worker if(u4_lev_suffix_size)
1093*495ae853SAndroid Build Coastguard Worker {
1094*495ae853SAndroid Build Coastguard Worker GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
1095*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size);
1096*495ae853SAndroid Build Coastguard Worker u2_lev_code += u4_lev_suffix;
1097*495ae853SAndroid Build Coastguard Worker }
1098*495ae853SAndroid Build Coastguard Worker
1099*495ae853SAndroid Build Coastguard Worker u2_abs_value = (u2_lev_code + 2) >> 1;
1100*495ae853SAndroid Build Coastguard Worker /*********************************************************/
1101*495ae853SAndroid Build Coastguard Worker /* If Level code is odd, level is negative else positive */
1102*495ae853SAndroid Build Coastguard Worker /*********************************************************/
1103*495ae853SAndroid Build Coastguard Worker i2_level_arr[i--] = (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;
1104*495ae853SAndroid Build Coastguard Worker
1105*495ae853SAndroid Build Coastguard Worker u4_suffix_len = (u2_abs_value > 3) ? 2 : 1;
1106*495ae853SAndroid Build Coastguard Worker
1107*495ae853SAndroid Build Coastguard Worker /*********************************************************/
1108*495ae853SAndroid Build Coastguard Worker /* Now loop over the remaining levels */
1109*495ae853SAndroid Build Coastguard Worker /*********************************************************/
1110*495ae853SAndroid Build Coastguard Worker while(i >= 0)
1111*495ae853SAndroid Build Coastguard Worker {
1112*495ae853SAndroid Build Coastguard Worker
1113*495ae853SAndroid Build Coastguard Worker /***************************************************************/
1114*495ae853SAndroid Build Coastguard Worker /* Find leading zeros in next 32 bits */
1115*495ae853SAndroid Build Coastguard Worker /***************************************************************/
1116*495ae853SAndroid Build Coastguard Worker FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
1117*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf);
1118*495ae853SAndroid Build Coastguard Worker
1119*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size =
1120*495ae853SAndroid Build Coastguard Worker (15 <= u4_lev_prefix) ?
1121*495ae853SAndroid Build Coastguard Worker (u4_lev_prefix - 3) : u4_suffix_len;
1122*495ae853SAndroid Build Coastguard Worker
1123*495ae853SAndroid Build Coastguard Worker /*********************************************************/
1124*495ae853SAndroid Build Coastguard Worker /* Compute level code using prefix and suffix */
1125*495ae853SAndroid Build Coastguard Worker /*********************************************************/
1126*495ae853SAndroid Build Coastguard Worker GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
1127*495ae853SAndroid Build Coastguard Worker u4_lev_suffix_size);
1128*495ae853SAndroid Build Coastguard Worker u2_lev_code = (MIN(u4_lev_prefix,15) << u4_suffix_len)
1129*495ae853SAndroid Build Coastguard Worker + u4_lev_suffix;
1130*495ae853SAndroid Build Coastguard Worker
1131*495ae853SAndroid Build Coastguard Worker //HP_LEVEL_PREFIX
1132*495ae853SAndroid Build Coastguard Worker if(16 <= u4_lev_prefix)
1133*495ae853SAndroid Build Coastguard Worker {
1134*495ae853SAndroid Build Coastguard Worker u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
1135*495ae853SAndroid Build Coastguard Worker }
1136*495ae853SAndroid Build Coastguard Worker u2_abs_value = (u2_lev_code + 2) >> 1;
1137*495ae853SAndroid Build Coastguard Worker
1138*495ae853SAndroid Build Coastguard Worker /*********************************************************/
1139*495ae853SAndroid Build Coastguard Worker /* If Level code is odd, level is negative else positive */
1140*495ae853SAndroid Build Coastguard Worker /*********************************************************/
1141*495ae853SAndroid Build Coastguard Worker i2_level_arr[i--] =
1142*495ae853SAndroid Build Coastguard Worker (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;
1143*495ae853SAndroid Build Coastguard Worker
1144*495ae853SAndroid Build Coastguard Worker /*********************************************************/
1145*495ae853SAndroid Build Coastguard Worker /* Increment suffix length if required */
1146*495ae853SAndroid Build Coastguard Worker /*********************************************************/
1147*495ae853SAndroid Build Coastguard Worker u4_suffix_len += (u2_abs_value > (3 << (u4_suffix_len - 1)));
1148*495ae853SAndroid Build Coastguard Worker }
1149*495ae853SAndroid Build Coastguard Worker
1150*495ae853SAndroid Build Coastguard Worker /****************************************************************/
1151*495ae853SAndroid Build Coastguard Worker /* Decoding Levels Ends */
1152*495ae853SAndroid Build Coastguard Worker /****************************************************************/
1153*495ae853SAndroid Build Coastguard Worker }
1154*495ae853SAndroid Build Coastguard Worker
1155*495ae853SAndroid Build Coastguard Worker if(u4_total_coeff < 4)
1156*495ae853SAndroid Build Coastguard Worker {
1157*495ae853SAndroid Build Coastguard Worker UWORD32 u4_max_ldz = (4 - u4_total_coeff);
1158*495ae853SAndroid Build Coastguard Worker FIND_ONE_IN_STREAM_LEN(u4_total_zeroes, u4_bitstream_offset,
1159*495ae853SAndroid Build Coastguard Worker pu4_bitstrm_buf, u4_max_ldz);
1160*495ae853SAndroid Build Coastguard Worker }
1161*495ae853SAndroid Build Coastguard Worker else
1162*495ae853SAndroid Build Coastguard Worker u4_total_zeroes = 0;
1163*495ae853SAndroid Build Coastguard Worker
1164*495ae853SAndroid Build Coastguard Worker /**************************************************************/
1165*495ae853SAndroid Build Coastguard Worker /* Decode the runs and form the coefficient buffer */
1166*495ae853SAndroid Build Coastguard Worker /**************************************************************/
1167*495ae853SAndroid Build Coastguard Worker {
1168*495ae853SAndroid Build Coastguard Worker const UWORD8 *pu1_table_runbefore;
1169*495ae853SAndroid Build Coastguard Worker UWORD32 u4_run;
1170*495ae853SAndroid Build Coastguard Worker WORD32 u4_scan_pos = (u4_total_coeff + u4_total_zeroes - 1);
1171*495ae853SAndroid Build Coastguard Worker UWORD32 u4_zeroes_left = u4_total_zeroes;
1172*495ae853SAndroid Build Coastguard Worker i = u4_total_coeff - 1;
1173*495ae853SAndroid Build Coastguard Worker
1174*495ae853SAndroid Build Coastguard Worker /**************************************************************/
1175*495ae853SAndroid Build Coastguard Worker /* Decoding Runs for 0 < zeros left <=6 */
1176*495ae853SAndroid Build Coastguard Worker /**************************************************************/
1177*495ae853SAndroid Build Coastguard Worker pu1_table_runbefore = (UWORD8 *)gau1_ih264d_table_run_before;
1178*495ae853SAndroid Build Coastguard Worker while(u4_zeroes_left && i)
1179*495ae853SAndroid Build Coastguard Worker {
1180*495ae853SAndroid Build Coastguard Worker UWORD32 u4_code;
1181*495ae853SAndroid Build Coastguard Worker NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 3);
1182*495ae853SAndroid Build Coastguard Worker
1183*495ae853SAndroid Build Coastguard Worker u4_code = pu1_table_runbefore[u4_code + (u4_zeroes_left << 3)];
1184*495ae853SAndroid Build Coastguard Worker u4_run = u4_code >> 2;
1185*495ae853SAndroid Build Coastguard Worker
1186*495ae853SAndroid Build Coastguard Worker FLUSHBITS(u4_bitstream_offset, (u4_code & 0x03));
1187*495ae853SAndroid Build Coastguard Worker SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
1188*495ae853SAndroid Build Coastguard Worker *pi2_coeff_data++ = i2_level_arr[i--];
1189*495ae853SAndroid Build Coastguard Worker u4_zeroes_left -= (WORD32)u4_run;
1190*495ae853SAndroid Build Coastguard Worker u4_scan_pos -= (WORD32)(u4_run + 1);
1191*495ae853SAndroid Build Coastguard Worker }
1192*495ae853SAndroid Build Coastguard Worker /**************************************************************/
1193*495ae853SAndroid Build Coastguard Worker /* Decoding Runs End */
1194*495ae853SAndroid Build Coastguard Worker /**************************************************************/
1195*495ae853SAndroid Build Coastguard Worker
1196*495ae853SAndroid Build Coastguard Worker /**************************************************************/
1197*495ae853SAndroid Build Coastguard Worker /* Copy the remaining coefficients */
1198*495ae853SAndroid Build Coastguard Worker /**************************************************************/
1199*495ae853SAndroid Build Coastguard Worker while(i >= 0)
1200*495ae853SAndroid Build Coastguard Worker {
1201*495ae853SAndroid Build Coastguard Worker SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
1202*495ae853SAndroid Build Coastguard Worker *pi2_coeff_data++ = i2_level_arr[i--];
1203*495ae853SAndroid Build Coastguard Worker u4_scan_pos--;
1204*495ae853SAndroid Build Coastguard Worker }
1205*495ae853SAndroid Build Coastguard Worker }
1206*495ae853SAndroid Build Coastguard Worker
1207*495ae853SAndroid Build Coastguard Worker {
1208*495ae853SAndroid Build Coastguard Worker WORD32 offset;
1209*495ae853SAndroid Build Coastguard Worker offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4;
1210*495ae853SAndroid Build Coastguard Worker offset = ALIGN4(offset);
1211*495ae853SAndroid Build Coastguard Worker ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset);
1212*495ae853SAndroid Build Coastguard Worker }
1213*495ae853SAndroid Build Coastguard Worker
1214*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_ofst = u4_bitstream_offset;
1215*495ae853SAndroid Build Coastguard Worker }
1216*495ae853SAndroid Build Coastguard Worker
1217*495ae853SAndroid Build Coastguard Worker /*!
1218*495ae853SAndroid Build Coastguard Worker **************************************************************************
1219*495ae853SAndroid Build Coastguard Worker * \if Function name : CavlcParsingInvScanInvQuant \endif
1220*495ae853SAndroid Build Coastguard Worker *
1221*495ae853SAndroid Build Coastguard Worker * \brief
1222*495ae853SAndroid Build Coastguard Worker * This function do cavlc parsing of coefficient tokens for any block
1223*495ae853SAndroid Build Coastguard Worker * type except chromDc and depending
1224*495ae853SAndroid Build Coastguard Worker * on whenther any coefficients to be parsed calls module
1225*495ae853SAndroid Build Coastguard Worker * RestOfResidualBlockCavlc.
1226*495ae853SAndroid Build Coastguard Worker *
1227*495ae853SAndroid Build Coastguard Worker * \return
1228*495ae853SAndroid Build Coastguard Worker * Returns total number of non-zero coefficients.
1229*495ae853SAndroid Build Coastguard Worker *
1230*495ae853SAndroid Build Coastguard Worker **************************************************************************
1231*495ae853SAndroid Build Coastguard Worker */
1232*495ae853SAndroid Build Coastguard Worker
ih264d_cavlc_parse4x4coeff_n0to7(WORD16 * pi2_coeff_block,UWORD32 u4_isdc,WORD32 u4_n,dec_struct_t * ps_dec,UWORD32 * pu4_total_coeff)1233*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_cavlc_parse4x4coeff_n0to7(WORD16 *pi2_coeff_block,
1234*495ae853SAndroid Build Coastguard Worker UWORD32 u4_isdc, /* is it a DC block */
1235*495ae853SAndroid Build Coastguard Worker WORD32 u4_n,
1236*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec,
1237*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_total_coeff)
1238*495ae853SAndroid Build Coastguard Worker {
1239*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
1240*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1241*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
1242*495ae853SAndroid Build Coastguard Worker UWORD32 u4_code, u4_index, u4_ldz;
1243*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_code = (const UWORD16*)gau2_ih264d_code_gx;
1244*495ae853SAndroid Build Coastguard Worker const UWORD16 *pu2_offset_num_vlc =
1245*495ae853SAndroid Build Coastguard Worker (const UWORD16 *)gau2_ih264d_offset_num_vlc_tab;
1246*495ae853SAndroid Build Coastguard Worker UWORD32 u4_offset_num_vlc = pu2_offset_num_vlc[u4_n];
1247*495ae853SAndroid Build Coastguard Worker
1248*495ae853SAndroid Build Coastguard Worker
1249*495ae853SAndroid Build Coastguard Worker UNUSED(pi2_coeff_block);
1250*495ae853SAndroid Build Coastguard Worker *pu4_total_coeff = 0;
1251*495ae853SAndroid Build Coastguard Worker FIND_ONE_IN_STREAM_32(u4_ldz, u4_bitstream_offset, pu4_bitstrm_buf);
1252*495ae853SAndroid Build Coastguard Worker NEXTBITS(u4_index, u4_bitstream_offset, pu4_bitstrm_buf, 3);
1253*495ae853SAndroid Build Coastguard Worker u4_index += (u4_ldz << 3);
1254*495ae853SAndroid Build Coastguard Worker u4_index += u4_offset_num_vlc;
1255*495ae853SAndroid Build Coastguard Worker
1256*495ae853SAndroid Build Coastguard Worker u4_index = MIN(u4_index, 303);
1257*495ae853SAndroid Build Coastguard Worker u4_code = pu2_code[u4_index];
1258*495ae853SAndroid Build Coastguard Worker
1259*495ae853SAndroid Build Coastguard Worker FLUSHBITS(u4_bitstream_offset, (u4_code & 0x03));
1260*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_ofst = u4_bitstream_offset;
1261*495ae853SAndroid Build Coastguard Worker *pu4_total_coeff = (u4_code >> 4);
1262*495ae853SAndroid Build Coastguard Worker
1263*495ae853SAndroid Build Coastguard Worker if(*pu4_total_coeff)
1264*495ae853SAndroid Build Coastguard Worker {
1265*495ae853SAndroid Build Coastguard Worker UWORD32 u4_trailing_ones, u4_offset, u4_total_coeff_tone;
1266*495ae853SAndroid Build Coastguard Worker const UWORD8 *pu1_offset =
1267*495ae853SAndroid Build Coastguard Worker (UWORD8 *)gau1_ih264d_total_coeff_fn_ptr_offset;
1268*495ae853SAndroid Build Coastguard Worker WORD32 ret;
1269*495ae853SAndroid Build Coastguard Worker u4_trailing_ones = ((u4_code >> 2) & 0x03);
1270*495ae853SAndroid Build Coastguard Worker u4_offset = pu1_offset[*pu4_total_coeff - 1];
1271*495ae853SAndroid Build Coastguard Worker u4_total_coeff_tone = (*pu4_total_coeff << 16) | u4_trailing_ones;
1272*495ae853SAndroid Build Coastguard Worker
1273*495ae853SAndroid Build Coastguard Worker ret = ps_dec->pf_cavlc_4x4res_block[u4_offset](u4_isdc,
1274*495ae853SAndroid Build Coastguard Worker u4_total_coeff_tone,
1275*495ae853SAndroid Build Coastguard Worker ps_bitstrm);
1276*495ae853SAndroid Build Coastguard Worker if(ret != 0)
1277*495ae853SAndroid Build Coastguard Worker return ERROR_CAVLC_NUM_COEFF_T;
1278*495ae853SAndroid Build Coastguard Worker }
1279*495ae853SAndroid Build Coastguard Worker
1280*495ae853SAndroid Build Coastguard Worker return OK;
1281*495ae853SAndroid Build Coastguard Worker }
1282*495ae853SAndroid Build Coastguard Worker
ih264d_cavlc_parse4x4coeff_n8(WORD16 * pi2_coeff_block,UWORD32 u4_isdc,WORD32 u4_n,dec_struct_t * ps_dec,UWORD32 * pu4_total_coeff)1283*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_cavlc_parse4x4coeff_n8(WORD16 *pi2_coeff_block,
1284*495ae853SAndroid Build Coastguard Worker UWORD32 u4_isdc, /* is it a DC block */
1285*495ae853SAndroid Build Coastguard Worker WORD32 u4_n,
1286*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec,
1287*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_total_coeff)
1288*495ae853SAndroid Build Coastguard Worker {
1289*495ae853SAndroid Build Coastguard Worker
1290*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
1291*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1292*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
1293*495ae853SAndroid Build Coastguard Worker UWORD32 u4_code;
1294*495ae853SAndroid Build Coastguard Worker UNUSED(u4_n);
1295*495ae853SAndroid Build Coastguard Worker UNUSED(pi2_coeff_block);
1296*495ae853SAndroid Build Coastguard Worker GETBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 6);
1297*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_ofst = u4_bitstream_offset;
1298*495ae853SAndroid Build Coastguard Worker *pu4_total_coeff = 0;
1299*495ae853SAndroid Build Coastguard Worker
1300*495ae853SAndroid Build Coastguard Worker if(u4_code != 3)
1301*495ae853SAndroid Build Coastguard Worker {
1302*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_offset = (UWORD8 *)gau1_ih264d_total_coeff_fn_ptr_offset;
1303*495ae853SAndroid Build Coastguard Worker UWORD32 u4_trailing_ones, u4_offset, u4_total_coeff_tone;
1304*495ae853SAndroid Build Coastguard Worker
1305*495ae853SAndroid Build Coastguard Worker *pu4_total_coeff = (u4_code >> 2) + 1;
1306*495ae853SAndroid Build Coastguard Worker u4_trailing_ones = u4_code & 0x03;
1307*495ae853SAndroid Build Coastguard Worker u4_offset = pu1_offset[*pu4_total_coeff - 1];
1308*495ae853SAndroid Build Coastguard Worker u4_total_coeff_tone = (*pu4_total_coeff << 16) | u4_trailing_ones;
1309*495ae853SAndroid Build Coastguard Worker
1310*495ae853SAndroid Build Coastguard Worker ps_dec->pf_cavlc_4x4res_block[u4_offset](u4_isdc,
1311*495ae853SAndroid Build Coastguard Worker u4_total_coeff_tone,
1312*495ae853SAndroid Build Coastguard Worker ps_bitstrm);
1313*495ae853SAndroid Build Coastguard Worker }
1314*495ae853SAndroid Build Coastguard Worker
1315*495ae853SAndroid Build Coastguard Worker return OK;
1316*495ae853SAndroid Build Coastguard Worker }
1317*495ae853SAndroid Build Coastguard Worker
1318*495ae853SAndroid Build Coastguard Worker /*!
1319*495ae853SAndroid Build Coastguard Worker **************************************************************************
1320*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_cavlc_parse_chroma_dc \endif
1321*495ae853SAndroid Build Coastguard Worker *
1322*495ae853SAndroid Build Coastguard Worker * \brief
1323*495ae853SAndroid Build Coastguard Worker * This function do cavlc parsing of coefficient tokens chromDc block
1324*495ae853SAndroid Build Coastguard Worker * and depending on whenther any coefficients to be parsed calls module
1325*495ae853SAndroid Build Coastguard Worker * ih264d_rest_of_residual_cav_chroma_dc_block.
1326*495ae853SAndroid Build Coastguard Worker *
1327*495ae853SAndroid Build Coastguard Worker * \return
1328*495ae853SAndroid Build Coastguard Worker * Returns total number of non-zero coefficients.
1329*495ae853SAndroid Build Coastguard Worker *
1330*495ae853SAndroid Build Coastguard Worker **************************************************************************
1331*495ae853SAndroid Build Coastguard Worker */
1332*495ae853SAndroid Build Coastguard Worker
ih264d_cavlc_parse_chroma_dc(dec_mb_info_t * ps_cur_mb_info,WORD16 * pi2_coeff_block,dec_bit_stream_t * ps_bitstrm,UWORD32 u4_scale_u,UWORD32 u4_scale_v,WORD32 i4_mb_inter_inc)1333*495ae853SAndroid Build Coastguard Worker void ih264d_cavlc_parse_chroma_dc(dec_mb_info_t *ps_cur_mb_info,
1334*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_coeff_block,
1335*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t *ps_bitstrm,
1336*495ae853SAndroid Build Coastguard Worker UWORD32 u4_scale_u,
1337*495ae853SAndroid Build Coastguard Worker UWORD32 u4_scale_v,
1338*495ae853SAndroid Build Coastguard Worker WORD32 i4_mb_inter_inc)
1339*495ae853SAndroid Build Coastguard Worker {
1340*495ae853SAndroid Build Coastguard Worker UWORD32 u4_total_coeff, u4_trailing_ones, u4_total_coeff_tone, u4_code;
1341*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1342*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
1343*495ae853SAndroid Build Coastguard Worker const UWORD8 *pu1_cav_chromdc = (const UWORD8*)gau1_ih264d_cav_chromdc_vld;
1344*495ae853SAndroid Build Coastguard Worker UNUSED(i4_mb_inter_inc);
1345*495ae853SAndroid Build Coastguard Worker /******************************************************************/
1346*495ae853SAndroid Build Coastguard Worker /* Chroma DC Block for U component */
1347*495ae853SAndroid Build Coastguard Worker /******************************************************************/
1348*495ae853SAndroid Build Coastguard Worker NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 8);
1349*495ae853SAndroid Build Coastguard Worker
1350*495ae853SAndroid Build Coastguard Worker u4_code = pu1_cav_chromdc[u4_code];
1351*495ae853SAndroid Build Coastguard Worker
1352*495ae853SAndroid Build Coastguard Worker FLUSHBITS(u4_bitstream_offset, ((u4_code & 0x7) + 1));
1353*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_ofst = u4_bitstream_offset;
1354*495ae853SAndroid Build Coastguard Worker
1355*495ae853SAndroid Build Coastguard Worker u4_total_coeff = (u4_code >> 5);
1356*495ae853SAndroid Build Coastguard Worker
1357*495ae853SAndroid Build Coastguard Worker if(u4_total_coeff)
1358*495ae853SAndroid Build Coastguard Worker {
1359*495ae853SAndroid Build Coastguard Worker WORD32 i_z0, i_z1, i_z2, i_z3;
1360*495ae853SAndroid Build Coastguard Worker tu_sblk4x4_coeff_data_t *ps_tu_4x4;
1361*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;
1362*495ae853SAndroid Build Coastguard Worker WORD16 ai2_dc_coef[4];
1363*495ae853SAndroid Build Coastguard Worker UWORD8 pu1_inv_scan[4] =
1364*495ae853SAndroid Build Coastguard Worker { 0, 1, 2, 3 };
1365*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_coeff_data =
1366*495ae853SAndroid Build Coastguard Worker (WORD16 *)ps_dec->pv_parse_tu_coeff_data;
1367*495ae853SAndroid Build Coastguard Worker
1368*495ae853SAndroid Build Coastguard Worker ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
1369*495ae853SAndroid Build Coastguard Worker
1370*495ae853SAndroid Build Coastguard Worker u4_trailing_ones = ((u4_code >> 3) & 0x3);
1371*495ae853SAndroid Build Coastguard Worker u4_total_coeff_tone = (u4_total_coeff << 16) | u4_trailing_ones;
1372*495ae853SAndroid Build Coastguard Worker ih264d_rest_of_residual_cav_chroma_dc_block(u4_total_coeff_tone,
1373*495ae853SAndroid Build Coastguard Worker ps_bitstrm);
1374*495ae853SAndroid Build Coastguard Worker
1375*495ae853SAndroid Build Coastguard Worker ai2_dc_coef[0] = 0;
1376*495ae853SAndroid Build Coastguard Worker ai2_dc_coef[1] = 0;
1377*495ae853SAndroid Build Coastguard Worker ai2_dc_coef[2] = 0;
1378*495ae853SAndroid Build Coastguard Worker ai2_dc_coef[3] = 0;
1379*495ae853SAndroid Build Coastguard Worker
1380*495ae853SAndroid Build Coastguard Worker ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4,
1381*495ae853SAndroid Build Coastguard Worker ai2_dc_coef,
1382*495ae853SAndroid Build Coastguard Worker pu1_inv_scan);
1383*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
1384*495ae853SAndroid Build Coastguard Worker /* Inverse 2x2 transform and scaling of chroma DC */
1385*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
1386*495ae853SAndroid Build Coastguard Worker i_z0 = (ai2_dc_coef[0] + ai2_dc_coef[2]);
1387*495ae853SAndroid Build Coastguard Worker i_z1 = (ai2_dc_coef[0] - ai2_dc_coef[2]);
1388*495ae853SAndroid Build Coastguard Worker i_z2 = (ai2_dc_coef[1] - ai2_dc_coef[3]);
1389*495ae853SAndroid Build Coastguard Worker i_z3 = (ai2_dc_coef[1] + ai2_dc_coef[3]);
1390*495ae853SAndroid Build Coastguard Worker
1391*495ae853SAndroid Build Coastguard Worker /*-----------------------------------------------------------*/
1392*495ae853SAndroid Build Coastguard Worker /* Scaling and storing the values back */
1393*495ae853SAndroid Build Coastguard Worker /*-----------------------------------------------------------*/
1394*495ae853SAndroid Build Coastguard Worker *pi2_coeff_data++ = (WORD16)(((i_z0 + i_z3) * (WORD32)u4_scale_u) >> 5);
1395*495ae853SAndroid Build Coastguard Worker *pi2_coeff_data++ = (WORD16)(((i_z0 - i_z3) * (WORD32)u4_scale_u) >> 5);
1396*495ae853SAndroid Build Coastguard Worker *pi2_coeff_data++ = (WORD16)(((i_z1 + i_z2) * (WORD32)u4_scale_u) >> 5);
1397*495ae853SAndroid Build Coastguard Worker *pi2_coeff_data++ = (WORD16)(((i_z1 - i_z2) * (WORD32)u4_scale_u) >> 5);
1398*495ae853SAndroid Build Coastguard Worker
1399*495ae853SAndroid Build Coastguard Worker ps_dec->pv_parse_tu_coeff_data = (void *)pi2_coeff_data;
1400*495ae853SAndroid Build Coastguard Worker
1401*495ae853SAndroid Build Coastguard Worker SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag,1);
1402*495ae853SAndroid Build Coastguard Worker }
1403*495ae853SAndroid Build Coastguard Worker
1404*495ae853SAndroid Build Coastguard Worker /******************************************************************/
1405*495ae853SAndroid Build Coastguard Worker /* Chroma DC Block for V component */
1406*495ae853SAndroid Build Coastguard Worker /******************************************************************/
1407*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += 64;
1408*495ae853SAndroid Build Coastguard Worker u4_bitstream_offset = ps_bitstrm->u4_ofst;
1409*495ae853SAndroid Build Coastguard Worker
1410*495ae853SAndroid Build Coastguard Worker NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 8);
1411*495ae853SAndroid Build Coastguard Worker
1412*495ae853SAndroid Build Coastguard Worker u4_code = pu1_cav_chromdc[u4_code];
1413*495ae853SAndroid Build Coastguard Worker
1414*495ae853SAndroid Build Coastguard Worker FLUSHBITS(u4_bitstream_offset, ((u4_code & 0x7) + 1));
1415*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_ofst = u4_bitstream_offset;
1416*495ae853SAndroid Build Coastguard Worker
1417*495ae853SAndroid Build Coastguard Worker u4_total_coeff = (u4_code >> 5);
1418*495ae853SAndroid Build Coastguard Worker
1419*495ae853SAndroid Build Coastguard Worker if(u4_total_coeff)
1420*495ae853SAndroid Build Coastguard Worker {
1421*495ae853SAndroid Build Coastguard Worker WORD32 i_z0, i_z1, i_z2, i_z3;
1422*495ae853SAndroid Build Coastguard Worker tu_sblk4x4_coeff_data_t *ps_tu_4x4;
1423*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;
1424*495ae853SAndroid Build Coastguard Worker WORD16 ai2_dc_coef[4];
1425*495ae853SAndroid Build Coastguard Worker UWORD8 pu1_inv_scan[4] =
1426*495ae853SAndroid Build Coastguard Worker { 0, 1, 2, 3 };
1427*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_coeff_data =
1428*495ae853SAndroid Build Coastguard Worker (WORD16 *)ps_dec->pv_parse_tu_coeff_data;
1429*495ae853SAndroid Build Coastguard Worker
1430*495ae853SAndroid Build Coastguard Worker ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
1431*495ae853SAndroid Build Coastguard Worker
1432*495ae853SAndroid Build Coastguard Worker u4_trailing_ones = ((u4_code >> 3) & 0x3);
1433*495ae853SAndroid Build Coastguard Worker u4_total_coeff_tone = (u4_total_coeff << 16) | u4_trailing_ones;
1434*495ae853SAndroid Build Coastguard Worker ih264d_rest_of_residual_cav_chroma_dc_block(u4_total_coeff_tone,
1435*495ae853SAndroid Build Coastguard Worker ps_bitstrm);
1436*495ae853SAndroid Build Coastguard Worker
1437*495ae853SAndroid Build Coastguard Worker ai2_dc_coef[0] = 0;
1438*495ae853SAndroid Build Coastguard Worker ai2_dc_coef[1] = 0;
1439*495ae853SAndroid Build Coastguard Worker ai2_dc_coef[2] = 0;
1440*495ae853SAndroid Build Coastguard Worker ai2_dc_coef[3] = 0;
1441*495ae853SAndroid Build Coastguard Worker
1442*495ae853SAndroid Build Coastguard Worker ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4,
1443*495ae853SAndroid Build Coastguard Worker ai2_dc_coef,
1444*495ae853SAndroid Build Coastguard Worker pu1_inv_scan);
1445*495ae853SAndroid Build Coastguard Worker
1446*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
1447*495ae853SAndroid Build Coastguard Worker /* Inverse 2x2 transform and scaling of chroma DC */
1448*495ae853SAndroid Build Coastguard Worker /*-------------------------------------------------------------------*/
1449*495ae853SAndroid Build Coastguard Worker i_z0 = (ai2_dc_coef[0] + ai2_dc_coef[2]);
1450*495ae853SAndroid Build Coastguard Worker i_z1 = (ai2_dc_coef[0] - ai2_dc_coef[2]);
1451*495ae853SAndroid Build Coastguard Worker i_z2 = (ai2_dc_coef[1] - ai2_dc_coef[3]);
1452*495ae853SAndroid Build Coastguard Worker i_z3 = (ai2_dc_coef[1] + ai2_dc_coef[3]);
1453*495ae853SAndroid Build Coastguard Worker
1454*495ae853SAndroid Build Coastguard Worker /*-----------------------------------------------------------*/
1455*495ae853SAndroid Build Coastguard Worker /* Scaling and storing the values back */
1456*495ae853SAndroid Build Coastguard Worker /*-----------------------------------------------------------*/
1457*495ae853SAndroid Build Coastguard Worker *pi2_coeff_data++ = (WORD16)(((i_z0 + i_z3) * (WORD32)u4_scale_v) >> 5);
1458*495ae853SAndroid Build Coastguard Worker *pi2_coeff_data++ = (WORD16)(((i_z0 - i_z3) * (WORD32)u4_scale_v) >> 5);
1459*495ae853SAndroid Build Coastguard Worker *pi2_coeff_data++ = (WORD16)(((i_z1 + i_z2) * (WORD32)u4_scale_v) >> 5);
1460*495ae853SAndroid Build Coastguard Worker *pi2_coeff_data++ = (WORD16)(((i_z1 - i_z2) * (WORD32)u4_scale_v) >> 5);
1461*495ae853SAndroid Build Coastguard Worker
1462*495ae853SAndroid Build Coastguard Worker ps_dec->pv_parse_tu_coeff_data = (void *)pi2_coeff_data;
1463*495ae853SAndroid Build Coastguard Worker
1464*495ae853SAndroid Build Coastguard Worker SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag,2);
1465*495ae853SAndroid Build Coastguard Worker }
1466*495ae853SAndroid Build Coastguard Worker }
1467*495ae853SAndroid Build Coastguard Worker
1468*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1469*495ae853SAndroid Build Coastguard Worker /* */
1470*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_parse_pmb_ref_index_cavlc_range1 */
1471*495ae853SAndroid Build Coastguard Worker /* */
1472*495ae853SAndroid Build Coastguard Worker /* Description : This function does the Cavlc TEV range =1 parsing of */
1473*495ae853SAndroid Build Coastguard Worker /* reference index for a P MB. Range is 1 when */
1474*495ae853SAndroid Build Coastguard Worker /* num_ref_idx_active_minus1 is 0 */
1475*495ae853SAndroid Build Coastguard Worker /* */
1476*495ae853SAndroid Build Coastguard Worker /* Inputs : <What inputs does the function take?> */
1477*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
1478*495ae853SAndroid Build Coastguard Worker /* Processing : <Describe how the function operates - include algorithm */
1479*495ae853SAndroid Build Coastguard Worker /* description> */
1480*495ae853SAndroid Build Coastguard Worker /* Outputs : <What does the function produce?> */
1481*495ae853SAndroid Build Coastguard Worker /* Returns : <What does the function return?> */
1482*495ae853SAndroid Build Coastguard Worker /* */
1483*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
1484*495ae853SAndroid Build Coastguard Worker /* */
1485*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1486*495ae853SAndroid Build Coastguard Worker /* */
1487*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1488*495ae853SAndroid Build Coastguard Worker /* 19 09 2008 Jay Draft */
1489*495ae853SAndroid Build Coastguard Worker /* */
1490*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_parse_pmb_ref_index_cavlc_range1(UWORD32 u4_num_part,dec_bit_stream_t * ps_bitstrm,WORD8 * pi1_ref_idx,UWORD32 u4_num_ref_idx_active_minus1)1491*495ae853SAndroid Build Coastguard Worker void ih264d_parse_pmb_ref_index_cavlc_range1(UWORD32 u4_num_part, /* Number of partitions in MB */
1492*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */
1493*495ae853SAndroid Build Coastguard Worker WORD8 *pi1_ref_idx, /* pointer to reference index array */
1494*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_ref_idx_active_minus1 /* Not used for range 1 */
1495*495ae853SAndroid Build Coastguard Worker )
1496*495ae853SAndroid Build Coastguard Worker {
1497*495ae853SAndroid Build Coastguard Worker UWORD32 u4_i;
1498*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1499*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst;
1500*495ae853SAndroid Build Coastguard Worker UNUSED(u4_num_ref_idx_active_minus1);
1501*495ae853SAndroid Build Coastguard Worker for(u4_i = 0; u4_i < u4_num_part; u4_i++)
1502*495ae853SAndroid Build Coastguard Worker {
1503*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ref_idx;
1504*495ae853SAndroid Build Coastguard Worker u4_ref_idx = ih264d_tev_range1(pu4_bitstream_off, pu4_bitstrm_buf);
1505*495ae853SAndroid Build Coastguard Worker
1506*495ae853SAndroid Build Coastguard Worker /* Storing Reference Idx Information */
1507*495ae853SAndroid Build Coastguard Worker pi1_ref_idx[u4_i] = (WORD8)u4_ref_idx;
1508*495ae853SAndroid Build Coastguard Worker }
1509*495ae853SAndroid Build Coastguard Worker }
1510*495ae853SAndroid Build Coastguard Worker
1511*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1512*495ae853SAndroid Build Coastguard Worker /* */
1513*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_parse_pmb_ref_index_cavlc */
1514*495ae853SAndroid Build Coastguard Worker /* */
1515*495ae853SAndroid Build Coastguard Worker /* Description : This function does the Cavlc TEV range > 1 parsing of */
1516*495ae853SAndroid Build Coastguard Worker /* reference index for a P MB. */
1517*495ae853SAndroid Build Coastguard Worker /* Range > 1 when num_ref_idx_active_minus1 > 0 */
1518*495ae853SAndroid Build Coastguard Worker /* */
1519*495ae853SAndroid Build Coastguard Worker /* Inputs : <What inputs does the function take?> */
1520*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
1521*495ae853SAndroid Build Coastguard Worker /* Processing : <Describe how the function operates - include algorithm */
1522*495ae853SAndroid Build Coastguard Worker /* description> */
1523*495ae853SAndroid Build Coastguard Worker /* Outputs : <What does the function produce?> */
1524*495ae853SAndroid Build Coastguard Worker /* Returns : <What does the function return?> */
1525*495ae853SAndroid Build Coastguard Worker /* */
1526*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
1527*495ae853SAndroid Build Coastguard Worker /* */
1528*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1529*495ae853SAndroid Build Coastguard Worker /* */
1530*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1531*495ae853SAndroid Build Coastguard Worker /* 19 09 2008 Jay Draft */
1532*495ae853SAndroid Build Coastguard Worker /* */
1533*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1534*495ae853SAndroid Build Coastguard Worker
ih264d_parse_pmb_ref_index_cavlc(UWORD32 u4_num_part,dec_bit_stream_t * ps_bitstrm,WORD8 * pi1_ref_idx,UWORD32 u4_num_ref_idx_active_minus1)1535*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_parse_pmb_ref_index_cavlc(UWORD32 u4_num_part, /* Number of partitions in MB */
1536*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */
1537*495ae853SAndroid Build Coastguard Worker WORD8 *pi1_ref_idx, /* pointer to reference index array */
1538*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_ref_idx_active_minus1 /* Number of active references - 1 */
1539*495ae853SAndroid Build Coastguard Worker )
1540*495ae853SAndroid Build Coastguard Worker {
1541*495ae853SAndroid Build Coastguard Worker UWORD32 u4_i;
1542*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1543*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst;
1544*495ae853SAndroid Build Coastguard Worker
1545*495ae853SAndroid Build Coastguard Worker for(u4_i = 0; u4_i < u4_num_part; u4_i++)
1546*495ae853SAndroid Build Coastguard Worker {
1547*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ref_idx;
1548*495ae853SAndroid Build Coastguard Worker //Inlined ih264d_uev
1549*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bitstream_offset = *pu4_bitstream_off;
1550*495ae853SAndroid Build Coastguard Worker UWORD32 u4_word, u4_ldz;
1551*495ae853SAndroid Build Coastguard Worker
1552*495ae853SAndroid Build Coastguard Worker /***************************************************************/
1553*495ae853SAndroid Build Coastguard Worker /* Find leading zeros in next 32 bits */
1554*495ae853SAndroid Build Coastguard Worker /***************************************************************/
1555*495ae853SAndroid Build Coastguard Worker NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
1556*495ae853SAndroid Build Coastguard Worker u4_ldz = CLZ(u4_word);
1557*495ae853SAndroid Build Coastguard Worker /* Flush the ps_bitstrm */
1558*495ae853SAndroid Build Coastguard Worker u4_bitstream_offset += (u4_ldz + 1);
1559*495ae853SAndroid Build Coastguard Worker /* Read the suffix from the ps_bitstrm */
1560*495ae853SAndroid Build Coastguard Worker u4_word = 0;
1561*495ae853SAndroid Build Coastguard Worker if(u4_ldz)
1562*495ae853SAndroid Build Coastguard Worker GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
1563*495ae853SAndroid Build Coastguard Worker *pu4_bitstream_off = u4_bitstream_offset;
1564*495ae853SAndroid Build Coastguard Worker u4_ref_idx = ((1 << u4_ldz) + u4_word - 1);
1565*495ae853SAndroid Build Coastguard Worker //Inlined ih264d_uev
1566*495ae853SAndroid Build Coastguard Worker
1567*495ae853SAndroid Build Coastguard Worker if(u4_ref_idx > u4_num_ref_idx_active_minus1)
1568*495ae853SAndroid Build Coastguard Worker return ERROR_REF_IDX;
1569*495ae853SAndroid Build Coastguard Worker
1570*495ae853SAndroid Build Coastguard Worker /* Storing Reference Idx Information */
1571*495ae853SAndroid Build Coastguard Worker pi1_ref_idx[u4_i] = (WORD8)u4_ref_idx;
1572*495ae853SAndroid Build Coastguard Worker }
1573*495ae853SAndroid Build Coastguard Worker return OK;
1574*495ae853SAndroid Build Coastguard Worker }
1575*495ae853SAndroid Build Coastguard Worker
1576*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1577*495ae853SAndroid Build Coastguard Worker /* */
1578*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_parse_bmb_ref_index_cavlc_range1 */
1579*495ae853SAndroid Build Coastguard Worker /* */
1580*495ae853SAndroid Build Coastguard Worker /* Description : This function does the Cavlc TEV range =1 parsing of */
1581*495ae853SAndroid Build Coastguard Worker /* reference index for a B MB. Range is 1 when */
1582*495ae853SAndroid Build Coastguard Worker /* num_ref_idx_active_minus1 is 0 */
1583*495ae853SAndroid Build Coastguard Worker /* */
1584*495ae853SAndroid Build Coastguard Worker /* Inputs : <What inputs does the function take?> */
1585*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
1586*495ae853SAndroid Build Coastguard Worker /* Processing : <Describe how the function operates - include algorithm */
1587*495ae853SAndroid Build Coastguard Worker /* description> */
1588*495ae853SAndroid Build Coastguard Worker /* Outputs : <What does the function produce?> */
1589*495ae853SAndroid Build Coastguard Worker /* Returns : <What does the function return?> */
1590*495ae853SAndroid Build Coastguard Worker /* */
1591*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
1592*495ae853SAndroid Build Coastguard Worker /* */
1593*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1594*495ae853SAndroid Build Coastguard Worker /* */
1595*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1596*495ae853SAndroid Build Coastguard Worker /* 19 09 2008 Jay Draft */
1597*495ae853SAndroid Build Coastguard Worker /* */
1598*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_parse_bmb_ref_index_cavlc_range1(UWORD32 u4_num_part,dec_bit_stream_t * ps_bitstrm,WORD8 * pi1_ref_idx,UWORD32 u4_num_ref_idx_active_minus1)1599*495ae853SAndroid Build Coastguard Worker void ih264d_parse_bmb_ref_index_cavlc_range1(UWORD32 u4_num_part, /* Number of partitions in MB */
1600*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */
1601*495ae853SAndroid Build Coastguard Worker WORD8 *pi1_ref_idx, /* pointer to reference index array */
1602*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_ref_idx_active_minus1 /* Not used for range 1 */
1603*495ae853SAndroid Build Coastguard Worker )
1604*495ae853SAndroid Build Coastguard Worker {
1605*495ae853SAndroid Build Coastguard Worker UWORD32 u4_i;
1606*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1607*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst;
1608*495ae853SAndroid Build Coastguard Worker UNUSED(u4_num_ref_idx_active_minus1);
1609*495ae853SAndroid Build Coastguard Worker for(u4_i = 0; u4_i < u4_num_part; u4_i++)
1610*495ae853SAndroid Build Coastguard Worker {
1611*495ae853SAndroid Build Coastguard Worker if(pi1_ref_idx[u4_i] > -1)
1612*495ae853SAndroid Build Coastguard Worker {
1613*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ref_idx;
1614*495ae853SAndroid Build Coastguard Worker
1615*495ae853SAndroid Build Coastguard Worker u4_ref_idx = ih264d_tev_range1(pu4_bitstream_off, pu4_bitstrm_buf);
1616*495ae853SAndroid Build Coastguard Worker
1617*495ae853SAndroid Build Coastguard Worker /* Storing Reference Idx Information */
1618*495ae853SAndroid Build Coastguard Worker pi1_ref_idx[u4_i] = (WORD8)u4_ref_idx;
1619*495ae853SAndroid Build Coastguard Worker }
1620*495ae853SAndroid Build Coastguard Worker }
1621*495ae853SAndroid Build Coastguard Worker }
1622*495ae853SAndroid Build Coastguard Worker
1623*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1624*495ae853SAndroid Build Coastguard Worker /* */
1625*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_parse_bmb_ref_index_cavlc */
1626*495ae853SAndroid Build Coastguard Worker /* */
1627*495ae853SAndroid Build Coastguard Worker /* Description : This function does the Cavlc TEV range > 1 parsing of */
1628*495ae853SAndroid Build Coastguard Worker /* reference index for a B MB. */
1629*495ae853SAndroid Build Coastguard Worker /* Range > 1 when num_ref_idx_active_minus1 > 0 */
1630*495ae853SAndroid Build Coastguard Worker /* */
1631*495ae853SAndroid Build Coastguard Worker /* Inputs : <What inputs does the function take?> */
1632*495ae853SAndroid Build Coastguard Worker /* Globals : <Does it use any global variables?> */
1633*495ae853SAndroid Build Coastguard Worker /* Processing : <Describe how the function operates - include algorithm */
1634*495ae853SAndroid Build Coastguard Worker /* description> */
1635*495ae853SAndroid Build Coastguard Worker /* Outputs : <What does the function produce?> */
1636*495ae853SAndroid Build Coastguard Worker /* Returns : <What does the function return?> */
1637*495ae853SAndroid Build Coastguard Worker /* */
1638*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
1639*495ae853SAndroid Build Coastguard Worker /* */
1640*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1641*495ae853SAndroid Build Coastguard Worker /* */
1642*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1643*495ae853SAndroid Build Coastguard Worker /* 19 09 2008 Jay Draft */
1644*495ae853SAndroid Build Coastguard Worker /* */
1645*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_parse_bmb_ref_index_cavlc(UWORD32 u4_num_part,dec_bit_stream_t * ps_bitstrm,WORD8 * pi1_ref_idx,UWORD32 u4_num_ref_idx_active_minus1)1646*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_parse_bmb_ref_index_cavlc(UWORD32 u4_num_part, /* Number of partitions in MB */
1647*495ae853SAndroid Build Coastguard Worker dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */
1648*495ae853SAndroid Build Coastguard Worker WORD8 *pi1_ref_idx, /* pointer to reference index array */
1649*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_ref_idx_active_minus1 /* Number of active references - 1 */
1650*495ae853SAndroid Build Coastguard Worker )
1651*495ae853SAndroid Build Coastguard Worker {
1652*495ae853SAndroid Build Coastguard Worker UWORD32 u4_i;
1653*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1654*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst;
1655*495ae853SAndroid Build Coastguard Worker
1656*495ae853SAndroid Build Coastguard Worker for(u4_i = 0; u4_i < u4_num_part; u4_i++)
1657*495ae853SAndroid Build Coastguard Worker {
1658*495ae853SAndroid Build Coastguard Worker if(pi1_ref_idx[u4_i] > -1)
1659*495ae853SAndroid Build Coastguard Worker {
1660*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ref_idx;
1661*495ae853SAndroid Build Coastguard Worker //inlining ih264d_uev
1662*495ae853SAndroid Build Coastguard Worker UWORD32 u4_bitstream_offset = *pu4_bitstream_off;
1663*495ae853SAndroid Build Coastguard Worker UWORD32 u4_word, u4_ldz;
1664*495ae853SAndroid Build Coastguard Worker
1665*495ae853SAndroid Build Coastguard Worker /***************************************************************/
1666*495ae853SAndroid Build Coastguard Worker /* Find leading zeros in next 32 bits */
1667*495ae853SAndroid Build Coastguard Worker /***************************************************************/
1668*495ae853SAndroid Build Coastguard Worker NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
1669*495ae853SAndroid Build Coastguard Worker u4_ldz = CLZ(u4_word);
1670*495ae853SAndroid Build Coastguard Worker /* Flush the ps_bitstrm */
1671*495ae853SAndroid Build Coastguard Worker u4_bitstream_offset += (u4_ldz + 1);
1672*495ae853SAndroid Build Coastguard Worker /* Read the suffix from the ps_bitstrm */
1673*495ae853SAndroid Build Coastguard Worker u4_word = 0;
1674*495ae853SAndroid Build Coastguard Worker if(u4_ldz)
1675*495ae853SAndroid Build Coastguard Worker GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
1676*495ae853SAndroid Build Coastguard Worker *pu4_bitstream_off = u4_bitstream_offset;
1677*495ae853SAndroid Build Coastguard Worker u4_ref_idx = ((1 << u4_ldz) + u4_word - 1);
1678*495ae853SAndroid Build Coastguard Worker //inlining ih264d_uev
1679*495ae853SAndroid Build Coastguard Worker if(u4_ref_idx > u4_num_ref_idx_active_minus1)
1680*495ae853SAndroid Build Coastguard Worker return ERROR_REF_IDX;
1681*495ae853SAndroid Build Coastguard Worker
1682*495ae853SAndroid Build Coastguard Worker /* Storing Reference Idx Information */
1683*495ae853SAndroid Build Coastguard Worker pi1_ref_idx[u4_i] = (WORD8)u4_ref_idx;
1684*495ae853SAndroid Build Coastguard Worker }
1685*495ae853SAndroid Build Coastguard Worker }
1686*495ae853SAndroid Build Coastguard Worker return OK;
1687*495ae853SAndroid Build Coastguard Worker }
1688*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1689*495ae853SAndroid Build Coastguard Worker /* */
1690*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_cavlc_parse_8x8block_both_available */
1691*495ae853SAndroid Build Coastguard Worker /* */
1692*495ae853SAndroid Build Coastguard Worker /* Description : This function does the residual parsing of 4 subblocks */
1693*495ae853SAndroid Build Coastguard Worker /* in a 8x8 block when both top and left are available */
1694*495ae853SAndroid Build Coastguard Worker /* */
1695*495ae853SAndroid Build Coastguard Worker /* Inputs : pi2_coeff_block : pointer to residual block where */
1696*495ae853SAndroid Build Coastguard Worker /* decoded and inverse scan coefficients are updated */
1697*495ae853SAndroid Build Coastguard Worker /* */
1698*495ae853SAndroid Build Coastguard Worker /* u4_sub_block_strd : indicates the number of sublocks */
1699*495ae853SAndroid Build Coastguard Worker /* in a row. It is 4 for luma and 2 for chroma. */
1700*495ae853SAndroid Build Coastguard Worker /* */
1701*495ae853SAndroid Build Coastguard Worker /* u4_isdc : required to indicate 4x4 parse modules if the */
1702*495ae853SAndroid Build Coastguard Worker /* current Mb is I_16x16/chroma DC coded. */
1703*495ae853SAndroid Build Coastguard Worker /* */
1704*495ae853SAndroid Build Coastguard Worker /* ps_dec : pointer to Decstruct (decoder context) */
1705*495ae853SAndroid Build Coastguard Worker /* */
1706*495ae853SAndroid Build Coastguard Worker /* pu1_top_nnz : top nnz pointer */
1707*495ae853SAndroid Build Coastguard Worker /* */
1708*495ae853SAndroid Build Coastguard Worker /* pu1_left_nnz : left nnz pointer */
1709*495ae853SAndroid Build Coastguard Worker /* */
1710*495ae853SAndroid Build Coastguard Worker /* Globals : No */
1711*495ae853SAndroid Build Coastguard Worker /* Processing : Parsing for four subblocks in unrolled, top and left nnz */
1712*495ae853SAndroid Build Coastguard Worker /* are updated on the fly. csbp is set in accordance to */
1713*495ae853SAndroid Build Coastguard Worker /* decoded numcoeff for the subblock index in raster order */
1714*495ae853SAndroid Build Coastguard Worker /* */
1715*495ae853SAndroid Build Coastguard Worker /* Outputs : The updated residue buffer, nnzs and csbp current block */
1716*495ae853SAndroid Build Coastguard Worker /* */
1717*495ae853SAndroid Build Coastguard Worker /* Returns : Returns the coded sub block pattern csbp for the block */
1718*495ae853SAndroid Build Coastguard Worker /* */
1719*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
1720*495ae853SAndroid Build Coastguard Worker /* */
1721*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1722*495ae853SAndroid Build Coastguard Worker /* */
1723*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1724*495ae853SAndroid Build Coastguard Worker /* 09 10 2008 Jay Draft */
1725*495ae853SAndroid Build Coastguard Worker /* */
1726*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_cavlc_parse_8x8block_both_available(WORD16 * pi2_coeff_block,UWORD32 u4_sub_block_strd,UWORD32 u4_isdc,dec_struct_t * ps_dec,UWORD8 * pu1_top_nnz,UWORD8 * pu1_left_nnz,UWORD8 u1_tran_form8x8,UWORD8 u1_mb_field_decodingflag,UWORD32 * pu4_csbp)1727*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_cavlc_parse_8x8block_both_available(WORD16 *pi2_coeff_block,
1728*495ae853SAndroid Build Coastguard Worker UWORD32 u4_sub_block_strd,
1729*495ae853SAndroid Build Coastguard Worker UWORD32 u4_isdc,
1730*495ae853SAndroid Build Coastguard Worker dec_struct_t * ps_dec,
1731*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_top_nnz,
1732*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_left_nnz,
1733*495ae853SAndroid Build Coastguard Worker UWORD8 u1_tran_form8x8,
1734*495ae853SAndroid Build Coastguard Worker UWORD8 u1_mb_field_decodingflag,
1735*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_csbp)
1736*495ae853SAndroid Build Coastguard Worker {
1737*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_coeff, u4_n, u4_subblock_coded;
1738*495ae853SAndroid Build Coastguard Worker UWORD32 u4_top0, u4_top1;
1739*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_dummy;
1740*495ae853SAndroid Build Coastguard Worker WORD32 (**pf_cavlc_parse4x4coeff)(WORD16 *pi2_coeff_block,
1741*495ae853SAndroid Build Coastguard Worker UWORD32 u4_isdc,
1742*495ae853SAndroid Build Coastguard Worker WORD32 u4_n,
1743*495ae853SAndroid Build Coastguard Worker struct _DecStruct *ps_dec,
1744*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_dummy) =
1745*495ae853SAndroid Build Coastguard Worker ps_dec->pf_cavlc_parse4x4coeff;
1746*495ae853SAndroid Build Coastguard Worker UWORD32 u4_idx = 0;
1747*495ae853SAndroid Build Coastguard Worker UWORD8 *puc_temp;
1748*495ae853SAndroid Build Coastguard Worker WORD32 ret;
1749*495ae853SAndroid Build Coastguard Worker
1750*495ae853SAndroid Build Coastguard Worker *pu4_csbp = 0;
1751*495ae853SAndroid Build Coastguard Worker /* need to change the inverse scan matrices here */
1752*495ae853SAndroid Build Coastguard Worker puc_temp = ps_dec->pu1_inv_scan;
1753*495ae853SAndroid Build Coastguard Worker
1754*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
1755*495ae853SAndroid Build Coastguard Worker /* Residual 4x4 decoding: SubBlock 0 */
1756*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
1757*495ae853SAndroid Build Coastguard Worker if(u1_tran_form8x8)
1758*495ae853SAndroid Build Coastguard Worker {
1759*495ae853SAndroid Build Coastguard Worker if(!u1_mb_field_decodingflag)
1760*495ae853SAndroid Build Coastguard Worker {
1761*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
1762*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0];
1763*495ae853SAndroid Build Coastguard Worker }
1764*495ae853SAndroid Build Coastguard Worker else
1765*495ae853SAndroid Build Coastguard Worker {
1766*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
1767*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0];
1768*495ae853SAndroid Build Coastguard Worker }
1769*495ae853SAndroid Build Coastguard Worker }
1770*495ae853SAndroid Build Coastguard Worker u4_n = (pu1_top_nnz[0] + pu1_left_nnz[0] + 1) >> 1;
1771*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
1772*495ae853SAndroid Build Coastguard Worker u4_n, ps_dec, &u4_num_coeff);
1773*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1774*495ae853SAndroid Build Coastguard Worker return ret;
1775*495ae853SAndroid Build Coastguard Worker
1776*495ae853SAndroid Build Coastguard Worker u4_top0 = u4_num_coeff;
1777*495ae853SAndroid Build Coastguard Worker u4_subblock_coded = (u4_num_coeff != 0);
1778*495ae853SAndroid Build Coastguard Worker INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
1779*495ae853SAndroid Build Coastguard Worker
1780*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
1781*495ae853SAndroid Build Coastguard Worker /* Residual 4x4 decoding: SubBlock 1 */
1782*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
1783*495ae853SAndroid Build Coastguard Worker u4_idx++;
1784*495ae853SAndroid Build Coastguard Worker if(u1_tran_form8x8)
1785*495ae853SAndroid Build Coastguard Worker {
1786*495ae853SAndroid Build Coastguard Worker if(!u1_mb_field_decodingflag)
1787*495ae853SAndroid Build Coastguard Worker {
1788*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
1789*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1];
1790*495ae853SAndroid Build Coastguard Worker }
1791*495ae853SAndroid Build Coastguard Worker else
1792*495ae853SAndroid Build Coastguard Worker {
1793*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
1794*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1];
1795*495ae853SAndroid Build Coastguard Worker }
1796*495ae853SAndroid Build Coastguard Worker }
1797*495ae853SAndroid Build Coastguard Worker else
1798*495ae853SAndroid Build Coastguard Worker {
1799*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
1800*495ae853SAndroid Build Coastguard Worker }
1801*495ae853SAndroid Build Coastguard Worker u4_n = (pu1_top_nnz[1] + u4_num_coeff + 1) >> 1;
1802*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
1803*495ae853SAndroid Build Coastguard Worker u4_n, ps_dec, &u4_num_coeff);
1804*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1805*495ae853SAndroid Build Coastguard Worker return ret;
1806*495ae853SAndroid Build Coastguard Worker
1807*495ae853SAndroid Build Coastguard Worker u4_top1 = pu1_left_nnz[0] = u4_num_coeff;
1808*495ae853SAndroid Build Coastguard Worker u4_subblock_coded = (u4_num_coeff != 0);
1809*495ae853SAndroid Build Coastguard Worker INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
1810*495ae853SAndroid Build Coastguard Worker
1811*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
1812*495ae853SAndroid Build Coastguard Worker /* Residual 4x4 decoding: SubBlock 2 */
1813*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
1814*495ae853SAndroid Build Coastguard Worker u4_idx += (u4_sub_block_strd - 1);
1815*495ae853SAndroid Build Coastguard Worker if(u1_tran_form8x8)
1816*495ae853SAndroid Build Coastguard Worker {
1817*495ae853SAndroid Build Coastguard Worker if(!u1_mb_field_decodingflag)
1818*495ae853SAndroid Build Coastguard Worker {
1819*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
1820*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2];
1821*495ae853SAndroid Build Coastguard Worker }
1822*495ae853SAndroid Build Coastguard Worker else
1823*495ae853SAndroid Build Coastguard Worker {
1824*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
1825*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2];
1826*495ae853SAndroid Build Coastguard Worker }
1827*495ae853SAndroid Build Coastguard Worker }
1828*495ae853SAndroid Build Coastguard Worker else
1829*495ae853SAndroid Build Coastguard Worker {
1830*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK);
1831*495ae853SAndroid Build Coastguard Worker }
1832*495ae853SAndroid Build Coastguard Worker u4_n = (u4_top0 + pu1_left_nnz[1] + 1) >> 1;
1833*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
1834*495ae853SAndroid Build Coastguard Worker u4_n, ps_dec, &u4_num_coeff);
1835*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1836*495ae853SAndroid Build Coastguard Worker return ret;
1837*495ae853SAndroid Build Coastguard Worker
1838*495ae853SAndroid Build Coastguard Worker pu1_top_nnz[0] = u4_num_coeff;
1839*495ae853SAndroid Build Coastguard Worker u4_subblock_coded = (u4_num_coeff != 0);
1840*495ae853SAndroid Build Coastguard Worker INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
1841*495ae853SAndroid Build Coastguard Worker
1842*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
1843*495ae853SAndroid Build Coastguard Worker /* Residual 4x4 decoding: SubBlock 3 */
1844*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
1845*495ae853SAndroid Build Coastguard Worker u4_idx++;
1846*495ae853SAndroid Build Coastguard Worker if(u1_tran_form8x8)
1847*495ae853SAndroid Build Coastguard Worker {
1848*495ae853SAndroid Build Coastguard Worker if(!u1_mb_field_decodingflag)
1849*495ae853SAndroid Build Coastguard Worker {
1850*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
1851*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3];
1852*495ae853SAndroid Build Coastguard Worker }
1853*495ae853SAndroid Build Coastguard Worker else
1854*495ae853SAndroid Build Coastguard Worker {
1855*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
1856*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3];
1857*495ae853SAndroid Build Coastguard Worker }
1858*495ae853SAndroid Build Coastguard Worker }
1859*495ae853SAndroid Build Coastguard Worker else
1860*495ae853SAndroid Build Coastguard Worker {
1861*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
1862*495ae853SAndroid Build Coastguard Worker }
1863*495ae853SAndroid Build Coastguard Worker u4_n = (u4_top1 + u4_num_coeff + 1) >> 1;
1864*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
1865*495ae853SAndroid Build Coastguard Worker u4_n, ps_dec, &u4_num_coeff);
1866*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1867*495ae853SAndroid Build Coastguard Worker return ret;
1868*495ae853SAndroid Build Coastguard Worker
1869*495ae853SAndroid Build Coastguard Worker pu1_top_nnz[1] = pu1_left_nnz[1] = u4_num_coeff;
1870*495ae853SAndroid Build Coastguard Worker u4_subblock_coded = (u4_num_coeff != 0);
1871*495ae853SAndroid Build Coastguard Worker INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
1872*495ae853SAndroid Build Coastguard Worker
1873*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan = puc_temp;
1874*495ae853SAndroid Build Coastguard Worker
1875*495ae853SAndroid Build Coastguard Worker return OK;
1876*495ae853SAndroid Build Coastguard Worker }
1877*495ae853SAndroid Build Coastguard Worker
1878*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1879*495ae853SAndroid Build Coastguard Worker /* */
1880*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_cavlc_parse_8x8block_left_available */
1881*495ae853SAndroid Build Coastguard Worker /* */
1882*495ae853SAndroid Build Coastguard Worker /* Description : This function does the residual parsing of 4 subblocks */
1883*495ae853SAndroid Build Coastguard Worker /* in a 8x8 block when only left is available for block */
1884*495ae853SAndroid Build Coastguard Worker /* */
1885*495ae853SAndroid Build Coastguard Worker /* Inputs : pi2_coeff_block : pointer to residual block where */
1886*495ae853SAndroid Build Coastguard Worker /* decoded and inverse scan coefficients are updated */
1887*495ae853SAndroid Build Coastguard Worker /* */
1888*495ae853SAndroid Build Coastguard Worker /* u4_sub_block_strd : indicates the number of sublocks */
1889*495ae853SAndroid Build Coastguard Worker /* in a row. It is 4 for luma and 2 for chroma. */
1890*495ae853SAndroid Build Coastguard Worker /* */
1891*495ae853SAndroid Build Coastguard Worker /* u4_isdc : required to indicate 4x4 parse modules if the */
1892*495ae853SAndroid Build Coastguard Worker /* current Mb is I_16x16/chroma DC coded. */
1893*495ae853SAndroid Build Coastguard Worker /* */
1894*495ae853SAndroid Build Coastguard Worker /* ps_dec : pointer to Decstruct (decoder context) */
1895*495ae853SAndroid Build Coastguard Worker /* */
1896*495ae853SAndroid Build Coastguard Worker /* pu1_top_nnz : top nnz pointer */
1897*495ae853SAndroid Build Coastguard Worker /* */
1898*495ae853SAndroid Build Coastguard Worker /* pu1_left_nnz : left nnz pointer */
1899*495ae853SAndroid Build Coastguard Worker /* */
1900*495ae853SAndroid Build Coastguard Worker /* Globals : No */
1901*495ae853SAndroid Build Coastguard Worker /* Processing : Parsing for four subblocks in unrolled, top and left nnz */
1902*495ae853SAndroid Build Coastguard Worker /* are updated on the fly. csbp is set in accordance to */
1903*495ae853SAndroid Build Coastguard Worker /* decoded numcoeff for the subblock index in raster order */
1904*495ae853SAndroid Build Coastguard Worker /* */
1905*495ae853SAndroid Build Coastguard Worker /* Outputs : The updated residue buffer, nnzs and csbp current block */
1906*495ae853SAndroid Build Coastguard Worker /* */
1907*495ae853SAndroid Build Coastguard Worker /* Returns : Returns the coded sub block pattern csbp for the block */
1908*495ae853SAndroid Build Coastguard Worker /* */
1909*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
1910*495ae853SAndroid Build Coastguard Worker /* */
1911*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1912*495ae853SAndroid Build Coastguard Worker /* */
1913*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1914*495ae853SAndroid Build Coastguard Worker /* 09 10 2008 Jay Draft */
1915*495ae853SAndroid Build Coastguard Worker /* */
1916*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_cavlc_parse_8x8block_left_available(WORD16 * pi2_coeff_block,UWORD32 u4_sub_block_strd,UWORD32 u4_isdc,dec_struct_t * ps_dec,UWORD8 * pu1_top_nnz,UWORD8 * pu1_left_nnz,UWORD8 u1_tran_form8x8,UWORD8 u1_mb_field_decodingflag,UWORD32 * pu4_csbp)1917*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_cavlc_parse_8x8block_left_available(WORD16 *pi2_coeff_block,
1918*495ae853SAndroid Build Coastguard Worker UWORD32 u4_sub_block_strd,
1919*495ae853SAndroid Build Coastguard Worker UWORD32 u4_isdc,
1920*495ae853SAndroid Build Coastguard Worker dec_struct_t * ps_dec,
1921*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_top_nnz,
1922*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_left_nnz,
1923*495ae853SAndroid Build Coastguard Worker UWORD8 u1_tran_form8x8,
1924*495ae853SAndroid Build Coastguard Worker UWORD8 u1_mb_field_decodingflag,
1925*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_csbp)
1926*495ae853SAndroid Build Coastguard Worker {
1927*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_coeff, u4_n, u4_subblock_coded;
1928*495ae853SAndroid Build Coastguard Worker UWORD32 u4_top0, u4_top1;
1929*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_dummy;
1930*495ae853SAndroid Build Coastguard Worker WORD32 (**pf_cavlc_parse4x4coeff)(WORD16 *pi2_coeff_block,
1931*495ae853SAndroid Build Coastguard Worker UWORD32 u4_isdc,
1932*495ae853SAndroid Build Coastguard Worker WORD32 u4_n,
1933*495ae853SAndroid Build Coastguard Worker struct _DecStruct *ps_dec,
1934*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_dummy) =
1935*495ae853SAndroid Build Coastguard Worker ps_dec->pf_cavlc_parse4x4coeff;
1936*495ae853SAndroid Build Coastguard Worker UWORD32 u4_idx = 0;
1937*495ae853SAndroid Build Coastguard Worker UWORD8 *puc_temp;
1938*495ae853SAndroid Build Coastguard Worker WORD32 ret;
1939*495ae853SAndroid Build Coastguard Worker
1940*495ae853SAndroid Build Coastguard Worker *pu4_csbp = 0;
1941*495ae853SAndroid Build Coastguard Worker puc_temp = ps_dec->pu1_inv_scan;
1942*495ae853SAndroid Build Coastguard Worker
1943*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
1944*495ae853SAndroid Build Coastguard Worker /* Residual 4x4 decoding: SubBlock 0 */
1945*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
1946*495ae853SAndroid Build Coastguard Worker if(u1_tran_form8x8)
1947*495ae853SAndroid Build Coastguard Worker {
1948*495ae853SAndroid Build Coastguard Worker if(!u1_mb_field_decodingflag)
1949*495ae853SAndroid Build Coastguard Worker {
1950*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
1951*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0];
1952*495ae853SAndroid Build Coastguard Worker }
1953*495ae853SAndroid Build Coastguard Worker else
1954*495ae853SAndroid Build Coastguard Worker {
1955*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
1956*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0];
1957*495ae853SAndroid Build Coastguard Worker }
1958*495ae853SAndroid Build Coastguard Worker }
1959*495ae853SAndroid Build Coastguard Worker u4_n = pu1_left_nnz[0];
1960*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
1961*495ae853SAndroid Build Coastguard Worker u4_n, ps_dec, &u4_num_coeff);
1962*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1963*495ae853SAndroid Build Coastguard Worker return ret;
1964*495ae853SAndroid Build Coastguard Worker
1965*495ae853SAndroid Build Coastguard Worker u4_top0 = u4_num_coeff;
1966*495ae853SAndroid Build Coastguard Worker u4_subblock_coded = (u4_num_coeff != 0);
1967*495ae853SAndroid Build Coastguard Worker INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
1968*495ae853SAndroid Build Coastguard Worker
1969*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
1970*495ae853SAndroid Build Coastguard Worker /* Residual 4x4 decoding: SubBlock 1 */
1971*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
1972*495ae853SAndroid Build Coastguard Worker u4_idx++;
1973*495ae853SAndroid Build Coastguard Worker if(u1_tran_form8x8)
1974*495ae853SAndroid Build Coastguard Worker {
1975*495ae853SAndroid Build Coastguard Worker if(!u1_mb_field_decodingflag)
1976*495ae853SAndroid Build Coastguard Worker {
1977*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
1978*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1];
1979*495ae853SAndroid Build Coastguard Worker }
1980*495ae853SAndroid Build Coastguard Worker else
1981*495ae853SAndroid Build Coastguard Worker {
1982*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
1983*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1];
1984*495ae853SAndroid Build Coastguard Worker }
1985*495ae853SAndroid Build Coastguard Worker }
1986*495ae853SAndroid Build Coastguard Worker else
1987*495ae853SAndroid Build Coastguard Worker {
1988*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
1989*495ae853SAndroid Build Coastguard Worker }
1990*495ae853SAndroid Build Coastguard Worker u4_n = u4_num_coeff;
1991*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
1992*495ae853SAndroid Build Coastguard Worker u4_n, ps_dec, &u4_num_coeff);
1993*495ae853SAndroid Build Coastguard Worker if(ret != OK)
1994*495ae853SAndroid Build Coastguard Worker return ret;
1995*495ae853SAndroid Build Coastguard Worker
1996*495ae853SAndroid Build Coastguard Worker u4_top1 = pu1_left_nnz[0] = u4_num_coeff;
1997*495ae853SAndroid Build Coastguard Worker u4_subblock_coded = (u4_num_coeff != 0);
1998*495ae853SAndroid Build Coastguard Worker INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
1999*495ae853SAndroid Build Coastguard Worker
2000*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2001*495ae853SAndroid Build Coastguard Worker /* Residual 4x4 decoding: SubBlock 2 */
2002*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2003*495ae853SAndroid Build Coastguard Worker u4_idx += (u4_sub_block_strd - 1);
2004*495ae853SAndroid Build Coastguard Worker if(u1_tran_form8x8)
2005*495ae853SAndroid Build Coastguard Worker {
2006*495ae853SAndroid Build Coastguard Worker if(!u1_mb_field_decodingflag)
2007*495ae853SAndroid Build Coastguard Worker {
2008*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2009*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2];
2010*495ae853SAndroid Build Coastguard Worker }
2011*495ae853SAndroid Build Coastguard Worker else
2012*495ae853SAndroid Build Coastguard Worker {
2013*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2014*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2];
2015*495ae853SAndroid Build Coastguard Worker }
2016*495ae853SAndroid Build Coastguard Worker }
2017*495ae853SAndroid Build Coastguard Worker else
2018*495ae853SAndroid Build Coastguard Worker {
2019*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK);
2020*495ae853SAndroid Build Coastguard Worker }
2021*495ae853SAndroid Build Coastguard Worker u4_n = (u4_top0 + pu1_left_nnz[1] + 1) >> 1;
2022*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
2023*495ae853SAndroid Build Coastguard Worker u4_n, ps_dec, &u4_num_coeff);
2024*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2025*495ae853SAndroid Build Coastguard Worker return ret;
2026*495ae853SAndroid Build Coastguard Worker
2027*495ae853SAndroid Build Coastguard Worker pu1_top_nnz[0] = u4_num_coeff;
2028*495ae853SAndroid Build Coastguard Worker u4_subblock_coded = (u4_num_coeff != 0);
2029*495ae853SAndroid Build Coastguard Worker INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
2030*495ae853SAndroid Build Coastguard Worker
2031*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2032*495ae853SAndroid Build Coastguard Worker /* Residual 4x4 decoding: SubBlock 3 */
2033*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2034*495ae853SAndroid Build Coastguard Worker u4_idx++;
2035*495ae853SAndroid Build Coastguard Worker if(u1_tran_form8x8)
2036*495ae853SAndroid Build Coastguard Worker {
2037*495ae853SAndroid Build Coastguard Worker if(!u1_mb_field_decodingflag)
2038*495ae853SAndroid Build Coastguard Worker {
2039*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2040*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3];
2041*495ae853SAndroid Build Coastguard Worker }
2042*495ae853SAndroid Build Coastguard Worker else
2043*495ae853SAndroid Build Coastguard Worker {
2044*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2045*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3];
2046*495ae853SAndroid Build Coastguard Worker }
2047*495ae853SAndroid Build Coastguard Worker }
2048*495ae853SAndroid Build Coastguard Worker else
2049*495ae853SAndroid Build Coastguard Worker {
2050*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
2051*495ae853SAndroid Build Coastguard Worker }
2052*495ae853SAndroid Build Coastguard Worker u4_n = (u4_top1 + u4_num_coeff + 1) >> 1;
2053*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
2054*495ae853SAndroid Build Coastguard Worker u4_n, ps_dec, &u4_num_coeff);
2055*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2056*495ae853SAndroid Build Coastguard Worker return ret;
2057*495ae853SAndroid Build Coastguard Worker
2058*495ae853SAndroid Build Coastguard Worker pu1_top_nnz[1] = pu1_left_nnz[1] = u4_num_coeff;
2059*495ae853SAndroid Build Coastguard Worker u4_subblock_coded = (u4_num_coeff != 0);
2060*495ae853SAndroid Build Coastguard Worker INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
2061*495ae853SAndroid Build Coastguard Worker
2062*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan = puc_temp;
2063*495ae853SAndroid Build Coastguard Worker
2064*495ae853SAndroid Build Coastguard Worker return OK;
2065*495ae853SAndroid Build Coastguard Worker }
2066*495ae853SAndroid Build Coastguard Worker
2067*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2068*495ae853SAndroid Build Coastguard Worker /* */
2069*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_cavlc_parse_8x8block_top_available */
2070*495ae853SAndroid Build Coastguard Worker /* */
2071*495ae853SAndroid Build Coastguard Worker /* Description : This function does the residual parsing of 4 subblocks */
2072*495ae853SAndroid Build Coastguard Worker /* in a 8x8 block when only top is available for block */
2073*495ae853SAndroid Build Coastguard Worker /* */
2074*495ae853SAndroid Build Coastguard Worker /* Inputs : pi2_coeff_block : pointer to residual block where */
2075*495ae853SAndroid Build Coastguard Worker /* decoded and inverse scan coefficients are updated */
2076*495ae853SAndroid Build Coastguard Worker /* */
2077*495ae853SAndroid Build Coastguard Worker /* u4_sub_block_strd : indicates the number of sublocks */
2078*495ae853SAndroid Build Coastguard Worker /* in a row. It is 4 for luma and 2 for chroma. */
2079*495ae853SAndroid Build Coastguard Worker /* */
2080*495ae853SAndroid Build Coastguard Worker /* u4_isdc : required to indicate 4x4 parse modules if the */
2081*495ae853SAndroid Build Coastguard Worker /* current Mb is I_16x16/chroma DC coded. */
2082*495ae853SAndroid Build Coastguard Worker /* */
2083*495ae853SAndroid Build Coastguard Worker /* ps_dec : pointer to Decstruct (decoder context) */
2084*495ae853SAndroid Build Coastguard Worker /* */
2085*495ae853SAndroid Build Coastguard Worker /* pu1_top_nnz : top nnz pointer */
2086*495ae853SAndroid Build Coastguard Worker /* */
2087*495ae853SAndroid Build Coastguard Worker /* pu1_left_nnz : left nnz pointer */
2088*495ae853SAndroid Build Coastguard Worker /* */
2089*495ae853SAndroid Build Coastguard Worker /* Globals : No */
2090*495ae853SAndroid Build Coastguard Worker /* Processing : Parsing for four subblocks in unrolled, top and left nnz */
2091*495ae853SAndroid Build Coastguard Worker /* are updated on the fly. csbp is set in accordance to */
2092*495ae853SAndroid Build Coastguard Worker /* decoded numcoeff for the subblock index in raster order */
2093*495ae853SAndroid Build Coastguard Worker /* */
2094*495ae853SAndroid Build Coastguard Worker /* Outputs : The updated residue buffer, nnzs and csbp current block */
2095*495ae853SAndroid Build Coastguard Worker /* */
2096*495ae853SAndroid Build Coastguard Worker /* Returns : Returns the coded sub block pattern csbp for the block */
2097*495ae853SAndroid Build Coastguard Worker /* */
2098*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
2099*495ae853SAndroid Build Coastguard Worker /* */
2100*495ae853SAndroid Build Coastguard Worker /* Revision History: */
2101*495ae853SAndroid Build Coastguard Worker /* */
2102*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
2103*495ae853SAndroid Build Coastguard Worker /* 09 10 2008 Jay Draft */
2104*495ae853SAndroid Build Coastguard Worker /* */
2105*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_cavlc_parse_8x8block_top_available(WORD16 * pi2_coeff_block,UWORD32 u4_sub_block_strd,UWORD32 u4_isdc,dec_struct_t * ps_dec,UWORD8 * pu1_top_nnz,UWORD8 * pu1_left_nnz,UWORD8 u1_tran_form8x8,UWORD8 u1_mb_field_decodingflag,UWORD32 * pu4_csbp)2106*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_cavlc_parse_8x8block_top_available(WORD16 *pi2_coeff_block,
2107*495ae853SAndroid Build Coastguard Worker UWORD32 u4_sub_block_strd,
2108*495ae853SAndroid Build Coastguard Worker UWORD32 u4_isdc,
2109*495ae853SAndroid Build Coastguard Worker dec_struct_t * ps_dec,
2110*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_top_nnz,
2111*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_left_nnz,
2112*495ae853SAndroid Build Coastguard Worker UWORD8 u1_tran_form8x8,
2113*495ae853SAndroid Build Coastguard Worker UWORD8 u1_mb_field_decodingflag,
2114*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_csbp)
2115*495ae853SAndroid Build Coastguard Worker {
2116*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_coeff, u4_n, u4_subblock_coded;
2117*495ae853SAndroid Build Coastguard Worker UWORD32 u4_top0, u4_top1;
2118*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_dummy;
2119*495ae853SAndroid Build Coastguard Worker WORD32 (**pf_cavlc_parse4x4coeff)(WORD16 *pi2_coeff_block,
2120*495ae853SAndroid Build Coastguard Worker UWORD32 u4_isdc,
2121*495ae853SAndroid Build Coastguard Worker WORD32 u4_n,
2122*495ae853SAndroid Build Coastguard Worker struct _DecStruct *ps_dec,
2123*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_dummy) =
2124*495ae853SAndroid Build Coastguard Worker ps_dec->pf_cavlc_parse4x4coeff;
2125*495ae853SAndroid Build Coastguard Worker UWORD32 u4_idx = 0;
2126*495ae853SAndroid Build Coastguard Worker UWORD8 *puc_temp;
2127*495ae853SAndroid Build Coastguard Worker WORD32 ret;
2128*495ae853SAndroid Build Coastguard Worker
2129*495ae853SAndroid Build Coastguard Worker *pu4_csbp = 0;
2130*495ae853SAndroid Build Coastguard Worker puc_temp = ps_dec->pu1_inv_scan;
2131*495ae853SAndroid Build Coastguard Worker
2132*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2133*495ae853SAndroid Build Coastguard Worker /* Residual 4x4 decoding: SubBlock 0 */
2134*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2135*495ae853SAndroid Build Coastguard Worker if(u1_tran_form8x8)
2136*495ae853SAndroid Build Coastguard Worker {
2137*495ae853SAndroid Build Coastguard Worker if(!u1_mb_field_decodingflag)
2138*495ae853SAndroid Build Coastguard Worker {
2139*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2140*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0];
2141*495ae853SAndroid Build Coastguard Worker }
2142*495ae853SAndroid Build Coastguard Worker else
2143*495ae853SAndroid Build Coastguard Worker {
2144*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2145*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0];
2146*495ae853SAndroid Build Coastguard Worker }
2147*495ae853SAndroid Build Coastguard Worker }
2148*495ae853SAndroid Build Coastguard Worker u4_n = pu1_top_nnz[0];
2149*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
2150*495ae853SAndroid Build Coastguard Worker u4_n, ps_dec, &u4_num_coeff);
2151*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2152*495ae853SAndroid Build Coastguard Worker return ret;
2153*495ae853SAndroid Build Coastguard Worker
2154*495ae853SAndroid Build Coastguard Worker u4_top0 = u4_num_coeff;
2155*495ae853SAndroid Build Coastguard Worker u4_subblock_coded = (u4_num_coeff != 0);
2156*495ae853SAndroid Build Coastguard Worker INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
2157*495ae853SAndroid Build Coastguard Worker
2158*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2159*495ae853SAndroid Build Coastguard Worker /* Residual 4x4 decoding: SubBlock 1 */
2160*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2161*495ae853SAndroid Build Coastguard Worker u4_idx++;
2162*495ae853SAndroid Build Coastguard Worker if(u1_tran_form8x8)
2163*495ae853SAndroid Build Coastguard Worker {
2164*495ae853SAndroid Build Coastguard Worker if(!u1_mb_field_decodingflag)
2165*495ae853SAndroid Build Coastguard Worker {
2166*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2167*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1];
2168*495ae853SAndroid Build Coastguard Worker }
2169*495ae853SAndroid Build Coastguard Worker else
2170*495ae853SAndroid Build Coastguard Worker {
2171*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2172*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1];
2173*495ae853SAndroid Build Coastguard Worker }
2174*495ae853SAndroid Build Coastguard Worker }
2175*495ae853SAndroid Build Coastguard Worker else
2176*495ae853SAndroid Build Coastguard Worker {
2177*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
2178*495ae853SAndroid Build Coastguard Worker }
2179*495ae853SAndroid Build Coastguard Worker u4_n = (pu1_top_nnz[1] + u4_num_coeff + 1) >> 1;
2180*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
2181*495ae853SAndroid Build Coastguard Worker u4_n, ps_dec, &u4_num_coeff);
2182*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2183*495ae853SAndroid Build Coastguard Worker return ret;
2184*495ae853SAndroid Build Coastguard Worker
2185*495ae853SAndroid Build Coastguard Worker u4_top1 = pu1_left_nnz[0] = u4_num_coeff;
2186*495ae853SAndroid Build Coastguard Worker u4_subblock_coded = (u4_num_coeff != 0);
2187*495ae853SAndroid Build Coastguard Worker INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
2188*495ae853SAndroid Build Coastguard Worker
2189*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2190*495ae853SAndroid Build Coastguard Worker /* Residual 4x4 decoding: SubBlock 2 */
2191*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2192*495ae853SAndroid Build Coastguard Worker u4_idx += (u4_sub_block_strd - 1);
2193*495ae853SAndroid Build Coastguard Worker if(u1_tran_form8x8)
2194*495ae853SAndroid Build Coastguard Worker {
2195*495ae853SAndroid Build Coastguard Worker if(!u1_mb_field_decodingflag)
2196*495ae853SAndroid Build Coastguard Worker {
2197*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2198*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2];
2199*495ae853SAndroid Build Coastguard Worker }
2200*495ae853SAndroid Build Coastguard Worker else
2201*495ae853SAndroid Build Coastguard Worker {
2202*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2203*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2];
2204*495ae853SAndroid Build Coastguard Worker }
2205*495ae853SAndroid Build Coastguard Worker }
2206*495ae853SAndroid Build Coastguard Worker else
2207*495ae853SAndroid Build Coastguard Worker {
2208*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK);
2209*495ae853SAndroid Build Coastguard Worker }
2210*495ae853SAndroid Build Coastguard Worker u4_n = u4_top0;
2211*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
2212*495ae853SAndroid Build Coastguard Worker u4_n, ps_dec, &u4_num_coeff);
2213*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2214*495ae853SAndroid Build Coastguard Worker return ret;
2215*495ae853SAndroid Build Coastguard Worker
2216*495ae853SAndroid Build Coastguard Worker pu1_top_nnz[0] = u4_num_coeff;
2217*495ae853SAndroid Build Coastguard Worker u4_subblock_coded = (u4_num_coeff != 0);
2218*495ae853SAndroid Build Coastguard Worker INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
2219*495ae853SAndroid Build Coastguard Worker
2220*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2221*495ae853SAndroid Build Coastguard Worker /* Residual 4x4 decoding: SubBlock 3 */
2222*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2223*495ae853SAndroid Build Coastguard Worker u4_idx++;
2224*495ae853SAndroid Build Coastguard Worker if(u1_tran_form8x8)
2225*495ae853SAndroid Build Coastguard Worker {
2226*495ae853SAndroid Build Coastguard Worker if(!u1_mb_field_decodingflag)
2227*495ae853SAndroid Build Coastguard Worker {
2228*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2229*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3];
2230*495ae853SAndroid Build Coastguard Worker }
2231*495ae853SAndroid Build Coastguard Worker else
2232*495ae853SAndroid Build Coastguard Worker {
2233*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2234*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3];
2235*495ae853SAndroid Build Coastguard Worker }
2236*495ae853SAndroid Build Coastguard Worker }
2237*495ae853SAndroid Build Coastguard Worker else
2238*495ae853SAndroid Build Coastguard Worker {
2239*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
2240*495ae853SAndroid Build Coastguard Worker }
2241*495ae853SAndroid Build Coastguard Worker u4_n = (u4_top1 + u4_num_coeff + 1) >> 1;
2242*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
2243*495ae853SAndroid Build Coastguard Worker u4_n, ps_dec, &u4_num_coeff);
2244*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2245*495ae853SAndroid Build Coastguard Worker return ret;
2246*495ae853SAndroid Build Coastguard Worker
2247*495ae853SAndroid Build Coastguard Worker pu1_top_nnz[1] = pu1_left_nnz[1] = u4_num_coeff;
2248*495ae853SAndroid Build Coastguard Worker u4_subblock_coded = (u4_num_coeff != 0);
2249*495ae853SAndroid Build Coastguard Worker INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
2250*495ae853SAndroid Build Coastguard Worker
2251*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan = puc_temp;
2252*495ae853SAndroid Build Coastguard Worker
2253*495ae853SAndroid Build Coastguard Worker return OK;
2254*495ae853SAndroid Build Coastguard Worker }
2255*495ae853SAndroid Build Coastguard Worker
2256*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2257*495ae853SAndroid Build Coastguard Worker /* */
2258*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_cavlc_parse_8x8block_none_available */
2259*495ae853SAndroid Build Coastguard Worker /* */
2260*495ae853SAndroid Build Coastguard Worker /* Description : This function does the residual parsing of 4 subblocks */
2261*495ae853SAndroid Build Coastguard Worker /* in a 8x8 block when none of the neigbours are available */
2262*495ae853SAndroid Build Coastguard Worker /* */
2263*495ae853SAndroid Build Coastguard Worker /* Inputs : pi2_coeff_block : pointer to residual block where */
2264*495ae853SAndroid Build Coastguard Worker /* decoded and inverse scan coefficients are updated */
2265*495ae853SAndroid Build Coastguard Worker /* */
2266*495ae853SAndroid Build Coastguard Worker /* u4_sub_block_strd : indicates the number of sublocks */
2267*495ae853SAndroid Build Coastguard Worker /* in a row. It is 4 for luma and 2 for chroma. */
2268*495ae853SAndroid Build Coastguard Worker /* */
2269*495ae853SAndroid Build Coastguard Worker /* u4_isdc : required to indicate 4x4 parse modules if the */
2270*495ae853SAndroid Build Coastguard Worker /* current Mb is I_16x16/chroma DC coded. */
2271*495ae853SAndroid Build Coastguard Worker /* */
2272*495ae853SAndroid Build Coastguard Worker /* ps_dec : pointer to Decstruct (decoder context) */
2273*495ae853SAndroid Build Coastguard Worker /* */
2274*495ae853SAndroid Build Coastguard Worker /* pu1_top_nnz : top nnz pointer */
2275*495ae853SAndroid Build Coastguard Worker /* */
2276*495ae853SAndroid Build Coastguard Worker /* pu1_left_nnz : left nnz pointer */
2277*495ae853SAndroid Build Coastguard Worker /* */
2278*495ae853SAndroid Build Coastguard Worker /* Globals : No */
2279*495ae853SAndroid Build Coastguard Worker /* Processing : Parsing for four subblocks in unrolled, top and left nnz */
2280*495ae853SAndroid Build Coastguard Worker /* are updated on the fly. csbp is set in accordance to */
2281*495ae853SAndroid Build Coastguard Worker /* decoded numcoeff for the subblock index in raster order */
2282*495ae853SAndroid Build Coastguard Worker /* */
2283*495ae853SAndroid Build Coastguard Worker /* Outputs : The updated residue buffer, nnzs and csbp current block */
2284*495ae853SAndroid Build Coastguard Worker /* */
2285*495ae853SAndroid Build Coastguard Worker /* Returns : Returns the coded sub block pattern csbp for the block */
2286*495ae853SAndroid Build Coastguard Worker /* */
2287*495ae853SAndroid Build Coastguard Worker /* Issues : <List any issues or problems with this function> */
2288*495ae853SAndroid Build Coastguard Worker /* */
2289*495ae853SAndroid Build Coastguard Worker /* Revision History: */
2290*495ae853SAndroid Build Coastguard Worker /* */
2291*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
2292*495ae853SAndroid Build Coastguard Worker /* 09 10 2008 Jay Draft */
2293*495ae853SAndroid Build Coastguard Worker /* */
2294*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_cavlc_parse_8x8block_none_available(WORD16 * pi2_coeff_block,UWORD32 u4_sub_block_strd,UWORD32 u4_isdc,dec_struct_t * ps_dec,UWORD8 * pu1_top_nnz,UWORD8 * pu1_left_nnz,UWORD8 u1_tran_form8x8,UWORD8 u1_mb_field_decodingflag,UWORD32 * pu4_csbp)2295*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_cavlc_parse_8x8block_none_available(WORD16 *pi2_coeff_block,
2296*495ae853SAndroid Build Coastguard Worker UWORD32 u4_sub_block_strd,
2297*495ae853SAndroid Build Coastguard Worker UWORD32 u4_isdc,
2298*495ae853SAndroid Build Coastguard Worker dec_struct_t * ps_dec,
2299*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_top_nnz,
2300*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_left_nnz,
2301*495ae853SAndroid Build Coastguard Worker UWORD8 u1_tran_form8x8,
2302*495ae853SAndroid Build Coastguard Worker UWORD8 u1_mb_field_decodingflag,
2303*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_csbp)
2304*495ae853SAndroid Build Coastguard Worker {
2305*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_coeff, u4_n, u4_subblock_coded;
2306*495ae853SAndroid Build Coastguard Worker UWORD32 u4_top0, u4_top1;
2307*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_dummy;
2308*495ae853SAndroid Build Coastguard Worker WORD32 (**pf_cavlc_parse4x4coeff)(WORD16 *pi2_coeff_block,
2309*495ae853SAndroid Build Coastguard Worker UWORD32 u4_isdc,
2310*495ae853SAndroid Build Coastguard Worker WORD32 u4_n,
2311*495ae853SAndroid Build Coastguard Worker struct _DecStruct *ps_dec,
2312*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_dummy) =
2313*495ae853SAndroid Build Coastguard Worker ps_dec->pf_cavlc_parse4x4coeff;
2314*495ae853SAndroid Build Coastguard Worker UWORD32 u4_idx = 0;
2315*495ae853SAndroid Build Coastguard Worker UWORD8 *puc_temp;
2316*495ae853SAndroid Build Coastguard Worker WORD32 ret;
2317*495ae853SAndroid Build Coastguard Worker
2318*495ae853SAndroid Build Coastguard Worker *pu4_csbp = 0;
2319*495ae853SAndroid Build Coastguard Worker puc_temp = ps_dec->pu1_inv_scan;
2320*495ae853SAndroid Build Coastguard Worker
2321*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2322*495ae853SAndroid Build Coastguard Worker /* Residual 4x4 decoding: SubBlock 0 */
2323*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2324*495ae853SAndroid Build Coastguard Worker if(u1_tran_form8x8)
2325*495ae853SAndroid Build Coastguard Worker {
2326*495ae853SAndroid Build Coastguard Worker if(!u1_mb_field_decodingflag)
2327*495ae853SAndroid Build Coastguard Worker {
2328*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2329*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0];
2330*495ae853SAndroid Build Coastguard Worker }
2331*495ae853SAndroid Build Coastguard Worker else
2332*495ae853SAndroid Build Coastguard Worker {
2333*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2334*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0];
2335*495ae853SAndroid Build Coastguard Worker }
2336*495ae853SAndroid Build Coastguard Worker }
2337*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse4x4coeff[0](pi2_coeff_block, u4_isdc, 0,
2338*495ae853SAndroid Build Coastguard Worker ps_dec, &u4_num_coeff);
2339*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2340*495ae853SAndroid Build Coastguard Worker return ret;
2341*495ae853SAndroid Build Coastguard Worker
2342*495ae853SAndroid Build Coastguard Worker u4_top0 = u4_num_coeff;
2343*495ae853SAndroid Build Coastguard Worker u4_subblock_coded = (u4_num_coeff != 0);
2344*495ae853SAndroid Build Coastguard Worker INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
2345*495ae853SAndroid Build Coastguard Worker
2346*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2347*495ae853SAndroid Build Coastguard Worker /* Residual 4x4 decoding: SubBlock 1 */
2348*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2349*495ae853SAndroid Build Coastguard Worker u4_idx++;
2350*495ae853SAndroid Build Coastguard Worker if(u1_tran_form8x8)
2351*495ae853SAndroid Build Coastguard Worker {
2352*495ae853SAndroid Build Coastguard Worker if(!u1_mb_field_decodingflag)
2353*495ae853SAndroid Build Coastguard Worker {
2354*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2355*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1];
2356*495ae853SAndroid Build Coastguard Worker }
2357*495ae853SAndroid Build Coastguard Worker else
2358*495ae853SAndroid Build Coastguard Worker {
2359*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2360*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1];
2361*495ae853SAndroid Build Coastguard Worker }
2362*495ae853SAndroid Build Coastguard Worker }
2363*495ae853SAndroid Build Coastguard Worker else
2364*495ae853SAndroid Build Coastguard Worker {
2365*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
2366*495ae853SAndroid Build Coastguard Worker }
2367*495ae853SAndroid Build Coastguard Worker u4_n = u4_num_coeff;
2368*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
2369*495ae853SAndroid Build Coastguard Worker u4_n, ps_dec, &u4_num_coeff);
2370*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2371*495ae853SAndroid Build Coastguard Worker return ret;
2372*495ae853SAndroid Build Coastguard Worker
2373*495ae853SAndroid Build Coastguard Worker u4_top1 = pu1_left_nnz[0] = u4_num_coeff;
2374*495ae853SAndroid Build Coastguard Worker u4_subblock_coded = (u4_num_coeff != 0);
2375*495ae853SAndroid Build Coastguard Worker INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
2376*495ae853SAndroid Build Coastguard Worker
2377*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2378*495ae853SAndroid Build Coastguard Worker /* Residual 4x4 decoding: SubBlock 2 */
2379*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2380*495ae853SAndroid Build Coastguard Worker u4_idx += (u4_sub_block_strd - 1);
2381*495ae853SAndroid Build Coastguard Worker if(u1_tran_form8x8)
2382*495ae853SAndroid Build Coastguard Worker {
2383*495ae853SAndroid Build Coastguard Worker if(!u1_mb_field_decodingflag)
2384*495ae853SAndroid Build Coastguard Worker {
2385*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2386*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2];
2387*495ae853SAndroid Build Coastguard Worker }
2388*495ae853SAndroid Build Coastguard Worker else
2389*495ae853SAndroid Build Coastguard Worker {
2390*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2391*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2];
2392*495ae853SAndroid Build Coastguard Worker }
2393*495ae853SAndroid Build Coastguard Worker }
2394*495ae853SAndroid Build Coastguard Worker else
2395*495ae853SAndroid Build Coastguard Worker {
2396*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK);
2397*495ae853SAndroid Build Coastguard Worker }
2398*495ae853SAndroid Build Coastguard Worker u4_n = u4_top0;
2399*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
2400*495ae853SAndroid Build Coastguard Worker u4_n, ps_dec, &u4_num_coeff);
2401*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2402*495ae853SAndroid Build Coastguard Worker return ret;
2403*495ae853SAndroid Build Coastguard Worker
2404*495ae853SAndroid Build Coastguard Worker pu1_top_nnz[0] = u4_num_coeff;
2405*495ae853SAndroid Build Coastguard Worker u4_subblock_coded = (u4_num_coeff != 0);
2406*495ae853SAndroid Build Coastguard Worker INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
2407*495ae853SAndroid Build Coastguard Worker
2408*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2409*495ae853SAndroid Build Coastguard Worker /* Residual 4x4 decoding: SubBlock 3 */
2410*495ae853SAndroid Build Coastguard Worker /*------------------------------------------------------*/
2411*495ae853SAndroid Build Coastguard Worker u4_idx++;
2412*495ae853SAndroid Build Coastguard Worker if(u1_tran_form8x8)
2413*495ae853SAndroid Build Coastguard Worker {
2414*495ae853SAndroid Build Coastguard Worker if(!u1_mb_field_decodingflag)
2415*495ae853SAndroid Build Coastguard Worker {
2416*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2417*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3];
2418*495ae853SAndroid Build Coastguard Worker }
2419*495ae853SAndroid Build Coastguard Worker else
2420*495ae853SAndroid Build Coastguard Worker {
2421*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan =
2422*495ae853SAndroid Build Coastguard Worker (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3];
2423*495ae853SAndroid Build Coastguard Worker }
2424*495ae853SAndroid Build Coastguard Worker }
2425*495ae853SAndroid Build Coastguard Worker else
2426*495ae853SAndroid Build Coastguard Worker {
2427*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
2428*495ae853SAndroid Build Coastguard Worker }
2429*495ae853SAndroid Build Coastguard Worker u4_n = (u4_top1 + u4_num_coeff + 1) >> 1;
2430*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
2431*495ae853SAndroid Build Coastguard Worker u4_n, ps_dec, &u4_num_coeff);
2432*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2433*495ae853SAndroid Build Coastguard Worker return ret;
2434*495ae853SAndroid Build Coastguard Worker
2435*495ae853SAndroid Build Coastguard Worker pu1_top_nnz[1] = pu1_left_nnz[1] = u4_num_coeff;
2436*495ae853SAndroid Build Coastguard Worker u4_subblock_coded = (u4_num_coeff != 0);
2437*495ae853SAndroid Build Coastguard Worker INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
2438*495ae853SAndroid Build Coastguard Worker
2439*495ae853SAndroid Build Coastguard Worker ps_dec->pu1_inv_scan = puc_temp;
2440*495ae853SAndroid Build Coastguard Worker
2441*495ae853SAndroid Build Coastguard Worker return OK;
2442*495ae853SAndroid Build Coastguard Worker }
2443*495ae853SAndroid Build Coastguard Worker
2444*495ae853SAndroid Build Coastguard Worker /*!
2445*495ae853SAndroid Build Coastguard Worker **************************************************************************
2446*495ae853SAndroid Build Coastguard Worker * \if Function name : ih264d_parse_residual4x4_cavlc \endif
2447*495ae853SAndroid Build Coastguard Worker *
2448*495ae853SAndroid Build Coastguard Worker * \brief
2449*495ae853SAndroid Build Coastguard Worker * This function parses CAVLC syntax of a Luma and Chroma AC Residuals.
2450*495ae853SAndroid Build Coastguard Worker *
2451*495ae853SAndroid Build Coastguard Worker * \return
2452*495ae853SAndroid Build Coastguard Worker * 0 on Success and Error code otherwise
2453*495ae853SAndroid Build Coastguard Worker **************************************************************************
2454*495ae853SAndroid Build Coastguard Worker */
2455*495ae853SAndroid Build Coastguard Worker
ih264d_parse_residual4x4_cavlc(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD8 u1_offset)2456*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_parse_residual4x4_cavlc(dec_struct_t * ps_dec,
2457*495ae853SAndroid Build Coastguard Worker dec_mb_info_t *ps_cur_mb_info,
2458*495ae853SAndroid Build Coastguard Worker UWORD8 u1_offset)
2459*495ae853SAndroid Build Coastguard Worker {
2460*495ae853SAndroid Build Coastguard Worker UWORD8 u1_cbp = ps_cur_mb_info->u1_cbp;
2461*495ae853SAndroid Build Coastguard Worker UWORD16 ui16_csbp = 0;
2462*495ae853SAndroid Build Coastguard Worker UWORD32 u4_nbr_avl;
2463*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_residual_buf;
2464*495ae853SAndroid Build Coastguard Worker
2465*495ae853SAndroid Build Coastguard Worker UWORD8 u1_is_top_mb_avail;
2466*495ae853SAndroid Build Coastguard Worker UWORD8 u1_is_left_mb_avail;
2467*495ae853SAndroid Build Coastguard Worker
2468*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_top_nnz = ps_cur_mb_info->ps_curmb->pu1_nnz_y;
2469*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_left_nnz = ps_dec->pu1_left_nnz_y;
2470*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_coeff_block = NULL;
2471*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_dummy;
2472*495ae853SAndroid Build Coastguard Worker WORD32 ret;
2473*495ae853SAndroid Build Coastguard Worker
2474*495ae853SAndroid Build Coastguard Worker WORD32 (**pf_cavlc_parse_8x8block)(WORD16 *pi2_coeff_block,
2475*495ae853SAndroid Build Coastguard Worker UWORD32 u4_sub_block_strd,
2476*495ae853SAndroid Build Coastguard Worker UWORD32 u4_isdc,
2477*495ae853SAndroid Build Coastguard Worker struct _DecStruct *ps_dec,
2478*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_top_nnz,
2479*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_left_nnz,
2480*495ae853SAndroid Build Coastguard Worker UWORD8 u1_tran_form8x8,
2481*495ae853SAndroid Build Coastguard Worker UWORD8 u1_mb_field_decodingflag,
2482*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_dummy) = ps_dec->pf_cavlc_parse_8x8block;
2483*495ae853SAndroid Build Coastguard Worker
2484*495ae853SAndroid Build Coastguard Worker
2485*495ae853SAndroid Build Coastguard Worker {
2486*495ae853SAndroid Build Coastguard Worker UWORD8 uc_temp = ps_dec->u1_mb_ngbr_availablity;
2487*495ae853SAndroid Build Coastguard Worker u1_is_top_mb_avail = BOOLEAN(uc_temp & TOP_MB_AVAILABLE_MASK);
2488*495ae853SAndroid Build Coastguard Worker u1_is_left_mb_avail = BOOLEAN(uc_temp & LEFT_MB_AVAILABLE_MASK);
2489*495ae853SAndroid Build Coastguard Worker u4_nbr_avl = (u1_is_top_mb_avail << 1) | u1_is_left_mb_avail;
2490*495ae853SAndroid Build Coastguard Worker }
2491*495ae853SAndroid Build Coastguard Worker
2492*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_qp_div6 = ps_dec->u1_qp_y_div6;
2493*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_qp_rem6 = ps_dec->u1_qp_y_rem6;
2494*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_qpc_div6 = ps_dec->u1_qp_u_div6;
2495*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_qpc_rem6 = ps_dec->u1_qp_u_rem6;
2496*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_qpcr_div6 = ps_dec->u1_qp_v_div6;
2497*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_qpcr_rem6 = ps_dec->u1_qp_v_rem6;
2498*495ae853SAndroid Build Coastguard Worker
2499*495ae853SAndroid Build Coastguard Worker if(u1_cbp & 0xf)
2500*495ae853SAndroid Build Coastguard Worker {
2501*495ae853SAndroid Build Coastguard Worker pu1_top_nnz[0] = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[0];
2502*495ae853SAndroid Build Coastguard Worker pu1_top_nnz[1] = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[1];
2503*495ae853SAndroid Build Coastguard Worker pu1_top_nnz[2] = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[2];
2504*495ae853SAndroid Build Coastguard Worker pu1_top_nnz[3] = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[3];
2505*495ae853SAndroid Build Coastguard Worker
2506*495ae853SAndroid Build Coastguard Worker /*******************************************************************/
2507*495ae853SAndroid Build Coastguard Worker /* Block 0 residual decoding, check cbp and proceed (subblock = 0) */
2508*495ae853SAndroid Build Coastguard Worker /*******************************************************************/
2509*495ae853SAndroid Build Coastguard Worker if(!(u1_cbp & 0x1))
2510*495ae853SAndroid Build Coastguard Worker {
2511*495ae853SAndroid Build Coastguard Worker *(UWORD16 *)(pu1_top_nnz) = 0;
2512*495ae853SAndroid Build Coastguard Worker *(UWORD16 *)(pu1_left_nnz) = 0;
2513*495ae853SAndroid Build Coastguard Worker
2514*495ae853SAndroid Build Coastguard Worker }
2515*495ae853SAndroid Build Coastguard Worker else
2516*495ae853SAndroid Build Coastguard Worker {
2517*495ae853SAndroid Build Coastguard Worker UWORD32 u4_temp;
2518*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse_8x8block[u4_nbr_avl](
2519*495ae853SAndroid Build Coastguard Worker pi2_coeff_block, 4, u1_offset, ps_dec, pu1_top_nnz,
2520*495ae853SAndroid Build Coastguard Worker pu1_left_nnz, ps_cur_mb_info->u1_tran_form8x8,
2521*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_mb_field_decodingflag, &u4_temp);
2522*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2523*495ae853SAndroid Build Coastguard Worker return ret;
2524*495ae853SAndroid Build Coastguard Worker ui16_csbp = u4_temp;
2525*495ae853SAndroid Build Coastguard Worker }
2526*495ae853SAndroid Build Coastguard Worker
2527*495ae853SAndroid Build Coastguard Worker /*******************************************************************/
2528*495ae853SAndroid Build Coastguard Worker /* Block 1 residual decoding, check cbp and proceed (subblock = 2) */
2529*495ae853SAndroid Build Coastguard Worker /*******************************************************************/
2530*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_tran_form8x8)
2531*495ae853SAndroid Build Coastguard Worker {
2532*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += 64;
2533*495ae853SAndroid Build Coastguard Worker }
2534*495ae853SAndroid Build Coastguard Worker else
2535*495ae853SAndroid Build Coastguard Worker {
2536*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += (2 * NUM_COEFFS_IN_4x4BLK);
2537*495ae853SAndroid Build Coastguard Worker }
2538*495ae853SAndroid Build Coastguard Worker
2539*495ae853SAndroid Build Coastguard Worker if(!(u1_cbp & 0x2))
2540*495ae853SAndroid Build Coastguard Worker {
2541*495ae853SAndroid Build Coastguard Worker *(UWORD16 *)(pu1_top_nnz + 2) = 0;
2542*495ae853SAndroid Build Coastguard Worker *(UWORD16 *)(pu1_left_nnz) = 0;
2543*495ae853SAndroid Build Coastguard Worker }
2544*495ae853SAndroid Build Coastguard Worker else
2545*495ae853SAndroid Build Coastguard Worker {
2546*495ae853SAndroid Build Coastguard Worker UWORD32 u4_temp = (u4_nbr_avl | 0x1);
2547*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse_8x8block[u4_temp](
2548*495ae853SAndroid Build Coastguard Worker pi2_coeff_block, 4, u1_offset, ps_dec,
2549*495ae853SAndroid Build Coastguard Worker (pu1_top_nnz + 2), pu1_left_nnz,
2550*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_tran_form8x8,
2551*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_mb_field_decodingflag, &u4_temp);
2552*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2553*495ae853SAndroid Build Coastguard Worker return ret;
2554*495ae853SAndroid Build Coastguard Worker ui16_csbp |= (u4_temp << 2);
2555*495ae853SAndroid Build Coastguard Worker }
2556*495ae853SAndroid Build Coastguard Worker
2557*495ae853SAndroid Build Coastguard Worker /*******************************************************************/
2558*495ae853SAndroid Build Coastguard Worker /* Block 2 residual decoding, check cbp and proceed (subblock = 8) */
2559*495ae853SAndroid Build Coastguard Worker /*******************************************************************/
2560*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_tran_form8x8)
2561*495ae853SAndroid Build Coastguard Worker {
2562*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += 64;
2563*495ae853SAndroid Build Coastguard Worker }
2564*495ae853SAndroid Build Coastguard Worker else
2565*495ae853SAndroid Build Coastguard Worker {
2566*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += (6 * NUM_COEFFS_IN_4x4BLK);
2567*495ae853SAndroid Build Coastguard Worker }
2568*495ae853SAndroid Build Coastguard Worker
2569*495ae853SAndroid Build Coastguard Worker if(!(u1_cbp & 0x4))
2570*495ae853SAndroid Build Coastguard Worker {
2571*495ae853SAndroid Build Coastguard Worker *(UWORD16 *)(pu1_top_nnz) = 0;
2572*495ae853SAndroid Build Coastguard Worker *(UWORD16 *)(pu1_left_nnz + 2) = 0;
2573*495ae853SAndroid Build Coastguard Worker }
2574*495ae853SAndroid Build Coastguard Worker else
2575*495ae853SAndroid Build Coastguard Worker {
2576*495ae853SAndroid Build Coastguard Worker UWORD32 u4_temp = (u4_nbr_avl | 0x2);
2577*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse_8x8block[u4_temp](
2578*495ae853SAndroid Build Coastguard Worker pi2_coeff_block, 4, u1_offset, ps_dec, pu1_top_nnz,
2579*495ae853SAndroid Build Coastguard Worker (pu1_left_nnz + 2), ps_cur_mb_info->u1_tran_form8x8,
2580*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_mb_field_decodingflag, &u4_temp);
2581*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2582*495ae853SAndroid Build Coastguard Worker return ret;
2583*495ae853SAndroid Build Coastguard Worker ui16_csbp |= (u4_temp << 8);
2584*495ae853SAndroid Build Coastguard Worker }
2585*495ae853SAndroid Build Coastguard Worker
2586*495ae853SAndroid Build Coastguard Worker /*******************************************************************/
2587*495ae853SAndroid Build Coastguard Worker /* Block 3 residual decoding, check cbp and proceed (subblock = 10)*/
2588*495ae853SAndroid Build Coastguard Worker /*******************************************************************/
2589*495ae853SAndroid Build Coastguard Worker if(ps_cur_mb_info->u1_tran_form8x8)
2590*495ae853SAndroid Build Coastguard Worker {
2591*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += 64;
2592*495ae853SAndroid Build Coastguard Worker }
2593*495ae853SAndroid Build Coastguard Worker else
2594*495ae853SAndroid Build Coastguard Worker {
2595*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += (2 * NUM_COEFFS_IN_4x4BLK);
2596*495ae853SAndroid Build Coastguard Worker }
2597*495ae853SAndroid Build Coastguard Worker
2598*495ae853SAndroid Build Coastguard Worker if(!(u1_cbp & 0x8))
2599*495ae853SAndroid Build Coastguard Worker {
2600*495ae853SAndroid Build Coastguard Worker *(UWORD16 *)(pu1_top_nnz + 2) = 0;
2601*495ae853SAndroid Build Coastguard Worker *(UWORD16 *)(pu1_left_nnz + 2) = 0;
2602*495ae853SAndroid Build Coastguard Worker }
2603*495ae853SAndroid Build Coastguard Worker else
2604*495ae853SAndroid Build Coastguard Worker {
2605*495ae853SAndroid Build Coastguard Worker UWORD32 u4_temp;
2606*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse_8x8block[0x3](
2607*495ae853SAndroid Build Coastguard Worker pi2_coeff_block, 4, u1_offset, ps_dec,
2608*495ae853SAndroid Build Coastguard Worker (pu1_top_nnz + 2), (pu1_left_nnz + 2),
2609*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_tran_form8x8,
2610*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u1_mb_field_decodingflag, &u4_temp);
2611*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2612*495ae853SAndroid Build Coastguard Worker return ret;
2613*495ae853SAndroid Build Coastguard Worker ui16_csbp |= (u4_temp << 10);
2614*495ae853SAndroid Build Coastguard Worker }
2615*495ae853SAndroid Build Coastguard Worker }
2616*495ae853SAndroid Build Coastguard Worker else
2617*495ae853SAndroid Build Coastguard Worker {
2618*495ae853SAndroid Build Coastguard Worker *(UWORD32 *)(pu1_top_nnz) = 0;
2619*495ae853SAndroid Build Coastguard Worker *(UWORD32 *)(pu1_left_nnz) = 0;
2620*495ae853SAndroid Build Coastguard Worker }
2621*495ae853SAndroid Build Coastguard Worker
2622*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u2_luma_csbp = ui16_csbp;
2623*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->ps_curmb->u2_luma_csbp = ui16_csbp;
2624*495ae853SAndroid Build Coastguard Worker
2625*495ae853SAndroid Build Coastguard Worker {
2626*495ae853SAndroid Build Coastguard Worker UWORD16 u2_chroma_csbp = 0;
2627*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u2_chroma_csbp = 0;
2628*495ae853SAndroid Build Coastguard Worker pu1_top_nnz = ps_cur_mb_info->ps_curmb->pu1_nnz_uv;
2629*495ae853SAndroid Build Coastguard Worker pu1_left_nnz = ps_dec->pu1_left_nnz_uv;
2630*495ae853SAndroid Build Coastguard Worker
2631*495ae853SAndroid Build Coastguard Worker u1_cbp >>= 4;
2632*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
2633*495ae853SAndroid Build Coastguard Worker /* if Chroma Component not present OR no ac values present */
2634*495ae853SAndroid Build Coastguard Worker /* Set the values of N to zero */
2635*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
2636*495ae853SAndroid Build Coastguard Worker if(u1_cbp == CBPC_ALLZERO || u1_cbp == CBPC_ACZERO)
2637*495ae853SAndroid Build Coastguard Worker {
2638*495ae853SAndroid Build Coastguard Worker *(UWORD32 *)(pu1_top_nnz) = 0;
2639*495ae853SAndroid Build Coastguard Worker *(UWORD32 *)(pu1_left_nnz) = 0;
2640*495ae853SAndroid Build Coastguard Worker }
2641*495ae853SAndroid Build Coastguard Worker
2642*495ae853SAndroid Build Coastguard Worker if(u1_cbp == CBPC_ALLZERO)
2643*495ae853SAndroid Build Coastguard Worker {
2644*495ae853SAndroid Build Coastguard Worker return (0);
2645*495ae853SAndroid Build Coastguard Worker }
2646*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
2647*495ae853SAndroid Build Coastguard Worker /* Decode Chroma DC values */
2648*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
2649*495ae853SAndroid Build Coastguard Worker {
2650*495ae853SAndroid Build Coastguard Worker WORD32 u4_scale_u;
2651*495ae853SAndroid Build Coastguard Worker WORD32 u4_scale_v;
2652*495ae853SAndroid Build Coastguard Worker WORD32 i4_mb_inter_inc;
2653*495ae853SAndroid Build Coastguard Worker u4_scale_u = ps_dec->pu2_quant_scale_u[0] << ps_dec->u1_qp_u_div6;
2654*495ae853SAndroid Build Coastguard Worker u4_scale_v = ps_dec->pu2_quant_scale_v[0] << ps_dec->u1_qp_v_div6;
2655*495ae853SAndroid Build Coastguard Worker i4_mb_inter_inc = (!((ps_cur_mb_info->ps_curmb->u1_mb_type == I_4x4_MB)
2656*495ae853SAndroid Build Coastguard Worker || (ps_cur_mb_info->ps_curmb->u1_mb_type == I_16x16_MB)))
2657*495ae853SAndroid Build Coastguard Worker * 3;
2658*495ae853SAndroid Build Coastguard Worker
2659*495ae853SAndroid Build Coastguard Worker if(ps_dec->s_high_profile.u1_scaling_present)
2660*495ae853SAndroid Build Coastguard Worker {
2661*495ae853SAndroid Build Coastguard Worker u4_scale_u *=
2662*495ae853SAndroid Build Coastguard Worker ps_dec->s_high_profile.i2_scalinglist4x4[i4_mb_inter_inc
2663*495ae853SAndroid Build Coastguard Worker + 1][0];
2664*495ae853SAndroid Build Coastguard Worker u4_scale_v *=
2665*495ae853SAndroid Build Coastguard Worker ps_dec->s_high_profile.i2_scalinglist4x4[i4_mb_inter_inc
2666*495ae853SAndroid Build Coastguard Worker + 2][0];
2667*495ae853SAndroid Build Coastguard Worker
2668*495ae853SAndroid Build Coastguard Worker }
2669*495ae853SAndroid Build Coastguard Worker else
2670*495ae853SAndroid Build Coastguard Worker {
2671*495ae853SAndroid Build Coastguard Worker u4_scale_u <<= 4;
2672*495ae853SAndroid Build Coastguard Worker u4_scale_v <<= 4;
2673*495ae853SAndroid Build Coastguard Worker }
2674*495ae853SAndroid Build Coastguard Worker
2675*495ae853SAndroid Build Coastguard Worker ih264d_cavlc_parse_chroma_dc(ps_cur_mb_info,pi2_coeff_block, ps_dec->ps_bitstrm,
2676*495ae853SAndroid Build Coastguard Worker u4_scale_u, u4_scale_v,
2677*495ae853SAndroid Build Coastguard Worker i4_mb_inter_inc);
2678*495ae853SAndroid Build Coastguard Worker }
2679*495ae853SAndroid Build Coastguard Worker
2680*495ae853SAndroid Build Coastguard Worker if(u1_cbp == CBPC_ACZERO)
2681*495ae853SAndroid Build Coastguard Worker return (0);
2682*495ae853SAndroid Build Coastguard Worker
2683*495ae853SAndroid Build Coastguard Worker pu1_top_nnz[0] = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv[0];
2684*495ae853SAndroid Build Coastguard Worker pu1_top_nnz[1] = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv[1];
2685*495ae853SAndroid Build Coastguard Worker pu1_top_nnz[2] = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv[2];
2686*495ae853SAndroid Build Coastguard Worker pu1_top_nnz[3] = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv[3];
2687*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
2688*495ae853SAndroid Build Coastguard Worker /* Decode Chroma AC values */
2689*495ae853SAndroid Build Coastguard Worker /*--------------------------------------------------------------------*/
2690*495ae853SAndroid Build Coastguard Worker {
2691*495ae853SAndroid Build Coastguard Worker UWORD32 u4_temp;
2692*495ae853SAndroid Build Coastguard Worker /*****************************************************************/
2693*495ae853SAndroid Build Coastguard Worker /* U Block residual decoding, check cbp and proceed (subblock=0)*/
2694*495ae853SAndroid Build Coastguard Worker /*****************************************************************/
2695*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse_8x8block[u4_nbr_avl](
2696*495ae853SAndroid Build Coastguard Worker pi2_coeff_block, 2, 1, ps_dec, pu1_top_nnz,
2697*495ae853SAndroid Build Coastguard Worker pu1_left_nnz, 0, 0, &u4_temp);
2698*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2699*495ae853SAndroid Build Coastguard Worker return ret;
2700*495ae853SAndroid Build Coastguard Worker u2_chroma_csbp = u4_temp;
2701*495ae853SAndroid Build Coastguard Worker
2702*495ae853SAndroid Build Coastguard Worker pi2_coeff_block += MB_CHROM_SIZE;
2703*495ae853SAndroid Build Coastguard Worker /*****************************************************************/
2704*495ae853SAndroid Build Coastguard Worker /* V Block residual decoding, check cbp and proceed (subblock=1)*/
2705*495ae853SAndroid Build Coastguard Worker /*****************************************************************/
2706*495ae853SAndroid Build Coastguard Worker ret = pf_cavlc_parse_8x8block[u4_nbr_avl](pi2_coeff_block, 2, 1,
2707*495ae853SAndroid Build Coastguard Worker ps_dec,
2708*495ae853SAndroid Build Coastguard Worker (pu1_top_nnz + 2),
2709*495ae853SAndroid Build Coastguard Worker (pu1_left_nnz + 2), 0,
2710*495ae853SAndroid Build Coastguard Worker 0, &u4_temp);
2711*495ae853SAndroid Build Coastguard Worker if(ret != OK)
2712*495ae853SAndroid Build Coastguard Worker return ret;
2713*495ae853SAndroid Build Coastguard Worker u2_chroma_csbp |= (u4_temp << 4);
2714*495ae853SAndroid Build Coastguard Worker }
2715*495ae853SAndroid Build Coastguard Worker
2716*495ae853SAndroid Build Coastguard Worker ps_cur_mb_info->u2_chroma_csbp = u2_chroma_csbp;
2717*495ae853SAndroid Build Coastguard Worker }
2718*495ae853SAndroid Build Coastguard Worker return OK;
2719*495ae853SAndroid Build Coastguard Worker }
2720