avcodec/idctdsp: Clear idct/idct_add for studio profile
[ffmpeg.git] / 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 }