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 */
84 typedef void ih264e_sixtapfilter_horz_ft(UWORD8 *pu1_src,
85                                          UWORD8 *pu1_dst,
86                                          WORD32 src_strd,
87                                          WORD32 dst_strd);
88 
89 ih264e_sixtapfilter_horz_ft ih264e_sixtapfilter_horz;
90 
91 /* arm assembly */
92 ih264e_sixtapfilter_horz_ft ih264e_sixtapfilter_horz_a9q;
93 ih264e_sixtapfilter_horz_ft ih264e_sixtapfilter_horz_av8;
94 
95 /* x86 intrinsics*/
96 ih264e_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 */
144 typedef 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 
152 ih264e_sixtap_filter_2dvh_vert_ft ih264e_sixtap_filter_2dvh_vert;
153 
154 /* assembly */
155 ih264e_sixtap_filter_2dvh_vert_ft ih264e_sixtap_filter_2dvh_vert_a9q;
156 
157 ih264e_sixtap_filter_2dvh_vert_ft ih264e_sixtap_filter_2dvh_vert_av8;
158 
159 /* x86 intrinsics */
160 ih264e_sixtap_filter_2dvh_vert_ft ih264e_sixtap_filter_2dvh_vert_ssse3;
161 
162 #endif /* IH264E_HALF_PEL_H_ */
163