[cvs] / xvidcore / src / image / qpel.c Repository:
ViewVC logotype

Annotation of /xvidcore/src/image/qpel.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.7 - (view) (download)

1 : edgomez 1.2 /*****************************************************************************
2 :     *
3 :     * XVID MPEG-4 VIDEO CODEC
4 :     * - QPel interpolation -
5 :     *
6 :     * Copyright(C) 2003 Pascal Massimino <skal@planet-d.net>
7 :     *
8 :     * This program is free software ; you can redistribute it and/or modify
9 :     * it under the terms of the GNU General Public License as published by
10 :     * the Free Software Foundation ; either version 2 of the License, or
11 :     * (at your option) any later version.
12 :     *
13 :     * This program is distributed in the hope that it will be useful,
14 :     * but WITHOUT ANY WARRANTY ; without even the implied warranty of
15 :     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 :     * GNU General Public License for more details.
17 :     *
18 :     * You should have received a copy of the GNU General Public License
19 :     * along with this program ; if not, write to the Free Software
20 :     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 :     *
22 : Isibaar 1.7 * $Id: qpel.c,v 1.6 2005/07/11 22:10:24 Skal Exp $
23 : edgomez 1.2 *
24 :     ****************************************************************************/
25 :    
26 :     #ifndef XVID_AUTO_INCLUDE
27 :    
28 :     #include "../portab.h"
29 :     #include "qpel.h"
30 :    
31 :     /* Quarterpel FIR definition
32 :     ****************************************************************************/
33 :    
34 :     static const int32_t FIR_Tab_8[9][8] = {
35 :     { 14, -3, 2, -1, 0, 0, 0, 0 },
36 :     { 23, 19, -6, 3, -1, 0, 0, 0 },
37 :     { -7, 20, 20, -6, 3, -1, 0, 0 },
38 :     { 3, -6, 20, 20, -6, 3, -1, 0 },
39 :     { -1, 3, -6, 20, 20, -6, 3, -1 },
40 :     { 0, -1, 3, -6, 20, 20, -6, 3 },
41 :     { 0, 0, -1, 3, -6, 20, 20, -7 },
42 :     { 0, 0, 0, -1, 3, -6, 19, 23 },
43 :     { 0, 0, 0, 0, -1, 2, -3, 14 }
44 :     };
45 :    
46 :     static const int32_t FIR_Tab_16[17][16] = {
47 :     { 14, -3, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
48 :     { 23, 19, -6, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
49 :     { -7, 20, 20, -6, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
50 :     { 3, -6, 20, 20, -6, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
51 :     { -1, 3, -6, 20, 20, -6, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
52 :     { 0, -1, 3, -6, 20, 20, -6, 3, -1, 0, 0, 0, 0, 0, 0, 0 },
53 :     { 0, 0, -1, 3, -6, 20, 20, -6, 3, -1, 0, 0, 0, 0, 0, 0 },
54 :     { 0, 0, 0, -1, 3, -6, 20, 20, -6, 3, -1, 0, 0, 0, 0, 0 },
55 :     { 0, 0, 0, 0, -1, 3, -6, 20, 20, -6, 3, -1, 0, 0, 0, 0 },
56 :     { 0, 0, 0, 0, 0, -1, 3, -6, 20, 20, -6, 3, -1, 0, 0, 0 },
57 :     { 0, 0, 0, 0, 0, 0, -1, 3, -6, 20, 20, -6, 3, -1, 0, 0 },
58 :     { 0, 0, 0, 0, 0, 0, 0, -1, 3, -6, 20, 20, -6, 3, -1, 0 },
59 :     { 0, 0, 0, 0, 0, 0, 0, 0, -1, 3, -6, 20, 20, -6, 3, -1 },
60 :     { 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 3, -6, 20, 20, -6, 3 },
61 :     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 3, -6, 20, 20, -7 },
62 :     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 3, -6, 19, 23 },
63 :     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 2, -3, 14 }
64 :     };
65 :    
66 :     /* Implementation
67 :     ****************************************************************************/
68 :    
69 :     #define XVID_AUTO_INCLUDE
70 : edgomez 1.3 /* First auto include this file to generate reference code for SIMD versions
71 :     * This set of functions are good for educational purpose, because they're
72 :     * straightforward to understand, use loops and so on... But obviously they
73 :     * sux when it comes to speed */
74 :     #define REFERENCE_CODE
75 : edgomez 1.2
76 :     /* 16x? filters */
77 :    
78 :     #define SIZE 16
79 :     #define TABLE FIR_Tab_16
80 :    
81 :     #define STORE(d,s) (d) = (s)
82 : edgomez 1.3 #define FUNC_H H_Pass_16_C_ref
83 :     #define FUNC_V V_Pass_16_C_ref
84 :     #define FUNC_HA H_Pass_Avrg_16_C_ref
85 :     #define FUNC_VA V_Pass_Avrg_16_C_ref
86 :     #define FUNC_HA_UP H_Pass_Avrg_Up_16_C_ref
87 :     #define FUNC_VA_UP V_Pass_Avrg_Up_16_C_ref
88 :    
89 :     #include "qpel.c"
90 :    
91 :     /* note: B-frame always uses Rnd=0... */
92 :     #define STORE(d,s) (d) = ( (s)+(d)+1 ) >> 1
93 :     #define FUNC_H H_Pass_16_Add_C_ref
94 :     #define FUNC_V V_Pass_16_Add_C_ref
95 :     #define FUNC_HA H_Pass_Avrg_16_Add_C_ref
96 :     #define FUNC_VA V_Pass_Avrg_16_Add_C_ref
97 :     #define FUNC_HA_UP H_Pass_Avrg_Up_16_Add_C_ref
98 :     #define FUNC_VA_UP V_Pass_Avrg_Up_16_Add_C_ref
99 :    
100 :     #include "qpel.c"
101 :    
102 :     #undef SIZE
103 :     #undef TABLE
104 :    
105 :     /* 8x? filters */
106 :    
107 :     #define SIZE 8
108 :     #define TABLE FIR_Tab_8
109 :    
110 :     #define STORE(d,s) (d) = (s)
111 :     #define FUNC_H H_Pass_8_C_ref
112 :     #define FUNC_V V_Pass_8_C_ref
113 :     #define FUNC_HA H_Pass_Avrg_8_C_ref
114 :     #define FUNC_VA V_Pass_Avrg_8_C_ref
115 :     #define FUNC_HA_UP H_Pass_Avrg_Up_8_C_ref
116 :     #define FUNC_VA_UP V_Pass_Avrg_Up_8_C_ref
117 :    
118 :     #include "qpel.c"
119 :    
120 :     /* note: B-frame always uses Rnd=0... */
121 :     #define STORE(d,s) (d) = ( (s)+(d)+1 ) >> 1
122 :     #define FUNC_H H_Pass_8_Add_C_ref
123 :     #define FUNC_V V_Pass_8_Add_C_ref
124 :     #define FUNC_HA H_Pass_Avrg_8_Add_C_ref
125 :     #define FUNC_VA V_Pass_Avrg_8_Add_C_ref
126 :     #define FUNC_HA_UP H_Pass_Avrg_Up_8_Add_C_ref
127 :     #define FUNC_VA_UP V_Pass_Avrg_Up_8_Add_C_ref
128 :    
129 :     #include "qpel.c"
130 :    
131 :     #undef SIZE
132 :     #undef TABLE
133 :    
134 :     /* Then we define more optimized C version where loops are unrolled, where
135 :     * FIR coeffcients are not read from memory but are hardcoded in instructions
136 :     * They should be faster */
137 :     #undef REFERENCE_CODE
138 :    
139 :     /* 16x? filters */
140 :    
141 :     #define SIZE 16
142 :    
143 :     #define STORE(d,s) (d) = (s)
144 : edgomez 1.2 #define FUNC_H H_Pass_16_C
145 :     #define FUNC_V V_Pass_16_C
146 :     #define FUNC_HA H_Pass_Avrg_16_C
147 :     #define FUNC_VA V_Pass_Avrg_16_C
148 :     #define FUNC_HA_UP H_Pass_Avrg_Up_16_C
149 :     #define FUNC_VA_UP V_Pass_Avrg_Up_16_C
150 :    
151 : edgomez 1.3 #include "qpel.c"
152 : edgomez 1.2
153 :     /* note: B-frame always uses Rnd=0... */
154 :     #define STORE(d,s) (d) = ( (s)+(d)+1 ) >> 1
155 :     #define FUNC_H H_Pass_16_Add_C
156 :     #define FUNC_V V_Pass_16_Add_C
157 :     #define FUNC_HA H_Pass_Avrg_16_Add_C
158 :     #define FUNC_VA V_Pass_Avrg_16_Add_C
159 :     #define FUNC_HA_UP H_Pass_Avrg_Up_16_Add_C
160 :     #define FUNC_VA_UP V_Pass_Avrg_Up_16_Add_C
161 :    
162 : edgomez 1.3 #include "qpel.c"
163 : edgomez 1.2
164 :     #undef SIZE
165 :     #undef TABLE
166 :    
167 :     /* 8x? filters */
168 :    
169 :     #define SIZE 8
170 :     #define TABLE FIR_Tab_8
171 :    
172 :     #define STORE(d,s) (d) = (s)
173 :     #define FUNC_H H_Pass_8_C
174 :     #define FUNC_V V_Pass_8_C
175 :     #define FUNC_HA H_Pass_Avrg_8_C
176 :     #define FUNC_VA V_Pass_Avrg_8_C
177 :     #define FUNC_HA_UP H_Pass_Avrg_Up_8_C
178 :     #define FUNC_VA_UP V_Pass_Avrg_Up_8_C
179 :    
180 : edgomez 1.3 #include "qpel.c"
181 : edgomez 1.2
182 :     /* note: B-frame always uses Rnd=0... */
183 :     #define STORE(d,s) (d) = ( (s)+(d)+1 ) >> 1
184 :     #define FUNC_H H_Pass_8_Add_C
185 :     #define FUNC_V V_Pass_8_Add_C
186 :     #define FUNC_HA H_Pass_Avrg_8_Add_C
187 :     #define FUNC_VA V_Pass_Avrg_8_Add_C
188 :     #define FUNC_HA_UP H_Pass_Avrg_Up_8_Add_C
189 :     #define FUNC_VA_UP V_Pass_Avrg_Up_8_Add_C
190 :    
191 : edgomez 1.3 #include "qpel.c"
192 : edgomez 1.2
193 :     #undef SIZE
194 :     #undef TABLE
195 :     #undef XVID_AUTO_INCLUDE
196 :    
197 : edgomez 1.3 /* Global scope hooks
198 : edgomez 1.2 ****************************************************************************/
199 :    
200 :     XVID_QP_FUNCS *xvid_QP_Funcs = 0;
201 :     XVID_QP_FUNCS *xvid_QP_Add_Funcs = 0;
202 :    
203 : edgomez 1.3 /* Reference plain C impl. declaration
204 :     ****************************************************************************/
205 :    
206 :     XVID_QP_FUNCS xvid_QP_Funcs_C_ref = {
207 :     H_Pass_16_C_ref, H_Pass_Avrg_16_C_ref, H_Pass_Avrg_Up_16_C_ref,
208 :     V_Pass_16_C_ref, V_Pass_Avrg_16_C_ref, V_Pass_Avrg_Up_16_C_ref,
209 :    
210 :     H_Pass_8_C_ref, H_Pass_Avrg_8_C_ref, H_Pass_Avrg_Up_8_C_ref,
211 :     V_Pass_8_C_ref, V_Pass_Avrg_8_C_ref, V_Pass_Avrg_Up_8_C_ref
212 :     };
213 :    
214 :     XVID_QP_FUNCS xvid_QP_Add_Funcs_C_ref = {
215 :     H_Pass_16_Add_C_ref, H_Pass_Avrg_16_Add_C_ref, H_Pass_Avrg_Up_16_Add_C_ref,
216 :     V_Pass_16_Add_C_ref, V_Pass_Avrg_16_Add_C_ref, V_Pass_Avrg_Up_16_Add_C_ref,
217 :    
218 :     H_Pass_8_Add_C_ref, H_Pass_Avrg_8_Add_C_ref, H_Pass_Avrg_Up_8_Add_C_ref,
219 :     V_Pass_8_Add_C_ref, V_Pass_Avrg_8_Add_C_ref, V_Pass_Avrg_Up_8_Add_C_ref
220 :     };
221 :    
222 :     /* Plain C impl. declaration (faster than ref one)
223 : edgomez 1.2 ****************************************************************************/
224 :    
225 :     XVID_QP_FUNCS xvid_QP_Funcs_C = {
226 :     H_Pass_16_C, H_Pass_Avrg_16_C, H_Pass_Avrg_Up_16_C,
227 :     V_Pass_16_C, V_Pass_Avrg_16_C, V_Pass_Avrg_Up_16_C,
228 :    
229 :     H_Pass_8_C, H_Pass_Avrg_8_C, H_Pass_Avrg_Up_8_C,
230 :     V_Pass_8_C, V_Pass_Avrg_8_C, V_Pass_Avrg_Up_8_C
231 :     };
232 :    
233 :     XVID_QP_FUNCS xvid_QP_Add_Funcs_C = {
234 :     H_Pass_16_Add_C, H_Pass_Avrg_16_Add_C, H_Pass_Avrg_Up_16_Add_C,
235 :     V_Pass_16_Add_C, V_Pass_Avrg_16_Add_C, V_Pass_Avrg_Up_16_Add_C,
236 :    
237 :     H_Pass_8_Add_C, H_Pass_Avrg_8_Add_C, H_Pass_Avrg_Up_8_Add_C,
238 :     V_Pass_8_Add_C, V_Pass_Avrg_8_Add_C, V_Pass_Avrg_Up_8_Add_C
239 :     };
240 :    
241 :     /* mmx impl. declaration (see. qpel_mmx.asm
242 :     ****************************************************************************/
243 :    
244 :     #ifdef ARCH_IS_IA32
245 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_16_mmx);
246 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_16_mmx);
247 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_Up_16_mmx);
248 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_16_mmx);
249 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_16_mmx);
250 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_Up_16_mmx);
251 :    
252 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_8_mmx);
253 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_8_mmx);
254 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_Up_8_mmx);
255 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_8_mmx);
256 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_8_mmx);
257 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_Up_8_mmx);
258 :    
259 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Add_16_mmx);
260 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_Add_16_mmx);
261 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_Up_Add_16_mmx);
262 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Add_16_mmx);
263 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_Add_16_mmx);
264 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_Up_Add_16_mmx);
265 :    
266 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_8_Add_mmx);
267 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_8_Add_mmx);
268 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_Up_8_Add_mmx);
269 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_8_Add_mmx);
270 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_8_Add_mmx);
271 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_Up_8_Add_mmx);
272 :    
273 : edgomez 1.3 XVID_QP_FUNCS xvid_QP_Funcs_mmx = {
274 :     xvid_H_Pass_16_mmx, xvid_H_Pass_Avrg_16_mmx, xvid_H_Pass_Avrg_Up_16_mmx,
275 :     xvid_V_Pass_16_mmx, xvid_V_Pass_Avrg_16_mmx, xvid_V_Pass_Avrg_Up_16_mmx,
276 :    
277 :     xvid_H_Pass_8_mmx, xvid_H_Pass_Avrg_8_mmx, xvid_H_Pass_Avrg_Up_8_mmx,
278 :     xvid_V_Pass_8_mmx, xvid_V_Pass_Avrg_8_mmx, xvid_V_Pass_Avrg_Up_8_mmx
279 :     };
280 :    
281 : edgomez 1.2 XVID_QP_FUNCS xvid_QP_Add_Funcs_mmx = {
282 :     xvid_H_Pass_Add_16_mmx, xvid_H_Pass_Avrg_Add_16_mmx, xvid_H_Pass_Avrg_Up_Add_16_mmx,
283 :     xvid_V_Pass_Add_16_mmx, xvid_V_Pass_Avrg_Add_16_mmx, xvid_V_Pass_Avrg_Up_Add_16_mmx,
284 :    
285 :     xvid_H_Pass_8_Add_mmx, xvid_H_Pass_Avrg_8_Add_mmx, xvid_H_Pass_Avrg_Up_8_Add_mmx,
286 :     xvid_V_Pass_8_Add_mmx, xvid_V_Pass_Avrg_8_Add_mmx, xvid_V_Pass_Avrg_Up_8_Add_mmx,
287 :     };
288 :     #endif /* ARCH_IS_IA32 */
289 :    
290 : edgomez 1.4
291 :     /* altivec impl. declaration (see qpel_altivec.c)
292 :     ****************************************************************************/
293 :    
294 :     #ifdef ARCH_IS_PPC
295 :    
296 :     extern XVID_QP_PASS_SIGNATURE(H_Pass_16_Altivec_C);
297 :     extern XVID_QP_PASS_SIGNATURE(H_Pass_Avrg_16_Altivec_C);
298 :     extern XVID_QP_PASS_SIGNATURE(H_Pass_Avrg_Up_16_Altivec_C);
299 :     extern XVID_QP_PASS_SIGNATURE(V_Pass_16_Altivec_C);
300 :     extern XVID_QP_PASS_SIGNATURE(V_Pass_Avrg_16_Altivec_C);
301 :     extern XVID_QP_PASS_SIGNATURE(V_Pass_Avrg_Up_16_Altivec_C);
302 :    
303 :     extern XVID_QP_PASS_SIGNATURE(H_Pass_8_Altivec_C);
304 :     extern XVID_QP_PASS_SIGNATURE(H_Pass_Avrg_8_Altivec_C);
305 :     extern XVID_QP_PASS_SIGNATURE(H_Pass_Avrg_Up_8_Altivec_C);
306 :     extern XVID_QP_PASS_SIGNATURE(V_Pass_8_Altivec_C);
307 :     extern XVID_QP_PASS_SIGNATURE(V_Pass_Avrg_8_Altivec_C);
308 :     extern XVID_QP_PASS_SIGNATURE(V_Pass_Avrg_Up_8_Altivec_C);
309 :    
310 :    
311 :     extern XVID_QP_PASS_SIGNATURE(H_Pass_16_Add_Altivec_C);
312 :     extern XVID_QP_PASS_SIGNATURE(H_Pass_Avrg_16_Add_Altivec_C);
313 :     extern XVID_QP_PASS_SIGNATURE(H_Pass_Avrg_Up_16_Add_Altivec_C);
314 :     extern XVID_QP_PASS_SIGNATURE(V_Pass_16_Add_Altivec_C);
315 :     extern XVID_QP_PASS_SIGNATURE(V_Pass_Avrg_16_Add_Altivec_C);
316 :     extern XVID_QP_PASS_SIGNATURE(V_Pass_Avrg_Up_16_Add_Altivec_C);
317 :    
318 :     extern XVID_QP_PASS_SIGNATURE(H_Pass_8_Add_Altivec_C);
319 :     extern XVID_QP_PASS_SIGNATURE(H_Pass_Avrg_8_Add_Altivec_C);
320 :     extern XVID_QP_PASS_SIGNATURE(H_Pass_Avrg_Up_8_Add_Altivec_C);
321 :     extern XVID_QP_PASS_SIGNATURE(V_Pass_8_Add_Altivec_C);
322 :     extern XVID_QP_PASS_SIGNATURE(V_Pass_Avrg_8_Add_Altivec_C);
323 :     extern XVID_QP_PASS_SIGNATURE(V_Pass_Avrg_Up_8_Add_Altivec_C);
324 :    
325 :     XVID_QP_FUNCS xvid_QP_Funcs_Altivec_C = {
326 :     H_Pass_16_Altivec_C, H_Pass_Avrg_16_Altivec_C, H_Pass_Avrg_Up_16_Altivec_C,
327 :     V_Pass_16_Altivec_C, V_Pass_Avrg_16_Altivec_C, V_Pass_Avrg_Up_16_Altivec_C,
328 :    
329 :     H_Pass_8_Altivec_C, H_Pass_Avrg_8_Altivec_C, H_Pass_Avrg_Up_8_Altivec_C,
330 :     V_Pass_8_Altivec_C, V_Pass_Avrg_8_Altivec_C, V_Pass_Avrg_Up_8_Altivec_C
331 :     };
332 :    
333 :     XVID_QP_FUNCS xvid_QP_Add_Funcs_Altivec_C = {
334 :     H_Pass_16_Add_Altivec_C, H_Pass_Avrg_16_Add_Altivec_C, H_Pass_Avrg_Up_16_Add_Altivec_C,
335 :     V_Pass_16_Add_Altivec_C, V_Pass_Avrg_16_Add_Altivec_C, V_Pass_Avrg_Up_16_Add_Altivec_C,
336 :    
337 :     H_Pass_8_Add_Altivec_C, H_Pass_Avrg_8_Add_Altivec_C, H_Pass_Avrg_Up_8_Add_Altivec_C,
338 :     V_Pass_8_Add_Altivec_C, V_Pass_Avrg_8_Add_Altivec_C, V_Pass_Avrg_Up_8_Add_Altivec_C
339 :     };
340 :    
341 :     #endif /* ARCH_IS_PPC */
342 :    
343 : edgomez 1.5 /* mmx impl. (for 64bit bus) declaration (see. qpel_mmx.asm
344 :     ****************************************************************************/
345 :    
346 :     #ifdef ARCH_IS_X86_64
347 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_16_x86_64);
348 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_16_x86_64);
349 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_Up_16_x86_64);
350 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_16_x86_64);
351 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_16_x86_64);
352 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_Up_16_x86_64);
353 :    
354 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_8_x86_64);
355 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_8_x86_64);
356 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_Up_8_x86_64);
357 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_8_x86_64);
358 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_8_x86_64);
359 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_Up_8_x86_64);
360 :    
361 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Add_16_x86_64);
362 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_Add_16_x86_64);
363 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_Up_Add_16_x86_64);
364 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Add_16_x86_64);
365 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_Add_16_x86_64);
366 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_Up_Add_16_x86_64);
367 :    
368 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_8_Add_x86_64);
369 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_8_Add_x86_64);
370 :     extern XVID_QP_PASS_SIGNATURE(xvid_H_Pass_Avrg_Up_8_Add_x86_64);
371 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_8_Add_x86_64);
372 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_8_Add_x86_64);
373 :     extern XVID_QP_PASS_SIGNATURE(xvid_V_Pass_Avrg_Up_8_Add_x86_64);
374 :    
375 :     XVID_QP_FUNCS xvid_QP_Funcs_x86_64 = {
376 :     xvid_H_Pass_16_x86_64, xvid_H_Pass_Avrg_16_x86_64, xvid_H_Pass_Avrg_Up_16_x86_64,
377 :     xvid_V_Pass_16_x86_64, xvid_V_Pass_Avrg_16_x86_64, xvid_V_Pass_Avrg_Up_16_x86_64,
378 :    
379 :     xvid_H_Pass_8_x86_64, xvid_H_Pass_Avrg_8_x86_64, xvid_H_Pass_Avrg_Up_8_x86_64,
380 :     xvid_V_Pass_8_x86_64, xvid_V_Pass_Avrg_8_x86_64, xvid_V_Pass_Avrg_Up_8_x86_64
381 :     };
382 :    
383 :     XVID_QP_FUNCS xvid_QP_Add_Funcs_x86_64 = {
384 :     xvid_H_Pass_Add_16_x86_64, xvid_H_Pass_Avrg_Add_16_x86_64, xvid_H_Pass_Avrg_Up_Add_16_x86_64,
385 :     xvid_V_Pass_Add_16_x86_64, xvid_V_Pass_Avrg_Add_16_x86_64, xvid_V_Pass_Avrg_Up_Add_16_x86_64,
386 :    
387 :     xvid_H_Pass_8_Add_x86_64, xvid_H_Pass_Avrg_8_Add_x86_64, xvid_H_Pass_Avrg_Up_8_Add_x86_64,
388 :     xvid_V_Pass_8_Add_x86_64, xvid_V_Pass_Avrg_8_Add_x86_64, xvid_V_Pass_Avrg_Up_8_Add_x86_64,
389 :     };
390 :     #endif /* ARCH_IS_X86_64 */
391 :    
392 : edgomez 1.2 /* tables for ASM
393 :     ****************************************************************************/
394 :    
395 :     #ifdef ARCH_IS_IA32
396 :     uint16_t xvid_Expand_mmx[256][4]; /* 8b -> 64b expansion table */
397 :     #endif
398 :    
399 : edgomez 1.5 #ifdef ARCH_IS_X86_64
400 : Skal 1.6 extern uint16_t xvid_Expand_mmx[256][4]; /* 8b -> 64b expansion table */
401 : edgomez 1.5 #endif
402 :    
403 : edgomez 1.2 /* Alternate way of filtering (cf. USE_TABLES flag in qpel_mmx.asm)
404 :     *
405 :     * 17 tables, 2K each => 34K
406 :     * Mirroring can be acheived composing 11 basic tables
407 :     * (for instance: (23,19,-6,3)=(20,20,-6,3)+(3,-1,0,0)
408 :     * Using Symmetries (and bswap) could reduce further
409 :     * the memory to 7 tables (->14K). */
410 : edgomez 1.5 #ifdef ARCH_IS_X86_64
411 : Isibaar 1.7 #define __SCOPE extern
412 : edgomez 1.5 #else
413 : Isibaar 1.7 #define __SCOPE
414 : edgomez 1.5 #endif
415 : edgomez 1.2
416 : Isibaar 1.7 __SCOPE int16_t xvid_FIR_1_0_0_0[256][4];
417 :     __SCOPE int16_t xvid_FIR_3_1_0_0[256][4];
418 :     __SCOPE int16_t xvid_FIR_6_3_1_0[256][4];
419 :     __SCOPE int16_t xvid_FIR_14_3_2_1[256][4];
420 :     __SCOPE int16_t xvid_FIR_20_6_3_1[256][4];
421 :     __SCOPE int16_t xvid_FIR_20_20_6_3[256][4];
422 :     __SCOPE int16_t xvid_FIR_23_19_6_3[256][4];
423 :     __SCOPE int16_t xvid_FIR_7_20_20_6[256][4];
424 :     __SCOPE int16_t xvid_FIR_6_20_20_6[256][4];
425 :     __SCOPE int16_t xvid_FIR_6_20_20_7[256][4];
426 :     __SCOPE int16_t xvid_FIR_3_6_20_20[256][4];
427 :     __SCOPE int16_t xvid_FIR_3_6_19_23[256][4];
428 :     __SCOPE int16_t xvid_FIR_1_3_6_20[256][4];
429 :     __SCOPE int16_t xvid_FIR_1_2_3_14[256][4];
430 :     __SCOPE int16_t xvid_FIR_0_1_3_6[256][4];
431 :     __SCOPE int16_t xvid_FIR_0_0_1_3[256][4];
432 :     __SCOPE int16_t xvid_FIR_0_0_0_1[256][4];
433 :    
434 : edgomez 1.2 static void Init_FIR_Table(int16_t Tab[][4],
435 :     int A, int B, int C, int D)
436 :     {
437 :     int i;
438 :     for(i=0; i<256; ++i) {
439 :     Tab[i][0] = i*A;
440 :     Tab[i][1] = i*B;
441 :     Tab[i][2] = i*C;
442 :     Tab[i][3] = i*D;
443 :     }
444 :     }
445 :    
446 :    
447 :     void xvid_Init_QP()
448 :     {
449 :     #ifdef ARCH_IS_IA32
450 :     int i;
451 :    
452 :     for(i=0; i<256; ++i) {
453 :     xvid_Expand_mmx[i][0] = i;
454 :     xvid_Expand_mmx[i][1] = i;
455 :     xvid_Expand_mmx[i][2] = i;
456 :     xvid_Expand_mmx[i][3] = i;
457 :     }
458 :     #endif
459 :    
460 :     /* Alternate way of filtering (cf. USE_TABLES flag in qpel_mmx.asm) */
461 :    
462 :     Init_FIR_Table(xvid_FIR_1_0_0_0, -1, 0, 0, 0);
463 :     Init_FIR_Table(xvid_FIR_3_1_0_0, 3, -1, 0, 0);
464 :     Init_FIR_Table(xvid_FIR_6_3_1_0, -6, 3, -1, 0);
465 :     Init_FIR_Table(xvid_FIR_14_3_2_1, 14, -3, 2, -1);
466 :     Init_FIR_Table(xvid_FIR_20_6_3_1, 20, -6, 3, -1);
467 :     Init_FIR_Table(xvid_FIR_20_20_6_3, 20, 20, -6, 3);
468 :     Init_FIR_Table(xvid_FIR_23_19_6_3, 23, 19, -6, 3);
469 :     Init_FIR_Table(xvid_FIR_7_20_20_6, -7, 20, 20, -6);
470 :     Init_FIR_Table(xvid_FIR_6_20_20_6, -6, 20, 20, -6);
471 :     Init_FIR_Table(xvid_FIR_6_20_20_7, -6, 20, 20, -7);
472 :     Init_FIR_Table(xvid_FIR_3_6_20_20, 3, -6, 20, 20);
473 :     Init_FIR_Table(xvid_FIR_3_6_19_23, 3, -6, 19, 23);
474 :     Init_FIR_Table(xvid_FIR_1_3_6_20, -1, 3, -6, 20);
475 :     Init_FIR_Table(xvid_FIR_1_2_3_14, -1, 2, -3, 14);
476 :     Init_FIR_Table(xvid_FIR_0_1_3_6, 0, -1, 3, -6);
477 :     Init_FIR_Table(xvid_FIR_0_0_1_3, 0, 0, -1, 3);
478 :     Init_FIR_Table(xvid_FIR_0_0_0_1, 0, 0, 0, -1);
479 :    
480 :     }
481 :    
482 :     #endif /* !XVID_AUTO_INCLUDE */
483 :    
484 : edgomez 1.3 #if defined(XVID_AUTO_INCLUDE) && defined(REFERENCE_CODE)
485 :    
486 : edgomez 1.2 /*****************************************************************************
487 :     * "reference" filters impl. in plain C
488 :     ****************************************************************************/
489 :    
490 :     static
491 :     void FUNC_H(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
492 :     {
493 :     while(H-->0) {
494 :     int32_t i, k;
495 :     int32_t Sums[SIZE] = { 0 };
496 :     for(i=0; i<=SIZE; ++i)
497 :     for(k=0; k<SIZE; ++k)
498 :     Sums[k] += TABLE[i][k] * Src[i];
499 :    
500 :     for(i=0; i<SIZE; ++i) {
501 :     int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
502 :     if (C<0) C = 0; else if (C>255) C = 255;
503 :     STORE(Dst[i], C);
504 :     }
505 :     Src += BpS;
506 :     Dst += BpS;
507 :     }
508 :     }
509 :    
510 :     static
511 :     void FUNC_V(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
512 :     {
513 :     while(W-->0) {
514 :     int32_t i, k;
515 :     int32_t Sums[SIZE] = { 0 };
516 :     const uint8_t *S = Src++;
517 :     uint8_t *D = Dst++;
518 :     for(i=0; i<=SIZE; ++i) {
519 :     for(k=0; k<SIZE; ++k)
520 :     Sums[k] += TABLE[i][k] * S[0];
521 :     S += BpS;
522 :     }
523 :    
524 :     for(i=0; i<SIZE; ++i) {
525 :     int32_t C = ( Sums[i] + 16-Rnd )>>5;
526 :     if (C<0) C = 0; else if (C>255) C = 255;
527 :     STORE(D[0], C);
528 :     D += BpS;
529 :     }
530 :     }
531 :     }
532 :    
533 :     static
534 :     void FUNC_HA(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
535 :     {
536 :     while(H-->0) {
537 :     int32_t i, k;
538 :     int32_t Sums[SIZE] = { 0 };
539 :     for(i=0; i<=SIZE; ++i)
540 :     for(k=0; k<SIZE; ++k)
541 :     Sums[k] += TABLE[i][k] * Src[i];
542 :    
543 :     for(i=0; i<SIZE; ++i) {
544 :     int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
545 :     if (C<0) C = 0; else if (C>255) C = 255;
546 :     C = (C+Src[i]+1-Rnd) >> 1;
547 :     STORE(Dst[i], C);
548 :     }
549 :     Src += BpS;
550 :     Dst += BpS;
551 :     }
552 :     }
553 :    
554 :     static
555 :     void FUNC_HA_UP(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
556 :     {
557 :     while(H-->0) {
558 :     int32_t i, k;
559 :     int32_t Sums[SIZE] = { 0 };
560 :     for(i=0; i<=SIZE; ++i)
561 :     for(k=0; k<SIZE; ++k)
562 :     Sums[k] += TABLE[i][k] * Src[i];
563 :    
564 :     for(i=0; i<SIZE; ++i) {
565 :     int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
566 :     if (C<0) C = 0; else if (C>255) C = 255;
567 :     C = (C+Src[i+1]+1-Rnd) >> 1;
568 :     STORE(Dst[i], C);
569 :     }
570 :     Src += BpS;
571 :     Dst += BpS;
572 :     }
573 :     }
574 :    
575 :     static
576 :     void FUNC_VA(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
577 :     {
578 :     while(W-->0) {
579 :     int32_t i, k;
580 :     int32_t Sums[SIZE] = { 0 };
581 :     const uint8_t *S = Src;
582 :     uint8_t *D = Dst;
583 :    
584 :     for(i=0; i<=SIZE; ++i) {
585 :     for(k=0; k<SIZE; ++k)
586 :     Sums[k] += TABLE[i][k] * S[0];
587 :     S += BpS;
588 :     }
589 :    
590 :     S = Src;
591 :     for(i=0; i<SIZE; ++i) {
592 :     int32_t C = ( Sums[i] + 16-Rnd )>>5;
593 :     if (C<0) C = 0; else if (C>255) C = 255;
594 :     C = ( C+S[0]+1-Rnd ) >> 1;
595 :     STORE(D[0], C);
596 :     D += BpS;
597 :     S += BpS;
598 :     }
599 :     Src++;
600 :     Dst++;
601 :     }
602 :     }
603 :    
604 :     static
605 :     void FUNC_VA_UP(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
606 :     {
607 :     while(W-->0) {
608 :     int32_t i, k;
609 :     int32_t Sums[SIZE] = { 0 };
610 :     const uint8_t *S = Src;
611 :     uint8_t *D = Dst;
612 :    
613 :     for(i=0; i<=SIZE; ++i) {
614 :     for(k=0; k<SIZE; ++k)
615 :     Sums[k] += TABLE[i][k] * S[0];
616 :     S += BpS;
617 :     }
618 :    
619 :     S = Src + BpS;
620 :     for(i=0; i<SIZE; ++i) {
621 :     int32_t C = ( Sums[i] + 16-Rnd )>>5;
622 :     if (C<0) C = 0; else if (C>255) C = 255;
623 :     C = ( C+S[0]+1-Rnd ) >> 1;
624 :     STORE(D[0], C);
625 :     D += BpS;
626 :     S += BpS;
627 :     }
628 :     Dst++;
629 :     Src++;
630 :     }
631 :     }
632 :    
633 :     #undef STORE
634 :     #undef FUNC_H
635 :     #undef FUNC_V
636 :     #undef FUNC_HA
637 :     #undef FUNC_VA
638 :     #undef FUNC_HA_UP
639 :     #undef FUNC_VA_UP
640 :    
641 : edgomez 1.3 #elif defined(XVID_AUTO_INCLUDE) && !defined(REFERENCE_CODE)
642 :    
643 :     /*****************************************************************************
644 :     * "fast" filters impl. in plain C
645 :     ****************************************************************************/
646 :    
647 :     #define CLIP_STORE(D,C) \
648 :     if (C<0) C = 0; else if (C>(255<<5)) C = 255; else C = C>>5; \
649 :     STORE(D, C)
650 :    
651 :     static void
652 :     FUNC_H(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t RND)
653 :     {
654 :     #if (SIZE==16)
655 :     while(H-->0) {
656 :     int C;
657 :     C = 16-RND +14*Src[0] +23*Src[1] - 7*Src[2] + 3*Src[3] - Src[4];
658 :     CLIP_STORE(Dst[ 0],C);
659 :     C = 16-RND - 3*(Src[0]-Src[4]) +19*Src[1] +20*Src[2] - 6*Src[3] - Src[5];
660 :     CLIP_STORE(Dst[ 1],C);
661 :     C = 16-RND + 2*Src[0] - 6*(Src[1]+Src[4]) +20*(Src[2]+Src[3]) + 3*Src[5] - Src[6];
662 :     CLIP_STORE(Dst[ 2],C);
663 :     C = 16-RND - (Src[0]+Src[7 ]) + 3*(Src[ 1]+Src[ 6])-6*(Src[ 2]+Src[ 5]) + 20*(Src[ 3]+Src[ 4]);
664 :     CLIP_STORE(Dst[ 3],C);
665 :     C = 16-RND - (Src[1]+Src[8 ]) + 3*(Src[ 2]+Src[ 7])-6*(Src[ 3]+Src[ 6]) + 20*(Src[ 4]+Src[ 5]);
666 :     CLIP_STORE(Dst[ 4],C);
667 :     C = 16-RND - (Src[2]+Src[9 ]) + 3*(Src[ 3]+Src[ 8])-6*(Src[ 4]+Src[ 7]) + 20*(Src[ 5]+Src[ 6]);
668 :     CLIP_STORE(Dst[ 5],C);
669 :     C = 16-RND - (Src[3]+Src[10]) + 3*(Src[ 4]+Src[ 9])-6*(Src[ 5]+Src[ 8]) + 20*(Src[ 6]+Src[ 7]);
670 :     CLIP_STORE(Dst[ 6],C);
671 :     C = 16-RND - (Src[4]+Src[11]) + 3*(Src[ 5]+Src[10])-6*(Src[ 6]+Src[ 9]) + 20*(Src[ 7]+Src[ 8]);
672 :     CLIP_STORE(Dst[ 7],C);
673 :     C = 16-RND - (Src[5]+Src[12]) + 3*(Src[ 6]+Src[11])-6*(Src[ 7]+Src[10]) + 20*(Src[ 8]+Src[ 9]);
674 :     CLIP_STORE(Dst[ 8],C);
675 :     C = 16-RND - (Src[6]+Src[13]) + 3*(Src[ 7]+Src[12])-6*(Src[ 8]+Src[11]) + 20*(Src[ 9]+Src[10]);
676 :     CLIP_STORE(Dst[ 9],C);
677 :     C = 16-RND - (Src[7]+Src[14]) + 3*(Src[ 8]+Src[13])-6*(Src[ 9]+Src[12]) + 20*(Src[10]+Src[11]);
678 :     CLIP_STORE(Dst[10],C);
679 :     C = 16-RND - (Src[8]+Src[15]) + 3*(Src[ 9]+Src[14])-6*(Src[10]+Src[13]) + 20*(Src[11]+Src[12]);
680 :     CLIP_STORE(Dst[11],C);
681 :     C = 16-RND - (Src[9]+Src[16]) + 3*(Src[10]+Src[15])-6*(Src[11]+Src[14]) + 20*(Src[12]+Src[13]);
682 :     CLIP_STORE(Dst[12],C);
683 :     C = 16-RND - Src[10] +3*Src[11] -6*(Src[12]+Src[15]) + 20*(Src[13]+Src[14]) +2*Src[16];
684 :     CLIP_STORE(Dst[13],C);
685 :     C = 16-RND - Src[11] +3*(Src[12]-Src[16]) -6*Src[13] + 20*Src[14] + 19*Src[15];
686 :     CLIP_STORE(Dst[14],C);
687 :     C = 16-RND - Src[12] +3*Src[13] -7*Src[14] + 23*Src[15] + 14*Src[16];
688 :     CLIP_STORE(Dst[15],C);
689 :     Src += BpS;
690 :     Dst += BpS;
691 :     }
692 :     #else
693 :     while(H-->0) {
694 :     int C;
695 :     C = 16-RND +14*Src[0] +23*Src[1] - 7*Src[2] + 3*Src[3] - Src[4];
696 :     CLIP_STORE(Dst[0],C);
697 :     C = 16-RND - 3*(Src[0]-Src[4]) +19*Src[1] +20*Src[2] - 6*Src[3] - Src[5];
698 :     CLIP_STORE(Dst[1],C);
699 :     C = 16-RND + 2*Src[0] - 6*(Src[1]+Src[4]) +20*(Src[2]+Src[3]) + 3*Src[5] - Src[6];
700 :     CLIP_STORE(Dst[2],C);
701 :     C = 16-RND - (Src[0]+Src[7]) + 3*(Src[1]+Src[6])-6*(Src[2]+Src[5]) + 20*(Src[3]+Src[4]);
702 :     CLIP_STORE(Dst[3],C);
703 :     C = 16-RND - (Src[1]+Src[8]) + 3*(Src[2]+Src[7])-6*(Src[3]+Src[6]) + 20*(Src[4]+Src[5]);
704 :     CLIP_STORE(Dst[4],C);
705 :     C = 16-RND - Src[2] +3*Src[3] -6*(Src[4]+Src[7]) + 20*(Src[5]+Src[6]) +2*Src[8];
706 :     CLIP_STORE(Dst[5],C);
707 :     C = 16-RND - Src[3] +3*(Src[4]-Src[8]) -6*Src[5] + 20*Src[6] + 19*Src[7];
708 :     CLIP_STORE(Dst[6],C);
709 :     C = 16-RND - Src[4] +3*Src[5] -7*Src[6] + 23*Src[7] + 14*Src[8];
710 :     CLIP_STORE(Dst[7],C);
711 :     Src += BpS;
712 :     Dst += BpS;
713 :     }
714 :     #endif
715 :     }
716 :     #undef CLIP_STORE
717 :    
718 :     #define CLIP_STORE(i,C) \
719 :     if (C<0) C = 0; else if (C>(255<<5)) C = 255; else C = C>>5; \
720 :     C = (C+Src[i]+1-RND) >> 1; \
721 :     STORE(Dst[i], C)
722 :    
723 :     static void
724 :     FUNC_HA(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t RND)
725 :     {
726 :     #if (SIZE==16)
727 :     while(H-->0) {
728 :     int C;
729 :     C = 16-RND +14*Src[0] +23*Src[1] - 7*Src[2] + 3*Src[3] - Src[4];
730 :     CLIP_STORE(0,C);
731 :     C = 16-RND - 3*(Src[0]-Src[4]) +19*Src[1] +20*Src[2] - 6*Src[3] - Src[5];
732 :     CLIP_STORE( 1,C);
733 :     C = 16-RND + 2*Src[0] - 6*(Src[1]+Src[4]) +20*(Src[2]+Src[3]) + 3*Src[5] - Src[6];
734 :     CLIP_STORE( 2,C);
735 :     C = 16-RND - (Src[0]+Src[7 ]) + 3*(Src[ 1]+Src[ 6])-6*(Src[ 2]+Src[ 5]) + 20*(Src[ 3]+Src[ 4]);
736 :     CLIP_STORE( 3,C);
737 :     C = 16-RND - (Src[1]+Src[8 ]) + 3*(Src[ 2]+Src[ 7])-6*(Src[ 3]+Src[ 6]) + 20*(Src[ 4]+Src[ 5]);
738 :     CLIP_STORE( 4,C);
739 :     C = 16-RND - (Src[2]+Src[9 ]) + 3*(Src[ 3]+Src[ 8])-6*(Src[ 4]+Src[ 7]) + 20*(Src[ 5]+Src[ 6]);
740 :     CLIP_STORE( 5,C);
741 :     C = 16-RND - (Src[3]+Src[10]) + 3*(Src[ 4]+Src[ 9])-6*(Src[ 5]+Src[ 8]) + 20*(Src[ 6]+Src[ 7]);
742 :     CLIP_STORE( 6,C);
743 :     C = 16-RND - (Src[4]+Src[11]) + 3*(Src[ 5]+Src[10])-6*(Src[ 6]+Src[ 9]) + 20*(Src[ 7]+Src[ 8]);
744 :     CLIP_STORE( 7,C);
745 :     C = 16-RND - (Src[5]+Src[12]) + 3*(Src[ 6]+Src[11])-6*(Src[ 7]+Src[10]) + 20*(Src[ 8]+Src[ 9]);
746 :     CLIP_STORE( 8,C);
747 :     C = 16-RND - (Src[6]+Src[13]) + 3*(Src[ 7]+Src[12])-6*(Src[ 8]+Src[11]) + 20*(Src[ 9]+Src[10]);
748 :     CLIP_STORE( 9,C);
749 :     C = 16-RND - (Src[7]+Src[14]) + 3*(Src[ 8]+Src[13])-6*(Src[ 9]+Src[12]) + 20*(Src[10]+Src[11]);
750 :     CLIP_STORE(10,C);
751 :     C = 16-RND - (Src[8]+Src[15]) + 3*(Src[ 9]+Src[14])-6*(Src[10]+Src[13]) + 20*(Src[11]+Src[12]);
752 :     CLIP_STORE(11,C);
753 :     C = 16-RND - (Src[9]+Src[16]) + 3*(Src[10]+Src[15])-6*(Src[11]+Src[14]) + 20*(Src[12]+Src[13]);
754 :     CLIP_STORE(12,C);
755 :     C = 16-RND - Src[10] +3*Src[11] -6*(Src[12]+Src[15]) + 20*(Src[13]+Src[14]) +2*Src[16];
756 :     CLIP_STORE(13,C);
757 :     C = 16-RND - Src[11] +3*(Src[12]-Src[16]) -6*Src[13] + 20*Src[14] + 19*Src[15];
758 :     CLIP_STORE(14,C);
759 :     C = 16-RND - Src[12] +3*Src[13] -7*Src[14] + 23*Src[15] + 14*Src[16];
760 :     CLIP_STORE(15,C);
761 :     Src += BpS;
762 :     Dst += BpS;
763 :     }
764 :     #else
765 :     while(H-->0) {
766 :     int C;
767 :     C = 16-RND +14*Src[0] +23*Src[1] - 7*Src[2] + 3*Src[3] - Src[4];
768 :     CLIP_STORE(0,C);
769 :     C = 16-RND - 3*(Src[0]-Src[4]) +19*Src[1] +20*Src[2] - 6*Src[3] - Src[5];
770 :     CLIP_STORE(1,C);
771 :     C = 16-RND + 2*Src[0] - 6*(Src[1]+Src[4]) +20*(Src[2]+Src[3]) + 3*Src[5] - Src[6];
772 :     CLIP_STORE(2,C);
773 :     C = 16-RND - (Src[0]+Src[7]) + 3*(Src[1]+Src[6])-6*(Src[2]+Src[5]) + 20*(Src[3]+Src[4]);
774 :     CLIP_STORE(3,C);
775 :     C = 16-RND - (Src[1]+Src[8]) + 3*(Src[2]+Src[7])-6*(Src[3]+Src[6]) + 20*(Src[4]+Src[5]);
776 :     CLIP_STORE(4,C);
777 :     C = 16-RND - Src[2] +3*Src[3] -6*(Src[4]+Src[7]) + 20*(Src[5]+Src[6]) +2*Src[8];
778 :     CLIP_STORE(5,C);
779 :     C = 16-RND - Src[3] +3*(Src[4]-Src[8]) -6*Src[5] + 20*Src[6] + 19*Src[7];
780 :     CLIP_STORE(6,C);
781 :     C = 16-RND - Src[4] +3*Src[5] -7*Src[6] + 23*Src[7] + 14*Src[8];
782 :     CLIP_STORE(7,C);
783 :     Src += BpS;
784 :     Dst += BpS;
785 :     }
786 :     #endif
787 :     }
788 :     #undef CLIP_STORE
789 :    
790 :     #define CLIP_STORE(i,C) \
791 :     if (C<0) C = 0; else if (C>(255<<5)) C = 255; else C = C>>5; \
792 :     C = (C+Src[i+1]+1-RND) >> 1; \
793 :     STORE(Dst[i], C)
794 :    
795 :     static void
796 :     FUNC_HA_UP(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t RND)
797 :     {
798 :     #if (SIZE==16)
799 :     while(H-->0) {
800 :     int C;
801 :     C = 16-RND +14*Src[0] +23*Src[1] - 7*Src[2] + 3*Src[3] - Src[4];
802 :     CLIP_STORE(0,C);
803 :     C = 16-RND - 3*(Src[0]-Src[4]) +19*Src[1] +20*Src[2] - 6*Src[3] - Src[5];
804 :     CLIP_STORE( 1,C);
805 :     C = 16-RND + 2*Src[0] - 6*(Src[1]+Src[4]) +20*(Src[2]+Src[3]) + 3*Src[5] - Src[6];
806 :     CLIP_STORE( 2,C);
807 :     C = 16-RND - (Src[0]+Src[7 ]) + 3*(Src[ 1]+Src[ 6])-6*(Src[ 2]+Src[ 5]) + 20*(Src[ 3]+Src[ 4]);
808 :     CLIP_STORE( 3,C);
809 :     C = 16-RND - (Src[1]+Src[8 ]) + 3*(Src[ 2]+Src[ 7])-6*(Src[ 3]+Src[ 6]) + 20*(Src[ 4]+Src[ 5]);
810 :     CLIP_STORE( 4,C);
811 :     C = 16-RND - (Src[2]+Src[9 ]) + 3*(Src[ 3]+Src[ 8])-6*(Src[ 4]+Src[ 7]) + 20*(Src[ 5]+Src[ 6]);
812 :     CLIP_STORE( 5,C);
813 :     C = 16-RND - (Src[3]+Src[10]) + 3*(Src[ 4]+Src[ 9])-6*(Src[ 5]+Src[ 8]) + 20*(Src[ 6]+Src[ 7]);
814 :     CLIP_STORE( 6,C);
815 :     C = 16-RND - (Src[4]+Src[11]) + 3*(Src[ 5]+Src[10])-6*(Src[ 6]+Src[ 9]) + 20*(Src[ 7]+Src[ 8]);
816 :     CLIP_STORE( 7,C);
817 :     C = 16-RND - (Src[5]+Src[12]) + 3*(Src[ 6]+Src[11])-6*(Src[ 7]+Src[10]) + 20*(Src[ 8]+Src[ 9]);
818 :     CLIP_STORE( 8,C);
819 :     C = 16-RND - (Src[6]+Src[13]) + 3*(Src[ 7]+Src[12])-6*(Src[ 8]+Src[11]) + 20*(Src[ 9]+Src[10]);
820 :     CLIP_STORE( 9,C);
821 :     C = 16-RND - (Src[7]+Src[14]) + 3*(Src[ 8]+Src[13])-6*(Src[ 9]+Src[12]) + 20*(Src[10]+Src[11]);
822 :     CLIP_STORE(10,C);
823 :     C = 16-RND - (Src[8]+Src[15]) + 3*(Src[ 9]+Src[14])-6*(Src[10]+Src[13]) + 20*(Src[11]+Src[12]);
824 :     CLIP_STORE(11,C);
825 :     C = 16-RND - (Src[9]+Src[16]) + 3*(Src[10]+Src[15])-6*(Src[11]+Src[14]) + 20*(Src[12]+Src[13]);
826 :     CLIP_STORE(12,C);
827 :     C = 16-RND - Src[10] +3*Src[11] -6*(Src[12]+Src[15]) + 20*(Src[13]+Src[14]) +2*Src[16];
828 :     CLIP_STORE(13,C);
829 :     C = 16-RND - Src[11] +3*(Src[12]-Src[16]) -6*Src[13] + 20*Src[14] + 19*Src[15];
830 :     CLIP_STORE(14,C);
831 :     C = 16-RND - Src[12] +3*Src[13] -7*Src[14] + 23*Src[15] + 14*Src[16];
832 :     CLIP_STORE(15,C);
833 :     Src += BpS;
834 :     Dst += BpS;
835 :     }
836 :     #else
837 :     while(H-->0) {
838 :     int C;
839 :     C = 16-RND +14*Src[0] +23*Src[1] - 7*Src[2] + 3*Src[3] - Src[4];
840 :     CLIP_STORE(0,C);
841 :     C = 16-RND - 3*(Src[0]-Src[4]) +19*Src[1] +20*Src[2] - 6*Src[3] - Src[5];
842 :     CLIP_STORE(1,C);
843 :     C = 16-RND + 2*Src[0] - 6*(Src[1]+Src[4]) +20*(Src[2]+Src[3]) + 3*Src[5] - Src[6];
844 :     CLIP_STORE(2,C);
845 :     C = 16-RND - (Src[0]+Src[7]) + 3*(Src[1]+Src[6])-6*(Src[2]+Src[5]) + 20*(Src[3]+Src[4]);
846 :     CLIP_STORE(3,C);
847 :     C = 16-RND - (Src[1]+Src[8]) + 3*(Src[2]+Src[7])-6*(Src[3]+Src[6]) + 20*(Src[4]+Src[5]);
848 :     CLIP_STORE(4,C);
849 :     C = 16-RND - Src[2] +3*Src[3] -6*(Src[4]+Src[7]) + 20*(Src[5]+Src[6]) +2*Src[8];
850 :     CLIP_STORE(5,C);
851 :     C = 16-RND - Src[3] +3*(Src[4]-Src[8]) -6*Src[5] + 20*Src[6] + 19*Src[7];
852 :     CLIP_STORE(6,C);
853 :     C = 16-RND - Src[4] +3*Src[5] -7*Src[6] + 23*Src[7] + 14*Src[8];
854 :     CLIP_STORE(7,C);
855 :     Src += BpS;
856 :     Dst += BpS;
857 :     }
858 :     #endif
859 :     }
860 :     #undef CLIP_STORE
861 :    
862 :     //////////////////////////////////////////////////////////
863 :     // vertical passes
864 :     //////////////////////////////////////////////////////////
865 :     // Note: for vertical passes, width (W) needs only be 8 or 16.
866 :    
867 :     #define CLIP_STORE(D,C) \
868 :     if (C<0) C = 0; else if (C>(255<<5)) C = 255; else C = C>>5; \
869 :     STORE(D, C)
870 :    
871 :     static void
872 :     FUNC_V(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t RND)
873 :     {
874 :     #if (SIZE==16)
875 :     while(H-->0) {
876 :     int C;
877 :     C = 16-RND +14*Src[BpS*0] +23*Src[BpS*1] - 7*Src[BpS*2] + 3*Src[BpS*3] - Src[BpS*4];
878 :     CLIP_STORE(Dst[BpS* 0],C);
879 :     C = 16-RND - 3*(Src[BpS*0]-Src[BpS*4]) +19*Src[BpS*1] +20*Src[BpS*2] - 6*Src[BpS*3] - Src[BpS*5];
880 :     CLIP_STORE(Dst[BpS* 1],C);
881 :     C = 16-RND + 2*Src[BpS*0] - 6*(Src[BpS*1]+Src[BpS*4]) +20*(Src[BpS*2]+Src[BpS*3]) + 3*Src[BpS*5] - Src[BpS*6];
882 :     CLIP_STORE(Dst[BpS* 2],C);
883 :     C = 16-RND - (Src[BpS*0]+Src[BpS*7 ]) + 3*(Src[BpS* 1]+Src[BpS* 6])-6*(Src[BpS* 2]+Src[BpS* 5]) + 20*(Src[BpS* 3]+Src[BpS* 4]);
884 :     CLIP_STORE(Dst[BpS* 3],C);
885 :     C = 16-RND - (Src[BpS*1]+Src[BpS*8 ]) + 3*(Src[BpS* 2]+Src[BpS* 7])-6*(Src[BpS* 3]+Src[BpS* 6]) + 20*(Src[BpS* 4]+Src[BpS* 5]);
886 :     CLIP_STORE(Dst[BpS* 4],C);
887 :     C = 16-RND - (Src[BpS*2]+Src[BpS*9 ]) + 3*(Src[BpS* 3]+Src[BpS* 8])-6*(Src[BpS* 4]+Src[BpS* 7]) + 20*(Src[BpS* 5]+Src[BpS* 6]);
888 :     CLIP_STORE(Dst[BpS* 5],C);
889 :     C = 16-RND - (Src[BpS*3]+Src[BpS*10]) + 3*(Src[BpS* 4]+Src[BpS* 9])-6*(Src[BpS* 5]+Src[BpS* 8]) + 20*(Src[BpS* 6]+Src[BpS* 7]);
890 :     CLIP_STORE(Dst[BpS* 6],C);
891 :     C = 16-RND - (Src[BpS*4]+Src[BpS*11]) + 3*(Src[BpS* 5]+Src[BpS*10])-6*(Src[BpS* 6]+Src[BpS* 9]) + 20*(Src[BpS* 7]+Src[BpS* 8]);
892 :     CLIP_STORE(Dst[BpS* 7],C);
893 :     C = 16-RND - (Src[BpS*5]+Src[BpS*12]) + 3*(Src[BpS* 6]+Src[BpS*11])-6*(Src[BpS* 7]+Src[BpS*10]) + 20*(Src[BpS* 8]+Src[BpS* 9]);
894 :     CLIP_STORE(Dst[BpS* 8],C);
895 :     C = 16-RND - (Src[BpS*6]+Src[BpS*13]) + 3*(Src[BpS* 7]+Src[BpS*12])-6*(Src[BpS* 8]+Src[BpS*11]) + 20*(Src[BpS* 9]+Src[BpS*10]);
896 :     CLIP_STORE(Dst[BpS* 9],C);
897 :     C = 16-RND - (Src[BpS*7]+Src[BpS*14]) + 3*(Src[BpS* 8]+Src[BpS*13])-6*(Src[BpS* 9]+Src[BpS*12]) + 20*(Src[BpS*10]+Src[BpS*11]);
898 :     CLIP_STORE(Dst[BpS*10],C);
899 :     C = 16-RND - (Src[BpS*8]+Src[BpS*15]) + 3*(Src[BpS* 9]+Src[BpS*14])-6*(Src[BpS*10]+Src[BpS*13]) + 20*(Src[BpS*11]+Src[BpS*12]);
900 :     CLIP_STORE(Dst[BpS*11],C);
901 :     C = 16-RND - (Src[BpS*9]+Src[BpS*16]) + 3*(Src[BpS*10]+Src[BpS*15])-6*(Src[BpS*11]+Src[BpS*14]) + 20*(Src[BpS*12]+Src[BpS*13]);
902 :     CLIP_STORE(Dst[BpS*12],C);
903 :     C = 16-RND - Src[BpS*10] +3*Src[BpS*11] -6*(Src[BpS*12]+Src[BpS*15]) + 20*(Src[BpS*13]+Src[BpS*14]) +2*Src[BpS*16];
904 :     CLIP_STORE(Dst[BpS*13],C);
905 :     C = 16-RND - Src[BpS*11] +3*(Src[BpS*12]-Src[BpS*16]) -6*Src[BpS*13] + 20*Src[BpS*14] + 19*Src[BpS*15];
906 :     CLIP_STORE(Dst[BpS*14],C);
907 :     C = 16-RND - Src[BpS*12] +3*Src[BpS*13] -7*Src[BpS*14] + 23*Src[BpS*15] + 14*Src[BpS*16];
908 :     CLIP_STORE(Dst[BpS*15],C);
909 :     Src += 1;
910 :     Dst += 1;
911 :     }
912 :     #else
913 :     while(H-->0) {
914 :     int C;
915 :     C = 16-RND +14*Src[BpS*0] +23*Src[BpS*1] - 7*Src[BpS*2] + 3*Src[BpS*3] - Src[BpS*4];
916 :     CLIP_STORE(Dst[BpS*0],C);
917 :     C = 16-RND - 3*(Src[BpS*0]-Src[BpS*4]) +19*Src[BpS*1] +20*Src[BpS*2] - 6*Src[BpS*3] - Src[BpS*5];
918 :     CLIP_STORE(Dst[BpS*1],C);
919 :     C = 16-RND + 2*Src[BpS*0] - 6*(Src[BpS*1]+Src[BpS*4]) +20*(Src[BpS*2]+Src[BpS*3]) + 3*Src[BpS*5] - Src[BpS*6];
920 :     CLIP_STORE(Dst[BpS*2],C);
921 :     C = 16-RND - (Src[BpS*0]+Src[BpS*7]) + 3*(Src[BpS*1]+Src[BpS*6])-6*(Src[BpS*2]+Src[BpS*5]) + 20*(Src[BpS*3]+Src[BpS*4]);
922 :     CLIP_STORE(Dst[BpS*3],C);
923 :     C = 16-RND - (Src[BpS*1]+Src[BpS*8]) + 3*(Src[BpS*2]+Src[BpS*7])-6*(Src[BpS*3]+Src[BpS*6]) + 20*(Src[BpS*4]+Src[BpS*5]);
924 :     CLIP_STORE(Dst[BpS*4],C);
925 :     C = 16-RND - Src[BpS*2] +3*Src[BpS*3] -6*(Src[BpS*4]+Src[BpS*7]) + 20*(Src[BpS*5]+Src[BpS*6]) +2*Src[BpS*8];
926 :     CLIP_STORE(Dst[BpS*5],C);
927 :     C = 16-RND - Src[BpS*3] +3*(Src[BpS*4]-Src[BpS*8]) -6*Src[BpS*5] + 20*Src[BpS*6] + 19*Src[BpS*7];
928 :     CLIP_STORE(Dst[BpS*6],C);
929 :     C = 16-RND - Src[BpS*4] +3*Src[BpS*5] -7*Src[BpS*6] + 23*Src[BpS*7] + 14*Src[BpS*8];
930 :     CLIP_STORE(Dst[BpS*7],C);
931 :     Src += 1;
932 :     Dst += 1;
933 :     }
934 :     #endif
935 :     }
936 :     #undef CLIP_STORE
937 :    
938 :     #define CLIP_STORE(i,C) \
939 :     if (C<0) C = 0; else if (C>(255<<5)) C = 255; else C = C>>5; \
940 :     C = (C+Src[BpS*i]+1-RND) >> 1; \
941 :     STORE(Dst[BpS*i], C)
942 :    
943 :     static void
944 :     FUNC_VA(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t RND)
945 :     {
946 :     #if (SIZE==16)
947 :     while(H-->0) {
948 :     int C;
949 :     C = 16-RND +14*Src[BpS*0] +23*Src[BpS*1] - 7*Src[BpS*2] + 3*Src[BpS*3] - Src[BpS*4];
950 :     CLIP_STORE(0,C);
951 :     C = 16-RND - 3*(Src[BpS*0]-Src[BpS*4]) +19*Src[BpS*1] +20*Src[BpS*2] - 6*Src[BpS*3] - Src[BpS*5];
952 :     CLIP_STORE( 1,C);
953 :     C = 16-RND + 2*Src[BpS*0] - 6*(Src[BpS*1]+Src[BpS*4]) +20*(Src[BpS*2]+Src[BpS*3]) + 3*Src[BpS*5] - Src[BpS*6];
954 :     CLIP_STORE( 2,C);
955 :     C = 16-RND - (Src[BpS*0]+Src[BpS*7 ]) + 3*(Src[BpS* 1]+Src[BpS* 6])-6*(Src[BpS* 2]+Src[BpS* 5]) + 20*(Src[BpS* 3]+Src[BpS* 4]);
956 :     CLIP_STORE( 3,C);
957 :     C = 16-RND - (Src[BpS*1]+Src[BpS*8 ]) + 3*(Src[BpS* 2]+Src[BpS* 7])-6*(Src[BpS* 3]+Src[BpS* 6]) + 20*(Src[BpS* 4]+Src[BpS* 5]);
958 :     CLIP_STORE( 4,C);
959 :     C = 16-RND - (Src[BpS*2]+Src[BpS*9 ]) + 3*(Src[BpS* 3]+Src[BpS* 8])-6*(Src[BpS* 4]+Src[BpS* 7]) + 20*(Src[BpS* 5]+Src[BpS* 6]);
960 :     CLIP_STORE( 5,C);
961 :     C = 16-RND - (Src[BpS*3]+Src[BpS*10]) + 3*(Src[BpS* 4]+Src[BpS* 9])-6*(Src[BpS* 5]+Src[BpS* 8]) + 20*(Src[BpS* 6]+Src[BpS* 7]);
962 :     CLIP_STORE( 6,C);
963 :     C = 16-RND - (Src[BpS*4]+Src[BpS*11]) + 3*(Src[BpS* 5]+Src[BpS*10])-6*(Src[BpS* 6]+Src[BpS* 9]) + 20*(Src[BpS* 7]+Src[BpS* 8]);
964 :     CLIP_STORE( 7,C);
965 :     C = 16-RND - (Src[BpS*5]+Src[BpS*12]) + 3*(Src[BpS* 6]+Src[BpS*11])-6*(Src[BpS* 7]+Src[BpS*10]) + 20*(Src[BpS* 8]+Src[BpS* 9]);
966 :     CLIP_STORE( 8,C);
967 :     C = 16-RND - (Src[BpS*6]+Src[BpS*13]) + 3*(Src[BpS* 7]+Src[BpS*12])-6*(Src[BpS* 8]+Src[BpS*11]) + 20*(Src[BpS* 9]+Src[BpS*10]);
968 :     CLIP_STORE( 9,C);
969 :     C = 16-RND - (Src[BpS*7]+Src[BpS*14]) + 3*(Src[BpS* 8]+Src[BpS*13])-6*(Src[BpS* 9]+Src[BpS*12]) + 20*(Src[BpS*10]+Src[BpS*11]);
970 :     CLIP_STORE(10,C);
971 :     C = 16-RND - (Src[BpS*8]+Src[BpS*15]) + 3*(Src[BpS* 9]+Src[BpS*14])-6*(Src[BpS*10]+Src[BpS*13]) + 20*(Src[BpS*11]+Src[BpS*12]);
972 :     CLIP_STORE(11,C);
973 :     C = 16-RND - (Src[BpS*9]+Src[BpS*16]) + 3*(Src[BpS*10]+Src[BpS*15])-6*(Src[BpS*11]+Src[BpS*14]) + 20*(Src[BpS*12]+Src[BpS*13]);
974 :     CLIP_STORE(12,C);
975 :     C = 16-RND - Src[BpS*10] +3*Src[BpS*11] -6*(Src[BpS*12]+Src[BpS*15]) + 20*(Src[BpS*13]+Src[BpS*14]) +2*Src[BpS*16];
976 :     CLIP_STORE(13,C);
977 :     C = 16-RND - Src[BpS*11] +3*(Src[BpS*12]-Src[BpS*16]) -6*Src[BpS*13] + 20*Src[BpS*14] + 19*Src[BpS*15];
978 :     CLIP_STORE(14,C);
979 :     C = 16-RND - Src[BpS*12] +3*Src[BpS*13] -7*Src[BpS*14] + 23*Src[BpS*15] + 14*Src[BpS*16];
980 :     CLIP_STORE(15,C);
981 :     Src += 1;
982 :     Dst += 1;
983 :     }
984 :     #else
985 :     while(H-->0) {
986 :     int C;
987 :     C = 16-RND +14*Src[BpS*0] +23*Src[BpS*1] - 7*Src[BpS*2] + 3*Src[BpS*3] - Src[BpS*4];
988 :     CLIP_STORE(0,C);
989 :     C = 16-RND - 3*(Src[BpS*0]-Src[BpS*4]) +19*Src[BpS*1] +20*Src[BpS*2] - 6*Src[BpS*3] - Src[BpS*5];
990 :     CLIP_STORE(1,C);
991 :     C = 16-RND + 2*Src[BpS*0] - 6*(Src[BpS*1]+Src[BpS*4]) +20*(Src[BpS*2]+Src[BpS*3]) + 3*Src[BpS*5] - Src[BpS*6];
992 :     CLIP_STORE(2,C);
993 :     C = 16-RND - (Src[BpS*0]+Src[BpS*7]) + 3*(Src[BpS*1]+Src[BpS*6])-6*(Src[BpS*2]+Src[BpS*5]) + 20*(Src[BpS*3]+Src[BpS*4]);
994 :     CLIP_STORE(3,C);
995 :     C = 16-RND - (Src[BpS*1]+Src[BpS*8]) + 3*(Src[BpS*2]+Src[BpS*7])-6*(Src[BpS*3]+Src[BpS*6]) + 20*(Src[BpS*4]+Src[BpS*5]);
996 :     CLIP_STORE(4,C);
997 :     C = 16-RND - Src[BpS*2] +3*Src[BpS*3] -6*(Src[BpS*4]+Src[BpS*7]) + 20*(Src[BpS*5]+Src[BpS*6]) +2*Src[BpS*8];
998 :     CLIP_STORE(5,C);
999 :     C = 16-RND - Src[BpS*3] +3*(Src[BpS*4]-Src[BpS*8]) -6*Src[BpS*5] + 20*Src[BpS*6] + 19*Src[BpS*7];
1000 :     CLIP_STORE(6,C);
1001 :     C = 16-RND - Src[BpS*4] +3*Src[BpS*5] -7*Src[BpS*6] + 23*Src[BpS*7] + 14*Src[BpS*8];
1002 :     CLIP_STORE(7,C);
1003 :     Src += 1;
1004 :     Dst += 1;
1005 :     }
1006 :     #endif
1007 :     }
1008 :     #undef CLIP_STORE
1009 :    
1010 :     #define CLIP_STORE(i,C) \
1011 :     if (C<0) C = 0; else if (C>(255<<5)) C = 255; else C = C>>5; \
1012 :     C = (C+Src[BpS*i+BpS]+1-RND) >> 1; \
1013 :     STORE(Dst[BpS*i], C)
1014 :    
1015 :     static void
1016 :     FUNC_VA_UP(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t RND)
1017 :     {
1018 :     #if (SIZE==16)
1019 :     while(H-->0) {
1020 :     int C;
1021 :     C = 16-RND +14*Src[BpS*0] +23*Src[BpS*1] - 7*Src[BpS*2] + 3*Src[BpS*3] - Src[BpS*4];
1022 :     CLIP_STORE(0,C);
1023 :     C = 16-RND - 3*(Src[BpS*0]-Src[BpS*4]) +19*Src[BpS*1] +20*Src[BpS*2] - 6*Src[BpS*3] - Src[BpS*5];
1024 :     CLIP_STORE( 1,C);
1025 :     C = 16-RND + 2*Src[BpS*0] - 6*(Src[BpS*1]+Src[BpS*4]) +20*(Src[BpS*2]+Src[BpS*3]) + 3*Src[BpS*5] - Src[BpS*6];
1026 :     CLIP_STORE( 2,C);
1027 :     C = 16-RND - (Src[BpS*0]+Src[BpS*7 ]) + 3*(Src[BpS* 1]+Src[BpS* 6])-6*(Src[BpS* 2]+Src[BpS* 5]) + 20*(Src[BpS* 3]+Src[BpS* 4]);
1028 :     CLIP_STORE( 3,C);
1029 :     C = 16-RND - (Src[BpS*1]+Src[BpS*8 ]) + 3*(Src[BpS* 2]+Src[BpS* 7])-6*(Src[BpS* 3]+Src[BpS* 6]) + 20*(Src[BpS* 4]+Src[BpS* 5]);
1030 :     CLIP_STORE( 4,C);
1031 :     C = 16-RND - (Src[BpS*2]+Src[BpS*9 ]) + 3*(Src[BpS* 3]+Src[BpS* 8])-6*(Src[BpS* 4]+Src[BpS* 7]) + 20*(Src[BpS* 5]+Src[BpS* 6]);
1032 :     CLIP_STORE( 5,C);
1033 :     C = 16-RND - (Src[BpS*3]+Src[BpS*10]) + 3*(Src[BpS* 4]+Src[BpS* 9])-6*(Src[BpS* 5]+Src[BpS* 8]) + 20*(Src[BpS* 6]+Src[BpS* 7]);
1034 :     CLIP_STORE( 6,C);
1035 :     C = 16-RND - (Src[BpS*4]+Src[BpS*11]) + 3*(Src[BpS* 5]+Src[BpS*10])-6*(Src[BpS* 6]+Src[BpS* 9]) + 20*(Src[BpS* 7]+Src[BpS* 8]);
1036 :     CLIP_STORE( 7,C);
1037 :     C = 16-RND - (Src[BpS*5]+Src[BpS*12]) + 3*(Src[BpS* 6]+Src[BpS*11])-6*(Src[BpS* 7]+Src[BpS*10]) + 20*(Src[BpS* 8]+Src[BpS* 9]);
1038 :     CLIP_STORE( 8,C);
1039 :     C = 16-RND - (Src[BpS*6]+Src[BpS*13]) + 3*(Src[BpS* 7]+Src[BpS*12])-6*(Src[BpS* 8]+Src[BpS*11]) + 20*(Src[BpS* 9]+Src[BpS*10]);
1040 :     CLIP_STORE( 9,C);
1041 :     C = 16-RND - (Src[BpS*7]+Src[BpS*14]) + 3*(Src[BpS* 8]+Src[BpS*13])-6*(Src[BpS* 9]+Src[BpS*12]) + 20*(Src[BpS*10]+Src[BpS*11]);
1042 :     CLIP_STORE(10,C);
1043 :     C = 16-RND - (Src[BpS*8]+Src[BpS*15]) + 3*(Src[BpS* 9]+Src[BpS*14])-6*(Src[BpS*10]+Src[BpS*13]) + 20*(Src[BpS*11]+Src[BpS*12]);
1044 :     CLIP_STORE(11,C);
1045 :     C = 16-RND - (Src[BpS*9]+Src[BpS*16]) + 3*(Src[BpS*10]+Src[BpS*15])-6*(Src[BpS*11]+Src[BpS*14]) + 20*(Src[BpS*12]+Src[BpS*13]);
1046 :     CLIP_STORE(12,C);
1047 :     C = 16-RND - Src[BpS*10] +3*Src[BpS*11] -6*(Src[BpS*12]+Src[BpS*15]) + 20*(Src[BpS*13]+Src[BpS*14]) +2*Src[BpS*16];
1048 :     CLIP_STORE(13,C);
1049 :     C = 16-RND - Src[BpS*11] +3*(Src[BpS*12]-Src[BpS*16]) -6*Src[BpS*13] + 20*Src[BpS*14] + 19*Src[BpS*15];
1050 :     CLIP_STORE(14,C);
1051 :     C = 16-RND - Src[BpS*12] +3*Src[BpS*13] -7*Src[BpS*14] + 23*Src[BpS*15] + 14*Src[BpS*16];
1052 :     CLIP_STORE(15,C);
1053 :     Src += 1;
1054 :     Dst += 1;
1055 :     }
1056 :     #else
1057 :     while(H-->0) {
1058 :     int C;
1059 :     C = 16-RND +14*Src[BpS*0] +23*Src[BpS*1] - 7*Src[BpS*2] + 3*Src[BpS*3] - Src[BpS*4];
1060 :     CLIP_STORE(0,C);
1061 :     C = 16-RND - 3*(Src[BpS*0]-Src[BpS*4]) +19*Src[BpS*1] +20*Src[BpS*2] - 6*Src[BpS*3] - Src[BpS*5];
1062 :     CLIP_STORE(1,C);
1063 :     C = 16-RND + 2*Src[BpS*0] - 6*(Src[BpS*1]+Src[BpS*4]) +20*(Src[BpS*2]+Src[BpS*3]) + 3*Src[BpS*5] - Src[BpS*6];
1064 :     CLIP_STORE(2,C);
1065 :     C = 16-RND - (Src[BpS*0]+Src[BpS*7]) + 3*(Src[BpS*1]+Src[BpS*6])-6*(Src[BpS*2]+Src[BpS*5]) + 20*(Src[BpS*3]+Src[BpS*4]);
1066 :     CLIP_STORE(3,C);
1067 :     C = 16-RND - (Src[BpS*1]+Src[BpS*8]) + 3*(Src[BpS*2]+Src[BpS*7])-6*(Src[BpS*3]+Src[BpS*6]) + 20*(Src[BpS*4]+Src[BpS*5]);
1068 :     CLIP_STORE(4,C);
1069 :     C = 16-RND - Src[BpS*2] +3*Src[BpS*3] -6*(Src[BpS*4]+Src[BpS*7]) + 20*(Src[BpS*5]+Src[BpS*6]) +2*Src[BpS*8];
1070 :     CLIP_STORE(5,C);
1071 :     C = 16-RND - Src[BpS*3] +3*(Src[BpS*4]-Src[BpS*8]) -6*Src[BpS*5] + 20*Src[BpS*6] + 19*Src[BpS*7];
1072 :     CLIP_STORE(6,C);
1073 :     C = 16-RND - Src[BpS*4] +3*Src[BpS*5] -7*Src[BpS*6] + 23*Src[BpS*7] + 14*Src[BpS*8];
1074 :     CLIP_STORE(7,C);
1075 :     Src += 1;
1076 :     Dst += 1;
1077 :     }
1078 :     #endif
1079 :     }
1080 :     #undef CLIP_STORE
1081 :    
1082 :     #undef STORE
1083 :     #undef FUNC_H
1084 :     #undef FUNC_V
1085 :     #undef FUNC_HA
1086 :     #undef FUNC_VA
1087 :     #undef FUNC_HA_UP
1088 :     #undef FUNC_VA_UP
1089 :    
1090 :    
1091 :     #endif /* XVID_AUTO_INCLUDE && !defined(REF) */

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4