Home | History | Annotate | Download | only in encoder
      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 
     21 /**
     22 *******************************************************************************
     23 * @file
     24 *  ih264e_half_pel.c
     25 *
     26 * @brief
     27 *  This file contains functions that are used for computing subpixel planes
     28 *
     29 * @author
     30 *  ittiam
     31 *
     32 * @par List of Functions:
     33 *  - ih264e_sixtapfilter_horz
     34 *  - ih264e_sixtap_filter_2dvh_vert
     35 *
     36 * @remarks
     37 *  None
     38 *
     39 *******************************************************************************
     40 */
     41 
     42 /*****************************************************************************/
     43 /* File Includes                                                             */
     44 /*****************************************************************************/
     45 
     46 /* System include files */
     47 #include <stdio.h>
     48 #include <assert.h>
     49 #include <limits.h>
     50 
     51 /* User include files */
     52 #include "ih264_typedefs.h"
     53 #include "ithread.h"
     54 #include "ih264_platform_macros.h"
     55 #include "ih264_defs.h"
     56 #include "ih264e_half_pel.h"
     57 #include "ih264_macros.h"
     58 #include "ih264e_debug.h"
     59 #include "ih264_inter_pred_filters.h"
     60 #include "ih264_mem_fns.h"
     61 #include "ih264_padding.h"
     62 #include "ih264_intra_pred_filters.h"
     63 #include "ih264_deblk_edge_filters.h"
     64 
     65 
     66 /*****************************************************************************/
     67 /* Function Definitions                                                      */
     68 /*****************************************************************************/
     69 
     70 /**
     71 *******************************************************************************
     72 *
     73 * @brief
     74 *  Interprediction luma filter for horizontal input (Filter run for width = 17
     75 *  and height =16)
     76 *
     77 * @par Description:
     78 *  Applies a 6 tap horizontal filter .The output is  clipped to 8 bits
     79 *  sec 8.4.2.2.1 titled "Luma sample interpolation process"
     80 *
     81 * @param[in] pu1_src
     82 *  UWORD8 pointer to the source
     83 *
     84 * @param[out] pu1_dst
     85 *  UWORD8 pointer to the destination
     86 *
     87 * @param[in] src_strd
     88 *  integer source stride
     89 *
     90 * @param[in] dst_strd
     91 *  integer destination stride
     92 *
     93 * @returns
     94 *
     95 * @remarks
     96 *  None
     97 *
     98 *******************************************************************************
     99 */
    100 void ih264e_sixtapfilter_horz(UWORD8 *pu1_src,
    101                               UWORD8 *pu1_dst,
    102                               WORD32 src_strd,
    103                               WORD32 dst_strd)
    104 {
    105     UWORD32  u4_i, u4_j;
    106     UWORD32  u4_w, u4_h;
    107 
    108     /* width and height of interpolation */
    109     u4_w = HP_PL_WD;
    110     u4_h = MB_SIZE;
    111 
    112     pu1_src -= 2;
    113 
    114     for (u4_i = 0; u4_i < u4_h; u4_i++)
    115     {
    116         for (u4_j = 0; u4_j < u4_w; u4_j++, pu1_dst++, pu1_src++)
    117         {
    118             WORD16 i16_temp;
    119 
    120             i16_temp = ih264_g_six_tap[0] * (*pu1_src + pu1_src[5])
    121                             + ih264_g_six_tap[1] * (pu1_src[1] + pu1_src[4])
    122                             + ih264_g_six_tap[2] * (pu1_src[2] + pu1_src[3]);
    123 
    124             i16_temp = (i16_temp + 16) >> 5;
    125 
    126             *pu1_dst = CLIP_U8(i16_temp);
    127         }
    128         pu1_src += src_strd - u4_w;
    129         pu1_dst += dst_strd - u4_w;
    130     }
    131 }
    132 
    133 /**
    134 *******************************************************************************
    135 *
    136 * @brief
    137 *  This function implements a two stage cascaded six tap filter. It applies
    138 *  the six tap filter in the vertical direction on the predictor values,
    139 *  followed by applying the same filter in the horizontal direction on the
    140 *  output of the first stage. The six tap filtering operation is described in
    141 *  sec 8.4.2.2.1 titled "Luma sample interpolation process" (Filter run for
    142 *  width = 17 and height = 17)
    143 *
    144 * @par Description:
    145 *  The function interpolates the predictors first in the vertical direction and
    146 *  then in the horizontal direction to output the (1/2,1/2). The output of the
    147 *  first stage of the filter is stored in the buffer pointed to by
    148 *  pi16_pred1(only in C) in 16 bit precision.
    149 *
    150 * @param[in] pu1_src
    151 *  UWORD8 pointer to the source
    152 *
    153 * @param[out] pu1_dst1
    154 *  UWORD8 pointer to the destination (Horizontal filtered output)
    155 *
    156 * @param[out] pu1_dst2
    157 *  UWORD8 pointer to the destination (output after applying vertical filter to
    158 *  the intermediate horizontal output)
    159 *
    160 * @param[in] src_strd
    161 *  integer source stride
    162 
    163 * @param[in] dst_strd
    164 *  integer destination stride of pu1_dst
    165 *
    166 * @param[in] pi4_pred
    167 *  Pointer to 16bit intermediate buffer (used only in c)
    168 *
    169 * @param[in] i4_pred_strd
    170 *  integer destination stride of pi16_pred1
    171 *
    172 * @returns
    173 *
    174 * @remarks
    175 *  None
    176 *
    177 *******************************************************************************
    178 */
    179 void ih264e_sixtap_filter_2dvh_vert(UWORD8 *pu1_src,
    180                                     UWORD8 *pu1_dst1,
    181                                     UWORD8 *pu1_dst2,
    182                                     WORD32 src_strd,
    183                                     WORD32 dst_strd,
    184                                     WORD32 *pi4_pred,
    185                                     WORD32 i4_pred_strd)
    186 {
    187     WORD32 row, col;
    188     WORD32 tmp;
    189     WORD32 *pi4_pred_temp = pi4_pred;
    190     WORD32 ht = HP_PL_HT, wd = HP_PL_WD;
    191 
    192     for (row = 0; row < ht; row++)
    193     {
    194         for (col = -2; col < wd + 3; col++)
    195         {
    196             tmp = ih264_g_six_tap[0] * (pu1_src[col - 2 * src_strd] + pu1_src[col + 3 * src_strd]) +
    197                             ih264_g_six_tap[1] * (pu1_src[col - 1 * src_strd] + pu1_src[col + 2 * src_strd]) +
    198                             ih264_g_six_tap[2] * (pu1_src[col] + pu1_src[col + 1 * src_strd]);
    199 
    200             pi4_pred_temp[col] = tmp;
    201         }
    202 
    203         pu1_src += src_strd;
    204         pi4_pred_temp += i4_pred_strd;
    205     }
    206 
    207     for (row = 0; row < ht; row++)
    208     {
    209         for (col = 0; col < wd; col++)
    210         {
    211             tmp = (pi4_pred[col - 2] + pi4_pred[col + 3]) +
    212                             ih264_g_six_tap[1] * (pi4_pred[col - 1] + pi4_pred[col + 2]) +
    213                             ih264_g_six_tap[2] * (pi4_pred[col] + pi4_pred[col + 1]);
    214 
    215             tmp = (tmp + 512) >> 10;
    216 
    217             pu1_dst2[col] = CLIP_U8(tmp);
    218             pu1_dst1[col] = CLIP_U8((pi4_pred[col] + 16) >> 5);
    219         }
    220         pi4_pred += i4_pred_strd;
    221         pu1_dst2 += dst_strd;
    222         pu1_dst1 += dst_strd;
    223     }
    224 }
    225 
    226