xref: /third_party/ffmpeg/tests/checkasm/sw_gbrp.c (revision cabdff1a)
1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci *
3cabdff1aSopenharmony_ci * This file is part of FFmpeg.
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or modify
6cabdff1aSopenharmony_ci * it under the terms of the GNU General Public License as published by
7cabdff1aSopenharmony_ci * the Free Software Foundation; either version 2 of the License, or
8cabdff1aSopenharmony_ci * (at your option) any later version.
9cabdff1aSopenharmony_ci *
10cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
11cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
12cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13cabdff1aSopenharmony_ci * GNU General Public License for more details.
14cabdff1aSopenharmony_ci *
15cabdff1aSopenharmony_ci * You should have received a copy of the GNU General Public License along
16cabdff1aSopenharmony_ci * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
17cabdff1aSopenharmony_ci * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18cabdff1aSopenharmony_ci */
19cabdff1aSopenharmony_ci
20cabdff1aSopenharmony_ci#include <string.h>
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci#include "libavutil/common.h"
23cabdff1aSopenharmony_ci#include "libavutil/intreadwrite.h"
24cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h"
25cabdff1aSopenharmony_ci#include "libavutil/pixdesc.h"
26cabdff1aSopenharmony_ci
27cabdff1aSopenharmony_ci#include "libswscale/swscale.h"
28cabdff1aSopenharmony_ci#include "libswscale/swscale_internal.h"
29cabdff1aSopenharmony_ci
30cabdff1aSopenharmony_ci#include "checkasm.h"
31cabdff1aSopenharmony_ci
32cabdff1aSopenharmony_ci#define randomize_buffers(buf, size)      \
33cabdff1aSopenharmony_ci    do {                                  \
34cabdff1aSopenharmony_ci        int j;                            \
35cabdff1aSopenharmony_ci        for (j = 0; j < size; j+=4)       \
36cabdff1aSopenharmony_ci            AV_WN32(buf + j, rnd());      \
37cabdff1aSopenharmony_ci    } while (0)
38cabdff1aSopenharmony_ci
39cabdff1aSopenharmony_cistatic const int planar_fmts[] = {
40cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRP,
41cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRP9BE,
42cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRP9LE,
43cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRP10BE,
44cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRP10LE,
45cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRP12BE,
46cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRP12LE,
47cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRP14BE,
48cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRP14LE,
49cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRAP,
50cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRAP10BE,
51cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRAP10LE,
52cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRAP12BE,
53cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRAP12LE,
54cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRP16BE,
55cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRP16LE,
56cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRAP16BE,
57cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRAP16LE,
58cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRPF32BE,
59cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRPF32LE,
60cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRAPF32BE,
61cabdff1aSopenharmony_ci    AV_PIX_FMT_GBRAPF32LE
62cabdff1aSopenharmony_ci};
63cabdff1aSopenharmony_ci
64cabdff1aSopenharmony_cistatic void check_output_yuv2gbrp(void)
65cabdff1aSopenharmony_ci{
66cabdff1aSopenharmony_ci    struct SwsContext *ctx;
67cabdff1aSopenharmony_ci    const AVPixFmtDescriptor *desc;
68cabdff1aSopenharmony_ci    int fmi, fsi, isi, i;
69cabdff1aSopenharmony_ci    int dstW, byte_size, luma_filter_size, chr_filter_size;
70cabdff1aSopenharmony_ci#define LARGEST_FILTER 16
71cabdff1aSopenharmony_ci#define FILTER_SIZES 4
72cabdff1aSopenharmony_ci    static const int filter_sizes[] = {1, 4, 8, 16};
73cabdff1aSopenharmony_ci#define LARGEST_INPUT_SIZE 512
74cabdff1aSopenharmony_ci#define INPUT_SIZES 6
75cabdff1aSopenharmony_ci    static const int input_sizes[] = {8, 24, 128, 144, 256, 512};
76cabdff1aSopenharmony_ci    uint8_t *dst0[4];
77cabdff1aSopenharmony_ci    uint8_t *dst1[4];
78cabdff1aSopenharmony_ci
79cabdff1aSopenharmony_ci    declare_func(void, void *c, const int16_t *lumFilter,
80cabdff1aSopenharmony_ci                       const int16_t **lumSrcx, int lumFilterSize,
81cabdff1aSopenharmony_ci                       const int16_t *chrFilter, const int16_t **chrUSrcx,
82cabdff1aSopenharmony_ci                       const int16_t **chrVSrcx, int chrFilterSize,
83cabdff1aSopenharmony_ci                       const int16_t **alpSrcx, uint8_t **dest,
84cabdff1aSopenharmony_ci                       int dstW, int y);
85cabdff1aSopenharmony_ci
86cabdff1aSopenharmony_ci    const int16_t *luma[LARGEST_FILTER];
87cabdff1aSopenharmony_ci    const int16_t *chru[LARGEST_FILTER];
88cabdff1aSopenharmony_ci    const int16_t *chrv[LARGEST_FILTER];
89cabdff1aSopenharmony_ci    const int16_t *alpha[LARGEST_FILTER];
90cabdff1aSopenharmony_ci
91cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int16_t, luma_filter, [LARGEST_FILTER]);
92cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int16_t, chr_filter, [LARGEST_FILTER]);
93cabdff1aSopenharmony_ci
94cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int32_t, src_y, [LARGEST_FILTER * LARGEST_INPUT_SIZE]);
95cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int32_t, src_u, [LARGEST_FILTER * LARGEST_INPUT_SIZE]);
96cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int32_t, src_v, [LARGEST_FILTER * LARGEST_INPUT_SIZE]);
97cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int32_t, src_a, [LARGEST_FILTER * LARGEST_INPUT_SIZE]);
98cabdff1aSopenharmony_ci
99cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(uint8_t, dst0_r, [LARGEST_INPUT_SIZE * sizeof(int32_t)]);
100cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(uint8_t, dst0_g, [LARGEST_INPUT_SIZE * sizeof(int32_t)]);
101cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(uint8_t, dst0_b, [LARGEST_INPUT_SIZE * sizeof(int32_t)]);
102cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(uint8_t, dst0_a, [LARGEST_INPUT_SIZE * sizeof(int32_t)]);
103cabdff1aSopenharmony_ci
104cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(uint8_t, dst1_r, [LARGEST_INPUT_SIZE * sizeof(int32_t)]);
105cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(uint8_t, dst1_g, [LARGEST_INPUT_SIZE * sizeof(int32_t)]);
106cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(uint8_t, dst1_b, [LARGEST_INPUT_SIZE * sizeof(int32_t)]);
107cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(uint8_t, dst1_a, [LARGEST_INPUT_SIZE * sizeof(int32_t)]);
108cabdff1aSopenharmony_ci
109cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)src_y, LARGEST_FILTER * LARGEST_INPUT_SIZE * sizeof(int32_t));
110cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)src_u, LARGEST_FILTER * LARGEST_INPUT_SIZE * sizeof(int32_t));
111cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)src_v, LARGEST_FILTER * LARGEST_INPUT_SIZE * sizeof(int32_t));
112cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)src_a, LARGEST_FILTER * LARGEST_INPUT_SIZE * sizeof(int32_t));
113cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)luma_filter, LARGEST_FILTER * sizeof(int16_t));
114cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)chr_filter, LARGEST_FILTER * sizeof(int16_t));
115cabdff1aSopenharmony_ci
116cabdff1aSopenharmony_ci    dst0[0] = (uint8_t*)dst0_g;
117cabdff1aSopenharmony_ci    dst0[1] = (uint8_t*)dst0_b;
118cabdff1aSopenharmony_ci    dst0[2] = (uint8_t*)dst0_r;
119cabdff1aSopenharmony_ci    dst0[3] = (uint8_t*)dst0_a;
120cabdff1aSopenharmony_ci
121cabdff1aSopenharmony_ci    dst1[0] = (uint8_t*)dst1_g;
122cabdff1aSopenharmony_ci    dst1[1] = (uint8_t*)dst1_b;
123cabdff1aSopenharmony_ci    dst1[2] = (uint8_t*)dst1_r;
124cabdff1aSopenharmony_ci    dst1[3] = (uint8_t*)dst1_a;
125cabdff1aSopenharmony_ci
126cabdff1aSopenharmony_ci    for (i = 0; i < LARGEST_FILTER; i++) {
127cabdff1aSopenharmony_ci        luma[i] =  (int16_t *)(src_y + i*LARGEST_INPUT_SIZE);
128cabdff1aSopenharmony_ci        chru[i] =  (int16_t *)(src_u + i*LARGEST_INPUT_SIZE);
129cabdff1aSopenharmony_ci        chrv[i] =  (int16_t *)(src_v + i*LARGEST_INPUT_SIZE);
130cabdff1aSopenharmony_ci        alpha[i] = (int16_t *)(src_a + i*LARGEST_INPUT_SIZE);
131cabdff1aSopenharmony_ci    }
132cabdff1aSopenharmony_ci
133cabdff1aSopenharmony_ci    ctx = sws_alloc_context();
134cabdff1aSopenharmony_ci    if (sws_init_context(ctx, NULL, NULL) < 0)
135cabdff1aSopenharmony_ci        fail();
136cabdff1aSopenharmony_ci
137cabdff1aSopenharmony_ci    ctx->flags |= SWS_FULL_CHR_H_INT;
138cabdff1aSopenharmony_ci    ctx->yuv2rgb_y_offset  = rnd();
139cabdff1aSopenharmony_ci    ctx->yuv2rgb_y_coeff   = rnd();
140cabdff1aSopenharmony_ci    ctx->yuv2rgb_v2r_coeff = rnd();
141cabdff1aSopenharmony_ci    ctx->yuv2rgb_v2g_coeff = rnd();
142cabdff1aSopenharmony_ci    ctx->yuv2rgb_u2g_coeff = rnd();
143cabdff1aSopenharmony_ci    ctx->yuv2rgb_u2b_coeff = rnd();
144cabdff1aSopenharmony_ci
145cabdff1aSopenharmony_ci    for (fmi = 0; fmi < FF_ARRAY_ELEMS(planar_fmts); fmi++) {
146cabdff1aSopenharmony_ci        for (fsi = 0; fsi < FILTER_SIZES; fsi++) {
147cabdff1aSopenharmony_ci            for (isi = 0; isi < INPUT_SIZES; isi++ ) {
148cabdff1aSopenharmony_ci                desc = av_pix_fmt_desc_get(planar_fmts[fmi]);
149cabdff1aSopenharmony_ci                ctx->dstFormat = planar_fmts[fmi];
150cabdff1aSopenharmony_ci
151cabdff1aSopenharmony_ci                dstW = input_sizes[isi];
152cabdff1aSopenharmony_ci                luma_filter_size = filter_sizes[fsi];
153cabdff1aSopenharmony_ci                chr_filter_size = filter_sizes[fsi];
154cabdff1aSopenharmony_ci
155cabdff1aSopenharmony_ci                if (desc->comp[0].depth > 16) {
156cabdff1aSopenharmony_ci                    byte_size = 4;
157cabdff1aSopenharmony_ci                } else if (desc->comp[0].depth > 8) {
158cabdff1aSopenharmony_ci                    byte_size = 2;
159cabdff1aSopenharmony_ci                } else {
160cabdff1aSopenharmony_ci                    byte_size = 1;
161cabdff1aSopenharmony_ci                }
162cabdff1aSopenharmony_ci
163cabdff1aSopenharmony_ci                ff_sws_init_scale(ctx);
164cabdff1aSopenharmony_ci                if (check_func(ctx->yuv2anyX, "yuv2%s_full_X_%d_%d", desc->name, luma_filter_size, dstW)) {
165cabdff1aSopenharmony_ci                    for (i = 0; i < 4; i ++) {
166cabdff1aSopenharmony_ci                        memset(dst0[i], 0xFF, LARGEST_INPUT_SIZE * sizeof(int32_t));
167cabdff1aSopenharmony_ci                        memset(dst1[i], 0xFF, LARGEST_INPUT_SIZE * sizeof(int32_t));
168cabdff1aSopenharmony_ci                    }
169cabdff1aSopenharmony_ci
170cabdff1aSopenharmony_ci                    call_ref(ctx, luma_filter, luma, luma_filter_size,
171cabdff1aSopenharmony_ci                             chr_filter, chru, chrv, chr_filter_size,
172cabdff1aSopenharmony_ci                             alpha, dst0, dstW, 0);
173cabdff1aSopenharmony_ci                    call_new(ctx, luma_filter, luma, luma_filter_size,
174cabdff1aSopenharmony_ci                             chr_filter, chru, chrv, chr_filter_size,
175cabdff1aSopenharmony_ci                             alpha, dst1, dstW, 0);
176cabdff1aSopenharmony_ci
177cabdff1aSopenharmony_ci                    if (memcmp(dst0[0], dst1[0], dstW * byte_size) ||
178cabdff1aSopenharmony_ci                        memcmp(dst0[1], dst1[1], dstW * byte_size) ||
179cabdff1aSopenharmony_ci                        memcmp(dst0[2], dst1[2], dstW * byte_size) ||
180cabdff1aSopenharmony_ci                        memcmp(dst0[3], dst1[3], dstW * byte_size) )
181cabdff1aSopenharmony_ci                        fail();
182cabdff1aSopenharmony_ci
183cabdff1aSopenharmony_ci                    bench_new(ctx, luma_filter, luma, luma_filter_size,
184cabdff1aSopenharmony_ci                              chr_filter, chru, chrv, chr_filter_size,
185cabdff1aSopenharmony_ci                              alpha, dst1, dstW, 0);
186cabdff1aSopenharmony_ci                }
187cabdff1aSopenharmony_ci            }
188cabdff1aSopenharmony_ci        }
189cabdff1aSopenharmony_ci    }
190cabdff1aSopenharmony_ci    sws_freeContext(ctx);
191cabdff1aSopenharmony_ci}
192cabdff1aSopenharmony_ci
193cabdff1aSopenharmony_ci#undef LARGEST_INPUT_SIZE
194cabdff1aSopenharmony_ci#undef INPUT_SIZES
195cabdff1aSopenharmony_ci
196cabdff1aSopenharmony_cistatic void check_input_planar_rgb_to_y(void)
197cabdff1aSopenharmony_ci{
198cabdff1aSopenharmony_ci    struct SwsContext *ctx;
199cabdff1aSopenharmony_ci    const AVPixFmtDescriptor *desc;
200cabdff1aSopenharmony_ci    int fmi, isi;
201cabdff1aSopenharmony_ci    int dstW, byte_size;
202cabdff1aSopenharmony_ci#define LARGEST_INPUT_SIZE 512
203cabdff1aSopenharmony_ci#define INPUT_SIZES 6
204cabdff1aSopenharmony_ci    static const int input_sizes[] = {8, 24, 128, 144, 256, 512};
205cabdff1aSopenharmony_ci    uint8_t *src[4];
206cabdff1aSopenharmony_ci    int32_t rgb2yuv[9] = {0};
207cabdff1aSopenharmony_ci
208cabdff1aSopenharmony_ci    declare_func(void, uint8_t *dst, uint8_t *src[4], int w, int32_t *rgb2yuv);
209cabdff1aSopenharmony_ci
210cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int32_t, src_r, [LARGEST_INPUT_SIZE]);
211cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int32_t, src_g, [LARGEST_INPUT_SIZE]);
212cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int32_t, src_b, [LARGEST_INPUT_SIZE]);
213cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int32_t, src_a, [LARGEST_INPUT_SIZE]);
214cabdff1aSopenharmony_ci
215cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(uint8_t, dst0_y, [LARGEST_INPUT_SIZE * sizeof(int32_t)]);
216cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(uint8_t, dst1_y, [LARGEST_INPUT_SIZE * sizeof(int32_t)]);
217cabdff1aSopenharmony_ci
218cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)src_r, LARGEST_INPUT_SIZE * sizeof(int32_t));
219cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)src_g, LARGEST_INPUT_SIZE * sizeof(int32_t));
220cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)src_b, LARGEST_INPUT_SIZE * sizeof(int32_t));
221cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)src_a, LARGEST_INPUT_SIZE * sizeof(int32_t));
222cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)rgb2yuv, 9 * sizeof(int32_t));
223cabdff1aSopenharmony_ci
224cabdff1aSopenharmony_ci    src[0] = (uint8_t*)src_g;
225cabdff1aSopenharmony_ci    src[1] = (uint8_t*)src_b;
226cabdff1aSopenharmony_ci    src[2] = (uint8_t*)src_r;
227cabdff1aSopenharmony_ci    src[3] = (uint8_t*)src_a;
228cabdff1aSopenharmony_ci
229cabdff1aSopenharmony_ci    ctx = sws_alloc_context();
230cabdff1aSopenharmony_ci    if (sws_init_context(ctx, NULL, NULL) < 0)
231cabdff1aSopenharmony_ci        fail();
232cabdff1aSopenharmony_ci
233cabdff1aSopenharmony_ci    for (fmi = 0; fmi < FF_ARRAY_ELEMS(planar_fmts); fmi++) {
234cabdff1aSopenharmony_ci        for (isi = 0; isi < INPUT_SIZES; isi++ ) {
235cabdff1aSopenharmony_ci            desc = av_pix_fmt_desc_get(planar_fmts[fmi]);
236cabdff1aSopenharmony_ci            ctx->srcFormat = planar_fmts[fmi];
237cabdff1aSopenharmony_ci            ctx->dstFormat = AV_PIX_FMT_YUVA444P16;
238cabdff1aSopenharmony_ci            byte_size = 2;
239cabdff1aSopenharmony_ci            dstW = input_sizes[isi];
240cabdff1aSopenharmony_ci
241cabdff1aSopenharmony_ci            ff_sws_init_scale(ctx);
242cabdff1aSopenharmony_ci            if(check_func(ctx->readLumPlanar, "planar_%s_to_y_%d",  desc->name, dstW)) {
243cabdff1aSopenharmony_ci                memset(dst0_y, 0xFF, LARGEST_INPUT_SIZE * sizeof(int32_t));
244cabdff1aSopenharmony_ci                memset(dst1_y, 0xFF, LARGEST_INPUT_SIZE * sizeof(int32_t));
245cabdff1aSopenharmony_ci
246cabdff1aSopenharmony_ci                call_ref(dst0_y, src, dstW, rgb2yuv);
247cabdff1aSopenharmony_ci                call_new(dst1_y, src, dstW, rgb2yuv);
248cabdff1aSopenharmony_ci
249cabdff1aSopenharmony_ci                if (memcmp(dst0_y, dst1_y, dstW * byte_size))
250cabdff1aSopenharmony_ci                    fail();
251cabdff1aSopenharmony_ci
252cabdff1aSopenharmony_ci                bench_new(dst1_y, src, dstW, rgb2yuv);
253cabdff1aSopenharmony_ci
254cabdff1aSopenharmony_ci            }
255cabdff1aSopenharmony_ci        }
256cabdff1aSopenharmony_ci    }
257cabdff1aSopenharmony_ci    sws_freeContext(ctx);
258cabdff1aSopenharmony_ci}
259cabdff1aSopenharmony_ci
260cabdff1aSopenharmony_ci#undef LARGEST_INPUT_SIZE
261cabdff1aSopenharmony_ci#undef INPUT_SIZES
262cabdff1aSopenharmony_ci
263cabdff1aSopenharmony_cistatic void check_input_planar_rgb_to_uv(void)
264cabdff1aSopenharmony_ci{
265cabdff1aSopenharmony_ci    struct SwsContext *ctx;
266cabdff1aSopenharmony_ci    const AVPixFmtDescriptor *desc;
267cabdff1aSopenharmony_ci    int fmi, isi;
268cabdff1aSopenharmony_ci    int dstW, byte_size;
269cabdff1aSopenharmony_ci#define LARGEST_INPUT_SIZE 512
270cabdff1aSopenharmony_ci#define INPUT_SIZES 6
271cabdff1aSopenharmony_ci    static const int input_sizes[] = {8, 24, 128, 144, 256, 512};
272cabdff1aSopenharmony_ci    uint8_t *src[4];
273cabdff1aSopenharmony_ci    int32_t rgb2yuv[9] = {0};
274cabdff1aSopenharmony_ci
275cabdff1aSopenharmony_ci    declare_func(void, uint8_t *dstU, uint8_t *dstV,
276cabdff1aSopenharmony_ci                       uint8_t *src[4], int w, int32_t *rgb2yuv);
277cabdff1aSopenharmony_ci
278cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int32_t, src_r, [LARGEST_INPUT_SIZE]);
279cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int32_t, src_g, [LARGEST_INPUT_SIZE]);
280cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int32_t, src_b, [LARGEST_INPUT_SIZE]);
281cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int32_t, src_a, [LARGEST_INPUT_SIZE]);
282cabdff1aSopenharmony_ci
283cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(uint8_t, dst0_u, [LARGEST_INPUT_SIZE * sizeof(int32_t)]);
284cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(uint8_t, dst0_v, [LARGEST_INPUT_SIZE * sizeof(int32_t)]);
285cabdff1aSopenharmony_ci
286cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(uint8_t, dst1_u, [LARGEST_INPUT_SIZE * sizeof(int32_t)]);
287cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(uint8_t, dst1_v, [LARGEST_INPUT_SIZE * sizeof(int32_t)]);
288cabdff1aSopenharmony_ci
289cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)src_r, LARGEST_INPUT_SIZE * sizeof(int32_t));
290cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)src_g, LARGEST_INPUT_SIZE * sizeof(int32_t));
291cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)src_b, LARGEST_INPUT_SIZE * sizeof(int32_t));
292cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)src_a, LARGEST_INPUT_SIZE * sizeof(int32_t));
293cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)rgb2yuv, 9 * sizeof(int32_t));
294cabdff1aSopenharmony_ci
295cabdff1aSopenharmony_ci    src[0] = (uint8_t*)src_g;
296cabdff1aSopenharmony_ci    src[1] = (uint8_t*)src_b;
297cabdff1aSopenharmony_ci    src[2] = (uint8_t*)src_r;
298cabdff1aSopenharmony_ci    src[3] = (uint8_t*)src_a;
299cabdff1aSopenharmony_ci
300cabdff1aSopenharmony_ci    ctx = sws_alloc_context();
301cabdff1aSopenharmony_ci    if (sws_init_context(ctx, NULL, NULL) < 0)
302cabdff1aSopenharmony_ci        fail();
303cabdff1aSopenharmony_ci
304cabdff1aSopenharmony_ci    for (fmi = 0; fmi < FF_ARRAY_ELEMS(planar_fmts); fmi++) {
305cabdff1aSopenharmony_ci        for (isi = 0; isi < INPUT_SIZES; isi++ ) {
306cabdff1aSopenharmony_ci            desc = av_pix_fmt_desc_get(planar_fmts[fmi]);
307cabdff1aSopenharmony_ci            ctx->srcFormat = planar_fmts[fmi];
308cabdff1aSopenharmony_ci            ctx->dstFormat = AV_PIX_FMT_YUVA444P16;
309cabdff1aSopenharmony_ci            byte_size = 2;
310cabdff1aSopenharmony_ci            dstW = input_sizes[isi];
311cabdff1aSopenharmony_ci
312cabdff1aSopenharmony_ci            ff_sws_init_scale(ctx);
313cabdff1aSopenharmony_ci            if(check_func(ctx->readChrPlanar, "planar_%s_to_uv_%d",  desc->name, dstW)) {
314cabdff1aSopenharmony_ci                memset(dst0_u, 0xFF, LARGEST_INPUT_SIZE * sizeof(int32_t));
315cabdff1aSopenharmony_ci                memset(dst0_v, 0xFF, LARGEST_INPUT_SIZE * sizeof(int32_t));
316cabdff1aSopenharmony_ci                memset(dst1_u, 0xFF, LARGEST_INPUT_SIZE * sizeof(int32_t));
317cabdff1aSopenharmony_ci                memset(dst1_v, 0xFF, LARGEST_INPUT_SIZE * sizeof(int32_t));
318cabdff1aSopenharmony_ci
319cabdff1aSopenharmony_ci                call_ref(dst0_u, dst0_v, src, dstW, rgb2yuv);
320cabdff1aSopenharmony_ci                call_new(dst1_u, dst1_v, src, dstW, rgb2yuv);
321cabdff1aSopenharmony_ci
322cabdff1aSopenharmony_ci                if (memcmp(dst0_u, dst1_u, dstW * byte_size) ||
323cabdff1aSopenharmony_ci                    memcmp(dst0_v, dst1_v, dstW * byte_size))
324cabdff1aSopenharmony_ci                    fail();
325cabdff1aSopenharmony_ci
326cabdff1aSopenharmony_ci                bench_new(dst1_u, dst1_v, src, dstW, rgb2yuv);
327cabdff1aSopenharmony_ci            }
328cabdff1aSopenharmony_ci        }
329cabdff1aSopenharmony_ci    }
330cabdff1aSopenharmony_ci    sws_freeContext(ctx);
331cabdff1aSopenharmony_ci}
332cabdff1aSopenharmony_ci
333cabdff1aSopenharmony_ci#undef LARGEST_INPUT_SIZE
334cabdff1aSopenharmony_ci#undef INPUT_SIZES
335cabdff1aSopenharmony_ci
336cabdff1aSopenharmony_cistatic void check_input_planar_rgb_to_a(void)
337cabdff1aSopenharmony_ci{
338cabdff1aSopenharmony_ci    struct SwsContext *ctx;
339cabdff1aSopenharmony_ci    const AVPixFmtDescriptor *desc;
340cabdff1aSopenharmony_ci    int fmi, isi;
341cabdff1aSopenharmony_ci    int dstW, byte_size;
342cabdff1aSopenharmony_ci#define LARGEST_INPUT_SIZE 512
343cabdff1aSopenharmony_ci#define INPUT_SIZES 6
344cabdff1aSopenharmony_ci    static const int input_sizes[] = {8, 24, 128, 144, 256, 512};
345cabdff1aSopenharmony_ci    uint8_t *src[4];
346cabdff1aSopenharmony_ci    int32_t rgb2yuv[9] = {0};
347cabdff1aSopenharmony_ci
348cabdff1aSopenharmony_ci    declare_func(void, uint8_t *dst, uint8_t *src[4], int w, int32_t *rgb2yuv);
349cabdff1aSopenharmony_ci
350cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int32_t, src_r, [LARGEST_INPUT_SIZE]);
351cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int32_t, src_g, [LARGEST_INPUT_SIZE]);
352cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int32_t, src_b, [LARGEST_INPUT_SIZE]);
353cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(int32_t, src_a, [LARGEST_INPUT_SIZE]);
354cabdff1aSopenharmony_ci
355cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(uint8_t, dst0_a, [LARGEST_INPUT_SIZE * sizeof(int32_t)]);
356cabdff1aSopenharmony_ci    LOCAL_ALIGNED_8(uint8_t, dst1_a, [LARGEST_INPUT_SIZE * sizeof(int32_t)]);
357cabdff1aSopenharmony_ci
358cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)src_r, LARGEST_INPUT_SIZE * sizeof(int32_t));
359cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)src_g, LARGEST_INPUT_SIZE * sizeof(int32_t));
360cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)src_b, LARGEST_INPUT_SIZE * sizeof(int32_t));
361cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)src_a, LARGEST_INPUT_SIZE * sizeof(int32_t));
362cabdff1aSopenharmony_ci    randomize_buffers((uint8_t*)rgb2yuv, 9 * sizeof(int32_t));
363cabdff1aSopenharmony_ci
364cabdff1aSopenharmony_ci    src[0] = (uint8_t*)src_g;
365cabdff1aSopenharmony_ci    src[1] = (uint8_t*)src_b;
366cabdff1aSopenharmony_ci    src[2] = (uint8_t*)src_r;
367cabdff1aSopenharmony_ci    src[3] = (uint8_t*)src_a;
368cabdff1aSopenharmony_ci
369cabdff1aSopenharmony_ci    ctx = sws_alloc_context();
370cabdff1aSopenharmony_ci    if (sws_init_context(ctx, NULL, NULL) < 0)
371cabdff1aSopenharmony_ci        fail();
372cabdff1aSopenharmony_ci
373cabdff1aSopenharmony_ci    for (fmi = 0; fmi < FF_ARRAY_ELEMS(planar_fmts); fmi++) {
374cabdff1aSopenharmony_ci        for (isi = 0; isi < INPUT_SIZES; isi++ ) {
375cabdff1aSopenharmony_ci            desc = av_pix_fmt_desc_get(planar_fmts[fmi]);
376cabdff1aSopenharmony_ci            if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
377cabdff1aSopenharmony_ci                continue;
378cabdff1aSopenharmony_ci
379cabdff1aSopenharmony_ci            ctx->srcFormat = planar_fmts[fmi];
380cabdff1aSopenharmony_ci            ctx->dstFormat = AV_PIX_FMT_YUVA444P16;
381cabdff1aSopenharmony_ci            byte_size = 2;
382cabdff1aSopenharmony_ci            dstW = input_sizes[isi];
383cabdff1aSopenharmony_ci
384cabdff1aSopenharmony_ci            ff_sws_init_scale(ctx);
385cabdff1aSopenharmony_ci            if(check_func(ctx->readAlpPlanar, "planar_%s_to_a_%d",  desc->name, dstW)) {
386cabdff1aSopenharmony_ci                memset(dst0_a, 0x00, LARGEST_INPUT_SIZE * sizeof(int32_t));
387cabdff1aSopenharmony_ci                memset(dst1_a, 0x00, LARGEST_INPUT_SIZE * sizeof(int32_t));
388cabdff1aSopenharmony_ci
389cabdff1aSopenharmony_ci                call_ref(dst0_a, src, dstW, rgb2yuv);
390cabdff1aSopenharmony_ci                call_new(dst1_a, src, dstW, rgb2yuv);
391cabdff1aSopenharmony_ci
392cabdff1aSopenharmony_ci                if (memcmp(dst0_a, dst1_a, dstW * byte_size))
393cabdff1aSopenharmony_ci                    fail();
394cabdff1aSopenharmony_ci                bench_new(dst1_a, src, dstW, rgb2yuv);
395cabdff1aSopenharmony_ci            }
396cabdff1aSopenharmony_ci        }
397cabdff1aSopenharmony_ci    }
398cabdff1aSopenharmony_ci    sws_freeContext(ctx);
399cabdff1aSopenharmony_ci}
400cabdff1aSopenharmony_ci
401cabdff1aSopenharmony_civoid checkasm_check_sw_gbrp(void)
402cabdff1aSopenharmony_ci{
403cabdff1aSopenharmony_ci    check_output_yuv2gbrp();
404cabdff1aSopenharmony_ci    report("output_yuv2gbrp");
405cabdff1aSopenharmony_ci
406cabdff1aSopenharmony_ci    check_input_planar_rgb_to_y();
407cabdff1aSopenharmony_ci    report("input_planar_rgb_y");
408cabdff1aSopenharmony_ci
409cabdff1aSopenharmony_ci    check_input_planar_rgb_to_uv();
410cabdff1aSopenharmony_ci    report("input_planar_rgb_uv");
411cabdff1aSopenharmony_ci
412cabdff1aSopenharmony_ci    check_input_planar_rgb_to_a();
413cabdff1aSopenharmony_ci    report("input_planar_rgb_a");
414cabdff1aSopenharmony_ci}
415