xref: /aosp_15_r20/external/libmpeg2/decoder/impeg2d_vld.c (revision a97c2a1f0a796dc32bed80d3353c69c5fc07c750)
1*a97c2a1fSXin Li /******************************************************************************
2*a97c2a1fSXin Li  *
3*a97c2a1fSXin Li  * Copyright (C) 2015 The Android Open Source Project
4*a97c2a1fSXin Li  *
5*a97c2a1fSXin Li  * Licensed under the Apache License, Version 2.0 (the "License");
6*a97c2a1fSXin Li  * you may not use this file except in compliance with the License.
7*a97c2a1fSXin Li  * You may obtain a copy of the License at:
8*a97c2a1fSXin Li  *
9*a97c2a1fSXin Li  * http://www.apache.org/licenses/LICENSE-2.0
10*a97c2a1fSXin Li  *
11*a97c2a1fSXin Li  * Unless required by applicable law or agreed to in writing, software
12*a97c2a1fSXin Li  * distributed under the License is distributed on an "AS IS" BASIS,
13*a97c2a1fSXin Li  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*a97c2a1fSXin Li  * See the License for the specific language governing permissions and
15*a97c2a1fSXin Li  * limitations under the License.
16*a97c2a1fSXin Li  *
17*a97c2a1fSXin Li  *****************************************************************************
18*a97c2a1fSXin Li  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*a97c2a1fSXin Li */
20*a97c2a1fSXin Li #include <string.h>
21*a97c2a1fSXin Li 
22*a97c2a1fSXin Li #include "iv_datatypedef.h"
23*a97c2a1fSXin Li #include "iv.h"
24*a97c2a1fSXin Li 
25*a97c2a1fSXin Li #include "impeg2_buf_mgr.h"
26*a97c2a1fSXin Li #include "impeg2_disp_mgr.h"
27*a97c2a1fSXin Li #include "impeg2_defs.h"
28*a97c2a1fSXin Li #include "impeg2_platform_macros.h"
29*a97c2a1fSXin Li #include "impeg2_inter_pred.h"
30*a97c2a1fSXin Li #include "impeg2_idct.h"
31*a97c2a1fSXin Li #include "impeg2_globals.h"
32*a97c2a1fSXin Li #include "impeg2_mem_func.h"
33*a97c2a1fSXin Li #include "impeg2_format_conv.h"
34*a97c2a1fSXin Li #include "impeg2_macros.h"
35*a97c2a1fSXin Li 
36*a97c2a1fSXin Li #include "ivd.h"
37*a97c2a1fSXin Li #include "impeg2d.h"
38*a97c2a1fSXin Li #include "impeg2d_bitstream.h"
39*a97c2a1fSXin Li #include "impeg2d_structs.h"
40*a97c2a1fSXin Li #include "impeg2d_vld_tables.h"
41*a97c2a1fSXin Li #include "impeg2d_vld.h"
42*a97c2a1fSXin Li #include "impeg2d_pic_proc.h"
43*a97c2a1fSXin Li #include "impeg2d_debug.h"
44*a97c2a1fSXin Li 
45*a97c2a1fSXin Li 
46*a97c2a1fSXin Li /*******************************************************************************
47*a97c2a1fSXin Li * Function name : impeg2d_dec_vld_symbol
48*a97c2a1fSXin Li *
49*a97c2a1fSXin Li * Description   : Performs decoding of VLD symbol. It performs decoding by
50*a97c2a1fSXin Li *                 processing 1 bit at a time
51*a97c2a1fSXin Li *
52*a97c2a1fSXin Li * Arguments     :
53*a97c2a1fSXin Li * stream        : Bitstream
54*a97c2a1fSXin Li * ai2_code_table     : Table used for decoding
55*a97c2a1fSXin Li * maxLen        : Maximum Length of the decoded symbol in bits
56*a97c2a1fSXin Li *
57*a97c2a1fSXin Li * Value Returned: Decoded symbol
58*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_vld_symbol(stream_t * ps_stream,const WORD16 ai2_code_table[][2],UWORD16 u2_max_len)59*a97c2a1fSXin Li WORD16 impeg2d_dec_vld_symbol(stream_t *ps_stream,const WORD16 ai2_code_table[][2],  UWORD16 u2_max_len)
60*a97c2a1fSXin Li {
61*a97c2a1fSXin Li   UWORD16 u2_data;
62*a97c2a1fSXin Li   WORD16  u2_end = 0;
63*a97c2a1fSXin Li   UWORD16 u2_org_max_len = u2_max_len;
64*a97c2a1fSXin Li   UWORD16 u2_i_bit;
65*a97c2a1fSXin Li 
66*a97c2a1fSXin Li   /* Get the maximum number of bits needed to decode a symbol */
67*a97c2a1fSXin Li   u2_data = impeg2d_bit_stream_nxt(ps_stream,u2_max_len);
68*a97c2a1fSXin Li   do
69*a97c2a1fSXin Li   {
70*a97c2a1fSXin Li     u2_max_len--;
71*a97c2a1fSXin Li     /* Read one bit at a time from the variable to decode the huffman code */
72*a97c2a1fSXin Li     u2_i_bit = (UWORD8)((u2_data >> u2_max_len) & 0x1);
73*a97c2a1fSXin Li 
74*a97c2a1fSXin Li     /* Get the next node pointer or the symbol from the tree */
75*a97c2a1fSXin Li     u2_end = ai2_code_table[u2_end][u2_i_bit];
76*a97c2a1fSXin Li   }while(u2_end > 0);
77*a97c2a1fSXin Li 
78*a97c2a1fSXin Li   /* Flush the appropriate number of bits from the ps_stream */
79*a97c2a1fSXin Li   impeg2d_bit_stream_flush(ps_stream,(UWORD8)(u2_org_max_len - u2_max_len));
80*a97c2a1fSXin Li   return(u2_end);
81*a97c2a1fSXin Li }
82*a97c2a1fSXin Li /*******************************************************************************
83*a97c2a1fSXin Li * Function name : impeg2d_fast_dec_vld_symbol
84*a97c2a1fSXin Li *
85*a97c2a1fSXin Li * Description   : Performs decoding of VLD symbol. It performs decoding by
86*a97c2a1fSXin Li *                 processing n bits at a time
87*a97c2a1fSXin Li *
88*a97c2a1fSXin Li * Arguments     :
89*a97c2a1fSXin Li * stream        : Bitstream
90*a97c2a1fSXin Li * ai2_code_table     : Code table containing huffman value
91*a97c2a1fSXin Li * indexTable    : Index table containing index
92*a97c2a1fSXin Li * maxLen        : Maximum Length of the decoded symbol in bits
93*a97c2a1fSXin Li *
94*a97c2a1fSXin Li * Value Returned: Decoded symbol
95*a97c2a1fSXin Li *******************************************************************************/
impeg2d_fast_dec_vld_symbol(stream_t * ps_stream,const WORD16 ai2_code_table[][2],const UWORD16 au2_indexTable[][2],UWORD16 u2_max_len)96*a97c2a1fSXin Li WORD16 impeg2d_fast_dec_vld_symbol(stream_t *ps_stream,
97*a97c2a1fSXin Li                      const WORD16  ai2_code_table[][2],
98*a97c2a1fSXin Li                      const UWORD16 au2_indexTable[][2],
99*a97c2a1fSXin Li                      UWORD16 u2_max_len)
100*a97c2a1fSXin Li {
101*a97c2a1fSXin Li     UWORD16 u2_cur_code;
102*a97c2a1fSXin Li     UWORD16 u2_num_bits;
103*a97c2a1fSXin Li     UWORD16 u2_vld_offset;
104*a97c2a1fSXin Li     UWORD16 u2_start_len;
105*a97c2a1fSXin Li     WORD16  u2_value;
106*a97c2a1fSXin Li     UWORD16 u2_len;
107*a97c2a1fSXin Li     UWORD16 u2_huffCode;
108*a97c2a1fSXin Li 
109*a97c2a1fSXin Li     u2_start_len  = au2_indexTable[0][0];
110*a97c2a1fSXin Li     u2_vld_offset = 0;
111*a97c2a1fSXin Li     u2_huffCode  = impeg2d_bit_stream_nxt(ps_stream,u2_max_len);
112*a97c2a1fSXin Li     do
113*a97c2a1fSXin Li     {
114*a97c2a1fSXin Li         u2_cur_code = u2_huffCode >> (u2_max_len - u2_start_len);
115*a97c2a1fSXin Li         u2_num_bits = ai2_code_table[u2_cur_code + u2_vld_offset][0];
116*a97c2a1fSXin Li         if(u2_num_bits == 0)
117*a97c2a1fSXin Li         {
118*a97c2a1fSXin Li             u2_huffCode  &= ((1 << (u2_max_len - u2_start_len)) - 1);
119*a97c2a1fSXin Li             u2_max_len    -= u2_start_len;
120*a97c2a1fSXin Li             u2_start_len   = au2_indexTable[ai2_code_table[u2_cur_code + u2_vld_offset][1]][0];
121*a97c2a1fSXin Li             u2_vld_offset  = au2_indexTable[ai2_code_table[u2_cur_code + u2_vld_offset][1]][1];
122*a97c2a1fSXin Li         }
123*a97c2a1fSXin Li         else
124*a97c2a1fSXin Li         {
125*a97c2a1fSXin Li             u2_value = ai2_code_table[u2_cur_code + u2_vld_offset][1];
126*a97c2a1fSXin Li             u2_len   = u2_num_bits;
127*a97c2a1fSXin Li         }
128*a97c2a1fSXin Li     }while(u2_num_bits == 0);
129*a97c2a1fSXin Li     impeg2d_bit_stream_flush(ps_stream,u2_len);
130*a97c2a1fSXin Li     return(u2_value);
131*a97c2a1fSXin Li }
132*a97c2a1fSXin Li /******************************************************************************
133*a97c2a1fSXin Li *
134*a97c2a1fSXin Li *  Function Name   : impeg2d_dec_ac_coeff_zero
135*a97c2a1fSXin Li *
136*a97c2a1fSXin Li *  Description     : Decodes using Table B.14
137*a97c2a1fSXin Li *
138*a97c2a1fSXin Li *  Arguments       : Pointer to VideoObjectLayerStructure
139*a97c2a1fSXin Li *
140*a97c2a1fSXin Li *  Values Returned : Decoded value
141*a97c2a1fSXin Li *
142*a97c2a1fSXin Li *  Revision History:
143*a97c2a1fSXin Li *
144*a97c2a1fSXin Li *         28 02 2002  AR        Creation
145*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_ac_coeff_zero(stream_t * ps_stream,UWORD16 * pu2_sym_len,UWORD16 * pu2_sym_val)146*a97c2a1fSXin Li UWORD16 impeg2d_dec_ac_coeff_zero(stream_t *ps_stream, UWORD16* pu2_sym_len, UWORD16* pu2_sym_val)
147*a97c2a1fSXin Li {
148*a97c2a1fSXin Li     UWORD16 u2_offset,u2_decoded_value;
149*a97c2a1fSXin Li     UWORD8  u1_shift;
150*a97c2a1fSXin Li     UWORD32 u4_bits_read;
151*a97c2a1fSXin Li 
152*a97c2a1fSXin Li     u4_bits_read = (UWORD16)impeg2d_bit_stream_nxt(ps_stream,MPEG2_AC_COEFF_MAX_LEN);
153*a97c2a1fSXin Li 
154*a97c2a1fSXin Li     if ((UWORD16)u4_bits_read >= 0x0800)
155*a97c2a1fSXin Li     {
156*a97c2a1fSXin Li         u2_offset = (UWORD16)u4_bits_read >> 11;
157*a97c2a1fSXin Li     }
158*a97c2a1fSXin Li     else if ((UWORD16)u4_bits_read >= 0x40)
159*a97c2a1fSXin Li     {
160*a97c2a1fSXin Li         u2_offset = 31 + ((UWORD16)u4_bits_read >> 6);
161*a97c2a1fSXin Li     }
162*a97c2a1fSXin Li     else if ((UWORD16)u4_bits_read >= 0x20)
163*a97c2a1fSXin Li     {
164*a97c2a1fSXin Li         u2_offset = 64;
165*a97c2a1fSXin Li     }
166*a97c2a1fSXin Li     else
167*a97c2a1fSXin Li     {
168*a97c2a1fSXin Li         u2_offset      = 63;
169*a97c2a1fSXin Li         u4_bits_read    = (UWORD16)u4_bits_read - 0x10;
170*a97c2a1fSXin Li     }
171*a97c2a1fSXin Li     /*-----------------------------------------------------------------------
172*a97c2a1fSXin Li      * The table gOffset contains both the offset for the group to which the
173*a97c2a1fSXin Li      * Vld code belongs in the Ac Coeff Table and the no of bits with which
174*a97c2a1fSXin Li      * the BitsRead should be shifted
175*a97c2a1fSXin Li      *-----------------------------------------------------------------------*/
176*a97c2a1fSXin Li     u2_offset = gau2_impeg2d_offset_zero[u2_offset];
177*a97c2a1fSXin Li     u1_shift  = u2_offset & 0xF;
178*a97c2a1fSXin Li 
179*a97c2a1fSXin Li     /*-----------------------------------------------------------------------
180*a97c2a1fSXin Li      * Depending upon the vld code, we index exactly to that particular
181*a97c2a1fSXin Li      * Vld codes value in the Ac Coeff Table.
182*a97c2a1fSXin Li      * (Offset >> 4)       gives the offset for the group in the AcCoeffTable.
183*a97c2a1fSXin Li      * (BitsRead >> shift) gives the offset within its group
184*a97c2a1fSXin Li      *-----------------------------------------------------------------------*/
185*a97c2a1fSXin Li      u2_offset = (u2_offset >> 4) + ((UWORD16)u4_bits_read >> u1_shift);
186*a97c2a1fSXin Li     /*-----------------------------------------------------------------------
187*a97c2a1fSXin Li      * DecodedValue has the Run, Level and the number of bits used by Vld code
188*a97c2a1fSXin Li      *-----------------------------------------------------------------------*/
189*a97c2a1fSXin Li     u2_decoded_value = gau2_impeg2d_dct_coeff_zero[u2_offset];
190*a97c2a1fSXin Li     if(u2_decoded_value == END_OF_BLOCK)
191*a97c2a1fSXin Li     {
192*a97c2a1fSXin Li         *pu2_sym_len = 2;
193*a97c2a1fSXin Li         *pu2_sym_val = EOB_CODE_VALUE;
194*a97c2a1fSXin Li     }
195*a97c2a1fSXin Li     else if(u2_decoded_value == ESCAPE_CODE)
196*a97c2a1fSXin Li     {
197*a97c2a1fSXin Li         *pu2_sym_len     = u2_decoded_value & 0x1F;
198*a97c2a1fSXin Li         *pu2_sym_val = ESC_CODE_VALUE;
199*a97c2a1fSXin Li     }
200*a97c2a1fSXin Li     else
201*a97c2a1fSXin Li     {
202*a97c2a1fSXin Li         *pu2_sym_len = u2_decoded_value & 0x1F;
203*a97c2a1fSXin Li         *pu2_sym_val = u2_decoded_value >> 5;
204*a97c2a1fSXin Li     }
205*a97c2a1fSXin Li     return(u2_decoded_value);
206*a97c2a1fSXin Li }
207*a97c2a1fSXin Li 
208*a97c2a1fSXin Li /******************************************************************************
209*a97c2a1fSXin Li *
210*a97c2a1fSXin Li *  Function Name   : impeg2d_dec_ac_coeff_one
211*a97c2a1fSXin Li *
212*a97c2a1fSXin Li *  Description     : Decodes using Table B.15
213*a97c2a1fSXin Li *
214*a97c2a1fSXin Li *  Arguments       : Pointer to VideoObjectLayerStructure
215*a97c2a1fSXin Li *
216*a97c2a1fSXin Li *  Values Returned : Decoded value
217*a97c2a1fSXin Li *
218*a97c2a1fSXin Li *  Revision History:
219*a97c2a1fSXin Li *
220*a97c2a1fSXin Li *         28 02 2002  AR        Creation
221*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_ac_coeff_one(stream_t * ps_stream,UWORD16 * pu2_sym_len,UWORD16 * pu2_sym_val)222*a97c2a1fSXin Li UWORD16 impeg2d_dec_ac_coeff_one(stream_t *ps_stream, UWORD16* pu2_sym_len, UWORD16* pu2_sym_val)
223*a97c2a1fSXin Li {
224*a97c2a1fSXin Li     UWORD16 u2_offset, u2_decoded_value;
225*a97c2a1fSXin Li     UWORD8  u1_shift;
226*a97c2a1fSXin Li     UWORD32 u4_bits_read;
227*a97c2a1fSXin Li 
228*a97c2a1fSXin Li 
229*a97c2a1fSXin Li     u4_bits_read = (UWORD16)impeg2d_bit_stream_nxt(ps_stream,MPEG2_AC_COEFF_MAX_LEN);
230*a97c2a1fSXin Li 
231*a97c2a1fSXin Li     if ((UWORD16)u4_bits_read >= 0x8000)
232*a97c2a1fSXin Li     {
233*a97c2a1fSXin Li         /* If the MSB of the vld code is 1 */
234*a97c2a1fSXin Li         if (((UWORD16)u4_bits_read >> 12) == 0xF)
235*a97c2a1fSXin Li             u2_offset = ((UWORD16)u4_bits_read >> 8) & 0xF;
236*a97c2a1fSXin Li         else
237*a97c2a1fSXin Li             u2_offset = (UWORD16)u4_bits_read >> 11;
238*a97c2a1fSXin Li         u2_offset += gau2_impeg2d_offset_one[0];
239*a97c2a1fSXin Li     }
240*a97c2a1fSXin Li     else if ((UWORD16)u4_bits_read >= 0x400)
241*a97c2a1fSXin Li     {
242*a97c2a1fSXin Li         u2_offset =(UWORD16) u4_bits_read >> 10;
243*a97c2a1fSXin Li         u2_offset = gau2_impeg2d_offset_one[u2_offset];
244*a97c2a1fSXin Li         u1_shift = u2_offset & 0xF;
245*a97c2a1fSXin Li         u2_offset = (u2_offset >> 4) + ((UWORD16)u4_bits_read >> u1_shift);
246*a97c2a1fSXin Li     }
247*a97c2a1fSXin Li     else if ((UWORD16)u4_bits_read >= 0x20)
248*a97c2a1fSXin Li     {
249*a97c2a1fSXin Li         u2_offset = ((UWORD16)u4_bits_read >> 5) + 31;
250*a97c2a1fSXin Li         u2_offset = gau2_impeg2d_offset_one[u2_offset];
251*a97c2a1fSXin Li         u1_shift = u2_offset & 0xF;
252*a97c2a1fSXin Li         u2_offset = (u2_offset >> 4) + ((UWORD16)u4_bits_read >> u1_shift);
253*a97c2a1fSXin Li     }
254*a97c2a1fSXin Li     else
255*a97c2a1fSXin Li     {
256*a97c2a1fSXin Li         u2_offset = gau2_impeg2d_offset_one[63] + ((UWORD16)u4_bits_read & 0xF);
257*a97c2a1fSXin Li     }
258*a97c2a1fSXin Li     /*-----------------------------------------------------------------------
259*a97c2a1fSXin Li     * DecodedValue has the Run, Level and the number of bits used by Vld code
260*a97c2a1fSXin Li     *-----------------------------------------------------------------------*/
261*a97c2a1fSXin Li     u2_decoded_value = gau2_impeg2d_dct_coeff_one[u2_offset];
262*a97c2a1fSXin Li 
263*a97c2a1fSXin Li     if(u2_decoded_value == END_OF_BLOCK)
264*a97c2a1fSXin Li     {
265*a97c2a1fSXin Li         *pu2_sym_len = 4;
266*a97c2a1fSXin Li         *pu2_sym_val = EOB_CODE_VALUE;
267*a97c2a1fSXin Li     }
268*a97c2a1fSXin Li     else if(u2_decoded_value == ESCAPE_CODE)
269*a97c2a1fSXin Li     {
270*a97c2a1fSXin Li         *pu2_sym_len     = u2_decoded_value & 0x1F;
271*a97c2a1fSXin Li         *pu2_sym_val = ESC_CODE_VALUE;
272*a97c2a1fSXin Li     }
273*a97c2a1fSXin Li     else
274*a97c2a1fSXin Li     {
275*a97c2a1fSXin Li         *pu2_sym_len = u2_decoded_value & 0x1F;
276*a97c2a1fSXin Li         *pu2_sym_val = u2_decoded_value >> 5;
277*a97c2a1fSXin Li     }
278*a97c2a1fSXin Li 
279*a97c2a1fSXin Li     return(u2_decoded_value);
280*a97c2a1fSXin Li }
281*a97c2a1fSXin Li 
282*a97c2a1fSXin Li /******************************************************************************
283*a97c2a1fSXin Li  *
284*a97c2a1fSXin Li  *  Function Name   : impeg2d_vld_inv_quant_mpeg1
285*a97c2a1fSXin Li  *
286*a97c2a1fSXin Li  *  Description     : Performs VLD operation for MPEG1/2
287*a97c2a1fSXin Li  *
288*a97c2a1fSXin Li  *  Arguments       :
289*a97c2a1fSXin Li  *  state           : VLCD state parameter
290*a97c2a1fSXin Li  *  regs            : Registers of VLCD
291*a97c2a1fSXin Li  *
292*a97c2a1fSXin Li  *  Values Returned : None
293*a97c2a1fSXin Li  ******************************************************************************/
impeg2d_vld_inv_quant_mpeg1(void * pv_dec,WORD16 * pi2_out_addr,const UWORD8 * pu1_scan,UWORD16 u2_intra_flag,UWORD16 u2_colr_comp,UWORD16 u2_d_picture)294*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T impeg2d_vld_inv_quant_mpeg1(
295*a97c2a1fSXin Li                              void  *pv_dec,           /* Decoder State */
296*a97c2a1fSXin Li                              WORD16       *pi2_out_addr,       /*!< Address where decoded symbols will be stored */
297*a97c2a1fSXin Li                              const UWORD8 *pu1_scan,          /*!< Scan table to be used */
298*a97c2a1fSXin Li                              UWORD16      u2_intra_flag,      /*!< Intra Macroblock or not */
299*a97c2a1fSXin Li                              UWORD16      u2_colr_comp,      /*!< 0 - Luma,1 - U comp, 2 - V comp */
300*a97c2a1fSXin Li                              UWORD16      u2_d_picture        /*!< D Picture or not */
301*a97c2a1fSXin Li                              )
302*a97c2a1fSXin Li {
303*a97c2a1fSXin Li     UWORD8  *pu1_weighting_matrix;
304*a97c2a1fSXin Li     dec_state_t *ps_dec    = (dec_state_t *) pv_dec;
305*a97c2a1fSXin Li     IMPEG2D_ERROR_CODES_T e_error   = (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
306*a97c2a1fSXin Li 
307*a97c2a1fSXin Li     WORD16  pi2_coeffs[NUM_COEFFS];
308*a97c2a1fSXin Li     UWORD8  pu1_pos[NUM_COEFFS];
309*a97c2a1fSXin Li     WORD32  i4_num_coeffs;
310*a97c2a1fSXin Li 
311*a97c2a1fSXin Li     /* Perform VLD on the stream to get the coefficients and their positions */
312*a97c2a1fSXin Li     e_error = impeg2d_vld_decode(ps_dec, pi2_coeffs, pu1_scan, pu1_pos, u2_intra_flag,
313*a97c2a1fSXin Li                                  u2_colr_comp, u2_d_picture, ps_dec->u2_intra_vlc_format,
314*a97c2a1fSXin Li                                  ps_dec->u2_is_mpeg2, &i4_num_coeffs);
315*a97c2a1fSXin Li     if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
316*a97c2a1fSXin Li     {
317*a97c2a1fSXin Li         return e_error;
318*a97c2a1fSXin Li     }
319*a97c2a1fSXin Li 
320*a97c2a1fSXin Li     /* For YUV420 format,Select the weighting matrix according to Table 7.5 */
321*a97c2a1fSXin Li     pu1_weighting_matrix = (u2_intra_flag == 1) ? ps_dec->au1_intra_quant_matrix:
322*a97c2a1fSXin Li                     ps_dec->au1_inter_quant_matrix;
323*a97c2a1fSXin Li 
324*a97c2a1fSXin Li     IMPEG2D_IQNT_INP_STATISTICS(pi2_out_addr, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows);
325*a97c2a1fSXin Li     /* Inverse Quantize the Output of VLD */
326*a97c2a1fSXin Li     PROFILE_DISABLE_INVQUANT_IF0
327*a97c2a1fSXin Li 
328*a97c2a1fSXin Li     {
329*a97c2a1fSXin Li         /* Clear output matrix */
330*a97c2a1fSXin Li         PROFILE_DISABLE_MEMSET_RESBUF_IF0
331*a97c2a1fSXin Li         if (1 != (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows))
332*a97c2a1fSXin Li         {
333*a97c2a1fSXin Li             ps_dec->pf_memset_16bit_8x8_linear_block (pi2_out_addr);
334*a97c2a1fSXin Li         }
335*a97c2a1fSXin Li 
336*a97c2a1fSXin Li         impeg2d_inv_quant_mpeg1(pi2_out_addr, pu1_weighting_matrix,
337*a97c2a1fSXin Li                                   ps_dec->u1_quant_scale, u2_intra_flag,
338*a97c2a1fSXin Li                                   i4_num_coeffs, pi2_coeffs, pu1_pos,
339*a97c2a1fSXin Li                                   pu1_scan, &ps_dec->u2_def_dc_pred[u2_colr_comp],
340*a97c2a1fSXin Li                                   ps_dec->u2_intra_dc_precision);
341*a97c2a1fSXin Li 
342*a97c2a1fSXin Li         if (0 != pi2_out_addr[0])
343*a97c2a1fSXin Li         {
344*a97c2a1fSXin Li             /* The first coeff might've become non-zero due to intra_dc_decision
345*a97c2a1fSXin Li              * value. So, check here after inverse quantization.
346*a97c2a1fSXin Li              */
347*a97c2a1fSXin Li             ps_dec->u4_non_zero_cols  |= 0x1;
348*a97c2a1fSXin Li             ps_dec->u4_non_zero_rows  |= 0x1;
349*a97c2a1fSXin Li         }
350*a97c2a1fSXin Li     }
351*a97c2a1fSXin Li 
352*a97c2a1fSXin Li     return e_error;
353*a97c2a1fSXin Li }
354*a97c2a1fSXin Li 
355*a97c2a1fSXin Li /******************************************************************************
356*a97c2a1fSXin Li   *
357*a97c2a1fSXin Li   *  Function Name   : impeg2d_vld_inv_quant_mpeg2
358*a97c2a1fSXin Li   *
359*a97c2a1fSXin Li   *  Description     : Performs VLD operation for MPEG1/2
360*a97c2a1fSXin Li   *
361*a97c2a1fSXin Li   *  Arguments       :
362*a97c2a1fSXin Li   *  state           : VLCD state parameter
363*a97c2a1fSXin Li   *  regs            : Registers of VLCD
364*a97c2a1fSXin Li   *
365*a97c2a1fSXin Li   *  Values Returned : None
366*a97c2a1fSXin Li   ******************************************************************************/
impeg2d_vld_inv_quant_mpeg2(void * pv_dec,WORD16 * pi2_out_addr,const UWORD8 * pu1_scan,UWORD16 u2_intra_flag,UWORD16 u2_colr_comp,UWORD16 u2_d_picture)367*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T impeg2d_vld_inv_quant_mpeg2(
368*a97c2a1fSXin Li                              void  *pv_dec,           /* Decoder State */
369*a97c2a1fSXin Li                              WORD16       *pi2_out_addr,       /*!< Address where decoded symbols will be stored */
370*a97c2a1fSXin Li                              const UWORD8 *pu1_scan,          /*!< Scan table to be used */
371*a97c2a1fSXin Li                              UWORD16      u2_intra_flag,      /*!< Intra Macroblock or not */
372*a97c2a1fSXin Li                              UWORD16      u2_colr_comp,      /*!< 0 - Luma,1 - U comp, 2 - V comp */
373*a97c2a1fSXin Li                              UWORD16      u2_d_picture        /*!< D Picture or not */
374*a97c2a1fSXin Li                              )
375*a97c2a1fSXin Li {
376*a97c2a1fSXin Li     UWORD8  *pu1_weighting_matrix;
377*a97c2a1fSXin Li     WORD32 i4_sum;
378*a97c2a1fSXin Li     dec_state_t *ps_dec = (dec_state_t *)pv_dec;
379*a97c2a1fSXin Li     IMPEG2D_ERROR_CODES_T e_error = (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
380*a97c2a1fSXin Li 
381*a97c2a1fSXin Li     WORD16  pi2_coeffs[NUM_COEFFS];
382*a97c2a1fSXin Li     UWORD8  pi4_pos[NUM_COEFFS];
383*a97c2a1fSXin Li     WORD32  i4_num_coeffs;
384*a97c2a1fSXin Li 
385*a97c2a1fSXin Li     /* Perform VLD on the stream to get the coefficients and their positions */
386*a97c2a1fSXin Li     e_error = impeg2d_vld_decode(ps_dec, pi2_coeffs, pu1_scan, pi4_pos, u2_intra_flag,
387*a97c2a1fSXin Li                                  u2_colr_comp, u2_d_picture, ps_dec->u2_intra_vlc_format,
388*a97c2a1fSXin Li                                  ps_dec->u2_is_mpeg2, &i4_num_coeffs);
389*a97c2a1fSXin Li     if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
390*a97c2a1fSXin Li     {
391*a97c2a1fSXin Li         return e_error;
392*a97c2a1fSXin Li     }
393*a97c2a1fSXin Li 
394*a97c2a1fSXin Li     /* For YUV420 format,Select the weighting matrix according to Table 7.5 */
395*a97c2a1fSXin Li     pu1_weighting_matrix = (u2_intra_flag == 1) ? ps_dec->au1_intra_quant_matrix:
396*a97c2a1fSXin Li                     ps_dec->au1_inter_quant_matrix;
397*a97c2a1fSXin Li 
398*a97c2a1fSXin Li     /*mismatch control for mpeg2*/
399*a97c2a1fSXin Li     /* Check if the block has only one non-zero coeff which is DC  */
400*a97c2a1fSXin Li     ps_dec->i4_last_value_one = 0;
401*a97c2a1fSXin Li 
402*a97c2a1fSXin Li     IMPEG2D_IQNT_INP_STATISTICS(pi2_out_addr, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows);
403*a97c2a1fSXin Li 
404*a97c2a1fSXin Li     /* Inverse Quantize the Output of VLD */
405*a97c2a1fSXin Li     PROFILE_DISABLE_INVQUANT_IF0
406*a97c2a1fSXin Li 
407*a97c2a1fSXin Li     {
408*a97c2a1fSXin Li         /* Clear output matrix */
409*a97c2a1fSXin Li         PROFILE_DISABLE_MEMSET_RESBUF_IF0
410*a97c2a1fSXin Li         if (1 != (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows))
411*a97c2a1fSXin Li         {
412*a97c2a1fSXin Li             ps_dec->pf_memset_16bit_8x8_linear_block (pi2_out_addr);
413*a97c2a1fSXin Li         }
414*a97c2a1fSXin Li 
415*a97c2a1fSXin Li         i4_sum  = impeg2d_inv_quant_mpeg2(pi2_out_addr, pu1_weighting_matrix,
416*a97c2a1fSXin Li                                                  ps_dec->u1_quant_scale, u2_intra_flag,
417*a97c2a1fSXin Li                                                  i4_num_coeffs, pi2_coeffs,
418*a97c2a1fSXin Li                                                  pi4_pos, pu1_scan,
419*a97c2a1fSXin Li                                                  &ps_dec->u2_def_dc_pred[u2_colr_comp],
420*a97c2a1fSXin Li                                                  ps_dec->u2_intra_dc_precision);
421*a97c2a1fSXin Li 
422*a97c2a1fSXin Li         if (0 != pi2_out_addr[0])
423*a97c2a1fSXin Li         {
424*a97c2a1fSXin Li             /* The first coeff might've become non-zero due to intra_dc_decision
425*a97c2a1fSXin Li              * value. So, check here after inverse quantization.
426*a97c2a1fSXin Li              */
427*a97c2a1fSXin Li             ps_dec->u4_non_zero_cols  |= 0x1;
428*a97c2a1fSXin Li             ps_dec->u4_non_zero_rows  |= 0x1;
429*a97c2a1fSXin Li         }
430*a97c2a1fSXin Li 
431*a97c2a1fSXin Li         if (1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows))
432*a97c2a1fSXin Li         {
433*a97c2a1fSXin Li             ps_dec->i4_last_value_one = 1 - (pi2_out_addr[0] & 1);
434*a97c2a1fSXin Li         }
435*a97c2a1fSXin Li         else
436*a97c2a1fSXin Li         {
437*a97c2a1fSXin Li             /*toggle last bit if sum is even ,else retain it as it is*/
438*a97c2a1fSXin Li             pi2_out_addr[63]        ^= (i4_sum & 1);
439*a97c2a1fSXin Li 
440*a97c2a1fSXin Li             if (0 != pi2_out_addr[63])
441*a97c2a1fSXin Li             {
442*a97c2a1fSXin Li                 ps_dec->u4_non_zero_cols  |= 0x80;
443*a97c2a1fSXin Li                 ps_dec->u4_non_zero_rows  |= 0x80;
444*a97c2a1fSXin Li             }
445*a97c2a1fSXin Li         }
446*a97c2a1fSXin Li     }
447*a97c2a1fSXin Li 
448*a97c2a1fSXin Li     return e_error;
449*a97c2a1fSXin Li }
450*a97c2a1fSXin Li 
451*a97c2a1fSXin Li 
452*a97c2a1fSXin Li /******************************************************************************
453*a97c2a1fSXin Li *
454*a97c2a1fSXin Li *  Function Name   : impeg2d_vld_decode
455*a97c2a1fSXin Li *
456*a97c2a1fSXin Li *  Description     : Performs VLD operation for MPEG1/2
457*a97c2a1fSXin Li *
458*a97c2a1fSXin Li *  Arguments       :
459*a97c2a1fSXin Li *  state           : VLCD state parameter
460*a97c2a1fSXin Li *  regs            : Registers of VLCD
461*a97c2a1fSXin Li *
462*a97c2a1fSXin Li *  Values Returned : None
463*a97c2a1fSXin Li ******************************************************************************/
impeg2d_vld_decode(dec_state_t * ps_dec,WORD16 * pi2_outAddr,const UWORD8 * pu1_scan,UWORD8 * pu1_pos,UWORD16 u2_intra_flag,UWORD16 u2_chroma_flag,UWORD16 u2_d_picture,UWORD16 u2_intra_vlc_format,UWORD16 u2_mpeg2,WORD32 * pi4_num_coeffs)464*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T impeg2d_vld_decode(
465*a97c2a1fSXin Li     dec_state_t *ps_dec,
466*a97c2a1fSXin Li     WORD16      *pi2_outAddr,       /*!< Address where decoded symbols will be stored */
467*a97c2a1fSXin Li     const UWORD8 *pu1_scan,         /*!< Scan table to be used */
468*a97c2a1fSXin Li     UWORD8      *pu1_pos,       /*!< Scan table to be used */
469*a97c2a1fSXin Li     UWORD16     u2_intra_flag,      /*!< Intra Macroblock or not */
470*a97c2a1fSXin Li     UWORD16     u2_chroma_flag,     /*!< Chroma Block or not */
471*a97c2a1fSXin Li     UWORD16     u2_d_picture,       /*!< D Picture or not */
472*a97c2a1fSXin Li     UWORD16     u2_intra_vlc_format, /*!< Intra VLC format */
473*a97c2a1fSXin Li     UWORD16     u2_mpeg2,          /*!< MPEG-2 or not */
474*a97c2a1fSXin Li     WORD32      *pi4_num_coeffs /*!< Returns the number of coeffs in block */
475*a97c2a1fSXin Li     )
476*a97c2a1fSXin Li {
477*a97c2a1fSXin Li 
478*a97c2a1fSXin Li     UWORD32 u4_sym_len;
479*a97c2a1fSXin Li 
480*a97c2a1fSXin Li     UWORD32 u4_decoded_value;
481*a97c2a1fSXin Li     WORD32 i4_level_first_byte;
482*a97c2a1fSXin Li     WORD32  i4_level;
483*a97c2a1fSXin Li     UWORD32 u4_run, u4_numCoeffs;
484*a97c2a1fSXin Li     UWORD32 u4_buf;
485*a97c2a1fSXin Li     UWORD32 u4_buf_nxt;
486*a97c2a1fSXin Li     UWORD32 u4_offset;
487*a97c2a1fSXin Li     UWORD32 *pu4_buf_aligned;
488*a97c2a1fSXin Li     UWORD32 u4_bits;
489*a97c2a1fSXin Li     stream_t *ps_stream = &ps_dec->s_bit_stream;
490*a97c2a1fSXin Li     WORD32  u4_pos;
491*a97c2a1fSXin Li     UWORD32 u4_nz_cols;
492*a97c2a1fSXin Li     UWORD32 u4_nz_rows;
493*a97c2a1fSXin Li 
494*a97c2a1fSXin Li     *pi4_num_coeffs = 0;
495*a97c2a1fSXin Li 
496*a97c2a1fSXin Li     ps_dec->u4_non_zero_cols = 0;
497*a97c2a1fSXin Li     ps_dec->u4_non_zero_rows = 0;
498*a97c2a1fSXin Li     u4_nz_cols = ps_dec->u4_non_zero_cols;
499*a97c2a1fSXin Li     u4_nz_rows = ps_dec->u4_non_zero_rows;
500*a97c2a1fSXin Li 
501*a97c2a1fSXin Li     GET_TEMP_STREAM_DATA(u4_buf,u4_buf_nxt,u4_offset,pu4_buf_aligned,ps_stream)
502*a97c2a1fSXin Li     /**************************************************************************/
503*a97c2a1fSXin Li     /* Decode the DC coefficient in case of Intra block                       */
504*a97c2a1fSXin Li     /**************************************************************************/
505*a97c2a1fSXin Li     if(u2_intra_flag)
506*a97c2a1fSXin Li     {
507*a97c2a1fSXin Li         WORD32 dc_size;
508*a97c2a1fSXin Li         WORD32 dc_diff;
509*a97c2a1fSXin Li         WORD32 maxLen;
510*a97c2a1fSXin Li         WORD32 idx;
511*a97c2a1fSXin Li 
512*a97c2a1fSXin Li 
513*a97c2a1fSXin Li         maxLen = MPEG2_DCT_DC_SIZE_LEN;
514*a97c2a1fSXin Li         idx = 0;
515*a97c2a1fSXin Li         if(u2_chroma_flag != 0)
516*a97c2a1fSXin Li         {
517*a97c2a1fSXin Li             maxLen += 1;
518*a97c2a1fSXin Li             idx++;
519*a97c2a1fSXin Li         }
520*a97c2a1fSXin Li 
521*a97c2a1fSXin Li 
522*a97c2a1fSXin Li         {
523*a97c2a1fSXin Li             WORD16  end = 0;
524*a97c2a1fSXin Li             UWORD32 maxLen_tmp = maxLen;
525*a97c2a1fSXin Li             UWORD16 m_iBit;
526*a97c2a1fSXin Li 
527*a97c2a1fSXin Li 
528*a97c2a1fSXin Li             /* Get the maximum number of bits needed to decode a symbol */
529*a97c2a1fSXin Li             IBITS_NXT(u4_buf,u4_buf_nxt,u4_offset,u4_bits,maxLen)
530*a97c2a1fSXin Li             do
531*a97c2a1fSXin Li             {
532*a97c2a1fSXin Li                 maxLen_tmp--;
533*a97c2a1fSXin Li                 /* Read one bit at a time from the variable to decode the huffman code */
534*a97c2a1fSXin Li                 m_iBit = (UWORD8)((u4_bits >> maxLen_tmp) & 0x1);
535*a97c2a1fSXin Li 
536*a97c2a1fSXin Li                 /* Get the next node pointer or the symbol from the tree */
537*a97c2a1fSXin Li                 end = gai2_impeg2d_dct_dc_size[idx][end][m_iBit];
538*a97c2a1fSXin Li             }while(end > 0);
539*a97c2a1fSXin Li             dc_size = end + MPEG2_DCT_DC_SIZE_OFFSET;
540*a97c2a1fSXin Li 
541*a97c2a1fSXin Li             /* Flush the appropriate number of bits from the stream */
542*a97c2a1fSXin Li             FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,(maxLen - maxLen_tmp),pu4_buf_aligned)
543*a97c2a1fSXin Li 
544*a97c2a1fSXin Li         }
545*a97c2a1fSXin Li 
546*a97c2a1fSXin Li 
547*a97c2a1fSXin Li 
548*a97c2a1fSXin Li         if (dc_size != 0)
549*a97c2a1fSXin Li         {
550*a97c2a1fSXin Li             UWORD32 u4_bits;
551*a97c2a1fSXin Li 
552*a97c2a1fSXin Li             IBITS_GET(u4_buf,u4_buf_nxt,u4_offset,u4_bits,pu4_buf_aligned, dc_size)
553*a97c2a1fSXin Li             dc_diff = u4_bits;
554*a97c2a1fSXin Li 
555*a97c2a1fSXin Li             if ((dc_diff & (1 << (dc_size - 1))) == 0) //v Probably the prediction algo?
556*a97c2a1fSXin Li                 dc_diff -= (1 << dc_size) - 1;
557*a97c2a1fSXin Li         }
558*a97c2a1fSXin Li         else
559*a97c2a1fSXin Li         {
560*a97c2a1fSXin Li             dc_diff = 0;
561*a97c2a1fSXin Li         }
562*a97c2a1fSXin Li 
563*a97c2a1fSXin Li 
564*a97c2a1fSXin Li         pi2_outAddr[*pi4_num_coeffs]    = dc_diff;
565*a97c2a1fSXin Li         /* This indicates the position of the coefficient. Since this is the DC
566*a97c2a1fSXin Li          * coefficient, we put the position as 0.
567*a97c2a1fSXin Li          */
568*a97c2a1fSXin Li         pu1_pos[*pi4_num_coeffs]    = pu1_scan[0];
569*a97c2a1fSXin Li         (*pi4_num_coeffs)++;
570*a97c2a1fSXin Li 
571*a97c2a1fSXin Li         if (0 != dc_diff)
572*a97c2a1fSXin Li         {
573*a97c2a1fSXin Li             u4_nz_cols |= 0x01;
574*a97c2a1fSXin Li             u4_nz_rows |= 0x01;
575*a97c2a1fSXin Li         }
576*a97c2a1fSXin Li 
577*a97c2a1fSXin Li         u4_numCoeffs = 1;
578*a97c2a1fSXin Li     }
579*a97c2a1fSXin Li     /**************************************************************************/
580*a97c2a1fSXin Li     /* Decoding of first AC coefficient in case of non Intra block            */
581*a97c2a1fSXin Li     /**************************************************************************/
582*a97c2a1fSXin Li     else
583*a97c2a1fSXin Li     {
584*a97c2a1fSXin Li         /* First symbol can be 1s */
585*a97c2a1fSXin Li         UWORD32 u4_bits;
586*a97c2a1fSXin Li 
587*a97c2a1fSXin Li         IBITS_NXT(u4_buf,u4_buf_nxt,u4_offset,u4_bits,1)
588*a97c2a1fSXin Li 
589*a97c2a1fSXin Li         if(u4_bits == 1)
590*a97c2a1fSXin Li         {
591*a97c2a1fSXin Li 
592*a97c2a1fSXin Li             FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,1, pu4_buf_aligned)
593*a97c2a1fSXin Li             IBITS_GET(u4_buf,u4_buf_nxt,u4_offset,u4_bits,pu4_buf_aligned, 1)
594*a97c2a1fSXin Li             if(u4_bits == 1)
595*a97c2a1fSXin Li             {
596*a97c2a1fSXin Li                 pi2_outAddr[*pi4_num_coeffs] = -1;
597*a97c2a1fSXin Li             }
598*a97c2a1fSXin Li             else
599*a97c2a1fSXin Li             {
600*a97c2a1fSXin Li                 pi2_outAddr[*pi4_num_coeffs] = 1;
601*a97c2a1fSXin Li             }
602*a97c2a1fSXin Li 
603*a97c2a1fSXin Li             /* This indicates the position of the coefficient. Since this is the DC
604*a97c2a1fSXin Li              * coefficient, we put the position as 0.
605*a97c2a1fSXin Li              */
606*a97c2a1fSXin Li             pu1_pos[*pi4_num_coeffs]    = pu1_scan[0];
607*a97c2a1fSXin Li             (*pi4_num_coeffs)++;
608*a97c2a1fSXin Li             u4_numCoeffs = 1;
609*a97c2a1fSXin Li 
610*a97c2a1fSXin Li             u4_nz_cols |= 0x01;
611*a97c2a1fSXin Li             u4_nz_rows |= 0x01;
612*a97c2a1fSXin Li         }
613*a97c2a1fSXin Li         else
614*a97c2a1fSXin Li         {
615*a97c2a1fSXin Li             u4_numCoeffs = 0;
616*a97c2a1fSXin Li         }
617*a97c2a1fSXin Li     }
618*a97c2a1fSXin Li     if (1 == u2_d_picture)
619*a97c2a1fSXin Li     {
620*a97c2a1fSXin Li         PUT_TEMP_STREAM_DATA(u4_buf, u4_buf_nxt, u4_offset, pu4_buf_aligned, ps_stream)
621*a97c2a1fSXin Li         ps_dec->u4_non_zero_cols  = u4_nz_cols;
622*a97c2a1fSXin Li         ps_dec->u4_non_zero_rows  = u4_nz_rows;
623*a97c2a1fSXin Li         return ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE);
624*a97c2a1fSXin Li     }
625*a97c2a1fSXin Li 
626*a97c2a1fSXin Li 
627*a97c2a1fSXin Li 
628*a97c2a1fSXin Li         if (1 == u2_intra_vlc_format && u2_intra_flag)
629*a97c2a1fSXin Li         {
630*a97c2a1fSXin Li 
631*a97c2a1fSXin Li             while(1)
632*a97c2a1fSXin Li             {
633*a97c2a1fSXin Li                 //Putting the impeg2d_dec_ac_coeff_one function inline.
634*a97c2a1fSXin Li 
635*a97c2a1fSXin Li                 UWORD32 lead_zeros;
636*a97c2a1fSXin Li                 WORD16 DecodedValue;
637*a97c2a1fSXin Li 
638*a97c2a1fSXin Li                 u4_sym_len = 17;
639*a97c2a1fSXin Li                 IBITS_NXT(u4_buf,u4_buf_nxt,u4_offset,u4_bits,u4_sym_len)
640*a97c2a1fSXin Li 
641*a97c2a1fSXin Li                 /* There cannot be more than 11 leading zeros in the decoded
642*a97c2a1fSXin Li                  * symbol. The symbol is only 17 bits long, so we subtract 15.
643*a97c2a1fSXin Li                  */
644*a97c2a1fSXin Li                 lead_zeros = CLZ(u4_bits) - 15;
645*a97c2a1fSXin Li                 if (lead_zeros > 11)
646*a97c2a1fSXin Li                 {
647*a97c2a1fSXin Li                     return IMPEG2D_MB_DATA_DECODE_ERR;
648*a97c2a1fSXin Li                 }
649*a97c2a1fSXin Li 
650*a97c2a1fSXin Li                 DecodedValue = gau2_impeg2d_tab_one_1_9[u4_bits >> 8];
651*a97c2a1fSXin Li                 u4_sym_len = (DecodedValue & 0xf);
652*a97c2a1fSXin Li                 i4_level = DecodedValue >> 9;
653*a97c2a1fSXin Li                 /* One table lookup */
654*a97c2a1fSXin Li                 if(0 != i4_level)
655*a97c2a1fSXin Li                 {
656*a97c2a1fSXin Li                     u4_run = ((DecodedValue >> 4) & 0x1f);
657*a97c2a1fSXin Li                     u4_numCoeffs       += u4_run;
658*a97c2a1fSXin Li                     if (u4_numCoeffs >= NUM_COEFFS)
659*a97c2a1fSXin Li                     {
660*a97c2a1fSXin Li                         return IMPEG2D_MB_TEX_DECODE_ERR;
661*a97c2a1fSXin Li                     }
662*a97c2a1fSXin Li                     u4_pos             = pu1_scan[u4_numCoeffs++];
663*a97c2a1fSXin Li                     pu1_pos[*pi4_num_coeffs]    = u4_pos;
664*a97c2a1fSXin Li 
665*a97c2a1fSXin Li                     FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,u4_sym_len,pu4_buf_aligned)
666*a97c2a1fSXin Li                     pi2_outAddr[*pi4_num_coeffs]    = i4_level;
667*a97c2a1fSXin Li 
668*a97c2a1fSXin Li                     (*pi4_num_coeffs)++;
669*a97c2a1fSXin Li                 }
670*a97c2a1fSXin Li                 else
671*a97c2a1fSXin Li                 {
672*a97c2a1fSXin Li                     if (DecodedValue == END_OF_BLOCK_ONE)
673*a97c2a1fSXin Li                     {
674*a97c2a1fSXin Li                         u4_sym_len = 4;
675*a97c2a1fSXin Li 
676*a97c2a1fSXin Li                         break;
677*a97c2a1fSXin Li                     }
678*a97c2a1fSXin Li                     else
679*a97c2a1fSXin Li                     {
680*a97c2a1fSXin Li                         /*Second table lookup*/
681*a97c2a1fSXin Li                         lead_zeros = CLZ(u4_bits) - 20;/* -16 since we are dealing with WORD32 */
682*a97c2a1fSXin Li                         if (0 != lead_zeros)
683*a97c2a1fSXin Li                         {
684*a97c2a1fSXin Li 
685*a97c2a1fSXin Li                             u4_bits         = (u4_bits >> (6 - lead_zeros)) & 0x001F;
686*a97c2a1fSXin Li 
687*a97c2a1fSXin Li                             /* Flush the number of bits */
688*a97c2a1fSXin Li                             if (1 == lead_zeros)
689*a97c2a1fSXin Li                             {
690*a97c2a1fSXin Li                                 u4_sym_len         = ((u4_bits & 0x18) >> 3) == 2 ? 11:10;
691*a97c2a1fSXin Li                             }
692*a97c2a1fSXin Li                             else
693*a97c2a1fSXin Li                             {
694*a97c2a1fSXin Li                                 u4_sym_len         = 11 + lead_zeros;
695*a97c2a1fSXin Li                             }
696*a97c2a1fSXin Li                             /* flushing */
697*a97c2a1fSXin Li                             FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,u4_sym_len,pu4_buf_aligned)
698*a97c2a1fSXin Li 
699*a97c2a1fSXin Li                             /* Calculate the address */
700*a97c2a1fSXin Li                             u4_bits         = ((lead_zeros - 1) << 5) + u4_bits;
701*a97c2a1fSXin Li 
702*a97c2a1fSXin Li                             DecodedValue    = gau2_impeg2d_tab_one_10_16[u4_bits];
703*a97c2a1fSXin Li 
704*a97c2a1fSXin Li                             u4_run = BITS(DecodedValue, 8,4);
705*a97c2a1fSXin Li                             i4_level = ((WORD16) DecodedValue) >> 9;
706*a97c2a1fSXin Li 
707*a97c2a1fSXin Li                             u4_numCoeffs       += u4_run;
708*a97c2a1fSXin Li                             if (u4_numCoeffs >= NUM_COEFFS)
709*a97c2a1fSXin Li                             {
710*a97c2a1fSXin Li                                 return IMPEG2D_MB_TEX_DECODE_ERR;
711*a97c2a1fSXin Li                             }
712*a97c2a1fSXin Li                             u4_pos             = pu1_scan[u4_numCoeffs++];
713*a97c2a1fSXin Li                             pu1_pos[*pi4_num_coeffs]    = u4_pos;
714*a97c2a1fSXin Li                             pi2_outAddr[*pi4_num_coeffs]    = i4_level;
715*a97c2a1fSXin Li                             (*pi4_num_coeffs)++;
716*a97c2a1fSXin Li                         }
717*a97c2a1fSXin Li                         /*********************************************************************/
718*a97c2a1fSXin Li                         /* MPEG2 Escape Code                                                 */
719*a97c2a1fSXin Li                         /*********************************************************************/
720*a97c2a1fSXin Li                         else if(u2_mpeg2 == 1)
721*a97c2a1fSXin Li                         {
722*a97c2a1fSXin Li                             u4_sym_len         = 6;
723*a97c2a1fSXin Li                             FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,u4_sym_len,pu4_buf_aligned)
724*a97c2a1fSXin Li                                 IBITS_GET(u4_buf,u4_buf_nxt,u4_offset,u4_bits,pu4_buf_aligned,18)
725*a97c2a1fSXin Li                                 u4_decoded_value    = u4_bits;
726*a97c2a1fSXin Li                             u4_run             = (u4_decoded_value >> 12);
727*a97c2a1fSXin Li                             i4_level           = (u4_decoded_value & 0x0FFF);
728*a97c2a1fSXin Li 
729*a97c2a1fSXin Li                             if (i4_level)
730*a97c2a1fSXin Li                                 i4_level = (i4_level - ((i4_level & 0x0800) << 1));
731*a97c2a1fSXin Li 
732*a97c2a1fSXin Li                             u4_numCoeffs       += u4_run;
733*a97c2a1fSXin Li                             if (u4_numCoeffs >= NUM_COEFFS)
734*a97c2a1fSXin Li                             {
735*a97c2a1fSXin Li                                 return IMPEG2D_MB_TEX_DECODE_ERR;
736*a97c2a1fSXin Li                             }
737*a97c2a1fSXin Li                             u4_pos             = pu1_scan[u4_numCoeffs++];
738*a97c2a1fSXin Li                             pu1_pos[*pi4_num_coeffs]    = u4_pos;
739*a97c2a1fSXin Li                             pi2_outAddr[*pi4_num_coeffs]    = i4_level;
740*a97c2a1fSXin Li                             (*pi4_num_coeffs)++;
741*a97c2a1fSXin Li                         }
742*a97c2a1fSXin Li                         /*********************************************************************/
743*a97c2a1fSXin Li                         /* MPEG1 Escape Code                                                 */
744*a97c2a1fSXin Li                         /*********************************************************************/
745*a97c2a1fSXin Li                         else
746*a97c2a1fSXin Li                         {
747*a97c2a1fSXin Li                             /*-----------------------------------------------------------
748*a97c2a1fSXin Li                             * MPEG-1 Stream
749*a97c2a1fSXin Li                             *
750*a97c2a1fSXin Li                             * <See D.9.3 of MPEG-2> Run-level escape syntax
751*a97c2a1fSXin Li                             * Run-level values that cannot be coded with a VLC are coded
752*a97c2a1fSXin Li                             * by the escape code '0000 01' followed by
753*a97c2a1fSXin Li                             * either a 14-bit FLC (127 <= level <= 127),
754*a97c2a1fSXin Li                             * or a 22-bit FLC (255 <= level <= 255).
755*a97c2a1fSXin Li                             * This is described in Annex B,B.5f of MPEG-1.standard
756*a97c2a1fSXin Li                             *-----------------------------------------------------------*/
757*a97c2a1fSXin Li 
758*a97c2a1fSXin Li                             /*-----------------------------------------------------------
759*a97c2a1fSXin Li                             * First 6 bits are the value of the Run. Next is First 8 bits
760*a97c2a1fSXin Li                             * of Level. These bits decide whether it is 14 bit FLC or
761*a97c2a1fSXin Li                             * 22-bit FLC.
762*a97c2a1fSXin Li                             *
763*a97c2a1fSXin Li                             * If( first 8 bits of Level == '1000000' or '00000000')
764*a97c2a1fSXin Li                             *      then its is 22-bit FLC.
765*a97c2a1fSXin Li                             * else
766*a97c2a1fSXin Li                             *      it is 14-bit FLC.
767*a97c2a1fSXin Li                             *-----------------------------------------------------------*/
768*a97c2a1fSXin Li                             u4_sym_len         = 6;
769*a97c2a1fSXin Li                             FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,u4_sym_len,pu4_buf_aligned)
770*a97c2a1fSXin Li                                 IBITS_GET(u4_buf,u4_buf_nxt,u4_offset,u4_bits,pu4_buf_aligned,14)
771*a97c2a1fSXin Li                                 u4_decoded_value     = u4_bits;
772*a97c2a1fSXin Li                             u4_run              = (u4_decoded_value >> 8);
773*a97c2a1fSXin Li                             i4_level_first_byte = (u4_decoded_value & 0x0FF);
774*a97c2a1fSXin Li                             if(i4_level_first_byte & 0x7F)
775*a97c2a1fSXin Li                             {
776*a97c2a1fSXin Li                                 /*-------------------------------------------------------
777*a97c2a1fSXin Li                                 * First 8 bits of level are neither 1000000 nor 00000000
778*a97c2a1fSXin Li                                 * Hence 14-bit FLC (Last 8 bits are used to get level)
779*a97c2a1fSXin Li                                 *
780*a97c2a1fSXin Li                                 *  Level = (msb of Level_First_Byte is 1)?
781*a97c2a1fSXin Li                                 *          Level_First_Byte - 256 : Level_First_Byte
782*a97c2a1fSXin Li                                 *-------------------------------------------------------*/
783*a97c2a1fSXin Li                                 i4_level = (i4_level_first_byte -
784*a97c2a1fSXin Li                                     ((i4_level_first_byte & 0x80) << 1));
785*a97c2a1fSXin Li                             }
786*a97c2a1fSXin Li                             else
787*a97c2a1fSXin Li                             {
788*a97c2a1fSXin Li                                 /*-------------------------------------------------------
789*a97c2a1fSXin Li                                 * Next 8 bits are either 1000000 or 00000000
790*a97c2a1fSXin Li                                 * Hence 22-bit FLC (Last 16 bits are used to get level)
791*a97c2a1fSXin Li                                 *
792*a97c2a1fSXin Li                                 *  Level = (msb of Level_First_Byte is 1)?
793*a97c2a1fSXin Li                                 *          Level_Second_Byte - 256 : Level_Second_Byte
794*a97c2a1fSXin Li                                 *-------------------------------------------------------*/
795*a97c2a1fSXin Li                                 IBITS_GET(u4_buf,u4_buf_nxt,u4_offset,u4_bits,pu4_buf_aligned,8)
796*a97c2a1fSXin Li                                     i4_level = u4_bits;
797*a97c2a1fSXin Li                                 i4_level = (i4_level - (i4_level_first_byte << 1));
798*a97c2a1fSXin Li                             }
799*a97c2a1fSXin Li                             u4_numCoeffs += u4_run;
800*a97c2a1fSXin Li                             if (u4_numCoeffs >= NUM_COEFFS)
801*a97c2a1fSXin Li                             {
802*a97c2a1fSXin Li                                 return IMPEG2D_MB_TEX_DECODE_ERR;
803*a97c2a1fSXin Li                             }
804*a97c2a1fSXin Li 
805*a97c2a1fSXin Li                             u4_pos = pu1_scan[u4_numCoeffs++];
806*a97c2a1fSXin Li 
807*a97c2a1fSXin Li                             pu1_pos[*pi4_num_coeffs]    = u4_pos;
808*a97c2a1fSXin Li                             pi2_outAddr[*pi4_num_coeffs]    = i4_level;
809*a97c2a1fSXin Li                             (*pi4_num_coeffs)++;
810*a97c2a1fSXin Li                         }
811*a97c2a1fSXin Li                     }
812*a97c2a1fSXin Li                 }
813*a97c2a1fSXin Li 
814*a97c2a1fSXin Li                 u4_nz_cols |= 1 << (u4_pos & 0x7);
815*a97c2a1fSXin Li                 u4_nz_rows |= 1 << (u4_pos >> 0x3);
816*a97c2a1fSXin Li 
817*a97c2a1fSXin Li             }
818*a97c2a1fSXin Li             IBITS_GET(u4_buf,u4_buf_nxt,u4_offset,u4_bits,pu4_buf_aligned,u4_sym_len)
819*a97c2a1fSXin Li         }
820*a97c2a1fSXin Li         else
821*a97c2a1fSXin Li         {
822*a97c2a1fSXin Li             // Inline
823*a97c2a1fSXin Li             while(1)
824*a97c2a1fSXin Li             {
825*a97c2a1fSXin Li 
826*a97c2a1fSXin Li                 UWORD32 lead_zeros;
827*a97c2a1fSXin Li                 UWORD16 DecodedValue;
828*a97c2a1fSXin Li 
829*a97c2a1fSXin Li                 u4_sym_len = 17;
830*a97c2a1fSXin Li                 IBITS_NXT(u4_buf, u4_buf_nxt, u4_offset, u4_bits, u4_sym_len)
831*a97c2a1fSXin Li 
832*a97c2a1fSXin Li                 /* There cannot be more than 11 leading zeros in the decoded
833*a97c2a1fSXin Li                  * symbol. The symbol is only 17 bits long, so we subtract 15.
834*a97c2a1fSXin Li                  */
835*a97c2a1fSXin Li                 lead_zeros = CLZ(u4_bits) - 15;
836*a97c2a1fSXin Li                 if (lead_zeros > 11)
837*a97c2a1fSXin Li                 {
838*a97c2a1fSXin Li                     return IMPEG2D_MB_DATA_DECODE_ERR;
839*a97c2a1fSXin Li                 }
840*a97c2a1fSXin Li 
841*a97c2a1fSXin Li                 DecodedValue = gau2_impeg2d_tab_zero_1_9[u4_bits >> 8];
842*a97c2a1fSXin Li                 u4_sym_len = BITS(DecodedValue, 3, 0);
843*a97c2a1fSXin Li                 i4_level = ((WORD16) DecodedValue) >> 9;
844*a97c2a1fSXin Li 
845*a97c2a1fSXin Li                 if (0 != i4_level)
846*a97c2a1fSXin Li                 {
847*a97c2a1fSXin Li                     u4_run = BITS(DecodedValue, 8,4);
848*a97c2a1fSXin Li 
849*a97c2a1fSXin Li                     u4_numCoeffs       += u4_run;
850*a97c2a1fSXin Li                     if (u4_numCoeffs >= NUM_COEFFS)
851*a97c2a1fSXin Li                     {
852*a97c2a1fSXin Li                         return IMPEG2D_MB_TEX_DECODE_ERR;
853*a97c2a1fSXin Li                     }
854*a97c2a1fSXin Li 
855*a97c2a1fSXin Li                     u4_pos                 = pu1_scan[u4_numCoeffs++];
856*a97c2a1fSXin Li                     pu1_pos[*pi4_num_coeffs]    = u4_pos;
857*a97c2a1fSXin Li 
858*a97c2a1fSXin Li                     FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,u4_sym_len,pu4_buf_aligned)
859*a97c2a1fSXin Li                     pi2_outAddr[*pi4_num_coeffs]    = i4_level;
860*a97c2a1fSXin Li                     (*pi4_num_coeffs)++;
861*a97c2a1fSXin Li                 }
862*a97c2a1fSXin Li                 else
863*a97c2a1fSXin Li                 {
864*a97c2a1fSXin Li                     if(DecodedValue == END_OF_BLOCK_ZERO)
865*a97c2a1fSXin Li                     {
866*a97c2a1fSXin Li                         u4_sym_len = 2;
867*a97c2a1fSXin Li 
868*a97c2a1fSXin Li                         break;
869*a97c2a1fSXin Li                     }
870*a97c2a1fSXin Li                     else
871*a97c2a1fSXin Li                     {
872*a97c2a1fSXin Li                         lead_zeros = CLZ(u4_bits) - 20;/* -15 since we are dealing with WORD32 */
873*a97c2a1fSXin Li                         /*Second table lookup*/
874*a97c2a1fSXin Li                         if (0 != lead_zeros)
875*a97c2a1fSXin Li                         {
876*a97c2a1fSXin Li                             u4_bits         = (u4_bits >> (6 - lead_zeros)) & 0x001F;
877*a97c2a1fSXin Li 
878*a97c2a1fSXin Li                             /* Flush the number of bits */
879*a97c2a1fSXin Li                             u4_sym_len         = 11 + lead_zeros;
880*a97c2a1fSXin Li 
881*a97c2a1fSXin Li                             /* Calculate the address */
882*a97c2a1fSXin Li                             u4_bits         = ((lead_zeros - 1) << 5) + u4_bits;
883*a97c2a1fSXin Li 
884*a97c2a1fSXin Li                             DecodedValue    = gau2_impeg2d_tab_zero_10_16[u4_bits];
885*a97c2a1fSXin Li 
886*a97c2a1fSXin Li                             u4_run = BITS(DecodedValue, 8,4);
887*a97c2a1fSXin Li                             i4_level = ((WORD16) DecodedValue) >> 9;
888*a97c2a1fSXin Li 
889*a97c2a1fSXin Li                             u4_numCoeffs       += u4_run;
890*a97c2a1fSXin Li                             if (u4_numCoeffs >= NUM_COEFFS)
891*a97c2a1fSXin Li                             {
892*a97c2a1fSXin Li                                 return IMPEG2D_MB_TEX_DECODE_ERR;
893*a97c2a1fSXin Li                             }
894*a97c2a1fSXin Li 
895*a97c2a1fSXin Li                             u4_pos                 = pu1_scan[u4_numCoeffs++];
896*a97c2a1fSXin Li                             pu1_pos[*pi4_num_coeffs]    = u4_pos;
897*a97c2a1fSXin Li                             if (1 == lead_zeros)
898*a97c2a1fSXin Li                                 u4_sym_len--;
899*a97c2a1fSXin Li                             /* flushing */
900*a97c2a1fSXin Li                             FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,u4_sym_len,pu4_buf_aligned)
901*a97c2a1fSXin Li                             pi2_outAddr[*pi4_num_coeffs]    = i4_level;
902*a97c2a1fSXin Li 
903*a97c2a1fSXin Li                             (*pi4_num_coeffs)++;
904*a97c2a1fSXin Li                         }
905*a97c2a1fSXin Li                         /*Escape Sequence*/
906*a97c2a1fSXin Li                         else if(u2_mpeg2 == 1)
907*a97c2a1fSXin Li                         {
908*a97c2a1fSXin Li                             u4_sym_len         = 6;
909*a97c2a1fSXin Li                             FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,u4_sym_len,pu4_buf_aligned)
910*a97c2a1fSXin Li                             IBITS_GET(u4_buf,u4_buf_nxt,u4_offset,u4_bits,pu4_buf_aligned,18)
911*a97c2a1fSXin Li                             u4_decoded_value    = u4_bits;
912*a97c2a1fSXin Li                             u4_run             = (u4_decoded_value >> 12);
913*a97c2a1fSXin Li                             i4_level           = (u4_decoded_value & 0x0FFF);
914*a97c2a1fSXin Li 
915*a97c2a1fSXin Li                             if (i4_level)
916*a97c2a1fSXin Li                                 i4_level = (i4_level - ((i4_level & 0x0800) << 1));
917*a97c2a1fSXin Li 
918*a97c2a1fSXin Li                             u4_numCoeffs           += u4_run;
919*a97c2a1fSXin Li                             if (u4_numCoeffs >= NUM_COEFFS)
920*a97c2a1fSXin Li                             {
921*a97c2a1fSXin Li                                 return IMPEG2D_MB_TEX_DECODE_ERR;
922*a97c2a1fSXin Li                             }
923*a97c2a1fSXin Li 
924*a97c2a1fSXin Li                             u4_pos                 = pu1_scan[u4_numCoeffs++];
925*a97c2a1fSXin Li                             pu1_pos[*pi4_num_coeffs]    = u4_pos;
926*a97c2a1fSXin Li                             pi2_outAddr[*pi4_num_coeffs]    = i4_level;
927*a97c2a1fSXin Li 
928*a97c2a1fSXin Li                             (*pi4_num_coeffs)++;
929*a97c2a1fSXin Li                         }
930*a97c2a1fSXin Li                         /*********************************************************************/
931*a97c2a1fSXin Li                         /* MPEG1 Escape Code                                                 */
932*a97c2a1fSXin Li                         /*********************************************************************/
933*a97c2a1fSXin Li                         else
934*a97c2a1fSXin Li                         {
935*a97c2a1fSXin Li                             /*-----------------------------------------------------------
936*a97c2a1fSXin Li                             * MPEG-1 Stream
937*a97c2a1fSXin Li                             *
938*a97c2a1fSXin Li                             * <See D.9.3 of MPEG-2> Run-level escape syntax
939*a97c2a1fSXin Li                             * Run-level values that cannot be coded with a VLC are coded
940*a97c2a1fSXin Li                             * by the escape code '0000 01' followed by
941*a97c2a1fSXin Li                             * either a 14-bit FLC (127 <= level <= 127),
942*a97c2a1fSXin Li                             * or a 22-bit FLC (255 <= level <= 255).
943*a97c2a1fSXin Li                             * This is described in Annex B,B.5f of MPEG-1.standard
944*a97c2a1fSXin Li                             *-----------------------------------------------------------*/
945*a97c2a1fSXin Li 
946*a97c2a1fSXin Li                             /*-----------------------------------------------------------
947*a97c2a1fSXin Li                             * First 6 bits are the value of the Run. Next is First 8 bits
948*a97c2a1fSXin Li                             * of Level. These bits decide whether it is 14 bit FLC or
949*a97c2a1fSXin Li                             * 22-bit FLC.
950*a97c2a1fSXin Li                             *
951*a97c2a1fSXin Li                             * If( first 8 bits of Level == '1000000' or '00000000')
952*a97c2a1fSXin Li                             *      then its is 22-bit FLC.
953*a97c2a1fSXin Li                             * else
954*a97c2a1fSXin Li                             *      it is 14-bit FLC.
955*a97c2a1fSXin Li                             *-----------------------------------------------------------*/
956*a97c2a1fSXin Li                             u4_sym_len             = 6;
957*a97c2a1fSXin Li                             FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,u4_sym_len,pu4_buf_aligned)
958*a97c2a1fSXin Li                             IBITS_GET(u4_buf,u4_buf_nxt,u4_offset,u4_bits,pu4_buf_aligned,14)
959*a97c2a1fSXin Li                             u4_decoded_value        = u4_bits;
960*a97c2a1fSXin Li                             u4_run                 = (u4_decoded_value >> 8);
961*a97c2a1fSXin Li                             i4_level_first_byte    = (u4_decoded_value & 0x0FF);
962*a97c2a1fSXin Li                             if(i4_level_first_byte & 0x7F)
963*a97c2a1fSXin Li                             {
964*a97c2a1fSXin Li                                 /*-------------------------------------------------------
965*a97c2a1fSXin Li                                 * First 8 bits of level are neither 1000000 nor 00000000
966*a97c2a1fSXin Li                                 * Hence 14-bit FLC (Last 8 bits are used to get level)
967*a97c2a1fSXin Li                                 *
968*a97c2a1fSXin Li                                 *  Level = (msb of Level_First_Byte is 1)?
969*a97c2a1fSXin Li                                 *          Level_First_Byte - 256 : Level_First_Byte
970*a97c2a1fSXin Li                                 *-------------------------------------------------------*/
971*a97c2a1fSXin Li                                 i4_level = (i4_level_first_byte -
972*a97c2a1fSXin Li                                     ((i4_level_first_byte & 0x80) << 1));
973*a97c2a1fSXin Li                             }
974*a97c2a1fSXin Li                             else
975*a97c2a1fSXin Li                             {
976*a97c2a1fSXin Li                                 /*-------------------------------------------------------
977*a97c2a1fSXin Li                                 * Next 8 bits are either 1000000 or 00000000
978*a97c2a1fSXin Li                                 * Hence 22-bit FLC (Last 16 bits are used to get level)
979*a97c2a1fSXin Li                                 *
980*a97c2a1fSXin Li                                 *  Level = (msb of Level_First_Byte is 1)?
981*a97c2a1fSXin Li                                 *          Level_Second_Byte - 256 : Level_Second_Byte
982*a97c2a1fSXin Li                                 *-------------------------------------------------------*/
983*a97c2a1fSXin Li                                 IBITS_GET(u4_buf,u4_buf_nxt,u4_offset,u4_bits,pu4_buf_aligned,8)
984*a97c2a1fSXin Li                                 i4_level = u4_bits;
985*a97c2a1fSXin Li                                 i4_level = (i4_level - (i4_level_first_byte << 1));
986*a97c2a1fSXin Li                             }
987*a97c2a1fSXin Li                             u4_numCoeffs           += u4_run;
988*a97c2a1fSXin Li                             if (u4_numCoeffs >= NUM_COEFFS)
989*a97c2a1fSXin Li                             {
990*a97c2a1fSXin Li                                 return IMPEG2D_MB_TEX_DECODE_ERR;
991*a97c2a1fSXin Li                             }
992*a97c2a1fSXin Li 
993*a97c2a1fSXin Li                             u4_pos                 = pu1_scan[u4_numCoeffs++];
994*a97c2a1fSXin Li                             pu1_pos[*pi4_num_coeffs]    = u4_pos;
995*a97c2a1fSXin Li                             pi2_outAddr[*pi4_num_coeffs]    = i4_level;
996*a97c2a1fSXin Li 
997*a97c2a1fSXin Li                             (*pi4_num_coeffs)++;
998*a97c2a1fSXin Li                         }
999*a97c2a1fSXin Li                     }
1000*a97c2a1fSXin Li                 }
1001*a97c2a1fSXin Li 
1002*a97c2a1fSXin Li                 u4_nz_cols |= 1 << (u4_pos & 0x7);
1003*a97c2a1fSXin Li                 u4_nz_rows |= 1 << (u4_pos >> 0x3);
1004*a97c2a1fSXin Li 
1005*a97c2a1fSXin Li             }
1006*a97c2a1fSXin Li 
1007*a97c2a1fSXin Li             IBITS_GET(u4_buf,u4_buf_nxt,u4_offset,u4_bits,pu4_buf_aligned,u4_sym_len)
1008*a97c2a1fSXin Li 
1009*a97c2a1fSXin Li         }
1010*a97c2a1fSXin Li 
1011*a97c2a1fSXin Li         PUT_TEMP_STREAM_DATA(u4_buf, u4_buf_nxt, u4_offset, pu4_buf_aligned, ps_stream)
1012*a97c2a1fSXin Li 
1013*a97c2a1fSXin Li         ps_dec->u4_non_zero_cols  = u4_nz_cols;
1014*a97c2a1fSXin Li         ps_dec->u4_non_zero_rows  = u4_nz_rows;
1015*a97c2a1fSXin Li 
1016*a97c2a1fSXin Li             return (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
1017*a97c2a1fSXin Li }
1018*a97c2a1fSXin Li 
1019*a97c2a1fSXin Li 
1020*a97c2a1fSXin Li 
1021*a97c2a1fSXin Li /*****************************************************************************/
1022*a97c2a1fSXin Li /*                                                                           */
1023*a97c2a1fSXin Li /*  Function Name : impeg2d_inv_quant_mpeg1                                   */
1024*a97c2a1fSXin Li /*                                                                           */
1025*a97c2a1fSXin Li /*  Description   : Inverse quantizes the output of VLD                      */
1026*a97c2a1fSXin Li /*                                                                           */
1027*a97c2a1fSXin Li /*  Inputs        :                                                          */
1028*a97c2a1fSXin Li /*  blk,              - Block to be inverse quantized                        */
1029*a97c2a1fSXin Li /*  weighting_matrix  - Matrix to be used in inverse quant                   */
1030*a97c2a1fSXin Li /*  intra_dc_precision- Precision reqd to scale intra DC value               */
1031*a97c2a1fSXin Li /*  quant_scale       - Quanization scale for inverse quant                  */
1032*a97c2a1fSXin Li /*  intra_flag        - Intra or Not                                         */
1033*a97c2a1fSXin Li /*                                                                           */
1034*a97c2a1fSXin Li /*  Globals       : None                                                     */
1035*a97c2a1fSXin Li /*                                                                           */
1036*a97c2a1fSXin Li /*  Processing    : Implements the inverse quantize equation                 */
1037*a97c2a1fSXin Li /*                                                                           */
1038*a97c2a1fSXin Li /*  Outputs       : Inverse quantized values in the block                    */
1039*a97c2a1fSXin Li /*                                                                           */
1040*a97c2a1fSXin Li /*  Returns       : None                                                     */
1041*a97c2a1fSXin Li /*                                                                           */
1042*a97c2a1fSXin Li /*  Issues        : None                                                     */
1043*a97c2a1fSXin Li /*                                                                           */
1044*a97c2a1fSXin Li /*  Revision History:                                                        */
1045*a97c2a1fSXin Li /*                                                                           */
1046*a97c2a1fSXin Li /*         DD MM YYYY   Author(s)       Changes                              */
1047*a97c2a1fSXin Li /*         05 09 2005   Harish M        First Version                        */
1048*a97c2a1fSXin Li /*                                                                           */
1049*a97c2a1fSXin Li /*****************************************************************************/
impeg2d_inv_quant_mpeg1(WORD16 * pi2_blk,UWORD8 * pu1_weighting_matrix,UWORD8 u1_quant_scale,WORD32 u4_intra_flag,WORD32 i4_num_coeffs,WORD16 * pi2_coeffs,UWORD8 * pu1_pos,const UWORD8 * pu1_scan,UWORD16 * pu2_def_dc_pred,UWORD16 u2_intra_dc_precision)1050*a97c2a1fSXin Li WORD32 impeg2d_inv_quant_mpeg1(WORD16 *pi2_blk,
1051*a97c2a1fSXin Li                               UWORD8 *pu1_weighting_matrix,
1052*a97c2a1fSXin Li                               UWORD8 u1_quant_scale,
1053*a97c2a1fSXin Li                               WORD32 u4_intra_flag,
1054*a97c2a1fSXin Li                               WORD32 i4_num_coeffs,
1055*a97c2a1fSXin Li                               WORD16 *pi2_coeffs,
1056*a97c2a1fSXin Li                               UWORD8 *pu1_pos,
1057*a97c2a1fSXin Li                               const UWORD8 *pu1_scan,
1058*a97c2a1fSXin Li                               UWORD16 *pu2_def_dc_pred,
1059*a97c2a1fSXin Li                               UWORD16 u2_intra_dc_precision)
1060*a97c2a1fSXin Li {
1061*a97c2a1fSXin Li     UWORD16 i4_pos;
1062*a97c2a1fSXin Li 
1063*a97c2a1fSXin Li     WORD32  i4_iter;
1064*a97c2a1fSXin Li 
1065*a97c2a1fSXin Li     /* Inverse Quantize the predicted DC value for intra MB*/
1066*a97c2a1fSXin Li     if(u4_intra_flag == 1)
1067*a97c2a1fSXin Li     {
1068*a97c2a1fSXin Li         /**************************************************************************/
1069*a97c2a1fSXin Li         /* Decode the DC coefficient in case of Intra block and also update       */
1070*a97c2a1fSXin Li         /* DC predictor value of the corresponding color component                */
1071*a97c2a1fSXin Li         /**************************************************************************/
1072*a97c2a1fSXin Li         {
1073*a97c2a1fSXin Li             pi2_coeffs[0]   += *pu2_def_dc_pred;
1074*a97c2a1fSXin Li             *pu2_def_dc_pred      = pi2_coeffs[0];
1075*a97c2a1fSXin Li             pi2_coeffs[0]   <<= (3 - u2_intra_dc_precision);
1076*a97c2a1fSXin Li             pi2_coeffs[0]   = CLIP_S12(pi2_coeffs[0]);
1077*a97c2a1fSXin Li         }
1078*a97c2a1fSXin Li 
1079*a97c2a1fSXin Li         pi2_blk[pu1_scan[0]]  = pi2_coeffs[0];
1080*a97c2a1fSXin Li     }
1081*a97c2a1fSXin Li     /************************************************************************/
1082*a97c2a1fSXin Li     /* Inverse quantization of other DCT coefficients                       */
1083*a97c2a1fSXin Li     /************************************************************************/
1084*a97c2a1fSXin Li     for(i4_iter = u4_intra_flag; i4_iter < i4_num_coeffs; i4_iter++)
1085*a97c2a1fSXin Li     {
1086*a97c2a1fSXin Li 
1087*a97c2a1fSXin Li         WORD16 sign;
1088*a97c2a1fSXin Li         WORD32 temp, temp1;
1089*a97c2a1fSXin Li 
1090*a97c2a1fSXin Li         /* Position is the inverse scan of the index stored */
1091*a97c2a1fSXin Li         i4_pos      = pu1_pos[i4_iter];
1092*a97c2a1fSXin Li         pi2_blk[i4_pos] = pi2_coeffs[i4_iter];
1093*a97c2a1fSXin Li 
1094*a97c2a1fSXin Li         sign = SIGN(pi2_blk[i4_pos]);
1095*a97c2a1fSXin Li         temp = ABS(pi2_blk[i4_pos] << 1);
1096*a97c2a1fSXin Li 
1097*a97c2a1fSXin Li         /* pi2_coeffs has only non-zero elements. So no need to check
1098*a97c2a1fSXin Li          * if the coeff is non-zero.
1099*a97c2a1fSXin Li          */
1100*a97c2a1fSXin Li         temp = temp + (1 * !u4_intra_flag);
1101*a97c2a1fSXin Li 
1102*a97c2a1fSXin Li         temp = temp * pu1_weighting_matrix[i4_pos] * u1_quant_scale;
1103*a97c2a1fSXin Li 
1104*a97c2a1fSXin Li         temp = temp >> 5;
1105*a97c2a1fSXin Li 
1106*a97c2a1fSXin Li         temp1 = temp | 1;
1107*a97c2a1fSXin Li 
1108*a97c2a1fSXin Li         temp1 = (temp1 > temp) ? (temp1 - temp) : (temp - temp1);
1109*a97c2a1fSXin Li 
1110*a97c2a1fSXin Li         temp = temp - temp1;
1111*a97c2a1fSXin Li 
1112*a97c2a1fSXin Li         if(temp < 0)
1113*a97c2a1fSXin Li         {
1114*a97c2a1fSXin Li             temp = 0;
1115*a97c2a1fSXin Li         }
1116*a97c2a1fSXin Li 
1117*a97c2a1fSXin Li         temp = temp * sign;
1118*a97c2a1fSXin Li 
1119*a97c2a1fSXin Li         temp = CLIP_S12(temp);
1120*a97c2a1fSXin Li 
1121*a97c2a1fSXin Li         pi2_blk[i4_pos] = temp;
1122*a97c2a1fSXin Li     }
1123*a97c2a1fSXin Li 
1124*a97c2a1fSXin Li     /*return value is used in the case of mpeg2 for mismatch control*/
1125*a97c2a1fSXin Li     return  (0);
1126*a97c2a1fSXin Li } /* End of inv_quant() */
1127*a97c2a1fSXin Li 
1128*a97c2a1fSXin Li 
1129*a97c2a1fSXin Li 
1130*a97c2a1fSXin Li /*****************************************************************************/
1131*a97c2a1fSXin Li /*                                                                           */
1132*a97c2a1fSXin Li /*  Function Name : impeg2d_inv_quant_mpeg2                                   */
1133*a97c2a1fSXin Li /*                                                                           */
1134*a97c2a1fSXin Li /*  Description   : Inverse quantizes the output of VLD                      */
1135*a97c2a1fSXin Li /*                                                                           */
1136*a97c2a1fSXin Li /*  Inputs        :                                                          */
1137*a97c2a1fSXin Li /*  blk,              - Block to be inverse quantized                        */
1138*a97c2a1fSXin Li /*  weighting_matrix  - Matrix to be used in inverse quant                   */
1139*a97c2a1fSXin Li /*  intra_dc_precision- Precision reqd to scale intra DC value               */
1140*a97c2a1fSXin Li /*  quant_scale       - Quanization scale for inverse quant                  */
1141*a97c2a1fSXin Li /*  intra_flag        - Intra or Not                                         */
1142*a97c2a1fSXin Li /*                                                                           */
1143*a97c2a1fSXin Li /*  Globals       : None                                                     */
1144*a97c2a1fSXin Li /*                                                                           */
1145*a97c2a1fSXin Li /*  Processing    : Implements the inverse quantize equation                 */
1146*a97c2a1fSXin Li /*                                                                           */
1147*a97c2a1fSXin Li /*  Outputs       : Inverse quantized values in the block                    */
1148*a97c2a1fSXin Li /*                                                                           */
1149*a97c2a1fSXin Li /*  Returns       : None                                                     */
1150*a97c2a1fSXin Li /*                                                                           */
1151*a97c2a1fSXin Li /*  Issues        : None                                                     */
1152*a97c2a1fSXin Li /*                                                                           */
1153*a97c2a1fSXin Li /*  Revision History:                                                        */
1154*a97c2a1fSXin Li /*                                                                           */
1155*a97c2a1fSXin Li /*         DD MM YYYY   Author(s)       Changes                              */
1156*a97c2a1fSXin Li /*         05 09 2005   Harish M        First Version                        */
1157*a97c2a1fSXin Li /*                                                                           */
1158*a97c2a1fSXin Li /*****************************************************************************/
impeg2d_inv_quant_mpeg2(WORD16 * pi2_blk,UWORD8 * pu1_weighting_matrix,UWORD8 u1_quant_scale,WORD32 u4_intra_flag,WORD32 i4_num_coeffs,WORD16 * pi2_coeffs,UWORD8 * pu1_pos,const UWORD8 * pu1_scan,UWORD16 * pu2_def_dc_pred,UWORD16 u2_intra_dc_precision)1159*a97c2a1fSXin Li WORD32 impeg2d_inv_quant_mpeg2(WORD16 *pi2_blk,
1160*a97c2a1fSXin Li                               UWORD8 *pu1_weighting_matrix,
1161*a97c2a1fSXin Li                               UWORD8 u1_quant_scale,
1162*a97c2a1fSXin Li                               WORD32 u4_intra_flag,
1163*a97c2a1fSXin Li                               WORD32 i4_num_coeffs,
1164*a97c2a1fSXin Li                               WORD16 *pi2_coeffs,
1165*a97c2a1fSXin Li                               UWORD8 *pu1_pos,
1166*a97c2a1fSXin Li                               const UWORD8 *pu1_scan,
1167*a97c2a1fSXin Li                               UWORD16 *pu2_def_dc_pred,
1168*a97c2a1fSXin Li                               UWORD16 u2_intra_dc_precision)
1169*a97c2a1fSXin Li {
1170*a97c2a1fSXin Li 
1171*a97c2a1fSXin Li     WORD32  i4_pos;
1172*a97c2a1fSXin Li     /* Used for Mismatch control */
1173*a97c2a1fSXin Li     WORD32 sum;
1174*a97c2a1fSXin Li 
1175*a97c2a1fSXin Li     WORD32  i4_iter;
1176*a97c2a1fSXin Li 
1177*a97c2a1fSXin Li     sum = 0;
1178*a97c2a1fSXin Li 
1179*a97c2a1fSXin Li     /* Inverse Quantize the predicted DC value for intra MB*/
1180*a97c2a1fSXin Li     if(u4_intra_flag == 1)
1181*a97c2a1fSXin Li     {
1182*a97c2a1fSXin Li         /**************************************************************************/
1183*a97c2a1fSXin Li         /* Decode the DC coefficient in case of Intra block and also update       */
1184*a97c2a1fSXin Li         /* DC predictor value of the corresponding color component                */
1185*a97c2a1fSXin Li         /**************************************************************************/
1186*a97c2a1fSXin Li         {
1187*a97c2a1fSXin Li             pi2_coeffs[0]   += *pu2_def_dc_pred;
1188*a97c2a1fSXin Li             *pu2_def_dc_pred      = pi2_coeffs[0];
1189*a97c2a1fSXin Li             pi2_coeffs[0]   <<= (3 - u2_intra_dc_precision);
1190*a97c2a1fSXin Li             pi2_coeffs[0]   = CLIP_S12(pi2_coeffs[0]);
1191*a97c2a1fSXin Li         }
1192*a97c2a1fSXin Li 
1193*a97c2a1fSXin Li         pi2_blk[pu1_scan[0]]  = pi2_coeffs[0];
1194*a97c2a1fSXin Li         sum = pi2_blk[0];
1195*a97c2a1fSXin Li     }
1196*a97c2a1fSXin Li 
1197*a97c2a1fSXin Li     /************************************************************************/
1198*a97c2a1fSXin Li     /* Inverse quantization of other DCT coefficients                       */
1199*a97c2a1fSXin Li     /************************************************************************/
1200*a97c2a1fSXin Li     for(i4_iter = u4_intra_flag; i4_iter < i4_num_coeffs; i4_iter++)
1201*a97c2a1fSXin Li     {
1202*a97c2a1fSXin Li         WORD16 sign;
1203*a97c2a1fSXin Li         WORD32 temp;
1204*a97c2a1fSXin Li         /* Position is the inverse scan of the index stored */
1205*a97c2a1fSXin Li         i4_pos      = pu1_pos[i4_iter];
1206*a97c2a1fSXin Li         pi2_blk[i4_pos] = pi2_coeffs[i4_iter];
1207*a97c2a1fSXin Li 
1208*a97c2a1fSXin Li         sign = SIGN(pi2_blk[i4_pos]);
1209*a97c2a1fSXin Li         temp = ABS(pi2_blk[i4_pos] << 1);
1210*a97c2a1fSXin Li         temp = temp + (1 * !u4_intra_flag);
1211*a97c2a1fSXin Li         temp = temp * pu1_weighting_matrix[i4_pos] * u1_quant_scale;
1212*a97c2a1fSXin Li 
1213*a97c2a1fSXin Li         temp = temp >> 5;
1214*a97c2a1fSXin Li 
1215*a97c2a1fSXin Li         temp = temp * sign;
1216*a97c2a1fSXin Li 
1217*a97c2a1fSXin Li         temp = CLIP_S12(temp);
1218*a97c2a1fSXin Li 
1219*a97c2a1fSXin Li         pi2_blk[i4_pos] = temp;
1220*a97c2a1fSXin Li 
1221*a97c2a1fSXin Li         sum += temp;
1222*a97c2a1fSXin Li     }
1223*a97c2a1fSXin Li     return (sum ^ 1);
1224*a97c2a1fSXin Li } /* End of inv_quant() */
1225