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