Coverage Report

Created: 2026-04-01 07:42

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/aac/aacdec_float_coupling.h
Line
Count
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
static void AAC_RENAME(apply_dependent_coupling)(AACDecContext *ac,
43
                                                 SingleChannelElement *target,
44
                                                 ChannelElement *cce, int index)
45
373k
{
46
373k
    IndividualChannelStream *ics = &cce->ch[0].ics;
47
373k
    const uint16_t *offsets = ics->swb_offset;
48
373k
    float *dest = target->coeffs;
49
373k
    const float *src = cce->ch[0].coeffs;
50
373k
    int g, i, group, k, idx = 0;
51
373k
    if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP) {
52
52.0k
        av_log(ac->avctx, AV_LOG_ERROR,
53
52.0k
               "Dependent coupling is not supported together with LTP\n");
54
52.0k
        return;
55
52.0k
    }
56
350k
    for (g = 0; g < ics->num_window_groups; g++) {
57
133k
        for (i = 0; i < ics->max_sfb; i++, idx++) {
58
104k
            if (cce->ch[0].band_type[idx] != ZERO_BT) {
59
43.8k
                const float gain = cce->coup.gain[index][idx];
60
92.4k
                for (group = 0; group < ics->group_len[g]; group++) {
61
531k
                    for (k = offsets[i]; k < offsets[i + 1]; k++) {
62
                        // FIXME: SIMDify
63
482k
                        dest[group * 128 + k] += gain * src[group * 128 + k];
64
482k
                    }
65
48.6k
                }
66
43.8k
            }
67
104k
        }
68
29.0k
        dest += ics->group_len[g] * 128;
69
29.0k
        src  += ics->group_len[g] * 128;
70
29.0k
    }
71
321k
}
72
73
/**
74
 * Apply independent channel coupling (applied after IMDCT).
75
 *
76
 * @param   index   index into coupling gain array
77
 */
78
static void AAC_RENAME(apply_independent_coupling)(AACDecContext *ac,
79
                                                   SingleChannelElement *target,
80
                                                   ChannelElement *cce, int index)
81
22.9k
{
82
22.9k
    const float gain = cce->coup.gain[index][0];
83
22.9k
    const float *src = cce->ch[0].output;
84
22.9k
    float *dest = target->output;
85
22.9k
    const int len = 1024 << (ac->oc[1].m4ac.sbr == 1);
86
87
22.9k
    ac->fdsp->vector_fmac_scalar(dest, src, gain, len);
88
22.9k
}
89
90
#endif /* AVCODEC_AAC_AACDEC_FLOAT_COUPLING_H */