2 * This file is part of FFmpeg.
4 * FFmpeg is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 #include "libavutil/mem_internal.h"
21 #include "libavcodec/opus/dsp.h"
22 #include "libavcodec/opus/tab.h"
26 #define randomize_float(buf, len) \
28 for (int i = 0; i < len; i++) { \
29 float f = (float)rnd() / (UINT_MAX >> 5) - 16.0f; \
35 #define MAX_SIZE (960)
37 /* period is between 15 and 1022, inclusive */
38 static void test_postfilter(int period
)
40 LOCAL_ALIGNED(16, float, data0
, [MAX_SIZE
+ 1024]);
41 LOCAL_ALIGNED(16, float, data1
, [MAX_SIZE
+ 1024]);
43 /* This filter can explode very easily, so use a tapset from the codec.
44 * In the codec these are usually multiplied by at least 0.09375f,
45 * so its outside the largest filter value, but the filter is still stable
47 float gains
[3] = { 0.3066406250f
, 0.2170410156f
, 0.1296386719f
};
49 /* The codec will always call with an offset which is aligned once
50 * (period + 2) is subtracted, but here we have to align it ourselves. */
51 int offset
= FFALIGN(period
+ 2, 4);
53 declare_func(void, float *data
, int period
, float *gains
, int len
);
55 randomize_float(data0
, MAX_SIZE
+ 1024);
56 memcpy(data1
, data0
, (MAX_SIZE
+ 1024)*sizeof(float));
58 call_ref(data0
+ offset
, period
, gains
, MAX_SIZE
);
59 call_new(data1
+ offset
, period
, gains
, MAX_SIZE
);
61 if (!float_near_abs_eps_array(data0
+ offset
, data1
+ offset
, EPS
, MAX_SIZE
))
63 bench_new(data1
+ offset
, period
, gains
, MAX_SIZE
);
66 static void test_deemphasis(void)
68 LOCAL_ALIGNED(16, float, src
, [FFALIGN(MAX_SIZE
, 4)]);
69 LOCAL_ALIGNED(16, float, dst0
, [FFALIGN(MAX_SIZE
, 4)]);
70 LOCAL_ALIGNED(16, float, dst1
, [FFALIGN(MAX_SIZE
, 4)]);
71 float coeff0
= (float)rnd() / (UINT_MAX
>> 5) - 16.0f
, coeff1
= coeff0
;
73 declare_func_float(float, float *out
, float *in
, float coeff
, const float *weights
, int len
);
75 randomize_float(src
, MAX_SIZE
);
77 coeff0
= call_ref(dst0
, src
, coeff0
, ff_opus_deemph_weights
, MAX_SIZE
);
78 coeff1
= call_new(dst1
, src
, coeff1
, ff_opus_deemph_weights
, MAX_SIZE
);
80 if (!float_near_abs_eps(coeff0
, coeff1
, EPS
) ||
81 !float_near_abs_eps_array(dst0
, dst1
, EPS
, MAX_SIZE
))
83 bench_new(dst1
, src
, coeff1
, ff_opus_deemph_weights
, MAX_SIZE
);
86 void checkasm_check_opusdsp(void)
89 ff_opus_dsp_init(&ctx
);
91 if (check_func(ctx
.postfilter
, "postfilter_15"))
93 report("postfilter_15");
95 if (check_func(ctx
.postfilter
, "postfilter_512"))
97 report("postfilter_512");
99 if (check_func(ctx
.postfilter
, "postfilter_1022"))
100 test_postfilter(1022);
101 report("postfilter_1022");
103 if (check_func(ctx
.deemphasis
, "deemphasis"))
105 report("deemphasis");