Imported Debian version 2.4.3~trusty1
[deb_ffmpeg.git] / ffmpeg / libavcodec / tpeldsp.c
CommitLineData
2ba45a60
DM
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
34static 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
53static 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
67static 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
81static 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
95static 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
110static 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
125static 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
139static 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
154static 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
169static 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
188static 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
203static 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
218static 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
233static 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
249static 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
265static 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
280static 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
296static 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
312av_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}