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.h
25 *
26 * @brief
27 *  Contains extern declarations of subpel functions used by the encoder
28 *
29 * @author
30 *  ittiam
31 *
32 * @remarks
33 *  none
34 *
35 *******************************************************************************
36 */
37
38#ifndef IH264E_HALF_PEL_H_
39#define IH264E_HALF_PEL_H_
40
41/*****************************************************************************/
42/* Global constants                                                          */
43/*****************************************************************************/
44/*
45 * Dimensions of subpel plane buffers
46 */
47#define HP_PL_WD  MB_SIZE + 1
48#define HP_PL_HT  MB_SIZE + 1
49
50/*****************************************************************************/
51/* Extern Function Declarations                                              */
52/*****************************************************************************/
53
54/**
55*******************************************************************************
56*
57* @brief
58*  Interprediction luma filter for horizontal input (Filter run for width = 17
59*  and height =16)
60*
61* @par Description:
62*  Applies a 6 tap horizontal filter .The output is  clipped to 8 bits
63*  sec 8.4.2.2.1 titled "Luma sample interpolation process"
64*
65* @param[in] pu1_src
66*  UWORD8 pointer to the source
67*
68* @param[out] pu1_dst
69*  UWORD8 pointer to the destination
70*
71* @param[in] src_strd
72*  integer source stride
73*
74* @param[in] dst_strd
75*  integer destination stride
76*
77* @returns
78*
79* @remarks
80*  None
81*
82*******************************************************************************
83*/
84typedef void ih264e_sixtapfilter_horz_ft(UWORD8 *pu1_src,
85                                         UWORD8 *pu1_dst,
86                                         WORD32 src_strd,
87                                         WORD32 dst_strd);
88
89ih264e_sixtapfilter_horz_ft ih264e_sixtapfilter_horz;
90
91/* arm assembly */
92ih264e_sixtapfilter_horz_ft ih264e_sixtapfilter_horz_a9q;
93ih264e_sixtapfilter_horz_ft ih264e_sixtapfilter_horz_av8;
94
95/* x86 intrinsics*/
96ih264e_sixtapfilter_horz_ft ih264e_sixtapfilter_horz_ssse3;
97
98/**
99*******************************************************************************
100*
101* @brief
102*  This function implements a two stage cascaded six tap filter. It applies
103*  the six tap filter in the vertical direction on the predictor values,
104*  followed by applying the same filter in the horizontal direction on the
105*  output of the first stage. The six tap filtering operation is described in
106*  sec 8.4.2.2.1 titled "Luma sample interpolation process" (Filter run for
107*  width = 17 and height = 17)
108*
109* @par Description:
110*  The function interpolates the predictors first in the vertical direction and
111*  then in the horizontal direction to output the (1/2,1/2). The output of the
112*  first stage of the filter is stored in the buffer pointed to by
113*  pi16_pred1(only in C) in 16 bit precision.
114*
115* @param[in] pu1_src
116*  UWORD8 pointer to the source
117*
118* @param[out] pu1_dst1
119*  UWORD8 pointer to the destination (Horizontal filtered output)
120*
121* @param[out] pu1_dst2
122*  UWORD8 pointer to the destination (output after applying vertical filter to
123*  the intermediate horizontal output)
124*
125* @param[in] src_strd
126*  integer source stride
127
128* @param[in] dst_strd
129*  integer destination stride of pu1_dst
130*
131* @param[in] pi4_pred
132*  Pointer to 16bit intermediate buffer (used only in c)
133*
134* @param[in] i4_pred_strd
135*  integer destination stride of pi16_pred1
136*
137* @returns
138*
139* @remarks
140*  None
141*
142*******************************************************************************
143*/
144typedef void ih264e_sixtap_filter_2dvh_vert_ft(UWORD8 *pu1_src,
145                                               UWORD8 *pu1_dst1,
146                                               UWORD8 *pu1_dst2,
147                                               WORD32 src_strd,
148                                               WORD32 dst_strd,
149                                               WORD32 *pi4_pred,
150                                               WORD32 i4_pred_strd);
151
152ih264e_sixtap_filter_2dvh_vert_ft ih264e_sixtap_filter_2dvh_vert;
153
154/* assembly */
155ih264e_sixtap_filter_2dvh_vert_ft ih264e_sixtap_filter_2dvh_vert_a9q;
156
157ih264e_sixtap_filter_2dvh_vert_ft ih264e_sixtap_filter_2dvh_vert_av8;
158
159/* x86 intrinsics */
160ih264e_sixtap_filter_2dvh_vert_ft ih264e_sixtap_filter_2dvh_vert_ssse3;
161
162#endif /* IH264E_HALF_PEL_H_ */
163