xref: /aosp_15_r20/external/libavc/decoder/ih264d_parse_cavlc.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker /*!
21*495ae853SAndroid Build Coastguard Worker  ***************************************************************************
22*495ae853SAndroid Build Coastguard Worker  * \file ih264d_parse_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