Home | History | Annotate | Download | only in common
      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 
    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 
    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 
    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 
    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 
    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