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