Imported Debian version 2.4.3~trusty1
[deb_ffmpeg.git] / ffmpeg / libavcodec / tpeldsp.c
1 /*
2 * thirdpel DSP functions
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 /**
22 * @file
23 * thirdpel DSP functions
24 */
25
26 #include <stdint.h>
27
28 #include "libavutil/attributes.h"
29 #include "tpeldsp.h"
30
31 #define BIT_DEPTH 8
32 #include "pel_template.c"
33
34 static inline void put_tpel_pixels_mc00_c(uint8_t *dst, const uint8_t *src,
35 int stride, int width, int height)
36 {
37 switch (width) {
38 case 2:
39 put_pixels2_8_c(dst, src, stride, height);
40 break;
41 case 4:
42 put_pixels4_8_c(dst, src, stride, height);
43 break;
44 case 8:
45 put_pixels8_8_c(dst, src, stride, height);
46 break;
47 case 16:
48 put_pixels16_8_c(dst, src, stride, height);
49 break;
50 }
51 }
52
53 static inline void put_tpel_pixels_mc10_c(uint8_t *dst, const uint8_t *src,
54 int stride, int width, int height)
55 {
56 int i, j;
57
58 for (i = 0; i < height; i++) {
59 for (j = 0; j < width; j++)
60 dst[j] = ((2 * src[j] + src[j + 1] + 1) *
61 683) >> 11;
62 src += stride;
63 dst += stride;
64 }
65 }
66
67 static inline void put_tpel_pixels_mc20_c(uint8_t *dst, const uint8_t *src,
68 int stride, int width, int height)
69 {
70 int i, j;
71
72 for (i = 0; i < height; i++) {
73 for (j = 0; j < width; j++)
74 dst[j] = ((src[j] + 2 * src[j + 1] + 1) *
75 683) >> 11;
76 src += stride;
77 dst += stride;
78 }
79 }
80
81 static inline void put_tpel_pixels_mc01_c(uint8_t *dst, const uint8_t *src,
82 int stride, int width, int height)
83 {
84 int i, j;
85
86 for (i = 0; i < height; i++) {
87 for (j = 0; j < width; j++)
88 dst[j] = ((2 * src[j] + src[j + stride] + 1) *
89 683) >> 11;
90 src += stride;
91 dst += stride;
92 }
93 }
94
95 static inline void put_tpel_pixels_mc11_c(uint8_t *dst, const uint8_t *src,
96 int stride, int width, int height)
97 {
98 int i, j;
99
100 for (i = 0; i < height; i++) {
101 for (j = 0; j < width; j++)
102 dst[j] = ((4 * src[j] + 3 * src[j + 1] +
103 3 * src[j + stride] + 2 * src[j + stride + 1] + 6) *
104 2731) >> 15;
105 src += stride;
106 dst += stride;
107 }
108 }
109
110 static inline void put_tpel_pixels_mc12_c(uint8_t *dst, const uint8_t *src,
111 int stride, int width, int height)
112 {
113 int i, j;
114
115 for (i = 0; i < height; i++) {
116 for (j = 0; j < width; j++)
117 dst[j] = ((3 * src[j] + 2 * src[j + 1] +
118 4 * src[j + stride] + 3 * src[j + stride + 1] + 6) *
119 2731) >> 15;
120 src += stride;
121 dst += stride;
122 }
123 }
124
125 static inline void put_tpel_pixels_mc02_c(uint8_t *dst, const uint8_t *src,
126 int stride, int width, int height)
127 {
128 int i, j;
129
130 for (i = 0; i < height; i++) {
131 for (j = 0; j < width; j++)
132 dst[j] = ((src[j] + 2 * src[j + stride] + 1) *
133 683) >> 11;
134 src += stride;
135 dst += stride;
136 }
137 }
138
139 static inline void put_tpel_pixels_mc21_c(uint8_t *dst, const uint8_t *src,
140 int stride, int width, int height)
141 {
142 int i, j;
143
144 for (i = 0; i < height; i++) {
145 for (j = 0; j < width; j++)
146 dst[j] = ((3 * src[j] + 4 * src[j + 1] +
147 2 * src[j + stride] + 3 * src[j + stride + 1] + 6) *
148 2731) >> 15;
149 src += stride;
150 dst += stride;
151 }
152 }
153
154 static inline void put_tpel_pixels_mc22_c(uint8_t *dst, const uint8_t *src,
155 int stride, int width, int height)
156 {
157 int i, j;
158
159 for (i = 0; i < height; i++) {
160 for (j = 0; j < width; j++)
161 dst[j] = ((2 * src[j] + 3 * src[j + 1] +
162 3 * src[j + stride] + 4 * src[j + stride + 1] + 6) *
163 2731) >> 15;
164 src += stride;
165 dst += stride;
166 }
167 }
168
169 static inline void avg_tpel_pixels_mc00_c(uint8_t *dst, const uint8_t *src,
170 int stride, int width, int height)
171 {
172 switch (width) {
173 case 2:
174 avg_pixels2_8_c(dst, src, stride, height);
175 break;
176 case 4:
177 avg_pixels4_8_c(dst, src, stride, height);
178 break;
179 case 8:
180 avg_pixels8_8_c(dst, src, stride, height);
181 break;
182 case 16:
183 avg_pixels16_8_c(dst, src, stride, height);
184 break;
185 }
186 }
187
188 static inline void avg_tpel_pixels_mc10_c(uint8_t *dst, const uint8_t *src,
189 int stride, int width, int height)
190 {
191 int i, j;
192
193 for (i = 0; i < height; i++) {
194 for (j = 0; j < width; j++)
195 dst[j] = (dst[j] +
196 (((2 * src[j] + src[j + 1] + 1) *
197 683) >> 11) + 1) >> 1;
198 src += stride;
199 dst += stride;
200 }
201 }
202
203 static inline void avg_tpel_pixels_mc20_c(uint8_t *dst, const uint8_t *src,
204 int stride, int width, int height)
205 {
206 int i, j;
207
208 for (i = 0; i < height; i++) {
209 for (j = 0; j < width; j++)
210 dst[j] = (dst[j] +
211 (((src[j] + 2 * src[j + 1] + 1) *
212 683) >> 11) + 1) >> 1;
213 src += stride;
214 dst += stride;
215 }
216 }
217
218 static inline void avg_tpel_pixels_mc01_c(uint8_t *dst, const uint8_t *src,
219 int stride, int width, int height)
220 {
221 int i, j;
222
223 for (i = 0; i < height; i++) {
224 for (j = 0; j < width; j++)
225 dst[j] = (dst[j] +
226 (((2 * src[j] + src[j + stride] + 1) *
227 683) >> 11) + 1) >> 1;
228 src += stride;
229 dst += stride;
230 }
231 }
232
233 static inline void avg_tpel_pixels_mc11_c(uint8_t *dst, const uint8_t *src,
234 int stride, int width, int height)
235 {
236 int i, j;
237
238 for (i = 0; i < height; i++) {
239 for (j = 0; j < width; j++)
240 dst[j] = (dst[j] +
241 (((4 * src[j] + 3 * src[j + 1] +
242 3 * src[j + stride] + 2 * src[j + stride + 1] + 6) *
243 2731) >> 15) + 1) >> 1;
244 src += stride;
245 dst += stride;
246 }
247 }
248
249 static inline void avg_tpel_pixels_mc12_c(uint8_t *dst, const uint8_t *src,
250 int stride, int width, int height)
251 {
252 int i, j;
253
254 for (i = 0; i < height; i++) {
255 for (j = 0; j < width; j++)
256 dst[j] = (dst[j] +
257 (((3 * src[j] + 2 * src[j + 1] +
258 4 * src[j + stride] + 3 * src[j + stride + 1] + 6) *
259 2731) >> 15) + 1) >> 1;
260 src += stride;
261 dst += stride;
262 }
263 }
264
265 static inline void avg_tpel_pixels_mc02_c(uint8_t *dst, const uint8_t *src,
266 int stride, int width, int height)
267 {
268 int i, j;
269
270 for (i = 0; i < height; i++) {
271 for (j = 0; j < width; j++)
272 dst[j] = (dst[j] +
273 (((src[j] + 2 * src[j + stride] + 1) *
274 683) >> 11) + 1) >> 1;
275 src += stride;
276 dst += stride;
277 }
278 }
279
280 static inline void avg_tpel_pixels_mc21_c(uint8_t *dst, const uint8_t *src,
281 int stride, int width, int height)
282 {
283 int i, j;
284
285 for (i = 0; i < height; i++) {
286 for (j = 0; j < width; j++)
287 dst[j] = (dst[j] +
288 (((3 * src[j] + 4 * src[j + 1] +
289 2 * src[j + stride] + 3 * src[j + stride + 1] + 6) *
290 2731) >> 15) + 1) >> 1;
291 src += stride;
292 dst += stride;
293 }
294 }
295
296 static inline void avg_tpel_pixels_mc22_c(uint8_t *dst, const uint8_t *src,
297 int stride, int width, int height)
298 {
299 int i, j;
300
301 for (i = 0; i < height; i++) {
302 for (j = 0; j < width; j++)
303 dst[j] = (dst[j] +
304 (((2 * src[j] + 3 * src[j + 1] +
305 3 * src[j + stride] + 4 * src[j + stride + 1] + 6) *
306 2731) >> 15) + 1) >> 1;
307 src += stride;
308 dst += stride;
309 }
310 }
311
312 av_cold void ff_tpeldsp_init(TpelDSPContext *c)
313 {
314 c->put_tpel_pixels_tab[ 0] = put_tpel_pixels_mc00_c;
315 c->put_tpel_pixels_tab[ 1] = put_tpel_pixels_mc10_c;
316 c->put_tpel_pixels_tab[ 2] = put_tpel_pixels_mc20_c;
317 c->put_tpel_pixels_tab[ 4] = put_tpel_pixels_mc01_c;
318 c->put_tpel_pixels_tab[ 5] = put_tpel_pixels_mc11_c;
319 c->put_tpel_pixels_tab[ 6] = put_tpel_pixels_mc21_c;
320 c->put_tpel_pixels_tab[ 8] = put_tpel_pixels_mc02_c;
321 c->put_tpel_pixels_tab[ 9] = put_tpel_pixels_mc12_c;
322 c->put_tpel_pixels_tab[10] = put_tpel_pixels_mc22_c;
323
324 c->avg_tpel_pixels_tab[ 0] = avg_tpel_pixels_mc00_c;
325 c->avg_tpel_pixels_tab[ 1] = avg_tpel_pixels_mc10_c;
326 c->avg_tpel_pixels_tab[ 2] = avg_tpel_pixels_mc20_c;
327 c->avg_tpel_pixels_tab[ 4] = avg_tpel_pixels_mc01_c;
328 c->avg_tpel_pixels_tab[ 5] = avg_tpel_pixels_mc11_c;
329 c->avg_tpel_pixels_tab[ 6] = avg_tpel_pixels_mc21_c;
330 c->avg_tpel_pixels_tab[ 8] = avg_tpel_pixels_mc02_c;
331 c->avg_tpel_pixels_tab[ 9] = avg_tpel_pixels_mc12_c;
332 c->avg_tpel_pixels_tab[10] = avg_tpel_pixels_mc22_c;
333 }