FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/x86/ac3dsp_init.c
Date: 2024-11-20 23:03:26
Exec Total Coverage
Lines: 20 20 100.0%
Functions: 2 2 100.0%
Branches: 33 84 39.3%

Line Branch Exec Source
1 /*
2 * x86-optimized AC-3 DSP functions
3 * Copyright (c) 2011 Justin Ruggles
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #include "libavutil/attributes.h"
23 #include "libavutil/x86/asm.h"
24 #include "libavutil/x86/cpu.h"
25 #include "libavcodec/ac3dsp.h"
26
27 void ff_ac3_exponent_min_sse2 (uint8_t *exp, int num_reuse_blocks, int nb_coefs);
28
29 void ff_float_to_fixed24_sse2 (int32_t *dst, const float *src, size_t len);
30 void ff_float_to_fixed24_avx (int32_t *dst, const float *src, size_t len);
31
32 int ff_ac3_compute_mantissa_size_sse2(uint16_t mant_cnt[6][16]);
33
34 void ff_ac3_extract_exponents_sse2 (uint8_t *exp, int32_t *coef, int nb_coefs);
35 void ff_ac3_extract_exponents_ssse3(uint8_t *exp, int32_t *coef, int nb_coefs);
36
37 118 av_cold void ff_ac3dsp_init_x86(AC3DSPContext *c)
38 {
39 118 int cpu_flags = av_get_cpu_flags();
40
41
2/2
✓ Branch 0 taken 35 times.
✓ Branch 1 taken 83 times.
118 if (EXTERNAL_SSE2(cpu_flags)) {
42 35 c->ac3_exponent_min = ff_ac3_exponent_min_sse2;
43 35 c->float_to_fixed24 = ff_float_to_fixed24_sse2;
44 35 c->compute_mantissa_size = ff_ac3_compute_mantissa_size_sse2;
45 35 c->extract_exponents = ff_ac3_extract_exponents_sse2;
46 }
47
48
2/2
✓ Branch 0 taken 33 times.
✓ Branch 1 taken 85 times.
118 if (EXTERNAL_SSSE3(cpu_flags)) {
49
1/2
✓ Branch 0 taken 33 times.
✗ Branch 1 not taken.
33 if (!(cpu_flags & AV_CPU_FLAG_ATOM))
50 33 c->extract_exponents = ff_ac3_extract_exponents_ssse3;
51 }
52
3/4
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 89 times.
✓ Branch 2 taken 29 times.
✗ Branch 3 not taken.
118 if (EXTERNAL_AVX_FAST(cpu_flags)) {
53 29 c->float_to_fixed24 = ff_float_to_fixed24_avx;
54 }
55 118 }
56
57 #define DOWNMIX_FUNC_OPT(ch, opt) \
58 void ff_ac3_downmix_ ## ch ## _to_1_ ## opt(float **samples, \
59 float **matrix, int len); \
60 void ff_ac3_downmix_ ## ch ## _to_2_ ## opt(float **samples, \
61 float **matrix, int len);
62
63 #define DOWNMIX_FUNCS(opt) \
64 DOWNMIX_FUNC_OPT(3, opt) \
65 DOWNMIX_FUNC_OPT(4, opt) \
66 DOWNMIX_FUNC_OPT(5, opt) \
67 DOWNMIX_FUNC_OPT(6, opt)
68
69 DOWNMIX_FUNCS(sse)
70 DOWNMIX_FUNCS(avx)
71 DOWNMIX_FUNCS(fma3)
72
73 11 void ff_ac3dsp_set_downmix_x86(AC3DSPContext *c)
74 {
75 11 int cpu_flags = av_get_cpu_flags();
76
77 #define SET_DOWNMIX(ch, suf, SUF) \
78 if (ch == c->in_channels) { \
79 if (EXTERNAL_ ## SUF (cpu_flags)) { \
80 if (c->out_channels == 1) \
81 c->downmix = ff_ac3_downmix_ ## ch ## _to_1_ ## suf; \
82 else \
83 c->downmix = ff_ac3_downmix_ ## ch ## _to_2_ ## suf; \
84 } \
85 }
86
87 #define SET_DOWNMIX_ALL(suf, SUF) \
88 SET_DOWNMIX(3, suf, SUF) \
89 SET_DOWNMIX(4, suf, SUF) \
90 SET_DOWNMIX(5, suf, SUF) \
91 SET_DOWNMIX(6, suf, SUF)
92
93
8/24
✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 5 times.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 5 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 6 times.
✓ Branch 13 taken 5 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 6 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 11 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
11 SET_DOWNMIX_ALL(sse, SSE)
94
1/2
✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
11 if (!(cpu_flags & AV_CPU_FLAG_AVXSLOW)) {
95
8/24
✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 5 times.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 5 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 6 times.
✓ Branch 13 taken 5 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 6 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 11 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
11 SET_DOWNMIX_ALL(avx, AVX)
96
8/24
✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 5 times.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 5 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 6 times.
✓ Branch 13 taken 5 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 6 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 11 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
11 SET_DOWNMIX_ALL(fma3, FMA3)
97 }
98 11 }
99