Coverage Report

Created: 2026-10-28 08:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/aacsbr_template.c
Line
Count
Source
1
/*
2
 * AAC Spectral Band Replication decoding functions
3
 * Copyright (c) 2008-2009 Robert Swain ( rob opendot cl )
4
 * Copyright (c) 2009-2010 Alex Converse <alex.converse@gmail.com>
5
 *
6
 * Fixed point code
7
 * Copyright (c) 2013
8
 *      MIPS Technologies, Inc., California.
9
 *
10
 * This file is part of FFmpeg.
11
 *
12
 * FFmpeg is free software; you can redistribute it and/or
13
 * modify it under the terms of the GNU Lesser General Public
14
 * License as published by the Free Software Foundation; either
15
 * version 2.1 of the License, or (at your option) any later version.
16
 *
17
 * FFmpeg is distributed in the hope that it will be useful,
18
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20
 * Lesser General Public License for more details.
21
 *
22
 * You should have received a copy of the GNU Lesser General Public
23
 * License along with FFmpeg; if not, write to the Free Software
24
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25
 */
26
27
/**
28
 * @file
29
 * AAC Spectral Band Replication decoding functions
30
 * @author Robert Swain ( rob opendot cl )
31
 * @author Stanislav Ocovaj ( stanislav.ocovaj@imgtec.com )
32
 * @author Zoran Basaric ( zoran.basaric@imgtec.com )
33
 */
34
35
#include "aac/aacdec.h"
36
#include "aac/aacdec_tab.h"
37
#include "avcodec.h"
38
#include "libavutil/qsort.h"
39
#include "libavutil/mem.h"
40
41
typedef struct ExtChannelElement {
42
    ChannelElement ch;
43
    PredictorState predictor_state[2][MAX_PREDICTORS];
44
    SpectralBandReplication sbr;
45
} ExtChannelElement;
46
47
static inline SpectralBandReplication *get_sbr(ChannelElement *ch)
48
3.62M
{
49
3.62M
    return &((ExtChannelElement*)ch)->sbr;
50
3.62M
}
aacsbr.c:get_sbr
Line
Count
Source
48
3.19M
{
49
3.19M
    return &((ExtChannelElement*)ch)->sbr;
50
3.19M
}
aacsbr_fixed.c:get_sbr
Line
Count
Source
48
434k
{
49
434k
    return &((ExtChannelElement*)ch)->sbr;
50
434k
}
51
52
av_cold void AAC_RENAME(ff_aac_sbr_init)(void)
53
3
{
54
3
    AAC_RENAME(ff_ps_init)();
55
3
}
ff_aac_sbr_init
Line
Count
Source
53
2
{
54
2
    AAC_RENAME(ff_ps_init)();
55
2
}
ff_aac_sbr_init_fixed
Line
Count
Source
53
1
{
54
1
    AAC_RENAME(ff_ps_init)();
55
1
}
56
57
/** Places SBR in pure upsampling mode. */
58
1.98M
static void sbr_turnoff(SpectralBandReplication *sbr) {
59
1.98M
    sbr->start = 0;
60
1.98M
    sbr->usac = 0;
61
1.98M
    sbr->ready_for_dequant = 0;
62
    // Init defaults used in pure upsampling mode
63
1.98M
    sbr->kx[1] = 32; //Typo in spec, kx' inits to 32
64
1.98M
    sbr->m[1] = 0;
65
    // Reset values for first SBR header
66
1.98M
    sbr->data[0].e_a[1] = sbr->data[1].e_a[1] = -1;
67
1.98M
    memset(&sbr->spectrum_params, -1, sizeof(SpectrumParameters));
68
1.98M
}
aacsbr.c:sbr_turnoff
Line
Count
Source
58
1.81M
static void sbr_turnoff(SpectralBandReplication *sbr) {
59
1.81M
    sbr->start = 0;
60
1.81M
    sbr->usac = 0;
61
1.81M
    sbr->ready_for_dequant = 0;
62
    // Init defaults used in pure upsampling mode
63
1.81M
    sbr->kx[1] = 32; //Typo in spec, kx' inits to 32
64
1.81M
    sbr->m[1] = 0;
65
    // Reset values for first SBR header
66
1.81M
    sbr->data[0].e_a[1] = sbr->data[1].e_a[1] = -1;
67
1.81M
    memset(&sbr->spectrum_params, -1, sizeof(SpectrumParameters));
68
1.81M
}
aacsbr_fixed.c:sbr_turnoff
Line
Count
Source
58
167k
static void sbr_turnoff(SpectralBandReplication *sbr) {
59
167k
    sbr->start = 0;
60
167k
    sbr->usac = 0;
61
167k
    sbr->ready_for_dequant = 0;
62
    // Init defaults used in pure upsampling mode
63
167k
    sbr->kx[1] = 32; //Typo in spec, kx' inits to 32
64
167k
    sbr->m[1] = 0;
65
    // Reset values for first SBR header
66
167k
    sbr->data[0].e_a[1] = sbr->data[1].e_a[1] = -1;
67
167k
    memset(&sbr->spectrum_params, -1, sizeof(SpectrumParameters));
68
167k
}
69
70
av_cold int AAC_RENAME(ff_aac_sbr_ctx_alloc_init)(AACDecContext *ac,
71
                                                  ChannelElement **che, int id_aac)
72
155k
{
73
155k
    SpectralBandReplication *sbr;
74
155k
    ExtChannelElement *ext = av_mallocz(sizeof(*ext));
75
155k
    int ret;
76
155k
    float scale;
77
78
155k
    if (!ext)
79
0
        return AVERROR(ENOMEM);
80
155k
    sbr = &ext->sbr;
81
155k
    ext->ch.ch[0].AAC_RENAME(predictor_state) = ext->predictor_state[0];
82
155k
    ext->ch.ch[1].AAC_RENAME(predictor_state) = ext->predictor_state[1];
83
84
155k
    sbr->kx[0] = sbr->kx[1];
85
155k
    sbr->id_aac = id_aac;
86
155k
    sbr_turnoff(sbr);
87
155k
    sbr->data[0].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128);
88
155k
    sbr->data[1].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128);
89
    /* SBR requires samples to be scaled to +/-32768.0 to work correctly.
90
     * mdct scale factors are adjusted to scale up from +/-1.0 at analysis
91
     * and scale back down at synthesis. */
92
93
155k
    scale = USE_FIXED ? 1 : 1.0 / (64 * 32768);
94
155k
    ret = av_tx_init(&sbr->mdct, &sbr->mdct_fn,
95
155k
                     USE_FIXED ? AV_TX_INT32_MDCT : AV_TX_FLOAT_MDCT,
96
155k
                     1, 64, &scale, 0);
97
155k
    if (ret < 0)
98
0
        goto fail;
99
100
155k
    scale = USE_FIXED ? -1.0 : -2.0 * 32768;
101
155k
    ret = av_tx_init(&sbr->mdct_ana, &sbr->mdct_ana_fn,
102
155k
                     USE_FIXED ? AV_TX_INT32_MDCT : AV_TX_FLOAT_MDCT,
103
155k
                     1, 64, &scale, 0);
104
155k
    if (ret < 0)
105
0
        goto fail;
106
107
155k
    AAC_RENAME(ff_ps_ctx_init)(&sbr->ps);
108
155k
    AAC_RENAME(ff_sbrdsp_init)(&sbr->dsp);
109
155k
    aacsbr_func_ptr_init(&sbr->c);
110
111
155k
    *che = &ext->ch;
112
155k
    return 0;
113
0
fail:
114
0
    av_tx_uninit(&sbr->mdct);
115
0
    av_free(ext);
116
0
    return ret;
117
155k
}
ff_aac_sbr_ctx_alloc_init
Line
Count
Source
72
105k
{
73
105k
    SpectralBandReplication *sbr;
74
105k
    ExtChannelElement *ext = av_mallocz(sizeof(*ext));
75
105k
    int ret;
76
105k
    float scale;
77
78
105k
    if (!ext)
79
0
        return AVERROR(ENOMEM);
80
105k
    sbr = &ext->sbr;
81
105k
    ext->ch.ch[0].AAC_RENAME(predictor_state) = ext->predictor_state[0];
82
105k
    ext->ch.ch[1].AAC_RENAME(predictor_state) = ext->predictor_state[1];
83
84
105k
    sbr->kx[0] = sbr->kx[1];
85
105k
    sbr->id_aac = id_aac;
86
105k
    sbr_turnoff(sbr);
87
105k
    sbr->data[0].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128);
88
105k
    sbr->data[1].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128);
89
    /* SBR requires samples to be scaled to +/-32768.0 to work correctly.
90
     * mdct scale factors are adjusted to scale up from +/-1.0 at analysis
91
     * and scale back down at synthesis. */
92
93
105k
    scale = USE_FIXED ? 1 : 1.0 / (64 * 32768);
94
105k
    ret = av_tx_init(&sbr->mdct, &sbr->mdct_fn,
95
105k
                     USE_FIXED ? AV_TX_INT32_MDCT : AV_TX_FLOAT_MDCT,
96
105k
                     1, 64, &scale, 0);
97
105k
    if (ret < 0)
98
0
        goto fail;
99
100
105k
    scale = USE_FIXED ? -1.0 : -2.0 * 32768;
101
105k
    ret = av_tx_init(&sbr->mdct_ana, &sbr->mdct_ana_fn,
102
105k
                     USE_FIXED ? AV_TX_INT32_MDCT : AV_TX_FLOAT_MDCT,
103
105k
                     1, 64, &scale, 0);
104
105k
    if (ret < 0)
105
0
        goto fail;
106
107
105k
    AAC_RENAME(ff_ps_ctx_init)(&sbr->ps);
108
105k
    AAC_RENAME(ff_sbrdsp_init)(&sbr->dsp);
109
105k
    aacsbr_func_ptr_init(&sbr->c);
110
111
105k
    *che = &ext->ch;
112
105k
    return 0;
113
0
fail:
114
0
    av_tx_uninit(&sbr->mdct);
115
0
    av_free(ext);
116
0
    return ret;
117
105k
}
ff_aac_sbr_ctx_alloc_init_fixed
Line
Count
Source
72
49.9k
{
73
49.9k
    SpectralBandReplication *sbr;
74
49.9k
    ExtChannelElement *ext = av_mallocz(sizeof(*ext));
75
49.9k
    int ret;
76
49.9k
    float scale;
77
78
49.9k
    if (!ext)
79
0
        return AVERROR(ENOMEM);
80
49.9k
    sbr = &ext->sbr;
81
49.9k
    ext->ch.ch[0].AAC_RENAME(predictor_state) = ext->predictor_state[0];
82
49.9k
    ext->ch.ch[1].AAC_RENAME(predictor_state) = ext->predictor_state[1];
83
84
49.9k
    sbr->kx[0] = sbr->kx[1];
85
49.9k
    sbr->id_aac = id_aac;
86
49.9k
    sbr_turnoff(sbr);
87
49.9k
    sbr->data[0].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128);
88
49.9k
    sbr->data[1].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128);
89
    /* SBR requires samples to be scaled to +/-32768.0 to work correctly.
90
     * mdct scale factors are adjusted to scale up from +/-1.0 at analysis
91
     * and scale back down at synthesis. */
92
93
49.9k
    scale = USE_FIXED ? 1 : 1.0 / (64 * 32768);
94
49.9k
    ret = av_tx_init(&sbr->mdct, &sbr->mdct_fn,
95
49.9k
                     USE_FIXED ? AV_TX_INT32_MDCT : AV_TX_FLOAT_MDCT,
96
49.9k
                     1, 64, &scale, 0);
97
49.9k
    if (ret < 0)
98
0
        goto fail;
99
100
49.9k
    scale = USE_FIXED ? -1.0 : -2.0 * 32768;
101
49.9k
    ret = av_tx_init(&sbr->mdct_ana, &sbr->mdct_ana_fn,
102
49.9k
                     USE_FIXED ? AV_TX_INT32_MDCT : AV_TX_FLOAT_MDCT,
103
49.9k
                     1, 64, &scale, 0);
104
49.9k
    if (ret < 0)
105
0
        goto fail;
106
107
49.9k
    AAC_RENAME(ff_ps_ctx_init)(&sbr->ps);
108
49.9k
    AAC_RENAME(ff_sbrdsp_init)(&sbr->dsp);
109
49.9k
    aacsbr_func_ptr_init(&sbr->c);
110
111
49.9k
    *che = &ext->ch;
112
49.9k
    return 0;
113
0
fail:
114
0
    av_tx_uninit(&sbr->mdct);
115
0
    av_free(ext);
116
0
    return ret;
117
49.9k
}
118
119
av_cold void AAC_RENAME(ff_aac_sbr_ctx_close)(ChannelElement *che)
120
155k
{
121
155k
    SpectralBandReplication *sbr = get_sbr(che);
122
155k
    av_tx_uninit(&sbr->mdct);
123
155k
    av_tx_uninit(&sbr->mdct_ana);
124
155k
}
ff_aac_sbr_ctx_close
Line
Count
Source
120
105k
{
121
105k
    SpectralBandReplication *sbr = get_sbr(che);
122
105k
    av_tx_uninit(&sbr->mdct);
123
105k
    av_tx_uninit(&sbr->mdct_ana);
124
105k
}
ff_aac_sbr_ctx_close_fixed
Line
Count
Source
120
49.9k
{
121
49.9k
    SpectralBandReplication *sbr = get_sbr(che);
122
49.9k
    av_tx_uninit(&sbr->mdct);
123
49.9k
    av_tx_uninit(&sbr->mdct_ana);
124
49.9k
}
125
126
static int qsort_comparison_function_int16(const void *a, const void *b)
127
36.8M
{
128
36.8M
    return *(const int16_t *)a - *(const int16_t *)b;
129
36.8M
}
aacsbr.c:qsort_comparison_function_int16
Line
Count
Source
127
27.3M
{
128
27.3M
    return *(const int16_t *)a - *(const int16_t *)b;
129
27.3M
}
aacsbr_fixed.c:qsort_comparison_function_int16
Line
Count
Source
127
9.51M
{
128
9.51M
    return *(const int16_t *)a - *(const int16_t *)b;
129
9.51M
}
130
131
static inline int in_table_int16(const int16_t *table, int last_el, int16_t needle)
132
2.70M
{
133
2.70M
    int i;
134
10.9M
    for (i = 0; i <= last_el; i++)
135
8.82M
        if (table[i] == needle)
136
602k
            return 1;
137
2.10M
    return 0;
138
2.70M
}
aacsbr.c:in_table_int16
Line
Count
Source
132
2.23M
{
133
2.23M
    int i;
134
8.98M
    for (i = 0; i <= last_el; i++)
135
7.21M
        if (table[i] == needle)
136
462k
            return 1;
137
1.77M
    return 0;
138
2.23M
}
aacsbr_fixed.c:in_table_int16
Line
Count
Source
132
470k
{
133
470k
    int i;
134
1.93M
    for (i = 0; i <= last_el; i++)
135
1.60M
        if (table[i] == needle)
136
139k
            return 1;
137
330k
    return 0;
138
470k
}
139
140
/// Limiter Frequency Band Table (14496-3 sp04 p198)
141
static void sbr_make_f_tablelim(SpectralBandReplication *sbr)
142
359k
{
143
359k
    int k;
144
359k
    if (sbr->bs_limiter_bands > 0) {
145
311k
        static const INTFLOAT bands_warped[3] = { Q23(1.32715174233856803909f),   //2^(0.49/1.2)
146
311k
                                               Q23(1.18509277094158210129f),   //2^(0.49/2)
147
311k
                                               Q23(1.11987160404675912501f) }; //2^(0.49/3)
148
311k
        const INTFLOAT lim_bands_per_octave_warped = bands_warped[sbr->bs_limiter_bands - 1];
149
311k
        int16_t patch_borders[7];
150
311k
        uint16_t *in = sbr->f_tablelim + 1, *out = sbr->f_tablelim;
151
152
311k
        patch_borders[0] = sbr->kx[1];
153
999k
        for (k = 1; k <= sbr->num_patches; k++)
154
688k
            patch_borders[k] = patch_borders[k-1] + sbr->patch_num_subbands[k-1];
155
156
311k
        memcpy(sbr->f_tablelim, sbr->f_tablelow,
157
311k
               (sbr->n[0] + 1) * sizeof(sbr->f_tablelow[0]));
158
311k
        if (sbr->num_patches > 1)
159
253k
            memcpy(sbr->f_tablelim + sbr->n[0] + 1, patch_borders + 1,
160
253k
                   (sbr->num_patches - 1) * sizeof(patch_borders[0]));
161
162
311k
        AV_QSORT(sbr->f_tablelim, sbr->num_patches + sbr->n[0],
163
311k
              uint16_t,
164
311k
              qsort_comparison_function_int16);
165
166
311k
        sbr->n_lim = sbr->n[0] + sbr->num_patches - 1;
167
3.53M
        while (out < sbr->f_tablelim + sbr->n_lim) {
168
#if USE_FIXED
169
603k
            if ((*in << 23) >= *out * lim_bands_per_octave_warped) {
170
#else
171
2.62M
            if (*in >= *out * lim_bands_per_octave_warped) {
172
597k
#endif /* USE_FIXED */
173
597k
                *++out = *in++;
174
2.42M
            } else if (*in == *out ||
175
2.25M
                !in_table_int16(patch_borders, sbr->num_patches, *in)) {
176
1.97M
                in++;
177
1.97M
                sbr->n_lim--;
178
1.97M
            } else if (!in_table_int16(patch_borders, sbr->num_patches, *out)) {
179
292k
                *out = *in++;
180
292k
                sbr->n_lim--;
181
292k
            } else {
182
154k
                *++out = *in++;
183
154k
            }
184
3.22M
        }
185
311k
    } else {
186
48.3k
        sbr->f_tablelim[0] = sbr->f_tablelow[0];
187
48.3k
        sbr->f_tablelim[1] = sbr->f_tablelow[sbr->n[0]];
188
48.3k
        sbr->n_lim = 1;
189
48.3k
    }
190
359k
}
aacsbr.c:sbr_make_f_tablelim
Line
Count
Source
142
247k
{
143
247k
    int k;
144
247k
    if (sbr->bs_limiter_bands > 0) {
145
230k
        static const INTFLOAT bands_warped[3] = { Q23(1.32715174233856803909f),   //2^(0.49/1.2)
146
230k
                                               Q23(1.18509277094158210129f),   //2^(0.49/2)
147
230k
                                               Q23(1.11987160404675912501f) }; //2^(0.49/3)
148
230k
        const INTFLOAT lim_bands_per_octave_warped = bands_warped[sbr->bs_limiter_bands - 1];
149
230k
        int16_t patch_borders[7];
150
230k
        uint16_t *in = sbr->f_tablelim + 1, *out = sbr->f_tablelim;
151
152
230k
        patch_borders[0] = sbr->kx[1];
153
742k
        for (k = 1; k <= sbr->num_patches; k++)
154
511k
            patch_borders[k] = patch_borders[k-1] + sbr->patch_num_subbands[k-1];
155
156
230k
        memcpy(sbr->f_tablelim, sbr->f_tablelow,
157
230k
               (sbr->n[0] + 1) * sizeof(sbr->f_tablelow[0]));
158
230k
        if (sbr->num_patches > 1)
159
196k
            memcpy(sbr->f_tablelim + sbr->n[0] + 1, patch_borders + 1,
160
196k
                   (sbr->num_patches - 1) * sizeof(patch_borders[0]));
161
162
230k
        AV_QSORT(sbr->f_tablelim, sbr->num_patches + sbr->n[0],
163
230k
              uint16_t,
164
230k
              qsort_comparison_function_int16);
165
166
230k
        sbr->n_lim = sbr->n[0] + sbr->num_patches - 1;
167
2.85M
        while (out < sbr->f_tablelim + sbr->n_lim) {
168
#if USE_FIXED
169
            if ((*in << 23) >= *out * lim_bands_per_octave_warped) {
170
#else
171
2.62M
            if (*in >= *out * lim_bands_per_octave_warped) {
172
597k
#endif /* USE_FIXED */
173
597k
                *++out = *in++;
174
2.02M
            } else if (*in == *out ||
175
1.89M
                !in_table_int16(patch_borders, sbr->num_patches, *in)) {
176
1.67M
                in++;
177
1.67M
                sbr->n_lim--;
178
1.67M
            } else if (!in_table_int16(patch_borders, sbr->num_patches, *out)) {
179
228k
                *out = *in++;
180
228k
                sbr->n_lim--;
181
228k
            } else {
182
116k
                *++out = *in++;
183
116k
            }
184
2.62M
        }
185
230k
    } else {
186
16.5k
        sbr->f_tablelim[0] = sbr->f_tablelow[0];
187
16.5k
        sbr->f_tablelim[1] = sbr->f_tablelow[sbr->n[0]];
188
16.5k
        sbr->n_lim = 1;
189
16.5k
    }
190
247k
}
aacsbr_fixed.c:sbr_make_f_tablelim
Line
Count
Source
142
112k
{
143
112k
    int k;
144
112k
    if (sbr->bs_limiter_bands > 0) {
145
80.4k
        static const INTFLOAT bands_warped[3] = { Q23(1.32715174233856803909f),   //2^(0.49/1.2)
146
80.4k
                                               Q23(1.18509277094158210129f),   //2^(0.49/2)
147
80.4k
                                               Q23(1.11987160404675912501f) }; //2^(0.49/3)
148
80.4k
        const INTFLOAT lim_bands_per_octave_warped = bands_warped[sbr->bs_limiter_bands - 1];
149
80.4k
        int16_t patch_borders[7];
150
80.4k
        uint16_t *in = sbr->f_tablelim + 1, *out = sbr->f_tablelim;
151
152
80.4k
        patch_borders[0] = sbr->kx[1];
153
257k
        for (k = 1; k <= sbr->num_patches; k++)
154
176k
            patch_borders[k] = patch_borders[k-1] + sbr->patch_num_subbands[k-1];
155
156
80.4k
        memcpy(sbr->f_tablelim, sbr->f_tablelow,
157
80.4k
               (sbr->n[0] + 1) * sizeof(sbr->f_tablelow[0]));
158
80.4k
        if (sbr->num_patches > 1)
159
57.3k
            memcpy(sbr->f_tablelim + sbr->n[0] + 1, patch_borders + 1,
160
57.3k
                   (sbr->num_patches - 1) * sizeof(patch_borders[0]));
161
162
80.4k
        AV_QSORT(sbr->f_tablelim, sbr->num_patches + sbr->n[0],
163
80.4k
              uint16_t,
164
80.4k
              qsort_comparison_function_int16);
165
166
80.4k
        sbr->n_lim = sbr->n[0] + sbr->num_patches - 1;
167
683k
        while (out < sbr->f_tablelim + sbr->n_lim) {
168
603k
#if USE_FIXED
169
603k
            if ((*in << 23) >= *out * lim_bands_per_octave_warped) {
170
#else
171
            if (*in >= *out * lim_bands_per_octave_warped) {
172
#endif /* USE_FIXED */
173
202k
                *++out = *in++;
174
400k
            } else if (*in == *out ||
175
368k
                !in_table_int16(patch_borders, sbr->num_patches, *in)) {
176
298k
                in++;
177
298k
                sbr->n_lim--;
178
298k
            } else if (!in_table_int16(patch_borders, sbr->num_patches, *out)) {
179
64.0k
                *out = *in++;
180
64.0k
                sbr->n_lim--;
181
64.0k
            } else {
182
37.8k
                *++out = *in++;
183
37.8k
            }
184
603k
        }
185
80.4k
    } else {
186
31.7k
        sbr->f_tablelim[0] = sbr->f_tablelow[0];
187
31.7k
        sbr->f_tablelim[1] = sbr->f_tablelow[sbr->n[0]];
188
31.7k
        sbr->n_lim = 1;
189
31.7k
    }
190
112k
}
191
192
static unsigned int read_sbr_header(SpectralBandReplication *sbr,
193
                                    GetBitContext *gb, int is_usac)
194
475k
{
195
475k
    unsigned int cnt = get_bits_count(gb);
196
475k
    uint8_t bs_header_extra_1;
197
475k
    uint8_t bs_header_extra_2;
198
475k
    int old_bs_limiter_bands = sbr->bs_limiter_bands;
199
475k
    SpectrumParameters old_spectrum_params;
200
201
475k
    sbr->start = 1;
202
475k
    sbr->ready_for_dequant = 0;
203
475k
    sbr->usac = is_usac;
204
205
    // Save last spectrum parameters variables to compare to new ones
206
475k
    memcpy(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters));
207
208
475k
    if (!is_usac)
209
455k
        sbr->bs_amp_res_header          = get_bits1(gb);
210
211
475k
    sbr->spectrum_params.bs_start_freq  = get_bits(gb, 4);
212
475k
    sbr->spectrum_params.bs_stop_freq   = get_bits(gb, 4);
213
214
475k
    if (!is_usac)
215
455k
        sbr->spectrum_params.bs_xover_band = get_bits(gb, 3);
216
475k
                                             skip_bits(gb, 2); // bs_reserved
217
218
475k
    bs_header_extra_1 = get_bits1(gb);
219
475k
    bs_header_extra_2 = get_bits1(gb);
220
221
475k
    if (bs_header_extra_1) {
222
329k
        sbr->spectrum_params.bs_freq_scale  = get_bits(gb, 2);
223
329k
        sbr->spectrum_params.bs_alter_scale = get_bits1(gb);
224
329k
        sbr->spectrum_params.bs_noise_bands = get_bits(gb, 2);
225
329k
    } else {
226
145k
        sbr->spectrum_params.bs_freq_scale  = 2;
227
145k
        sbr->spectrum_params.bs_alter_scale = 1;
228
145k
        sbr->spectrum_params.bs_noise_bands = 2;
229
145k
    }
230
231
    // Check if spectrum parameters changed
232
475k
    if (memcmp(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters)))
233
436k
        sbr->reset = 1;
234
235
475k
    if (bs_header_extra_2) {
236
191k
        sbr->bs_limiter_bands  = get_bits(gb, 2);
237
191k
        sbr->bs_limiter_gains  = get_bits(gb, 2);
238
191k
        sbr->bs_interpol_freq  = get_bits1(gb);
239
191k
        sbr->bs_smoothing_mode = get_bits1(gb);
240
283k
    } else {
241
283k
        sbr->bs_limiter_bands  = 2;
242
283k
        sbr->bs_limiter_gains  = 2;
243
283k
        sbr->bs_interpol_freq  = 1;
244
283k
        sbr->bs_smoothing_mode = 1;
245
283k
    }
246
247
475k
    if (sbr->bs_limiter_bands != old_bs_limiter_bands && !sbr->reset)
248
1.82k
        sbr_make_f_tablelim(sbr);
249
250
475k
    return get_bits_count(gb) - cnt;
251
475k
}
aacsbr.c:read_sbr_header
Line
Count
Source
194
314k
{
195
314k
    unsigned int cnt = get_bits_count(gb);
196
314k
    uint8_t bs_header_extra_1;
197
314k
    uint8_t bs_header_extra_2;
198
314k
    int old_bs_limiter_bands = sbr->bs_limiter_bands;
199
314k
    SpectrumParameters old_spectrum_params;
200
201
314k
    sbr->start = 1;
202
314k
    sbr->ready_for_dequant = 0;
203
314k
    sbr->usac = is_usac;
204
205
    // Save last spectrum parameters variables to compare to new ones
206
314k
    memcpy(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters));
207
208
314k
    if (!is_usac)
209
294k
        sbr->bs_amp_res_header          = get_bits1(gb);
210
211
314k
    sbr->spectrum_params.bs_start_freq  = get_bits(gb, 4);
212
314k
    sbr->spectrum_params.bs_stop_freq   = get_bits(gb, 4);
213
214
314k
    if (!is_usac)
215
294k
        sbr->spectrum_params.bs_xover_band = get_bits(gb, 3);
216
314k
                                             skip_bits(gb, 2); // bs_reserved
217
218
314k
    bs_header_extra_1 = get_bits1(gb);
219
314k
    bs_header_extra_2 = get_bits1(gb);
220
221
314k
    if (bs_header_extra_1) {
222
249k
        sbr->spectrum_params.bs_freq_scale  = get_bits(gb, 2);
223
249k
        sbr->spectrum_params.bs_alter_scale = get_bits1(gb);
224
249k
        sbr->spectrum_params.bs_noise_bands = get_bits(gb, 2);
225
249k
    } else {
226
64.9k
        sbr->spectrum_params.bs_freq_scale  = 2;
227
64.9k
        sbr->spectrum_params.bs_alter_scale = 1;
228
64.9k
        sbr->spectrum_params.bs_noise_bands = 2;
229
64.9k
    }
230
231
    // Check if spectrum parameters changed
232
314k
    if (memcmp(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters)))
233
309k
        sbr->reset = 1;
234
235
314k
    if (bs_header_extra_2) {
236
124k
        sbr->bs_limiter_bands  = get_bits(gb, 2);
237
124k
        sbr->bs_limiter_gains  = get_bits(gb, 2);
238
124k
        sbr->bs_interpol_freq  = get_bits1(gb);
239
124k
        sbr->bs_smoothing_mode = get_bits1(gb);
240
189k
    } else {
241
189k
        sbr->bs_limiter_bands  = 2;
242
189k
        sbr->bs_limiter_gains  = 2;
243
189k
        sbr->bs_interpol_freq  = 1;
244
189k
        sbr->bs_smoothing_mode = 1;
245
189k
    }
246
247
314k
    if (sbr->bs_limiter_bands != old_bs_limiter_bands && !sbr->reset)
248
246
        sbr_make_f_tablelim(sbr);
249
250
314k
    return get_bits_count(gb) - cnt;
251
314k
}
aacsbr_fixed.c:read_sbr_header
Line
Count
Source
194
161k
{
195
161k
    unsigned int cnt = get_bits_count(gb);
196
161k
    uint8_t bs_header_extra_1;
197
161k
    uint8_t bs_header_extra_2;
198
161k
    int old_bs_limiter_bands = sbr->bs_limiter_bands;
199
161k
    SpectrumParameters old_spectrum_params;
200
201
161k
    sbr->start = 1;
202
161k
    sbr->ready_for_dequant = 0;
203
161k
    sbr->usac = is_usac;
204
205
    // Save last spectrum parameters variables to compare to new ones
206
161k
    memcpy(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters));
207
208
161k
    if (!is_usac)
209
161k
        sbr->bs_amp_res_header          = get_bits1(gb);
210
211
161k
    sbr->spectrum_params.bs_start_freq  = get_bits(gb, 4);
212
161k
    sbr->spectrum_params.bs_stop_freq   = get_bits(gb, 4);
213
214
161k
    if (!is_usac)
215
161k
        sbr->spectrum_params.bs_xover_band = get_bits(gb, 3);
216
161k
                                             skip_bits(gb, 2); // bs_reserved
217
218
161k
    bs_header_extra_1 = get_bits1(gb);
219
161k
    bs_header_extra_2 = get_bits1(gb);
220
221
161k
    if (bs_header_extra_1) {
222
80.3k
        sbr->spectrum_params.bs_freq_scale  = get_bits(gb, 2);
223
80.3k
        sbr->spectrum_params.bs_alter_scale = get_bits1(gb);
224
80.3k
        sbr->spectrum_params.bs_noise_bands = get_bits(gb, 2);
225
80.8k
    } else {
226
80.8k
        sbr->spectrum_params.bs_freq_scale  = 2;
227
80.8k
        sbr->spectrum_params.bs_alter_scale = 1;
228
80.8k
        sbr->spectrum_params.bs_noise_bands = 2;
229
80.8k
    }
230
231
    // Check if spectrum parameters changed
232
161k
    if (memcmp(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters)))
233
127k
        sbr->reset = 1;
234
235
161k
    if (bs_header_extra_2) {
236
66.8k
        sbr->bs_limiter_bands  = get_bits(gb, 2);
237
66.8k
        sbr->bs_limiter_gains  = get_bits(gb, 2);
238
66.8k
        sbr->bs_interpol_freq  = get_bits1(gb);
239
66.8k
        sbr->bs_smoothing_mode = get_bits1(gb);
240
94.3k
    } else {
241
94.3k
        sbr->bs_limiter_bands  = 2;
242
94.3k
        sbr->bs_limiter_gains  = 2;
243
94.3k
        sbr->bs_interpol_freq  = 1;
244
94.3k
        sbr->bs_smoothing_mode = 1;
245
94.3k
    }
246
247
161k
    if (sbr->bs_limiter_bands != old_bs_limiter_bands && !sbr->reset)
248
1.58k
        sbr_make_f_tablelim(sbr);
249
250
161k
    return get_bits_count(gb) - cnt;
251
161k
}
252
253
static int array_min_int16(const int16_t *array, int nel)
254
168k
{
255
168k
    int i, min = array[0];
256
860k
    for (i = 1; i < nel; i++)
257
691k
        min = FFMIN(array[i], min);
258
168k
    return min;
259
168k
}
aacsbr.c:array_min_int16
Line
Count
Source
254
114k
{
255
114k
    int i, min = array[0];
256
546k
    for (i = 1; i < nel; i++)
257
431k
        min = FFMIN(array[i], min);
258
114k
    return min;
259
114k
}
aacsbr_fixed.c:array_min_int16
Line
Count
Source
254
53.5k
{
255
53.5k
    int i, min = array[0];
256
313k
    for (i = 1; i < nel; i++)
257
260k
        min = FFMIN(array[i], min);
258
53.5k
    return min;
259
53.5k
}
260
261
static int check_n_master(AVCodecContext *avctx, int n_master, int bs_xover_band)
262
377k
{
263
    // Requirements (14496-3 sp04 p205)
264
377k
    if (n_master <= 0) {
265
812
        av_log(avctx, AV_LOG_ERROR, "Invalid n_master: %d\n", n_master);
266
812
        return -1;
267
812
    }
268
377k
    if (bs_xover_band >= n_master) {
269
5.34k
        av_log(avctx, AV_LOG_ERROR,
270
5.34k
               "Invalid bitstream, crossover band index beyond array bounds: %d\n",
271
5.34k
               bs_xover_band);
272
5.34k
        return -1;
273
5.34k
    }
274
371k
    return 0;
275
377k
}
aacsbr.c:check_n_master
Line
Count
Source
262
258k
{
263
    // Requirements (14496-3 sp04 p205)
264
258k
    if (n_master <= 0) {
265
587
        av_log(avctx, AV_LOG_ERROR, "Invalid n_master: %d\n", n_master);
266
587
        return -1;
267
587
    }
268
257k
    if (bs_xover_band >= n_master) {
269
3.88k
        av_log(avctx, AV_LOG_ERROR,
270
3.88k
               "Invalid bitstream, crossover band index beyond array bounds: %d\n",
271
3.88k
               bs_xover_band);
272
3.88k
        return -1;
273
3.88k
    }
274
253k
    return 0;
275
257k
}
aacsbr_fixed.c:check_n_master
Line
Count
Source
262
119k
{
263
    // Requirements (14496-3 sp04 p205)
264
119k
    if (n_master <= 0) {
265
225
        av_log(avctx, AV_LOG_ERROR, "Invalid n_master: %d\n", n_master);
266
225
        return -1;
267
225
    }
268
119k
    if (bs_xover_band >= n_master) {
269
1.46k
        av_log(avctx, AV_LOG_ERROR,
270
1.46k
               "Invalid bitstream, crossover band index beyond array bounds: %d\n",
271
1.46k
               bs_xover_band);
272
1.46k
        return -1;
273
1.46k
    }
274
118k
    return 0;
275
119k
}
276
277
/// Master Frequency Band Table (14496-3 sp04 p194)
278
static int sbr_make_f_master(AACDecContext *ac, SpectralBandReplication *sbr,
279
                             SpectrumParameters *spectrum)
280
447k
{
281
447k
    unsigned int temp, max_qmf_subbands = 0;
282
447k
    unsigned int start_min, stop_min;
283
447k
    int k;
284
447k
    const int8_t *sbr_offset_ptr;
285
447k
    int16_t stop_dk[13];
286
287
447k
    switch (sbr->sample_rate) {
288
18.9k
    case 16000:
289
18.9k
        sbr_offset_ptr = sbr_offset[0];
290
18.9k
        break;
291
96.5k
    case 22050:
292
96.5k
        sbr_offset_ptr = sbr_offset[1];
293
96.5k
        break;
294
61.5k
    case 24000:
295
61.5k
        sbr_offset_ptr = sbr_offset[2];
296
61.5k
        break;
297
117k
    case 32000:
298
117k
        sbr_offset_ptr = sbr_offset[3];
299
117k
        break;
300
86.9k
    case 44100: case 48000: case 64000:
301
86.9k
        sbr_offset_ptr = sbr_offset[4];
302
86.9k
        break;
303
46.7k
    case 88200: case 96000: case 128000: case 176400: case 192000:
304
46.7k
        sbr_offset_ptr = sbr_offset[5];
305
46.7k
        break;
306
18.6k
    default:
307
18.6k
        av_log(ac->avctx, AV_LOG_ERROR,
308
18.6k
               "Unsupported sample rate for SBR: %d\n", sbr->sample_rate);
309
18.6k
        return -1;
310
447k
    }
311
312
428k
    if (sbr->sample_rate < 32000) {
313
177k
        temp = 3000;
314
251k
    } else if (sbr->sample_rate < 64000) {
315
199k
        temp = 4000;
316
199k
    } else
317
51.7k
        temp = 5000;
318
319
428k
    start_min = ((temp << 7) + (sbr->sample_rate >> 1)) / sbr->sample_rate;
320
428k
    stop_min  = ((temp << 8) + (sbr->sample_rate >> 1)) / sbr->sample_rate;
321
322
428k
    sbr->k[0] = start_min + sbr_offset_ptr[spectrum->bs_start_freq];
323
324
428k
    if (spectrum->bs_stop_freq < 14) {
325
398k
        sbr->k[2] = stop_min;
326
398k
        make_bands(stop_dk, stop_min, 64, 13);
327
398k
        AV_QSORT(stop_dk, 13, int16_t, qsort_comparison_function_int16);
328
3.73M
        for (k = 0; k < spectrum->bs_stop_freq; k++)
329
3.33M
            sbr->k[2] += stop_dk[k];
330
398k
    } else if (spectrum->bs_stop_freq == 14) {
331
21.2k
        sbr->k[2] = 2*sbr->k[0];
332
21.2k
    } else if (spectrum->bs_stop_freq == 15) {
333
8.99k
        sbr->k[2] = 3*sbr->k[0];
334
8.99k
    } else {
335
0
        av_log(ac->avctx, AV_LOG_ERROR,
336
0
               "Invalid bs_stop_freq: %d\n", spectrum->bs_stop_freq);
337
0
        return -1;
338
0
    }
339
428k
    sbr->k[2] = FFMIN(64, sbr->k[2]);
340
341
    // Requirements (14496-3 sp04 p205)
342
428k
    if (sbr->sample_rate <= 32000) {
343
294k
        max_qmf_subbands = 48;
344
294k
    } else if (sbr->sample_rate == 44100) {
345
31.6k
        max_qmf_subbands = 35;
346
102k
    } else if (sbr->sample_rate >= 48000)
347
102k
        max_qmf_subbands = 32;
348
0
    else
349
0
        av_assert0(0);
350
351
428k
    if (sbr->k[2] - sbr->k[0] > max_qmf_subbands) {
352
38.4k
        av_log(ac->avctx, AV_LOG_ERROR,
353
38.4k
               "Invalid bitstream, too many QMF subbands: %d\n", sbr->k[2] - sbr->k[0]);
354
38.4k
        return -1;
355
38.4k
    }
356
357
390k
    if (!spectrum->bs_freq_scale) {
358
130k
        int dk, k2diff;
359
360
130k
        dk = spectrum->bs_alter_scale + 1;
361
130k
        sbr->n_master = ((sbr->k[2] - sbr->k[0] + (dk&2)) >> dk) << 1;
362
130k
        if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band))
363
2.68k
            return -1;
364
365
4.24M
        for (k = 1; k <= sbr->n_master; k++)
366
4.11M
            sbr->f_master[k] = dk;
367
368
127k
        k2diff = sbr->k[2] - sbr->k[0] - sbr->n_master * dk;
369
127k
        if (k2diff < 0) {
370
5.85k
            sbr->f_master[1]--;
371
5.85k
            sbr->f_master[2]-= (k2diff < -1);
372
121k
        } else if (k2diff) {
373
71.5k
            sbr->f_master[sbr->n_master]++;
374
71.5k
        }
375
376
127k
        sbr->f_master[0] = sbr->k[0];
377
4.24M
        for (k = 1; k <= sbr->n_master; k++)
378
4.11M
            sbr->f_master[k] += sbr->f_master[k - 1];
379
380
259k
    } else {
381
259k
        int half_bands = 7 - spectrum->bs_freq_scale;      // bs_freq_scale  = {1,2,3}
382
259k
        int two_regions, num_bands_0;
383
259k
        int vdk0_max, vdk1_min;
384
259k
        int16_t vk0[49];
385
#if USE_FIXED
386
        int tmp, nz = 0;
387
#endif /* USE_FIXED */
388
389
259k
        if (49 * sbr->k[2] > 110 * sbr->k[0]) {
390
178k
            two_regions = 1;
391
178k
            sbr->k[1] = 2 * sbr->k[0];
392
178k
        } else {
393
81.4k
            two_regions = 0;
394
81.4k
            sbr->k[1] = sbr->k[2];
395
81.4k
        }
396
397
#if USE_FIXED
398
        tmp = (sbr->k[1] << 23) / sbr->k[0];
399
742k
        while (tmp < 0x40000000) {
400
639k
          tmp <<= 1;
401
639k
          nz++;
402
639k
        }
403
        tmp = fixed_log(tmp - 0x80000000);
404
        tmp = (int)(((int64_t)tmp * CONST_RECIP_LN2 + 0x20000000) >> 30);
405
        tmp = (((tmp + 0x80) >> 8) + ((8 - nz) << 23)) * half_bands;
406
        num_bands_0 = ((tmp + 0x400000) >> 23) * 2;
407
#else
408
        num_bands_0 = lrintf(half_bands * log2f(sbr->k[1] / (float)sbr->k[0])) * 2;
409
#endif /* USE_FIXED */
410
411
259k
        if (num_bands_0 <= 0) { // Requirements (14496-3 sp04 p205)
412
927
            av_log(ac->avctx, AV_LOG_ERROR, "Invalid num_bands_0: %d\n", num_bands_0);
413
927
            return -1;
414
927
        }
415
416
258k
        vk0[0] = 0;
417
418
258k
        make_bands(vk0+1, sbr->k[0], sbr->k[1], num_bands_0);
419
420
258k
        AV_QSORT(vk0 + 1, num_bands_0, int16_t, qsort_comparison_function_int16);
421
258k
        vdk0_max = vk0[num_bands_0];
422
423
258k
        vk0[0] = sbr->k[0];
424
2.74M
        for (k = 1; k <= num_bands_0; k++) {
425
2.49M
            if (vk0[k] <= 0) { // Requirements (14496-3 sp04 p205)
426
11.2k
                av_log(ac->avctx, AV_LOG_ERROR, "Invalid vDk0[%d]: %d\n", k, vk0[k]);
427
11.2k
                return -1;
428
11.2k
            }
429
2.48M
            vk0[k] += vk0[k-1];
430
2.48M
        }
431
432
247k
        if (two_regions) {
433
168k
            int16_t vk1[49];
434
#if USE_FIXED
435
            int num_bands_1;
436
437
            tmp = (sbr->k[2] << 23) / sbr->k[1];
438
            nz = 0;
439
418k
            while (tmp < 0x40000000) {
440
364k
              tmp <<= 1;
441
364k
              nz++;
442
364k
            }
443
            tmp = fixed_log(tmp - 0x80000000);
444
            tmp = (int)(((int64_t)tmp * CONST_RECIP_LN2 + 0x20000000) >> 30);
445
            tmp = (((tmp + 0x80) >> 8) + ((8 - nz) << 23)) * half_bands;
446
53.5k
            if (spectrum->bs_alter_scale)
447
25.3k
                tmp = (int)(((int64_t)tmp * CONST_076923 + 0x40000000) >> 31);
448
            num_bands_1 = ((tmp + 0x400000) >> 23) * 2;
449
#else
450
114k
            float invwarp = spectrum->bs_alter_scale ? 0.76923076923076923077f
451
83.7k
                                                     : 1.0f; // bs_alter_scale = {0,1}
452
            int num_bands_1 = lrintf(half_bands * invwarp *
453
                                     log2f(sbr->k[2] / (float)sbr->k[1])) * 2;
454
#endif /* USE_FIXED */
455
168k
            make_bands(vk1+1, sbr->k[1], sbr->k[2], num_bands_1);
456
457
168k
            vdk1_min = array_min_int16(vk1 + 1, num_bands_1);
458
459
168k
            if (vdk1_min < vdk0_max) {
460
13.3k
                int change;
461
13.3k
                AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16);
462
13.3k
                change = FFMIN(vdk0_max - vk1[1], (vk1[num_bands_1] - vk1[1]) >> 1);
463
13.3k
                vk1[1]           += change;
464
13.3k
                vk1[num_bands_1] -= change;
465
13.3k
            }
466
467
168k
            AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16);
468
469
168k
            vk1[0] = sbr->k[1];
470
1.02M
            for (k = 1; k <= num_bands_1; k++) {
471
860k
                if (vk1[k] <= 0) { // Requirements (14496-3 sp04 p205)
472
0
                    av_log(ac->avctx, AV_LOG_ERROR, "Invalid vDk1[%d]: %d\n", k, vk1[k]);
473
0
                    return -1;
474
0
                }
475
860k
                vk1[k] += vk1[k-1];
476
860k
            }
477
478
168k
            sbr->n_master = num_bands_0 + num_bands_1;
479
168k
            if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band))
480
74
                return -1;
481
168k
            memcpy(&sbr->f_master[0],               vk0,
482
168k
                   (num_bands_0 + 1) * sizeof(sbr->f_master[0]));
483
168k
            memcpy(&sbr->f_master[num_bands_0 + 1], vk1 + 1,
484
168k
                    num_bands_1      * sizeof(sbr->f_master[0]));
485
486
168k
        } else {
487
79.7k
            sbr->n_master = num_bands_0;
488
79.7k
            if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band))
489
3.40k
                return -1;
490
76.3k
            memcpy(sbr->f_master, vk0, (num_bands_0 + 1) * sizeof(sbr->f_master[0]));
491
76.3k
        }
492
247k
    }
493
494
371k
    return 0;
495
390k
}
aacsbr.c:sbr_make_f_master
Line
Count
Source
280
320k
{
281
320k
    unsigned int temp, max_qmf_subbands = 0;
282
320k
    unsigned int start_min, stop_min;
283
320k
    int k;
284
320k
    const int8_t *sbr_offset_ptr;
285
320k
    int16_t stop_dk[13];
286
287
320k
    switch (sbr->sample_rate) {
288
9.80k
    case 16000:
289
9.80k
        sbr_offset_ptr = sbr_offset[0];
290
9.80k
        break;
291
84.1k
    case 22050:
292
84.1k
        sbr_offset_ptr = sbr_offset[1];
293
84.1k
        break;
294
39.5k
    case 24000:
295
39.5k
        sbr_offset_ptr = sbr_offset[2];
296
39.5k
        break;
297
73.9k
    case 32000:
298
73.9k
        sbr_offset_ptr = sbr_offset[3];
299
73.9k
        break;
300
60.7k
    case 44100: case 48000: case 64000:
301
60.7k
        sbr_offset_ptr = sbr_offset[4];
302
60.7k
        break;
303
34.9k
    case 88200: case 96000: case 128000: case 176400: case 192000:
304
34.9k
        sbr_offset_ptr = sbr_offset[5];
305
34.9k
        break;
306
16.9k
    default:
307
16.9k
        av_log(ac->avctx, AV_LOG_ERROR,
308
16.9k
               "Unsupported sample rate for SBR: %d\n", sbr->sample_rate);
309
16.9k
        return -1;
310
320k
    }
311
312
303k
    if (sbr->sample_rate < 32000) {
313
133k
        temp = 3000;
314
169k
    } else if (sbr->sample_rate < 64000) {
315
132k
        temp = 4000;
316
132k
    } else
317
36.6k
        temp = 5000;
318
319
303k
    start_min = ((temp << 7) + (sbr->sample_rate >> 1)) / sbr->sample_rate;
320
303k
    stop_min  = ((temp << 8) + (sbr->sample_rate >> 1)) / sbr->sample_rate;
321
322
303k
    sbr->k[0] = start_min + sbr_offset_ptr[spectrum->bs_start_freq];
323
324
303k
    if (spectrum->bs_stop_freq < 14) {
325
290k
        sbr->k[2] = stop_min;
326
290k
        make_bands(stop_dk, stop_min, 64, 13);
327
290k
        AV_QSORT(stop_dk, 13, int16_t, qsort_comparison_function_int16);
328
2.92M
        for (k = 0; k < spectrum->bs_stop_freq; k++)
329
2.63M
            sbr->k[2] += stop_dk[k];
330
290k
    } else if (spectrum->bs_stop_freq == 14) {
331
6.14k
        sbr->k[2] = 2*sbr->k[0];
332
6.89k
    } else if (spectrum->bs_stop_freq == 15) {
333
6.89k
        sbr->k[2] = 3*sbr->k[0];
334
6.89k
    } else {
335
0
        av_log(ac->avctx, AV_LOG_ERROR,
336
0
               "Invalid bs_stop_freq: %d\n", spectrum->bs_stop_freq);
337
0
        return -1;
338
0
    }
339
303k
    sbr->k[2] = FFMIN(64, sbr->k[2]);
340
341
    // Requirements (14496-3 sp04 p205)
342
303k
    if (sbr->sample_rate <= 32000) {
343
207k
        max_qmf_subbands = 48;
344
207k
    } else if (sbr->sample_rate == 44100) {
345
10.1k
        max_qmf_subbands = 35;
346
85.4k
    } else if (sbr->sample_rate >= 48000)
347
85.4k
        max_qmf_subbands = 32;
348
0
    else
349
0
        av_assert0(0);
350
351
303k
    if (sbr->k[2] - sbr->k[0] > max_qmf_subbands) {
352
36.8k
        av_log(ac->avctx, AV_LOG_ERROR,
353
36.8k
               "Invalid bitstream, too many QMF subbands: %d\n", sbr->k[2] - sbr->k[0]);
354
36.8k
        return -1;
355
36.8k
    }
356
357
266k
    if (!spectrum->bs_freq_scale) {
358
109k
        int dk, k2diff;
359
360
109k
        dk = spectrum->bs_alter_scale + 1;
361
109k
        sbr->n_master = ((sbr->k[2] - sbr->k[0] + (dk&2)) >> dk) << 1;
362
109k
        if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band))
363
2.23k
            return -1;
364
365
3.68M
        for (k = 1; k <= sbr->n_master; k++)
366
3.57M
            sbr->f_master[k] = dk;
367
368
107k
        k2diff = sbr->k[2] - sbr->k[0] - sbr->n_master * dk;
369
107k
        if (k2diff < 0) {
370
3.72k
            sbr->f_master[1]--;
371
3.72k
            sbr->f_master[2]-= (k2diff < -1);
372
103k
        } else if (k2diff) {
373
64.6k
            sbr->f_master[sbr->n_master]++;
374
64.6k
        }
375
376
107k
        sbr->f_master[0] = sbr->k[0];
377
3.68M
        for (k = 1; k <= sbr->n_master; k++)
378
3.57M
            sbr->f_master[k] += sbr->f_master[k - 1];
379
380
156k
    } else {
381
156k
        int half_bands = 7 - spectrum->bs_freq_scale;      // bs_freq_scale  = {1,2,3}
382
156k
        int two_regions, num_bands_0;
383
156k
        int vdk0_max, vdk1_min;
384
156k
        int16_t vk0[49];
385
#if USE_FIXED
386
        int tmp, nz = 0;
387
#endif /* USE_FIXED */
388
389
156k
        if (49 * sbr->k[2] > 110 * sbr->k[0]) {
390
121k
            two_regions = 1;
391
121k
            sbr->k[1] = 2 * sbr->k[0];
392
121k
        } else {
393
35.1k
            two_regions = 0;
394
35.1k
            sbr->k[1] = sbr->k[2];
395
35.1k
        }
396
397
#if USE_FIXED
398
        tmp = (sbr->k[1] << 23) / sbr->k[0];
399
        while (tmp < 0x40000000) {
400
          tmp <<= 1;
401
          nz++;
402
        }
403
        tmp = fixed_log(tmp - 0x80000000);
404
        tmp = (int)(((int64_t)tmp * CONST_RECIP_LN2 + 0x20000000) >> 30);
405
        tmp = (((tmp + 0x80) >> 8) + ((8 - nz) << 23)) * half_bands;
406
        num_bands_0 = ((tmp + 0x400000) >> 23) * 2;
407
#else
408
156k
        num_bands_0 = lrintf(half_bands * log2f(sbr->k[1] / (float)sbr->k[0])) * 2;
409
156k
#endif /* USE_FIXED */
410
411
156k
        if (num_bands_0 <= 0) { // Requirements (14496-3 sp04 p205)
412
601
            av_log(ac->avctx, AV_LOG_ERROR, "Invalid num_bands_0: %d\n", num_bands_0);
413
601
            return -1;
414
601
        }
415
416
156k
        vk0[0] = 0;
417
418
156k
        make_bands(vk0+1, sbr->k[0], sbr->k[1], num_bands_0);
419
420
156k
        AV_QSORT(vk0 + 1, num_bands_0, int16_t, qsort_comparison_function_int16);
421
156k
        vdk0_max = vk0[num_bands_0];
422
423
156k
        vk0[0] = sbr->k[0];
424
1.76M
        for (k = 1; k <= num_bands_0; k++) {
425
1.61M
            if (vk0[k] <= 0) { // Requirements (14496-3 sp04 p205)
426
7.70k
                av_log(ac->avctx, AV_LOG_ERROR, "Invalid vDk0[%d]: %d\n", k, vk0[k]);
427
7.70k
                return -1;
428
7.70k
            }
429
1.60M
            vk0[k] += vk0[k-1];
430
1.60M
        }
431
432
148k
        if (two_regions) {
433
114k
            int16_t vk1[49];
434
#if USE_FIXED
435
            int num_bands_1;
436
437
            tmp = (sbr->k[2] << 23) / sbr->k[1];
438
            nz = 0;
439
            while (tmp < 0x40000000) {
440
              tmp <<= 1;
441
              nz++;
442
            }
443
            tmp = fixed_log(tmp - 0x80000000);
444
            tmp = (int)(((int64_t)tmp * CONST_RECIP_LN2 + 0x20000000) >> 30);
445
            tmp = (((tmp + 0x80) >> 8) + ((8 - nz) << 23)) * half_bands;
446
            if (spectrum->bs_alter_scale)
447
                tmp = (int)(((int64_t)tmp * CONST_076923 + 0x40000000) >> 31);
448
            num_bands_1 = ((tmp + 0x400000) >> 23) * 2;
449
#else
450
114k
            float invwarp = spectrum->bs_alter_scale ? 0.76923076923076923077f
451
114k
                                                     : 1.0f; // bs_alter_scale = {0,1}
452
114k
            int num_bands_1 = lrintf(half_bands * invwarp *
453
114k
                                     log2f(sbr->k[2] / (float)sbr->k[1])) * 2;
454
114k
#endif /* USE_FIXED */
455
114k
            make_bands(vk1+1, sbr->k[1], sbr->k[2], num_bands_1);
456
457
114k
            vdk1_min = array_min_int16(vk1 + 1, num_bands_1);
458
459
114k
            if (vdk1_min < vdk0_max) {
460
8.06k
                int change;
461
8.06k
                AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16);
462
8.06k
                change = FFMIN(vdk0_max - vk1[1], (vk1[num_bands_1] - vk1[1]) >> 1);
463
8.06k
                vk1[1]           += change;
464
8.06k
                vk1[num_bands_1] -= change;
465
8.06k
            }
466
467
114k
            AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16);
468
469
114k
            vk1[0] = sbr->k[1];
470
660k
            for (k = 1; k <= num_bands_1; k++) {
471
546k
                if (vk1[k] <= 0) { // Requirements (14496-3 sp04 p205)
472
0
                    av_log(ac->avctx, AV_LOG_ERROR, "Invalid vDk1[%d]: %d\n", k, vk1[k]);
473
0
                    return -1;
474
0
                }
475
546k
                vk1[k] += vk1[k-1];
476
546k
            }
477
478
114k
            sbr->n_master = num_bands_0 + num_bands_1;
479
114k
            if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band))
480
74
                return -1;
481
114k
            memcpy(&sbr->f_master[0],               vk0,
482
114k
                   (num_bands_0 + 1) * sizeof(sbr->f_master[0]));
483
114k
            memcpy(&sbr->f_master[num_bands_0 + 1], vk1 + 1,
484
114k
                    num_bands_1      * sizeof(sbr->f_master[0]));
485
486
114k
        } else {
487
33.8k
            sbr->n_master = num_bands_0;
488
33.8k
            if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band))
489
2.15k
                return -1;
490
31.6k
            memcpy(sbr->f_master, vk0, (num_bands_0 + 1) * sizeof(sbr->f_master[0]));
491
31.6k
        }
492
148k
    }
493
494
253k
    return 0;
495
266k
}
aacsbr_fixed.c:sbr_make_f_master
Line
Count
Source
280
127k
{
281
127k
    unsigned int temp, max_qmf_subbands = 0;
282
127k
    unsigned int start_min, stop_min;
283
127k
    int k;
284
127k
    const int8_t *sbr_offset_ptr;
285
127k
    int16_t stop_dk[13];
286
287
127k
    switch (sbr->sample_rate) {
288
9.10k
    case 16000:
289
9.10k
        sbr_offset_ptr = sbr_offset[0];
290
9.10k
        break;
291
12.4k
    case 22050:
292
12.4k
        sbr_offset_ptr = sbr_offset[1];
293
12.4k
        break;
294
22.0k
    case 24000:
295
22.0k
        sbr_offset_ptr = sbr_offset[2];
296
22.0k
        break;
297
43.8k
    case 32000:
298
43.8k
        sbr_offset_ptr = sbr_offset[3];
299
43.8k
        break;
300
26.1k
    case 44100: case 48000: case 64000:
301
26.1k
        sbr_offset_ptr = sbr_offset[4];
302
26.1k
        break;
303
11.8k
    case 88200: case 96000: case 128000: case 176400: case 192000:
304
11.8k
        sbr_offset_ptr = sbr_offset[5];
305
11.8k
        break;
306
1.71k
    default:
307
1.71k
        av_log(ac->avctx, AV_LOG_ERROR,
308
1.71k
               "Unsupported sample rate for SBR: %d\n", sbr->sample_rate);
309
1.71k
        return -1;
310
127k
    }
311
312
125k
    if (sbr->sample_rate < 32000) {
313
43.5k
        temp = 3000;
314
81.8k
    } else if (sbr->sample_rate < 64000) {
315
66.8k
        temp = 4000;
316
66.8k
    } else
317
15.0k
        temp = 5000;
318
319
125k
    start_min = ((temp << 7) + (sbr->sample_rate >> 1)) / sbr->sample_rate;
320
125k
    stop_min  = ((temp << 8) + (sbr->sample_rate >> 1)) / sbr->sample_rate;
321
322
125k
    sbr->k[0] = start_min + sbr_offset_ptr[spectrum->bs_start_freq];
323
324
125k
    if (spectrum->bs_stop_freq < 14) {
325
108k
        sbr->k[2] = stop_min;
326
108k
        make_bands(stop_dk, stop_min, 64, 13);
327
108k
        AV_QSORT(stop_dk, 13, int16_t, qsort_comparison_function_int16);
328
804k
        for (k = 0; k < spectrum->bs_stop_freq; k++)
329
695k
            sbr->k[2] += stop_dk[k];
330
108k
    } else if (spectrum->bs_stop_freq == 14) {
331
15.0k
        sbr->k[2] = 2*sbr->k[0];
332
15.0k
    } else if (spectrum->bs_stop_freq == 15) {
333
2.10k
        sbr->k[2] = 3*sbr->k[0];
334
2.10k
    } else {
335
0
        av_log(ac->avctx, AV_LOG_ERROR,
336
0
               "Invalid bs_stop_freq: %d\n", spectrum->bs_stop_freq);
337
0
        return -1;
338
0
    }
339
125k
    sbr->k[2] = FFMIN(64, sbr->k[2]);
340
341
    // Requirements (14496-3 sp04 p205)
342
125k
    if (sbr->sample_rate <= 32000) {
343
87.3k
        max_qmf_subbands = 48;
344
87.3k
    } else if (sbr->sample_rate == 44100) {
345
21.4k
        max_qmf_subbands = 35;
346
21.4k
    } else if (sbr->sample_rate >= 48000)
347
16.5k
        max_qmf_subbands = 32;
348
0
    else
349
0
        av_assert0(0);
350
351
125k
    if (sbr->k[2] - sbr->k[0] > max_qmf_subbands) {
352
1.65k
        av_log(ac->avctx, AV_LOG_ERROR,
353
1.65k
               "Invalid bitstream, too many QMF subbands: %d\n", sbr->k[2] - sbr->k[0]);
354
1.65k
        return -1;
355
1.65k
    }
356
357
123k
    if (!spectrum->bs_freq_scale) {
358
20.4k
        int dk, k2diff;
359
360
20.4k
        dk = spectrum->bs_alter_scale + 1;
361
20.4k
        sbr->n_master = ((sbr->k[2] - sbr->k[0] + (dk&2)) >> dk) << 1;
362
20.4k
        if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band))
363
448
            return -1;
364
365
555k
        for (k = 1; k <= sbr->n_master; k++)
366
535k
            sbr->f_master[k] = dk;
367
368
20.0k
        k2diff = sbr->k[2] - sbr->k[0] - sbr->n_master * dk;
369
20.0k
        if (k2diff < 0) {
370
2.13k
            sbr->f_master[1]--;
371
2.13k
            sbr->f_master[2]-= (k2diff < -1);
372
17.8k
        } else if (k2diff) {
373
6.93k
            sbr->f_master[sbr->n_master]++;
374
6.93k
        }
375
376
20.0k
        sbr->f_master[0] = sbr->k[0];
377
555k
        for (k = 1; k <= sbr->n_master; k++)
378
535k
            sbr->f_master[k] += sbr->f_master[k - 1];
379
380
103k
    } else {
381
103k
        int half_bands = 7 - spectrum->bs_freq_scale;      // bs_freq_scale  = {1,2,3}
382
103k
        int two_regions, num_bands_0;
383
103k
        int vdk0_max, vdk1_min;
384
103k
        int16_t vk0[49];
385
103k
#if USE_FIXED
386
103k
        int tmp, nz = 0;
387
103k
#endif /* USE_FIXED */
388
389
103k
        if (49 * sbr->k[2] > 110 * sbr->k[0]) {
390
57.0k
            two_regions = 1;
391
57.0k
            sbr->k[1] = 2 * sbr->k[0];
392
57.0k
        } else {
393
46.2k
            two_regions = 0;
394
46.2k
            sbr->k[1] = sbr->k[2];
395
46.2k
        }
396
397
103k
#if USE_FIXED
398
103k
        tmp = (sbr->k[1] << 23) / sbr->k[0];
399
742k
        while (tmp < 0x40000000) {
400
639k
          tmp <<= 1;
401
639k
          nz++;
402
639k
        }
403
103k
        tmp = fixed_log(tmp - 0x80000000);
404
103k
        tmp = (int)(((int64_t)tmp * CONST_RECIP_LN2 + 0x20000000) >> 30);
405
103k
        tmp = (((tmp + 0x80) >> 8) + ((8 - nz) << 23)) * half_bands;
406
103k
        num_bands_0 = ((tmp + 0x400000) >> 23) * 2;
407
#else
408
        num_bands_0 = lrintf(half_bands * log2f(sbr->k[1] / (float)sbr->k[0])) * 2;
409
#endif /* USE_FIXED */
410
411
103k
        if (num_bands_0 <= 0) { // Requirements (14496-3 sp04 p205)
412
326
            av_log(ac->avctx, AV_LOG_ERROR, "Invalid num_bands_0: %d\n", num_bands_0);
413
326
            return -1;
414
326
        }
415
416
102k
        vk0[0] = 0;
417
418
102k
        make_bands(vk0+1, sbr->k[0], sbr->k[1], num_bands_0);
419
420
102k
        AV_QSORT(vk0 + 1, num_bands_0, int16_t, qsort_comparison_function_int16);
421
102k
        vdk0_max = vk0[num_bands_0];
422
423
102k
        vk0[0] = sbr->k[0];
424
981k
        for (k = 1; k <= num_bands_0; k++) {
425
882k
            if (vk0[k] <= 0) { // Requirements (14496-3 sp04 p205)
426
3.49k
                av_log(ac->avctx, AV_LOG_ERROR, "Invalid vDk0[%d]: %d\n", k, vk0[k]);
427
3.49k
                return -1;
428
3.49k
            }
429
878k
            vk0[k] += vk0[k-1];
430
878k
        }
431
432
99.4k
        if (two_regions) {
433
53.5k
            int16_t vk1[49];
434
53.5k
#if USE_FIXED
435
53.5k
            int num_bands_1;
436
437
53.5k
            tmp = (sbr->k[2] << 23) / sbr->k[1];
438
53.5k
            nz = 0;
439
418k
            while (tmp < 0x40000000) {
440
364k
              tmp <<= 1;
441
364k
              nz++;
442
364k
            }
443
53.5k
            tmp = fixed_log(tmp - 0x80000000);
444
53.5k
            tmp = (int)(((int64_t)tmp * CONST_RECIP_LN2 + 0x20000000) >> 30);
445
53.5k
            tmp = (((tmp + 0x80) >> 8) + ((8 - nz) << 23)) * half_bands;
446
53.5k
            if (spectrum->bs_alter_scale)
447
25.3k
                tmp = (int)(((int64_t)tmp * CONST_076923 + 0x40000000) >> 31);
448
53.5k
            num_bands_1 = ((tmp + 0x400000) >> 23) * 2;
449
#else
450
            float invwarp = spectrum->bs_alter_scale ? 0.76923076923076923077f
451
                                                     : 1.0f; // bs_alter_scale = {0,1}
452
            int num_bands_1 = lrintf(half_bands * invwarp *
453
                                     log2f(sbr->k[2] / (float)sbr->k[1])) * 2;
454
#endif /* USE_FIXED */
455
53.5k
            make_bands(vk1+1, sbr->k[1], sbr->k[2], num_bands_1);
456
457
53.5k
            vdk1_min = array_min_int16(vk1 + 1, num_bands_1);
458
459
53.5k
            if (vdk1_min < vdk0_max) {
460
5.30k
                int change;
461
5.30k
                AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16);
462
5.30k
                change = FFMIN(vdk0_max - vk1[1], (vk1[num_bands_1] - vk1[1]) >> 1);
463
5.30k
                vk1[1]           += change;
464
5.30k
                vk1[num_bands_1] -= change;
465
5.30k
            }
466
467
53.5k
            AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16);
468
469
53.5k
            vk1[0] = sbr->k[1];
470
367k
            for (k = 1; k <= num_bands_1; k++) {
471
313k
                if (vk1[k] <= 0) { // Requirements (14496-3 sp04 p205)
472
0
                    av_log(ac->avctx, AV_LOG_ERROR, "Invalid vDk1[%d]: %d\n", k, vk1[k]);
473
0
                    return -1;
474
0
                }
475
313k
                vk1[k] += vk1[k-1];
476
313k
            }
477
478
53.5k
            sbr->n_master = num_bands_0 + num_bands_1;
479
53.5k
            if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band))
480
0
                return -1;
481
53.5k
            memcpy(&sbr->f_master[0],               vk0,
482
53.5k
                   (num_bands_0 + 1) * sizeof(sbr->f_master[0]));
483
53.5k
            memcpy(&sbr->f_master[num_bands_0 + 1], vk1 + 1,
484
53.5k
                    num_bands_1      * sizeof(sbr->f_master[0]));
485
486
53.5k
        } else {
487
45.8k
            sbr->n_master = num_bands_0;
488
45.8k
            if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band))
489
1.24k
                return -1;
490
44.6k
            memcpy(sbr->f_master, vk0, (num_bands_0 + 1) * sizeof(sbr->f_master[0]));
491
44.6k
        }
492
99.4k
    }
493
494
118k
    return 0;
495
123k
}
496
497
/// High Frequency Generation - Patch Construction (14496-3 sp04 p216 fig. 4.46)
498
static int sbr_hf_calc_npatches(AACDecContext *ac, SpectralBandReplication *sbr)
499
364k
{
500
364k
    int i, k, last_k = -1, last_msb = -1, sb = 0;
501
364k
    int msb = sbr->k[0];
502
364k
    int usb = sbr->kx[1];
503
364k
    int goal_sb = ((1000 << 11) + (sbr->sample_rate >> 1)) / sbr->sample_rate;
504
505
364k
    sbr->num_patches = 0;
506
507
364k
    if (goal_sb < sbr->kx[1] + sbr->m[1]) {
508
536k
        for (k = 0; sbr->f_master[k] < goal_sb; k++) ;
509
45.5k
    } else
510
318k
        k = sbr->n_master;
511
512
891k
    do {
513
891k
        int odd = 0;
514
891k
        if (k == last_k && msb == last_msb) {
515
870
            av_log(ac->avctx, AV_LOG_ERROR, "patch construction failed\n");
516
870
            return AVERROR_INVALIDDATA;
517
870
        }
518
890k
        last_k = k;
519
890k
        last_msb = msb;
520
5.90M
        for (i = k; i == k || sb > (sbr->k[0] - 1 + msb - odd); i--) {
521
5.01M
            sb = sbr->f_master[i];
522
5.01M
            odd = (sb + sbr->k[0]) & 1;
523
5.01M
        }
524
525
        // Requirements (14496-3 sp04 p205) sets the maximum number of patches to 5.
526
        // After this check the final number of patches can still be six which is
527
        // illegal however the Coding Technologies decoder check stream has a final
528
        // count of 6 patches
529
890k
        if (sbr->num_patches > 5) {
530
5.47k
            av_log(ac->avctx, AV_LOG_ERROR, "Too many patches: %d\n", sbr->num_patches);
531
5.47k
            return -1;
532
5.47k
        }
533
534
885k
        sbr->patch_num_subbands[sbr->num_patches]  = FFMAX(sb - usb, 0);
535
885k
        sbr->patch_start_subband[sbr->num_patches] = sbr->k[0] - odd - sbr->patch_num_subbands[sbr->num_patches];
536
537
885k
        if (sbr->patch_num_subbands[sbr->num_patches] > 0) {
538
856k
            usb = sb;
539
856k
            msb = sb;
540
856k
            sbr->num_patches++;
541
856k
        } else
542
28.8k
            msb = sbr->kx[1];
543
544
885k
        if (sbr->f_master[k] - sb < 3)
545
396k
            k = sbr->n_master;
546
885k
    } while (sb != sbr->kx[1] + sbr->m[1]);
547
548
357k
    if (sbr->num_patches > 1 &&
549
303k
        sbr->patch_num_subbands[sbr->num_patches - 1] < 3)
550
9.11k
        sbr->num_patches--;
551
552
357k
    return 0;
553
364k
}
aacsbr.c:sbr_hf_calc_npatches
Line
Count
Source
499
248k
{
500
248k
    int i, k, last_k = -1, last_msb = -1, sb = 0;
501
248k
    int msb = sbr->k[0];
502
248k
    int usb = sbr->kx[1];
503
248k
    int goal_sb = ((1000 << 11) + (sbr->sample_rate >> 1)) / sbr->sample_rate;
504
505
248k
    sbr->num_patches = 0;
506
507
248k
    if (goal_sb < sbr->kx[1] + sbr->m[1]) {
508
449k
        for (k = 0; sbr->f_master[k] < goal_sb; k++) ;
509
36.5k
    } else
510
211k
        k = sbr->n_master;
511
512
583k
    do {
513
583k
        int odd = 0;
514
583k
        if (k == last_k && msb == last_msb) {
515
599
            av_log(ac->avctx, AV_LOG_ERROR, "patch construction failed\n");
516
599
            return AVERROR_INVALIDDATA;
517
599
        }
518
582k
        last_k = k;
519
582k
        last_msb = msb;
520
4.19M
        for (i = k; i == k || sb > (sbr->k[0] - 1 + msb - odd); i--) {
521
3.61M
            sb = sbr->f_master[i];
522
3.61M
            odd = (sb + sbr->k[0]) & 1;
523
3.61M
        }
524
525
        // Requirements (14496-3 sp04 p205) sets the maximum number of patches to 5.
526
        // After this check the final number of patches can still be six which is
527
        // illegal however the Coding Technologies decoder check stream has a final
528
        // count of 6 patches
529
582k
        if (sbr->num_patches > 5) {
530
441
            av_log(ac->avctx, AV_LOG_ERROR, "Too many patches: %d\n", sbr->num_patches);
531
441
            return -1;
532
441
        }
533
534
582k
        sbr->patch_num_subbands[sbr->num_patches]  = FFMAX(sb - usb, 0);
535
582k
        sbr->patch_start_subband[sbr->num_patches] = sbr->k[0] - odd - sbr->patch_num_subbands[sbr->num_patches];
536
537
582k
        if (sbr->patch_num_subbands[sbr->num_patches] > 0) {
538
572k
            usb = sb;
539
572k
            msb = sb;
540
572k
            sbr->num_patches++;
541
572k
        } else
542
9.73k
            msb = sbr->kx[1];
543
544
582k
        if (sbr->f_master[k] - sb < 3)
545
269k
            k = sbr->n_master;
546
582k
    } while (sb != sbr->kx[1] + sbr->m[1]);
547
548
247k
    if (sbr->num_patches > 1 &&
549
214k
        sbr->patch_num_subbands[sbr->num_patches - 1] < 3)
550
6.59k
        sbr->num_patches--;
551
552
247k
    return 0;
553
248k
}
aacsbr_fixed.c:sbr_hf_calc_npatches
Line
Count
Source
499
115k
{
500
115k
    int i, k, last_k = -1, last_msb = -1, sb = 0;
501
115k
    int msb = sbr->k[0];
502
115k
    int usb = sbr->kx[1];
503
115k
    int goal_sb = ((1000 << 11) + (sbr->sample_rate >> 1)) / sbr->sample_rate;
504
505
115k
    sbr->num_patches = 0;
506
507
115k
    if (goal_sb < sbr->kx[1] + sbr->m[1]) {
508
86.7k
        for (k = 0; sbr->f_master[k] < goal_sb; k++) ;
509
9.05k
    } else
510
106k
        k = sbr->n_master;
511
512
308k
    do {
513
308k
        int odd = 0;
514
308k
        if (k == last_k && msb == last_msb) {
515
271
            av_log(ac->avctx, AV_LOG_ERROR, "patch construction failed\n");
516
271
            return AVERROR_INVALIDDATA;
517
271
        }
518
308k
        last_k = k;
519
308k
        last_msb = msb;
520
1.70M
        for (i = k; i == k || sb > (sbr->k[0] - 1 + msb - odd); i--) {
521
1.39M
            sb = sbr->f_master[i];
522
1.39M
            odd = (sb + sbr->k[0]) & 1;
523
1.39M
        }
524
525
        // Requirements (14496-3 sp04 p205) sets the maximum number of patches to 5.
526
        // After this check the final number of patches can still be six which is
527
        // illegal however the Coding Technologies decoder check stream has a final
528
        // count of 6 patches
529
308k
        if (sbr->num_patches > 5) {
530
5.03k
            av_log(ac->avctx, AV_LOG_ERROR, "Too many patches: %d\n", sbr->num_patches);
531
5.03k
            return -1;
532
5.03k
        }
533
534
303k
        sbr->patch_num_subbands[sbr->num_patches]  = FFMAX(sb - usb, 0);
535
303k
        sbr->patch_start_subband[sbr->num_patches] = sbr->k[0] - odd - sbr->patch_num_subbands[sbr->num_patches];
536
537
303k
        if (sbr->patch_num_subbands[sbr->num_patches] > 0) {
538
284k
            usb = sb;
539
284k
            msb = sb;
540
284k
            sbr->num_patches++;
541
284k
        } else
542
19.0k
            msb = sbr->kx[1];
543
544
303k
        if (sbr->f_master[k] - sb < 3)
545
126k
            k = sbr->n_master;
546
303k
    } while (sb != sbr->kx[1] + sbr->m[1]);
547
548
110k
    if (sbr->num_patches > 1 &&
549
89.2k
        sbr->patch_num_subbands[sbr->num_patches - 1] < 3)
550
2.51k
        sbr->num_patches--;
551
552
110k
    return 0;
553
115k
}
554
555
/// Derived Frequency Band Tables (14496-3 sp04 p197)
556
static int sbr_make_f_derived(AACDecContext *ac, SpectralBandReplication *sbr)
557
371k
{
558
371k
    int k, temp;
559
#if USE_FIXED
560
    int nz = 0;
561
#endif /* USE_FIXED */
562
563
371k
    sbr->n[1] = sbr->n_master - sbr->spectrum_params.bs_xover_band;
564
371k
    sbr->n[0] = (sbr->n[1] + 1) >> 1;
565
566
371k
    memcpy(sbr->f_tablehigh, &sbr->f_master[sbr->spectrum_params.bs_xover_band],
567
371k
           (sbr->n[1] + 1) * sizeof(sbr->f_master[0]));
568
371k
    sbr->m[1] = sbr->f_tablehigh[sbr->n[1]] - sbr->f_tablehigh[0];
569
371k
    sbr->kx[1] = sbr->f_tablehigh[0];
570
571
    // Requirements (14496-3 sp04 p205)
572
371k
    if (sbr->kx[1] + sbr->m[1] > 64) {
573
0
        av_log(ac->avctx, AV_LOG_ERROR,
574
0
               "Stop frequency border too high: %d\n", sbr->kx[1] + sbr->m[1]);
575
0
        return -1;
576
0
    }
577
371k
    if (sbr->kx[1] > 32) {
578
6.81k
        av_log(ac->avctx, AV_LOG_ERROR, "Start frequency border too high: %d\n", sbr->kx[1]);
579
6.81k
        return -1;
580
6.81k
    }
581
582
364k
    sbr->f_tablelow[0] = sbr->f_tablehigh[0];
583
364k
    temp = sbr->n[1] & 1;
584
3.56M
    for (k = 1; k <= sbr->n[0]; k++)
585
3.19M
        sbr->f_tablelow[k] = sbr->f_tablehigh[2 * k - temp];
586
#if USE_FIXED
587
    temp = (sbr->k[2] << 23) / sbr->kx[1];
588
854k
    while (temp < 0x40000000) {
589
737k
        temp <<= 1;
590
737k
        nz++;
591
737k
    }
592
    temp = fixed_log(temp - 0x80000000);
593
    temp = (int)(((int64_t)temp * CONST_RECIP_LN2 + 0x20000000) >> 30);
594
    temp = (((temp + 0x80) >> 8) + ((8 - nz) << 23)) * sbr->spectrum_params.bs_noise_bands;
595
596
    sbr->n_q = (temp + 0x400000) >> 23;
597
116k
    if (sbr->n_q < 1)
598
40.4k
        sbr->n_q = 1;
599
#else
600
248k
    sbr->n_q = FFMAX(1, lrintf(sbr->spectrum_params.bs_noise_bands *
601
                               log2f(sbr->k[2] / (float)sbr->kx[1]))); // 0 <= bs_noise_bands <= 3
602
#endif /* USE_FIXED */
603
604
364k
    if (sbr->n_q > 5) {
605
911
        av_log(ac->avctx, AV_LOG_ERROR, "Too many noise floor scale factors: %d\n", sbr->n_q);
606
911
        sbr->n_q = 1;
607
911
        return -1;
608
911
    }
609
610
364k
    sbr->f_tablenoise[0] = sbr->f_tablelow[0];
611
364k
    temp = 0;
612
1.22M
    for (k = 1; k <= sbr->n_q; k++) {
613
858k
        temp += (sbr->n[0] - temp) / (sbr->n_q + 1 - k);
614
858k
        sbr->f_tablenoise[k] = sbr->f_tablelow[temp];
615
858k
    }
616
617
364k
    if (sbr_hf_calc_npatches(ac, sbr) < 0)
618
6.34k
        return -1;
619
620
357k
    sbr_make_f_tablelim(sbr);
621
622
357k
    sbr->data[0].f_indexnoise = 0;
623
357k
    sbr->data[1].f_indexnoise = 0;
624
625
357k
    return 0;
626
364k
}
aacsbr.c:sbr_make_f_derived
Line
Count
Source
557
253k
{
558
253k
    int k, temp;
559
#if USE_FIXED
560
    int nz = 0;
561
#endif /* USE_FIXED */
562
563
253k
    sbr->n[1] = sbr->n_master - sbr->spectrum_params.bs_xover_band;
564
253k
    sbr->n[0] = (sbr->n[1] + 1) >> 1;
565
566
253k
    memcpy(sbr->f_tablehigh, &sbr->f_master[sbr->spectrum_params.bs_xover_band],
567
253k
           (sbr->n[1] + 1) * sizeof(sbr->f_master[0]));
568
253k
    sbr->m[1] = sbr->f_tablehigh[sbr->n[1]] - sbr->f_tablehigh[0];
569
253k
    sbr->kx[1] = sbr->f_tablehigh[0];
570
571
    // Requirements (14496-3 sp04 p205)
572
253k
    if (sbr->kx[1] + sbr->m[1] > 64) {
573
0
        av_log(ac->avctx, AV_LOG_ERROR,
574
0
               "Stop frequency border too high: %d\n", sbr->kx[1] + sbr->m[1]);
575
0
        return -1;
576
0
    }
577
253k
    if (sbr->kx[1] > 32) {
578
5.24k
        av_log(ac->avctx, AV_LOG_ERROR, "Start frequency border too high: %d\n", sbr->kx[1]);
579
5.24k
        return -1;
580
5.24k
    }
581
582
248k
    sbr->f_tablelow[0] = sbr->f_tablehigh[0];
583
248k
    temp = sbr->n[1] & 1;
584
2.71M
    for (k = 1; k <= sbr->n[0]; k++)
585
2.46M
        sbr->f_tablelow[k] = sbr->f_tablehigh[2 * k - temp];
586
#if USE_FIXED
587
    temp = (sbr->k[2] << 23) / sbr->kx[1];
588
    while (temp < 0x40000000) {
589
        temp <<= 1;
590
        nz++;
591
    }
592
    temp = fixed_log(temp - 0x80000000);
593
    temp = (int)(((int64_t)temp * CONST_RECIP_LN2 + 0x20000000) >> 30);
594
    temp = (((temp + 0x80) >> 8) + ((8 - nz) << 23)) * sbr->spectrum_params.bs_noise_bands;
595
596
    sbr->n_q = (temp + 0x400000) >> 23;
597
    if (sbr->n_q < 1)
598
        sbr->n_q = 1;
599
#else
600
248k
    sbr->n_q = FFMAX(1, lrintf(sbr->spectrum_params.bs_noise_bands *
601
248k
                               log2f(sbr->k[2] / (float)sbr->kx[1]))); // 0 <= bs_noise_bands <= 3
602
248k
#endif /* USE_FIXED */
603
604
248k
    if (sbr->n_q > 5) {
605
234
        av_log(ac->avctx, AV_LOG_ERROR, "Too many noise floor scale factors: %d\n", sbr->n_q);
606
234
        sbr->n_q = 1;
607
234
        return -1;
608
234
    }
609
610
248k
    sbr->f_tablenoise[0] = sbr->f_tablelow[0];
611
248k
    temp = 0;
612
886k
    for (k = 1; k <= sbr->n_q; k++) {
613
638k
        temp += (sbr->n[0] - temp) / (sbr->n_q + 1 - k);
614
638k
        sbr->f_tablenoise[k] = sbr->f_tablelow[temp];
615
638k
    }
616
617
248k
    if (sbr_hf_calc_npatches(ac, sbr) < 0)
618
1.04k
        return -1;
619
620
247k
    sbr_make_f_tablelim(sbr);
621
622
247k
    sbr->data[0].f_indexnoise = 0;
623
247k
    sbr->data[1].f_indexnoise = 0;
624
625
247k
    return 0;
626
248k
}
aacsbr_fixed.c:sbr_make_f_derived
Line
Count
Source
557
118k
{
558
118k
    int k, temp;
559
118k
#if USE_FIXED
560
118k
    int nz = 0;
561
118k
#endif /* USE_FIXED */
562
563
118k
    sbr->n[1] = sbr->n_master - sbr->spectrum_params.bs_xover_band;
564
118k
    sbr->n[0] = (sbr->n[1] + 1) >> 1;
565
566
118k
    memcpy(sbr->f_tablehigh, &sbr->f_master[sbr->spectrum_params.bs_xover_band],
567
118k
           (sbr->n[1] + 1) * sizeof(sbr->f_master[0]));
568
118k
    sbr->m[1] = sbr->f_tablehigh[sbr->n[1]] - sbr->f_tablehigh[0];
569
118k
    sbr->kx[1] = sbr->f_tablehigh[0];
570
571
    // Requirements (14496-3 sp04 p205)
572
118k
    if (sbr->kx[1] + sbr->m[1] > 64) {
573
0
        av_log(ac->avctx, AV_LOG_ERROR,
574
0
               "Stop frequency border too high: %d\n", sbr->kx[1] + sbr->m[1]);
575
0
        return -1;
576
0
    }
577
118k
    if (sbr->kx[1] > 32) {
578
1.56k
        av_log(ac->avctx, AV_LOG_ERROR, "Start frequency border too high: %d\n", sbr->kx[1]);
579
1.56k
        return -1;
580
1.56k
    }
581
582
116k
    sbr->f_tablelow[0] = sbr->f_tablehigh[0];
583
116k
    temp = sbr->n[1] & 1;
584
846k
    for (k = 1; k <= sbr->n[0]; k++)
585
729k
        sbr->f_tablelow[k] = sbr->f_tablehigh[2 * k - temp];
586
116k
#if USE_FIXED
587
116k
    temp = (sbr->k[2] << 23) / sbr->kx[1];
588
854k
    while (temp < 0x40000000) {
589
737k
        temp <<= 1;
590
737k
        nz++;
591
737k
    }
592
116k
    temp = fixed_log(temp - 0x80000000);
593
116k
    temp = (int)(((int64_t)temp * CONST_RECIP_LN2 + 0x20000000) >> 30);
594
116k
    temp = (((temp + 0x80) >> 8) + ((8 - nz) << 23)) * sbr->spectrum_params.bs_noise_bands;
595
596
116k
    sbr->n_q = (temp + 0x400000) >> 23;
597
116k
    if (sbr->n_q < 1)
598
40.4k
        sbr->n_q = 1;
599
#else
600
    sbr->n_q = FFMAX(1, lrintf(sbr->spectrum_params.bs_noise_bands *
601
                               log2f(sbr->k[2] / (float)sbr->kx[1]))); // 0 <= bs_noise_bands <= 3
602
#endif /* USE_FIXED */
603
604
116k
    if (sbr->n_q > 5) {
605
677
        av_log(ac->avctx, AV_LOG_ERROR, "Too many noise floor scale factors: %d\n", sbr->n_q);
606
677
        sbr->n_q = 1;
607
677
        return -1;
608
677
    }
609
610
115k
    sbr->f_tablenoise[0] = sbr->f_tablelow[0];
611
115k
    temp = 0;
612
336k
    for (k = 1; k <= sbr->n_q; k++) {
613
220k
        temp += (sbr->n[0] - temp) / (sbr->n_q + 1 - k);
614
220k
        sbr->f_tablenoise[k] = sbr->f_tablelow[temp];
615
220k
    }
616
617
115k
    if (sbr_hf_calc_npatches(ac, sbr) < 0)
618
5.30k
        return -1;
619
620
110k
    sbr_make_f_tablelim(sbr);
621
622
110k
    sbr->data[0].f_indexnoise = 0;
623
110k
    sbr->data[1].f_indexnoise = 0;
624
625
110k
    return 0;
626
115k
}
627
628
static av_always_inline void get_bits1_vector(GetBitContext *gb, uint8_t *vec,
629
                                              int elements)
630
3.40M
{
631
3.40M
    int i;
632
9.52M
    for (i = 0; i < elements; i++) {
633
6.11M
        vec[i] = get_bits1(gb);
634
6.11M
    }
635
3.40M
}
aacsbr.c:get_bits1_vector
Line
Count
Source
630
2.87M
{
631
2.87M
    int i;
632
7.58M
    for (i = 0; i < elements; i++) {
633
4.71M
        vec[i] = get_bits1(gb);
634
4.71M
    }
635
2.87M
}
aacsbr_fixed.c:get_bits1_vector
Line
Count
Source
630
528k
{
631
528k
    int i;
632
1.93M
    for (i = 0; i < elements; i++) {
633
1.40M
        vec[i] = get_bits1(gb);
634
1.40M
    }
635
528k
}
636
637
/** ceil(log2(index+1)) */
638
static const int8_t ceil_log2[] = {
639
    0, 1, 2, 2, 3, 3,
640
};
641
642
static int read_sbr_grid(AACDecContext *ac, SpectralBandReplication *sbr,
643
                         GetBitContext *gb, SBRData *ch_data, int numTimeSlots)
644
1.49M
{
645
1.49M
    int i;
646
1.49M
    int bs_pointer = 0;
647
1.49M
    int abs_bord_trail = numTimeSlots;
648
1.49M
    int num_rel_lead, num_rel_trail;
649
1.49M
    unsigned bs_num_env_old = ch_data->bs_num_env;
650
1.49M
    int bs_frame_class, bs_num_env;
651
652
1.49M
    ch_data->bs_freq_res[0] = ch_data->bs_freq_res[ch_data->bs_num_env];
653
1.49M
    ch_data->bs_amp_res = sbr->bs_amp_res_header;
654
1.49M
    ch_data->t_env_num_env_old = ch_data->t_env[bs_num_env_old];
655
656
1.49M
    switch (bs_frame_class = get_bits(gb, 2)) {
657
1.19M
    case FIXFIX:
658
1.19M
        bs_num_env = 1 << get_bits(gb, 2);
659
1.19M
        if (bs_num_env > (sbr->usac ? 8 : 5)) {
660
4.51k
            av_log(ac->avctx, AV_LOG_ERROR,
661
4.51k
                   "Invalid bitstream, too many SBR envelopes in FIXFIX type SBR frame: %d\n",
662
4.51k
                   bs_num_env);
663
4.51k
            return -1;
664
4.51k
        }
665
1.19M
        ch_data->bs_num_env = bs_num_env;
666
1.19M
        num_rel_lead                        = ch_data->bs_num_env - 1;
667
1.19M
        if (ch_data->bs_num_env == 1)
668
1.05M
            ch_data->bs_amp_res = 0;
669
670
671
1.19M
        ch_data->t_env[0]                   = 0;
672
1.19M
        ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
673
674
1.19M
        abs_bord_trail = (abs_bord_trail + (ch_data->bs_num_env >> 1)) /
675
1.19M
                   ch_data->bs_num_env;
676
1.42M
        for (i = 0; i < num_rel_lead; i++)
677
232k
            ch_data->t_env[i + 1] = ch_data->t_env[i] + abs_bord_trail;
678
679
1.19M
        ch_data->bs_freq_res[1] = get_bits1(gb);
680
1.42M
        for (i = 1; i < ch_data->bs_num_env; i++)
681
232k
            ch_data->bs_freq_res[i + 1] = ch_data->bs_freq_res[1];
682
1.19M
        break;
683
101k
    case FIXVAR:
684
101k
        abs_bord_trail                     += get_bits(gb, 2);
685
101k
        num_rel_trail                       = get_bits(gb, 2);
686
101k
        ch_data->bs_num_env                 = num_rel_trail + 1;
687
101k
        ch_data->t_env[0]                   = 0;
688
101k
        ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
689
690
269k
        for (i = 0; i < num_rel_trail; i++)
691
167k
            ch_data->t_env[ch_data->bs_num_env - 1 - i] =
692
167k
                ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2;
693
694
101k
        bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
695
696
370k
        for (i = 0; i < ch_data->bs_num_env; i++)
697
269k
            ch_data->bs_freq_res[ch_data->bs_num_env - i] = get_bits1(gb);
698
101k
        break;
699
83.7k
    case VARFIX:
700
83.7k
        ch_data->t_env[0]                   = get_bits(gb, 2);
701
83.7k
        num_rel_lead                        = get_bits(gb, 2);
702
83.7k
        ch_data->bs_num_env                 = num_rel_lead + 1;
703
83.7k
        ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
704
705
211k
        for (i = 0; i < num_rel_lead; i++)
706
127k
            ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2;
707
708
83.7k
        bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
709
710
83.7k
        get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env);
711
83.7k
        break;
712
113k
    case VARVAR:
713
113k
        ch_data->t_env[0]                   = get_bits(gb, 2);
714
113k
        abs_bord_trail                     += get_bits(gb, 2);
715
113k
        num_rel_lead                        = get_bits(gb, 2);
716
113k
        num_rel_trail                       = get_bits(gb, 2);
717
113k
        bs_num_env                          = num_rel_lead + num_rel_trail + 1;
718
719
113k
        if (bs_num_env > 5) {
720
28.8k
            av_log(ac->avctx, AV_LOG_ERROR,
721
28.8k
                   "Invalid bitstream, too many SBR envelopes in VARVAR type SBR frame: %d\n",
722
28.8k
                   bs_num_env);
723
28.8k
            return -1;
724
28.8k
        }
725
84.3k
        ch_data->bs_num_env = bs_num_env;
726
727
84.3k
        ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
728
729
224k
        for (i = 0; i < num_rel_lead; i++)
730
139k
            ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2;
731
173k
        for (i = 0; i < num_rel_trail; i++)
732
89.5k
            ch_data->t_env[ch_data->bs_num_env - 1 - i] =
733
89.5k
                ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2;
734
735
84.3k
        bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
736
737
84.3k
        get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env);
738
84.3k
        break;
739
1.49M
    }
740
1.46M
    ch_data->bs_frame_class = bs_frame_class;
741
742
1.46M
    av_assert0(bs_pointer >= 0);
743
1.46M
    if (bs_pointer > ch_data->bs_num_env + 1) {
744
15.9k
        av_log(ac->avctx, AV_LOG_ERROR,
745
15.9k
               "Invalid bitstream, bs_pointer points to a middle noise border outside the time borders table: %d\n",
746
15.9k
               bs_pointer);
747
15.9k
        return -1;
748
15.9k
    }
749
750
3.55M
    for (i = 1; i <= ch_data->bs_num_env; i++) {
751
2.12M
        if (ch_data->t_env[i-1] >= ch_data->t_env[i]) {
752
19.6k
            av_log(ac->avctx, AV_LOG_ERROR, "Not strictly monotone time borders\n");
753
19.6k
            return -1;
754
19.6k
        }
755
2.12M
    }
756
757
1.42M
    ch_data->bs_num_noise = (ch_data->bs_num_env > 1) + 1;
758
759
1.42M
    ch_data->t_q[0]                     = ch_data->t_env[0];
760
1.42M
    ch_data->t_q[ch_data->bs_num_noise] = ch_data->t_env[ch_data->bs_num_env];
761
1.42M
    if (ch_data->bs_num_noise > 1) {
762
327k
        int idx;
763
327k
        if (ch_data->bs_frame_class == FIXFIX) {
764
140k
            idx = ch_data->bs_num_env >> 1;
765
187k
        } else if (ch_data->bs_frame_class & 1) { // FIXVAR or VARVAR
766
127k
            idx = ch_data->bs_num_env - FFMAX(bs_pointer - 1, 1);
767
127k
        } else { // VARFIX
768
59.8k
            if (!bs_pointer)
769
5.26k
                idx = 1;
770
54.5k
            else if (bs_pointer == 1)
771
16.1k
                idx = ch_data->bs_num_env - 1;
772
38.4k
            else // bs_pointer > 1
773
38.4k
                idx = bs_pointer - 1;
774
59.8k
        }
775
327k
        ch_data->t_q[1] = ch_data->t_env[idx];
776
327k
    }
777
778
1.42M
    ch_data->e_a[0] = -(ch_data->e_a[1] != bs_num_env_old); // l_APrev
779
1.42M
    ch_data->e_a[1] = -1;
780
1.42M
    if ((ch_data->bs_frame_class & 1) && bs_pointer) { // FIXVAR or VARVAR and bs_pointer != 0
781
69.6k
        ch_data->e_a[1] = ch_data->bs_num_env + 1 - bs_pointer;
782
1.35M
    } else if ((ch_data->bs_frame_class == 2) && (bs_pointer > 1)) // VARFIX and bs_pointer > 1
783
38.4k
        ch_data->e_a[1] = bs_pointer - 1;
784
785
1.42M
    return 0;
786
1.44M
}
aacsbr.c:read_sbr_grid
Line
Count
Source
644
1.31M
{
645
1.31M
    int i;
646
1.31M
    int bs_pointer = 0;
647
1.31M
    int abs_bord_trail = numTimeSlots;
648
1.31M
    int num_rel_lead, num_rel_trail;
649
1.31M
    unsigned bs_num_env_old = ch_data->bs_num_env;
650
1.31M
    int bs_frame_class, bs_num_env;
651
652
1.31M
    ch_data->bs_freq_res[0] = ch_data->bs_freq_res[ch_data->bs_num_env];
653
1.31M
    ch_data->bs_amp_res = sbr->bs_amp_res_header;
654
1.31M
    ch_data->t_env_num_env_old = ch_data->t_env[bs_num_env_old];
655
656
1.31M
    switch (bs_frame_class = get_bits(gb, 2)) {
657
1.11M
    case FIXFIX:
658
1.11M
        bs_num_env = 1 << get_bits(gb, 2);
659
1.11M
        if (bs_num_env > (sbr->usac ? 8 : 5)) {
660
2.99k
            av_log(ac->avctx, AV_LOG_ERROR,
661
2.99k
                   "Invalid bitstream, too many SBR envelopes in FIXFIX type SBR frame: %d\n",
662
2.99k
                   bs_num_env);
663
2.99k
            return -1;
664
2.99k
        }
665
1.10M
        ch_data->bs_num_env = bs_num_env;
666
1.10M
        num_rel_lead                        = ch_data->bs_num_env - 1;
667
1.10M
        if (ch_data->bs_num_env == 1)
668
980k
            ch_data->bs_amp_res = 0;
669
670
671
1.10M
        ch_data->t_env[0]                   = 0;
672
1.10M
        ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
673
674
1.10M
        abs_bord_trail = (abs_bord_trail + (ch_data->bs_num_env >> 1)) /
675
1.10M
                   ch_data->bs_num_env;
676
1.32M
        for (i = 0; i < num_rel_lead; i++)
677
213k
            ch_data->t_env[i + 1] = ch_data->t_env[i] + abs_bord_trail;
678
679
1.10M
        ch_data->bs_freq_res[1] = get_bits1(gb);
680
1.32M
        for (i = 1; i < ch_data->bs_num_env; i++)
681
213k
            ch_data->bs_freq_res[i + 1] = ch_data->bs_freq_res[1];
682
1.10M
        break;
683
85.1k
    case FIXVAR:
684
85.1k
        abs_bord_trail                     += get_bits(gb, 2);
685
85.1k
        num_rel_trail                       = get_bits(gb, 2);
686
85.1k
        ch_data->bs_num_env                 = num_rel_trail + 1;
687
85.1k
        ch_data->t_env[0]                   = 0;
688
85.1k
        ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
689
690
239k
        for (i = 0; i < num_rel_trail; i++)
691
154k
            ch_data->t_env[ch_data->bs_num_env - 1 - i] =
692
154k
                ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2;
693
694
85.1k
        bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
695
696
324k
        for (i = 0; i < ch_data->bs_num_env; i++)
697
239k
            ch_data->bs_freq_res[ch_data->bs_num_env - i] = get_bits1(gb);
698
85.1k
        break;
699
64.1k
    case VARFIX:
700
64.1k
        ch_data->t_env[0]                   = get_bits(gb, 2);
701
64.1k
        num_rel_lead                        = get_bits(gb, 2);
702
64.1k
        ch_data->bs_num_env                 = num_rel_lead + 1;
703
64.1k
        ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
704
705
162k
        for (i = 0; i < num_rel_lead; i++)
706
98.8k
            ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2;
707
708
64.1k
        bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
709
710
64.1k
        get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env);
711
64.1k
        break;
712
58.6k
    case VARVAR:
713
58.6k
        ch_data->t_env[0]                   = get_bits(gb, 2);
714
58.6k
        abs_bord_trail                     += get_bits(gb, 2);
715
58.6k
        num_rel_lead                        = get_bits(gb, 2);
716
58.6k
        num_rel_trail                       = get_bits(gb, 2);
717
58.6k
        bs_num_env                          = num_rel_lead + num_rel_trail + 1;
718
719
58.6k
        if (bs_num_env > 5) {
720
27.2k
            av_log(ac->avctx, AV_LOG_ERROR,
721
27.2k
                   "Invalid bitstream, too many SBR envelopes in VARVAR type SBR frame: %d\n",
722
27.2k
                   bs_num_env);
723
27.2k
            return -1;
724
27.2k
        }
725
31.3k
        ch_data->bs_num_env = bs_num_env;
726
727
31.3k
        ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
728
729
63.3k
        for (i = 0; i < num_rel_lead; i++)
730
31.9k
            ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2;
731
81.4k
        for (i = 0; i < num_rel_trail; i++)
732
50.0k
            ch_data->t_env[ch_data->bs_num_env - 1 - i] =
733
50.0k
                ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2;
734
735
31.3k
        bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
736
737
31.3k
        get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env);
738
31.3k
        break;
739
1.31M
    }
740
1.28M
    ch_data->bs_frame_class = bs_frame_class;
741
742
1.28M
    av_assert0(bs_pointer >= 0);
743
1.28M
    if (bs_pointer > ch_data->bs_num_env + 1) {
744
13.5k
        av_log(ac->avctx, AV_LOG_ERROR,
745
13.5k
               "Invalid bitstream, bs_pointer points to a middle noise border outside the time borders table: %d\n",
746
13.5k
               bs_pointer);
747
13.5k
        return -1;
748
13.5k
    }
749
750
3.01M
    for (i = 1; i <= ch_data->bs_num_env; i++) {
751
1.75M
        if (ch_data->t_env[i-1] >= ch_data->t_env[i]) {
752
17.5k
            av_log(ac->avctx, AV_LOG_ERROR, "Not strictly monotone time borders\n");
753
17.5k
            return -1;
754
17.5k
        }
755
1.75M
    }
756
757
1.25M
    ch_data->bs_num_noise = (ch_data->bs_num_env > 1) + 1;
758
759
1.25M
    ch_data->t_q[0]                     = ch_data->t_env[0];
760
1.25M
    ch_data->t_q[ch_data->bs_num_noise] = ch_data->t_env[ch_data->bs_num_env];
761
1.25M
    if (ch_data->bs_num_noise > 1) {
762
249k
        int idx;
763
249k
        if (ch_data->bs_frame_class == FIXFIX) {
764
127k
            idx = ch_data->bs_num_env >> 1;
765
127k
        } else if (ch_data->bs_frame_class & 1) { // FIXVAR or VARVAR
766
74.8k
            idx = ch_data->bs_num_env - FFMAX(bs_pointer - 1, 1);
767
74.8k
        } else { // VARFIX
768
47.2k
            if (!bs_pointer)
769
3.78k
                idx = 1;
770
43.4k
            else if (bs_pointer == 1)
771
10.4k
                idx = ch_data->bs_num_env - 1;
772
33.0k
            else // bs_pointer > 1
773
33.0k
                idx = bs_pointer - 1;
774
47.2k
        }
775
249k
        ch_data->t_q[1] = ch_data->t_env[idx];
776
249k
    }
777
778
1.25M
    ch_data->e_a[0] = -(ch_data->e_a[1] != bs_num_env_old); // l_APrev
779
1.25M
    ch_data->e_a[1] = -1;
780
1.25M
    if ((ch_data->bs_frame_class & 1) && bs_pointer) { // FIXVAR or VARVAR and bs_pointer != 0
781
33.0k
        ch_data->e_a[1] = ch_data->bs_num_env + 1 - bs_pointer;
782
1.22M
    } else if ((ch_data->bs_frame_class == 2) && (bs_pointer > 1)) // VARFIX and bs_pointer > 1
783
33.0k
        ch_data->e_a[1] = bs_pointer - 1;
784
785
1.25M
    return 0;
786
1.27M
}
aacsbr_fixed.c:read_sbr_grid
Line
Count
Source
644
179k
{
645
179k
    int i;
646
179k
    int bs_pointer = 0;
647
179k
    int abs_bord_trail = numTimeSlots;
648
179k
    int num_rel_lead, num_rel_trail;
649
179k
    unsigned bs_num_env_old = ch_data->bs_num_env;
650
179k
    int bs_frame_class, bs_num_env;
651
652
179k
    ch_data->bs_freq_res[0] = ch_data->bs_freq_res[ch_data->bs_num_env];
653
179k
    ch_data->bs_amp_res = sbr->bs_amp_res_header;
654
179k
    ch_data->t_env_num_env_old = ch_data->t_env[bs_num_env_old];
655
656
179k
    switch (bs_frame_class = get_bits(gb, 2)) {
657
88.4k
    case FIXFIX:
658
88.4k
        bs_num_env = 1 << get_bits(gb, 2);
659
88.4k
        if (bs_num_env > (sbr->usac ? 8 : 5)) {
660
1.51k
            av_log(ac->avctx, AV_LOG_ERROR,
661
1.51k
                   "Invalid bitstream, too many SBR envelopes in FIXFIX type SBR frame: %d\n",
662
1.51k
                   bs_num_env);
663
1.51k
            return -1;
664
1.51k
        }
665
86.9k
        ch_data->bs_num_env = bs_num_env;
666
86.9k
        num_rel_lead                        = ch_data->bs_num_env - 1;
667
86.9k
        if (ch_data->bs_num_env == 1)
668
74.2k
            ch_data->bs_amp_res = 0;
669
670
671
86.9k
        ch_data->t_env[0]                   = 0;
672
86.9k
        ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
673
674
86.9k
        abs_bord_trail = (abs_bord_trail + (ch_data->bs_num_env >> 1)) /
675
86.9k
                   ch_data->bs_num_env;
676
106k
        for (i = 0; i < num_rel_lead; i++)
677
19.3k
            ch_data->t_env[i + 1] = ch_data->t_env[i] + abs_bord_trail;
678
679
86.9k
        ch_data->bs_freq_res[1] = get_bits1(gb);
680
106k
        for (i = 1; i < ch_data->bs_num_env; i++)
681
19.3k
            ch_data->bs_freq_res[i + 1] = ch_data->bs_freq_res[1];
682
86.9k
        break;
683
16.5k
    case FIXVAR:
684
16.5k
        abs_bord_trail                     += get_bits(gb, 2);
685
16.5k
        num_rel_trail                       = get_bits(gb, 2);
686
16.5k
        ch_data->bs_num_env                 = num_rel_trail + 1;
687
16.5k
        ch_data->t_env[0]                   = 0;
688
16.5k
        ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
689
690
29.3k
        for (i = 0; i < num_rel_trail; i++)
691
12.8k
            ch_data->t_env[ch_data->bs_num_env - 1 - i] =
692
12.8k
                ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2;
693
694
16.5k
        bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
695
696
45.8k
        for (i = 0; i < ch_data->bs_num_env; i++)
697
29.3k
            ch_data->bs_freq_res[ch_data->bs_num_env - i] = get_bits1(gb);
698
16.5k
        break;
699
19.5k
    case VARFIX:
700
19.5k
        ch_data->t_env[0]                   = get_bits(gb, 2);
701
19.5k
        num_rel_lead                        = get_bits(gb, 2);
702
19.5k
        ch_data->bs_num_env                 = num_rel_lead + 1;
703
19.5k
        ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
704
705
48.4k
        for (i = 0; i < num_rel_lead; i++)
706
28.8k
            ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2;
707
708
19.5k
        bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
709
710
19.5k
        get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env);
711
19.5k
        break;
712
54.5k
    case VARVAR:
713
54.5k
        ch_data->t_env[0]                   = get_bits(gb, 2);
714
54.5k
        abs_bord_trail                     += get_bits(gb, 2);
715
54.5k
        num_rel_lead                        = get_bits(gb, 2);
716
54.5k
        num_rel_trail                       = get_bits(gb, 2);
717
54.5k
        bs_num_env                          = num_rel_lead + num_rel_trail + 1;
718
719
54.5k
        if (bs_num_env > 5) {
720
1.57k
            av_log(ac->avctx, AV_LOG_ERROR,
721
1.57k
                   "Invalid bitstream, too many SBR envelopes in VARVAR type SBR frame: %d\n",
722
1.57k
                   bs_num_env);
723
1.57k
            return -1;
724
1.57k
        }
725
52.9k
        ch_data->bs_num_env = bs_num_env;
726
727
52.9k
        ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
728
729
160k
        for (i = 0; i < num_rel_lead; i++)
730
108k
            ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2;
731
92.4k
        for (i = 0; i < num_rel_trail; i++)
732
39.5k
            ch_data->t_env[ch_data->bs_num_env - 1 - i] =
733
39.5k
                ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2;
734
735
52.9k
        bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
736
737
52.9k
        get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env);
738
52.9k
        break;
739
179k
    }
740
176k
    ch_data->bs_frame_class = bs_frame_class;
741
742
176k
    av_assert0(bs_pointer >= 0);
743
176k
    if (bs_pointer > ch_data->bs_num_env + 1) {
744
2.48k
        av_log(ac->avctx, AV_LOG_ERROR,
745
2.48k
               "Invalid bitstream, bs_pointer points to a middle noise border outside the time borders table: %d\n",
746
2.48k
               bs_pointer);
747
2.48k
        return -1;
748
2.48k
    }
749
750
543k
    for (i = 1; i <= ch_data->bs_num_env; i++) {
751
371k
        if (ch_data->t_env[i-1] >= ch_data->t_env[i]) {
752
2.11k
            av_log(ac->avctx, AV_LOG_ERROR, "Not strictly monotone time borders\n");
753
2.11k
            return -1;
754
2.11k
        }
755
371k
    }
756
757
171k
    ch_data->bs_num_noise = (ch_data->bs_num_env > 1) + 1;
758
759
171k
    ch_data->t_q[0]                     = ch_data->t_env[0];
760
171k
    ch_data->t_q[ch_data->bs_num_noise] = ch_data->t_env[ch_data->bs_num_env];
761
171k
    if (ch_data->bs_num_noise > 1) {
762
78.0k
        int idx;
763
78.0k
        if (ch_data->bs_frame_class == FIXFIX) {
764
12.6k
            idx = ch_data->bs_num_env >> 1;
765
65.3k
        } else if (ch_data->bs_frame_class & 1) { // FIXVAR or VARVAR
766
52.7k
            idx = ch_data->bs_num_env - FFMAX(bs_pointer - 1, 1);
767
52.7k
        } else { // VARFIX
768
12.5k
            if (!bs_pointer)
769
1.48k
                idx = 1;
770
11.1k
            else if (bs_pointer == 1)
771
5.73k
                idx = ch_data->bs_num_env - 1;
772
5.37k
            else // bs_pointer > 1
773
5.37k
                idx = bs_pointer - 1;
774
12.5k
        }
775
78.0k
        ch_data->t_q[1] = ch_data->t_env[idx];
776
78.0k
    }
777
778
171k
    ch_data->e_a[0] = -(ch_data->e_a[1] != bs_num_env_old); // l_APrev
779
171k
    ch_data->e_a[1] = -1;
780
171k
    if ((ch_data->bs_frame_class & 1) && bs_pointer) { // FIXVAR or VARVAR and bs_pointer != 0
781
36.6k
        ch_data->e_a[1] = ch_data->bs_num_env + 1 - bs_pointer;
782
134k
    } else if ((ch_data->bs_frame_class == 2) && (bs_pointer > 1)) // VARFIX and bs_pointer > 1
783
5.37k
        ch_data->e_a[1] = bs_pointer - 1;
784
785
171k
    return 0;
786
173k
}
787
788
118k
static void copy_sbr_grid(SBRData *dst, const SBRData *src) {
789
    //These variables are saved from the previous frame rather than copied
790
118k
    dst->bs_freq_res[0]    = dst->bs_freq_res[dst->bs_num_env];
791
118k
    dst->t_env_num_env_old = dst->t_env[dst->bs_num_env];
792
118k
    dst->e_a[0]            = -(dst->e_a[1] != dst->bs_num_env);
793
794
    //These variables are read from the bitstream and therefore copied
795
118k
    memcpy(dst->bs_freq_res+1, src->bs_freq_res+1, sizeof(dst->bs_freq_res)-sizeof(*dst->bs_freq_res));
796
118k
    memcpy(dst->t_env,         src->t_env,         sizeof(dst->t_env));
797
118k
    memcpy(dst->t_q,           src->t_q,           sizeof(dst->t_q));
798
118k
    dst->bs_num_env        = src->bs_num_env;
799
118k
    dst->bs_amp_res        = src->bs_amp_res;
800
118k
    dst->bs_num_noise      = src->bs_num_noise;
801
118k
    dst->bs_frame_class    = src->bs_frame_class;
802
118k
    dst->e_a[1]            = src->e_a[1];
803
118k
}
aacsbr.c:copy_sbr_grid
Line
Count
Source
788
81.0k
static void copy_sbr_grid(SBRData *dst, const SBRData *src) {
789
    //These variables are saved from the previous frame rather than copied
790
81.0k
    dst->bs_freq_res[0]    = dst->bs_freq_res[dst->bs_num_env];
791
81.0k
    dst->t_env_num_env_old = dst->t_env[dst->bs_num_env];
792
81.0k
    dst->e_a[0]            = -(dst->e_a[1] != dst->bs_num_env);
793
794
    //These variables are read from the bitstream and therefore copied
795
81.0k
    memcpy(dst->bs_freq_res+1, src->bs_freq_res+1, sizeof(dst->bs_freq_res)-sizeof(*dst->bs_freq_res));
796
81.0k
    memcpy(dst->t_env,         src->t_env,         sizeof(dst->t_env));
797
81.0k
    memcpy(dst->t_q,           src->t_q,           sizeof(dst->t_q));
798
81.0k
    dst->bs_num_env        = src->bs_num_env;
799
81.0k
    dst->bs_amp_res        = src->bs_amp_res;
800
81.0k
    dst->bs_num_noise      = src->bs_num_noise;
801
81.0k
    dst->bs_frame_class    = src->bs_frame_class;
802
81.0k
    dst->e_a[1]            = src->e_a[1];
803
81.0k
}
aacsbr_fixed.c:copy_sbr_grid
Line
Count
Source
788
37.1k
static void copy_sbr_grid(SBRData *dst, const SBRData *src) {
789
    //These variables are saved from the previous frame rather than copied
790
37.1k
    dst->bs_freq_res[0]    = dst->bs_freq_res[dst->bs_num_env];
791
37.1k
    dst->t_env_num_env_old = dst->t_env[dst->bs_num_env];
792
37.1k
    dst->e_a[0]            = -(dst->e_a[1] != dst->bs_num_env);
793
794
    //These variables are read from the bitstream and therefore copied
795
37.1k
    memcpy(dst->bs_freq_res+1, src->bs_freq_res+1, sizeof(dst->bs_freq_res)-sizeof(*dst->bs_freq_res));
796
37.1k
    memcpy(dst->t_env,         src->t_env,         sizeof(dst->t_env));
797
37.1k
    memcpy(dst->t_q,           src->t_q,           sizeof(dst->t_q));
798
37.1k
    dst->bs_num_env        = src->bs_num_env;
799
37.1k
    dst->bs_amp_res        = src->bs_amp_res;
800
37.1k
    dst->bs_num_noise      = src->bs_num_noise;
801
37.1k
    dst->bs_frame_class    = src->bs_frame_class;
802
37.1k
    dst->e_a[1]            = src->e_a[1];
803
37.1k
}
804
805
/// Read how the envelope and noise floor data is delta coded
806
static void read_sbr_dtdf(SpectralBandReplication *sbr, GetBitContext *gb,
807
                          SBRData *ch_data, int indep_flag)
808
1.52M
{
809
1.52M
    if (sbr->usac) {
810
914k
        if (indep_flag) {
811
168
            ch_data->bs_df_env[0] = 0;
812
168
            get_bits1_vector(gb, &ch_data->bs_df_env[1], ch_data->bs_num_env - 1);
813
914k
        } else {
814
914k
            get_bits1_vector(gb, ch_data->bs_df_env, ch_data->bs_num_env);
815
914k
        }
816
817
914k
        if (indep_flag) {
818
168
            ch_data->bs_df_noise[0] = 0;
819
168
            get_bits1_vector(gb, &ch_data->bs_df_noise[1], ch_data->bs_num_noise - 1);
820
914k
        } else {
821
914k
            get_bits1_vector(gb, ch_data->bs_df_noise, ch_data->bs_num_noise);
822
914k
        }
823
914k
    } else {
824
608k
        get_bits1_vector(gb, ch_data->bs_df_env,   ch_data->bs_num_env);
825
608k
        get_bits1_vector(gb, ch_data->bs_df_noise, ch_data->bs_num_noise);
826
608k
    }
827
1.52M
}
aacsbr.c:read_sbr_dtdf
Line
Count
Source
808
1.31M
{
809
1.31M
    if (sbr->usac) {
810
914k
        if (indep_flag) {
811
168
            ch_data->bs_df_env[0] = 0;
812
168
            get_bits1_vector(gb, &ch_data->bs_df_env[1], ch_data->bs_num_env - 1);
813
914k
        } else {
814
914k
            get_bits1_vector(gb, ch_data->bs_df_env, ch_data->bs_num_env);
815
914k
        }
816
817
914k
        if (indep_flag) {
818
168
            ch_data->bs_df_noise[0] = 0;
819
168
            get_bits1_vector(gb, &ch_data->bs_df_noise[1], ch_data->bs_num_noise - 1);
820
914k
        } else {
821
914k
            get_bits1_vector(gb, ch_data->bs_df_noise, ch_data->bs_num_noise);
822
914k
        }
823
914k
    } else {
824
400k
        get_bits1_vector(gb, ch_data->bs_df_env,   ch_data->bs_num_env);
825
400k
        get_bits1_vector(gb, ch_data->bs_df_noise, ch_data->bs_num_noise);
826
400k
    }
827
1.31M
}
aacsbr_fixed.c:read_sbr_dtdf
Line
Count
Source
808
207k
{
809
207k
    if (sbr->usac) {
810
0
        if (indep_flag) {
811
0
            ch_data->bs_df_env[0] = 0;
812
0
            get_bits1_vector(gb, &ch_data->bs_df_env[1], ch_data->bs_num_env - 1);
813
0
        } else {
814
0
            get_bits1_vector(gb, ch_data->bs_df_env, ch_data->bs_num_env);
815
0
        }
816
817
0
        if (indep_flag) {
818
0
            ch_data->bs_df_noise[0] = 0;
819
0
            get_bits1_vector(gb, &ch_data->bs_df_noise[1], ch_data->bs_num_noise - 1);
820
0
        } else {
821
0
            get_bits1_vector(gb, ch_data->bs_df_noise, ch_data->bs_num_noise);
822
0
        }
823
207k
    } else {
824
207k
        get_bits1_vector(gb, ch_data->bs_df_env,   ch_data->bs_num_env);
825
207k
        get_bits1_vector(gb, ch_data->bs_df_noise, ch_data->bs_num_noise);
826
207k
    }
827
207k
}
828
829
/// Read inverse filtering data
830
static void read_sbr_invf(SpectralBandReplication *sbr, GetBitContext *gb,
831
                          SBRData *ch_data)
832
1.40M
{
833
1.40M
    int i;
834
835
1.40M
    memcpy(ch_data->bs_invf_mode[1], ch_data->bs_invf_mode[0], 5 * sizeof(uint8_t));
836
3.24M
    for (i = 0; i < sbr->n_q; i++)
837
1.83M
        ch_data->bs_invf_mode[0][i] = get_bits(gb, 2);
838
1.40M
}
aacsbr.c:read_sbr_invf
Line
Count
Source
832
1.23M
{
833
1.23M
    int i;
834
835
1.23M
    memcpy(ch_data->bs_invf_mode[1], ch_data->bs_invf_mode[0], 5 * sizeof(uint8_t));
836
2.75M
    for (i = 0; i < sbr->n_q; i++)
837
1.52M
        ch_data->bs_invf_mode[0][i] = get_bits(gb, 2);
838
1.23M
}
aacsbr_fixed.c:read_sbr_invf
Line
Count
Source
832
170k
{
833
170k
    int i;
834
835
170k
    memcpy(ch_data->bs_invf_mode[1], ch_data->bs_invf_mode[0], 5 * sizeof(uint8_t));
836
487k
    for (i = 0; i < sbr->n_q; i++)
837
317k
        ch_data->bs_invf_mode[0][i] = get_bits(gb, 2);
838
170k
}
839
840
static int read_sbr_envelope(AACDecContext *ac, SpectralBandReplication *sbr, GetBitContext *gb,
841
                             SBRData *ch_data, int ch)
842
1.48M
{
843
1.48M
    int bits;
844
1.48M
    int i, j, k;
845
1.48M
    const VLCElem *t_huff, *f_huff;
846
1.48M
    const int delta = (ch == 1 && sbr->bs_coupling == 1) + 1;
847
1.48M
    const int odd = sbr->n[1] & 1;
848
849
1.48M
    if (sbr->bs_coupling && ch) {
850
103k
        if (ch_data->bs_amp_res) {
851
78.4k
            bits   = 5;
852
78.4k
            t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_BAL_3_0DB];
853
78.4k
            f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_3_0DB];
854
78.4k
        } else {
855
25.0k
            bits   = 6;
856
25.0k
            t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_BAL_1_5DB];
857
25.0k
            f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_1_5DB];
858
25.0k
        }
859
1.38M
    } else {
860
1.38M
        if (ch_data->bs_amp_res) {
861
270k
            bits   = 6;
862
270k
            t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_3_0DB];
863
270k
            f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_3_0DB];
864
1.11M
        } else {
865
1.11M
            bits   = 7;
866
1.11M
            t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_1_5DB];
867
1.11M
            f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_1_5DB];
868
1.11M
        }
869
1.38M
    }
870
871
3.59M
    for (i = 0; i < ch_data->bs_num_env; i++) {
872
2.20M
        if (ch_data->bs_df_env[i]) {
873
            // bs_freq_res[0] == bs_freq_res[bs_num_env] from prev frame
874
560k
            if (ch_data->bs_freq_res[i + 1] == ch_data->bs_freq_res[i]) {
875
2.62M
                for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
876
2.29M
                    ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][j] + delta * get_vlc2(gb, t_huff, 9, 3);
877
2.29M
                    if (ch_data->env_facs_q[i + 1][j] > 127U) {
878
18.8k
                        av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]);
879
18.8k
                        return AVERROR_INVALIDDATA;
880
18.8k
                    }
881
2.29M
                }
882
352k
            } else if (ch_data->bs_freq_res[i + 1]) {
883
1.53M
                for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
884
1.43M
                    k = (j + odd) >> 1; // find k such that f_tablelow[k] <= f_tablehigh[j] < f_tablelow[k + 1]
885
1.43M
                    ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][k] + delta * get_vlc2(gb, t_huff, 9, 3);
886
1.43M
                    if (ch_data->env_facs_q[i + 1][j] > 127U) {
887
8.07k
                        av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]);
888
8.07k
                        return AVERROR_INVALIDDATA;
889
8.07k
                    }
890
1.43M
                }
891
107k
            } else {
892
1.03M
                for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
893
963k
                    k = j ? 2*j - odd : 0; // find k such that f_tablehigh[k] == f_tablelow[j]
894
963k
                    ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][k] + delta * get_vlc2(gb, t_huff, 9, 3);
895
963k
                    if (ch_data->env_facs_q[i + 1][j] > 127U) {
896
28.9k
                        av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]);
897
28.9k
                        return AVERROR_INVALIDDATA;
898
28.9k
                    }
899
963k
                }
900
101k
            }
901
1.64M
        } else {
902
1.64M
            ch_data->env_facs_q[i + 1][0] = delta * get_bits(gb, bits); // bs_env_start_value_balance
903
10.3M
            for (j = 1; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
904
8.72M
                ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i + 1][j - 1] + delta * get_vlc2(gb, f_huff, 9, 3);
905
8.72M
                if (ch_data->env_facs_q[i + 1][j] > 127U) {
906
37.5k
                    av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]);
907
37.5k
                    return AVERROR_INVALIDDATA;
908
37.5k
                }
909
8.72M
            }
910
1.64M
        }
911
2.10M
        if (sbr->usac) {
912
988k
            if (sbr->inter_tes) {
913
0
                ch_data->temp_shape[i] = get_bits(gb, 1);
914
0
                if (ch_data->temp_shape[i])
915
0
                    ch_data->temp_shape_mode[i] = get_bits(gb, 2);
916
0
            }
917
988k
        }
918
2.10M
    }
919
920
    //assign 0th elements of env_facs_q from last elements
921
1.39M
    memcpy(ch_data->env_facs_q[0], ch_data->env_facs_q[ch_data->bs_num_env],
922
1.39M
           sizeof(ch_data->env_facs_q[0]));
923
924
1.39M
    return 0;
925
1.48M
}
aacsbr.c:read_sbr_envelope
Line
Count
Source
842
1.28M
{
843
1.28M
    int bits;
844
1.28M
    int i, j, k;
845
1.28M
    const VLCElem *t_huff, *f_huff;
846
1.28M
    const int delta = (ch == 1 && sbr->bs_coupling == 1) + 1;
847
1.28M
    const int odd = sbr->n[1] & 1;
848
849
1.28M
    if (sbr->bs_coupling && ch) {
850
69.5k
        if (ch_data->bs_amp_res) {
851
51.0k
            bits   = 5;
852
51.0k
            t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_BAL_3_0DB];
853
51.0k
            f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_3_0DB];
854
51.0k
        } else {
855
18.5k
            bits   = 6;
856
18.5k
            t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_BAL_1_5DB];
857
18.5k
            f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_1_5DB];
858
18.5k
        }
859
1.21M
    } else {
860
1.21M
        if (ch_data->bs_amp_res) {
861
191k
            bits   = 6;
862
191k
            t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_3_0DB];
863
191k
            f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_3_0DB];
864
1.02M
        } else {
865
1.02M
            bits   = 7;
866
1.02M
            t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_1_5DB];
867
1.02M
            f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_1_5DB];
868
1.02M
        }
869
1.21M
    }
870
871
2.94M
    for (i = 0; i < ch_data->bs_num_env; i++) {
872
1.73M
        if (ch_data->bs_df_env[i]) {
873
            // bs_freq_res[0] == bs_freq_res[bs_num_env] from prev frame
874
299k
            if (ch_data->bs_freq_res[i + 1] == ch_data->bs_freq_res[i]) {
875
1.45M
                for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
876
1.28M
                    ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][j] + delta * get_vlc2(gb, t_huff, 9, 3);
877
1.28M
                    if (ch_data->env_facs_q[i + 1][j] > 127U) {
878
15.5k
                        av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]);
879
15.5k
                        return AVERROR_INVALIDDATA;
880
15.5k
                    }
881
1.28M
                }
882
189k
            } else if (ch_data->bs_freq_res[i + 1]) {
883
671k
                for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
884
632k
                    k = (j + odd) >> 1; // find k such that f_tablelow[k] <= f_tablehigh[j] < f_tablelow[k + 1]
885
632k
                    ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][k] + delta * get_vlc2(gb, t_huff, 9, 3);
886
632k
                    if (ch_data->env_facs_q[i + 1][j] > 127U) {
887
5.85k
                        av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]);
888
5.85k
                        return AVERROR_INVALIDDATA;
889
5.85k
                    }
890
632k
                }
891
64.8k
            } else {
892
714k
                for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
893
675k
                    k = j ? 2*j - odd : 0; // find k such that f_tablehigh[k] == f_tablelow[j]
894
675k
                    ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][k] + delta * get_vlc2(gb, t_huff, 9, 3);
895
675k
                    if (ch_data->env_facs_q[i + 1][j] > 127U) {
896
26.3k
                        av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]);
897
26.3k
                        return AVERROR_INVALIDDATA;
898
26.3k
                    }
899
675k
                }
900
64.8k
            }
901
1.43M
        } else {
902
1.43M
            ch_data->env_facs_q[i + 1][0] = delta * get_bits(gb, bits); // bs_env_start_value_balance
903
8.74M
            for (j = 1; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
904
7.33M
                ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i + 1][j - 1] + delta * get_vlc2(gb, f_huff, 9, 3);
905
7.33M
                if (ch_data->env_facs_q[i + 1][j] > 127U) {
906
28.5k
                    av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]);
907
28.5k
                    return AVERROR_INVALIDDATA;
908
28.5k
                }
909
7.33M
            }
910
1.43M
        }
911
1.65M
        if (sbr->usac) {
912
988k
            if (sbr->inter_tes) {
913
0
                ch_data->temp_shape[i] = get_bits(gb, 1);
914
0
                if (ch_data->temp_shape[i])
915
0
                    ch_data->temp_shape_mode[i] = get_bits(gb, 2);
916
0
            }
917
988k
        }
918
1.65M
    }
919
920
    //assign 0th elements of env_facs_q from last elements
921
1.20M
    memcpy(ch_data->env_facs_q[0], ch_data->env_facs_q[ch_data->bs_num_env],
922
1.20M
           sizeof(ch_data->env_facs_q[0]));
923
924
1.20M
    return 0;
925
1.28M
}
aacsbr_fixed.c:read_sbr_envelope
Line
Count
Source
842
203k
{
843
203k
    int bits;
844
203k
    int i, j, k;
845
203k
    const VLCElem *t_huff, *f_huff;
846
203k
    const int delta = (ch == 1 && sbr->bs_coupling == 1) + 1;
847
203k
    const int odd = sbr->n[1] & 1;
848
849
203k
    if (sbr->bs_coupling && ch) {
850
33.9k
        if (ch_data->bs_amp_res) {
851
27.4k
            bits   = 5;
852
27.4k
            t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_BAL_3_0DB];
853
27.4k
            f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_3_0DB];
854
27.4k
        } else {
855
6.51k
            bits   = 6;
856
6.51k
            t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_BAL_1_5DB];
857
6.51k
            f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_1_5DB];
858
6.51k
        }
859
169k
    } else {
860
169k
        if (ch_data->bs_amp_res) {
861
79.2k
            bits   = 6;
862
79.2k
            t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_3_0DB];
863
79.2k
            f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_3_0DB];
864
90.1k
        } else {
865
90.1k
            bits   = 7;
866
90.1k
            t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_1_5DB];
867
90.1k
            f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_1_5DB];
868
90.1k
        }
869
169k
    }
870
871
655k
    for (i = 0; i < ch_data->bs_num_env; i++) {
872
469k
        if (ch_data->bs_df_env[i]) {
873
            // bs_freq_res[0] == bs_freq_res[bs_num_env] from prev frame
874
261k
            if (ch_data->bs_freq_res[i + 1] == ch_data->bs_freq_res[i]) {
875
1.17M
                for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
876
1.01M
                    ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][j] + delta * get_vlc2(gb, t_huff, 9, 3);
877
1.01M
                    if (ch_data->env_facs_q[i + 1][j] > 127U) {
878
3.30k
                        av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]);
879
3.30k
                        return AVERROR_INVALIDDATA;
880
3.30k
                    }
881
1.01M
                }
882
163k
            } else if (ch_data->bs_freq_res[i + 1]) {
883
866k
                for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
884
806k
                    k = (j + odd) >> 1; // find k such that f_tablelow[k] <= f_tablehigh[j] < f_tablelow[k + 1]
885
806k
                    ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][k] + delta * get_vlc2(gb, t_huff, 9, 3);
886
806k
                    if (ch_data->env_facs_q[i + 1][j] > 127U) {
887
2.22k
                        av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]);
888
2.22k
                        return AVERROR_INVALIDDATA;
889
2.22k
                    }
890
806k
                }
891
61.8k
            } else {
892
321k
                for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
893
287k
                    k = j ? 2*j - odd : 0; // find k such that f_tablehigh[k] == f_tablelow[j]
894
287k
                    ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][k] + delta * get_vlc2(gb, t_huff, 9, 3);
895
287k
                    if (ch_data->env_facs_q[i + 1][j] > 127U) {
896
2.59k
                        av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]);
897
2.59k
                        return AVERROR_INVALIDDATA;
898
2.59k
                    }
899
287k
                }
900
36.2k
            }
901
261k
        } else {
902
207k
            ch_data->env_facs_q[i + 1][0] = delta * get_bits(gb, bits); // bs_env_start_value_balance
903
1.58M
            for (j = 1; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
904
1.38M
                ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i + 1][j - 1] + delta * get_vlc2(gb, f_huff, 9, 3);
905
1.38M
                if (ch_data->env_facs_q[i + 1][j] > 127U) {
906
8.94k
                    av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]);
907
8.94k
                    return AVERROR_INVALIDDATA;
908
8.94k
                }
909
1.38M
            }
910
207k
        }
911
451k
        if (sbr->usac) {
912
0
            if (sbr->inter_tes) {
913
0
                ch_data->temp_shape[i] = get_bits(gb, 1);
914
0
                if (ch_data->temp_shape[i])
915
0
                    ch_data->temp_shape_mode[i] = get_bits(gb, 2);
916
0
            }
917
0
        }
918
451k
    }
919
920
    //assign 0th elements of env_facs_q from last elements
921
186k
    memcpy(ch_data->env_facs_q[0], ch_data->env_facs_q[ch_data->bs_num_env],
922
186k
           sizeof(ch_data->env_facs_q[0]));
923
924
186k
    return 0;
925
203k
}
926
927
static int read_sbr_noise(AACDecContext *ac, SpectralBandReplication *sbr, GetBitContext *gb,
928
                           SBRData *ch_data, int ch)
929
1.36M
{
930
1.36M
    int i, j;
931
1.36M
    const VLCElem *t_huff, *f_huff;
932
1.36M
    int delta = (ch == 1 && sbr->bs_coupling == 1) + 1;
933
934
1.36M
    if (sbr->bs_coupling && ch) {
935
68.7k
        t_huff = ff_aac_sbr_vlc[T_HUFFMAN_NOISE_BAL_3_0DB];
936
68.7k
        f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_3_0DB];
937
1.29M
    } else {
938
1.29M
        t_huff = ff_aac_sbr_vlc[T_HUFFMAN_NOISE_3_0DB];
939
1.29M
        f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_3_0DB];
940
1.29M
    }
941
942
2.94M
    for (i = 0; i < ch_data->bs_num_noise; i++) {
943
1.64M
        if (ch_data->bs_df_noise[i]) {
944
857k
            for (j = 0; j < sbr->n_q; j++) {
945
559k
                ch_data->noise_facs_q[i + 1][j] = ch_data->noise_facs_q[i][j] + delta * get_vlc2(gb, t_huff, 9, 2);
946
559k
                if (ch_data->noise_facs_q[i + 1][j] > 30U) {
947
34.7k
                    av_log(ac->avctx, AV_LOG_ERROR, "noise_facs_q %d is invalid\n", ch_data->noise_facs_q[i + 1][j]);
948
34.7k
                    return AVERROR_INVALIDDATA;
949
34.7k
                }
950
559k
            }
951
1.31M
        } else {
952
1.31M
            ch_data->noise_facs_q[i + 1][0] = delta * get_bits(gb, 5); // bs_noise_start_value_balance or bs_noise_start_value_level
953
2.30M
            for (j = 1; j < sbr->n_q; j++) {
954
1.02M
                ch_data->noise_facs_q[i + 1][j] = ch_data->noise_facs_q[i + 1][j - 1] + delta * get_vlc2(gb, f_huff, 9, 3);
955
1.02M
                if (ch_data->noise_facs_q[i + 1][j] > 30U) {
956
27.7k
                    av_log(ac->avctx, AV_LOG_ERROR, "noise_facs_q %d is invalid\n", ch_data->noise_facs_q[i + 1][j]);
957
27.7k
                    return AVERROR_INVALIDDATA;
958
27.7k
                }
959
1.02M
            }
960
1.31M
        }
961
1.64M
    }
962
963
    //assign 0th elements of noise_facs_q from last elements
964
1.30M
    memcpy(ch_data->noise_facs_q[0], ch_data->noise_facs_q[ch_data->bs_num_noise],
965
1.30M
           sizeof(ch_data->noise_facs_q[0]));
966
1.30M
    return 0;
967
1.36M
}
aacsbr.c:read_sbr_noise
Line
Count
Source
929
1.18M
{
930
1.18M
    int i, j;
931
1.18M
    const VLCElem *t_huff, *f_huff;
932
1.18M
    int delta = (ch == 1 && sbr->bs_coupling == 1) + 1;
933
934
1.18M
    if (sbr->bs_coupling && ch) {
935
36.1k
        t_huff = ff_aac_sbr_vlc[T_HUFFMAN_NOISE_BAL_3_0DB];
936
36.1k
        f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_3_0DB];
937
1.14M
    } else {
938
1.14M
        t_huff = ff_aac_sbr_vlc[T_HUFFMAN_NOISE_3_0DB];
939
1.14M
        f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_3_0DB];
940
1.14M
    }
941
942
2.49M
    for (i = 0; i < ch_data->bs_num_noise; i++) {
943
1.37M
        if (ch_data->bs_df_noise[i]) {
944
628k
            for (j = 0; j < sbr->n_q; j++) {
945
425k
                ch_data->noise_facs_q[i + 1][j] = ch_data->noise_facs_q[i][j] + delta * get_vlc2(gb, t_huff, 9, 2);
946
425k
                if (ch_data->noise_facs_q[i + 1][j] > 30U) {
947
28.4k
                    av_log(ac->avctx, AV_LOG_ERROR, "noise_facs_q %d is invalid\n", ch_data->noise_facs_q[i + 1][j]);
948
28.4k
                    return AVERROR_INVALIDDATA;
949
28.4k
                }
950
425k
            }
951
1.13M
        } else {
952
1.13M
            ch_data->noise_facs_q[i + 1][0] = delta * get_bits(gb, 5); // bs_noise_start_value_balance or bs_noise_start_value_level
953
1.96M
            for (j = 1; j < sbr->n_q; j++) {
954
846k
                ch_data->noise_facs_q[i + 1][j] = ch_data->noise_facs_q[i + 1][j - 1] + delta * get_vlc2(gb, f_huff, 9, 3);
955
846k
                if (ch_data->noise_facs_q[i + 1][j] > 30U) {
956
25.6k
                    av_log(ac->avctx, AV_LOG_ERROR, "noise_facs_q %d is invalid\n", ch_data->noise_facs_q[i + 1][j]);
957
25.6k
                    return AVERROR_INVALIDDATA;
958
25.6k
                }
959
846k
            }
960
1.13M
        }
961
1.37M
    }
962
963
    //assign 0th elements of noise_facs_q from last elements
964
1.12M
    memcpy(ch_data->noise_facs_q[0], ch_data->noise_facs_q[ch_data->bs_num_noise],
965
1.12M
           sizeof(ch_data->noise_facs_q[0]));
966
1.12M
    return 0;
967
1.18M
}
aacsbr_fixed.c:read_sbr_noise
Line
Count
Source
929
181k
{
930
181k
    int i, j;
931
181k
    const VLCElem *t_huff, *f_huff;
932
181k
    int delta = (ch == 1 && sbr->bs_coupling == 1) + 1;
933
934
181k
    if (sbr->bs_coupling && ch) {
935
32.6k
        t_huff = ff_aac_sbr_vlc[T_HUFFMAN_NOISE_BAL_3_0DB];
936
32.6k
        f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_3_0DB];
937
148k
    } else {
938
148k
        t_huff = ff_aac_sbr_vlc[T_HUFFMAN_NOISE_3_0DB];
939
148k
        f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_3_0DB];
940
148k
    }
941
942
448k
    for (i = 0; i < ch_data->bs_num_noise; i++) {
943
275k
        if (ch_data->bs_df_noise[i]) {
944
228k
            for (j = 0; j < sbr->n_q; j++) {
945
134k
                ch_data->noise_facs_q[i + 1][j] = ch_data->noise_facs_q[i][j] + delta * get_vlc2(gb, t_huff, 9, 2);
946
134k
                if (ch_data->noise_facs_q[i + 1][j] > 30U) {
947
6.33k
                    av_log(ac->avctx, AV_LOG_ERROR, "noise_facs_q %d is invalid\n", ch_data->noise_facs_q[i + 1][j]);
948
6.33k
                    return AVERROR_INVALIDDATA;
949
6.33k
                }
950
134k
            }
951
173k
        } else {
952
173k
            ch_data->noise_facs_q[i + 1][0] = delta * get_bits(gb, 5); // bs_noise_start_value_balance or bs_noise_start_value_level
953
349k
            for (j = 1; j < sbr->n_q; j++) {
954
177k
                ch_data->noise_facs_q[i + 1][j] = ch_data->noise_facs_q[i + 1][j - 1] + delta * get_vlc2(gb, f_huff, 9, 3);
955
177k
                if (ch_data->noise_facs_q[i + 1][j] > 30U) {
956
2.04k
                    av_log(ac->avctx, AV_LOG_ERROR, "noise_facs_q %d is invalid\n", ch_data->noise_facs_q[i + 1][j]);
957
2.04k
                    return AVERROR_INVALIDDATA;
958
2.04k
                }
959
177k
            }
960
173k
        }
961
275k
    }
962
963
    //assign 0th elements of noise_facs_q from last elements
964
172k
    memcpy(ch_data->noise_facs_q[0], ch_data->noise_facs_q[ch_data->bs_num_noise],
965
172k
           sizeof(ch_data->noise_facs_q[0]));
966
172k
    return 0;
967
181k
}
968
969
static void read_sbr_extension(AACDecContext *ac, SpectralBandReplication *sbr,
970
                               GetBitContext *gb,
971
                               int bs_extension_id, int *num_bits_left)
972
117k
{
973
117k
    switch (bs_extension_id) {
974
73.9k
    case EXTENSION_ID_PS:
975
73.9k
        if (!ac->oc[1].m4ac.ps) {
976
3.26k
            av_log(ac->avctx, AV_LOG_ERROR, "Parametric Stereo signaled to be not-present but was found in the bitstream.\n");
977
3.26k
            skip_bits_long(gb, *num_bits_left); // bs_fill_bits
978
3.26k
            *num_bits_left = 0;
979
70.6k
        } else {
980
70.6k
            *num_bits_left -= ff_ps_read_data(ac->avctx, gb, &sbr->ps.common, *num_bits_left);
981
70.6k
            ac->avctx->profile = AV_PROFILE_AAC_HE_V2;
982
            // ensure the warning is not printed if PS extension is present
983
70.6k
            ac->warned_he_aac_mono = 1;
984
70.6k
        }
985
73.9k
        break;
986
43.2k
    default:
987
        // some files contain 0-padding
988
43.2k
        if (bs_extension_id || *num_bits_left > 16 || show_bits(gb, *num_bits_left))
989
42.1k
            avpriv_request_sample(ac->avctx, "Reserved SBR extensions");
990
43.2k
        skip_bits_long(gb, *num_bits_left); // bs_fill_bits
991
43.2k
        *num_bits_left = 0;
992
43.2k
        break;
993
117k
    }
994
117k
}
aacsbr.c:read_sbr_extension
Line
Count
Source
972
61.3k
{
973
61.3k
    switch (bs_extension_id) {
974
38.0k
    case EXTENSION_ID_PS:
975
38.0k
        if (!ac->oc[1].m4ac.ps) {
976
2.53k
            av_log(ac->avctx, AV_LOG_ERROR, "Parametric Stereo signaled to be not-present but was found in the bitstream.\n");
977
2.53k
            skip_bits_long(gb, *num_bits_left); // bs_fill_bits
978
2.53k
            *num_bits_left = 0;
979
35.5k
        } else {
980
35.5k
            *num_bits_left -= ff_ps_read_data(ac->avctx, gb, &sbr->ps.common, *num_bits_left);
981
35.5k
            ac->avctx->profile = AV_PROFILE_AAC_HE_V2;
982
            // ensure the warning is not printed if PS extension is present
983
35.5k
            ac->warned_he_aac_mono = 1;
984
35.5k
        }
985
38.0k
        break;
986
23.2k
    default:
987
        // some files contain 0-padding
988
23.2k
        if (bs_extension_id || *num_bits_left > 16 || show_bits(gb, *num_bits_left))
989
22.3k
            avpriv_request_sample(ac->avctx, "Reserved SBR extensions");
990
23.2k
        skip_bits_long(gb, *num_bits_left); // bs_fill_bits
991
23.2k
        *num_bits_left = 0;
992
23.2k
        break;
993
61.3k
    }
994
61.3k
}
aacsbr_fixed.c:read_sbr_extension
Line
Count
Source
972
55.8k
{
973
55.8k
    switch (bs_extension_id) {
974
35.8k
    case EXTENSION_ID_PS:
975
35.8k
        if (!ac->oc[1].m4ac.ps) {
976
726
            av_log(ac->avctx, AV_LOG_ERROR, "Parametric Stereo signaled to be not-present but was found in the bitstream.\n");
977
726
            skip_bits_long(gb, *num_bits_left); // bs_fill_bits
978
726
            *num_bits_left = 0;
979
35.1k
        } else {
980
35.1k
            *num_bits_left -= ff_ps_read_data(ac->avctx, gb, &sbr->ps.common, *num_bits_left);
981
35.1k
            ac->avctx->profile = AV_PROFILE_AAC_HE_V2;
982
            // ensure the warning is not printed if PS extension is present
983
35.1k
            ac->warned_he_aac_mono = 1;
984
35.1k
        }
985
35.8k
        break;
986
19.9k
    default:
987
        // some files contain 0-padding
988
19.9k
        if (bs_extension_id || *num_bits_left > 16 || show_bits(gb, *num_bits_left))
989
19.7k
            avpriv_request_sample(ac->avctx, "Reserved SBR extensions");
990
19.9k
        skip_bits_long(gb, *num_bits_left); // bs_fill_bits
991
19.9k
        *num_bits_left = 0;
992
19.9k
        break;
993
55.8k
    }
994
55.8k
}
995
996
static int read_sbr_single_channel_element(AACDecContext *ac,
997
                                           SpectralBandReplication *sbr,
998
                                           GetBitContext *gb, int numTimeSlots)
999
155k
{
1000
155k
    int ret;
1001
1002
155k
    if (get_bits1(gb)) // bs_data_extra
1003
38.0k
        skip_bits(gb, 4); // bs_reserved
1004
1005
155k
    if (read_sbr_grid(ac, sbr, gb, &sbr->data[0], numTimeSlots))
1006
9.58k
        return -1;
1007
145k
    read_sbr_dtdf(sbr, gb, &sbr->data[0], 0);
1008
145k
    read_sbr_invf(sbr, gb, &sbr->data[0]);
1009
145k
    if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1010
15.6k
        return ret;
1011
130k
    if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1012
6.94k
        return ret;
1013
1014
123k
    if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb)))
1015
46.2k
        get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]);
1016
1017
123k
    return 0;
1018
130k
}
aacsbr.c:read_sbr_single_channel_element
Line
Count
Source
999
83.3k
{
1000
83.3k
    int ret;
1001
1002
83.3k
    if (get_bits1(gb)) // bs_data_extra
1003
17.8k
        skip_bits(gb, 4); // bs_reserved
1004
1005
83.3k
    if (read_sbr_grid(ac, sbr, gb, &sbr->data[0], numTimeSlots))
1006
5.97k
        return -1;
1007
77.3k
    read_sbr_dtdf(sbr, gb, &sbr->data[0], 0);
1008
77.3k
    read_sbr_invf(sbr, gb, &sbr->data[0]);
1009
77.3k
    if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1010
7.19k
        return ret;
1011
70.1k
    if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1012
2.26k
        return ret;
1013
1014
67.9k
    if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb)))
1015
29.5k
        get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]);
1016
1017
67.9k
    return 0;
1018
70.1k
}
aacsbr_fixed.c:read_sbr_single_channel_element
Line
Count
Source
999
71.9k
{
1000
71.9k
    int ret;
1001
1002
71.9k
    if (get_bits1(gb)) // bs_data_extra
1003
20.2k
        skip_bits(gb, 4); // bs_reserved
1004
1005
71.9k
    if (read_sbr_grid(ac, sbr, gb, &sbr->data[0], numTimeSlots))
1006
3.60k
        return -1;
1007
68.3k
    read_sbr_dtdf(sbr, gb, &sbr->data[0], 0);
1008
68.3k
    read_sbr_invf(sbr, gb, &sbr->data[0]);
1009
68.3k
    if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1010
8.42k
        return ret;
1011
59.9k
    if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1012
4.67k
        return ret;
1013
1014
55.2k
    if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb)))
1015
16.7k
        get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]);
1016
1017
55.2k
    return 0;
1018
59.9k
}
1019
1020
static int read_sbr_channel_pair_element(AACDecContext *ac,
1021
                                         SpectralBandReplication *sbr,
1022
                                         GetBitContext *gb, int numTimeSlots)
1023
239k
{
1024
239k
    int ret;
1025
1026
239k
    if (get_bits1(gb))    // bs_data_extra
1027
27.6k
        skip_bits(gb, 8); // bs_reserved
1028
1029
239k
    if ((sbr->bs_coupling = get_bits1(gb))) {
1030
120k
        if (read_sbr_grid(ac, sbr, gb, &sbr->data[0], numTimeSlots))
1031
11.7k
            return -1;
1032
108k
        copy_sbr_grid(&sbr->data[1], &sbr->data[0]);
1033
108k
        read_sbr_dtdf(sbr, gb, &sbr->data[0], 0);
1034
108k
        read_sbr_dtdf(sbr, gb, &sbr->data[1], 0);
1035
108k
        read_sbr_invf(sbr, gb, &sbr->data[0]);
1036
108k
        memcpy(sbr->data[1].bs_invf_mode[1], sbr->data[1].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0]));
1037
108k
        memcpy(sbr->data[1].bs_invf_mode[0], sbr->data[0].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0]));
1038
108k
        if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1039
8.78k
            return ret;
1040
99.8k
        if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1041
3.60k
            return ret;
1042
96.2k
        if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1043
34.0k
            return ret;
1044
62.2k
        if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1045
7.41k
            return ret;
1046
119k
    } else {
1047
119k
        if (read_sbr_grid(ac, sbr, gb, &sbr->data[0], numTimeSlots) ||
1048
113k
            read_sbr_grid(ac, sbr, gb, &sbr->data[1], numTimeSlots))
1049
9.77k
            return -1;
1050
109k
        read_sbr_dtdf(sbr, gb, &sbr->data[0], 0);
1051
109k
        read_sbr_dtdf(sbr, gb, &sbr->data[1], 0);
1052
109k
        read_sbr_invf(sbr, gb, &sbr->data[0]);
1053
109k
        read_sbr_invf(sbr, gb, &sbr->data[1]);
1054
109k
        if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1055
6.20k
            return ret;
1056
103k
        if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1057
6.82k
            return ret;
1058
96.3k
        if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1059
17.4k
            return ret;
1060
78.8k
        if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1061
19.6k
            return ret;
1062
78.8k
    }
1063
1064
113k
    if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb)))
1065
37.7k
        get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]);
1066
113k
    if ((sbr->data[1].bs_add_harmonic_flag = get_bits1(gb)))
1067
31.4k
        get_bits1_vector(gb, sbr->data[1].bs_add_harmonic, sbr->n[1]);
1068
1069
113k
    return 0;
1070
239k
}
aacsbr.c:read_sbr_channel_pair_element
Line
Count
Source
1023
165k
{
1024
165k
    int ret;
1025
1026
165k
    if (get_bits1(gb))    // bs_data_extra
1027
19.7k
        skip_bits(gb, 8); // bs_reserved
1028
1029
165k
    if ((sbr->bs_coupling = get_bits1(gb))) {
1030
81.9k
        if (read_sbr_grid(ac, sbr, gb, &sbr->data[0], numTimeSlots))
1031
10.5k
            return -1;
1032
71.4k
        copy_sbr_grid(&sbr->data[1], &sbr->data[0]);
1033
71.4k
        read_sbr_dtdf(sbr, gb, &sbr->data[0], 0);
1034
71.4k
        read_sbr_dtdf(sbr, gb, &sbr->data[1], 0);
1035
71.4k
        read_sbr_invf(sbr, gb, &sbr->data[0]);
1036
71.4k
        memcpy(sbr->data[1].bs_invf_mode[1], sbr->data[1].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0]));
1037
71.4k
        memcpy(sbr->data[1].bs_invf_mode[0], sbr->data[0].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0]));
1038
71.4k
        if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1039
6.90k
            return ret;
1040
64.5k
        if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1041
2.30k
            return ret;
1042
62.2k
        if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1043
32.6k
            return ret;
1044
29.5k
        if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1045
6.45k
            return ret;
1046
83.6k
    } else {
1047
83.6k
        if (read_sbr_grid(ac, sbr, gb, &sbr->data[0], numTimeSlots) ||
1048
80.0k
            read_sbr_grid(ac, sbr, gb, &sbr->data[1], numTimeSlots))
1049
6.90k
            return -1;
1050
76.7k
        read_sbr_dtdf(sbr, gb, &sbr->data[0], 0);
1051
76.7k
        read_sbr_dtdf(sbr, gb, &sbr->data[1], 0);
1052
76.7k
        read_sbr_invf(sbr, gb, &sbr->data[0]);
1053
76.7k
        read_sbr_invf(sbr, gb, &sbr->data[1]);
1054
76.7k
        if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1055
4.91k
            return ret;
1056
71.8k
        if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1057
2.69k
            return ret;
1058
69.1k
        if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1059
16.5k
            return ret;
1060
52.6k
        if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1061
19.1k
            return ret;
1062
52.6k
    }
1063
1064
56.5k
    if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb)))
1065
25.3k
        get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]);
1066
56.5k
    if ((sbr->data[1].bs_add_harmonic_flag = get_bits1(gb)))
1067
19.9k
        get_bits1_vector(gb, sbr->data[1].bs_add_harmonic, sbr->n[1]);
1068
1069
56.5k
    return 0;
1070
165k
}
aacsbr_fixed.c:read_sbr_channel_pair_element
Line
Count
Source
1023
73.8k
{
1024
73.8k
    int ret;
1025
1026
73.8k
    if (get_bits1(gb))    // bs_data_extra
1027
7.96k
        skip_bits(gb, 8); // bs_reserved
1028
1029
73.8k
    if ((sbr->bs_coupling = get_bits1(gb))) {
1030
38.3k
        if (read_sbr_grid(ac, sbr, gb, &sbr->data[0], numTimeSlots))
1031
1.22k
            return -1;
1032
37.1k
        copy_sbr_grid(&sbr->data[1], &sbr->data[0]);
1033
37.1k
        read_sbr_dtdf(sbr, gb, &sbr->data[0], 0);
1034
37.1k
        read_sbr_dtdf(sbr, gb, &sbr->data[1], 0);
1035
37.1k
        read_sbr_invf(sbr, gb, &sbr->data[0]);
1036
37.1k
        memcpy(sbr->data[1].bs_invf_mode[1], sbr->data[1].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0]));
1037
37.1k
        memcpy(sbr->data[1].bs_invf_mode[0], sbr->data[0].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0]));
1038
37.1k
        if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1039
1.87k
            return ret;
1040
35.2k
        if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1041
1.30k
            return ret;
1042
33.9k
        if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1043
1.33k
            return ret;
1044
32.6k
        if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1045
962
            return ret;
1046
35.4k
    } else {
1047
35.4k
        if (read_sbr_grid(ac, sbr, gb, &sbr->data[0], numTimeSlots) ||
1048
33.2k
            read_sbr_grid(ac, sbr, gb, &sbr->data[1], numTimeSlots))
1049
2.86k
            return -1;
1050
32.5k
        read_sbr_dtdf(sbr, gb, &sbr->data[0], 0);
1051
32.5k
        read_sbr_dtdf(sbr, gb, &sbr->data[1], 0);
1052
32.5k
        read_sbr_invf(sbr, gb, &sbr->data[0]);
1053
32.5k
        read_sbr_invf(sbr, gb, &sbr->data[1]);
1054
32.5k
        if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1055
1.29k
            return ret;
1056
31.2k
        if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1057
4.13k
            return ret;
1058
27.1k
        if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1059
945
            return ret;
1060
26.2k
        if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1061
491
            return ret;
1062
26.2k
    }
1063
1064
57.4k
    if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb)))
1065
12.3k
        get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]);
1066
57.4k
    if ((sbr->data[1].bs_add_harmonic_flag = get_bits1(gb)))
1067
11.5k
        get_bits1_vector(gb, sbr->data[1].bs_add_harmonic, sbr->n[1]);
1068
1069
57.4k
    return 0;
1070
73.8k
}
1071
1072
static unsigned int read_sbr_data(AACDecContext *ac, SpectralBandReplication *sbr,
1073
                                  GetBitContext *gb, int id_aac, int numTimeSlots)
1074
394k
{
1075
394k
    unsigned int cnt = get_bits_count(gb);
1076
1077
394k
    sbr->id_aac = id_aac;
1078
394k
    sbr->ready_for_dequant = 1;
1079
1080
394k
    if (id_aac == TYPE_SCE || id_aac == TYPE_CCE) {
1081
155k
        if (read_sbr_single_channel_element(ac, sbr, gb, numTimeSlots)) {
1082
32.1k
            sbr_turnoff(sbr);
1083
32.1k
            return get_bits_count(gb) - cnt;
1084
32.1k
        }
1085
239k
    } else if (id_aac == TYPE_CPE) {
1086
239k
        if (read_sbr_channel_pair_element(ac, sbr, gb, numTimeSlots)) {
1087
125k
            sbr_turnoff(sbr);
1088
125k
            return get_bits_count(gb) - cnt;
1089
125k
        }
1090
239k
    } else {
1091
165
        av_log(ac->avctx, AV_LOG_ERROR,
1092
165
            "Invalid bitstream - cannot apply SBR to element type %d\n", id_aac);
1093
165
        sbr_turnoff(sbr);
1094
165
        return get_bits_count(gb) - cnt;
1095
165
    }
1096
237k
    if (get_bits1(gb)) { // bs_extended_data
1097
97.0k
        int num_bits_left = get_bits(gb, 4); // bs_extension_size
1098
97.0k
        if (num_bits_left == 15)
1099
9.55k
            num_bits_left += get_bits(gb, 8); // bs_esc_count
1100
1101
97.0k
        num_bits_left <<= 3;
1102
214k
        while (num_bits_left > 7) {
1103
117k
            num_bits_left -= 2;
1104
117k
            read_sbr_extension(ac, sbr, gb, get_bits(gb, 2), &num_bits_left); // bs_extension_id
1105
117k
        }
1106
97.0k
        if (num_bits_left < 0) {
1107
0
            av_log(ac->avctx, AV_LOG_ERROR, "SBR Extension over read.\n");
1108
0
        }
1109
97.0k
        if (num_bits_left > 0)
1110
1.91k
            skip_bits(gb, num_bits_left);
1111
97.0k
    }
1112
1113
237k
    return get_bits_count(gb) - cnt;
1114
394k
}
aacsbr.c:read_sbr_data
Line
Count
Source
1074
249k
{
1075
249k
    unsigned int cnt = get_bits_count(gb);
1076
1077
249k
    sbr->id_aac = id_aac;
1078
249k
    sbr->ready_for_dequant = 1;
1079
1080
249k
    if (id_aac == TYPE_SCE || id_aac == TYPE_CCE) {
1081
83.3k
        if (read_sbr_single_channel_element(ac, sbr, gb, numTimeSlots)) {
1082
15.4k
            sbr_turnoff(sbr);
1083
15.4k
            return get_bits_count(gb) - cnt;
1084
15.4k
        }
1085
165k
    } else if (id_aac == TYPE_CPE) {
1086
165k
        if (read_sbr_channel_pair_element(ac, sbr, gb, numTimeSlots)) {
1087
109k
            sbr_turnoff(sbr);
1088
109k
            return get_bits_count(gb) - cnt;
1089
109k
        }
1090
165k
    } else {
1091
72
        av_log(ac->avctx, AV_LOG_ERROR,
1092
72
            "Invalid bitstream - cannot apply SBR to element type %d\n", id_aac);
1093
72
        sbr_turnoff(sbr);
1094
72
        return get_bits_count(gb) - cnt;
1095
72
    }
1096
124k
    if (get_bits1(gb)) { // bs_extended_data
1097
55.0k
        int num_bits_left = get_bits(gb, 4); // bs_extension_size
1098
55.0k
        if (num_bits_left == 15)
1099
4.07k
            num_bits_left += get_bits(gb, 8); // bs_esc_count
1100
1101
55.0k
        num_bits_left <<= 3;
1102
116k
        while (num_bits_left > 7) {
1103
61.3k
            num_bits_left -= 2;
1104
61.3k
            read_sbr_extension(ac, sbr, gb, get_bits(gb, 2), &num_bits_left); // bs_extension_id
1105
61.3k
        }
1106
55.0k
        if (num_bits_left < 0) {
1107
0
            av_log(ac->avctx, AV_LOG_ERROR, "SBR Extension over read.\n");
1108
0
        }
1109
55.0k
        if (num_bits_left > 0)
1110
1.07k
            skip_bits(gb, num_bits_left);
1111
55.0k
    }
1112
1113
124k
    return get_bits_count(gb) - cnt;
1114
249k
}
aacsbr_fixed.c:read_sbr_data
Line
Count
Source
1074
145k
{
1075
145k
    unsigned int cnt = get_bits_count(gb);
1076
1077
145k
    sbr->id_aac = id_aac;
1078
145k
    sbr->ready_for_dequant = 1;
1079
1080
145k
    if (id_aac == TYPE_SCE || id_aac == TYPE_CCE) {
1081
71.9k
        if (read_sbr_single_channel_element(ac, sbr, gb, numTimeSlots)) {
1082
16.7k
            sbr_turnoff(sbr);
1083
16.7k
            return get_bits_count(gb) - cnt;
1084
16.7k
        }
1085
73.9k
    } else if (id_aac == TYPE_CPE) {
1086
73.8k
        if (read_sbr_channel_pair_element(ac, sbr, gb, numTimeSlots)) {
1087
16.4k
            sbr_turnoff(sbr);
1088
16.4k
            return get_bits_count(gb) - cnt;
1089
16.4k
        }
1090
73.8k
    } else {
1091
93
        av_log(ac->avctx, AV_LOG_ERROR,
1092
93
            "Invalid bitstream - cannot apply SBR to element type %d\n", id_aac);
1093
93
        sbr_turnoff(sbr);
1094
93
        return get_bits_count(gb) - cnt;
1095
93
    }
1096
112k
    if (get_bits1(gb)) { // bs_extended_data
1097
41.9k
        int num_bits_left = get_bits(gb, 4); // bs_extension_size
1098
41.9k
        if (num_bits_left == 15)
1099
5.47k
            num_bits_left += get_bits(gb, 8); // bs_esc_count
1100
1101
41.9k
        num_bits_left <<= 3;
1102
97.8k
        while (num_bits_left > 7) {
1103
55.8k
            num_bits_left -= 2;
1104
55.8k
            read_sbr_extension(ac, sbr, gb, get_bits(gb, 2), &num_bits_left); // bs_extension_id
1105
55.8k
        }
1106
41.9k
        if (num_bits_left < 0) {
1107
0
            av_log(ac->avctx, AV_LOG_ERROR, "SBR Extension over read.\n");
1108
0
        }
1109
41.9k
        if (num_bits_left > 0)
1110
834
            skip_bits(gb, num_bits_left);
1111
41.9k
    }
1112
1113
112k
    return get_bits_count(gb) - cnt;
1114
145k
}
1115
1116
static void sbr_reset(AACDecContext *ac, SpectralBandReplication *sbr)
1117
447k
{
1118
447k
    int err;
1119
447k
    err = sbr_make_f_master(ac, sbr, &sbr->spectrum_params);
1120
447k
    if (err >= 0)
1121
371k
        err = sbr_make_f_derived(ac, sbr);
1122
447k
    if (err < 0) {
1123
89.5k
        av_log(ac->avctx, AV_LOG_ERROR,
1124
89.5k
               "SBR reset failed. Switching SBR to pure upsampling mode.\n");
1125
89.5k
        sbr_turnoff(sbr);
1126
89.5k
    }
1127
447k
}
aacsbr.c:sbr_reset
Line
Count
Source
1117
320k
{
1118
320k
    int err;
1119
320k
    err = sbr_make_f_master(ac, sbr, &sbr->spectrum_params);
1120
320k
    if (err >= 0)
1121
253k
        err = sbr_make_f_derived(ac, sbr);
1122
320k
    if (err < 0) {
1123
73.0k
        av_log(ac->avctx, AV_LOG_ERROR,
1124
73.0k
               "SBR reset failed. Switching SBR to pure upsampling mode.\n");
1125
73.0k
        sbr_turnoff(sbr);
1126
73.0k
    }
1127
320k
}
aacsbr_fixed.c:sbr_reset
Line
Count
Source
1117
127k
{
1118
127k
    int err;
1119
127k
    err = sbr_make_f_master(ac, sbr, &sbr->spectrum_params);
1120
127k
    if (err >= 0)
1121
118k
        err = sbr_make_f_derived(ac, sbr);
1122
127k
    if (err < 0) {
1123
16.4k
        av_log(ac->avctx, AV_LOG_ERROR,
1124
16.4k
               "SBR reset failed. Switching SBR to pure upsampling mode.\n");
1125
16.4k
        sbr_turnoff(sbr);
1126
16.4k
    }
1127
127k
}
1128
1129
/**
1130
 * Decode Spectral Band Replication extension data; reference: table 4.55.
1131
 *
1132
 * @param   crc flag indicating the presence of CRC checksum
1133
 * @param   cnt length of TYPE_FIL syntactic element in bytes
1134
 *
1135
 * @return  Returns number of bytes consumed from the TYPE_FIL element.
1136
 */
1137
int AAC_RENAME(ff_aac_sbr_decode_extension)(AACDecContext *ac, ChannelElement *che,
1138
                                            GetBitContext *gb_host, int crc,
1139
                                            int cnt, int id_aac, int fl960)
1140
468k
{
1141
468k
    SpectralBandReplication *sbr = get_sbr(che);
1142
468k
    unsigned int num_sbr_bits = 0, num_align_bits;
1143
468k
    unsigned bytes_read;
1144
468k
    GetBitContext gbc = *gb_host, *gb = &gbc;
1145
468k
    int numTimeSlots = fl960 ? 15 : 16;
1146
468k
    skip_bits_long(gb_host, cnt*8 - 4);
1147
1148
468k
    sbr->reset = 0;
1149
1150
468k
    if (!sbr->sample_rate)
1151
16.0k
        sbr->sample_rate = 2 * ac->oc[1].m4ac.sample_rate; //TODO use the nominal sample rate for arbitrary sample rate support
1152
468k
    if (!ac->oc[1].m4ac.ext_sample_rate)
1153
39.2k
        ac->oc[1].m4ac.ext_sample_rate = 2 * ac->oc[1].m4ac.sample_rate;
1154
1155
468k
    if (crc) {
1156
200k
        skip_bits(gb, 10); // bs_sbr_crc_bits; TODO - implement CRC check
1157
200k
        num_sbr_bits += 10;
1158
200k
    }
1159
1160
    //Save some state from the previous frame.
1161
468k
    sbr->kx[0] = sbr->kx[1];
1162
468k
    sbr->m[0] = sbr->m[1];
1163
468k
    sbr->kx_and_m_pushed = 1;
1164
1165
468k
    num_sbr_bits++;
1166
468k
    if (get_bits1(gb)) // bs_header_flag
1167
455k
        num_sbr_bits += read_sbr_header(sbr, gb, 0);
1168
1169
468k
    if (sbr->reset)
1170
416k
        sbr_reset(ac, sbr);
1171
1172
468k
    if (sbr->start)
1173
394k
        num_sbr_bits += read_sbr_data(ac, sbr, gb, id_aac, numTimeSlots);
1174
1175
468k
    num_align_bits = ((cnt << 3) - 4 - num_sbr_bits) & 7;
1176
468k
    bytes_read = ((num_sbr_bits + num_align_bits + 4) >> 3);
1177
1178
468k
    if (bytes_read > cnt) {
1179
319k
        av_log(ac->avctx, AV_LOG_ERROR,
1180
319k
               "Expected to read %d SBR bytes actually read %d.\n", cnt, bytes_read);
1181
319k
        sbr_turnoff(sbr);
1182
319k
    }
1183
468k
    return cnt;
1184
468k
}
ff_aac_sbr_decode_extension
Line
Count
Source
1140
304k
{
1141
304k
    SpectralBandReplication *sbr = get_sbr(che);
1142
304k
    unsigned int num_sbr_bits = 0, num_align_bits;
1143
304k
    unsigned bytes_read;
1144
304k
    GetBitContext gbc = *gb_host, *gb = &gbc;
1145
304k
    int numTimeSlots = fl960 ? 15 : 16;
1146
304k
    skip_bits_long(gb_host, cnt*8 - 4);
1147
1148
304k
    sbr->reset = 0;
1149
1150
304k
    if (!sbr->sample_rate)
1151
9.06k
        sbr->sample_rate = 2 * ac->oc[1].m4ac.sample_rate; //TODO use the nominal sample rate for arbitrary sample rate support
1152
304k
    if (!ac->oc[1].m4ac.ext_sample_rate)
1153
25.9k
        ac->oc[1].m4ac.ext_sample_rate = 2 * ac->oc[1].m4ac.sample_rate;
1154
1155
304k
    if (crc) {
1156
155k
        skip_bits(gb, 10); // bs_sbr_crc_bits; TODO - implement CRC check
1157
155k
        num_sbr_bits += 10;
1158
155k
    }
1159
1160
    //Save some state from the previous frame.
1161
304k
    sbr->kx[0] = sbr->kx[1];
1162
304k
    sbr->m[0] = sbr->m[1];
1163
304k
    sbr->kx_and_m_pushed = 1;
1164
1165
304k
    num_sbr_bits++;
1166
304k
    if (get_bits1(gb)) // bs_header_flag
1167
294k
        num_sbr_bits += read_sbr_header(sbr, gb, 0);
1168
1169
304k
    if (sbr->reset)
1170
289k
        sbr_reset(ac, sbr);
1171
1172
304k
    if (sbr->start)
1173
249k
        num_sbr_bits += read_sbr_data(ac, sbr, gb, id_aac, numTimeSlots);
1174
1175
304k
    num_align_bits = ((cnt << 3) - 4 - num_sbr_bits) & 7;
1176
304k
    bytes_read = ((num_sbr_bits + num_align_bits + 4) >> 3);
1177
1178
304k
    if (bytes_read > cnt) {
1179
259k
        av_log(ac->avctx, AV_LOG_ERROR,
1180
259k
               "Expected to read %d SBR bytes actually read %d.\n", cnt, bytes_read);
1181
259k
        sbr_turnoff(sbr);
1182
259k
    }
1183
304k
    return cnt;
1184
304k
}
ff_aac_sbr_decode_extension_fixed
Line
Count
Source
1140
164k
{
1141
164k
    SpectralBandReplication *sbr = get_sbr(che);
1142
164k
    unsigned int num_sbr_bits = 0, num_align_bits;
1143
164k
    unsigned bytes_read;
1144
164k
    GetBitContext gbc = *gb_host, *gb = &gbc;
1145
164k
    int numTimeSlots = fl960 ? 15 : 16;
1146
164k
    skip_bits_long(gb_host, cnt*8 - 4);
1147
1148
164k
    sbr->reset = 0;
1149
1150
164k
    if (!sbr->sample_rate)
1151
6.95k
        sbr->sample_rate = 2 * ac->oc[1].m4ac.sample_rate; //TODO use the nominal sample rate for arbitrary sample rate support
1152
164k
    if (!ac->oc[1].m4ac.ext_sample_rate)
1153
13.2k
        ac->oc[1].m4ac.ext_sample_rate = 2 * ac->oc[1].m4ac.sample_rate;
1154
1155
164k
    if (crc) {
1156
44.8k
        skip_bits(gb, 10); // bs_sbr_crc_bits; TODO - implement CRC check
1157
44.8k
        num_sbr_bits += 10;
1158
44.8k
    }
1159
1160
    //Save some state from the previous frame.
1161
164k
    sbr->kx[0] = sbr->kx[1];
1162
164k
    sbr->m[0] = sbr->m[1];
1163
164k
    sbr->kx_and_m_pushed = 1;
1164
1165
164k
    num_sbr_bits++;
1166
164k
    if (get_bits1(gb)) // bs_header_flag
1167
161k
        num_sbr_bits += read_sbr_header(sbr, gb, 0);
1168
1169
164k
    if (sbr->reset)
1170
127k
        sbr_reset(ac, sbr);
1171
1172
164k
    if (sbr->start)
1173
145k
        num_sbr_bits += read_sbr_data(ac, sbr, gb, id_aac, numTimeSlots);
1174
1175
164k
    num_align_bits = ((cnt << 3) - 4 - num_sbr_bits) & 7;
1176
164k
    bytes_read = ((num_sbr_bits + num_align_bits + 4) >> 3);
1177
1178
164k
    if (bytes_read > cnt) {
1179
59.7k
        av_log(ac->avctx, AV_LOG_ERROR,
1180
59.7k
               "Expected to read %d SBR bytes actually read %d.\n", cnt, bytes_read);
1181
59.7k
        sbr_turnoff(sbr);
1182
59.7k
    }
1183
164k
    return cnt;
1184
164k
}
1185
1186
#if !USE_FIXED
1187
static void copy_usac_default_header(SpectralBandReplication *sbr,
1188
                                     AACUsacElemConfig *ue)
1189
10.8k
{
1190
10.8k
    sbr->inter_tes = ue->sbr.bs_intertes;
1191
1192
10.8k
    sbr->spectrum_params.bs_start_freq = ue->sbr.dflt.start_freq;
1193
10.8k
    sbr->spectrum_params.bs_stop_freq = ue->sbr.dflt.stop_freq;
1194
1195
10.8k
    sbr->spectrum_params.bs_freq_scale = ue->sbr.dflt.freq_scale;
1196
10.8k
    sbr->spectrum_params.bs_alter_scale = ue->sbr.dflt.alter_scale;
1197
10.8k
    sbr->spectrum_params.bs_noise_bands = ue->sbr.dflt.noise_bands;
1198
1199
10.8k
    sbr->bs_limiter_bands = ue->sbr.dflt.limiter_bands;
1200
10.8k
    sbr->bs_limiter_gains = ue->sbr.dflt.limiter_gains;
1201
10.8k
    sbr->bs_interpol_freq = ue->sbr.dflt.interpol_freq;
1202
10.8k
    sbr->bs_smoothing_mode = ue->sbr.dflt.smoothing_mode;
1203
10.8k
}
1204
1205
int ff_aac_sbr_config_usac(AACDecContext *ac, ChannelElement *che,
1206
                           AACUsacElemConfig *ue)
1207
1.25M
{
1208
1.25M
    SpectralBandReplication *sbr = get_sbr(che);
1209
1.25M
    sbr_turnoff(sbr);
1210
1.25M
    return 0;
1211
1.25M
}
1212
1213
int ff_aac_sbr_decode_usac_data(AACDecContext *ac, ChannelElement *che,
1214
                                AACUsacElemConfig *ue, GetBitContext *gb,
1215
                                int sbr_ch, int indep_flag)
1216
751k
{
1217
751k
    int ret;
1218
751k
    SpectralBandReplication *sbr = get_sbr(che);
1219
751k
    int info_present = 1;
1220
751k
    int header_present = 1;
1221
1222
751k
    sbr->reset = 0;
1223
751k
    sbr->usac = 1;
1224
1225
751k
    sbr->sample_rate = ac->oc[1].m4ac.ext_sample_rate;
1226
751k
    sbr->id_aac = sbr_ch == 2 ? TYPE_CPE : TYPE_SCE;
1227
1228
751k
    if (!indep_flag) {
1229
733k
        info_present = get_bits1(gb);
1230
733k
        if (info_present)
1231
32.9k
            header_present = get_bits1(gb);
1232
700k
        else
1233
700k
            header_present = 0;
1234
733k
    }
1235
1236
751k
    if (info_present) {
1237
        /* SbrInfo() */
1238
51.1k
        sbr->bs_amp_res_header = get_bits1(gb);
1239
51.1k
        sbr->spectrum_params.bs_xover_band = get_bits(gb, 4);
1240
51.1k
        sbr->bs_sbr_preprocessing = get_bits1(gb);
1241
        /* if (bs_pvc) ... */
1242
51.1k
    }
1243
1244
751k
    if (header_present) {
1245
30.6k
        if (get_bits1(gb)) {
1246
10.8k
            int old_bs_limiter_bands = sbr->bs_limiter_bands;
1247
10.8k
            SpectrumParameters old_spectrum_params;
1248
10.8k
            memcpy(&old_spectrum_params, &sbr->spectrum_params,
1249
10.8k
                   sizeof(SpectrumParameters));
1250
1251
10.8k
            copy_usac_default_header(sbr, ue);
1252
            // Check if spectrum parameters changed
1253
10.8k
            if (memcmp(&old_spectrum_params, &sbr->spectrum_params,
1254
10.8k
                       sizeof(SpectrumParameters)))
1255
10.5k
                sbr->reset = 1;
1256
1257
10.8k
            if (sbr->bs_limiter_bands != old_bs_limiter_bands && !sbr->reset)
1258
0
                sbr_make_f_tablelim(sbr);
1259
19.7k
        } else {
1260
19.7k
            read_sbr_header(sbr, gb, 1);
1261
19.7k
        }
1262
1263
30.6k
        sbr->start = 1;
1264
30.6k
    }
1265
1266
    //Save some state from the previous frame.
1267
751k
    sbr->kx[0] = sbr->kx[1];
1268
751k
    sbr->m[0] = sbr->m[1];
1269
751k
    sbr->kx_and_m_pushed = 1;
1270
1271
751k
    if (sbr->reset)
1272
30.3k
        sbr_reset(ac, sbr);
1273
1274
751k
    sbr->ready_for_dequant = 1;
1275
1276
751k
    if (sbr_ch == 1) { /* sbr_single_channel_element */
1277
        /* if (harmonicSBR) ... */
1278
1279
494k
        if (read_sbr_grid(ac, sbr, gb, &sbr->data[0], 16))
1280
7.56k
            return -1;
1281
1282
486k
        read_sbr_dtdf(sbr, gb, &sbr->data[0], indep_flag);
1283
486k
        read_sbr_invf(sbr, gb, &sbr->data[0]);
1284
1285
486k
        if ((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1286
1.78k
            return ret;
1287
1288
485k
        if ((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1289
988
            return ret;
1290
1291
484k
        if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb)))
1292
28.3k
            get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]);
1293
484k
    } else if (get_bits1(gb)) { /* bs_coupling == 1 */
1294
15.6k
        sbr->bs_coupling = 1;
1295
1296
        /* if (harmonicSBR) ... */
1297
1298
15.6k
        if (read_sbr_grid(ac, sbr, gb, &sbr->data[0], 16))
1299
6.10k
            return -1;
1300
9.55k
        copy_sbr_grid(&sbr->data[1], &sbr->data[0]);
1301
1302
9.55k
        read_sbr_dtdf(sbr, gb, &sbr->data[0], indep_flag);
1303
9.55k
        read_sbr_dtdf(sbr, gb, &sbr->data[1], indep_flag);
1304
1305
9.55k
        read_sbr_invf(sbr, gb, &sbr->data[0]);
1306
9.55k
        memcpy(sbr->data[1].bs_invf_mode[1], sbr->data[1].bs_invf_mode[0],
1307
9.55k
               sizeof(sbr->data[1].bs_invf_mode[0]));
1308
9.55k
        memcpy(sbr->data[1].bs_invf_mode[0], sbr->data[0].bs_invf_mode[0],
1309
9.55k
               sizeof(sbr->data[1].bs_invf_mode[0]));
1310
1311
9.55k
        if ((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1312
1.43k
            return ret;
1313
8.11k
        if ((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1314
828
            return ret;
1315
1316
7.29k
        if ((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1317
708
            return ret;
1318
6.58k
        if ((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1319
461
            return ret;
1320
1321
6.12k
        if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb)))
1322
2.80k
            get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]);
1323
6.12k
        if ((sbr->data[1].bs_add_harmonic_flag = get_bits1(gb)))
1324
2.70k
            get_bits1_vector(gb, sbr->data[1].bs_add_harmonic, sbr->n[1]);
1325
241k
    } else { /* bs_coupling == 0 */
1326
241k
        sbr->bs_coupling = 0;
1327
1328
        /* if (harmonicSBR) ... */
1329
1330
241k
        if (read_sbr_grid(ac, sbr, gb, &sbr->data[0], 16))
1331
3.58k
            return -1;
1332
238k
        if (read_sbr_grid(ac, sbr, gb, &sbr->data[1], 16))
1333
20.7k
            return -1;
1334
1335
217k
        read_sbr_dtdf(sbr, gb, &sbr->data[0], indep_flag);
1336
217k
        read_sbr_dtdf(sbr, gb, &sbr->data[1], indep_flag);
1337
1338
217k
        read_sbr_invf(sbr, gb, &sbr->data[0]);
1339
217k
        read_sbr_invf(sbr, gb, &sbr->data[1]);
1340
1341
217k
        if ((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1342
15.1k
            return ret;
1343
202k
        if ((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1344
2.90k
            return ret;
1345
1346
199k
        if ((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1347
2.86k
            return ret;
1348
196k
        if ((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1349
2.24k
            return ret;
1350
1351
194k
        if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb)))
1352
20.1k
            get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]);
1353
194k
        if ((sbr->data[1].bs_add_harmonic_flag = get_bits1(gb)))
1354
22.1k
            get_bits1_vector(gb, sbr->data[1].bs_add_harmonic, sbr->n[1]);
1355
194k
    }
1356
1357
684k
    return 0;
1358
751k
}
1359
#endif
1360
1361
/**
1362
 * Analysis QMF Bank (14496-3 sp04 p206)
1363
 *
1364
 * @param   x       pointer to the beginning of the first sample window
1365
 * @param   W       array of complex-valued samples split into subbands
1366
 */
1367
#ifndef sbr_qmf_analysis
1368
#if USE_FIXED
1369
static void sbr_qmf_analysis(AVFixedDSPContext *dsp, AVTXContext *mdct,
1370
                             av_tx_fn mdct_fn,
1371
#else
1372
static void sbr_qmf_analysis(AVFloatDSPContext *dsp, AVTXContext *mdct,
1373
                             av_tx_fn mdct_fn,
1374
#endif /* USE_FIXED */
1375
                             SBRDSPContext *sbrdsp, const INTFLOAT *in, INTFLOAT *x,
1376
                             INTFLOAT z[320], INTFLOAT W[2][32][32][2], int buf_idx,
1377
                             int numTimeSlots)
1378
1.29M
{
1379
1.29M
    int i;
1380
#if USE_FIXED
1381
    int j;
1382
#endif
1383
1.29M
    int nb = numTimeSlots * 64;
1384
1.29M
    memcpy(x    , x+nb, (320-32)*sizeof(x[0]));
1385
1.29M
    memcpy(x+288, in,         nb*sizeof(x[0]));
1386
42.7M
    for (i = 0; i < numTimeSlots*2; i++) { // RATE*numTimeSlots = 2* 16 or 15
1387
41.4M
        dsp->vector_fmul_reverse(z, sbr_qmf_window_ds, x, 320);
1388
41.4M
        sbrdsp->sum64x5(z);
1389
41.4M
        sbrdsp->qmf_pre_shuffle(z);
1390
#if USE_FIXED
1391
623M
        for (j = 64; j < 128; j++) {
1392
614M
            if (z[j] > 1<<24) {
1393
46.5M
                av_log(NULL, AV_LOG_WARNING,
1394
46.5M
                       "sbr_qmf_analysis: value %09d too large, setting to %09d\n",
1395
46.5M
                       z[j], 1<<24);
1396
46.5M
                z[j] = 1<<24;
1397
567M
            } else if (z[j] < -(1<<24)) {
1398
46.7M
                av_log(NULL, AV_LOG_WARNING,
1399
46.7M
                       "sbr_qmf_analysis: value %09d too small, setting to %09d\n",
1400
46.7M
                       z[j], -(1<<24));
1401
46.7M
                z[j] = -(1<<24);
1402
46.7M
            }
1403
614M
        }
1404
#endif
1405
41.4M
        mdct_fn(mdct, z, z + 64, sizeof(INTFLOAT));
1406
41.4M
        sbrdsp->qmf_post_shuffle(W[buf_idx][i], z);
1407
41.4M
        x += 32;
1408
41.4M
    }
1409
1.29M
}
aacsbr.c:sbr_qmf_analysis
Line
Count
Source
1378
995k
{
1379
995k
    int i;
1380
#if USE_FIXED
1381
    int j;
1382
#endif
1383
995k
    int nb = numTimeSlots * 64;
1384
995k
    memcpy(x    , x+nb, (320-32)*sizeof(x[0]));
1385
995k
    memcpy(x+288, in,         nb*sizeof(x[0]));
1386
32.8M
    for (i = 0; i < numTimeSlots*2; i++) { // RATE*numTimeSlots = 2* 16 or 15
1387
31.8M
        dsp->vector_fmul_reverse(z, sbr_qmf_window_ds, x, 320);
1388
31.8M
        sbrdsp->sum64x5(z);
1389
31.8M
        sbrdsp->qmf_pre_shuffle(z);
1390
#if USE_FIXED
1391
        for (j = 64; j < 128; j++) {
1392
            if (z[j] > 1<<24) {
1393
                av_log(NULL, AV_LOG_WARNING,
1394
                       "sbr_qmf_analysis: value %09d too large, setting to %09d\n",
1395
                       z[j], 1<<24);
1396
                z[j] = 1<<24;
1397
            } else if (z[j] < -(1<<24)) {
1398
                av_log(NULL, AV_LOG_WARNING,
1399
                       "sbr_qmf_analysis: value %09d too small, setting to %09d\n",
1400
                       z[j], -(1<<24));
1401
                z[j] = -(1<<24);
1402
            }
1403
        }
1404
#endif
1405
31.8M
        mdct_fn(mdct, z, z + 64, sizeof(INTFLOAT));
1406
31.8M
        sbrdsp->qmf_post_shuffle(W[buf_idx][i], z);
1407
31.8M
        x += 32;
1408
31.8M
    }
1409
995k
}
aacsbr_fixed.c:sbr_qmf_analysis
Line
Count
Source
1378
299k
{
1379
299k
    int i;
1380
299k
#if USE_FIXED
1381
299k
    int j;
1382
299k
#endif
1383
299k
    int nb = numTimeSlots * 64;
1384
299k
    memcpy(x    , x+nb, (320-32)*sizeof(x[0]));
1385
299k
    memcpy(x+288, in,         nb*sizeof(x[0]));
1386
9.89M
    for (i = 0; i < numTimeSlots*2; i++) { // RATE*numTimeSlots = 2* 16 or 15
1387
9.59M
        dsp->vector_fmul_reverse(z, sbr_qmf_window_ds, x, 320);
1388
9.59M
        sbrdsp->sum64x5(z);
1389
9.59M
        sbrdsp->qmf_pre_shuffle(z);
1390
9.59M
#if USE_FIXED
1391
623M
        for (j = 64; j < 128; j++) {
1392
614M
            if (z[j] > 1<<24) {
1393
46.5M
                av_log(NULL, AV_LOG_WARNING,
1394
46.5M
                       "sbr_qmf_analysis: value %09d too large, setting to %09d\n",
1395
46.5M
                       z[j], 1<<24);
1396
46.5M
                z[j] = 1<<24;
1397
567M
            } else if (z[j] < -(1<<24)) {
1398
46.7M
                av_log(NULL, AV_LOG_WARNING,
1399
46.7M
                       "sbr_qmf_analysis: value %09d too small, setting to %09d\n",
1400
46.7M
                       z[j], -(1<<24));
1401
46.7M
                z[j] = -(1<<24);
1402
46.7M
            }
1403
614M
        }
1404
9.59M
#endif
1405
9.59M
        mdct_fn(mdct, z, z + 64, sizeof(INTFLOAT));
1406
9.59M
        sbrdsp->qmf_post_shuffle(W[buf_idx][i], z);
1407
9.59M
        x += 32;
1408
9.59M
    }
1409
299k
}
1410
#endif
1411
1412
/**
1413
 * Synthesis QMF Bank (14496-3 sp04 p206) and Downsampled Synthesis QMF Bank
1414
 * (14496-3 sp04 p206)
1415
 */
1416
#ifndef sbr_qmf_synthesis
1417
static void sbr_qmf_synthesis(AVTXContext *mdct, av_tx_fn mdct_fn,
1418
#if USE_FIXED
1419
                              SBRDSPContext *sbrdsp, AVFixedDSPContext *dsp,
1420
#else
1421
                              SBRDSPContext *sbrdsp, AVFloatDSPContext *dsp,
1422
#endif /* USE_FIXED */
1423
                              INTFLOAT *out, INTFLOAT X[2][38][64],
1424
                              INTFLOAT mdct_buf[2][64],
1425
                              INTFLOAT *v0, int *v_off, int numTimeSlots,
1426
                              const unsigned int div)
1427
1.40M
{
1428
1.40M
    int i, n;
1429
1.40M
    const INTFLOAT *sbr_qmf_window = div ? sbr_qmf_window_ds : sbr_qmf_window_us;
1430
1.40M
    const int step = 128 >> div;
1431
1.40M
    INTFLOAT *v;
1432
46.3M
    for (i = 0; i < numTimeSlots*2; i++) {
1433
44.9M
        if (*v_off < step) {
1434
4.91M
            int saved_samples = (1280 - 128) >> div;
1435
4.91M
            memcpy(&v0[SBR_SYNTHESIS_BUF_SIZE - saved_samples], v0, saved_samples * sizeof(INTFLOAT));
1436
4.91M
            *v_off = SBR_SYNTHESIS_BUF_SIZE - saved_samples - step;
1437
40.0M
        } else {
1438
40.0M
            *v_off -= step;
1439
40.0M
        }
1440
44.9M
        v = v0 + *v_off;
1441
44.9M
        if (div) {
1442
32.5M
            for (n = 0; n < 32; n++) {
1443
31.5M
                X[0][i][   n] = -X[0][i][n];
1444
31.5M
                X[0][i][32+n] =  X[1][i][31-n];
1445
31.5M
            }
1446
985k
            mdct_fn(mdct, mdct_buf[0], X[0][i], sizeof(INTFLOAT));
1447
985k
            sbrdsp->qmf_deint_neg(v, mdct_buf[0]);
1448
43.9M
        } else {
1449
43.9M
            sbrdsp->neg_odd_64(X[1][i]);
1450
43.9M
            mdct_fn(mdct, mdct_buf[0], X[0][i], sizeof(INTFLOAT));
1451
43.9M
            mdct_fn(mdct, mdct_buf[1], X[1][i], sizeof(INTFLOAT));
1452
43.9M
            sbrdsp->qmf_deint_bfly(v, mdct_buf[1], mdct_buf[0]);
1453
43.9M
        }
1454
44.9M
        dsp->vector_fmul    (out, v                , sbr_qmf_window                       , 64 >> div);
1455
44.9M
        dsp->vector_fmul_add(out, v + ( 192 >> div), sbr_qmf_window + ( 64 >> div), out   , 64 >> div);
1456
44.9M
        dsp->vector_fmul_add(out, v + ( 256 >> div), sbr_qmf_window + (128 >> div), out   , 64 >> div);
1457
44.9M
        dsp->vector_fmul_add(out, v + ( 448 >> div), sbr_qmf_window + (192 >> div), out   , 64 >> div);
1458
44.9M
        dsp->vector_fmul_add(out, v + ( 512 >> div), sbr_qmf_window + (256 >> div), out   , 64 >> div);
1459
44.9M
        dsp->vector_fmul_add(out, v + ( 704 >> div), sbr_qmf_window + (320 >> div), out   , 64 >> div);
1460
44.9M
        dsp->vector_fmul_add(out, v + ( 768 >> div), sbr_qmf_window + (384 >> div), out   , 64 >> div);
1461
44.9M
        dsp->vector_fmul_add(out, v + ( 960 >> div), sbr_qmf_window + (448 >> div), out   , 64 >> div);
1462
44.9M
        dsp->vector_fmul_add(out, v + (1024 >> div), sbr_qmf_window + (512 >> div), out   , 64 >> div);
1463
44.9M
        dsp->vector_fmul_add(out, v + (1216 >> div), sbr_qmf_window + (576 >> div), out   , 64 >> div);
1464
44.9M
        out += 64 >> div;
1465
44.9M
    }
1466
1.40M
}
aacsbr.c:sbr_qmf_synthesis
Line
Count
Source
1427
1.03M
{
1428
1.03M
    int i, n;
1429
1.03M
    const INTFLOAT *sbr_qmf_window = div ? sbr_qmf_window_ds : sbr_qmf_window_us;
1430
1.03M
    const int step = 128 >> div;
1431
1.03M
    INTFLOAT *v;
1432
34.0M
    for (i = 0; i < numTimeSlots*2; i++) {
1433
33.0M
        if (*v_off < step) {
1434
3.63M
            int saved_samples = (1280 - 128) >> div;
1435
3.63M
            memcpy(&v0[SBR_SYNTHESIS_BUF_SIZE - saved_samples], v0, saved_samples * sizeof(INTFLOAT));
1436
3.63M
            *v_off = SBR_SYNTHESIS_BUF_SIZE - saved_samples - step;
1437
29.4M
        } else {
1438
29.4M
            *v_off -= step;
1439
29.4M
        }
1440
33.0M
        v = v0 + *v_off;
1441
33.0M
        if (div) {
1442
13.8M
            for (n = 0; n < 32; n++) {
1443
13.4M
                X[0][i][   n] = -X[0][i][n];
1444
13.4M
                X[0][i][32+n] =  X[1][i][31-n];
1445
13.4M
            }
1446
419k
            mdct_fn(mdct, mdct_buf[0], X[0][i], sizeof(INTFLOAT));
1447
419k
            sbrdsp->qmf_deint_neg(v, mdct_buf[0]);
1448
32.6M
        } else {
1449
32.6M
            sbrdsp->neg_odd_64(X[1][i]);
1450
32.6M
            mdct_fn(mdct, mdct_buf[0], X[0][i], sizeof(INTFLOAT));
1451
32.6M
            mdct_fn(mdct, mdct_buf[1], X[1][i], sizeof(INTFLOAT));
1452
32.6M
            sbrdsp->qmf_deint_bfly(v, mdct_buf[1], mdct_buf[0]);
1453
32.6M
        }
1454
33.0M
        dsp->vector_fmul    (out, v                , sbr_qmf_window                       , 64 >> div);
1455
33.0M
        dsp->vector_fmul_add(out, v + ( 192 >> div), sbr_qmf_window + ( 64 >> div), out   , 64 >> div);
1456
33.0M
        dsp->vector_fmul_add(out, v + ( 256 >> div), sbr_qmf_window + (128 >> div), out   , 64 >> div);
1457
33.0M
        dsp->vector_fmul_add(out, v + ( 448 >> div), sbr_qmf_window + (192 >> div), out   , 64 >> div);
1458
33.0M
        dsp->vector_fmul_add(out, v + ( 512 >> div), sbr_qmf_window + (256 >> div), out   , 64 >> div);
1459
33.0M
        dsp->vector_fmul_add(out, v + ( 704 >> div), sbr_qmf_window + (320 >> div), out   , 64 >> div);
1460
33.0M
        dsp->vector_fmul_add(out, v + ( 768 >> div), sbr_qmf_window + (384 >> div), out   , 64 >> div);
1461
33.0M
        dsp->vector_fmul_add(out, v + ( 960 >> div), sbr_qmf_window + (448 >> div), out   , 64 >> div);
1462
33.0M
        dsp->vector_fmul_add(out, v + (1024 >> div), sbr_qmf_window + (512 >> div), out   , 64 >> div);
1463
33.0M
        dsp->vector_fmul_add(out, v + (1216 >> div), sbr_qmf_window + (576 >> div), out   , 64 >> div);
1464
33.0M
        out += 64 >> div;
1465
33.0M
    }
1466
1.03M
}
aacsbr_fixed.c:sbr_qmf_synthesis
Line
Count
Source
1427
372k
{
1428
372k
    int i, n;
1429
372k
    const INTFLOAT *sbr_qmf_window = div ? sbr_qmf_window_ds : sbr_qmf_window_us;
1430
372k
    const int step = 128 >> div;
1431
372k
    INTFLOAT *v;
1432
12.2M
    for (i = 0; i < numTimeSlots*2; i++) {
1433
11.9M
        if (*v_off < step) {
1434
1.27M
            int saved_samples = (1280 - 128) >> div;
1435
1.27M
            memcpy(&v0[SBR_SYNTHESIS_BUF_SIZE - saved_samples], v0, saved_samples * sizeof(INTFLOAT));
1436
1.27M
            *v_off = SBR_SYNTHESIS_BUF_SIZE - saved_samples - step;
1437
10.6M
        } else {
1438
10.6M
            *v_off -= step;
1439
10.6M
        }
1440
11.9M
        v = v0 + *v_off;
1441
11.9M
        if (div) {
1442
18.7M
            for (n = 0; n < 32; n++) {
1443
18.1M
                X[0][i][   n] = -X[0][i][n];
1444
18.1M
                X[0][i][32+n] =  X[1][i][31-n];
1445
18.1M
            }
1446
566k
            mdct_fn(mdct, mdct_buf[0], X[0][i], sizeof(INTFLOAT));
1447
566k
            sbrdsp->qmf_deint_neg(v, mdct_buf[0]);
1448
11.3M
        } else {
1449
11.3M
            sbrdsp->neg_odd_64(X[1][i]);
1450
11.3M
            mdct_fn(mdct, mdct_buf[0], X[0][i], sizeof(INTFLOAT));
1451
11.3M
            mdct_fn(mdct, mdct_buf[1], X[1][i], sizeof(INTFLOAT));
1452
11.3M
            sbrdsp->qmf_deint_bfly(v, mdct_buf[1], mdct_buf[0]);
1453
11.3M
        }
1454
11.9M
        dsp->vector_fmul    (out, v                , sbr_qmf_window                       , 64 >> div);
1455
11.9M
        dsp->vector_fmul_add(out, v + ( 192 >> div), sbr_qmf_window + ( 64 >> div), out   , 64 >> div);
1456
11.9M
        dsp->vector_fmul_add(out, v + ( 256 >> div), sbr_qmf_window + (128 >> div), out   , 64 >> div);
1457
11.9M
        dsp->vector_fmul_add(out, v + ( 448 >> div), sbr_qmf_window + (192 >> div), out   , 64 >> div);
1458
11.9M
        dsp->vector_fmul_add(out, v + ( 512 >> div), sbr_qmf_window + (256 >> div), out   , 64 >> div);
1459
11.9M
        dsp->vector_fmul_add(out, v + ( 704 >> div), sbr_qmf_window + (320 >> div), out   , 64 >> div);
1460
11.9M
        dsp->vector_fmul_add(out, v + ( 768 >> div), sbr_qmf_window + (384 >> div), out   , 64 >> div);
1461
11.9M
        dsp->vector_fmul_add(out, v + ( 960 >> div), sbr_qmf_window + (448 >> div), out   , 64 >> div);
1462
11.9M
        dsp->vector_fmul_add(out, v + (1024 >> div), sbr_qmf_window + (512 >> div), out   , 64 >> div);
1463
11.9M
        dsp->vector_fmul_add(out, v + (1216 >> div), sbr_qmf_window + (576 >> div), out   , 64 >> div);
1464
11.9M
        out += 64 >> div;
1465
11.9M
    }
1466
372k
}
1467
#endif
1468
1469
/// Generate the subband filtered lowband
1470
static int sbr_lf_gen(SpectralBandReplication *sbr,
1471
                      INTFLOAT X_low[32][40][2], const INTFLOAT W[2][32][32][2],
1472
                      int buf_idx, int numTimeSlots)
1473
1.29M
{
1474
1.29M
    int i, k;
1475
1.29M
    const int t_HFGen = 8;
1476
1.29M
    const int i_f = numTimeSlots*2;
1477
1.29M
    memset(X_low, 0, 32*sizeof(*X_low));
1478
41.7M
    for (k = 0; k < sbr->kx[1]; k++) {
1479
1.33G
        for (i = t_HFGen; i < i_f + t_HFGen; i++) {
1480
1.29G
            X_low[k][i][0] = W[buf_idx][i - t_HFGen][k][0];
1481
1.29G
            X_low[k][i][1] = W[buf_idx][i - t_HFGen][k][1];
1482
1.29G
        }
1483
40.4M
    }
1484
1.29M
    buf_idx = 1-buf_idx;
1485
41.9M
    for (k = 0; k < sbr->kx[0]; k++) {
1486
365M
        for (i = 0; i < t_HFGen; i++) {
1487
325M
            X_low[k][i][0] = W[buf_idx][i + i_f - t_HFGen][k][0];
1488
325M
            X_low[k][i][1] = W[buf_idx][i + i_f - t_HFGen][k][1];
1489
325M
        }
1490
40.6M
    }
1491
1.29M
    return 0;
1492
1.29M
}
aacsbr.c:sbr_lf_gen
Line
Count
Source
1473
995k
{
1474
995k
    int i, k;
1475
995k
    const int t_HFGen = 8;
1476
995k
    const int i_f = numTimeSlots*2;
1477
995k
    memset(X_low, 0, 32*sizeof(*X_low));
1478
32.5M
    for (k = 0; k < sbr->kx[1]; k++) {
1479
1.04G
        for (i = t_HFGen; i < i_f + t_HFGen; i++) {
1480
1.01G
            X_low[k][i][0] = W[buf_idx][i - t_HFGen][k][0];
1481
1.01G
            X_low[k][i][1] = W[buf_idx][i - t_HFGen][k][1];
1482
1.01G
        }
1483
31.6M
    }
1484
995k
    buf_idx = 1-buf_idx;
1485
32.6M
    for (k = 0; k < sbr->kx[0]; k++) {
1486
285M
        for (i = 0; i < t_HFGen; i++) {
1487
253M
            X_low[k][i][0] = W[buf_idx][i + i_f - t_HFGen][k][0];
1488
253M
            X_low[k][i][1] = W[buf_idx][i + i_f - t_HFGen][k][1];
1489
253M
        }
1490
31.6M
    }
1491
995k
    return 0;
1492
995k
}
aacsbr_fixed.c:sbr_lf_gen
Line
Count
Source
1473
299k
{
1474
299k
    int i, k;
1475
299k
    const int t_HFGen = 8;
1476
299k
    const int i_f = numTimeSlots*2;
1477
299k
    memset(X_low, 0, 32*sizeof(*X_low));
1478
9.14M
    for (k = 0; k < sbr->kx[1]; k++) {
1479
291M
        for (i = t_HFGen; i < i_f + t_HFGen; i++) {
1480
282M
            X_low[k][i][0] = W[buf_idx][i - t_HFGen][k][0];
1481
282M
            X_low[k][i][1] = W[buf_idx][i - t_HFGen][k][1];
1482
282M
        }
1483
8.84M
    }
1484
299k
    buf_idx = 1-buf_idx;
1485
9.26M
    for (k = 0; k < sbr->kx[0]; k++) {
1486
80.6M
        for (i = 0; i < t_HFGen; i++) {
1487
71.6M
            X_low[k][i][0] = W[buf_idx][i + i_f - t_HFGen][k][0];
1488
71.6M
            X_low[k][i][1] = W[buf_idx][i + i_f - t_HFGen][k][1];
1489
71.6M
        }
1490
8.96M
    }
1491
299k
    return 0;
1492
299k
}
1493
1494
/// High Frequency Generator (14496-3 sp04 p215)
1495
static int sbr_hf_gen(AACDecContext *ac, SpectralBandReplication *sbr,
1496
                      INTFLOAT X_high[64][40][2], const INTFLOAT X_low[32][40][2],
1497
                      const INTFLOAT (*alpha0)[2], const INTFLOAT (*alpha1)[2],
1498
                      const INTFLOAT bw_array[5], const uint8_t *t_env,
1499
                      int bs_num_env)
1500
120k
{
1501
120k
    int j, x;
1502
120k
    int g = 0;
1503
120k
    int k = sbr->kx[1];
1504
338k
    for (j = 0; j < sbr->num_patches; j++) {
1505
2.48M
        for (x = 0; x < sbr->patch_num_subbands[j]; x++, k++) {
1506
2.26M
            const int p = sbr->patch_start_subband[j] + x;
1507
4.58M
            while (g <= sbr->n_q && k >= sbr->f_tablenoise[g])
1508
2.32M
                g++;
1509
2.26M
            g--;
1510
1511
2.26M
            if (g < 0) {
1512
0
                av_log(ac->avctx, AV_LOG_ERROR,
1513
0
                       "ERROR : no subband found for frequency %d\n", k);
1514
0
                return -1;
1515
0
            }
1516
1517
2.26M
            sbr->dsp.hf_gen(X_high[k] + ENVELOPE_ADJUSTMENT_OFFSET,
1518
2.26M
                            X_low[p]  + ENVELOPE_ADJUSTMENT_OFFSET,
1519
2.26M
                            alpha0[p], alpha1[p], bw_array[g],
1520
2.26M
                            2 * t_env[0], 2 * t_env[bs_num_env]);
1521
2.26M
        }
1522
217k
    }
1523
120k
    if (k < sbr->m[1] + sbr->kx[1])
1524
1.47k
        memset(X_high + k, 0, (sbr->m[1] + sbr->kx[1] - k) * sizeof(*X_high));
1525
1526
120k
    return 0;
1527
120k
}
aacsbr.c:sbr_hf_gen
Line
Count
Source
1500
17.8k
{
1501
17.8k
    int j, x;
1502
17.8k
    int g = 0;
1503
17.8k
    int k = sbr->kx[1];
1504
46.9k
    for (j = 0; j < sbr->num_patches; j++) {
1505
252k
        for (x = 0; x < sbr->patch_num_subbands[j]; x++, k++) {
1506
223k
            const int p = sbr->patch_start_subband[j] + x;
1507
459k
            while (g <= sbr->n_q && k >= sbr->f_tablenoise[g])
1508
235k
                g++;
1509
223k
            g--;
1510
1511
223k
            if (g < 0) {
1512
0
                av_log(ac->avctx, AV_LOG_ERROR,
1513
0
                       "ERROR : no subband found for frequency %d\n", k);
1514
0
                return -1;
1515
0
            }
1516
1517
223k
            sbr->dsp.hf_gen(X_high[k] + ENVELOPE_ADJUSTMENT_OFFSET,
1518
223k
                            X_low[p]  + ENVELOPE_ADJUSTMENT_OFFSET,
1519
223k
                            alpha0[p], alpha1[p], bw_array[g],
1520
223k
                            2 * t_env[0], 2 * t_env[bs_num_env]);
1521
223k
        }
1522
29.0k
    }
1523
17.8k
    if (k < sbr->m[1] + sbr->kx[1])
1524
777
        memset(X_high + k, 0, (sbr->m[1] + sbr->kx[1] - k) * sizeof(*X_high));
1525
1526
17.8k
    return 0;
1527
17.8k
}
aacsbr_fixed.c:sbr_hf_gen
Line
Count
Source
1500
102k
{
1501
102k
    int j, x;
1502
102k
    int g = 0;
1503
102k
    int k = sbr->kx[1];
1504
291k
    for (j = 0; j < sbr->num_patches; j++) {
1505
2.22M
        for (x = 0; x < sbr->patch_num_subbands[j]; x++, k++) {
1506
2.04M
            const int p = sbr->patch_start_subband[j] + x;
1507
4.13M
            while (g <= sbr->n_q && k >= sbr->f_tablenoise[g])
1508
2.08M
                g++;
1509
2.04M
            g--;
1510
1511
2.04M
            if (g < 0) {
1512
0
                av_log(ac->avctx, AV_LOG_ERROR,
1513
0
                       "ERROR : no subband found for frequency %d\n", k);
1514
0
                return -1;
1515
0
            }
1516
1517
2.04M
            sbr->dsp.hf_gen(X_high[k] + ENVELOPE_ADJUSTMENT_OFFSET,
1518
2.04M
                            X_low[p]  + ENVELOPE_ADJUSTMENT_OFFSET,
1519
2.04M
                            alpha0[p], alpha1[p], bw_array[g],
1520
2.04M
                            2 * t_env[0], 2 * t_env[bs_num_env]);
1521
2.04M
        }
1522
188k
    }
1523
102k
    if (k < sbr->m[1] + sbr->kx[1])
1524
700
        memset(X_high + k, 0, (sbr->m[1] + sbr->kx[1] - k) * sizeof(*X_high));
1525
1526
102k
    return 0;
1527
102k
}
1528
1529
/// Generate the subband filtered lowband
1530
static int sbr_x_gen(SpectralBandReplication *sbr, INTFLOAT X[2][38][64],
1531
                     const INTFLOAT Y0[38][64][2], const INTFLOAT Y1[38][64][2],
1532
                     const INTFLOAT X_low[32][40][2], int ch, int numTimeSlots)
1533
1.29M
{
1534
1.29M
    int k, i;
1535
1.29M
    const int i_f = numTimeSlots*2;
1536
1.29M
    const int i_Temp = FFMAX(2*sbr->data[ch].t_env_num_env_old - i_f, 0);
1537
1.29M
    memset(X, 0, 2*sizeof(*X));
1538
41.9M
    for (k = 0; k < sbr->kx[0]; k++) {
1539
56.6M
        for (i = 0; i < i_Temp; i++) {
1540
15.9M
            X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0];
1541
15.9M
            X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1];
1542
15.9M
        }
1543
40.6M
    }
1544
3.14M
    for (; k < sbr->kx[0] + sbr->m[0]; k++) {
1545
6.28M
        for (i = 0; i < i_Temp; i++) {
1546
4.43M
            X[0][i][k] = Y0[i + i_f][k][0];
1547
4.43M
            X[1][i][k] = Y0[i + i_f][k][1];
1548
4.43M
        }
1549
1.84M
    }
1550
1551
41.7M
    for (k = 0; k < sbr->kx[1]; k++) {
1552
1.56G
        for (i = i_Temp; i < 38; i++) {
1553
1.52G
            X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0];
1554
1.52G
            X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1];
1555
1.52G
        }
1556
40.4M
    }
1557
3.56M
    for (; k < sbr->kx[1] + sbr->m[1]; k++) {
1558
69.0M
        for (i = i_Temp; i < i_f; i++) {
1559
66.8M
            X[0][i][k] = Y1[i][k][0];
1560
66.8M
            X[1][i][k] = Y1[i][k][1];
1561
66.8M
        }
1562
2.26M
    }
1563
1.29M
    return 0;
1564
1.29M
}
aacsbr.c:sbr_x_gen
Line
Count
Source
1533
995k
{
1534
995k
    int k, i;
1535
995k
    const int i_f = numTimeSlots*2;
1536
995k
    const int i_Temp = FFMAX(2*sbr->data[ch].t_env_num_env_old - i_f, 0);
1537
995k
    memset(X, 0, 2*sizeof(*X));
1538
32.6M
    for (k = 0; k < sbr->kx[0]; k++) {
1539
34.4M
        for (i = 0; i < i_Temp; i++) {
1540
2.77M
            X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0];
1541
2.77M
            X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1];
1542
2.77M
        }
1543
31.6M
    }
1544
1.11M
    for (; k < sbr->kx[0] + sbr->m[0]; k++) {
1545
204k
        for (i = 0; i < i_Temp; i++) {
1546
83.8k
            X[0][i][k] = Y0[i + i_f][k][0];
1547
83.8k
            X[1][i][k] = Y0[i + i_f][k][1];
1548
83.8k
        }
1549
120k
    }
1550
1551
32.5M
    for (k = 0; k < sbr->kx[1]; k++) {
1552
1.22G
        for (i = i_Temp; i < 38; i++) {
1553
1.19G
            X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0];
1554
1.19G
            X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1];
1555
1.19G
        }
1556
31.6M
    }
1557
1.22M
    for (; k < sbr->kx[1] + sbr->m[1]; k++) {
1558
7.27M
        for (i = i_Temp; i < i_f; i++) {
1559
7.04M
            X[0][i][k] = Y1[i][k][0];
1560
7.04M
            X[1][i][k] = Y1[i][k][1];
1561
7.04M
        }
1562
225k
    }
1563
995k
    return 0;
1564
995k
}
aacsbr_fixed.c:sbr_x_gen
Line
Count
Source
1533
299k
{
1534
299k
    int k, i;
1535
299k
    const int i_f = numTimeSlots*2;
1536
299k
    const int i_Temp = FFMAX(2*sbr->data[ch].t_env_num_env_old - i_f, 0);
1537
299k
    memset(X, 0, 2*sizeof(*X));
1538
9.26M
    for (k = 0; k < sbr->kx[0]; k++) {
1539
22.1M
        for (i = 0; i < i_Temp; i++) {
1540
13.2M
            X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0];
1541
13.2M
            X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1];
1542
13.2M
        }
1543
8.96M
    }
1544
2.02M
    for (; k < sbr->kx[0] + sbr->m[0]; k++) {
1545
6.07M
        for (i = 0; i < i_Temp; i++) {
1546
4.34M
            X[0][i][k] = Y0[i + i_f][k][0];
1547
4.34M
            X[1][i][k] = Y0[i + i_f][k][1];
1548
4.34M
        }
1549
1.72M
    }
1550
1551
9.14M
    for (k = 0; k < sbr->kx[1]; k++) {
1552
331M
        for (i = i_Temp; i < 38; i++) {
1553
322M
            X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0];
1554
322M
            X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1];
1555
322M
        }
1556
8.84M
    }
1557
2.34M
    for (; k < sbr->kx[1] + sbr->m[1]; k++) {
1558
61.8M
        for (i = i_Temp; i < i_f; i++) {
1559
59.7M
            X[0][i][k] = Y1[i][k][0];
1560
59.7M
            X[1][i][k] = Y1[i][k][1];
1561
59.7M
        }
1562
2.04M
    }
1563
299k
    return 0;
1564
299k
}
1565
1566
/** High Frequency Adjustment (14496-3 sp04 p217) and Mapping
1567
 * (14496-3 sp04 p217)
1568
 */
1569
static int sbr_mapping(AACDecContext *ac, SpectralBandReplication *sbr,
1570
                        SBRData *ch_data, int e_a[2])
1571
120k
{
1572
120k
    int e, i, m;
1573
1574
120k
    memset(ch_data->s_indexmapped[1], 0, 7*sizeof(ch_data->s_indexmapped[1]));
1575
430k
    for (e = 0; e < ch_data->bs_num_env; e++) {
1576
310k
        const unsigned int ilim = sbr->n[ch_data->bs_freq_res[e + 1]];
1577
310k
        uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow;
1578
310k
        int k;
1579
1580
310k
        if (sbr->kx[1] != table[0]) {
1581
0
            av_log(ac->avctx, AV_LOG_ERROR, "kx != f_table{high,low}[0]. "
1582
0
                   "Derived frequency tables were not regenerated.\n");
1583
0
            sbr_turnoff(sbr);
1584
0
            return AVERROR_BUG;
1585
0
        }
1586
1.79M
        for (i = 0; i < ilim; i++)
1587
7.11M
            for (m = table[i]; m < table[i + 1]; m++)
1588
5.62M
                sbr->e_origmapped[e][m - sbr->kx[1]] = ch_data->env_facs[e+1][i];
1589
1590
        // ch_data->bs_num_noise > 1 => 2 noise floors
1591
310k
        k = (ch_data->bs_num_noise > 1) && (ch_data->t_env[e] >= ch_data->t_q[1]);
1592
734k
        for (i = 0; i < sbr->n_q; i++)
1593
6.04M
            for (m = sbr->f_tablenoise[i]; m < sbr->f_tablenoise[i + 1]; m++)
1594
5.62M
                sbr->q_mapped[e][m - sbr->kx[1]] = ch_data->noise_facs[k+1][i];
1595
1596
2.40M
        for (i = 0; i < sbr->n[1]; i++) {
1597
2.09M
            if (ch_data->bs_add_harmonic_flag) {
1598
452k
                const unsigned int m_midpoint =
1599
452k
                    (sbr->f_tablehigh[i] + sbr->f_tablehigh[i + 1]) >> 1;
1600
1601
452k
                ch_data->s_indexmapped[e + 1][m_midpoint - sbr->kx[1]] = ch_data->bs_add_harmonic[i] *
1602
452k
                    (e >= e_a[1] || (ch_data->s_indexmapped[0][m_midpoint - sbr->kx[1]] == 1));
1603
452k
            }
1604
2.09M
        }
1605
1606
1.79M
        for (i = 0; i < ilim; i++) {
1607
1.48M
            int additional_sinusoid_present = 0;
1608
6.68M
            for (m = table[i]; m < table[i + 1]; m++) {
1609
5.40M
                if (ch_data->s_indexmapped[e + 1][m - sbr->kx[1]]) {
1610
208k
                    additional_sinusoid_present = 1;
1611
208k
                    break;
1612
208k
                }
1613
5.40M
            }
1614
1.48M
            memset(&sbr->s_mapped[e][table[i] - sbr->kx[1]], additional_sinusoid_present,
1615
1.48M
                   (table[i + 1] - table[i]) * sizeof(sbr->s_mapped[e][0]));
1616
1.48M
        }
1617
310k
    }
1618
1619
120k
    memcpy(ch_data->s_indexmapped[0], ch_data->s_indexmapped[ch_data->bs_num_env], sizeof(ch_data->s_indexmapped[0]));
1620
120k
    return 0;
1621
120k
}
aacsbr.c:sbr_mapping
Line
Count
Source
1571
17.8k
{
1572
17.8k
    int e, i, m;
1573
1574
17.8k
    memset(ch_data->s_indexmapped[1], 0, 7*sizeof(ch_data->s_indexmapped[1]));
1575
56.8k
    for (e = 0; e < ch_data->bs_num_env; e++) {
1576
38.9k
        const unsigned int ilim = sbr->n[ch_data->bs_freq_res[e + 1]];
1577
38.9k
        uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow;
1578
38.9k
        int k;
1579
1580
38.9k
        if (sbr->kx[1] != table[0]) {
1581
0
            av_log(ac->avctx, AV_LOG_ERROR, "kx != f_table{high,low}[0]. "
1582
0
                   "Derived frequency tables were not regenerated.\n");
1583
0
            sbr_turnoff(sbr);
1584
0
            return AVERROR_BUG;
1585
0
        }
1586
191k
        for (i = 0; i < ilim; i++)
1587
614k
            for (m = table[i]; m < table[i + 1]; m++)
1588
462k
                sbr->e_origmapped[e][m - sbr->kx[1]] = ch_data->env_facs[e+1][i];
1589
1590
        // ch_data->bs_num_noise > 1 => 2 noise floors
1591
38.9k
        k = (ch_data->bs_num_noise > 1) && (ch_data->t_env[e] >= ch_data->t_q[1]);
1592
101k
        for (i = 0; i < sbr->n_q; i++)
1593
525k
            for (m = sbr->f_tablenoise[i]; m < sbr->f_tablenoise[i + 1]; m++)
1594
462k
                sbr->q_mapped[e][m - sbr->kx[1]] = ch_data->noise_facs[k+1][i];
1595
1596
260k
        for (i = 0; i < sbr->n[1]; i++) {
1597
221k
            if (ch_data->bs_add_harmonic_flag) {
1598
69.6k
                const unsigned int m_midpoint =
1599
69.6k
                    (sbr->f_tablehigh[i] + sbr->f_tablehigh[i + 1]) >> 1;
1600
1601
69.6k
                ch_data->s_indexmapped[e + 1][m_midpoint - sbr->kx[1]] = ch_data->bs_add_harmonic[i] *
1602
69.6k
                    (e >= e_a[1] || (ch_data->s_indexmapped[0][m_midpoint - sbr->kx[1]] == 1));
1603
69.6k
            }
1604
221k
        }
1605
1606
191k
        for (i = 0; i < ilim; i++) {
1607
152k
            int additional_sinusoid_present = 0;
1608
591k
            for (m = table[i]; m < table[i + 1]; m++) {
1609
450k
                if (ch_data->s_indexmapped[e + 1][m - sbr->kx[1]]) {
1610
11.9k
                    additional_sinusoid_present = 1;
1611
11.9k
                    break;
1612
11.9k
                }
1613
450k
            }
1614
152k
            memset(&sbr->s_mapped[e][table[i] - sbr->kx[1]], additional_sinusoid_present,
1615
152k
                   (table[i + 1] - table[i]) * sizeof(sbr->s_mapped[e][0]));
1616
152k
        }
1617
38.9k
    }
1618
1619
17.8k
    memcpy(ch_data->s_indexmapped[0], ch_data->s_indexmapped[ch_data->bs_num_env], sizeof(ch_data->s_indexmapped[0]));
1620
17.8k
    return 0;
1621
17.8k
}
aacsbr_fixed.c:sbr_mapping
Line
Count
Source
1571
102k
{
1572
102k
    int e, i, m;
1573
1574
102k
    memset(ch_data->s_indexmapped[1], 0, 7*sizeof(ch_data->s_indexmapped[1]));
1575
373k
    for (e = 0; e < ch_data->bs_num_env; e++) {
1576
271k
        const unsigned int ilim = sbr->n[ch_data->bs_freq_res[e + 1]];
1577
271k
        uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow;
1578
271k
        int k;
1579
1580
271k
        if (sbr->kx[1] != table[0]) {
1581
0
            av_log(ac->avctx, AV_LOG_ERROR, "kx != f_table{high,low}[0]. "
1582
0
                   "Derived frequency tables were not regenerated.\n");
1583
0
            sbr_turnoff(sbr);
1584
0
            return AVERROR_BUG;
1585
0
        }
1586
1.60M
        for (i = 0; i < ilim; i++)
1587
6.49M
            for (m = table[i]; m < table[i + 1]; m++)
1588
5.16M
                sbr->e_origmapped[e][m - sbr->kx[1]] = ch_data->env_facs[e+1][i];
1589
1590
        // ch_data->bs_num_noise > 1 => 2 noise floors
1591
271k
        k = (ch_data->bs_num_noise > 1) && (ch_data->t_env[e] >= ch_data->t_q[1]);
1592
632k
        for (i = 0; i < sbr->n_q; i++)
1593
5.52M
            for (m = sbr->f_tablenoise[i]; m < sbr->f_tablenoise[i + 1]; m++)
1594
5.16M
                sbr->q_mapped[e][m - sbr->kx[1]] = ch_data->noise_facs[k+1][i];
1595
1596
2.14M
        for (i = 0; i < sbr->n[1]; i++) {
1597
1.87M
            if (ch_data->bs_add_harmonic_flag) {
1598
382k
                const unsigned int m_midpoint =
1599
382k
                    (sbr->f_tablehigh[i] + sbr->f_tablehigh[i + 1]) >> 1;
1600
1601
382k
                ch_data->s_indexmapped[e + 1][m_midpoint - sbr->kx[1]] = ch_data->bs_add_harmonic[i] *
1602
382k
                    (e >= e_a[1] || (ch_data->s_indexmapped[0][m_midpoint - sbr->kx[1]] == 1));
1603
382k
            }
1604
1.87M
        }
1605
1606
1.60M
        for (i = 0; i < ilim; i++) {
1607
1.33M
            int additional_sinusoid_present = 0;
1608
6.09M
            for (m = table[i]; m < table[i + 1]; m++) {
1609
4.95M
                if (ch_data->s_indexmapped[e + 1][m - sbr->kx[1]]) {
1610
196k
                    additional_sinusoid_present = 1;
1611
196k
                    break;
1612
196k
                }
1613
4.95M
            }
1614
1.33M
            memset(&sbr->s_mapped[e][table[i] - sbr->kx[1]], additional_sinusoid_present,
1615
1.33M
                   (table[i + 1] - table[i]) * sizeof(sbr->s_mapped[e][0]));
1616
1.33M
        }
1617
271k
    }
1618
1619
102k
    memcpy(ch_data->s_indexmapped[0], ch_data->s_indexmapped[ch_data->bs_num_env], sizeof(ch_data->s_indexmapped[0]));
1620
102k
    return 0;
1621
102k
}
1622
1623
/// Estimation of current envelope (14496-3 sp04 p218)
1624
static void sbr_env_estimate(AAC_FLOAT (*e_curr)[48], INTFLOAT X_high[64][40][2],
1625
                             SpectralBandReplication *sbr, SBRData *ch_data)
1626
120k
{
1627
120k
    int e, m;
1628
120k
    int kx1 = sbr->kx[1];
1629
1630
120k
    if (sbr->bs_interpol_freq) {
1631
194k
        for (e = 0; e < ch_data->bs_num_env; e++) {
1632
#if USE_FIXED
1633
            const SoftFloat recip_env_size = av_int2sf(0x20000000 / (ch_data->t_env[e + 1] - ch_data->t_env[e]), 30);
1634
#else
1635
            const float recip_env_size = 0.5f / (ch_data->t_env[e + 1] - ch_data->t_env[e]);
1636
#endif /* USE_FIXED */
1637
129k
            int ilb = ch_data->t_env[e]     * 2 + ENVELOPE_ADJUSTMENT_OFFSET;
1638
129k
            int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET;
1639
1640
129k
            if (ilb >= 40)
1641
0
                return;
1642
1643
2.56M
            for (m = 0; m < sbr->m[1]; m++) {
1644
2.43M
                AAC_FLOAT sum = sbr->dsp.sum_square(X_high[m+kx1] + ilb, iub - ilb);
1645
#if USE_FIXED
1646
                e_curr[e][m] = av_mul_sf(sum, recip_env_size);
1647
#else
1648
                e_curr[e][m] = sum * recip_env_size;
1649
#endif /* USE_FIXED */
1650
2.43M
            }
1651
129k
        }
1652
64.9k
    } else {
1653
55.6k
        int k, p;
1654
1655
236k
        for (e = 0; e < ch_data->bs_num_env; e++) {
1656
180k
            const int env_size = 2 * (ch_data->t_env[e + 1] - ch_data->t_env[e]);
1657
180k
            int ilb = ch_data->t_env[e]     * 2 + ENVELOPE_ADJUSTMENT_OFFSET;
1658
180k
            int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET;
1659
180k
            const uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow;
1660
1661
180k
            if (ilb >= 40)
1662
0
                return;
1663
1664
1.08M
            for (p = 0; p < sbr->n[ch_data->bs_freq_res[e + 1]]; p++) {
1665
#if USE_FIXED
1666
                SoftFloat sum = FLOAT_0;
1667
                const SoftFloat den = av_int2sf(0x20000000 / (env_size * (table[p + 1] - table[p])), 29);
1668
3.67M
                for (k = table[p]; k < table[p + 1]; k++) {
1669
2.86M
                    sum = av_add_sf(sum, sbr->dsp.sum_square(X_high[k] + ilb, iub - ilb));
1670
2.86M
                }
1671
                sum = av_mul_sf(sum, den);
1672
#else
1673
                float sum = 0.0f;
1674
                const int den = env_size * (table[p + 1] - table[p]);
1675
1676
417k
                for (k = table[p]; k < table[p + 1]; k++) {
1677
328k
                    sum += sbr->dsp.sum_square(X_high[k] + ilb, iub - ilb);
1678
328k
                }
1679
                sum /= den;
1680
#endif /* USE_FIXED */
1681
4.09M
                for (k = table[p]; k < table[p + 1]; k++) {
1682
3.18M
                    e_curr[e][k - kx1] = sum;
1683
3.18M
                }
1684
905k
            }
1685
180k
        }
1686
55.6k
    }
1687
120k
}
aacsbr.c:sbr_env_estimate
Line
Count
Source
1626
17.8k
{
1627
17.8k
    int e, m;
1628
17.8k
    int kx1 = sbr->kx[1];
1629
1630
17.8k
    if (sbr->bs_interpol_freq) {
1631
30.1k
        for (e = 0; e < ch_data->bs_num_env; e++) {
1632
#if USE_FIXED
1633
            const SoftFloat recip_env_size = av_int2sf(0x20000000 / (ch_data->t_env[e + 1] - ch_data->t_env[e]), 30);
1634
#else
1635
20.7k
            const float recip_env_size = 0.5f / (ch_data->t_env[e + 1] - ch_data->t_env[e]);
1636
20.7k
#endif /* USE_FIXED */
1637
20.7k
            int ilb = ch_data->t_env[e]     * 2 + ENVELOPE_ADJUSTMENT_OFFSET;
1638
20.7k
            int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET;
1639
1640
20.7k
            if (ilb >= 40)
1641
0
                return;
1642
1643
154k
            for (m = 0; m < sbr->m[1]; m++) {
1644
133k
                AAC_FLOAT sum = sbr->dsp.sum_square(X_high[m+kx1] + ilb, iub - ilb);
1645
#if USE_FIXED
1646
                e_curr[e][m] = av_mul_sf(sum, recip_env_size);
1647
#else
1648
133k
                e_curr[e][m] = sum * recip_env_size;
1649
133k
#endif /* USE_FIXED */
1650
133k
            }
1651
20.7k
        }
1652
9.39k
    } else {
1653
8.49k
        int k, p;
1654
1655
26.7k
        for (e = 0; e < ch_data->bs_num_env; e++) {
1656
18.2k
            const int env_size = 2 * (ch_data->t_env[e + 1] - ch_data->t_env[e]);
1657
18.2k
            int ilb = ch_data->t_env[e]     * 2 + ENVELOPE_ADJUSTMENT_OFFSET;
1658
18.2k
            int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET;
1659
18.2k
            const uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow;
1660
1661
18.2k
            if (ilb >= 40)
1662
0
                return;
1663
1664
107k
            for (p = 0; p < sbr->n[ch_data->bs_freq_res[e + 1]]; p++) {
1665
#if USE_FIXED
1666
                SoftFloat sum = FLOAT_0;
1667
                const SoftFloat den = av_int2sf(0x20000000 / (env_size * (table[p + 1] - table[p])), 29);
1668
                for (k = table[p]; k < table[p + 1]; k++) {
1669
                    sum = av_add_sf(sum, sbr->dsp.sum_square(X_high[k] + ilb, iub - ilb));
1670
                }
1671
                sum = av_mul_sf(sum, den);
1672
#else
1673
88.9k
                float sum = 0.0f;
1674
88.9k
                const int den = env_size * (table[p + 1] - table[p]);
1675
1676
417k
                for (k = table[p]; k < table[p + 1]; k++) {
1677
328k
                    sum += sbr->dsp.sum_square(X_high[k] + ilb, iub - ilb);
1678
328k
                }
1679
88.9k
                sum /= den;
1680
88.9k
#endif /* USE_FIXED */
1681
417k
                for (k = table[p]; k < table[p + 1]; k++) {
1682
328k
                    e_curr[e][k - kx1] = sum;
1683
328k
                }
1684
88.9k
            }
1685
18.2k
        }
1686
8.49k
    }
1687
17.8k
}
aacsbr_fixed.c:sbr_env_estimate
Line
Count
Source
1626
102k
{
1627
102k
    int e, m;
1628
102k
    int kx1 = sbr->kx[1];
1629
1630
102k
    if (sbr->bs_interpol_freq) {
1631
164k
        for (e = 0; e < ch_data->bs_num_env; e++) {
1632
108k
#if USE_FIXED
1633
108k
            const SoftFloat recip_env_size = av_int2sf(0x20000000 / (ch_data->t_env[e + 1] - ch_data->t_env[e]), 30);
1634
#else
1635
            const float recip_env_size = 0.5f / (ch_data->t_env[e + 1] - ch_data->t_env[e]);
1636
#endif /* USE_FIXED */
1637
108k
            int ilb = ch_data->t_env[e]     * 2 + ENVELOPE_ADJUSTMENT_OFFSET;
1638
108k
            int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET;
1639
1640
108k
            if (ilb >= 40)
1641
0
                return;
1642
1643
2.40M
            for (m = 0; m < sbr->m[1]; m++) {
1644
2.29M
                AAC_FLOAT sum = sbr->dsp.sum_square(X_high[m+kx1] + ilb, iub - ilb);
1645
2.29M
#if USE_FIXED
1646
2.29M
                e_curr[e][m] = av_mul_sf(sum, recip_env_size);
1647
#else
1648
                e_curr[e][m] = sum * recip_env_size;
1649
#endif /* USE_FIXED */
1650
2.29M
            }
1651
108k
        }
1652
55.5k
    } else {
1653
47.1k
        int k, p;
1654
1655
209k
        for (e = 0; e < ch_data->bs_num_env; e++) {
1656
162k
            const int env_size = 2 * (ch_data->t_env[e + 1] - ch_data->t_env[e]);
1657
162k
            int ilb = ch_data->t_env[e]     * 2 + ENVELOPE_ADJUSTMENT_OFFSET;
1658
162k
            int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET;
1659
162k
            const uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow;
1660
1661
162k
            if (ilb >= 40)
1662
0
                return;
1663
1664
978k
            for (p = 0; p < sbr->n[ch_data->bs_freq_res[e + 1]]; p++) {
1665
816k
#if USE_FIXED
1666
816k
                SoftFloat sum = FLOAT_0;
1667
816k
                const SoftFloat den = av_int2sf(0x20000000 / (env_size * (table[p + 1] - table[p])), 29);
1668
3.67M
                for (k = table[p]; k < table[p + 1]; k++) {
1669
2.86M
                    sum = av_add_sf(sum, sbr->dsp.sum_square(X_high[k] + ilb, iub - ilb));
1670
2.86M
                }
1671
816k
                sum = av_mul_sf(sum, den);
1672
#else
1673
                float sum = 0.0f;
1674
                const int den = env_size * (table[p + 1] - table[p]);
1675
1676
                for (k = table[p]; k < table[p + 1]; k++) {
1677
                    sum += sbr->dsp.sum_square(X_high[k] + ilb, iub - ilb);
1678
                }
1679
                sum /= den;
1680
#endif /* USE_FIXED */
1681
3.67M
                for (k = table[p]; k < table[p + 1]; k++) {
1682
2.86M
                    e_curr[e][k - kx1] = sum;
1683
2.86M
                }
1684
816k
            }
1685
162k
        }
1686
47.1k
    }
1687
102k
}
1688
1689
void AAC_RENAME(ff_aac_sbr_apply)(AACDecContext *ac, ChannelElement *che,
1690
                                  int id_aac, int fl960, void *L_, void *R_)
1691
997k
{
1692
997k
    INTFLOAT *L = L_, *R = R_;
1693
997k
    SpectralBandReplication *sbr = get_sbr(che);
1694
997k
    int downsampled = ac->oc[1].m4ac.ext_sample_rate < sbr->sample_rate;
1695
997k
    int ch;
1696
997k
    int nch = (id_aac == TYPE_CPE) ? 2 : 1;
1697
997k
    int err;
1698
997k
    int numTimeSlots = fl960 ? 15 : 16;
1699
1700
997k
    if (id_aac != sbr->id_aac) {
1701
469
        av_log(ac->avctx, id_aac == TYPE_LFE ? AV_LOG_VERBOSE : AV_LOG_WARNING,
1702
469
            "element type mismatch %d != %d\n", id_aac, sbr->id_aac);
1703
469
        sbr_turnoff(sbr);
1704
469
    }
1705
1706
997k
    if (sbr->start && !sbr->ready_for_dequant) {
1707
9.29k
        av_log(ac->avctx, AV_LOG_ERROR,
1708
9.29k
               "No quantized data read for sbr_dequant.\n");
1709
9.29k
        sbr_turnoff(sbr);
1710
9.29k
    }
1711
1712
997k
    if (!sbr->kx_and_m_pushed) {
1713
178k
        sbr->kx[0] = sbr->kx[1];
1714
178k
        sbr->m[0] = sbr->m[1];
1715
819k
    } else {
1716
819k
        sbr->kx_and_m_pushed = 0;
1717
819k
    }
1718
1719
997k
    if (sbr->start) {
1720
74.8k
        sbr_dequant(sbr, id_aac);
1721
74.8k
        sbr->ready_for_dequant = 0;
1722
74.8k
    }
1723
2.29M
    for (ch = 0; ch < nch; ch++) {
1724
        /* decode channel */
1725
1.29M
        sbr_qmf_analysis(ac->fdsp, sbr->mdct_ana, sbr->mdct_ana_fn, &sbr->dsp,
1726
1.29M
                         ch ? R : L, sbr->data[ch].analysis_filterbank_samples,
1727
1.29M
                         (INTFLOAT*)sbr->qmf_filter_scratch,
1728
1.29M
                         sbr->data[ch].W, sbr->data[ch].Ypos, numTimeSlots);
1729
1.29M
        sbr->c.sbr_lf_gen(sbr, sbr->X_low,
1730
1.29M
                          (const INTFLOAT (*)[32][32][2]) sbr->data[ch].W,
1731
1.29M
                          sbr->data[ch].Ypos, numTimeSlots);
1732
1.29M
        sbr->data[ch].Ypos ^= 1;
1733
1.29M
        if (sbr->start) {
1734
120k
            sbr->c.sbr_hf_inverse_filter(&sbr->dsp, sbr->alpha0, sbr->alpha1,
1735
120k
                                         (const INTFLOAT (*)[40][2]) sbr->X_low, sbr->k[0]);
1736
120k
            sbr_chirp(sbr, &sbr->data[ch]);
1737
120k
            av_assert0(sbr->data[ch].bs_num_env > 0);
1738
120k
            sbr_hf_gen(ac, sbr, sbr->X_high,
1739
120k
                       (const INTFLOAT (*)[40][2]) sbr->X_low,
1740
120k
                       (const INTFLOAT (*)[2]) sbr->alpha0,
1741
120k
                       (const INTFLOAT (*)[2]) sbr->alpha1,
1742
120k
                       sbr->data[ch].bw_array, sbr->data[ch].t_env,
1743
120k
                       sbr->data[ch].bs_num_env);
1744
1745
            // hf_adj
1746
120k
            err = sbr_mapping(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a);
1747
120k
            if (!err) {
1748
120k
                sbr_env_estimate(sbr->e_curr, sbr->X_high, sbr, &sbr->data[ch]);
1749
120k
                sbr_gain_calc(sbr, &sbr->data[ch], sbr->data[ch].e_a);
1750
120k
                sbr->c.sbr_hf_assemble(sbr->data[ch].Y[sbr->data[ch].Ypos],
1751
120k
                                (const INTFLOAT (*)[40][2]) sbr->X_high,
1752
120k
                                sbr, &sbr->data[ch],
1753
120k
                                sbr->data[ch].e_a);
1754
120k
            }
1755
120k
        }
1756
1757
        /* synthesis */
1758
1.29M
        sbr->c.sbr_x_gen(sbr, sbr->X[ch],
1759
1.29M
                         (const INTFLOAT (*)[64][2]) sbr->data[ch].Y[1-sbr->data[ch].Ypos],
1760
1.29M
                         (const INTFLOAT (*)[64][2]) sbr->data[ch].Y[  sbr->data[ch].Ypos],
1761
1.29M
                         (const INTFLOAT (*)[40][2]) sbr->X_low, ch, numTimeSlots);
1762
1.29M
    }
1763
1764
997k
    if (ac->oc[1].m4ac.ps == 1) {
1765
131k
        if (sbr->ps.common.start) {
1766
53.8k
            AAC_RENAME(ff_ps_apply)(&sbr->ps, sbr->X[0], sbr->X[1], sbr->kx[1] + sbr->m[1]);
1767
77.6k
        } else {
1768
77.6k
            memcpy(sbr->X[1], sbr->X[0], sizeof(sbr->X[0]));
1769
77.6k
        }
1770
131k
        nch = 2;
1771
131k
    }
1772
1773
997k
    sbr_qmf_synthesis(sbr->mdct, sbr->mdct_fn, &sbr->dsp, ac->fdsp,
1774
997k
                      L, sbr->X[0], sbr->qmf_filter_scratch,
1775
997k
                      sbr->data[0].synthesis_filterbank_samples,
1776
997k
                      &sbr->data[0].synthesis_filterbank_samples_offset,
1777
997k
                      numTimeSlots, downsampled);
1778
997k
    if (nch == 2)
1779
409k
        sbr_qmf_synthesis(sbr->mdct, sbr->mdct_fn, &sbr->dsp, ac->fdsp,
1780
409k
                          R, sbr->X[1], sbr->qmf_filter_scratch,
1781
409k
                          sbr->data[1].synthesis_filterbank_samples,
1782
409k
                          &sbr->data[1].synthesis_filterbank_samples_offset,
1783
409k
                          numTimeSlots, downsampled);
1784
997k
}
ff_aac_sbr_apply
Line
Count
Source
1691
777k
{
1692
777k
    INTFLOAT *L = L_, *R = R_;
1693
777k
    SpectralBandReplication *sbr = get_sbr(che);
1694
777k
    int downsampled = ac->oc[1].m4ac.ext_sample_rate < sbr->sample_rate;
1695
777k
    int ch;
1696
777k
    int nch = (id_aac == TYPE_CPE) ? 2 : 1;
1697
777k
    int err;
1698
777k
    int numTimeSlots = fl960 ? 15 : 16;
1699
1700
777k
    if (id_aac != sbr->id_aac) {
1701
261
        av_log(ac->avctx, id_aac == TYPE_LFE ? AV_LOG_VERBOSE : AV_LOG_WARNING,
1702
261
            "element type mismatch %d != %d\n", id_aac, sbr->id_aac);
1703
261
        sbr_turnoff(sbr);
1704
261
    }
1705
1706
777k
    if (sbr->start && !sbr->ready_for_dequant) {
1707
1.75k
        av_log(ac->avctx, AV_LOG_ERROR,
1708
1.75k
               "No quantized data read for sbr_dequant.\n");
1709
1.75k
        sbr_turnoff(sbr);
1710
1.75k
    }
1711
1712
777k
    if (!sbr->kx_and_m_pushed) {
1713
84.9k
        sbr->kx[0] = sbr->kx[1];
1714
84.9k
        sbr->m[0] = sbr->m[1];
1715
692k
    } else {
1716
692k
        sbr->kx_and_m_pushed = 0;
1717
692k
    }
1718
1719
777k
    if (sbr->start) {
1720
11.9k
        sbr_dequant(sbr, id_aac);
1721
11.9k
        sbr->ready_for_dequant = 0;
1722
11.9k
    }
1723
1.77M
    for (ch = 0; ch < nch; ch++) {
1724
        /* decode channel */
1725
995k
        sbr_qmf_analysis(ac->fdsp, sbr->mdct_ana, sbr->mdct_ana_fn, &sbr->dsp,
1726
995k
                         ch ? R : L, sbr->data[ch].analysis_filterbank_samples,
1727
995k
                         (INTFLOAT*)sbr->qmf_filter_scratch,
1728
995k
                         sbr->data[ch].W, sbr->data[ch].Ypos, numTimeSlots);
1729
995k
        sbr->c.sbr_lf_gen(sbr, sbr->X_low,
1730
995k
                          (const INTFLOAT (*)[32][32][2]) sbr->data[ch].W,
1731
995k
                          sbr->data[ch].Ypos, numTimeSlots);
1732
995k
        sbr->data[ch].Ypos ^= 1;
1733
995k
        if (sbr->start) {
1734
17.8k
            sbr->c.sbr_hf_inverse_filter(&sbr->dsp, sbr->alpha0, sbr->alpha1,
1735
17.8k
                                         (const INTFLOAT (*)[40][2]) sbr->X_low, sbr->k[0]);
1736
17.8k
            sbr_chirp(sbr, &sbr->data[ch]);
1737
17.8k
            av_assert0(sbr->data[ch].bs_num_env > 0);
1738
17.8k
            sbr_hf_gen(ac, sbr, sbr->X_high,
1739
17.8k
                       (const INTFLOAT (*)[40][2]) sbr->X_low,
1740
17.8k
                       (const INTFLOAT (*)[2]) sbr->alpha0,
1741
17.8k
                       (const INTFLOAT (*)[2]) sbr->alpha1,
1742
17.8k
                       sbr->data[ch].bw_array, sbr->data[ch].t_env,
1743
17.8k
                       sbr->data[ch].bs_num_env);
1744
1745
            // hf_adj
1746
17.8k
            err = sbr_mapping(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a);
1747
17.8k
            if (!err) {
1748
17.8k
                sbr_env_estimate(sbr->e_curr, sbr->X_high, sbr, &sbr->data[ch]);
1749
17.8k
                sbr_gain_calc(sbr, &sbr->data[ch], sbr->data[ch].e_a);
1750
17.8k
                sbr->c.sbr_hf_assemble(sbr->data[ch].Y[sbr->data[ch].Ypos],
1751
17.8k
                                (const INTFLOAT (*)[40][2]) sbr->X_high,
1752
17.8k
                                sbr, &sbr->data[ch],
1753
17.8k
                                sbr->data[ch].e_a);
1754
17.8k
            }
1755
17.8k
        }
1756
1757
        /* synthesis */
1758
995k
        sbr->c.sbr_x_gen(sbr, sbr->X[ch],
1759
995k
                         (const INTFLOAT (*)[64][2]) sbr->data[ch].Y[1-sbr->data[ch].Ypos],
1760
995k
                         (const INTFLOAT (*)[64][2]) sbr->data[ch].Y[  sbr->data[ch].Ypos],
1761
995k
                         (const INTFLOAT (*)[40][2]) sbr->X_low, ch, numTimeSlots);
1762
995k
    }
1763
1764
777k
    if (ac->oc[1].m4ac.ps == 1) {
1765
42.0k
        if (sbr->ps.common.start) {
1766
29.4k
            AAC_RENAME(ff_ps_apply)(&sbr->ps, sbr->X[0], sbr->X[1], sbr->kx[1] + sbr->m[1]);
1767
29.4k
        } else {
1768
12.5k
            memcpy(sbr->X[1], sbr->X[0], sizeof(sbr->X[0]));
1769
12.5k
        }
1770
42.0k
        nch = 2;
1771
42.0k
    }
1772
1773
777k
    sbr_qmf_synthesis(sbr->mdct, sbr->mdct_fn, &sbr->dsp, ac->fdsp,
1774
777k
                      L, sbr->X[0], sbr->qmf_filter_scratch,
1775
777k
                      sbr->data[0].synthesis_filterbank_samples,
1776
777k
                      &sbr->data[0].synthesis_filterbank_samples_offset,
1777
777k
                      numTimeSlots, downsampled);
1778
777k
    if (nch == 2)
1779
256k
        sbr_qmf_synthesis(sbr->mdct, sbr->mdct_fn, &sbr->dsp, ac->fdsp,
1780
256k
                          R, sbr->X[1], sbr->qmf_filter_scratch,
1781
256k
                          sbr->data[1].synthesis_filterbank_samples,
1782
256k
                          &sbr->data[1].synthesis_filterbank_samples_offset,
1783
256k
                          numTimeSlots, downsampled);
1784
777k
}
ff_aac_sbr_apply_fixed
Line
Count
Source
1691
220k
{
1692
220k
    INTFLOAT *L = L_, *R = R_;
1693
220k
    SpectralBandReplication *sbr = get_sbr(che);
1694
220k
    int downsampled = ac->oc[1].m4ac.ext_sample_rate < sbr->sample_rate;
1695
220k
    int ch;
1696
220k
    int nch = (id_aac == TYPE_CPE) ? 2 : 1;
1697
220k
    int err;
1698
220k
    int numTimeSlots = fl960 ? 15 : 16;
1699
1700
220k
    if (id_aac != sbr->id_aac) {
1701
208
        av_log(ac->avctx, id_aac == TYPE_LFE ? AV_LOG_VERBOSE : AV_LOG_WARNING,
1702
208
            "element type mismatch %d != %d\n", id_aac, sbr->id_aac);
1703
208
        sbr_turnoff(sbr);
1704
208
    }
1705
1706
220k
    if (sbr->start && !sbr->ready_for_dequant) {
1707
7.53k
        av_log(ac->avctx, AV_LOG_ERROR,
1708
7.53k
               "No quantized data read for sbr_dequant.\n");
1709
7.53k
        sbr_turnoff(sbr);
1710
7.53k
    }
1711
1712
220k
    if (!sbr->kx_and_m_pushed) {
1713
93.4k
        sbr->kx[0] = sbr->kx[1];
1714
93.4k
        sbr->m[0] = sbr->m[1];
1715
126k
    } else {
1716
126k
        sbr->kx_and_m_pushed = 0;
1717
126k
    }
1718
1719
220k
    if (sbr->start) {
1720
62.8k
        sbr_dequant(sbr, id_aac);
1721
62.8k
        sbr->ready_for_dequant = 0;
1722
62.8k
    }
1723
520k
    for (ch = 0; ch < nch; ch++) {
1724
        /* decode channel */
1725
299k
        sbr_qmf_analysis(ac->fdsp, sbr->mdct_ana, sbr->mdct_ana_fn, &sbr->dsp,
1726
299k
                         ch ? R : L, sbr->data[ch].analysis_filterbank_samples,
1727
299k
                         (INTFLOAT*)sbr->qmf_filter_scratch,
1728
299k
                         sbr->data[ch].W, sbr->data[ch].Ypos, numTimeSlots);
1729
299k
        sbr->c.sbr_lf_gen(sbr, sbr->X_low,
1730
299k
                          (const INTFLOAT (*)[32][32][2]) sbr->data[ch].W,
1731
299k
                          sbr->data[ch].Ypos, numTimeSlots);
1732
299k
        sbr->data[ch].Ypos ^= 1;
1733
299k
        if (sbr->start) {
1734
102k
            sbr->c.sbr_hf_inverse_filter(&sbr->dsp, sbr->alpha0, sbr->alpha1,
1735
102k
                                         (const INTFLOAT (*)[40][2]) sbr->X_low, sbr->k[0]);
1736
102k
            sbr_chirp(sbr, &sbr->data[ch]);
1737
102k
            av_assert0(sbr->data[ch].bs_num_env > 0);
1738
102k
            sbr_hf_gen(ac, sbr, sbr->X_high,
1739
102k
                       (const INTFLOAT (*)[40][2]) sbr->X_low,
1740
102k
                       (const INTFLOAT (*)[2]) sbr->alpha0,
1741
102k
                       (const INTFLOAT (*)[2]) sbr->alpha1,
1742
102k
                       sbr->data[ch].bw_array, sbr->data[ch].t_env,
1743
102k
                       sbr->data[ch].bs_num_env);
1744
1745
            // hf_adj
1746
102k
            err = sbr_mapping(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a);
1747
102k
            if (!err) {
1748
102k
                sbr_env_estimate(sbr->e_curr, sbr->X_high, sbr, &sbr->data[ch]);
1749
102k
                sbr_gain_calc(sbr, &sbr->data[ch], sbr->data[ch].e_a);
1750
102k
                sbr->c.sbr_hf_assemble(sbr->data[ch].Y[sbr->data[ch].Ypos],
1751
102k
                                (const INTFLOAT (*)[40][2]) sbr->X_high,
1752
102k
                                sbr, &sbr->data[ch],
1753
102k
                                sbr->data[ch].e_a);
1754
102k
            }
1755
102k
        }
1756
1757
        /* synthesis */
1758
299k
        sbr->c.sbr_x_gen(sbr, sbr->X[ch],
1759
299k
                         (const INTFLOAT (*)[64][2]) sbr->data[ch].Y[1-sbr->data[ch].Ypos],
1760
299k
                         (const INTFLOAT (*)[64][2]) sbr->data[ch].Y[  sbr->data[ch].Ypos],
1761
299k
                         (const INTFLOAT (*)[40][2]) sbr->X_low, ch, numTimeSlots);
1762
299k
    }
1763
1764
220k
    if (ac->oc[1].m4ac.ps == 1) {
1765
89.4k
        if (sbr->ps.common.start) {
1766
24.4k
            AAC_RENAME(ff_ps_apply)(&sbr->ps, sbr->X[0], sbr->X[1], sbr->kx[1] + sbr->m[1]);
1767
65.0k
        } else {
1768
65.0k
            memcpy(sbr->X[1], sbr->X[0], sizeof(sbr->X[0]));
1769
65.0k
        }
1770
89.4k
        nch = 2;
1771
89.4k
    }
1772
1773
220k
    sbr_qmf_synthesis(sbr->mdct, sbr->mdct_fn, &sbr->dsp, ac->fdsp,
1774
220k
                      L, sbr->X[0], sbr->qmf_filter_scratch,
1775
220k
                      sbr->data[0].synthesis_filterbank_samples,
1776
220k
                      &sbr->data[0].synthesis_filterbank_samples_offset,
1777
220k
                      numTimeSlots, downsampled);
1778
220k
    if (nch == 2)
1779
152k
        sbr_qmf_synthesis(sbr->mdct, sbr->mdct_fn, &sbr->dsp, ac->fdsp,
1780
152k
                          R, sbr->X[1], sbr->qmf_filter_scratch,
1781
152k
                          sbr->data[1].synthesis_filterbank_samples,
1782
152k
                          &sbr->data[1].synthesis_filterbank_samples_offset,
1783
152k
                          numTimeSlots, downsampled);
1784
220k
}
1785
1786
static void aacsbr_func_ptr_init(AACSBRContext *c)
1787
155k
{
1788
155k
    c->sbr_lf_gen            = sbr_lf_gen;
1789
155k
    c->sbr_hf_assemble       = sbr_hf_assemble;
1790
155k
    c->sbr_x_gen             = sbr_x_gen;
1791
155k
    c->sbr_hf_inverse_filter = sbr_hf_inverse_filter;
1792
155k
}
aacsbr.c:aacsbr_func_ptr_init
Line
Count
Source
1787
105k
{
1788
105k
    c->sbr_lf_gen            = sbr_lf_gen;
1789
105k
    c->sbr_hf_assemble       = sbr_hf_assemble;
1790
105k
    c->sbr_x_gen             = sbr_x_gen;
1791
105k
    c->sbr_hf_inverse_filter = sbr_hf_inverse_filter;
1792
105k
}
aacsbr_fixed.c:aacsbr_func_ptr_init
Line
Count
Source
1787
49.9k
{
1788
49.9k
    c->sbr_lf_gen            = sbr_lf_gen;
1789
49.9k
    c->sbr_hf_assemble       = sbr_hf_assemble;
1790
49.9k
    c->sbr_x_gen             = sbr_x_gen;
1791
49.9k
    c->sbr_hf_inverse_filter = sbr_hf_inverse_filter;
1792
49.9k
}