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_recon.c
     22  *
     23  * @brief
     24  *  Functions definitions reconstruction
     25  *
     26  * @author
     27  *  Ittiam
     28  *
     29  * @par List of Functions:
     30  *  - ihevc_recon_4x4_ttype1()
     31  *  - ihevc_recon_4x4()
     32  *  - ihevc_recon_8x8()
     33  *  - ihevc_recon_16x16()
     34  *  - ihevc_recon_32x32()
     35  *
     36  * @remarks
     37  *  None
     38  *
     39  *******************************************************************************
     40  */
     41 #include <stdio.h>
     42 #include <string.h>
     43 #include "ihevc_typedefs.h"
     44 #include "ihevc_macros.h"
     45 #include "ihevc_platform_macros.h"
     46 #include "ihevc_defs.h"
     47 #include "ihevc_trans_tables.h"
     48 #include "ihevc_recon.h"
     49 #include "ihevc_func_selector.h"
     50 #include "ihevc_trans_macros.h"
     51 
     52 /* All the functions here are replicated from ihevc.c and modified to */
     53 /* include reconstruction */
     54 
     55 /**
     56  *******************************************************************************
     57  *
     58  * @brief
     59  *  This function performs reconstruction for  4x4 input block
     60  *
     61  * @par Description:
     62  *  Performs reconstruction of 4x4 input block by adding  adding prediction
     63  * data to input and clipping it to 8 bit
     64  *
     65  * @param[in] pi2_src
     66  *  Input 4x4 coefficients
     67  *
     68  * @param[in] pu1_pred
     69  *  Prediction 4x4 block
     70  *
     71  * @param[out] pu1_dst
     72  *  Output 4x4 block
     73  *
     74  * @param[in] src_strd
     75  *  Input stride
     76  *
     77  * @param[in] pred_strd
     78  *  Prediction stride
     79  *
     80  * @param[in] dst_strd
     81  *  Output Stride
     82  *
     83  * @param[in] zero_cols
     84  *  Zero columns in pi2_tmp
     85  *
     86  * @returns  Void
     87  *
     88  * @remarks
     89  *  None
     90  *
     91  *******************************************************************************
     92  */
     93 
     94 void ihevc_recon_4x4_ttype1(WORD16 *pi2_src,
     95                             UWORD8 *pu1_pred,
     96                             UWORD8 *pu1_dst,
     97                             WORD32 src_strd,
     98                             WORD32 pred_strd,
     99                             WORD32 dst_strd,
    100                             WORD32 zero_cols)
    101 {
    102     WORD32 i, j;
    103     WORD32 trans_size;
    104 
    105     trans_size = TRANS_SIZE_4;
    106 
    107     /* Reconstruction */
    108 
    109     for(i = 0; i < trans_size; i++)
    110     {
    111         /* Checking for Zero Cols */
    112         if((zero_cols & 1) == 1)
    113         {
    114             for(j = 0; j < trans_size; j++)
    115             {
    116                 pu1_dst[j * dst_strd] = pu1_pred[j * pred_strd];
    117             }
    118         }
    119         else
    120         {
    121             for(j = 0; j < trans_size; j++)
    122             {
    123                 pu1_dst[j * dst_strd] =
    124                                 CLIP_U8(pi2_src[j * src_strd] + pu1_pred[j * pred_strd]);
    125             }
    126         }
    127         pi2_src++;
    128         pu1_dst++;
    129         pu1_pred++;
    130         zero_cols = zero_cols >> 1;
    131     }
    132 }
    133 
    134 /**
    135  *******************************************************************************
    136  *
    137  * @brief
    138  *  This function performs reconstruction for  4x4 input block
    139  *
    140  * @par Description:
    141  *  Performs reconstruction of 4x4 input block by adding  adding prediction
    142  * data to input and clipping it to 8 bit
    143  *
    144  * @param[in] pi2_src
    145  *  Input 4x4 coefficients
    146  *
    147  * @param[in] pu1_pred
    148  *  Prediction 4x4 block
    149  *
    150  * @param[out] pu1_dst
    151  *  Output 4x4 block
    152  *
    153  * @param[in] src_strd
    154  *  Input stride
    155  *
    156  * @param[in] pred_strd
    157  *  Prediction stride
    158  *
    159  * @param[in] dst_strd
    160  *  Output Stride
    161  *
    162  * @param[in] shift
    163  *  Output shift
    164  *
    165  * @param[in] zero_cols
    166  *  Zero columns in pi2_tmp
    167  *
    168  * @returns  Void
    169  *
    170  * @remarks
    171  *  None
    172  *
    173  *******************************************************************************
    174  */
    175 
    176 void ihevc_recon_4x4(WORD16 *pi2_src,
    177                      UWORD8 *pu1_pred,
    178                      UWORD8 *pu1_dst,
    179                      WORD32 src_strd,
    180                      WORD32 pred_strd,
    181                      WORD32 dst_strd,
    182                      WORD32 zero_cols)
    183 {
    184     WORD32 i, j;
    185     WORD32 trans_size;
    186 
    187     trans_size = TRANS_SIZE_4;
    188 
    189     /* Reconstruction */
    190 
    191     for(i = 0; i < trans_size; i++)
    192     {
    193         /* Checking for Zero Cols */
    194         if((zero_cols & 1) == 1)
    195         {
    196             for(j = 0; j < trans_size; j++)
    197             {
    198                 pu1_dst[j * dst_strd] = pu1_pred[j * pred_strd];
    199             }
    200         }
    201         else
    202         {
    203             for(j = 0; j < trans_size; j++)
    204             {
    205                 pu1_dst[j * dst_strd] =
    206                                 CLIP_U8(pi2_src[j * src_strd] + pu1_pred[j * pred_strd]);
    207             }
    208         }
    209         pi2_src++;
    210         pu1_dst++;
    211         pu1_pred++;
    212         zero_cols = zero_cols >> 1;
    213     }
    214 }
    215 
    216 /**
    217  *******************************************************************************
    218  *
    219  * @brief
    220  *  This function performs reconstruction for  8x8 input block
    221  *
    222  * @par Description:
    223  *  Performs reconstruction of 8x8 input block by adding  adding prediction
    224  * data to input and clipping it to 8 bit
    225  *
    226  * @param[in] pi2_src
    227  *  Input 8x8 coefficients
    228  *
    229  * @param[in] pu1_pred
    230  *  Prediction 8x8 block
    231  *
    232  * @param[out] pu1_dst
    233  *  Output 8x8 block
    234  *
    235  * @param[in] src_strd
    236  *  Input stride
    237  *
    238  * @param[in] pred_strd
    239  *  Prediction stride
    240  *
    241  * @param[in] dst_strd
    242  *  Output Stride
    243  *
    244  * @param[in] shift
    245  *  Output shift
    246  *
    247  * @param[in] zero_cols
    248  *  Zero columns in pi2_tmp
    249  *
    250  * @returns  Void
    251  *
    252  * @remarks
    253  *  None
    254  *
    255  *******************************************************************************
    256  */
    257 
    258 void ihevc_recon_8x8(WORD16 *pi2_src,
    259                      UWORD8 *pu1_pred,
    260                      UWORD8 *pu1_dst,
    261                      WORD32 src_strd,
    262                      WORD32 pred_strd,
    263                      WORD32 dst_strd,
    264                      WORD32 zero_cols)
    265 {
    266     WORD32 i, j;
    267     WORD32 trans_size;
    268 
    269     trans_size = TRANS_SIZE_8;
    270 
    271     /* Reconstruction */
    272 
    273     for(i = 0; i < trans_size; i++)
    274     {
    275         /* Checking for Zero Cols */
    276         if((zero_cols & 1) == 1)
    277         {
    278             for(j = 0; j < trans_size; j++)
    279             {
    280                 pu1_dst[j * dst_strd] = pu1_pred[j * pred_strd];
    281             }
    282         }
    283         else
    284         {
    285             for(j = 0; j < trans_size; j++)
    286             {
    287                 pu1_dst[j * dst_strd] =
    288                                 CLIP_U8(pi2_src[j * src_strd] + pu1_pred[j * pred_strd]);
    289             }
    290         }
    291         pi2_src++;
    292         pu1_dst++;
    293         pu1_pred++;
    294         zero_cols = zero_cols >> 1;
    295     }
    296 }
    297 
    298 /**
    299  *******************************************************************************
    300  *
    301  * @brief
    302  *  This function performs reconstruction for  16x16 input block
    303  *
    304  * @par Description:
    305  *  Performs reconstruction of 16x16 input block by adding  adding prediction
    306  * data to input and clipping it to 8 bit
    307  *
    308  * @param[in] pi2_src
    309  *  Input 16x16 coefficients
    310  *
    311  * @param[in] pu1_pred
    312  *  Prediction 16x16 block
    313  *
    314  * @param[out] pu1_dst
    315  *  Output 16x16 block
    316  *
    317  * @param[in] src_strd
    318  *  Input stride
    319  *
    320  * @param[in] pred_strd
    321  *  Prediction stride
    322  *
    323  * @param[in] dst_strd
    324  *  Output Stride
    325  *
    326  * @param[in] shift
    327  *  Output shift
    328  *
    329  * @param[in] zero_cols
    330  *  Zero columns in pi2_tmp
    331  *
    332  * @returns  Void
    333  *
    334  * @remarks
    335  *  None
    336  *
    337  *******************************************************************************
    338  */
    339 
    340 void ihevc_recon_16x16(WORD16 *pi2_src,
    341                        UWORD8 *pu1_pred,
    342                        UWORD8 *pu1_dst,
    343                        WORD32 src_strd,
    344                        WORD32 pred_strd,
    345                        WORD32 dst_strd,
    346                        WORD32 zero_cols)
    347 {
    348     WORD32 i, j;
    349     WORD32 trans_size;
    350 
    351     trans_size = TRANS_SIZE_16;
    352 
    353     /* Reconstruction */
    354 
    355     for(i = 0; i < trans_size; i++)
    356     {
    357         /* Checking for Zero Cols */
    358         if((zero_cols & 1) == 1)
    359         {
    360             for(j = 0; j < trans_size; j++)
    361             {
    362                 pu1_dst[j * dst_strd] = pu1_pred[j * pred_strd];
    363             }
    364         }
    365         else
    366         {
    367             for(j = 0; j < trans_size; j++)
    368             {
    369                 pu1_dst[j * dst_strd] =
    370                                 CLIP_U8(pi2_src[j * src_strd] + pu1_pred[j * pred_strd]);
    371             }
    372         }
    373         pi2_src++;
    374         pu1_dst++;
    375         pu1_pred++;
    376         zero_cols = zero_cols >> 1;
    377     }
    378 }
    379 
    380 /**
    381  *******************************************************************************
    382  *
    383  * @brief
    384  *  This function performs reconstruction for  32x32 input block
    385  *
    386  * @par Description:
    387  *  Performs reconstruction of 32x32 input block by adding  adding prediction
    388  * data to input and clipping it to 8 bit
    389  *
    390  * @param[in] pi2_src
    391  *  Input 32x32 coefficients
    392  *
    393  * @param[in] pu1_pred
    394  *  Prediction 32x32 block
    395  *
    396  * @param[out] pu1_dst
    397  *  Output 32x32 block
    398  *
    399  * @param[in] src_strd
    400  *  Input stride
    401  *
    402  * @param[in] pred_strd
    403  *  Prediction stride
    404  *
    405  * @param[in] dst_strd
    406  *  Output Stride
    407  *
    408  * @param[in] shift
    409  *  Output shift
    410  *
    411  * @param[in] zero_cols
    412  *  Zero columns in pi2_tmp
    413  *
    414  * @returns  Void
    415  *
    416  * @remarks
    417  *  None
    418  *
    419  *******************************************************************************
    420  */
    421 
    422 void ihevc_recon_32x32(WORD16 *pi2_src,
    423                        UWORD8 *pu1_pred,
    424                        UWORD8 *pu1_dst,
    425                        WORD32 src_strd,
    426                        WORD32 pred_strd,
    427                        WORD32 dst_strd,
    428                        WORD32 zero_cols)
    429 {
    430     WORD32 i, j;
    431     WORD32 trans_size;
    432 
    433     trans_size = TRANS_SIZE_32;
    434 
    435     /* Reconstruction */
    436 
    437     for(i = 0; i < trans_size; i++)
    438     {
    439         /* Checking for Zero Cols */
    440         if((zero_cols & 1) == 1)
    441         {
    442             for(j = 0; j < trans_size; j++)
    443             {
    444                 pu1_dst[j * dst_strd] = pu1_pred[j * pred_strd];
    445             }
    446         }
    447         else
    448         {
    449             for(j = 0; j < trans_size; j++)
    450             {
    451                 pu1_dst[j * dst_strd] =
    452                                 CLIP_U8(pi2_src[j * src_strd] + pu1_pred[j * pred_strd]);
    453             }
    454         }
    455         pi2_src++;
    456         pu1_dst++;
    457         pu1_pred++;
    458         zero_cols = zero_cols >> 1;
    459     }
    460 }
    461 
    462