1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or modify 5cabdff1aSopenharmony_ci * it under the terms of the GNU General Public License as published by 6cabdff1aSopenharmony_ci * the Free Software Foundation; either version 2 of the License, or 7cabdff1aSopenharmony_ci * (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12cabdff1aSopenharmony_ci * GNU General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU General Public License along 15cabdff1aSopenharmony_ci * with FFmpeg; if not, write to the Free Software Foundation, Inc., 16cabdff1aSopenharmony_ci * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci#include "libavcodec/sbrdsp.h" 22cabdff1aSopenharmony_ci#include <float.h> 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#include "checkasm.h" 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#define randomize(buf, len) do { \ 27cabdff1aSopenharmony_ci int i; \ 28cabdff1aSopenharmony_ci for (i = 0; i < len; i++) { \ 29cabdff1aSopenharmony_ci const INTFLOAT f = (INTFLOAT)rnd() / UINT_MAX; \ 30cabdff1aSopenharmony_ci (buf)[i] = f; \ 31cabdff1aSopenharmony_ci } \ 32cabdff1aSopenharmony_ci} while (0) 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_ci#define EPS 0.0001 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_cistatic void test_sum64x5(void) 37cabdff1aSopenharmony_ci{ 38cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst0, [64 + 256]); 39cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst1, [64 + 256]); 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci declare_func(void, INTFLOAT *z); 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ci randomize((INTFLOAT *)dst0, 64 + 256); 44cabdff1aSopenharmony_ci memcpy(dst1, dst0, (64 + 256) * sizeof(INTFLOAT)); 45cabdff1aSopenharmony_ci call_ref(dst0); 46cabdff1aSopenharmony_ci call_new(dst1); 47cabdff1aSopenharmony_ci if (!float_near_abs_eps_array(dst0, dst1, EPS, 64 + 256)) 48cabdff1aSopenharmony_ci fail(); 49cabdff1aSopenharmony_ci bench_new(dst1); 50cabdff1aSopenharmony_ci} 51cabdff1aSopenharmony_ci 52cabdff1aSopenharmony_cistatic void test_sum_square(void) 53cabdff1aSopenharmony_ci{ 54cabdff1aSopenharmony_ci INTFLOAT res0; 55cabdff1aSopenharmony_ci INTFLOAT res1; 56cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, src, [256], [2]); 57cabdff1aSopenharmony_ci double t = 4 * 256; 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_ci declare_func_float(INTFLOAT, INTFLOAT (*x)[2], int n); 60cabdff1aSopenharmony_ci 61cabdff1aSopenharmony_ci randomize((INTFLOAT *)src, 256 * 2); 62cabdff1aSopenharmony_ci res0 = call_ref(src, 256); 63cabdff1aSopenharmony_ci res1 = call_new(src, 256); 64cabdff1aSopenharmony_ci if (!float_near_abs_eps(res0, res1, t * 2 * FLT_EPSILON)) 65cabdff1aSopenharmony_ci fail(); 66cabdff1aSopenharmony_ci bench_new(src, 256); 67cabdff1aSopenharmony_ci} 68cabdff1aSopenharmony_ci 69cabdff1aSopenharmony_cistatic void test_neg_odd_64(void) 70cabdff1aSopenharmony_ci{ 71cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst0, [64]); 72cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst1, [64]); 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci declare_func(void, INTFLOAT *x); 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_ci randomize((INTFLOAT *)dst0, 64); 77cabdff1aSopenharmony_ci memcpy(dst1, dst0, (64) * sizeof(INTFLOAT)); 78cabdff1aSopenharmony_ci call_ref(dst0); 79cabdff1aSopenharmony_ci call_new(dst1); 80cabdff1aSopenharmony_ci if (!float_near_abs_eps_array(dst0, dst1, EPS, 64)) 81cabdff1aSopenharmony_ci fail(); 82cabdff1aSopenharmony_ci bench_new(dst1); 83cabdff1aSopenharmony_ci} 84cabdff1aSopenharmony_ci 85cabdff1aSopenharmony_cistatic void test_qmf_pre_shuffle(void) 86cabdff1aSopenharmony_ci{ 87cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst0, [128]); 88cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst1, [128]); 89cabdff1aSopenharmony_ci 90cabdff1aSopenharmony_ci declare_func(void, INTFLOAT *z); 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_ci randomize((INTFLOAT *)dst0, 128); 93cabdff1aSopenharmony_ci memcpy(dst1, dst0, (128) * sizeof(INTFLOAT)); 94cabdff1aSopenharmony_ci call_ref(dst0); 95cabdff1aSopenharmony_ci call_new(dst1); 96cabdff1aSopenharmony_ci if (!float_near_abs_eps_array(dst0, dst1, EPS, 128)) 97cabdff1aSopenharmony_ci fail(); 98cabdff1aSopenharmony_ci bench_new(dst1); 99cabdff1aSopenharmony_ci} 100cabdff1aSopenharmony_ci 101cabdff1aSopenharmony_cistatic void test_qmf_post_shuffle(void) 102cabdff1aSopenharmony_ci{ 103cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, src, [64]); 104cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst0, [32], [2]); 105cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst1, [32], [2]); 106cabdff1aSopenharmony_ci 107cabdff1aSopenharmony_ci declare_func(void, INTFLOAT W[32][2], const INTFLOAT *z); 108cabdff1aSopenharmony_ci 109cabdff1aSopenharmony_ci randomize((INTFLOAT *)src, 64); 110cabdff1aSopenharmony_ci call_ref(dst0, src); 111cabdff1aSopenharmony_ci call_new(dst1, src); 112cabdff1aSopenharmony_ci if (!float_near_abs_eps_array((INTFLOAT *)dst0, (INTFLOAT *)dst1, EPS, 64)) 113cabdff1aSopenharmony_ci fail(); 114cabdff1aSopenharmony_ci bench_new(dst1, src); 115cabdff1aSopenharmony_ci} 116cabdff1aSopenharmony_ci 117cabdff1aSopenharmony_cistatic void test_qmf_deint_neg(void) 118cabdff1aSopenharmony_ci{ 119cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, src, [64]); 120cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst0, [64]); 121cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst1, [64]); 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_ci declare_func(void, INTFLOAT *v, const INTFLOAT *src); 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_ci randomize((INTFLOAT *)src, 64); 126cabdff1aSopenharmony_ci call_ref(dst0, src); 127cabdff1aSopenharmony_ci call_new(dst1, src); 128cabdff1aSopenharmony_ci if (!float_near_abs_eps_array(dst0, dst1, EPS, 64)) 129cabdff1aSopenharmony_ci fail(); 130cabdff1aSopenharmony_ci bench_new(dst1, src); 131cabdff1aSopenharmony_ci} 132cabdff1aSopenharmony_ci 133cabdff1aSopenharmony_cistatic void test_qmf_deint_bfly(void) 134cabdff1aSopenharmony_ci{ 135cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, src0, [64]); 136cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, src1, [64]); 137cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst0, [128]); 138cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst1, [128]); 139cabdff1aSopenharmony_ci 140cabdff1aSopenharmony_ci declare_func(void, INTFLOAT *v, const INTFLOAT *src0, const INTFLOAT *src1); 141cabdff1aSopenharmony_ci 142cabdff1aSopenharmony_ci memset(dst0, 0, 128 * sizeof(INTFLOAT)); 143cabdff1aSopenharmony_ci memset(dst1, 0, 128 * sizeof(INTFLOAT)); 144cabdff1aSopenharmony_ci 145cabdff1aSopenharmony_ci randomize((INTFLOAT *)src0, 64); 146cabdff1aSopenharmony_ci randomize((INTFLOAT *)src1, 64); 147cabdff1aSopenharmony_ci call_ref(dst0, src0, src1); 148cabdff1aSopenharmony_ci call_new(dst1, src0, src1); 149cabdff1aSopenharmony_ci if (!float_near_abs_eps_array(dst0, dst1, EPS, 128)) 150cabdff1aSopenharmony_ci fail(); 151cabdff1aSopenharmony_ci bench_new(dst1, src0, src1); 152cabdff1aSopenharmony_ci} 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_cistatic void test_autocorrelate(void) 155cabdff1aSopenharmony_ci{ 156cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, src, [40], [2]); 157cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst0, [3], [2][2]); 158cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst1, [3], [2][2]); 159cabdff1aSopenharmony_ci 160cabdff1aSopenharmony_ci declare_func(void, const INTFLOAT x[40][2], INTFLOAT phi[3][2][2]); 161cabdff1aSopenharmony_ci 162cabdff1aSopenharmony_ci memset(dst0, 0, 3 * 2 * 2 * sizeof(INTFLOAT)); 163cabdff1aSopenharmony_ci memset(dst1, 0, 3 * 2 * 2 * sizeof(INTFLOAT)); 164cabdff1aSopenharmony_ci 165cabdff1aSopenharmony_ci randomize((INTFLOAT *)src, 80); 166cabdff1aSopenharmony_ci call_ref(src, dst0); 167cabdff1aSopenharmony_ci call_new(src, dst1); 168cabdff1aSopenharmony_ci if (!float_near_abs_eps_array((INTFLOAT *)dst0, (INTFLOAT *)dst1, EPS, 3 * 2 * 2)) 169cabdff1aSopenharmony_ci fail(); 170cabdff1aSopenharmony_ci bench_new(src, dst1); 171cabdff1aSopenharmony_ci} 172cabdff1aSopenharmony_ci 173cabdff1aSopenharmony_cistatic void test_hf_gen(void) 174cabdff1aSopenharmony_ci{ 175cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, low, [128], [2]); 176cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, alpha0, [2]); 177cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, alpha1, [2]); 178cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst0, [128], [2]); 179cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst1, [128], [2]); 180cabdff1aSopenharmony_ci INTFLOAT bw = (INTFLOAT)rnd() / UINT_MAX; 181cabdff1aSopenharmony_ci int i; 182cabdff1aSopenharmony_ci 183cabdff1aSopenharmony_ci declare_func(void, INTFLOAT (*X_high)[2], const INTFLOAT (*X_low)[2], 184cabdff1aSopenharmony_ci const INTFLOAT alpha0[2], const INTFLOAT alpha1[2], 185cabdff1aSopenharmony_ci INTFLOAT bw, int start, int end); 186cabdff1aSopenharmony_ci 187cabdff1aSopenharmony_ci randomize((INTFLOAT *)low, 128 * 2); 188cabdff1aSopenharmony_ci randomize((INTFLOAT *)alpha0, 2); 189cabdff1aSopenharmony_ci randomize((INTFLOAT *)alpha1, 2); 190cabdff1aSopenharmony_ci for (i = 2; i < 64; i += 2) { 191cabdff1aSopenharmony_ci memset(dst0, 0, 128 * 2 * sizeof(INTFLOAT)); 192cabdff1aSopenharmony_ci memset(dst1, 0, 128 * 2 * sizeof(INTFLOAT)); 193cabdff1aSopenharmony_ci call_ref(dst0, low, alpha0, alpha1, 0.0, i, 128); 194cabdff1aSopenharmony_ci call_new(dst1, low, alpha0, alpha1, 0.0, i, 128); 195cabdff1aSopenharmony_ci if (!float_near_abs_eps_array((INTFLOAT *)dst0, (INTFLOAT *)dst1, EPS, 128 * 2)) 196cabdff1aSopenharmony_ci fail(); 197cabdff1aSopenharmony_ci bench_new(dst1, low, alpha0, alpha1, bw, i, 128); 198cabdff1aSopenharmony_ci } 199cabdff1aSopenharmony_ci} 200cabdff1aSopenharmony_ci 201cabdff1aSopenharmony_cistatic void test_hf_g_filt(void) 202cabdff1aSopenharmony_ci{ 203cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, high, [128], [40][2]); 204cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, g_filt, [128]); 205cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst0, [128], [2]); 206cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst1, [128], [2]); 207cabdff1aSopenharmony_ci 208cabdff1aSopenharmony_ci declare_func(void, INTFLOAT (*Y)[2], const INTFLOAT (*X_high)[40][2], 209cabdff1aSopenharmony_ci const INTFLOAT *g_filt, int m_max, intptr_t ixh); 210cabdff1aSopenharmony_ci 211cabdff1aSopenharmony_ci randomize((INTFLOAT *)high, 128 * 40 * 2); 212cabdff1aSopenharmony_ci randomize((INTFLOAT *)g_filt, 128); 213cabdff1aSopenharmony_ci 214cabdff1aSopenharmony_ci call_ref(dst0, high, g_filt, 128, 20); 215cabdff1aSopenharmony_ci call_new(dst1, high, g_filt, 128, 20); 216cabdff1aSopenharmony_ci if (!float_near_abs_eps_array((INTFLOAT *)dst0, (INTFLOAT *)dst1, EPS, 128 * 2)) 217cabdff1aSopenharmony_ci fail(); 218cabdff1aSopenharmony_ci bench_new(dst1, high, g_filt, 128, 20); 219cabdff1aSopenharmony_ci} 220cabdff1aSopenharmony_ci 221cabdff1aSopenharmony_cistatic void test_hf_apply_noise(const SBRDSPContext *sbrdsp) 222cabdff1aSopenharmony_ci{ 223cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(AAC_FLOAT, s_m, [128]); 224cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(AAC_FLOAT, q_filt, [128]); 225cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, ref, [128], [2]); 226cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst0, [128], [2]); 227cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(INTFLOAT, dst1, [128], [2]); 228cabdff1aSopenharmony_ci int noise = 0x2a; 229cabdff1aSopenharmony_ci int i, j; 230cabdff1aSopenharmony_ci 231cabdff1aSopenharmony_ci declare_func(void, INTFLOAT (*Y)[2], const AAC_FLOAT *s_m, 232cabdff1aSopenharmony_ci const AAC_FLOAT *q_filt, int noise, 233cabdff1aSopenharmony_ci int kx, int m_max); 234cabdff1aSopenharmony_ci 235cabdff1aSopenharmony_ci randomize((INTFLOAT *)ref, 128 * 2); 236cabdff1aSopenharmony_ci randomize((INTFLOAT *)s_m, 128); 237cabdff1aSopenharmony_ci randomize((INTFLOAT *)q_filt, 128); 238cabdff1aSopenharmony_ci 239cabdff1aSopenharmony_ci for (i = 0; i < 4; i++) { 240cabdff1aSopenharmony_ci if (check_func(sbrdsp->hf_apply_noise[i], "hf_apply_noise_%d", i)) { 241cabdff1aSopenharmony_ci for (j = 0; j < 2; j++) { 242cabdff1aSopenharmony_ci memcpy(dst0, ref, 128 * 2 * sizeof(INTFLOAT)); 243cabdff1aSopenharmony_ci memcpy(dst1, ref, 128 * 2 * sizeof(INTFLOAT)); 244cabdff1aSopenharmony_ci call_ref(dst0, s_m, q_filt, noise, j, 128); 245cabdff1aSopenharmony_ci call_new(dst1, s_m, q_filt, noise, j, 128); 246cabdff1aSopenharmony_ci if (!float_near_abs_eps_array((INTFLOAT *)dst0, (INTFLOAT *)dst1, EPS, 128 * 2)) 247cabdff1aSopenharmony_ci fail(); 248cabdff1aSopenharmony_ci bench_new(dst1, s_m, q_filt, noise, j, 128); 249cabdff1aSopenharmony_ci } 250cabdff1aSopenharmony_ci } 251cabdff1aSopenharmony_ci } 252cabdff1aSopenharmony_ci} 253cabdff1aSopenharmony_ci 254cabdff1aSopenharmony_civoid checkasm_check_sbrdsp(void) 255cabdff1aSopenharmony_ci{ 256cabdff1aSopenharmony_ci SBRDSPContext sbrdsp; 257cabdff1aSopenharmony_ci 258cabdff1aSopenharmony_ci ff_sbrdsp_init(&sbrdsp); 259cabdff1aSopenharmony_ci 260cabdff1aSopenharmony_ci if (check_func(sbrdsp.sum64x5, "sum64x5")) 261cabdff1aSopenharmony_ci test_sum64x5(); 262cabdff1aSopenharmony_ci report("sum64x5"); 263cabdff1aSopenharmony_ci 264cabdff1aSopenharmony_ci if (check_func(sbrdsp.sum_square, "sum_square")) 265cabdff1aSopenharmony_ci test_sum_square(); 266cabdff1aSopenharmony_ci report("sum_square"); 267cabdff1aSopenharmony_ci 268cabdff1aSopenharmony_ci if (check_func(sbrdsp.neg_odd_64, "neg_odd_64")) 269cabdff1aSopenharmony_ci test_neg_odd_64(); 270cabdff1aSopenharmony_ci report("neg_odd_64"); 271cabdff1aSopenharmony_ci 272cabdff1aSopenharmony_ci if (check_func(sbrdsp.qmf_pre_shuffle, "qmf_pre_shuffle")) 273cabdff1aSopenharmony_ci test_qmf_pre_shuffle(); 274cabdff1aSopenharmony_ci report("qmf_pre_shuffle"); 275cabdff1aSopenharmony_ci 276cabdff1aSopenharmony_ci if (check_func(sbrdsp.qmf_post_shuffle, "qmf_post_shuffle")) 277cabdff1aSopenharmony_ci test_qmf_post_shuffle(); 278cabdff1aSopenharmony_ci report("qmf_post_shuffle"); 279cabdff1aSopenharmony_ci 280cabdff1aSopenharmony_ci if (check_func(sbrdsp.qmf_deint_neg, "qmf_deint_neg")) 281cabdff1aSopenharmony_ci test_qmf_deint_neg(); 282cabdff1aSopenharmony_ci report("qmf_deint_neg"); 283cabdff1aSopenharmony_ci 284cabdff1aSopenharmony_ci if (check_func(sbrdsp.qmf_deint_bfly, "qmf_deint_bfly")) 285cabdff1aSopenharmony_ci test_qmf_deint_bfly(); 286cabdff1aSopenharmony_ci report("qmf_deint_bfly"); 287cabdff1aSopenharmony_ci 288cabdff1aSopenharmony_ci if (check_func(sbrdsp.autocorrelate, "autocorrelate")) 289cabdff1aSopenharmony_ci test_autocorrelate(); 290cabdff1aSopenharmony_ci report("autocorrelate"); 291cabdff1aSopenharmony_ci 292cabdff1aSopenharmony_ci if (check_func(sbrdsp.hf_gen, "hf_gen")) 293cabdff1aSopenharmony_ci test_hf_gen(); 294cabdff1aSopenharmony_ci report("hf_gen"); 295cabdff1aSopenharmony_ci 296cabdff1aSopenharmony_ci if (check_func(sbrdsp.hf_g_filt, "hf_g_filt")) 297cabdff1aSopenharmony_ci test_hf_g_filt(); 298cabdff1aSopenharmony_ci report("hf_g_filt"); 299cabdff1aSopenharmony_ci 300cabdff1aSopenharmony_ci test_hf_apply_noise(&sbrdsp); 301cabdff1aSopenharmony_ci report("hf_apply_noise"); 302cabdff1aSopenharmony_ci} 303