[svn] / trunk / xvidcore / src / image / interpolate8x8.c Repository:
ViewVC logotype

Annotation of /trunk/xvidcore/src/image/interpolate8x8.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1530 - (view) (download)

1 : edgomez 1382 /*****************************************************************************
2 : Isibaar 333 *
3 : edgomez 851 * XVID MPEG-4 VIDEO CODEC
4 : edgomez 1382 * - 8x8 block-based halfpel interpolation -
5 : Isibaar 333 *
6 : edgomez 1382 * Copyright(C) 2001-2003 Peter Ross <pross@xvid.org>
7 : Isibaar 333 *
8 : edgomez 1382 * 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 : Isibaar 333 *
13 : edgomez 1382 * 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 : Isibaar 333 *
18 : edgomez 1382 * 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 : Isibaar 333 *
22 : edgomez 1530 * $Id: interpolate8x8.c,v 1.13 2004-08-10 21:58:55 edgomez Exp $
23 : Isibaar 333 *
24 : edgomez 1382 ****************************************************************************/
25 : Isibaar 333
26 :     #include "../portab.h"
27 : edgomez 851 #include "../global.h"
28 : Isibaar 333 #include "interpolate8x8.h"
29 :    
30 : edgomez 1382 /* function pointers */
31 : Isibaar 333 INTERPOLATE8X8_PTR interpolate8x8_halfpel_h;
32 :     INTERPOLATE8X8_PTR interpolate8x8_halfpel_v;
33 :     INTERPOLATE8X8_PTR interpolate8x8_halfpel_hv;
34 :    
35 : edgomez 1530 INTERPOLATE8X8_PTR interpolate8x8_halfpel_add;
36 :     INTERPOLATE8X8_PTR interpolate8x8_halfpel_h_add;
37 :     INTERPOLATE8X8_PTR interpolate8x8_halfpel_v_add;
38 :     INTERPOLATE8X8_PTR interpolate8x8_halfpel_hv_add;
39 :    
40 :    
41 : edgomez 851 INTERPOLATE8X8_AVG2_PTR interpolate8x8_avg2;
42 :     INTERPOLATE8X8_AVG4_PTR interpolate8x8_avg4;
43 : Isibaar 333
44 : edgomez 851 INTERPOLATE_LOWPASS_PTR interpolate8x8_lowpass_h;
45 :     INTERPOLATE_LOWPASS_PTR interpolate8x8_lowpass_v;
46 : Isibaar 333
47 : edgomez 851 INTERPOLATE_LOWPASS_PTR interpolate16x16_lowpass_h;
48 :     INTERPOLATE_LOWPASS_PTR interpolate16x16_lowpass_v;
49 :    
50 :     INTERPOLATE_LOWPASS_HV_PTR interpolate8x8_lowpass_hv;
51 :     INTERPOLATE_LOWPASS_HV_PTR interpolate16x16_lowpass_hv;
52 :    
53 :     INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_h;
54 :     INTERPOLATE8X8_6TAP_LOWPASS_PTR interpolate8x8_6tap_lowpass_v;
55 :    
56 : edgomez 1530 void __inline
57 :     interpolate8x8_avg2_c(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, const uint32_t stride, const uint32_t rounding, const uint32_t height)
58 : edgomez 851 {
59 :     uint32_t i;
60 :     const int32_t round = 1 - rounding;
61 :    
62 : edgomez 1530 for(i = 0; i < height; i++) {
63 : edgomez 851 dst[0] = (src1[0] + src2[0] + round) >> 1;
64 :     dst[1] = (src1[1] + src2[1] + round) >> 1;
65 :     dst[2] = (src1[2] + src2[2] + round) >> 1;
66 :     dst[3] = (src1[3] + src2[3] + round) >> 1;
67 :     dst[4] = (src1[4] + src2[4] + round) >> 1;
68 :     dst[5] = (src1[5] + src2[5] + round) >> 1;
69 :     dst[6] = (src1[6] + src2[6] + round) >> 1;
70 :     dst[7] = (src1[7] + src2[7] + round) >> 1;
71 :    
72 :     dst += stride;
73 :     src1 += stride;
74 :     src2 += stride;
75 :     }
76 :     }
77 :    
78 : edgomez 1530 void
79 :     interpolate8x8_halfpel_add_c(uint8_t *dst, const uint8_t *src, const uint32_t stride, const uint32_t rounding)
80 :     {
81 :     interpolate8x8_avg2_c(dst, dst, src, stride, 0, 8);
82 :     }
83 :    
84 : edgomez 851 void interpolate8x8_avg4_c(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, const uint8_t *src3, const uint8_t *src4, const uint32_t stride, const uint32_t rounding)
85 :     {
86 :     int32_t i;
87 :     const int32_t round = 2 - rounding;
88 :    
89 : edgomez 1530 for(i = 0; i < 8; i++) {
90 : edgomez 851 dst[0] = (src1[0] + src2[0] + src3[0] + src4[0] + round) >> 2;
91 :     dst[1] = (src1[1] + src2[1] + src3[1] + src4[1] + round) >> 2;
92 :     dst[2] = (src1[2] + src2[2] + src3[2] + src4[2] + round) >> 2;
93 :     dst[3] = (src1[3] + src2[3] + src3[3] + src4[3] + round) >> 2;
94 :     dst[4] = (src1[4] + src2[4] + src3[4] + src4[4] + round) >> 2;
95 :     dst[5] = (src1[5] + src2[5] + src3[5] + src4[5] + round) >> 2;
96 :     dst[6] = (src1[6] + src2[6] + src3[6] + src4[6] + round) >> 2;
97 :     dst[7] = (src1[7] + src2[7] + src3[7] + src4[7] + round) >> 2;
98 : edgomez 1382
99 : edgomez 851 dst += stride;
100 :     src1 += stride;
101 :     src2 += stride;
102 :     src3 += stride;
103 :     src4 += stride;
104 :     }
105 :     }
106 :    
107 : edgomez 1382 /* dst = interpolate(src) */
108 : edgomez 851
109 : Isibaar 333 void
110 :     interpolate8x8_halfpel_h_c(uint8_t * const dst,
111 :     const uint8_t * const src,
112 :     const uint32_t stride,
113 :     const uint32_t rounding)
114 :     {
115 : edgomez 1382 uintptr_t j;
116 :    
117 : edgomez 1530 if (rounding) {
118 :     for (j = 0; j < 8*stride; j+=stride) {
119 : chl 906 dst[j + 0] = (uint8_t)((src[j + 0] + src[j + 1] )>>1);
120 :     dst[j + 1] = (uint8_t)((src[j + 1] + src[j + 2] )>>1);
121 :     dst[j + 2] = (uint8_t)((src[j + 2] + src[j + 3] )>>1);
122 :     dst[j + 3] = (uint8_t)((src[j + 3] + src[j + 4] )>>1);
123 :     dst[j + 4] = (uint8_t)((src[j + 4] + src[j + 5] )>>1);
124 :     dst[j + 5] = (uint8_t)((src[j + 5] + src[j + 6] )>>1);
125 :     dst[j + 6] = (uint8_t)((src[j + 6] + src[j + 7] )>>1);
126 :     dst[j + 7] = (uint8_t)((src[j + 7] + src[j + 8] )>>1);
127 : Isibaar 333 }
128 : edgomez 1530 } else {
129 :     for (j = 0; j < 8*stride; j+=stride) {
130 : chl 906 dst[j + 0] = (uint8_t)((src[j + 0] + src[j + 1] + 1)>>1);
131 :     dst[j + 1] = (uint8_t)((src[j + 1] + src[j + 2] + 1)>>1);
132 :     dst[j + 2] = (uint8_t)((src[j + 2] + src[j + 3] + 1)>>1);
133 :     dst[j + 3] = (uint8_t)((src[j + 3] + src[j + 4] + 1)>>1);
134 :     dst[j + 4] = (uint8_t)((src[j + 4] + src[j + 5] + 1)>>1);
135 :     dst[j + 5] = (uint8_t)((src[j + 5] + src[j + 6] + 1)>>1);
136 :     dst[j + 6] = (uint8_t)((src[j + 6] + src[j + 7] + 1)>>1);
137 :     dst[j + 7] = (uint8_t)((src[j + 7] + src[j + 8] + 1)>>1);
138 :     }
139 : edgomez 1530 }
140 : Isibaar 333 }
141 :    
142 : edgomez 1530 /* dst = (dst + interpolate(src)/2 */
143 : Isibaar 333
144 : edgomez 1530 void
145 :     interpolate8x8_halfpel_h_add_c(uint8_t * const dst,
146 :     const uint8_t * const src,
147 :     const uint32_t stride,
148 :     const uint32_t rounding)
149 :     {
150 :     uintptr_t j;
151 : Isibaar 333
152 : edgomez 1530 if (rounding) {
153 :     for (j = 0; j < 8*stride; j+=stride) {
154 :     dst[j + 0] = (uint8_t)((((src[j + 0] + src[j + 1] )>>1) + dst[j+0] + 1)>>1);
155 :     dst[j + 1] = (uint8_t)((((src[j + 1] + src[j + 2] )>>1) + dst[j+1] + 1)>>1);
156 :     dst[j + 2] = (uint8_t)((((src[j + 2] + src[j + 3] )>>1) + dst[j+2] + 1)>>1);
157 :     dst[j + 3] = (uint8_t)((((src[j + 3] + src[j + 4] )>>1) + dst[j+3] + 1)>>1);
158 :     dst[j + 4] = (uint8_t)((((src[j + 4] + src[j + 5] )>>1) + dst[j+4] + 1)>>1);
159 :     dst[j + 5] = (uint8_t)((((src[j + 5] + src[j + 6] )>>1) + dst[j+5] + 1)>>1);
160 :     dst[j + 6] = (uint8_t)((((src[j + 6] + src[j + 7] )>>1) + dst[j+6] + 1)>>1);
161 :     dst[j + 7] = (uint8_t)((((src[j + 7] + src[j + 8] )>>1) + dst[j+7] + 1)>>1);
162 :     }
163 :     } else {
164 :     for (j = 0; j < 8*stride; j+=stride) {
165 :     dst[j + 0] = (uint8_t)((((src[j + 0] + src[j + 1] + 1)>>1) + dst[j+0] + 1)>>1);
166 :     dst[j + 1] = (uint8_t)((((src[j + 1] + src[j + 2] + 1)>>1) + dst[j+1] + 1)>>1);
167 :     dst[j + 2] = (uint8_t)((((src[j + 2] + src[j + 3] + 1)>>1) + dst[j+2] + 1)>>1);
168 :     dst[j + 3] = (uint8_t)((((src[j + 3] + src[j + 4] + 1)>>1) + dst[j+3] + 1)>>1);
169 :     dst[j + 4] = (uint8_t)((((src[j + 4] + src[j + 5] + 1)>>1) + dst[j+4] + 1)>>1);
170 :     dst[j + 5] = (uint8_t)((((src[j + 5] + src[j + 6] + 1)>>1) + dst[j+5] + 1)>>1);
171 :     dst[j + 6] = (uint8_t)((((src[j + 6] + src[j + 7] + 1)>>1) + dst[j+6] + 1)>>1);
172 :     dst[j + 7] = (uint8_t)((((src[j + 7] + src[j + 8] + 1)>>1) + dst[j+7] + 1)>>1);
173 :     }
174 :     }
175 :     }
176 :    
177 :     /* dst = interpolate(src) */
178 :    
179 : Isibaar 333 void
180 :     interpolate8x8_halfpel_v_c(uint8_t * const dst,
181 :     const uint8_t * const src,
182 :     const uint32_t stride,
183 :     const uint32_t rounding)
184 :     {
185 : edgomez 1382 uintptr_t j;
186 : Isibaar 333
187 : edgomez 1382
188 : edgomez 1530 if (rounding) {
189 :     for (j = 0; j < 8*stride; j+=stride) {
190 : chl 906 dst[j + 0] = (uint8_t)((src[j + 0] + src[j + stride + 0] )>>1);
191 :     dst[j + 1] = (uint8_t)((src[j + 1] + src[j + stride + 1] )>>1);
192 :     dst[j + 2] = (uint8_t)((src[j + 2] + src[j + stride + 2] )>>1);
193 :     dst[j + 3] = (uint8_t)((src[j + 3] + src[j + stride + 3] )>>1);
194 :     dst[j + 4] = (uint8_t)((src[j + 4] + src[j + stride + 4] )>>1);
195 :     dst[j + 5] = (uint8_t)((src[j + 5] + src[j + stride + 5] )>>1);
196 :     dst[j + 6] = (uint8_t)((src[j + 6] + src[j + stride + 6] )>>1);
197 :     dst[j + 7] = (uint8_t)((src[j + 7] + src[j + stride + 7] )>>1);
198 : Isibaar 333 }
199 : edgomez 1530 } else {
200 :     for (j = 0; j < 8*stride; j+=stride) {
201 : chl 906 dst[j + 0] = (uint8_t)((src[j + 0] + src[j + stride + 0] + 1)>>1);
202 :     dst[j + 1] = (uint8_t)((src[j + 1] + src[j + stride + 1] + 1)>>1);
203 :     dst[j + 2] = (uint8_t)((src[j + 2] + src[j + stride + 2] + 1)>>1);
204 :     dst[j + 3] = (uint8_t)((src[j + 3] + src[j + stride + 3] + 1)>>1);
205 :     dst[j + 4] = (uint8_t)((src[j + 4] + src[j + stride + 4] + 1)>>1);
206 :     dst[j + 5] = (uint8_t)((src[j + 5] + src[j + stride + 5] + 1)>>1);
207 :     dst[j + 6] = (uint8_t)((src[j + 6] + src[j + stride + 6] + 1)>>1);
208 :     dst[j + 7] = (uint8_t)((src[j + 7] + src[j + stride + 7] + 1)>>1);
209 :     }
210 : edgomez 1530 }
211 : Isibaar 333 }
212 :    
213 : edgomez 1530 /* dst = (dst + interpolate(src))/2 */
214 : Isibaar 333
215 :     void
216 : edgomez 1530 interpolate8x8_halfpel_v_add_c(uint8_t * const dst,
217 :     const uint8_t * const src,
218 :     const uint32_t stride,
219 :     const uint32_t rounding)
220 :     {
221 :     uintptr_t j;
222 :    
223 :    
224 :     if (rounding) {
225 :     for (j = 0; j < 8*stride; j+=stride) {
226 :     dst[j + 0] = (uint8_t)((((src[j + 0] + src[j + stride + 0] )>>1) + dst[j+0] + 1)>>1);
227 :     dst[j + 1] = (uint8_t)((((src[j + 1] + src[j + stride + 1] )>>1) + dst[j+1] + 1)>>1);
228 :     dst[j + 2] = (uint8_t)((((src[j + 2] + src[j + stride + 2] )>>1) + dst[j+2] + 1)>>1);
229 :     dst[j + 3] = (uint8_t)((((src[j + 3] + src[j + stride + 3] )>>1) + dst[j+3] + 1)>>1);
230 :     dst[j + 4] = (uint8_t)((((src[j + 4] + src[j + stride + 4] )>>1) + dst[j+4] + 1)>>1);
231 :     dst[j + 5] = (uint8_t)((((src[j + 5] + src[j + stride + 5] )>>1) + dst[j+5] + 1)>>1);
232 :     dst[j + 6] = (uint8_t)((((src[j + 6] + src[j + stride + 6] )>>1) + dst[j+6] + 1)>>1);
233 :     dst[j + 7] = (uint8_t)((((src[j + 7] + src[j + stride + 7] )>>1) + dst[j+7] + 1)>>1);
234 :     }
235 :     } else {
236 :     for (j = 0; j < 8*stride; j+=stride) {
237 :     dst[j + 0] = (uint8_t)((((src[j + 0] + src[j + stride + 0] + 1)>>1) + dst[j+0] + 1)>>1);
238 :     dst[j + 1] = (uint8_t)((((src[j + 1] + src[j + stride + 1] + 1)>>1) + dst[j+1] + 1)>>1);
239 :     dst[j + 2] = (uint8_t)((((src[j + 2] + src[j + stride + 2] + 1)>>1) + dst[j+2] + 1)>>1);
240 :     dst[j + 3] = (uint8_t)((((src[j + 3] + src[j + stride + 3] + 1)>>1) + dst[j+3] + 1)>>1);
241 :     dst[j + 4] = (uint8_t)((((src[j + 4] + src[j + stride + 4] + 1)>>1) + dst[j+4] + 1)>>1);
242 :     dst[j + 5] = (uint8_t)((((src[j + 5] + src[j + stride + 5] + 1)>>1) + dst[j+5] + 1)>>1);
243 :     dst[j + 6] = (uint8_t)((((src[j + 6] + src[j + stride + 6] + 1)>>1) + dst[j+6] + 1)>>1);
244 :     dst[j + 7] = (uint8_t)((((src[j + 7] + src[j + stride + 7] + 1)>>1) + dst[j+7] + 1)>>1);
245 :     }
246 :     }
247 :     }
248 :    
249 :     /* dst = interpolate(src) */
250 :    
251 :     void
252 : Isibaar 333 interpolate8x8_halfpel_hv_c(uint8_t * const dst,
253 :     const uint8_t * const src,
254 :     const uint32_t stride,
255 :     const uint32_t rounding)
256 :     {
257 : edgomez 1382 uintptr_t j;
258 : Isibaar 333
259 : edgomez 1530 if (rounding) {
260 :     for (j = 0; j < 8*stride; j+=stride) {
261 : chl 906 dst[j + 0] = (uint8_t)((src[j+0] + src[j+1] + src[j+stride+0] + src[j+stride+1] +1)>>2);
262 :     dst[j + 1] = (uint8_t)((src[j+1] + src[j+2] + src[j+stride+1] + src[j+stride+2] +1)>>2);
263 :     dst[j + 2] = (uint8_t)((src[j+2] + src[j+3] + src[j+stride+2] + src[j+stride+3] +1)>>2);
264 :     dst[j + 3] = (uint8_t)((src[j+3] + src[j+4] + src[j+stride+3] + src[j+stride+4] +1)>>2);
265 :     dst[j + 4] = (uint8_t)((src[j+4] + src[j+5] + src[j+stride+4] + src[j+stride+5] +1)>>2);
266 :     dst[j + 5] = (uint8_t)((src[j+5] + src[j+6] + src[j+stride+5] + src[j+stride+6] +1)>>2);
267 :     dst[j + 6] = (uint8_t)((src[j+6] + src[j+7] + src[j+stride+6] + src[j+stride+7] +1)>>2);
268 :     dst[j + 7] = (uint8_t)((src[j+7] + src[j+8] + src[j+stride+7] + src[j+stride+8] +1)>>2);
269 : Isibaar 333 }
270 : edgomez 1530 } else {
271 :     for (j = 0; j < 8*stride; j+=stride) {
272 : chl 906 dst[j + 0] = (uint8_t)((src[j+0] + src[j+1] + src[j+stride+0] + src[j+stride+1] +2)>>2);
273 :     dst[j + 1] = (uint8_t)((src[j+1] + src[j+2] + src[j+stride+1] + src[j+stride+2] +2)>>2);
274 :     dst[j + 2] = (uint8_t)((src[j+2] + src[j+3] + src[j+stride+2] + src[j+stride+3] +2)>>2);
275 :     dst[j + 3] = (uint8_t)((src[j+3] + src[j+4] + src[j+stride+3] + src[j+stride+4] +2)>>2);
276 :     dst[j + 4] = (uint8_t)((src[j+4] + src[j+5] + src[j+stride+4] + src[j+stride+5] +2)>>2);
277 :     dst[j + 5] = (uint8_t)((src[j+5] + src[j+6] + src[j+stride+5] + src[j+stride+6] +2)>>2);
278 :     dst[j + 6] = (uint8_t)((src[j+6] + src[j+7] + src[j+stride+6] + src[j+stride+7] +2)>>2);
279 :     dst[j + 7] = (uint8_t)((src[j+7] + src[j+8] + src[j+stride+7] + src[j+stride+8] +2)>>2);
280 :     }
281 : edgomez 1530 }
282 : Isibaar 333 }
283 :    
284 : edgomez 1530 /* dst = (interpolate(src) + dst)/2 */
285 :    
286 :     void
287 :     interpolate8x8_halfpel_hv_add_c(uint8_t * const dst,
288 :     const uint8_t * const src,
289 :     const uint32_t stride,
290 :     const uint32_t rounding)
291 :     {
292 :     uintptr_t j;
293 :    
294 :     if (rounding) {
295 :     for (j = 0; j < 8*stride; j+=stride) {
296 :     dst[j + 0] = (uint8_t)((((src[j+0] + src[j+1] + src[j+stride+0] + src[j+stride+1] +1)>>2) + dst[j+0])>>1);
297 :     dst[j + 1] = (uint8_t)((((src[j+1] + src[j+2] + src[j+stride+1] + src[j+stride+2] +1)>>2) + dst[j+1])>>1);
298 :     dst[j + 2] = (uint8_t)((((src[j+2] + src[j+3] + src[j+stride+2] + src[j+stride+3] +1)>>2) + dst[j+2])>>1);
299 :     dst[j + 3] = (uint8_t)((((src[j+3] + src[j+4] + src[j+stride+3] + src[j+stride+4] +1)>>2) + dst[j+3])>>1);
300 :     dst[j + 4] = (uint8_t)((((src[j+4] + src[j+5] + src[j+stride+4] + src[j+stride+5] +1)>>2) + dst[j+4])>>1);
301 :     dst[j + 5] = (uint8_t)((((src[j+5] + src[j+6] + src[j+stride+5] + src[j+stride+6] +1)>>2) + dst[j+5])>>1);
302 :     dst[j + 6] = (uint8_t)((((src[j+6] + src[j+7] + src[j+stride+6] + src[j+stride+7] +1)>>2) + dst[j+6])>>1);
303 :     dst[j + 7] = (uint8_t)((((src[j+7] + src[j+8] + src[j+stride+7] + src[j+stride+8] +1)>>2) + dst[j+7])>>1);
304 :     }
305 :     } else {
306 :     for (j = 0; j < 8*stride; j+=stride) {
307 :     dst[j + 0] = (uint8_t)((((src[j+0] + src[j+1] + src[j+stride+0] + src[j+stride+1] +2)>>2) + dst[j+0] + 1)>>1);
308 :     dst[j + 1] = (uint8_t)((((src[j+1] + src[j+2] + src[j+stride+1] + src[j+stride+2] +2)>>2) + dst[j+1] + 1)>>1);
309 :     dst[j + 2] = (uint8_t)((((src[j+2] + src[j+3] + src[j+stride+2] + src[j+stride+3] +2)>>2) + dst[j+2] + 1)>>1);
310 :     dst[j + 3] = (uint8_t)((((src[j+3] + src[j+4] + src[j+stride+3] + src[j+stride+4] +2)>>2) + dst[j+3] + 1)>>1);
311 :     dst[j + 4] = (uint8_t)((((src[j+4] + src[j+5] + src[j+stride+4] + src[j+stride+5] +2)>>2) + dst[j+4] + 1)>>1);
312 :     dst[j + 5] = (uint8_t)((((src[j+5] + src[j+6] + src[j+stride+5] + src[j+stride+6] +2)>>2) + dst[j+5] + 1)>>1);
313 :     dst[j + 6] = (uint8_t)((((src[j+6] + src[j+7] + src[j+stride+6] + src[j+stride+7] +2)>>2) + dst[j+6] + 1)>>1);
314 :     dst[j + 7] = (uint8_t)((((src[j+7] + src[j+8] + src[j+stride+7] + src[j+stride+8] +2)>>2) + dst[j+7] + 1)>>1);
315 :     }
316 :     }
317 :     }
318 :    
319 : edgomez 851 /*************************************************************
320 :     * QPEL STUFF STARTS HERE *
321 :     *************************************************************/
322 :    
323 :     void interpolate8x8_6tap_lowpass_h_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding)
324 : Isibaar 333 {
325 : edgomez 851 int32_t i;
326 :     uint8_t round_add = 16 - rounding;
327 : Isibaar 333
328 : edgomez 851 for(i = 0; i < 8; i++)
329 :     {
330 :    
331 :     dst[0] = CLIP((((src[-2] + src[3]) + 5 * (((src[0] + src[1])<<2) - (src[-1] + src[2])) + round_add) >> 5), 0, 255);
332 :     dst[1] = CLIP((((src[-1] + src[4]) + 5 * (((src[1] + src[2])<<2) - (src[0] + src[3])) + round_add) >> 5), 0, 255);
333 :     dst[2] = CLIP((((src[0] + src[5]) + 5 * (((src[2] + src[3])<<2) - (src[1] + src[4])) + round_add) >> 5), 0, 255);
334 :     dst[3] = CLIP((((src[1] + src[6]) + 5 * (((src[3] + src[4])<<2) - (src[2] + src[5])) + round_add) >> 5), 0, 255);
335 :     dst[4] = CLIP((((src[2] + src[7]) + 5 * (((src[4] + src[5])<<2) - (src[3] + src[6])) + round_add) >> 5), 0, 255);
336 :     dst[5] = CLIP((((src[3] + src[8]) + 5 * (((src[5] + src[6])<<2) - (src[4] + src[7])) + round_add) >> 5), 0, 255);
337 :     dst[6] = CLIP((((src[4] + src[9]) + 5 * (((src[6] + src[7])<<2) - (src[5] + src[8])) + round_add) >> 5), 0, 255);
338 :     dst[7] = CLIP((((src[5] + src[10]) + 5 * (((src[7] + src[8])<<2) - (src[6] + src[9])) + round_add) >> 5), 0, 255);
339 :    
340 :     dst += stride;
341 :     src += stride;
342 :     }
343 : Isibaar 333 }
344 : edgomez 851
345 :     void interpolate16x16_lowpass_h_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding)
346 :     {
347 :     int32_t i;
348 :     uint8_t round_add = 16 - rounding;
349 :    
350 :     for(i = 0; i < 17; i++)
351 :     {
352 :    
353 :     dst[0] = CLIP(((7 * ((src[0]<<1) - src[2]) + 23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255);
354 :     dst[1] = CLIP(((19 * src[1] + 20 * src[2] - src[5] + 3 * (src[4] - src[0] - (src[3]<<1)) + round_add) >> 5), 0, 255);
355 :     dst[2] = CLIP(((20 * (src[2] + src[3]) + (src[0]<<1) + 3 * (src[5] - ((src[1] + src[4])<<1)) - src[6] + round_add) >> 5), 0, 255);
356 :    
357 :     dst[3] = CLIP(((20 * (src[3] + src[4]) + 3 * ((src[6] + src[1]) - ((src[2] + src[5])<<1)) - (src[0] + src[7]) + round_add) >> 5), 0, 255);
358 :     dst[4] = CLIP(((20 * (src[4] + src[5]) - 3 * (((src[3] + src[6])<<1) - (src[2] + src[7])) - (src[1] + src[8]) + round_add) >> 5), 0, 255);
359 :     dst[5] = CLIP(((20 * (src[5] + src[6]) - 3 * (((src[4] + src[7])<<1) - (src[3] + src[8])) - (src[2] + src[9]) + round_add) >> 5), 0, 255);
360 :     dst[6] = CLIP(((20 * (src[6] + src[7]) - 3 * (((src[5] + src[8])<<1) - (src[4] + src[9])) - (src[3] + src[10]) + round_add) >> 5), 0, 255);
361 :     dst[7] = CLIP(((20 * (src[7] + src[8]) - 3 * (((src[6] + src[9])<<1) - (src[5] + src[10])) - (src[4] + src[11]) + round_add) >> 5), 0, 255);
362 :     dst[8] = CLIP(((20 * (src[8] + src[9]) - 3 * (((src[7] + src[10])<<1) - (src[6] + src[11])) - (src[5] + src[12]) + round_add) >> 5), 0, 255);
363 :     dst[9] = CLIP(((20 * (src[9] + src[10]) - 3 * (((src[8] + src[11])<<1) - (src[7] + src[12])) - (src[6] + src[13]) + round_add) >> 5), 0, 255);
364 :     dst[10] = CLIP(((20 * (src[10] + src[11]) - 3 * (((src[9] + src[12])<<1) - (src[8] + src[13])) - (src[7] + src[14]) + round_add) >> 5), 0, 255);
365 :     dst[11] = CLIP(((20 * (src[11] + src[12]) - 3 * (((src[10] + src[13])<<1) - (src[9] + src[14])) - (src[8] + src[15]) + round_add) >> 5), 0, 255);
366 :     dst[12] = CLIP(((20 * (src[12] + src[13]) - 3 * (((src[11] + src[14])<<1) - (src[10] + src[15])) - (src[9] + src[16]) + round_add) >> 5), 0, 255);
367 :    
368 :     dst[13] = CLIP(((20 * (src[13] + src[14]) + (src[16]<<1) + 3 * (src[11] - ((src[12] + src[15]) << 1)) - src[10] + round_add) >> 5), 0, 255);
369 :     dst[14] = CLIP(((19 * src[15] + 20 * src[14] + 3 * (src[12] - src[16] - (src[13] << 1)) - src[11] + round_add) >> 5), 0, 255);
370 :     dst[15] = CLIP(((23 * src[15] + 7 * ((src[16]<<1) - src[14]) + 3 * src[13] - src[12] + round_add) >> 5), 0, 255);
371 :    
372 :     dst += stride;
373 :     src += stride;
374 :     }
375 :     }
376 :    
377 :     void interpolate8x8_lowpass_h_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding)
378 :     {
379 :     int32_t i;
380 :     uint8_t round_add = 16 - rounding;
381 :    
382 :     for(i = 0; i < 9; i++)
383 :     {
384 :    
385 :     dst[0] = CLIP(((7 * ((src[0]<<1) - src[2]) + 23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255);
386 :     dst[1] = CLIP(((19 * src[1] + 20 * src[2] - src[5] + 3 * (src[4] - src[0] - (src[3]<<1)) + round_add) >> 5), 0, 255);
387 :     dst[2] = CLIP(((20 * (src[2] + src[3]) + (src[0]<<1) + 3 * (src[5] - ((src[1] + src[4])<<1)) - src[6] + round_add) >> 5), 0, 255);
388 :     dst[3] = CLIP(((20 * (src[3] + src[4]) + 3 * ((src[6] + src[1]) - ((src[2] + src[5])<<1)) - (src[0] + src[7]) + round_add) >> 5), 0, 255);
389 :     dst[4] = CLIP(((20 * (src[4] + src[5]) - 3 * (((src[3] + src[6])<<1) - (src[2] + src[7])) - (src[1] + src[8]) + round_add) >> 5), 0, 255);
390 :     dst[5] = CLIP(((20 * (src[5] + src[6]) + (src[8]<<1) + 3 * (src[3] - ((src[4] + src[7]) << 1)) - src[2] + round_add) >> 5), 0, 255);
391 :     dst[6] = CLIP(((19 * src[7] + 20 * src[6] + 3 * (src[4] - src[8] - (src[5] << 1)) - src[3] + round_add) >> 5), 0, 255);
392 :     dst[7] = CLIP(((23 * src[7] + 7 * ((src[8]<<1) - src[6]) + 3 * src[5] - src[4] + round_add) >> 5), 0, 255);
393 :    
394 :     dst += stride;
395 :     src += stride;
396 :     }
397 :     }
398 :    
399 :     void interpolate8x8_6tap_lowpass_v_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding)
400 :     {
401 :     int32_t i;
402 :     uint8_t round_add = 16 - rounding;
403 :    
404 :     for(i = 0; i < 8; i++)
405 :     {
406 :     int32_t src_2 = src[-2*stride];
407 :     int32_t src_1 = src[-stride];
408 :     int32_t src0 = src[0];
409 :     int32_t src1 = src[stride];
410 :     int32_t src2 = src[2 * stride];
411 :     int32_t src3 = src[3 * stride];
412 :     int32_t src4 = src[4 * stride];
413 :     int32_t src5 = src[5 * stride];
414 :     int32_t src6 = src[6 * stride];
415 :     int32_t src7 = src[7 * stride];
416 :     int32_t src8 = src[8 * stride];
417 :     int32_t src9 = src[9 * stride];
418 :     int32_t src10 = src[10 * stride];
419 :    
420 :     dst[0] = CLIP((((src_2 + src3) + 5 * (((src0 + src1)<<2) - (src_1 + src2)) + round_add) >> 5), 0, 255);
421 :     dst[stride] = CLIP((((src_1 + src4) + 5 * (((src1 + src2)<<2) - (src0 + src3)) + round_add) >> 5), 0, 255);
422 :     dst[2 * stride] = CLIP((((src0 + src5) + 5 * (((src2 + src3)<<2) - (src1 + src4)) + round_add) >> 5), 0, 255);
423 :     dst[3 * stride] = CLIP((((src1 + src6) + 5 * (((src3 + src4)<<2) - (src2 + src5)) + round_add) >> 5), 0, 255);
424 :     dst[4 * stride] = CLIP((((src2 + src7) + 5 * (((src4 + src5)<<2) - (src3 + src6)) + round_add) >> 5), 0, 255);
425 :     dst[5 * stride] = CLIP((((src3 + src8) + 5 * (((src5 + src6)<<2) - (src4 + src7)) + round_add) >> 5), 0, 255);
426 :     dst[6 * stride] = CLIP((((src4 + src9) + 5 * (((src6 + src7)<<2) - (src5 + src8)) + round_add) >> 5), 0, 255);
427 :     dst[7 * stride] = CLIP((((src5 + src10) + 5 * (((src7 + src8)<<2) - (src6 + src9)) + round_add) >> 5), 0, 255);
428 :    
429 :     dst++;
430 :     src++;
431 :     }
432 :     }
433 :    
434 :     void interpolate16x16_lowpass_v_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding)
435 :     {
436 :     int32_t i;
437 :     uint8_t round_add = 16 - rounding;
438 :    
439 :     for(i = 0; i < 17; i++)
440 :     {
441 :     int32_t src0 = src[0];
442 :     int32_t src1 = src[stride];
443 :     int32_t src2 = src[2 * stride];
444 :     int32_t src3 = src[3 * stride];
445 :     int32_t src4 = src[4 * stride];
446 :     int32_t src5 = src[5 * stride];
447 :     int32_t src6 = src[6 * stride];
448 :     int32_t src7 = src[7 * stride];
449 :     int32_t src8 = src[8 * stride];
450 :     int32_t src9 = src[9 * stride];
451 :     int32_t src10 = src[10 * stride];
452 :     int32_t src11 = src[11 * stride];
453 :     int32_t src12 = src[12 * stride];
454 :     int32_t src13 = src[13 * stride];
455 :     int32_t src14 = src[14 * stride];
456 :     int32_t src15 = src[15 * stride];
457 :     int32_t src16 = src[16 * stride];
458 :    
459 : edgomez 1382
460 : edgomez 851 dst[0] = CLIP(((7 * ((src0<<1) - src2) + 23 * src1 + 3 * src3 - src4 + round_add) >> 5), 0, 255);
461 :     dst[stride] = CLIP(((19 * src1 + 20 * src2 - src5 + 3 * (src4 - src0 - (src3<<1)) + round_add) >> 5), 0, 255);
462 :     dst[2*stride] = CLIP(((20 * (src2 + src3) + (src0<<1) + 3 * (src5 - ((src1 + src4)<<1)) - src6 + round_add) >> 5), 0, 255);
463 :    
464 :     dst[3*stride] = CLIP(((20 * (src3 + src4) + 3 * ((src6 + src1) - ((src2 + src5)<<1)) - (src0 + src7) + round_add) >> 5), 0, 255);
465 :     dst[4*stride] = CLIP(((20 * (src4 + src5) - 3 * (((src3 + src6)<<1) - (src2 + src7)) - (src1 + src8) + round_add) >> 5), 0, 255);
466 :     dst[5*stride] = CLIP(((20 * (src5 + src6) - 3 * (((src4 + src7)<<1) - (src3 + src8)) - (src2 + src9) + round_add) >> 5), 0, 255);
467 :     dst[6*stride] = CLIP(((20 * (src6 + src7) - 3 * (((src5 + src8)<<1) - (src4 + src9)) - (src3 + src10) + round_add) >> 5), 0, 255);
468 :     dst[7*stride] = CLIP(((20 * (src7 + src8) - 3 * (((src6 + src9)<<1) - (src5 + src10)) - (src4 + src11) + round_add) >> 5), 0, 255);
469 :     dst[8*stride] = CLIP(((20 * (src8 + src9) - 3 * (((src7 + src10)<<1) - (src6 + src11)) - (src5 + src12) + round_add) >> 5), 0, 255);
470 :     dst[9*stride] = CLIP(((20 * (src9 + src10) - 3 * (((src8 + src11)<<1) - (src7 + src12)) - (src6 + src13) + round_add) >> 5), 0, 255);
471 :     dst[10*stride] = CLIP(((20 * (src10 + src11) - 3 * (((src9 + src12)<<1) - (src8 + src13)) - (src7 + src14) + round_add) >> 5), 0, 255);
472 :     dst[11*stride] = CLIP(((20 * (src11 + src12) - 3 * (((src10 + src13)<<1) - (src9 + src14)) - (src8 + src15) + round_add) >> 5), 0, 255);
473 :     dst[12*stride] = CLIP(((20 * (src12 + src13) - 3 * (((src11 + src14)<<1) - (src10 + src15)) - (src9 + src16) + round_add) >> 5), 0, 255);
474 :    
475 :     dst[13*stride] = CLIP(((20 * (src13 + src14) + (src16<<1) + 3 * (src11 - ((src12 + src15) << 1)) - src10 + round_add) >> 5), 0, 255);
476 :     dst[14*stride] = CLIP(((19 * src15 + 20 * src14 + 3 * (src12 - src16 - (src13 << 1)) - src11 + round_add) >> 5), 0, 255);
477 :     dst[15*stride] = CLIP(((23 * src15 + 7 * ((src16<<1) - src14) + 3 * src13 - src12 + round_add) >> 5), 0, 255);
478 :    
479 :     dst++;
480 :     src++;
481 :     }
482 :     }
483 :    
484 :     void interpolate8x8_lowpass_v_c(uint8_t *dst, uint8_t *src, int32_t stride, int32_t rounding)
485 :     {
486 :     int32_t i;
487 :     uint8_t round_add = 16 - rounding;
488 :    
489 :     for(i = 0; i < 9; i++)
490 :     {
491 :     int32_t src0 = src[0];
492 :     int32_t src1 = src[stride];
493 :     int32_t src2 = src[2 * stride];
494 :     int32_t src3 = src[3 * stride];
495 :     int32_t src4 = src[4 * stride];
496 :     int32_t src5 = src[5 * stride];
497 :     int32_t src6 = src[6 * stride];
498 :     int32_t src7 = src[7 * stride];
499 :     int32_t src8 = src[8 * stride];
500 : edgomez 1382
501 : edgomez 851 dst[0] = CLIP(((7 * ((src0<<1) - src2) + 23 * src1 + 3 * src3 - src4 + round_add) >> 5), 0, 255);
502 :     dst[stride] = CLIP(((19 * src1 + 20 * src2 - src5 + 3 * (src4 - src0 - (src3 << 1)) + round_add) >> 5), 0, 255);
503 :     dst[2 * stride] = CLIP(((20 * (src2 + src3) + (src0<<1) + 3 * (src5 - ((src1 + src4) <<1 )) - src6 + round_add) >> 5), 0, 255);
504 :     dst[3 * stride] = CLIP(((20 * (src3 + src4) + 3 * ((src6 + src1) - ((src2 + src5)<<1)) - (src0 + src7) + round_add) >> 5), 0, 255);
505 :     dst[4 * stride] = CLIP(((20 * (src4 + src5) + 3 * ((src2 + src7) - ((src3 + src6)<<1)) - (src1 + src8) + round_add) >> 5), 0, 255);
506 :     dst[5 * stride] = CLIP(((20 * (src5 + src6) + (src8<<1) + 3 * (src3 - ((src4 + src7) << 1)) - src2 + round_add) >> 5), 0, 255);
507 :     dst[6 * stride] = CLIP(((19 * src7 + 20 * src6 - src3 + 3 * (src4 - src8 - (src5 << 1)) + round_add) >> 5), 0, 255);
508 :     dst[7 * stride] = CLIP(((7 * ((src8<<1) - src6) + 23 * src7 + 3 * src5 - src4 + round_add) >> 5), 0, 255);
509 :    
510 :     dst++;
511 :     src++;
512 :     }
513 :     }
514 :    
515 :     void interpolate16x16_lowpass_hv_c(uint8_t *dst1, uint8_t *dst2, uint8_t *src, int32_t stride, int32_t rounding)
516 :     {
517 :     int32_t i;
518 :     uint8_t round_add = 16 - rounding;
519 :     uint8_t *h_ptr = dst2;
520 :    
521 :     for(i = 0; i < 17; i++)
522 :     {
523 :    
524 :     h_ptr[0] = CLIP(((7 * ((src[0]<<1) - src[2]) + 23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255);
525 :     h_ptr[1] = CLIP(((19 * src[1] + 20 * src[2] - src[5] + 3 * (src[4] - src[0] - (src[3]<<1)) + round_add) >> 5), 0, 255);
526 :     h_ptr[2] = CLIP(((20 * (src[2] + src[3]) + (src[0]<<1) + 3 * (src[5] - ((src[1] + src[4])<<1)) - src[6] + round_add) >> 5), 0, 255);
527 :    
528 :     h_ptr[3] = CLIP(((20 * (src[3] + src[4]) + 3 * ((src[6] + src[1]) - ((src[2] + src[5])<<1)) - (src[0] + src[7]) + round_add) >> 5), 0, 255);
529 :     h_ptr[4] = CLIP(((20 * (src[4] + src[5]) - 3 * (((src[3] + src[6])<<1) - (src[2] + src[7])) - (src[1] + src[8]) + round_add) >> 5), 0, 255);
530 :     h_ptr[5] = CLIP(((20 * (src[5] + src[6]) - 3 * (((src[4] + src[7])<<1) - (src[3] + src[8])) - (src[2] + src[9]) + round_add) >> 5), 0, 255);
531 :     h_ptr[6] = CLIP(((20 * (src[6] + src[7]) - 3 * (((src[5] + src[8])<<1) - (src[4] + src[9])) - (src[3] + src[10]) + round_add) >> 5), 0, 255);
532 :     h_ptr[7] = CLIP(((20 * (src[7] + src[8]) - 3 * (((src[6] + src[9])<<1) - (src[5] + src[10])) - (src[4] + src[11]) + round_add) >> 5), 0, 255);
533 :     h_ptr[8] = CLIP(((20 * (src[8] + src[9]) - 3 * (((src[7] + src[10])<<1) - (src[6] + src[11])) - (src[5] + src[12]) + round_add) >> 5), 0, 255);
534 :     h_ptr[9] = CLIP(((20 * (src[9] + src[10]) - 3 * (((src[8] + src[11])<<1) - (src[7] + src[12])) - (src[6] + src[13]) + round_add) >> 5), 0, 255);
535 :     h_ptr[10] = CLIP(((20 * (src[10] + src[11]) - 3 * (((src[9] + src[12])<<1) - (src[8] + src[13])) - (src[7] + src[14]) + round_add) >> 5), 0, 255);
536 :     h_ptr[11] = CLIP(((20 * (src[11] + src[12]) - 3 * (((src[10] + src[13])<<1) - (src[9] + src[14])) - (src[8] + src[15]) + round_add) >> 5), 0, 255);
537 :     h_ptr[12] = CLIP(((20 * (src[12] + src[13]) - 3 * (((src[11] + src[14])<<1) - (src[10] + src[15])) - (src[9] + src[16]) + round_add) >> 5), 0, 255);
538 :    
539 :     h_ptr[13] = CLIP(((20 * (src[13] + src[14]) + (src[16]<<1) + 3 * (src[11] - ((src[12] + src[15]) << 1)) - src[10] + round_add) >> 5), 0, 255);
540 :     h_ptr[14] = CLIP(((19 * src[15] + 20 * src[14] + 3 * (src[12] - src[16] - (src[13] << 1)) - src[11] + round_add) >> 5), 0, 255);
541 :     h_ptr[15] = CLIP(((23 * src[15] + 7 * ((src[16]<<1) - src[14]) + 3 * src[13] - src[12] + round_add) >> 5), 0, 255);
542 :    
543 :     h_ptr += stride;
544 :     src += stride;
545 :     }
546 :    
547 :     interpolate16x16_lowpass_v_c(dst1, dst2, stride, rounding);
548 :    
549 :     }
550 :    
551 :     void interpolate8x8_lowpass_hv_c(uint8_t *dst1, uint8_t *dst2, uint8_t *src, int32_t stride, int32_t rounding)
552 :     {
553 :     int32_t i;
554 :     uint8_t round_add = 16 - rounding;
555 :     uint8_t *h_ptr = dst2;
556 :    
557 :     for(i = 0; i < 9; i++)
558 :     {
559 :    
560 :     h_ptr[0] = CLIP(((7 * ((src[0]<<1) - src[2]) + 23 * src[1] + 3 * src[3] - src[4] + round_add) >> 5), 0, 255);
561 :     h_ptr[1] = CLIP(((19 * src[1] + 20 * src[2] - src[5] + 3 * (src[4] - src[0] - (src[3]<<1)) + round_add) >> 5), 0, 255);
562 :     h_ptr[2] = CLIP(((20 * (src[2] + src[3]) + (src[0]<<1) + 3 * (src[5] - ((src[1] + src[4])<<1)) - src[6] + round_add) >> 5), 0, 255);
563 :     h_ptr[3] = CLIP(((20 * (src[3] + src[4]) + 3 * ((src[6] + src[1]) - ((src[2] + src[5])<<1)) - (src[0] + src[7]) + round_add) >> 5), 0, 255);
564 :     h_ptr[4] = CLIP(((20 * (src[4] + src[5]) - 3 * (((src[3] + src[6])<<1) - (src[2] + src[7])) - (src[1] + src[8]) + round_add) >> 5), 0, 255);
565 :     h_ptr[5] = CLIP(((20 * (src[5] + src[6]) + (src[8]<<1) + 3 * (src[3] - ((src[4] + src[7]) << 1)) - src[2] + round_add) >> 5), 0, 255);
566 :     h_ptr[6] = CLIP(((19 * src[7] + 20 * src[6] + 3 * (src[4] - src[8] - (src[5] << 1)) - src[3] + round_add) >> 5), 0, 255);
567 :     h_ptr[7] = CLIP(((23 * src[7] + 7 * ((src[8]<<1) - src[6]) + 3 * src[5] - src[4] + round_add) >> 5), 0, 255);
568 :    
569 :     h_ptr += stride;
570 :     src += stride;
571 :     }
572 :    
573 :     interpolate8x8_lowpass_v_c(dst1, dst2, stride, rounding);
574 :    
575 :     }

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