1 /******************************************************************************
2 *
3 * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
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 /**
19 *******************************************************************************
20 * @file
21 * ihevc_iquant_recon.c
22 *
23 * @brief
24 * Contains function definitions for inverse quantization and
25 * reconstruction
26 *
27 * @author
28 * 100470
29 *
30 * @par List of Functions:
31 * - ihevc_iquant_recon_4x4_ttype1()
32 * - ihevc_iquant_recon_4x4()
33 * - ihevc_iquant_recon_8x8()
34 * - ihevc_iquant_recon_16x16()
35 * - ihevc_iquant_recon_32x32()
36 *
37 * @remarks
38 * None
39 *
40 *******************************************************************************
41 */
42 #include <stdio.h>
43 #include <string.h>
44 #include "ihevc_typedefs.h"
45 #include "ihevc_macros.h"
46 #include "ihevc_platform_macros.h"
47 #include "ihevc_defs.h"
48 #include "ihevc_trans_tables.h"
49 #include "ihevc_iquant_recon.h"
50 #include "ihevc_func_selector.h"
51 #include "ihevc_trans_macros.h"
52
53 /* All the functions here are replicated from ihevc_iquant_itrans_recon.c and modified to */
54 /* include reconstruction */
55
56 /**
57 *******************************************************************************
58 *
59 * @brief
60 * This function performs inverse quantization type 1 and reconstruction
61 * for 4x4 input block
62 *
63 * @par Description:
64 * This function performs inverse quantization and reconstruction for 4x4
65 * input block
66 *
67 * @param[in] pi2_src
68 * Input 4x4 coefficients
69 *
70 * @param[in] pu1_pred
71 * Prediction 4x4 block
72 *
73 * @param[in] pi2_dequant_coeff
74 * Dequant Coeffs
75 *
76 * @param[out] pu1_dst
77 * Output 4x4 block
78 *
79 * @param[in] qp_div
80 * Quantization parameter / 6
81 *
82 * @param[in] qp_rem
83 * Quantization parameter % 6
84 *
85 * @param[in] src_strd
86 * Input stride
87 *
88 * @param[in] pred_strd
89 * Prediction stride
90 *
91 * @param[in] dst_strd
92 * Output Stride
93 *
94 * @param[in] zero_cols
95 * Zero columns in pi2_src
96 *
97 * @returns Void
98 *
99 * @remarks
100 * None
101 *
102 *******************************************************************************
103 */
104
ihevc_iquant_recon_4x4_ttype1(WORD16 * pi2_src,UWORD8 * pu1_pred,WORD16 * pi2_dequant_coeff,UWORD8 * pu1_dst,WORD32 qp_div,WORD32 qp_rem,WORD32 src_strd,WORD32 pred_strd,WORD32 dst_strd,WORD32 zero_cols)105 void ihevc_iquant_recon_4x4_ttype1(WORD16 *pi2_src,
106 UWORD8 *pu1_pred,
107 WORD16 *pi2_dequant_coeff,
108 UWORD8 *pu1_dst,
109 WORD32 qp_div, /* qpscaled / 6 */
110 WORD32 qp_rem, /* qpscaled % 6 */
111 WORD32 src_strd,
112 WORD32 pred_strd,
113 WORD32 dst_strd,
114 WORD32 zero_cols)
115 {
116
117 {
118 /* Inverse Quant and recon */
119 {
120 WORD32 i, j;
121 WORD32 shift_iq;
122 WORD32 trans_size;
123 /* Inverse Quantization constants */
124 {
125 WORD32 log2_trans_size, bit_depth;
126
127 log2_trans_size = 2;
128 bit_depth = 8 + 0;
129 shift_iq = bit_depth + log2_trans_size - 5;
130 }
131
132 trans_size = TRANS_SIZE_4;
133
134 for(i = 0; i < trans_size; i++)
135 {
136 /* Checking for Zero Cols */
137 if((zero_cols & 1) == 1)
138 {
139 for(j = 0; j < trans_size; j++)
140 pu1_dst[j * dst_strd] = pu1_pred[j * pred_strd];
141 }
142 else
143 {
144 for(j = 0; j < trans_size; j++)
145 {
146 WORD32 iquant_out;
147 IQUANT_4x4(iquant_out,
148 pi2_src[j * src_strd],
149 pi2_dequant_coeff[j * trans_size] * g_ihevc_iquant_scales[qp_rem],
150 shift_iq, qp_div);
151
152 iquant_out = (iquant_out + 16) >> 5;
153 pu1_dst[j * dst_strd] =
154 CLIP_U8(iquant_out + pu1_pred[j * pred_strd]);
155 }
156 }
157 pi2_src++;
158 pi2_dequant_coeff++;
159 pu1_pred++;
160 pu1_dst++;
161
162 zero_cols = zero_cols >> 1;
163 }
164 }
165 }
166 }
167
168 /**
169 *******************************************************************************
170 *
171 * @brief
172 * This function performs inverse quantization and reconstruction for 4x4
173 * input block
174 *
175 * @par Description:
176 * This function performs inverse quantization and reconstruction for 4x4
177 * input block
178 *
179 * @param[in] pi2_src
180 * Input 4x4 coefficients
181 *
182 * @param[in] pu1_pred
183 * Prediction 4x4 block
184 *
185 * @param[in] pi2_dequant_coeff
186 * Dequant Coeffs
187 *
188 * @param[out] pu1_dst
189 * Output 4x4 block
190 *
191 * @param[in] qp_div
192 * Quantization parameter / 6
193 *
194 * @param[in] qp_rem
195 * Quantization parameter % 6
196 *
197 * @param[in] src_strd
198 * Input stride
199 *
200 * @param[in] pred_strd
201 * Prediction stride
202 *
203 * @param[in] dst_strd
204 * Output Stride
205 *
206 * @param[in] zero_cols
207 * Zero columns in pi2_src
208 *
209 * @returns Void
210 *
211 * @remarks
212 * None
213 *
214 *******************************************************************************
215 */
216
ihevc_iquant_recon_4x4(WORD16 * pi2_src,UWORD8 * pu1_pred,WORD16 * pi2_dequant_coeff,UWORD8 * pu1_dst,WORD32 qp_div,WORD32 qp_rem,WORD32 src_strd,WORD32 pred_strd,WORD32 dst_strd,WORD32 zero_cols)217 void ihevc_iquant_recon_4x4(WORD16 *pi2_src,
218 UWORD8 *pu1_pred,
219 WORD16 *pi2_dequant_coeff,
220 UWORD8 *pu1_dst,
221 WORD32 qp_div, /* qpscaled / 6 */
222 WORD32 qp_rem, /* qpscaled % 6 */
223 WORD32 src_strd,
224 WORD32 pred_strd,
225 WORD32 dst_strd,
226 WORD32 zero_cols)
227 {
228
229 {
230 /* Inverse Quant and recon */
231 {
232 WORD32 i, j;
233 WORD32 shift_iq;
234 WORD32 trans_size;
235 /* Inverse Quantization constants */
236 {
237 WORD32 log2_trans_size, bit_depth;
238
239 log2_trans_size = 2;
240 bit_depth = 8 + 0;
241 shift_iq = bit_depth + log2_trans_size - 5;
242 }
243
244 trans_size = TRANS_SIZE_4;
245
246 for(i = 0; i < trans_size; i++)
247 {
248 /* Checking for Zero Cols */
249 if((zero_cols & 1) == 1)
250 {
251 for(j = 0; j < trans_size; j++)
252 pu1_dst[j * dst_strd] = pu1_pred[j * pred_strd];
253 }
254 else
255 {
256 for(j = 0; j < trans_size; j++)
257 {
258 WORD32 iquant_out;
259 IQUANT_4x4(iquant_out,
260 pi2_src[j * src_strd],
261 pi2_dequant_coeff[j * trans_size] * g_ihevc_iquant_scales[qp_rem],
262 shift_iq, qp_div);
263 iquant_out = (iquant_out + 16) >> 5;
264 pu1_dst[j * dst_strd] =
265 CLIP_U8(iquant_out + pu1_pred[j * pred_strd]);
266 }
267 }
268 pi2_src++;
269 pi2_dequant_coeff++;
270 pu1_pred++;
271 pu1_dst++;
272
273 zero_cols = zero_cols >> 1;
274 }
275 }
276 }
277 }
278
279 /**
280 *******************************************************************************
281 *
282 * @brief
283 * This function performs inverse quantization and reconstruction for 8x8
284 * input block
285 *
286 * @par Description:
287 * This function performs inverse quantization and reconstruction for 8x8
288 * input block
289 *
290 * @param[in] pi2_src
291 * Input 8x8 coefficients
292 *
293 * @param[in] pu1_pred
294 * Prediction 8x8 block
295 *
296 * @param[in] pi2_dequant_coeff
297 * Dequant Coeffs
298 *
299 * @param[out] pu1_dst
300 * Output 8x8 block
301 *
302 * @param[in] qp_div
303 * Quantization parameter / 6
304 *
305 * @param[in] qp_rem
306 * Quantization parameter % 6
307 *
308 * @param[in] src_strd
309 * Input stride
310 *
311 * @param[in] pred_strd
312 * Prediction stride
313 *
314 * @param[in] dst_strd
315 * Output Stride
316 *
317 * @param[in] zero_cols
318 * Zero columns in pi2_src
319 *
320 * @returns Void
321 *
322 * @remarks
323 * None
324 *
325 *******************************************************************************
326 */
327
ihevc_iquant_recon_8x8(WORD16 * pi2_src,UWORD8 * pu1_pred,WORD16 * pi2_dequant_coeff,UWORD8 * pu1_dst,WORD32 qp_div,WORD32 qp_rem,WORD32 src_strd,WORD32 pred_strd,WORD32 dst_strd,WORD32 zero_cols)328 void ihevc_iquant_recon_8x8(WORD16 *pi2_src,
329 UWORD8 *pu1_pred,
330 WORD16 *pi2_dequant_coeff,
331 UWORD8 *pu1_dst,
332 WORD32 qp_div, /* qpscaled / 6 */
333 WORD32 qp_rem, /* qpscaled % 6 */
334 WORD32 src_strd,
335 WORD32 pred_strd,
336 WORD32 dst_strd,
337 WORD32 zero_cols)
338 {
339
340 {
341 /* Inverse Quant and recon */
342 {
343 WORD32 i, j;
344 WORD32 shift_iq;
345 WORD32 trans_size;
346 /* Inverse Quantization constants */
347 {
348 WORD32 log2_trans_size, bit_depth;
349
350 log2_trans_size = 3;
351 bit_depth = 8 + 0;
352 shift_iq = bit_depth + log2_trans_size - 5;
353 }
354
355 trans_size = TRANS_SIZE_8;
356
357 for(i = 0; i < trans_size; i++)
358 {
359 /* Checking for Zero Cols */
360 if((zero_cols & 1) == 1)
361 {
362 for(j = 0; j < trans_size; j++)
363 pu1_dst[j * dst_strd] = pu1_pred[j * pred_strd];
364 }
365 else
366 {
367 for(j = 0; j < trans_size; j++)
368 {
369 WORD32 iquant_out;
370 IQUANT(iquant_out,
371 pi2_src[j * src_strd],
372 pi2_dequant_coeff[j * trans_size] * g_ihevc_iquant_scales[qp_rem],
373 shift_iq, qp_div);
374 iquant_out = (iquant_out + 16) >> 5;
375 pu1_dst[j * dst_strd] =
376 CLIP_U8(iquant_out + pu1_pred[j * pred_strd]);
377 }
378 }
379 pi2_src++;
380 pi2_dequant_coeff++;
381 pu1_pred++;
382 pu1_dst++;
383
384 zero_cols = zero_cols >> 1;
385 }
386 }
387 }
388 }
389
390 /**
391 *******************************************************************************
392 *
393 * @brief
394 * This function performs inverse quantization and reconstruction for 16x16
395 * input block
396 *
397 * @par Description:
398 * This function performs inverse quantization and reconstruction for 16x16
399 * input block
400 *
401 * @param[in] pi2_src
402 * Input 16x16 coefficients
403 *
404 * @param[in] pu1_pred
405 * Prediction 16x16 block
406 *
407 * @param[in] pi2_dequant_coeff
408 * Dequant Coeffs
409 *
410 * @param[out] pu1_dst
411 * Output 16x16 block
412 *
413 * @param[in] qp_div
414 * Quantization parameter / 6
415 *
416 * @param[in] qp_rem
417 * Quantization parameter % 6
418 *
419 * @param[in] src_strd
420 * Input stride
421 *
422 * @param[in] pred_strd
423 * Prediction stride
424 *
425 * @param[in] dst_strd
426 * Output Stride
427 *
428 * @param[in] zero_cols
429 * Zero columns in pi2_src
430 *
431 * @returns Void
432 *
433 * @remarks
434 * None
435 *
436 *******************************************************************************
437 */
438
ihevc_iquant_recon_16x16(WORD16 * pi2_src,UWORD8 * pu1_pred,WORD16 * pi2_dequant_coeff,UWORD8 * pu1_dst,WORD32 qp_div,WORD32 qp_rem,WORD32 src_strd,WORD32 pred_strd,WORD32 dst_strd,WORD32 zero_cols)439 void ihevc_iquant_recon_16x16(WORD16 *pi2_src,
440 UWORD8 *pu1_pred,
441 WORD16 *pi2_dequant_coeff,
442 UWORD8 *pu1_dst,
443 WORD32 qp_div, /* qpscaled / 6 */
444 WORD32 qp_rem, /* qpscaled % 6 */
445 WORD32 src_strd,
446 WORD32 pred_strd,
447 WORD32 dst_strd,
448 WORD32 zero_cols)
449
450 {
451
452 {
453 /* Inverse Quant and recon */
454 {
455 WORD32 i, j;
456 WORD32 shift_iq;
457 WORD32 trans_size;
458 /* Inverse Quantization constants */
459 {
460 WORD32 log2_trans_size, bit_depth;
461
462 log2_trans_size = 4;
463 bit_depth = 8 + 0;
464 shift_iq = bit_depth + log2_trans_size - 5;
465 }
466
467 trans_size = TRANS_SIZE_16;
468
469 for(i = 0; i < trans_size; i++)
470 {
471 /* Checking for Zero Cols */
472 if((zero_cols & 1) == 1)
473 {
474 for(j = 0; j < trans_size; j++)
475 pu1_dst[j * dst_strd] = pu1_pred[j * pred_strd];
476 }
477 else
478 {
479 for(j = 0; j < trans_size; j++)
480 {
481 WORD32 iquant_out;
482 IQUANT(iquant_out,
483 pi2_src[j * src_strd],
484 pi2_dequant_coeff[j * trans_size] * g_ihevc_iquant_scales[qp_rem],
485 shift_iq, qp_div);
486 iquant_out = (iquant_out + 16) >> 5;
487 pu1_dst[j * dst_strd] =
488 CLIP_U8(iquant_out + pu1_pred[j * pred_strd]);
489 }
490 }
491 pi2_src++;
492 pi2_dequant_coeff++;
493 pu1_pred++;
494 pu1_dst++;
495
496 zero_cols = zero_cols >> 1;
497 }
498 }
499 }
500 }
501
502 /**
503 *******************************************************************************
504 *
505 * @brief
506 * This function performs inverse quantization and reconstruction for 32x32
507 * input block
508 *
509 * @par Description:
510 * This function performs inverse quantization and reconstruction for 32x32
511 * input block
512 *
513 * @param[in] pi2_src
514 * Input 32x32 coefficients
515 *
516 * @param[in] pu1_pred
517 * Prediction 32x32 block
518 *
519 * @param[in] pi2_dequant_coeff
520 * Dequant Coeffs
521 *
522 * @param[out] pu1_dst
523 * Output 32x32 block
524 *
525 * @param[in] qp_div
526 * Quantization parameter / 6
527 *
528 * @param[in] qp_rem
529 * Quantization parameter % 6
530 *
531 * @param[in] src_strd
532 * Input stride
533 *
534 * @param[in] pred_strd
535 * Prediction stride
536 *
537 * @param[in] dst_strd
538 * Output Stride
539 *
540 * @param[in] zero_cols
541 * Zero columns in pi2_src
542 *
543 * @returns Void
544 *
545 * @remarks
546 * None
547 *
548 *******************************************************************************
549 */
550
ihevc_iquant_recon_32x32(WORD16 * pi2_src,UWORD8 * pu1_pred,WORD16 * pi2_dequant_coeff,UWORD8 * pu1_dst,WORD32 qp_div,WORD32 qp_rem,WORD32 src_strd,WORD32 pred_strd,WORD32 dst_strd,WORD32 zero_cols)551 void ihevc_iquant_recon_32x32(WORD16 *pi2_src,
552 UWORD8 *pu1_pred,
553 WORD16 *pi2_dequant_coeff,
554 UWORD8 *pu1_dst,
555 WORD32 qp_div, /* qpscaled / 6 */
556 WORD32 qp_rem, /* qpscaled % 6 */
557 WORD32 src_strd,
558 WORD32 pred_strd,
559 WORD32 dst_strd,
560 WORD32 zero_cols)
561 {
562
563 {
564 /* Inverse Quant and recon */
565 {
566 WORD32 i, j;
567 WORD32 shift_iq;
568 WORD32 trans_size;
569 /* Inverse Quantization constants */
570 {
571 WORD32 log2_trans_size, bit_depth;
572
573 log2_trans_size = 5;
574 bit_depth = 8 + 0;
575 shift_iq = bit_depth + log2_trans_size - 5;
576 }
577
578 trans_size = TRANS_SIZE_32;
579
580 for(i = 0; i < trans_size; i++)
581 {
582 /* Checking for Zero Cols */
583 if((zero_cols & 1) == 1)
584 {
585 for(j = 0; j < trans_size; j++)
586 pu1_dst[j * dst_strd] = pu1_pred[j * pred_strd];
587 }
588 else
589 {
590 for(j = 0; j < trans_size; j++)
591 {
592 WORD32 iquant_out;
593 IQUANT(iquant_out,
594 pi2_src[j * src_strd],
595 pi2_dequant_coeff[j * trans_size] * g_ihevc_iquant_scales[qp_rem],
596 shift_iq, qp_div);
597 iquant_out = (iquant_out + 16) >> 5;
598 pu1_dst[j * dst_strd] =
599 CLIP_U8(iquant_out + pu1_pred[j * pred_strd]);
600 }
601 }
602 pi2_src++;
603 pi2_dequant_coeff++;
604 pu1_pred++;
605 pu1_dst++;
606
607 zero_cols = zero_cols >> 1;
608 }
609 }
610 }
611 }
612
613