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}
334