FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/tests/checkasm/opusdsp.c
Date: 2024-11-20 23:03:26
Exec Total Coverage
Lines: 41 43 95.3%
Functions: 3 3 100.0%
Branches: 17 34 50.0%

Line Branch Exec Source
1 /*
2 * This file is part of FFmpeg.
3 *
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.
8 *
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.
13 *
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.
17 */
18
19 #include "libavutil/mem_internal.h"
20
21 #include "libavcodec/opus/dsp.h"
22 #include "libavcodec/opus/tab.h"
23
24 #include "checkasm.h"
25
26 #define randomize_float(buf, len) \
27 do { \
28 for (int i = 0; i < len; i++) { \
29 float f = (float)rnd() / (UINT_MAX >> 5) - 16.0f; \
30 buf[i] = f; \
31 } \
32 } while (0)
33
34 #define EPS 0.005
35 #define MAX_SIZE (960)
36
37 /* period is between 15 and 1022, inclusive */
38 6 static void test_postfilter(int period)
39 {
40 6 LOCAL_ALIGNED(16, float, data0, [MAX_SIZE + 1024]);
41 6 LOCAL_ALIGNED(16, float, data1, [MAX_SIZE + 1024]);
42
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
46 * so use it. */
47 6 float gains[3] = { 0.3066406250f, 0.2170410156f, 0.1296386719f };
48
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 outselves. */
51 6 int offset = FFALIGN(period + 2, 4);
52
53 6 declare_func(void, float *data, int period, float *gains, int len);
54
55
2/2
✓ Branch 1 taken 11904 times.
✓ Branch 2 taken 6 times.
11910 randomize_float(data0, MAX_SIZE + 1024);
56 6 memcpy(data1, data0, (MAX_SIZE + 1024)*sizeof(float));
57
58 6 call_ref(data0 + offset, period, gains, MAX_SIZE);
59 6 call_new(data1 + offset, period, gains, MAX_SIZE);
60
61
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if (!float_near_abs_eps_array(data0 + offset, data1 + offset, EPS, MAX_SIZE))
62 fail();
63
1/8
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
6 bench_new(data1 + offset, period, gains, MAX_SIZE);
64 6 }
65
66 2 static void test_deemphasis(void)
67 {
68 2 LOCAL_ALIGNED(16, float, src, [FFALIGN(MAX_SIZE, 4)]);
69 2 LOCAL_ALIGNED(16, float, dst0, [FFALIGN(MAX_SIZE, 4)]);
70 2 LOCAL_ALIGNED(16, float, dst1, [FFALIGN(MAX_SIZE, 4)]);
71 2 float coeff0 = (float)rnd() / (UINT_MAX >> 5) - 16.0f, coeff1 = coeff0;
72
73 2 declare_func_float(float, float *out, float *in, float coeff, const float *weights, int len);
74
75
2/2
✓ Branch 1 taken 1920 times.
✓ Branch 2 taken 2 times.
1922 randomize_float(src, MAX_SIZE);
76
77 2 coeff0 = call_ref(dst0, src, coeff0, ff_opus_deemph_weights, MAX_SIZE);
78 2 coeff1 = call_new(dst1, src, coeff1, ff_opus_deemph_weights, MAX_SIZE);
79
80
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
4 if (!float_near_abs_eps(coeff0, coeff1, EPS) ||
81 2 !float_near_abs_eps_array(dst0, dst1, EPS, MAX_SIZE))
82 fail();
83
1/8
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
2 bench_new(dst1, src, coeff1, ff_opus_deemph_weights, MAX_SIZE);
84 2 }
85
86 13 void checkasm_check_opusdsp(void)
87 {
88 OpusDSP ctx;
89 13 ff_opus_dsp_init(&ctx);
90
91
2/2
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 11 times.
13 if (check_func(ctx.postfilter, "postfilter_15"))
92 2 test_postfilter(15);
93 13 report("postfilter_15");
94
95
2/2
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 11 times.
13 if (check_func(ctx.postfilter, "postfilter_512"))
96 2 test_postfilter(512);
97 13 report("postfilter_512");
98
99
2/2
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 11 times.
13 if (check_func(ctx.postfilter, "postfilter_1022"))
100 2 test_postfilter(1022);
101 13 report("postfilter_1022");
102
103
2/2
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 11 times.
13 if (check_func(ctx.deemphasis, "deemphasis"))
104 2 test_deemphasis();
105 13 report("deemphasis");
106 13 }
107