FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/aac/aacdec_float_coupling.h
Date: 2024-05-03 15:42:48
Exec Total Coverage
Lines: 23 25 92.0%
Functions: 2 2 100.0%
Branches: 12 14 85.7%

Line Branch Exec Source
1 /*
2 * AAC decoder
3 * Copyright (c) 2005-2006 Oded Shimon ( ods15 ods15 dyndns org )
4 * Copyright (c) 2006-2007 Maxim Gavrilov ( maxim.gavrilov gmail com )
5 * Copyright (c) 2008-2013 Alex Converse <alex.converse@gmail.com>
6 *
7 * AAC LATM decoder
8 * Copyright (c) 2008-2010 Paul Kendall <paul@kcbbs.gen.nz>
9 * Copyright (c) 2010 Janne Grunau <janne-libav@jannau.net>
10 *
11 * AAC decoder fixed-point implementation
12 * Copyright (c) 2013
13 * MIPS Technologies, Inc., California.
14 *
15 * This file is part of FFmpeg.
16 *
17 * FFmpeg is free software; you can redistribute it and/or
18 * modify it under the terms of the GNU Lesser General Public
19 * License as published by the Free Software Foundation; either
20 * version 2.1 of the License, or (at your option) any later version.
21 *
22 * FFmpeg is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25 * Lesser General Public License for more details.
26 *
27 * You should have received a copy of the GNU Lesser General Public
28 * License along with FFmpeg; if not, write to the Free Software
29 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30 */
31
32 #ifndef AVCODEC_AAC_AACDEC_FLOAT_COUPLING_H
33 #define AVCODEC_AAC_AACDEC_FLOAT_COUPLING_H
34
35 #include "aacdec.h"
36
37 /**
38 * Apply dependent channel coupling (applied before IMDCT).
39 *
40 * @param index index into coupling gain array
41 */
42 2743 static void AAC_RENAME(apply_dependent_coupling)(AACDecContext *ac,
43 SingleChannelElement *target,
44 ChannelElement *cce, int index)
45 {
46 2743 IndividualChannelStream *ics = &cce->ch[0].ics;
47 2743 const uint16_t *offsets = ics->swb_offset;
48 2743 float *dest = target->coeffs;
49 2743 const float *src = cce->ch[0].coeffs;
50 2743 int g, i, group, k, idx = 0;
51
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2743 times.
2743 if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP) {
52 av_log(ac->avctx, AV_LOG_ERROR,
53 "Dependent coupling is not supported together with LTP\n");
54 return;
55 }
56
2/2
✓ Branch 0 taken 2743 times.
✓ Branch 1 taken 2743 times.
5486 for (g = 0; g < ics->num_window_groups; g++) {
57
2/2
✓ Branch 0 taken 109720 times.
✓ Branch 1 taken 2743 times.
112463 for (i = 0; i < ics->max_sfb; i++, idx++) {
58
2/2
✓ Branch 0 taken 5196 times.
✓ Branch 1 taken 104524 times.
109720 if (cce->ch[0].band_type[idx] != ZERO_BT) {
59 5196 const float gain = cce->coup.gain[index][idx];
60
2/2
✓ Branch 0 taken 5196 times.
✓ Branch 1 taken 5196 times.
10392 for (group = 0; group < ics->group_len[g]; group++) {
61
2/2
✓ Branch 0 taken 76768 times.
✓ Branch 1 taken 5196 times.
81964 for (k = offsets[i]; k < offsets[i + 1]; k++) {
62 // FIXME: SIMDify
63 76768 dest[group * 128 + k] += gain * src[group * 128 + k];
64 }
65 }
66 }
67 }
68 2743 dest += ics->group_len[g] * 128;
69 2743 src += ics->group_len[g] * 128;
70 }
71 }
72
73 /**
74 * Apply independent channel coupling (applied after IMDCT).
75 *
76 * @param index index into coupling gain array
77 */
78 1315 static void AAC_RENAME(apply_independent_coupling)(AACDecContext *ac,
79 SingleChannelElement *target,
80 ChannelElement *cce, int index)
81 {
82 1315 const float gain = cce->coup.gain[index][0];
83 1315 const float *src = cce->ch[0].output;
84 1315 float *dest = target->output;
85
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1315 times.
1315 const int len = 1024 << (ac->oc[1].m4ac.sbr == 1);
86
87 1315 ac->fdsp->vector_fmac_scalar(dest, src, gain, len);
88 1315 }
89
90 #endif /* AVCODEC_AAC_AACDEC_FLOAT_COUPLING_H */
91