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