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