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