/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 | 2.88M | { |
49 | 2.88M | return &((ExtChannelElement*)ch)->sbr; |
50 | 2.88M | } Line | Count | Source | 48 | 2.50M | { | 49 | 2.50M | return &((ExtChannelElement*)ch)->sbr; | 50 | 2.50M | } |
Line | Count | Source | 48 | 380k | { | 49 | 380k | return &((ExtChannelElement*)ch)->sbr; | 50 | 380k | } |
|
51 | | |
52 | | av_cold void AAC_RENAME(ff_aac_sbr_init)(void) |
53 | 3 | { |
54 | 3 | AAC_RENAME(ff_ps_init)(); |
55 | 3 | } Line | Count | Source | 53 | 2 | { | 54 | 2 | AAC_RENAME(ff_ps_init)(); | 55 | 2 | } |
Line | Count | Source | 53 | 1 | { | 54 | 1 | AAC_RENAME(ff_ps_init)(); | 55 | 1 | } |
|
56 | | |
57 | | /** Places SBR in pure upsampling mode. */ |
58 | 1.49M | static void sbr_turnoff(SpectralBandReplication *sbr) { |
59 | 1.49M | sbr->start = 0; |
60 | 1.49M | sbr->usac = 0; |
61 | 1.49M | sbr->ready_for_dequant = 0; |
62 | | // Init defaults used in pure upsampling mode |
63 | 1.49M | sbr->kx[1] = 32; //Typo in spec, kx' inits to 32 |
64 | 1.49M | sbr->m[1] = 0; |
65 | | // Reset values for first SBR header |
66 | 1.49M | sbr->data[0].e_a[1] = sbr->data[1].e_a[1] = -1; |
67 | 1.49M | memset(&sbr->spectrum_params, -1, sizeof(SpectrumParameters)); |
68 | 1.49M | } Line | Count | Source | 58 | 1.35M | static void sbr_turnoff(SpectralBandReplication *sbr) { | 59 | 1.35M | sbr->start = 0; | 60 | 1.35M | sbr->usac = 0; | 61 | 1.35M | sbr->ready_for_dequant = 0; | 62 | | // Init defaults used in pure upsampling mode | 63 | 1.35M | sbr->kx[1] = 32; //Typo in spec, kx' inits to 32 | 64 | 1.35M | sbr->m[1] = 0; | 65 | | // Reset values for first SBR header | 66 | 1.35M | sbr->data[0].e_a[1] = sbr->data[1].e_a[1] = -1; | 67 | 1.35M | memset(&sbr->spectrum_params, -1, sizeof(SpectrumParameters)); | 68 | 1.35M | } |
aacsbr_fixed.c:sbr_turnoff Line | Count | Source | 58 | 140k | static void sbr_turnoff(SpectralBandReplication *sbr) { | 59 | 140k | sbr->start = 0; | 60 | 140k | sbr->usac = 0; | 61 | 140k | sbr->ready_for_dequant = 0; | 62 | | // Init defaults used in pure upsampling mode | 63 | 140k | sbr->kx[1] = 32; //Typo in spec, kx' inits to 32 | 64 | 140k | sbr->m[1] = 0; | 65 | | // Reset values for first SBR header | 66 | 140k | sbr->data[0].e_a[1] = sbr->data[1].e_a[1] = -1; | 67 | 140k | memset(&sbr->spectrum_params, -1, sizeof(SpectrumParameters)); | 68 | 140k | } |
|
69 | | |
70 | | av_cold int AAC_RENAME(ff_aac_sbr_ctx_alloc_init)(AACDecContext *ac, |
71 | | ChannelElement **che, int id_aac) |
72 | 149k | { |
73 | 149k | SpectralBandReplication *sbr; |
74 | 149k | ExtChannelElement *ext = av_mallocz(sizeof(*ext)); |
75 | 149k | int ret; |
76 | 149k | float scale; |
77 | | |
78 | 149k | if (!ext) |
79 | 0 | return AVERROR(ENOMEM); |
80 | 149k | *che = &ext->ch; |
81 | 149k | sbr = &ext->sbr; |
82 | 149k | ext->ch.ch[0].AAC_RENAME(predictor_state) = ext->predictor_state[0]; |
83 | 149k | ext->ch.ch[1].AAC_RENAME(predictor_state) = ext->predictor_state[1]; |
84 | | |
85 | 149k | sbr->kx[0] = sbr->kx[1]; |
86 | 149k | sbr->id_aac = id_aac; |
87 | 149k | sbr_turnoff(sbr); |
88 | 149k | sbr->data[0].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); |
89 | 149k | sbr->data[1].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); |
90 | | /* SBR requires samples to be scaled to +/-32768.0 to work correctly. |
91 | | * mdct scale factors are adjusted to scale up from +/-1.0 at analysis |
92 | | * and scale back down at synthesis. */ |
93 | | |
94 | 149k | scale = USE_FIXED ? 1 : 1.0 / (64 * 32768); |
95 | 149k | ret = av_tx_init(&sbr->mdct, &sbr->mdct_fn, |
96 | 149k | USE_FIXED ? AV_TX_INT32_MDCT : AV_TX_FLOAT_MDCT, |
97 | 149k | 1, 64, &scale, 0); |
98 | 149k | if (ret < 0) |
99 | 0 | return ret; |
100 | | |
101 | 149k | scale = USE_FIXED ? -1.0 : -2.0 * 32768; |
102 | 149k | ret = av_tx_init(&sbr->mdct_ana, &sbr->mdct_ana_fn, |
103 | 149k | USE_FIXED ? AV_TX_INT32_MDCT : AV_TX_FLOAT_MDCT, |
104 | 149k | 1, 64, &scale, 0); |
105 | 149k | if (ret < 0) |
106 | 0 | return ret; |
107 | | |
108 | 149k | AAC_RENAME(ff_ps_ctx_init)(&sbr->ps); |
109 | 149k | AAC_RENAME(ff_sbrdsp_init)(&sbr->dsp); |
110 | 149k | aacsbr_func_ptr_init(&sbr->c); |
111 | | |
112 | 149k | return 0; |
113 | 149k | } ff_aac_sbr_ctx_alloc_init Line | Count | Source | 72 | 114k | { | 73 | 114k | SpectralBandReplication *sbr; | 74 | 114k | ExtChannelElement *ext = av_mallocz(sizeof(*ext)); | 75 | 114k | int ret; | 76 | 114k | float scale; | 77 | | | 78 | 114k | if (!ext) | 79 | 0 | return AVERROR(ENOMEM); | 80 | 114k | *che = &ext->ch; | 81 | 114k | sbr = &ext->sbr; | 82 | 114k | ext->ch.ch[0].AAC_RENAME(predictor_state) = ext->predictor_state[0]; | 83 | 114k | ext->ch.ch[1].AAC_RENAME(predictor_state) = ext->predictor_state[1]; | 84 | | | 85 | 114k | sbr->kx[0] = sbr->kx[1]; | 86 | 114k | sbr->id_aac = id_aac; | 87 | 114k | sbr_turnoff(sbr); | 88 | 114k | sbr->data[0].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); | 89 | 114k | sbr->data[1].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); | 90 | | /* SBR requires samples to be scaled to +/-32768.0 to work correctly. | 91 | | * mdct scale factors are adjusted to scale up from +/-1.0 at analysis | 92 | | * and scale back down at synthesis. */ | 93 | | | 94 | 114k | scale = USE_FIXED ? 1 : 1.0 / (64 * 32768); | 95 | 114k | ret = av_tx_init(&sbr->mdct, &sbr->mdct_fn, | 96 | 114k | USE_FIXED ? AV_TX_INT32_MDCT : AV_TX_FLOAT_MDCT, | 97 | 114k | 1, 64, &scale, 0); | 98 | 114k | if (ret < 0) | 99 | 0 | return ret; | 100 | | | 101 | 114k | scale = USE_FIXED ? -1.0 : -2.0 * 32768; | 102 | 114k | ret = av_tx_init(&sbr->mdct_ana, &sbr->mdct_ana_fn, | 103 | 114k | USE_FIXED ? AV_TX_INT32_MDCT : AV_TX_FLOAT_MDCT, | 104 | 114k | 1, 64, &scale, 0); | 105 | 114k | if (ret < 0) | 106 | 0 | return ret; | 107 | | | 108 | 114k | AAC_RENAME(ff_ps_ctx_init)(&sbr->ps); | 109 | 114k | AAC_RENAME(ff_sbrdsp_init)(&sbr->dsp); | 110 | 114k | aacsbr_func_ptr_init(&sbr->c); | 111 | | | 112 | 114k | return 0; | 113 | 114k | } |
ff_aac_sbr_ctx_alloc_init_fixed Line | Count | Source | 72 | 34.3k | { | 73 | 34.3k | SpectralBandReplication *sbr; | 74 | 34.3k | ExtChannelElement *ext = av_mallocz(sizeof(*ext)); | 75 | 34.3k | int ret; | 76 | 34.3k | float scale; | 77 | | | 78 | 34.3k | if (!ext) | 79 | 0 | return AVERROR(ENOMEM); | 80 | 34.3k | *che = &ext->ch; | 81 | 34.3k | sbr = &ext->sbr; | 82 | 34.3k | ext->ch.ch[0].AAC_RENAME(predictor_state) = ext->predictor_state[0]; | 83 | 34.3k | ext->ch.ch[1].AAC_RENAME(predictor_state) = ext->predictor_state[1]; | 84 | | | 85 | 34.3k | sbr->kx[0] = sbr->kx[1]; | 86 | 34.3k | sbr->id_aac = id_aac; | 87 | 34.3k | sbr_turnoff(sbr); | 88 | 34.3k | sbr->data[0].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); | 89 | 34.3k | sbr->data[1].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); | 90 | | /* SBR requires samples to be scaled to +/-32768.0 to work correctly. | 91 | | * mdct scale factors are adjusted to scale up from +/-1.0 at analysis | 92 | | * and scale back down at synthesis. */ | 93 | | | 94 | 34.3k | scale = USE_FIXED ? 1 : 1.0 / (64 * 32768); | 95 | 34.3k | ret = av_tx_init(&sbr->mdct, &sbr->mdct_fn, | 96 | 34.3k | USE_FIXED ? AV_TX_INT32_MDCT : AV_TX_FLOAT_MDCT, | 97 | 34.3k | 1, 64, &scale, 0); | 98 | 34.3k | if (ret < 0) | 99 | 0 | return ret; | 100 | | | 101 | 34.3k | scale = USE_FIXED ? -1.0 : -2.0 * 32768; | 102 | 34.3k | ret = av_tx_init(&sbr->mdct_ana, &sbr->mdct_ana_fn, | 103 | 34.3k | USE_FIXED ? AV_TX_INT32_MDCT : AV_TX_FLOAT_MDCT, | 104 | 34.3k | 1, 64, &scale, 0); | 105 | 34.3k | if (ret < 0) | 106 | 0 | return ret; | 107 | | | 108 | 34.3k | AAC_RENAME(ff_ps_ctx_init)(&sbr->ps); | 109 | 34.3k | AAC_RENAME(ff_sbrdsp_init)(&sbr->dsp); | 110 | 34.3k | aacsbr_func_ptr_init(&sbr->c); | 111 | | | 112 | 34.3k | return 0; | 113 | 34.3k | } |
|
114 | | |
115 | | av_cold void AAC_RENAME(ff_aac_sbr_ctx_close)(ChannelElement *che) |
116 | 149k | { |
117 | 149k | SpectralBandReplication *sbr = get_sbr(che); |
118 | 149k | av_tx_uninit(&sbr->mdct); |
119 | 149k | av_tx_uninit(&sbr->mdct_ana); |
120 | 149k | } Line | Count | Source | 116 | 114k | { | 117 | 114k | SpectralBandReplication *sbr = get_sbr(che); | 118 | 114k | av_tx_uninit(&sbr->mdct); | 119 | 114k | av_tx_uninit(&sbr->mdct_ana); | 120 | 114k | } |
ff_aac_sbr_ctx_close_fixed Line | Count | Source | 116 | 34.3k | { | 117 | 34.3k | SpectralBandReplication *sbr = get_sbr(che); | 118 | 34.3k | av_tx_uninit(&sbr->mdct); | 119 | 34.3k | av_tx_uninit(&sbr->mdct_ana); | 120 | 34.3k | } |
|
121 | | |
122 | | static int qsort_comparison_function_int16(const void *a, const void *b) |
123 | 44.5M | { |
124 | 44.5M | return *(const int16_t *)a - *(const int16_t *)b; |
125 | 44.5M | } aacsbr.c:qsort_comparison_function_int16 Line | Count | Source | 123 | 36.0M | { | 124 | 36.0M | return *(const int16_t *)a - *(const int16_t *)b; | 125 | 36.0M | } |
aacsbr_fixed.c:qsort_comparison_function_int16 Line | Count | Source | 123 | 8.49M | { | 124 | 8.49M | return *(const int16_t *)a - *(const int16_t *)b; | 125 | 8.49M | } |
|
126 | | |
127 | | static inline int in_table_int16(const int16_t *table, int last_el, int16_t needle) |
128 | 2.21M | { |
129 | 2.21M | int i; |
130 | 8.68M | for (i = 0; i <= last_el; i++) |
131 | 6.99M | if (table[i] == needle) |
132 | 521k | return 1; |
133 | 1.69M | return 0; |
134 | 2.21M | } Line | Count | Source | 128 | 1.79M | { | 129 | 1.79M | int i; | 130 | 6.92M | for (i = 0; i <= last_el; i++) | 131 | 5.53M | if (table[i] == needle) | 132 | 395k | return 1; | 133 | 1.39M | return 0; | 134 | 1.79M | } |
aacsbr_fixed.c:in_table_int16 Line | Count | Source | 128 | 422k | { | 129 | 422k | int i; | 130 | 1.75M | for (i = 0; i <= last_el; i++) | 131 | 1.45M | if (table[i] == needle) | 132 | 125k | return 1; | 133 | 296k | return 0; | 134 | 422k | } |
|
135 | | |
136 | | /// Limiter Frequency Band Table (14496-3 sp04 p198) |
137 | | static void sbr_make_f_tablelim(SpectralBandReplication *sbr) |
138 | 305k | { |
139 | 305k | int k; |
140 | 305k | if (sbr->bs_limiter_bands > 0) { |
141 | 262k | static const INTFLOAT bands_warped[3] = { Q23(1.32715174233856803909f), //2^(0.49/1.2) |
142 | 262k | Q23(1.18509277094158210129f), //2^(0.49/2) |
143 | 262k | Q23(1.11987160404675912501f) }; //2^(0.49/3) |
144 | 262k | const INTFLOAT lim_bands_per_octave_warped = bands_warped[sbr->bs_limiter_bands - 1]; |
145 | 262k | int16_t patch_borders[7]; |
146 | 262k | uint16_t *in = sbr->f_tablelim + 1, *out = sbr->f_tablelim; |
147 | | |
148 | 262k | patch_borders[0] = sbr->kx[1]; |
149 | 834k | for (k = 1; k <= sbr->num_patches; k++) |
150 | 571k | patch_borders[k] = patch_borders[k-1] + sbr->patch_num_subbands[k-1]; |
151 | | |
152 | 262k | memcpy(sbr->f_tablelim, sbr->f_tablelow, |
153 | 262k | (sbr->n[0] + 1) * sizeof(sbr->f_tablelow[0])); |
154 | 262k | if (sbr->num_patches > 1) |
155 | 214k | memcpy(sbr->f_tablelim + sbr->n[0] + 1, patch_borders + 1, |
156 | 214k | (sbr->num_patches - 1) * sizeof(patch_borders[0])); |
157 | | |
158 | 262k | AV_QSORT(sbr->f_tablelim, sbr->num_patches + sbr->n[0], |
159 | 262k | uint16_t, |
160 | 262k | qsort_comparison_function_int16); |
161 | | |
162 | 262k | sbr->n_lim = sbr->n[0] + sbr->num_patches - 1; |
163 | 2.86M | while (out < sbr->f_tablelim + sbr->n_lim) { |
164 | | #if USE_FIXED |
165 | 541k | if ((*in << 23) >= *out * lim_bands_per_octave_warped) { |
166 | | #else |
167 | 2.06M | if (*in >= *out * lim_bands_per_octave_warped) { |
168 | 468k | #endif /* USE_FIXED */ |
169 | 468k | *++out = *in++; |
170 | 1.95M | } else if (*in == *out || |
171 | 1.83M | !in_table_int16(patch_borders, sbr->num_patches, *in)) { |
172 | 1.56M | in++; |
173 | 1.56M | sbr->n_lim--; |
174 | 1.56M | } else if (!in_table_int16(patch_borders, sbr->num_patches, *out)) { |
175 | 245k | *out = *in++; |
176 | 245k | sbr->n_lim--; |
177 | 245k | } else { |
178 | 138k | *++out = *in++; |
179 | 138k | } |
180 | 2.60M | } |
181 | 262k | } else { |
182 | 42.9k | sbr->f_tablelim[0] = sbr->f_tablelow[0]; |
183 | 42.9k | sbr->f_tablelim[1] = sbr->f_tablelow[sbr->n[0]]; |
184 | 42.9k | sbr->n_lim = 1; |
185 | 42.9k | } |
186 | 305k | } aacsbr.c:sbr_make_f_tablelim Line | Count | Source | 138 | 207k | { | 139 | 207k | int k; | 140 | 207k | if (sbr->bs_limiter_bands > 0) { | 141 | 191k | static const INTFLOAT bands_warped[3] = { Q23(1.32715174233856803909f), //2^(0.49/1.2) | 142 | 191k | Q23(1.18509277094158210129f), //2^(0.49/2) | 143 | 191k | Q23(1.11987160404675912501f) }; //2^(0.49/3) | 144 | 191k | const INTFLOAT lim_bands_per_octave_warped = bands_warped[sbr->bs_limiter_bands - 1]; | 145 | 191k | int16_t patch_borders[7]; | 146 | 191k | uint16_t *in = sbr->f_tablelim + 1, *out = sbr->f_tablelim; | 147 | | | 148 | 191k | patch_borders[0] = sbr->kx[1]; | 149 | 601k | for (k = 1; k <= sbr->num_patches; k++) | 150 | 410k | patch_borders[k] = patch_borders[k-1] + sbr->patch_num_subbands[k-1]; | 151 | | | 152 | 191k | memcpy(sbr->f_tablelim, sbr->f_tablelow, | 153 | 191k | (sbr->n[0] + 1) * sizeof(sbr->f_tablelow[0])); | 154 | 191k | if (sbr->num_patches > 1) | 155 | 162k | memcpy(sbr->f_tablelim + sbr->n[0] + 1, patch_borders + 1, | 156 | 162k | (sbr->num_patches - 1) * sizeof(patch_borders[0])); | 157 | | | 158 | 191k | AV_QSORT(sbr->f_tablelim, sbr->num_patches + sbr->n[0], | 159 | 191k | uint16_t, | 160 | 191k | qsort_comparison_function_int16); | 161 | | | 162 | 191k | sbr->n_lim = sbr->n[0] + sbr->num_patches - 1; | 163 | 2.25M | while (out < sbr->f_tablelim + sbr->n_lim) { | 164 | | #if USE_FIXED | 165 | | if ((*in << 23) >= *out * lim_bands_per_octave_warped) { | 166 | | #else | 167 | 2.06M | if (*in >= *out * lim_bands_per_octave_warped) { | 168 | 468k | #endif /* USE_FIXED */ | 169 | 468k | *++out = *in++; | 170 | 1.59M | } else if (*in == *out || | 171 | 1.49M | !in_table_int16(patch_borders, sbr->num_patches, *in)) { | 172 | 1.30M | in++; | 173 | 1.30M | sbr->n_lim--; | 174 | 1.30M | } else if (!in_table_int16(patch_borders, sbr->num_patches, *out)) { | 175 | 186k | *out = *in++; | 176 | 186k | sbr->n_lim--; | 177 | 186k | } else { | 178 | 104k | *++out = *in++; | 179 | 104k | } | 180 | 2.06M | } | 181 | 191k | } else { | 182 | 16.0k | sbr->f_tablelim[0] = sbr->f_tablelow[0]; | 183 | 16.0k | sbr->f_tablelim[1] = sbr->f_tablelow[sbr->n[0]]; | 184 | 16.0k | sbr->n_lim = 1; | 185 | 16.0k | } | 186 | 207k | } |
aacsbr_fixed.c:sbr_make_f_tablelim Line | Count | Source | 138 | 98.4k | { | 139 | 98.4k | int k; | 140 | 98.4k | if (sbr->bs_limiter_bands > 0) { | 141 | 71.5k | static const INTFLOAT bands_warped[3] = { Q23(1.32715174233856803909f), //2^(0.49/1.2) | 142 | 71.5k | Q23(1.18509277094158210129f), //2^(0.49/2) | 143 | 71.5k | Q23(1.11987160404675912501f) }; //2^(0.49/3) | 144 | 71.5k | const INTFLOAT lim_bands_per_octave_warped = bands_warped[sbr->bs_limiter_bands - 1]; | 145 | 71.5k | int16_t patch_borders[7]; | 146 | 71.5k | uint16_t *in = sbr->f_tablelim + 1, *out = sbr->f_tablelim; | 147 | | | 148 | 71.5k | patch_borders[0] = sbr->kx[1]; | 149 | 232k | for (k = 1; k <= sbr->num_patches; k++) | 150 | 160k | patch_borders[k] = patch_borders[k-1] + sbr->patch_num_subbands[k-1]; | 151 | | | 152 | 71.5k | memcpy(sbr->f_tablelim, sbr->f_tablelow, | 153 | 71.5k | (sbr->n[0] + 1) * sizeof(sbr->f_tablelow[0])); | 154 | 71.5k | if (sbr->num_patches > 1) | 155 | 51.6k | memcpy(sbr->f_tablelim + sbr->n[0] + 1, patch_borders + 1, | 156 | 51.6k | (sbr->num_patches - 1) * sizeof(patch_borders[0])); | 157 | | | 158 | 71.5k | AV_QSORT(sbr->f_tablelim, sbr->num_patches + sbr->n[0], | 159 | 71.5k | uint16_t, | 160 | 71.5k | qsort_comparison_function_int16); | 161 | | | 162 | 71.5k | sbr->n_lim = sbr->n[0] + sbr->num_patches - 1; | 163 | 613k | while (out < sbr->f_tablelim + sbr->n_lim) { | 164 | 541k | #if USE_FIXED | 165 | 541k | if ((*in << 23) >= *out * lim_bands_per_octave_warped) { | 166 | | #else | 167 | | if (*in >= *out * lim_bands_per_octave_warped) { | 168 | | #endif /* USE_FIXED */ | 169 | 181k | *++out = *in++; | 170 | 359k | } else if (*in == *out || | 171 | 330k | !in_table_int16(patch_borders, sbr->num_patches, *in)) { | 172 | 267k | in++; | 173 | 267k | sbr->n_lim--; | 174 | 267k | } else if (!in_table_int16(patch_borders, sbr->num_patches, *out)) { | 175 | 58.8k | *out = *in++; | 176 | 58.8k | sbr->n_lim--; | 177 | 58.8k | } else { | 178 | 33.5k | *++out = *in++; | 179 | 33.5k | } | 180 | 541k | } | 181 | 71.5k | } else { | 182 | 26.8k | sbr->f_tablelim[0] = sbr->f_tablelow[0]; | 183 | 26.8k | sbr->f_tablelim[1] = sbr->f_tablelow[sbr->n[0]]; | 184 | 26.8k | sbr->n_lim = 1; | 185 | 26.8k | } | 186 | 98.4k | } |
|
187 | | |
188 | | static unsigned int read_sbr_header(SpectralBandReplication *sbr, |
189 | | GetBitContext *gb, int is_usac) |
190 | 606k | { |
191 | 606k | unsigned int cnt = get_bits_count(gb); |
192 | 606k | uint8_t bs_header_extra_1; |
193 | 606k | uint8_t bs_header_extra_2; |
194 | 606k | int old_bs_limiter_bands = sbr->bs_limiter_bands; |
195 | 606k | SpectrumParameters old_spectrum_params; |
196 | | |
197 | 606k | sbr->start = 1; |
198 | 606k | sbr->ready_for_dequant = 0; |
199 | 606k | sbr->usac = is_usac; |
200 | | |
201 | | // Save last spectrum parameters variables to compare to new ones |
202 | 606k | memcpy(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters)); |
203 | | |
204 | 606k | if (!is_usac) |
205 | 367k | sbr->bs_amp_res_header = get_bits1(gb); |
206 | | |
207 | 606k | sbr->spectrum_params.bs_start_freq = get_bits(gb, 4); |
208 | 606k | sbr->spectrum_params.bs_stop_freq = get_bits(gb, 4); |
209 | | |
210 | 606k | if (!is_usac) |
211 | 367k | sbr->spectrum_params.bs_xover_band = get_bits(gb, 3); |
212 | 606k | skip_bits(gb, 2); // bs_reserved |
213 | | |
214 | 606k | bs_header_extra_1 = get_bits1(gb); |
215 | 606k | bs_header_extra_2 = get_bits1(gb); |
216 | | |
217 | 606k | if (bs_header_extra_1) { |
218 | 276k | sbr->spectrum_params.bs_freq_scale = get_bits(gb, 2); |
219 | 276k | sbr->spectrum_params.bs_alter_scale = get_bits1(gb); |
220 | 276k | sbr->spectrum_params.bs_noise_bands = get_bits(gb, 2); |
221 | 330k | } else { |
222 | 330k | sbr->spectrum_params.bs_freq_scale = 2; |
223 | 330k | sbr->spectrum_params.bs_alter_scale = 1; |
224 | 330k | sbr->spectrum_params.bs_noise_bands = 2; |
225 | 330k | } |
226 | | |
227 | | // Check if spectrum parameters changed |
228 | 606k | if (memcmp(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters))) |
229 | 565k | sbr->reset = 1; |
230 | | |
231 | 606k | if (bs_header_extra_2) { |
232 | 167k | sbr->bs_limiter_bands = get_bits(gb, 2); |
233 | 167k | sbr->bs_limiter_gains = get_bits(gb, 2); |
234 | 167k | sbr->bs_interpol_freq = get_bits1(gb); |
235 | 167k | sbr->bs_smoothing_mode = get_bits1(gb); |
236 | 439k | } else { |
237 | 439k | sbr->bs_limiter_bands = 2; |
238 | 439k | sbr->bs_limiter_gains = 2; |
239 | 439k | sbr->bs_interpol_freq = 1; |
240 | 439k | sbr->bs_smoothing_mode = 1; |
241 | 439k | } |
242 | | |
243 | 606k | if (sbr->bs_limiter_bands != old_bs_limiter_bands && !sbr->reset) |
244 | 1.84k | sbr_make_f_tablelim(sbr); |
245 | | |
246 | 606k | return get_bits_count(gb) - cnt; |
247 | 606k | } Line | Count | Source | 190 | 460k | { | 191 | 460k | unsigned int cnt = get_bits_count(gb); | 192 | 460k | uint8_t bs_header_extra_1; | 193 | 460k | uint8_t bs_header_extra_2; | 194 | 460k | int old_bs_limiter_bands = sbr->bs_limiter_bands; | 195 | 460k | SpectrumParameters old_spectrum_params; | 196 | | | 197 | 460k | sbr->start = 1; | 198 | 460k | sbr->ready_for_dequant = 0; | 199 | 460k | sbr->usac = is_usac; | 200 | | | 201 | | // Save last spectrum parameters variables to compare to new ones | 202 | 460k | memcpy(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters)); | 203 | | | 204 | 460k | if (!is_usac) | 205 | 221k | sbr->bs_amp_res_header = get_bits1(gb); | 206 | | | 207 | 460k | sbr->spectrum_params.bs_start_freq = get_bits(gb, 4); | 208 | 460k | sbr->spectrum_params.bs_stop_freq = get_bits(gb, 4); | 209 | | | 210 | 460k | if (!is_usac) | 211 | 221k | sbr->spectrum_params.bs_xover_band = get_bits(gb, 3); | 212 | 460k | skip_bits(gb, 2); // bs_reserved | 213 | | | 214 | 460k | bs_header_extra_1 = get_bits1(gb); | 215 | 460k | bs_header_extra_2 = get_bits1(gb); | 216 | | | 217 | 460k | if (bs_header_extra_1) { | 218 | 204k | sbr->spectrum_params.bs_freq_scale = get_bits(gb, 2); | 219 | 204k | sbr->spectrum_params.bs_alter_scale = get_bits1(gb); | 220 | 204k | sbr->spectrum_params.bs_noise_bands = get_bits(gb, 2); | 221 | 256k | } else { | 222 | 256k | sbr->spectrum_params.bs_freq_scale = 2; | 223 | 256k | sbr->spectrum_params.bs_alter_scale = 1; | 224 | 256k | sbr->spectrum_params.bs_noise_bands = 2; | 225 | 256k | } | 226 | | | 227 | | // Check if spectrum parameters changed | 228 | 460k | if (memcmp(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters))) | 229 | 453k | sbr->reset = 1; | 230 | | | 231 | 460k | if (bs_header_extra_2) { | 232 | 108k | sbr->bs_limiter_bands = get_bits(gb, 2); | 233 | 108k | sbr->bs_limiter_gains = get_bits(gb, 2); | 234 | 108k | sbr->bs_interpol_freq = get_bits1(gb); | 235 | 108k | sbr->bs_smoothing_mode = get_bits1(gb); | 236 | 352k | } else { | 237 | 352k | sbr->bs_limiter_bands = 2; | 238 | 352k | sbr->bs_limiter_gains = 2; | 239 | 352k | sbr->bs_interpol_freq = 1; | 240 | 352k | sbr->bs_smoothing_mode = 1; | 241 | 352k | } | 242 | | | 243 | 460k | if (sbr->bs_limiter_bands != old_bs_limiter_bands && !sbr->reset) | 244 | 237 | sbr_make_f_tablelim(sbr); | 245 | | | 246 | 460k | return get_bits_count(gb) - cnt; | 247 | 460k | } |
aacsbr_fixed.c:read_sbr_header Line | Count | Source | 190 | 146k | { | 191 | 146k | unsigned int cnt = get_bits_count(gb); | 192 | 146k | uint8_t bs_header_extra_1; | 193 | 146k | uint8_t bs_header_extra_2; | 194 | 146k | int old_bs_limiter_bands = sbr->bs_limiter_bands; | 195 | 146k | SpectrumParameters old_spectrum_params; | 196 | | | 197 | 146k | sbr->start = 1; | 198 | 146k | sbr->ready_for_dequant = 0; | 199 | 146k | sbr->usac = is_usac; | 200 | | | 201 | | // Save last spectrum parameters variables to compare to new ones | 202 | 146k | memcpy(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters)); | 203 | | | 204 | 146k | if (!is_usac) | 205 | 146k | sbr->bs_amp_res_header = get_bits1(gb); | 206 | | | 207 | 146k | sbr->spectrum_params.bs_start_freq = get_bits(gb, 4); | 208 | 146k | sbr->spectrum_params.bs_stop_freq = get_bits(gb, 4); | 209 | | | 210 | 146k | if (!is_usac) | 211 | 146k | sbr->spectrum_params.bs_xover_band = get_bits(gb, 3); | 212 | 146k | skip_bits(gb, 2); // bs_reserved | 213 | | | 214 | 146k | bs_header_extra_1 = get_bits1(gb); | 215 | 146k | bs_header_extra_2 = get_bits1(gb); | 216 | | | 217 | 146k | if (bs_header_extra_1) { | 218 | 72.3k | sbr->spectrum_params.bs_freq_scale = get_bits(gb, 2); | 219 | 72.3k | sbr->spectrum_params.bs_alter_scale = get_bits1(gb); | 220 | 72.3k | sbr->spectrum_params.bs_noise_bands = get_bits(gb, 2); | 221 | 73.7k | } else { | 222 | 73.7k | sbr->spectrum_params.bs_freq_scale = 2; | 223 | 73.7k | sbr->spectrum_params.bs_alter_scale = 1; | 224 | 73.7k | sbr->spectrum_params.bs_noise_bands = 2; | 225 | 73.7k | } | 226 | | | 227 | | // Check if spectrum parameters changed | 228 | 146k | if (memcmp(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters))) | 229 | 112k | sbr->reset = 1; | 230 | | | 231 | 146k | if (bs_header_extra_2) { | 232 | 59.4k | sbr->bs_limiter_bands = get_bits(gb, 2); | 233 | 59.4k | sbr->bs_limiter_gains = get_bits(gb, 2); | 234 | 59.4k | sbr->bs_interpol_freq = get_bits1(gb); | 235 | 59.4k | sbr->bs_smoothing_mode = get_bits1(gb); | 236 | 86.6k | } else { | 237 | 86.6k | sbr->bs_limiter_bands = 2; | 238 | 86.6k | sbr->bs_limiter_gains = 2; | 239 | 86.6k | sbr->bs_interpol_freq = 1; | 240 | 86.6k | sbr->bs_smoothing_mode = 1; | 241 | 86.6k | } | 242 | | | 243 | 146k | if (sbr->bs_limiter_bands != old_bs_limiter_bands && !sbr->reset) | 244 | 1.60k | sbr_make_f_tablelim(sbr); | 245 | | | 246 | 146k | return get_bits_count(gb) - cnt; | 247 | 146k | } |
|
248 | | |
249 | | static int array_min_int16(const int16_t *array, int nel) |
250 | 155k | { |
251 | 155k | int i, min = array[0]; |
252 | 757k | for (i = 1; i < nel; i++) |
253 | 601k | min = FFMIN(array[i], min); |
254 | 155k | return min; |
255 | 155k | } Line | Count | Source | 250 | 106k | { | 251 | 106k | int i, min = array[0]; | 252 | 463k | for (i = 1; i < nel; i++) | 253 | 356k | min = FFMIN(array[i], min); | 254 | 106k | return min; | 255 | 106k | } |
aacsbr_fixed.c:array_min_int16 Line | Count | Source | 250 | 49.2k | { | 251 | 49.2k | int i, min = array[0]; | 252 | 294k | for (i = 1; i < nel; i++) | 253 | 244k | min = FFMIN(array[i], min); | 254 | 49.2k | return min; | 255 | 49.2k | } |
|
256 | | |
257 | | static int check_n_master(AVCodecContext *avctx, int n_master, int bs_xover_band) |
258 | 329k | { |
259 | | // Requirements (14496-3 sp04 p205) |
260 | 329k | if (n_master <= 0) { |
261 | 1.94k | av_log(avctx, AV_LOG_ERROR, "Invalid n_master: %d\n", n_master); |
262 | 1.94k | return -1; |
263 | 1.94k | } |
264 | 328k | if (bs_xover_band >= n_master) { |
265 | 8.93k | av_log(avctx, AV_LOG_ERROR, |
266 | 8.93k | "Invalid bitstream, crossover band index beyond array bounds: %d\n", |
267 | 8.93k | bs_xover_band); |
268 | 8.93k | return -1; |
269 | 8.93k | } |
270 | 319k | return 0; |
271 | 328k | } Line | Count | Source | 258 | 224k | { | 259 | | // Requirements (14496-3 sp04 p205) | 260 | 224k | if (n_master <= 0) { | 261 | 1.72k | av_log(avctx, AV_LOG_ERROR, "Invalid n_master: %d\n", n_master); | 262 | 1.72k | return -1; | 263 | 1.72k | } | 264 | 222k | if (bs_xover_band >= n_master) { | 265 | 7.54k | av_log(avctx, AV_LOG_ERROR, | 266 | 7.54k | "Invalid bitstream, crossover band index beyond array bounds: %d\n", | 267 | 7.54k | bs_xover_band); | 268 | 7.54k | return -1; | 269 | 7.54k | } | 270 | 215k | return 0; | 271 | 222k | } |
aacsbr_fixed.c:check_n_master Line | Count | Source | 258 | 105k | { | 259 | | // Requirements (14496-3 sp04 p205) | 260 | 105k | if (n_master <= 0) { | 261 | 225 | av_log(avctx, AV_LOG_ERROR, "Invalid n_master: %d\n", n_master); | 262 | 225 | return -1; | 263 | 225 | } | 264 | 105k | if (bs_xover_band >= n_master) { | 265 | 1.38k | av_log(avctx, AV_LOG_ERROR, | 266 | 1.38k | "Invalid bitstream, crossover band index beyond array bounds: %d\n", | 267 | 1.38k | bs_xover_band); | 268 | 1.38k | return -1; | 269 | 1.38k | } | 270 | 104k | return 0; | 271 | 105k | } |
|
272 | | |
273 | | /// Master Frequency Band Table (14496-3 sp04 p194) |
274 | | static int sbr_make_f_master(AACDecContext *ac, SpectralBandReplication *sbr, |
275 | | SpectrumParameters *spectrum) |
276 | 597k | { |
277 | 597k | unsigned int temp, max_qmf_subbands = 0; |
278 | 597k | unsigned int start_min, stop_min; |
279 | 597k | int k; |
280 | 597k | const int8_t *sbr_offset_ptr; |
281 | 597k | int16_t stop_dk[13]; |
282 | | |
283 | 597k | switch (sbr->sample_rate) { |
284 | 19.8k | case 16000: |
285 | 19.8k | sbr_offset_ptr = sbr_offset[0]; |
286 | 19.8k | break; |
287 | 92.4k | case 22050: |
288 | 92.4k | sbr_offset_ptr = sbr_offset[1]; |
289 | 92.4k | break; |
290 | 59.8k | case 24000: |
291 | 59.8k | sbr_offset_ptr = sbr_offset[2]; |
292 | 59.8k | break; |
293 | 215k | case 32000: |
294 | 215k | sbr_offset_ptr = sbr_offset[3]; |
295 | 215k | break; |
296 | 51.2k | case 44100: case 48000: case 64000: |
297 | 51.2k | sbr_offset_ptr = sbr_offset[4]; |
298 | 51.2k | break; |
299 | 152k | case 88200: case 96000: case 128000: case 176400: case 192000: |
300 | 152k | sbr_offset_ptr = sbr_offset[5]; |
301 | 152k | break; |
302 | 6.14k | default: |
303 | 6.14k | av_log(ac->avctx, AV_LOG_ERROR, |
304 | 6.14k | "Unsupported sample rate for SBR: %d\n", sbr->sample_rate); |
305 | 6.14k | return -1; |
306 | 597k | } |
307 | | |
308 | 591k | if (sbr->sample_rate < 32000) { |
309 | 172k | temp = 3000; |
310 | 419k | } else if (sbr->sample_rate < 64000) { |
311 | 261k | temp = 4000; |
312 | 261k | } else |
313 | 157k | temp = 5000; |
314 | | |
315 | 591k | start_min = ((temp << 7) + (sbr->sample_rate >> 1)) / sbr->sample_rate; |
316 | 591k | stop_min = ((temp << 8) + (sbr->sample_rate >> 1)) / sbr->sample_rate; |
317 | | |
318 | 591k | sbr->k[0] = start_min + sbr_offset_ptr[spectrum->bs_start_freq]; |
319 | | |
320 | 591k | if (spectrum->bs_stop_freq < 14) { |
321 | 562k | sbr->k[2] = stop_min; |
322 | 562k | make_bands(stop_dk, stop_min, 64, 13); |
323 | 562k | AV_QSORT(stop_dk, 13, int16_t, qsort_comparison_function_int16); |
324 | 3.45M | for (k = 0; k < spectrum->bs_stop_freq; k++) |
325 | 2.89M | sbr->k[2] += stop_dk[k]; |
326 | 562k | } else if (spectrum->bs_stop_freq == 14) { |
327 | 20.1k | sbr->k[2] = 2*sbr->k[0]; |
328 | 20.1k | } else if (spectrum->bs_stop_freq == 15) { |
329 | 8.57k | sbr->k[2] = 3*sbr->k[0]; |
330 | 8.57k | } else { |
331 | 0 | av_log(ac->avctx, AV_LOG_ERROR, |
332 | 0 | "Invalid bs_stop_freq: %d\n", spectrum->bs_stop_freq); |
333 | 0 | return -1; |
334 | 0 | } |
335 | 591k | sbr->k[2] = FFMIN(64, sbr->k[2]); |
336 | | |
337 | | // Requirements (14496-3 sp04 p205) |
338 | 591k | if (sbr->sample_rate <= 32000) { |
339 | 387k | max_qmf_subbands = 48; |
340 | 387k | } else if (sbr->sample_rate == 44100) { |
341 | 23.1k | max_qmf_subbands = 35; |
342 | 180k | } else if (sbr->sample_rate >= 48000) |
343 | 180k | max_qmf_subbands = 32; |
344 | 0 | else |
345 | 0 | av_assert0(0); |
346 | | |
347 | 591k | if (sbr->k[2] - sbr->k[0] > max_qmf_subbands) { |
348 | 34.2k | av_log(ac->avctx, AV_LOG_ERROR, |
349 | 34.2k | "Invalid bitstream, too many QMF subbands: %d\n", sbr->k[2] - sbr->k[0]); |
350 | 34.2k | return -1; |
351 | 34.2k | } |
352 | | |
353 | 557k | if (!spectrum->bs_freq_scale) { |
354 | 106k | int dk, k2diff; |
355 | | |
356 | 106k | dk = spectrum->bs_alter_scale + 1; |
357 | 106k | sbr->n_master = ((sbr->k[2] - sbr->k[0] + (dk&2)) >> dk) << 1; |
358 | 106k | if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band)) |
359 | 3.21k | return -1; |
360 | | |
361 | 3.34M | for (k = 1; k <= sbr->n_master; k++) |
362 | 3.23M | sbr->f_master[k] = dk; |
363 | | |
364 | 103k | k2diff = sbr->k[2] - sbr->k[0] - sbr->n_master * dk; |
365 | 103k | if (k2diff < 0) { |
366 | 4.98k | sbr->f_master[1]--; |
367 | 4.98k | sbr->f_master[2]-= (k2diff < -1); |
368 | 98.6k | } else if (k2diff) { |
369 | 74.1k | sbr->f_master[sbr->n_master]++; |
370 | 74.1k | } |
371 | | |
372 | 103k | sbr->f_master[0] = sbr->k[0]; |
373 | 3.34M | for (k = 1; k <= sbr->n_master; k++) |
374 | 3.23M | sbr->f_master[k] += sbr->f_master[k - 1]; |
375 | | |
376 | 450k | } else { |
377 | 450k | int half_bands = 7 - spectrum->bs_freq_scale; // bs_freq_scale = {1,2,3} |
378 | 450k | int two_regions, num_bands_0; |
379 | 450k | int vdk0_max, vdk1_min; |
380 | 450k | int16_t vk0[49]; |
381 | | #if USE_FIXED |
382 | | int tmp, nz = 0; |
383 | | #endif /* USE_FIXED */ |
384 | | |
385 | 450k | if (49 * sbr->k[2] > 110 * sbr->k[0]) { |
386 | 377k | two_regions = 1; |
387 | 377k | sbr->k[1] = 2 * sbr->k[0]; |
388 | 377k | } else { |
389 | 73.1k | two_regions = 0; |
390 | 73.1k | sbr->k[1] = sbr->k[2]; |
391 | 73.1k | } |
392 | | |
393 | | #if USE_FIXED |
394 | | tmp = (sbr->k[1] << 23) / sbr->k[0]; |
395 | 650k | while (tmp < 0x40000000) { |
396 | 559k | tmp <<= 1; |
397 | 559k | nz++; |
398 | 559k | } |
399 | | tmp = fixed_log(tmp - 0x80000000); |
400 | | tmp = (int)(((int64_t)tmp * CONST_RECIP_LN2 + 0x20000000) >> 30); |
401 | | tmp = (((tmp + 0x80) >> 8) + ((8 - nz) << 23)) * half_bands; |
402 | | num_bands_0 = ((tmp + 0x400000) >> 23) * 2; |
403 | | #else |
404 | | num_bands_0 = lrintf(half_bands * log2f(sbr->k[1] / (float)sbr->k[0])) * 2; |
405 | | #endif /* USE_FIXED */ |
406 | | |
407 | 450k | if (num_bands_0 <= 0) { // Requirements (14496-3 sp04 p205) |
408 | 1.87k | av_log(ac->avctx, AV_LOG_ERROR, "Invalid num_bands_0: %d\n", num_bands_0); |
409 | 1.87k | return -1; |
410 | 1.87k | } |
411 | | |
412 | 448k | vk0[0] = 0; |
413 | | |
414 | 448k | make_bands(vk0+1, sbr->k[0], sbr->k[1], num_bands_0); |
415 | | |
416 | 448k | AV_QSORT(vk0 + 1, num_bands_0, int16_t, qsort_comparison_function_int16); |
417 | 448k | vdk0_max = vk0[num_bands_0]; |
418 | | |
419 | 448k | vk0[0] = sbr->k[0]; |
420 | 2.64M | for (k = 1; k <= num_bands_0; k++) { |
421 | 2.41M | if (vk0[k] <= 0) { // Requirements (14496-3 sp04 p205) |
422 | 225k | av_log(ac->avctx, AV_LOG_ERROR, "Invalid vDk0[%d]: %d\n", k, vk0[k]); |
423 | 225k | return -1; |
424 | 225k | } |
425 | 2.19M | vk0[k] += vk0[k-1]; |
426 | 2.19M | } |
427 | | |
428 | 223k | if (two_regions) { |
429 | 155k | int16_t vk1[49]; |
430 | | #if USE_FIXED |
431 | | int num_bands_1; |
432 | | |
433 | | tmp = (sbr->k[2] << 23) / sbr->k[1]; |
434 | | nz = 0; |
435 | 383k | while (tmp < 0x40000000) { |
436 | 334k | tmp <<= 1; |
437 | 334k | nz++; |
438 | 334k | } |
439 | | tmp = fixed_log(tmp - 0x80000000); |
440 | | tmp = (int)(((int64_t)tmp * CONST_RECIP_LN2 + 0x20000000) >> 30); |
441 | | tmp = (((tmp + 0x80) >> 8) + ((8 - nz) << 23)) * half_bands; |
442 | 49.2k | if (spectrum->bs_alter_scale) |
443 | 23.5k | tmp = (int)(((int64_t)tmp * CONST_076923 + 0x40000000) >> 31); |
444 | | num_bands_1 = ((tmp + 0x400000) >> 23) * 2; |
445 | | #else |
446 | 106k | float invwarp = spectrum->bs_alter_scale ? 0.76923076923076923077f |
447 | 71.4k | : 1.0f; // bs_alter_scale = {0,1} |
448 | | int num_bands_1 = lrintf(half_bands * invwarp * |
449 | | log2f(sbr->k[2] / (float)sbr->k[1])) * 2; |
450 | | #endif /* USE_FIXED */ |
451 | 155k | make_bands(vk1+1, sbr->k[1], sbr->k[2], num_bands_1); |
452 | | |
453 | 155k | vdk1_min = array_min_int16(vk1 + 1, num_bands_1); |
454 | | |
455 | 155k | if (vdk1_min < vdk0_max) { |
456 | 9.71k | int change; |
457 | 9.71k | AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16); |
458 | 9.71k | change = FFMIN(vdk0_max - vk1[1], (vk1[num_bands_1] - vk1[1]) >> 1); |
459 | 9.71k | vk1[1] += change; |
460 | 9.71k | vk1[num_bands_1] -= change; |
461 | 9.71k | } |
462 | | |
463 | 155k | AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16); |
464 | | |
465 | 155k | vk1[0] = sbr->k[1]; |
466 | 913k | for (k = 1; k <= num_bands_1; k++) { |
467 | 757k | if (vk1[k] <= 0) { // Requirements (14496-3 sp04 p205) |
468 | 0 | av_log(ac->avctx, AV_LOG_ERROR, "Invalid vDk1[%d]: %d\n", k, vk1[k]); |
469 | 0 | return -1; |
470 | 0 | } |
471 | 757k | vk1[k] += vk1[k-1]; |
472 | 757k | } |
473 | | |
474 | 155k | sbr->n_master = num_bands_0 + num_bands_1; |
475 | 155k | if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band)) |
476 | 308 | return -1; |
477 | 155k | memcpy(&sbr->f_master[0], vk0, |
478 | 155k | (num_bands_0 + 1) * sizeof(sbr->f_master[0])); |
479 | 155k | memcpy(&sbr->f_master[num_bands_0 + 1], vk1 + 1, |
480 | 155k | num_bands_1 * sizeof(sbr->f_master[0])); |
481 | | |
482 | 155k | } else { |
483 | 67.2k | sbr->n_master = num_bands_0; |
484 | 67.2k | if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band)) |
485 | 7.36k | return -1; |
486 | 59.8k | memcpy(sbr->f_master, vk0, (num_bands_0 + 1) * sizeof(sbr->f_master[0])); |
487 | 59.8k | } |
488 | 223k | } |
489 | | |
490 | 319k | return 0; |
491 | 557k | } aacsbr.c:sbr_make_f_master Line | Count | Source | 276 | 485k | { | 277 | 485k | unsigned int temp, max_qmf_subbands = 0; | 278 | 485k | unsigned int start_min, stop_min; | 279 | 485k | int k; | 280 | 485k | const int8_t *sbr_offset_ptr; | 281 | 485k | int16_t stop_dk[13]; | 282 | | | 283 | 485k | switch (sbr->sample_rate) { | 284 | 13.5k | case 16000: | 285 | 13.5k | sbr_offset_ptr = sbr_offset[0]; | 286 | 13.5k | break; | 287 | 83.3k | case 22050: | 288 | 83.3k | sbr_offset_ptr = sbr_offset[1]; | 289 | 83.3k | break; | 290 | 43.9k | case 24000: | 291 | 43.9k | sbr_offset_ptr = sbr_offset[2]; | 292 | 43.9k | break; | 293 | 170k | case 32000: | 294 | 170k | sbr_offset_ptr = sbr_offset[3]; | 295 | 170k | break; | 296 | 27.5k | case 44100: case 48000: case 64000: | 297 | 27.5k | sbr_offset_ptr = sbr_offset[4]; | 298 | 27.5k | break; | 299 | 141k | case 88200: case 96000: case 128000: case 176400: case 192000: | 300 | 141k | sbr_offset_ptr = sbr_offset[5]; | 301 | 141k | break; | 302 | 4.79k | default: | 303 | 4.79k | av_log(ac->avctx, AV_LOG_ERROR, | 304 | 4.79k | "Unsupported sample rate for SBR: %d\n", sbr->sample_rate); | 305 | 4.79k | return -1; | 306 | 485k | } | 307 | | | 308 | 480k | if (sbr->sample_rate < 32000) { | 309 | 140k | temp = 3000; | 310 | 339k | } else if (sbr->sample_rate < 64000) { | 311 | 196k | temp = 4000; | 312 | 196k | } else | 313 | 143k | temp = 5000; | 314 | | | 315 | 480k | start_min = ((temp << 7) + (sbr->sample_rate >> 1)) / sbr->sample_rate; | 316 | 480k | stop_min = ((temp << 8) + (sbr->sample_rate >> 1)) / sbr->sample_rate; | 317 | | | 318 | 480k | sbr->k[0] = start_min + sbr_offset_ptr[spectrum->bs_start_freq]; | 319 | | | 320 | 480k | if (spectrum->bs_stop_freq < 14) { | 321 | 467k | sbr->k[2] = stop_min; | 322 | 467k | make_bands(stop_dk, stop_min, 64, 13); | 323 | 467k | AV_QSORT(stop_dk, 13, int16_t, qsort_comparison_function_int16); | 324 | 2.73M | for (k = 0; k < spectrum->bs_stop_freq; k++) | 325 | 2.26M | sbr->k[2] += stop_dk[k]; | 326 | 467k | } else if (spectrum->bs_stop_freq == 14) { | 327 | 7.12k | sbr->k[2] = 2*sbr->k[0]; | 328 | 7.12k | } else if (spectrum->bs_stop_freq == 15) { | 329 | 6.54k | sbr->k[2] = 3*sbr->k[0]; | 330 | 6.54k | } else { | 331 | 0 | av_log(ac->avctx, AV_LOG_ERROR, | 332 | 0 | "Invalid bs_stop_freq: %d\n", spectrum->bs_stop_freq); | 333 | 0 | return -1; | 334 | 0 | } | 335 | 480k | sbr->k[2] = FFMIN(64, sbr->k[2]); | 336 | | | 337 | | // Requirements (14496-3 sp04 p205) | 338 | 480k | if (sbr->sample_rate <= 32000) { | 339 | 311k | max_qmf_subbands = 48; | 340 | 311k | } else if (sbr->sample_rate == 44100) { | 341 | 3.85k | max_qmf_subbands = 35; | 342 | 165k | } else if (sbr->sample_rate >= 48000) | 343 | 165k | max_qmf_subbands = 32; | 344 | 0 | else | 345 | 0 | av_assert0(0); | 346 | | | 347 | 480k | if (sbr->k[2] - sbr->k[0] > max_qmf_subbands) { | 348 | 32.6k | av_log(ac->avctx, AV_LOG_ERROR, | 349 | 32.6k | "Invalid bitstream, too many QMF subbands: %d\n", sbr->k[2] - sbr->k[0]); | 350 | 32.6k | return -1; | 351 | 32.6k | } | 352 | | | 353 | 448k | if (!spectrum->bs_freq_scale) { | 354 | 88.0k | int dk, k2diff; | 355 | | | 356 | 88.0k | dk = spectrum->bs_alter_scale + 1; | 357 | 88.0k | sbr->n_master = ((sbr->k[2] - sbr->k[0] + (dk&2)) >> dk) << 1; | 358 | 88.0k | if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band)) | 359 | 2.76k | return -1; | 360 | | | 361 | 2.83M | for (k = 1; k <= sbr->n_master; k++) | 362 | 2.75M | sbr->f_master[k] = dk; | 363 | | | 364 | 85.3k | k2diff = sbr->k[2] - sbr->k[0] - sbr->n_master * dk; | 365 | 85.3k | if (k2diff < 0) { | 366 | 2.95k | sbr->f_master[1]--; | 367 | 2.95k | sbr->f_master[2]-= (k2diff < -1); | 368 | 82.3k | } else if (k2diff) { | 369 | 67.5k | sbr->f_master[sbr->n_master]++; | 370 | 67.5k | } | 371 | | | 372 | 85.3k | sbr->f_master[0] = sbr->k[0]; | 373 | 2.83M | for (k = 1; k <= sbr->n_master; k++) | 374 | 2.75M | sbr->f_master[k] += sbr->f_master[k - 1]; | 375 | | | 376 | 359k | } else { | 377 | 359k | int half_bands = 7 - spectrum->bs_freq_scale; // bs_freq_scale = {1,2,3} | 378 | 359k | int two_regions, num_bands_0; | 379 | 359k | int vdk0_max, vdk1_min; | 380 | 359k | int16_t vk0[49]; | 381 | | #if USE_FIXED | 382 | | int tmp, nz = 0; | 383 | | #endif /* USE_FIXED */ | 384 | | | 385 | 359k | if (49 * sbr->k[2] > 110 * sbr->k[0]) { | 386 | 324k | two_regions = 1; | 387 | 324k | sbr->k[1] = 2 * sbr->k[0]; | 388 | 324k | } else { | 389 | 35.0k | two_regions = 0; | 390 | 35.0k | sbr->k[1] = sbr->k[2]; | 391 | 35.0k | } | 392 | | | 393 | | #if USE_FIXED | 394 | | tmp = (sbr->k[1] << 23) / sbr->k[0]; | 395 | | while (tmp < 0x40000000) { | 396 | | tmp <<= 1; | 397 | | nz++; | 398 | | } | 399 | | tmp = fixed_log(tmp - 0x80000000); | 400 | | tmp = (int)(((int64_t)tmp * CONST_RECIP_LN2 + 0x20000000) >> 30); | 401 | | tmp = (((tmp + 0x80) >> 8) + ((8 - nz) << 23)) * half_bands; | 402 | | num_bands_0 = ((tmp + 0x400000) >> 23) * 2; | 403 | | #else | 404 | 359k | num_bands_0 = lrintf(half_bands * log2f(sbr->k[1] / (float)sbr->k[0])) * 2; | 405 | 359k | #endif /* USE_FIXED */ | 406 | | | 407 | 359k | if (num_bands_0 <= 0) { // Requirements (14496-3 sp04 p205) | 408 | 1.55k | av_log(ac->avctx, AV_LOG_ERROR, "Invalid num_bands_0: %d\n", num_bands_0); | 409 | 1.55k | return -1; | 410 | 1.55k | } | 411 | | | 412 | 358k | vk0[0] = 0; | 413 | | | 414 | 358k | make_bands(vk0+1, sbr->k[0], sbr->k[1], num_bands_0); | 415 | | | 416 | 358k | AV_QSORT(vk0 + 1, num_bands_0, int16_t, qsort_comparison_function_int16); | 417 | 358k | vdk0_max = vk0[num_bands_0]; | 418 | | | 419 | 358k | vk0[0] = sbr->k[0]; | 420 | 1.78M | for (k = 1; k <= num_bands_0; k++) { | 421 | 1.64M | if (vk0[k] <= 0) { // Requirements (14496-3 sp04 p205) | 422 | 222k | av_log(ac->avctx, AV_LOG_ERROR, "Invalid vDk0[%d]: %d\n", k, vk0[k]); | 423 | 222k | return -1; | 424 | 222k | } | 425 | 1.42M | vk0[k] += vk0[k-1]; | 426 | 1.42M | } | 427 | | | 428 | 136k | if (two_regions) { | 429 | 106k | int16_t vk1[49]; | 430 | | #if USE_FIXED | 431 | | int num_bands_1; | 432 | | | 433 | | tmp = (sbr->k[2] << 23) / sbr->k[1]; | 434 | | nz = 0; | 435 | | while (tmp < 0x40000000) { | 436 | | tmp <<= 1; | 437 | | nz++; | 438 | | } | 439 | | tmp = fixed_log(tmp - 0x80000000); | 440 | | tmp = (int)(((int64_t)tmp * CONST_RECIP_LN2 + 0x20000000) >> 30); | 441 | | tmp = (((tmp + 0x80) >> 8) + ((8 - nz) << 23)) * half_bands; | 442 | | if (spectrum->bs_alter_scale) | 443 | | tmp = (int)(((int64_t)tmp * CONST_076923 + 0x40000000) >> 31); | 444 | | num_bands_1 = ((tmp + 0x400000) >> 23) * 2; | 445 | | #else | 446 | 106k | float invwarp = spectrum->bs_alter_scale ? 0.76923076923076923077f | 447 | 106k | : 1.0f; // bs_alter_scale = {0,1} | 448 | 106k | int num_bands_1 = lrintf(half_bands * invwarp * | 449 | 106k | log2f(sbr->k[2] / (float)sbr->k[1])) * 2; | 450 | 106k | #endif /* USE_FIXED */ | 451 | 106k | make_bands(vk1+1, sbr->k[1], sbr->k[2], num_bands_1); | 452 | | | 453 | 106k | vdk1_min = array_min_int16(vk1 + 1, num_bands_1); | 454 | | | 455 | 106k | if (vdk1_min < vdk0_max) { | 456 | 4.50k | int change; | 457 | 4.50k | AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16); | 458 | 4.50k | change = FFMIN(vdk0_max - vk1[1], (vk1[num_bands_1] - vk1[1]) >> 1); | 459 | 4.50k | vk1[1] += change; | 460 | 4.50k | vk1[num_bands_1] -= change; | 461 | 4.50k | } | 462 | | | 463 | 106k | AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16); | 464 | | | 465 | 106k | vk1[0] = sbr->k[1]; | 466 | 569k | for (k = 1; k <= num_bands_1; k++) { | 467 | 463k | if (vk1[k] <= 0) { // Requirements (14496-3 sp04 p205) | 468 | 0 | av_log(ac->avctx, AV_LOG_ERROR, "Invalid vDk1[%d]: %d\n", k, vk1[k]); | 469 | 0 | return -1; | 470 | 0 | } | 471 | 463k | vk1[k] += vk1[k-1]; | 472 | 463k | } | 473 | | | 474 | 106k | sbr->n_master = num_bands_0 + num_bands_1; | 475 | 106k | if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band)) | 476 | 308 | return -1; | 477 | 106k | memcpy(&sbr->f_master[0], vk0, | 478 | 106k | (num_bands_0 + 1) * sizeof(sbr->f_master[0])); | 479 | 106k | memcpy(&sbr->f_master[num_bands_0 + 1], vk1 + 1, | 480 | 106k | num_bands_1 * sizeof(sbr->f_master[0])); | 481 | | | 482 | 106k | } else { | 483 | 29.5k | sbr->n_master = num_bands_0; | 484 | 29.5k | if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band)) | 485 | 6.18k | return -1; | 486 | 23.3k | memcpy(sbr->f_master, vk0, (num_bands_0 + 1) * sizeof(sbr->f_master[0])); | 487 | 23.3k | } | 488 | 136k | } | 489 | | | 490 | 215k | return 0; | 491 | 448k | } |
aacsbr_fixed.c:sbr_make_f_master Line | Count | Source | 276 | 112k | { | 277 | 112k | unsigned int temp, max_qmf_subbands = 0; | 278 | 112k | unsigned int start_min, stop_min; | 279 | 112k | int k; | 280 | 112k | const int8_t *sbr_offset_ptr; | 281 | 112k | int16_t stop_dk[13]; | 282 | | | 283 | 112k | switch (sbr->sample_rate) { | 284 | 6.30k | case 16000: | 285 | 6.30k | sbr_offset_ptr = sbr_offset[0]; | 286 | 6.30k | break; | 287 | 9.03k | case 22050: | 288 | 9.03k | sbr_offset_ptr = sbr_offset[1]; | 289 | 9.03k | break; | 290 | 15.8k | case 24000: | 291 | 15.8k | sbr_offset_ptr = sbr_offset[2]; | 292 | 15.8k | break; | 293 | 45.0k | case 32000: | 294 | 45.0k | sbr_offset_ptr = sbr_offset[3]; | 295 | 45.0k | break; | 296 | 23.6k | case 44100: case 48000: case 64000: | 297 | 23.6k | sbr_offset_ptr = sbr_offset[4]; | 298 | 23.6k | break; | 299 | 10.8k | case 88200: case 96000: case 128000: case 176400: case 192000: | 300 | 10.8k | sbr_offset_ptr = sbr_offset[5]; | 301 | 10.8k | break; | 302 | 1.34k | default: | 303 | 1.34k | av_log(ac->avctx, AV_LOG_ERROR, | 304 | 1.34k | "Unsupported sample rate for SBR: %d\n", sbr->sample_rate); | 305 | 1.34k | return -1; | 306 | 112k | } | 307 | | | 308 | 110k | if (sbr->sample_rate < 32000) { | 309 | 31.2k | temp = 3000; | 310 | 79.5k | } else if (sbr->sample_rate < 64000) { | 311 | 65.4k | temp = 4000; | 312 | 65.4k | } else | 313 | 14.1k | temp = 5000; | 314 | | | 315 | 110k | start_min = ((temp << 7) + (sbr->sample_rate >> 1)) / sbr->sample_rate; | 316 | 110k | stop_min = ((temp << 8) + (sbr->sample_rate >> 1)) / sbr->sample_rate; | 317 | | | 318 | 110k | sbr->k[0] = start_min + sbr_offset_ptr[spectrum->bs_start_freq]; | 319 | | | 320 | 110k | if (spectrum->bs_stop_freq < 14) { | 321 | 95.7k | sbr->k[2] = stop_min; | 322 | 95.7k | make_bands(stop_dk, stop_min, 64, 13); | 323 | 95.7k | AV_QSORT(stop_dk, 13, int16_t, qsort_comparison_function_int16); | 324 | 718k | for (k = 0; k < spectrum->bs_stop_freq; k++) | 325 | 623k | sbr->k[2] += stop_dk[k]; | 326 | 95.7k | } else if (spectrum->bs_stop_freq == 14) { | 327 | 12.9k | sbr->k[2] = 2*sbr->k[0]; | 328 | 12.9k | } else if (spectrum->bs_stop_freq == 15) { | 329 | 2.02k | sbr->k[2] = 3*sbr->k[0]; | 330 | 2.02k | } else { | 331 | 0 | av_log(ac->avctx, AV_LOG_ERROR, | 332 | 0 | "Invalid bs_stop_freq: %d\n", spectrum->bs_stop_freq); | 333 | 0 | return -1; | 334 | 0 | } | 335 | 110k | sbr->k[2] = FFMIN(64, sbr->k[2]); | 336 | | | 337 | | // Requirements (14496-3 sp04 p205) | 338 | 110k | if (sbr->sample_rate <= 32000) { | 339 | 76.3k | max_qmf_subbands = 48; | 340 | 76.3k | } else if (sbr->sample_rate == 44100) { | 341 | 19.2k | max_qmf_subbands = 35; | 342 | 19.2k | } else if (sbr->sample_rate >= 48000) | 343 | 15.1k | max_qmf_subbands = 32; | 344 | 0 | else | 345 | 0 | av_assert0(0); | 346 | | | 347 | 110k | if (sbr->k[2] - sbr->k[0] > max_qmf_subbands) { | 348 | 1.51k | av_log(ac->avctx, AV_LOG_ERROR, | 349 | 1.51k | "Invalid bitstream, too many QMF subbands: %d\n", sbr->k[2] - sbr->k[0]); | 350 | 1.51k | return -1; | 351 | 1.51k | } | 352 | | | 353 | 109k | if (!spectrum->bs_freq_scale) { | 354 | 18.7k | int dk, k2diff; | 355 | | | 356 | 18.7k | dk = spectrum->bs_alter_scale + 1; | 357 | 18.7k | sbr->n_master = ((sbr->k[2] - sbr->k[0] + (dk&2)) >> dk) << 1; | 358 | 18.7k | if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band)) | 359 | 442 | return -1; | 360 | | | 361 | 504k | for (k = 1; k <= sbr->n_master; k++) | 362 | 486k | sbr->f_master[k] = dk; | 363 | | | 364 | 18.2k | k2diff = sbr->k[2] - sbr->k[0] - sbr->n_master * dk; | 365 | 18.2k | if (k2diff < 0) { | 366 | 2.03k | sbr->f_master[1]--; | 367 | 2.03k | sbr->f_master[2]-= (k2diff < -1); | 368 | 16.2k | } else if (k2diff) { | 369 | 6.57k | sbr->f_master[sbr->n_master]++; | 370 | 6.57k | } | 371 | | | 372 | 18.2k | sbr->f_master[0] = sbr->k[0]; | 373 | 504k | for (k = 1; k <= sbr->n_master; k++) | 374 | 486k | sbr->f_master[k] += sbr->f_master[k - 1]; | 375 | | | 376 | 90.5k | } else { | 377 | 90.5k | int half_bands = 7 - spectrum->bs_freq_scale; // bs_freq_scale = {1,2,3} | 378 | 90.5k | int two_regions, num_bands_0; | 379 | 90.5k | int vdk0_max, vdk1_min; | 380 | 90.5k | int16_t vk0[49]; | 381 | 90.5k | #if USE_FIXED | 382 | 90.5k | int tmp, nz = 0; | 383 | 90.5k | #endif /* USE_FIXED */ | 384 | | | 385 | 90.5k | if (49 * sbr->k[2] > 110 * sbr->k[0]) { | 386 | 52.4k | two_regions = 1; | 387 | 52.4k | sbr->k[1] = 2 * sbr->k[0]; | 388 | 52.4k | } else { | 389 | 38.1k | two_regions = 0; | 390 | 38.1k | sbr->k[1] = sbr->k[2]; | 391 | 38.1k | } | 392 | | | 393 | 90.5k | #if USE_FIXED | 394 | 90.5k | tmp = (sbr->k[1] << 23) / sbr->k[0]; | 395 | 650k | while (tmp < 0x40000000) { | 396 | 559k | tmp <<= 1; | 397 | 559k | nz++; | 398 | 559k | } | 399 | 90.5k | tmp = fixed_log(tmp - 0x80000000); | 400 | 90.5k | tmp = (int)(((int64_t)tmp * CONST_RECIP_LN2 + 0x20000000) >> 30); | 401 | 90.5k | tmp = (((tmp + 0x80) >> 8) + ((8 - nz) << 23)) * half_bands; | 402 | 90.5k | num_bands_0 = ((tmp + 0x400000) >> 23) * 2; | 403 | | #else | 404 | | num_bands_0 = lrintf(half_bands * log2f(sbr->k[1] / (float)sbr->k[0])) * 2; | 405 | | #endif /* USE_FIXED */ | 406 | | | 407 | 90.5k | if (num_bands_0 <= 0) { // Requirements (14496-3 sp04 p205) | 408 | 327 | av_log(ac->avctx, AV_LOG_ERROR, "Invalid num_bands_0: %d\n", num_bands_0); | 409 | 327 | return -1; | 410 | 327 | } | 411 | | | 412 | 90.2k | vk0[0] = 0; | 413 | | | 414 | 90.2k | make_bands(vk0+1, sbr->k[0], sbr->k[1], num_bands_0); | 415 | | | 416 | 90.2k | AV_QSORT(vk0 + 1, num_bands_0, int16_t, qsort_comparison_function_int16); | 417 | 90.2k | vdk0_max = vk0[num_bands_0]; | 418 | | | 419 | 90.2k | vk0[0] = sbr->k[0]; | 420 | 859k | for (k = 1; k <= num_bands_0; k++) { | 421 | 772k | if (vk0[k] <= 0) { // Requirements (14496-3 sp04 p205) | 422 | 3.26k | av_log(ac->avctx, AV_LOG_ERROR, "Invalid vDk0[%d]: %d\n", k, vk0[k]); | 423 | 3.26k | return -1; | 424 | 3.26k | } | 425 | 769k | vk0[k] += vk0[k-1]; | 426 | 769k | } | 427 | | | 428 | 86.9k | if (two_regions) { | 429 | 49.2k | int16_t vk1[49]; | 430 | 49.2k | #if USE_FIXED | 431 | 49.2k | int num_bands_1; | 432 | | | 433 | 49.2k | tmp = (sbr->k[2] << 23) / sbr->k[1]; | 434 | 49.2k | nz = 0; | 435 | 383k | while (tmp < 0x40000000) { | 436 | 334k | tmp <<= 1; | 437 | 334k | nz++; | 438 | 334k | } | 439 | 49.2k | tmp = fixed_log(tmp - 0x80000000); | 440 | 49.2k | tmp = (int)(((int64_t)tmp * CONST_RECIP_LN2 + 0x20000000) >> 30); | 441 | 49.2k | tmp = (((tmp + 0x80) >> 8) + ((8 - nz) << 23)) * half_bands; | 442 | 49.2k | if (spectrum->bs_alter_scale) | 443 | 23.5k | tmp = (int)(((int64_t)tmp * CONST_076923 + 0x40000000) >> 31); | 444 | 49.2k | num_bands_1 = ((tmp + 0x400000) >> 23) * 2; | 445 | | #else | 446 | | float invwarp = spectrum->bs_alter_scale ? 0.76923076923076923077f | 447 | | : 1.0f; // bs_alter_scale = {0,1} | 448 | | int num_bands_1 = lrintf(half_bands * invwarp * | 449 | | log2f(sbr->k[2] / (float)sbr->k[1])) * 2; | 450 | | #endif /* USE_FIXED */ | 451 | 49.2k | make_bands(vk1+1, sbr->k[1], sbr->k[2], num_bands_1); | 452 | | | 453 | 49.2k | vdk1_min = array_min_int16(vk1 + 1, num_bands_1); | 454 | | | 455 | 49.2k | if (vdk1_min < vdk0_max) { | 456 | 5.21k | int change; | 457 | 5.21k | AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16); | 458 | 5.21k | change = FFMIN(vdk0_max - vk1[1], (vk1[num_bands_1] - vk1[1]) >> 1); | 459 | 5.21k | vk1[1] += change; | 460 | 5.21k | vk1[num_bands_1] -= change; | 461 | 5.21k | } | 462 | | | 463 | 49.2k | AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16); | 464 | | | 465 | 49.2k | vk1[0] = sbr->k[1]; | 466 | 343k | for (k = 1; k <= num_bands_1; k++) { | 467 | 294k | if (vk1[k] <= 0) { // Requirements (14496-3 sp04 p205) | 468 | 0 | av_log(ac->avctx, AV_LOG_ERROR, "Invalid vDk1[%d]: %d\n", k, vk1[k]); | 469 | 0 | return -1; | 470 | 0 | } | 471 | 294k | vk1[k] += vk1[k-1]; | 472 | 294k | } | 473 | | | 474 | 49.2k | sbr->n_master = num_bands_0 + num_bands_1; | 475 | 49.2k | if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band)) | 476 | 0 | return -1; | 477 | 49.2k | memcpy(&sbr->f_master[0], vk0, | 478 | 49.2k | (num_bands_0 + 1) * sizeof(sbr->f_master[0])); | 479 | 49.2k | memcpy(&sbr->f_master[num_bands_0 + 1], vk1 + 1, | 480 | 49.2k | num_bands_1 * sizeof(sbr->f_master[0])); | 481 | | | 482 | 49.2k | } else { | 483 | 37.7k | sbr->n_master = num_bands_0; | 484 | 37.7k | if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band)) | 485 | 1.17k | return -1; | 486 | 36.5k | memcpy(sbr->f_master, vk0, (num_bands_0 + 1) * sizeof(sbr->f_master[0])); | 487 | 36.5k | } | 488 | 86.9k | } | 489 | | | 490 | 104k | return 0; | 491 | 109k | } |
|
492 | | |
493 | | /// High Frequency Generation - Patch Construction (14496-3 sp04 p216 fig. 4.46) |
494 | | static int sbr_hf_calc_npatches(AACDecContext *ac, SpectralBandReplication *sbr) |
495 | 310k | { |
496 | 310k | int i, k, last_k = -1, last_msb = -1, sb = 0; |
497 | 310k | int msb = sbr->k[0]; |
498 | 310k | int usb = sbr->kx[1]; |
499 | 310k | int goal_sb = ((1000 << 11) + (sbr->sample_rate >> 1)) / sbr->sample_rate; |
500 | | |
501 | 310k | sbr->num_patches = 0; |
502 | | |
503 | 310k | if (goal_sb < sbr->kx[1] + sbr->m[1]) { |
504 | 312k | for (k = 0; sbr->f_master[k] < goal_sb; k++) ; |
505 | 31.7k | } else |
506 | 278k | k = sbr->n_master; |
507 | | |
508 | 754k | do { |
509 | 754k | int odd = 0; |
510 | 754k | if (k == last_k && msb == last_msb) { |
511 | 841 | av_log(ac->avctx, AV_LOG_ERROR, "patch construction failed\n"); |
512 | 841 | return AVERROR_INVALIDDATA; |
513 | 841 | } |
514 | 753k | last_k = k; |
515 | 753k | last_msb = msb; |
516 | 4.54M | for (i = k; i == k || sb > (sbr->k[0] - 1 + msb - odd); i--) { |
517 | 3.79M | sb = sbr->f_master[i]; |
518 | 3.79M | odd = (sb + sbr->k[0]) & 1; |
519 | 3.79M | } |
520 | | |
521 | | // Requirements (14496-3 sp04 p205) sets the maximum number of patches to 5. |
522 | | // After this check the final number of patches can still be six which is |
523 | | // illegal however the Coding Technologies decoder check stream has a final |
524 | | // count of 6 patches |
525 | 753k | if (sbr->num_patches > 5) { |
526 | 5.41k | av_log(ac->avctx, AV_LOG_ERROR, "Too many patches: %d\n", sbr->num_patches); |
527 | 5.41k | return -1; |
528 | 5.41k | } |
529 | | |
530 | 748k | sbr->patch_num_subbands[sbr->num_patches] = FFMAX(sb - usb, 0); |
531 | 748k | sbr->patch_start_subband[sbr->num_patches] = sbr->k[0] - odd - sbr->patch_num_subbands[sbr->num_patches]; |
532 | | |
533 | 748k | if (sbr->patch_num_subbands[sbr->num_patches] > 0) { |
534 | 721k | usb = sb; |
535 | 721k | msb = sb; |
536 | 721k | sbr->num_patches++; |
537 | 721k | } else |
538 | 27.0k | msb = sbr->kx[1]; |
539 | | |
540 | 748k | if (sbr->f_master[k] - sb < 3) |
541 | 338k | k = sbr->n_master; |
542 | 748k | } while (sb != sbr->kx[1] + sbr->m[1]); |
543 | | |
544 | 303k | if (sbr->num_patches > 1 && |
545 | 257k | sbr->patch_num_subbands[sbr->num_patches - 1] < 3) |
546 | 6.67k | sbr->num_patches--; |
547 | | |
548 | 303k | return 0; |
549 | 310k | } aacsbr.c:sbr_hf_calc_npatches Line | Count | Source | 495 | 207k | { | 496 | 207k | int i, k, last_k = -1, last_msb = -1, sb = 0; | 497 | 207k | int msb = sbr->k[0]; | 498 | 207k | int usb = sbr->kx[1]; | 499 | 207k | int goal_sb = ((1000 << 11) + (sbr->sample_rate >> 1)) / sbr->sample_rate; | 500 | | | 501 | 207k | sbr->num_patches = 0; | 502 | | | 503 | 207k | if (goal_sb < sbr->kx[1] + sbr->m[1]) { | 504 | 233k | for (k = 0; sbr->f_master[k] < goal_sb; k++) ; | 505 | 23.7k | } else | 506 | 184k | k = sbr->n_master; | 507 | | | 508 | 476k | do { | 509 | 476k | int odd = 0; | 510 | 476k | if (k == last_k && msb == last_msb) { | 511 | 583 | av_log(ac->avctx, AV_LOG_ERROR, "patch construction failed\n"); | 512 | 583 | return AVERROR_INVALIDDATA; | 513 | 583 | } | 514 | 475k | last_k = k; | 515 | 475k | last_msb = msb; | 516 | 2.97M | for (i = k; i == k || sb > (sbr->k[0] - 1 + msb - odd); i--) { | 517 | 2.50M | sb = sbr->f_master[i]; | 518 | 2.50M | odd = (sb + sbr->k[0]) & 1; | 519 | 2.50M | } | 520 | | | 521 | | // Requirements (14496-3 sp04 p205) sets the maximum number of patches to 5. | 522 | | // After this check the final number of patches can still be six which is | 523 | | // illegal however the Coding Technologies decoder check stream has a final | 524 | | // count of 6 patches | 525 | 475k | if (sbr->num_patches > 5) { | 526 | 405 | av_log(ac->avctx, AV_LOG_ERROR, "Too many patches: %d\n", sbr->num_patches); | 527 | 405 | return -1; | 528 | 405 | } | 529 | | | 530 | 475k | sbr->patch_num_subbands[sbr->num_patches] = FFMAX(sb - usb, 0); | 531 | 475k | sbr->patch_start_subband[sbr->num_patches] = sbr->k[0] - odd - sbr->patch_num_subbands[sbr->num_patches]; | 532 | | | 533 | 475k | if (sbr->patch_num_subbands[sbr->num_patches] > 0) { | 534 | 464k | usb = sb; | 535 | 464k | msb = sb; | 536 | 464k | sbr->num_patches++; | 537 | 464k | } else | 538 | 10.3k | msb = sbr->kx[1]; | 539 | | | 540 | 475k | if (sbr->f_master[k] - sb < 3) | 541 | 226k | k = sbr->n_master; | 542 | 475k | } while (sb != sbr->kx[1] + sbr->m[1]); | 543 | | | 544 | 206k | if (sbr->num_patches > 1 && | 545 | 178k | sbr->patch_num_subbands[sbr->num_patches - 1] < 3) | 546 | 4.52k | sbr->num_patches--; | 547 | | | 548 | 206k | return 0; | 549 | 207k | } |
aacsbr_fixed.c:sbr_hf_calc_npatches Line | Count | Source | 495 | 102k | { | 496 | 102k | int i, k, last_k = -1, last_msb = -1, sb = 0; | 497 | 102k | int msb = sbr->k[0]; | 498 | 102k | int usb = sbr->kx[1]; | 499 | 102k | int goal_sb = ((1000 << 11) + (sbr->sample_rate >> 1)) / sbr->sample_rate; | 500 | | | 501 | 102k | sbr->num_patches = 0; | 502 | | | 503 | 102k | if (goal_sb < sbr->kx[1] + sbr->m[1]) { | 504 | 79.2k | for (k = 0; sbr->f_master[k] < goal_sb; k++) ; | 505 | 7.97k | } else | 506 | 94.1k | k = sbr->n_master; | 507 | | | 508 | 278k | do { | 509 | 278k | int odd = 0; | 510 | 278k | if (k == last_k && msb == last_msb) { | 511 | 258 | av_log(ac->avctx, AV_LOG_ERROR, "patch construction failed\n"); | 512 | 258 | return AVERROR_INVALIDDATA; | 513 | 258 | } | 514 | 277k | last_k = k; | 515 | 277k | last_msb = msb; | 516 | 1.56M | for (i = k; i == k || sb > (sbr->k[0] - 1 + msb - odd); i--) { | 517 | 1.29M | sb = sbr->f_master[i]; | 518 | 1.29M | odd = (sb + sbr->k[0]) & 1; | 519 | 1.29M | } | 520 | | | 521 | | // Requirements (14496-3 sp04 p205) sets the maximum number of patches to 5. | 522 | | // After this check the final number of patches can still be six which is | 523 | | // illegal however the Coding Technologies decoder check stream has a final | 524 | | // count of 6 patches | 525 | 277k | if (sbr->num_patches > 5) { | 526 | 5.01k | av_log(ac->avctx, AV_LOG_ERROR, "Too many patches: %d\n", sbr->num_patches); | 527 | 5.01k | return -1; | 528 | 5.01k | } | 529 | | | 530 | 272k | sbr->patch_num_subbands[sbr->num_patches] = FFMAX(sb - usb, 0); | 531 | 272k | sbr->patch_start_subband[sbr->num_patches] = sbr->k[0] - odd - sbr->patch_num_subbands[sbr->num_patches]; | 532 | | | 533 | 272k | if (sbr->patch_num_subbands[sbr->num_patches] > 0) { | 534 | 256k | usb = sb; | 535 | 256k | msb = sb; | 536 | 256k | sbr->num_patches++; | 537 | 256k | } else | 538 | 16.7k | msb = sbr->kx[1]; | 539 | | | 540 | 272k | if (sbr->f_master[k] - sb < 3) | 541 | 111k | k = sbr->n_master; | 542 | 272k | } while (sb != sbr->kx[1] + sbr->m[1]); | 543 | | | 544 | 96.8k | if (sbr->num_patches > 1 && | 545 | 78.6k | sbr->patch_num_subbands[sbr->num_patches - 1] < 3) | 546 | 2.14k | sbr->num_patches--; | 547 | | | 548 | 96.8k | return 0; | 549 | 102k | } |
|
550 | | |
551 | | /// Derived Frequency Band Tables (14496-3 sp04 p197) |
552 | | static int sbr_make_f_derived(AACDecContext *ac, SpectralBandReplication *sbr) |
553 | 319k | { |
554 | 319k | int k, temp; |
555 | | #if USE_FIXED |
556 | | int nz = 0; |
557 | | #endif /* USE_FIXED */ |
558 | | |
559 | 319k | sbr->n[1] = sbr->n_master - sbr->spectrum_params.bs_xover_band; |
560 | 319k | sbr->n[0] = (sbr->n[1] + 1) >> 1; |
561 | | |
562 | 319k | memcpy(sbr->f_tablehigh, &sbr->f_master[sbr->spectrum_params.bs_xover_band], |
563 | 319k | (sbr->n[1] + 1) * sizeof(sbr->f_master[0])); |
564 | 319k | sbr->m[1] = sbr->f_tablehigh[sbr->n[1]] - sbr->f_tablehigh[0]; |
565 | 319k | sbr->kx[1] = sbr->f_tablehigh[0]; |
566 | | |
567 | | // Requirements (14496-3 sp04 p205) |
568 | 319k | if (sbr->kx[1] + sbr->m[1] > 64) { |
569 | 0 | av_log(ac->avctx, AV_LOG_ERROR, |
570 | 0 | "Stop frequency border too high: %d\n", sbr->kx[1] + sbr->m[1]); |
571 | 0 | return -1; |
572 | 0 | } |
573 | 319k | if (sbr->kx[1] > 32) { |
574 | 8.20k | av_log(ac->avctx, AV_LOG_ERROR, "Start frequency border too high: %d\n", sbr->kx[1]); |
575 | 8.20k | return -1; |
576 | 8.20k | } |
577 | | |
578 | 310k | sbr->f_tablelow[0] = sbr->f_tablehigh[0]; |
579 | 310k | temp = sbr->n[1] & 1; |
580 | 2.92M | for (k = 1; k <= sbr->n[0]; k++) |
581 | 2.61M | sbr->f_tablelow[k] = sbr->f_tablehigh[2 * k - temp]; |
582 | | #if USE_FIXED |
583 | | temp = (sbr->k[2] << 23) / sbr->kx[1]; |
584 | 751k | while (temp < 0x40000000) { |
585 | 648k | temp <<= 1; |
586 | 648k | nz++; |
587 | 648k | } |
588 | | temp = fixed_log(temp - 0x80000000); |
589 | | temp = (int)(((int64_t)temp * CONST_RECIP_LN2 + 0x20000000) >> 30); |
590 | | temp = (((temp + 0x80) >> 8) + ((8 - nz) << 23)) * sbr->spectrum_params.bs_noise_bands; |
591 | | |
592 | | sbr->n_q = (temp + 0x400000) >> 23; |
593 | 102k | if (sbr->n_q < 1) |
594 | 35.6k | sbr->n_q = 1; |
595 | | #else |
596 | 208k | sbr->n_q = FFMAX(1, lrintf(sbr->spectrum_params.bs_noise_bands * |
597 | | log2f(sbr->k[2] / (float)sbr->kx[1]))); // 0 <= bs_noise_bands <= 3 |
598 | | #endif /* USE_FIXED */ |
599 | | |
600 | 310k | if (sbr->n_q > 5) { |
601 | 857 | av_log(ac->avctx, AV_LOG_ERROR, "Too many noise floor scale factors: %d\n", sbr->n_q); |
602 | 857 | sbr->n_q = 1; |
603 | 857 | return -1; |
604 | 857 | } |
605 | | |
606 | 310k | sbr->f_tablenoise[0] = sbr->f_tablelow[0]; |
607 | 310k | temp = 0; |
608 | 1.04M | for (k = 1; k <= sbr->n_q; k++) { |
609 | 737k | temp += (sbr->n[0] - temp) / (sbr->n_q + 1 - k); |
610 | 737k | sbr->f_tablenoise[k] = sbr->f_tablelow[temp]; |
611 | 737k | } |
612 | | |
613 | 310k | if (sbr_hf_calc_npatches(ac, sbr) < 0) |
614 | 6.26k | return -1; |
615 | | |
616 | 303k | sbr_make_f_tablelim(sbr); |
617 | | |
618 | 303k | sbr->data[0].f_indexnoise = 0; |
619 | 303k | sbr->data[1].f_indexnoise = 0; |
620 | | |
621 | 303k | return 0; |
622 | 310k | } aacsbr.c:sbr_make_f_derived Line | Count | Source | 553 | 215k | { | 554 | 215k | int k, temp; | 555 | | #if USE_FIXED | 556 | | int nz = 0; | 557 | | #endif /* USE_FIXED */ | 558 | | | 559 | 215k | sbr->n[1] = sbr->n_master - sbr->spectrum_params.bs_xover_band; | 560 | 215k | sbr->n[0] = (sbr->n[1] + 1) >> 1; | 561 | | | 562 | 215k | memcpy(sbr->f_tablehigh, &sbr->f_master[sbr->spectrum_params.bs_xover_band], | 563 | 215k | (sbr->n[1] + 1) * sizeof(sbr->f_master[0])); | 564 | 215k | sbr->m[1] = sbr->f_tablehigh[sbr->n[1]] - sbr->f_tablehigh[0]; | 565 | 215k | sbr->kx[1] = sbr->f_tablehigh[0]; | 566 | | | 567 | | // Requirements (14496-3 sp04 p205) | 568 | 215k | if (sbr->kx[1] + sbr->m[1] > 64) { | 569 | 0 | av_log(ac->avctx, AV_LOG_ERROR, | 570 | 0 | "Stop frequency border too high: %d\n", sbr->kx[1] + sbr->m[1]); | 571 | 0 | return -1; | 572 | 0 | } | 573 | 215k | if (sbr->kx[1] > 32) { | 574 | 6.86k | av_log(ac->avctx, AV_LOG_ERROR, "Start frequency border too high: %d\n", sbr->kx[1]); | 575 | 6.86k | return -1; | 576 | 6.86k | } | 577 | | | 578 | 208k | sbr->f_tablelow[0] = sbr->f_tablehigh[0]; | 579 | 208k | temp = sbr->n[1] & 1; | 580 | 2.16M | for (k = 1; k <= sbr->n[0]; k++) | 581 | 1.96M | sbr->f_tablelow[k] = sbr->f_tablehigh[2 * k - temp]; | 582 | | #if USE_FIXED | 583 | | temp = (sbr->k[2] << 23) / sbr->kx[1]; | 584 | | while (temp < 0x40000000) { | 585 | | temp <<= 1; | 586 | | nz++; | 587 | | } | 588 | | temp = fixed_log(temp - 0x80000000); | 589 | | temp = (int)(((int64_t)temp * CONST_RECIP_LN2 + 0x20000000) >> 30); | 590 | | temp = (((temp + 0x80) >> 8) + ((8 - nz) << 23)) * sbr->spectrum_params.bs_noise_bands; | 591 | | | 592 | | sbr->n_q = (temp + 0x400000) >> 23; | 593 | | if (sbr->n_q < 1) | 594 | | sbr->n_q = 1; | 595 | | #else | 596 | 208k | sbr->n_q = FFMAX(1, lrintf(sbr->spectrum_params.bs_noise_bands * | 597 | 208k | log2f(sbr->k[2] / (float)sbr->kx[1]))); // 0 <= bs_noise_bands <= 3 | 598 | 208k | #endif /* USE_FIXED */ | 599 | | | 600 | 208k | if (sbr->n_q > 5) { | 601 | 233 | av_log(ac->avctx, AV_LOG_ERROR, "Too many noise floor scale factors: %d\n", sbr->n_q); | 602 | 233 | sbr->n_q = 1; | 603 | 233 | return -1; | 604 | 233 | } | 605 | | | 606 | 207k | sbr->f_tablenoise[0] = sbr->f_tablelow[0]; | 607 | 207k | temp = 0; | 608 | 749k | for (k = 1; k <= sbr->n_q; k++) { | 609 | 541k | temp += (sbr->n[0] - temp) / (sbr->n_q + 1 - k); | 610 | 541k | sbr->f_tablenoise[k] = sbr->f_tablelow[temp]; | 611 | 541k | } | 612 | | | 613 | 207k | if (sbr_hf_calc_npatches(ac, sbr) < 0) | 614 | 988 | return -1; | 615 | | | 616 | 206k | sbr_make_f_tablelim(sbr); | 617 | | | 618 | 206k | sbr->data[0].f_indexnoise = 0; | 619 | 206k | sbr->data[1].f_indexnoise = 0; | 620 | | | 621 | 206k | return 0; | 622 | 207k | } |
aacsbr_fixed.c:sbr_make_f_derived Line | Count | Source | 553 | 104k | { | 554 | 104k | int k, temp; | 555 | 104k | #if USE_FIXED | 556 | 104k | int nz = 0; | 557 | 104k | #endif /* USE_FIXED */ | 558 | | | 559 | 104k | sbr->n[1] = sbr->n_master - sbr->spectrum_params.bs_xover_band; | 560 | 104k | sbr->n[0] = (sbr->n[1] + 1) >> 1; | 561 | | | 562 | 104k | memcpy(sbr->f_tablehigh, &sbr->f_master[sbr->spectrum_params.bs_xover_band], | 563 | 104k | (sbr->n[1] + 1) * sizeof(sbr->f_master[0])); | 564 | 104k | sbr->m[1] = sbr->f_tablehigh[sbr->n[1]] - sbr->f_tablehigh[0]; | 565 | 104k | sbr->kx[1] = sbr->f_tablehigh[0]; | 566 | | | 567 | | // Requirements (14496-3 sp04 p205) | 568 | 104k | if (sbr->kx[1] + sbr->m[1] > 64) { | 569 | 0 | av_log(ac->avctx, AV_LOG_ERROR, | 570 | 0 | "Stop frequency border too high: %d\n", sbr->kx[1] + sbr->m[1]); | 571 | 0 | return -1; | 572 | 0 | } | 573 | 104k | if (sbr->kx[1] > 32) { | 574 | 1.33k | av_log(ac->avctx, AV_LOG_ERROR, "Start frequency border too high: %d\n", sbr->kx[1]); | 575 | 1.33k | return -1; | 576 | 1.33k | } | 577 | | | 578 | 102k | sbr->f_tablelow[0] = sbr->f_tablehigh[0]; | 579 | 102k | temp = sbr->n[1] & 1; | 580 | 756k | for (k = 1; k <= sbr->n[0]; k++) | 581 | 654k | sbr->f_tablelow[k] = sbr->f_tablehigh[2 * k - temp]; | 582 | 102k | #if USE_FIXED | 583 | 102k | temp = (sbr->k[2] << 23) / sbr->kx[1]; | 584 | 751k | while (temp < 0x40000000) { | 585 | 648k | temp <<= 1; | 586 | 648k | nz++; | 587 | 648k | } | 588 | 102k | temp = fixed_log(temp - 0x80000000); | 589 | 102k | temp = (int)(((int64_t)temp * CONST_RECIP_LN2 + 0x20000000) >> 30); | 590 | 102k | temp = (((temp + 0x80) >> 8) + ((8 - nz) << 23)) * sbr->spectrum_params.bs_noise_bands; | 591 | | | 592 | 102k | sbr->n_q = (temp + 0x400000) >> 23; | 593 | 102k | if (sbr->n_q < 1) | 594 | 35.6k | sbr->n_q = 1; | 595 | | #else | 596 | | sbr->n_q = FFMAX(1, lrintf(sbr->spectrum_params.bs_noise_bands * | 597 | | log2f(sbr->k[2] / (float)sbr->kx[1]))); // 0 <= bs_noise_bands <= 3 | 598 | | #endif /* USE_FIXED */ | 599 | | | 600 | 102k | if (sbr->n_q > 5) { | 601 | 624 | av_log(ac->avctx, AV_LOG_ERROR, "Too many noise floor scale factors: %d\n", sbr->n_q); | 602 | 624 | sbr->n_q = 1; | 603 | 624 | return -1; | 604 | 624 | } | 605 | | | 606 | 102k | sbr->f_tablenoise[0] = sbr->f_tablelow[0]; | 607 | 102k | temp = 0; | 608 | 298k | for (k = 1; k <= sbr->n_q; k++) { | 609 | 196k | temp += (sbr->n[0] - temp) / (sbr->n_q + 1 - k); | 610 | 196k | sbr->f_tablenoise[k] = sbr->f_tablelow[temp]; | 611 | 196k | } | 612 | | | 613 | 102k | if (sbr_hf_calc_npatches(ac, sbr) < 0) | 614 | 5.27k | return -1; | 615 | | | 616 | 96.8k | sbr_make_f_tablelim(sbr); | 617 | | | 618 | 96.8k | sbr->data[0].f_indexnoise = 0; | 619 | 96.8k | sbr->data[1].f_indexnoise = 0; | 620 | | | 621 | 96.8k | return 0; | 622 | 102k | } |
|
623 | | |
624 | | static av_always_inline void get_bits1_vector(GetBitContext *gb, uint8_t *vec, |
625 | | int elements) |
626 | 3.18M | { |
627 | 3.18M | int i; |
628 | 8.80M | for (i = 0; i < elements; i++) { |
629 | 5.61M | vec[i] = get_bits1(gb); |
630 | 5.61M | } |
631 | 3.18M | } aacsbr.c:get_bits1_vector Line | Count | Source | 626 | 2.71M | { | 627 | 2.71M | int i; | 628 | 7.05M | for (i = 0; i < elements; i++) { | 629 | 4.34M | vec[i] = get_bits1(gb); | 630 | 4.34M | } | 631 | 2.71M | } |
aacsbr_fixed.c:get_bits1_vector Line | Count | Source | 626 | 476k | { | 627 | 476k | int i; | 628 | 1.74M | for (i = 0; i < elements; i++) { | 629 | 1.26M | vec[i] = get_bits1(gb); | 630 | 1.26M | } | 631 | 476k | } |
|
632 | | |
633 | | /** ceil(log2(index+1)) */ |
634 | | static const int8_t ceil_log2[] = { |
635 | | 0, 1, 2, 2, 3, 3, |
636 | | }; |
637 | | |
638 | | static int read_sbr_grid(AACDecContext *ac, SpectralBandReplication *sbr, |
639 | | GetBitContext *gb, SBRData *ch_data) |
640 | 1.39M | { |
641 | 1.39M | int i; |
642 | 1.39M | int bs_pointer = 0; |
643 | | // frameLengthFlag ? 15 : 16; 960 sample length frames unsupported; this value is numTimeSlots |
644 | 1.39M | int abs_bord_trail = 16; |
645 | 1.39M | int num_rel_lead, num_rel_trail; |
646 | 1.39M | unsigned bs_num_env_old = ch_data->bs_num_env; |
647 | 1.39M | int bs_frame_class, bs_num_env; |
648 | | |
649 | 1.39M | ch_data->bs_freq_res[0] = ch_data->bs_freq_res[ch_data->bs_num_env]; |
650 | 1.39M | ch_data->bs_amp_res = sbr->bs_amp_res_header; |
651 | 1.39M | ch_data->t_env_num_env_old = ch_data->t_env[bs_num_env_old]; |
652 | | |
653 | 1.39M | switch (bs_frame_class = get_bits(gb, 2)) { |
654 | 1.09M | case FIXFIX: |
655 | 1.09M | bs_num_env = 1 << get_bits(gb, 2); |
656 | 1.09M | if (bs_num_env > (sbr->usac ? 8 : 5)) { |
657 | 3.28k | av_log(ac->avctx, AV_LOG_ERROR, |
658 | 3.28k | "Invalid bitstream, too many SBR envelopes in FIXFIX type SBR frame: %d\n", |
659 | 3.28k | bs_num_env); |
660 | 3.28k | return -1; |
661 | 3.28k | } |
662 | 1.09M | ch_data->bs_num_env = bs_num_env; |
663 | 1.09M | num_rel_lead = ch_data->bs_num_env - 1; |
664 | 1.09M | if (ch_data->bs_num_env == 1) |
665 | 999k | ch_data->bs_amp_res = 0; |
666 | | |
667 | | |
668 | 1.09M | ch_data->t_env[0] = 0; |
669 | 1.09M | ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; |
670 | | |
671 | 1.09M | abs_bord_trail = (abs_bord_trail + (ch_data->bs_num_env >> 1)) / |
672 | 1.09M | ch_data->bs_num_env; |
673 | 1.24M | for (i = 0; i < num_rel_lead; i++) |
674 | 147k | ch_data->t_env[i + 1] = ch_data->t_env[i] + abs_bord_trail; |
675 | | |
676 | 1.09M | ch_data->bs_freq_res[1] = get_bits1(gb); |
677 | 1.24M | for (i = 1; i < ch_data->bs_num_env; i++) |
678 | 147k | ch_data->bs_freq_res[i + 1] = ch_data->bs_freq_res[1]; |
679 | 1.09M | break; |
680 | 122k | case FIXVAR: |
681 | 122k | abs_bord_trail += get_bits(gb, 2); |
682 | 122k | num_rel_trail = get_bits(gb, 2); |
683 | 122k | ch_data->bs_num_env = num_rel_trail + 1; |
684 | 122k | ch_data->t_env[0] = 0; |
685 | 122k | ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; |
686 | | |
687 | 295k | for (i = 0; i < num_rel_trail; i++) |
688 | 172k | ch_data->t_env[ch_data->bs_num_env - 1 - i] = |
689 | 172k | ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2; |
690 | | |
691 | 122k | bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); |
692 | | |
693 | 417k | for (i = 0; i < ch_data->bs_num_env; i++) |
694 | 295k | ch_data->bs_freq_res[ch_data->bs_num_env - i] = get_bits1(gb); |
695 | 122k | break; |
696 | 79.3k | case VARFIX: |
697 | 79.3k | ch_data->t_env[0] = get_bits(gb, 2); |
698 | 79.3k | num_rel_lead = get_bits(gb, 2); |
699 | 79.3k | ch_data->bs_num_env = num_rel_lead + 1; |
700 | 79.3k | ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; |
701 | | |
702 | 179k | for (i = 0; i < num_rel_lead; i++) |
703 | 100k | ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2; |
704 | | |
705 | 79.3k | bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); |
706 | | |
707 | 79.3k | get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env); |
708 | 79.3k | break; |
709 | 99.3k | case VARVAR: |
710 | 99.3k | ch_data->t_env[0] = get_bits(gb, 2); |
711 | 99.3k | abs_bord_trail += get_bits(gb, 2); |
712 | 99.3k | num_rel_lead = get_bits(gb, 2); |
713 | 99.3k | num_rel_trail = get_bits(gb, 2); |
714 | 99.3k | bs_num_env = num_rel_lead + num_rel_trail + 1; |
715 | | |
716 | 99.3k | if (bs_num_env > 5) { |
717 | 20.9k | av_log(ac->avctx, AV_LOG_ERROR, |
718 | 20.9k | "Invalid bitstream, too many SBR envelopes in VARVAR type SBR frame: %d\n", |
719 | 20.9k | bs_num_env); |
720 | 20.9k | return -1; |
721 | 20.9k | } |
722 | 78.4k | ch_data->bs_num_env = bs_num_env; |
723 | | |
724 | 78.4k | ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; |
725 | | |
726 | 199k | for (i = 0; i < num_rel_lead; i++) |
727 | 121k | ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2; |
728 | 146k | for (i = 0; i < num_rel_trail; i++) |
729 | 68.0k | ch_data->t_env[ch_data->bs_num_env - 1 - i] = |
730 | 68.0k | ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2; |
731 | | |
732 | 78.4k | bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); |
733 | | |
734 | 78.4k | get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env); |
735 | 78.4k | break; |
736 | 1.39M | } |
737 | 1.37M | ch_data->bs_frame_class = bs_frame_class; |
738 | | |
739 | 1.37M | av_assert0(bs_pointer >= 0); |
740 | 1.37M | if (bs_pointer > ch_data->bs_num_env + 1) { |
741 | 12.6k | av_log(ac->avctx, AV_LOG_ERROR, |
742 | 12.6k | "Invalid bitstream, bs_pointer points to a middle noise border outside the time borders table: %d\n", |
743 | 12.6k | bs_pointer); |
744 | 12.6k | return -1; |
745 | 12.6k | } |
746 | | |
747 | 3.26M | for (i = 1; i <= ch_data->bs_num_env; i++) { |
748 | 1.91M | if (ch_data->t_env[i-1] >= ch_data->t_env[i]) { |
749 | 11.3k | av_log(ac->avctx, AV_LOG_ERROR, "Not strictly monotone time borders\n"); |
750 | 11.3k | return -1; |
751 | 11.3k | } |
752 | 1.91M | } |
753 | | |
754 | 1.35M | ch_data->bs_num_noise = (ch_data->bs_num_env > 1) + 1; |
755 | | |
756 | 1.35M | ch_data->t_q[0] = ch_data->t_env[0]; |
757 | 1.35M | ch_data->t_q[ch_data->bs_num_noise] = ch_data->t_env[ch_data->bs_num_env]; |
758 | 1.35M | if (ch_data->bs_num_noise > 1) { |
759 | 286k | int idx; |
760 | 286k | if (ch_data->bs_frame_class == FIXFIX) { |
761 | 94.6k | idx = ch_data->bs_num_env >> 1; |
762 | 191k | } else if (ch_data->bs_frame_class & 1) { // FIXVAR or VARVAR |
763 | 136k | idx = ch_data->bs_num_env - FFMAX(bs_pointer - 1, 1); |
764 | 136k | } else { // VARFIX |
765 | 54.9k | if (!bs_pointer) |
766 | 6.93k | idx = 1; |
767 | 47.9k | else if (bs_pointer == 1) |
768 | 10.5k | idx = ch_data->bs_num_env - 1; |
769 | 37.4k | else // bs_pointer > 1 |
770 | 37.4k | idx = bs_pointer - 1; |
771 | 54.9k | } |
772 | 286k | ch_data->t_q[1] = ch_data->t_env[idx]; |
773 | 286k | } |
774 | | |
775 | 1.35M | ch_data->e_a[0] = -(ch_data->e_a[1] != bs_num_env_old); // l_APrev |
776 | 1.35M | ch_data->e_a[1] = -1; |
777 | 1.35M | if ((ch_data->bs_frame_class & 1) && bs_pointer) { // FIXVAR or VARVAR and bs_pointer != 0 |
778 | 79.8k | ch_data->e_a[1] = ch_data->bs_num_env + 1 - bs_pointer; |
779 | 1.27M | } else if ((ch_data->bs_frame_class == 2) && (bs_pointer > 1)) // VARFIX and bs_pointer > 1 |
780 | 37.4k | ch_data->e_a[1] = bs_pointer - 1; |
781 | | |
782 | 1.35M | return 0; |
783 | 1.36M | } Line | Count | Source | 640 | 1.23M | { | 641 | 1.23M | int i; | 642 | 1.23M | int bs_pointer = 0; | 643 | | // frameLengthFlag ? 15 : 16; 960 sample length frames unsupported; this value is numTimeSlots | 644 | 1.23M | int abs_bord_trail = 16; | 645 | 1.23M | int num_rel_lead, num_rel_trail; | 646 | 1.23M | unsigned bs_num_env_old = ch_data->bs_num_env; | 647 | 1.23M | int bs_frame_class, bs_num_env; | 648 | | | 649 | 1.23M | ch_data->bs_freq_res[0] = ch_data->bs_freq_res[ch_data->bs_num_env]; | 650 | 1.23M | ch_data->bs_amp_res = sbr->bs_amp_res_header; | 651 | 1.23M | ch_data->t_env_num_env_old = ch_data->t_env[bs_num_env_old]; | 652 | | | 653 | 1.23M | switch (bs_frame_class = get_bits(gb, 2)) { | 654 | 1.01M | case FIXFIX: | 655 | 1.01M | bs_num_env = 1 << get_bits(gb, 2); | 656 | 1.01M | if (bs_num_env > (sbr->usac ? 8 : 5)) { | 657 | 2.06k | av_log(ac->avctx, AV_LOG_ERROR, | 658 | 2.06k | "Invalid bitstream, too many SBR envelopes in FIXFIX type SBR frame: %d\n", | 659 | 2.06k | bs_num_env); | 660 | 2.06k | return -1; | 661 | 2.06k | } | 662 | 1.01M | ch_data->bs_num_env = bs_num_env; | 663 | 1.01M | num_rel_lead = ch_data->bs_num_env - 1; | 664 | 1.01M | if (ch_data->bs_num_env == 1) | 665 | 931k | ch_data->bs_amp_res = 0; | 666 | | | 667 | | | 668 | 1.01M | ch_data->t_env[0] = 0; | 669 | 1.01M | ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; | 670 | | | 671 | 1.01M | abs_bord_trail = (abs_bord_trail + (ch_data->bs_num_env >> 1)) / | 672 | 1.01M | ch_data->bs_num_env; | 673 | 1.14M | for (i = 0; i < num_rel_lead; i++) | 674 | 129k | ch_data->t_env[i + 1] = ch_data->t_env[i] + abs_bord_trail; | 675 | | | 676 | 1.01M | ch_data->bs_freq_res[1] = get_bits1(gb); | 677 | 1.14M | for (i = 1; i < ch_data->bs_num_env; i++) | 678 | 129k | ch_data->bs_freq_res[i + 1] = ch_data->bs_freq_res[1]; | 679 | 1.01M | break; | 680 | 105k | case FIXVAR: | 681 | 105k | abs_bord_trail += get_bits(gb, 2); | 682 | 105k | num_rel_trail = get_bits(gb, 2); | 683 | 105k | ch_data->bs_num_env = num_rel_trail + 1; | 684 | 105k | ch_data->t_env[0] = 0; | 685 | 105k | ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; | 686 | | | 687 | 265k | for (i = 0; i < num_rel_trail; i++) | 688 | 159k | ch_data->t_env[ch_data->bs_num_env - 1 - i] = | 689 | 159k | ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2; | 690 | | | 691 | 105k | bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); | 692 | | | 693 | 371k | for (i = 0; i < ch_data->bs_num_env; i++) | 694 | 265k | ch_data->bs_freq_res[ch_data->bs_num_env - i] = get_bits1(gb); | 695 | 105k | break; | 696 | 62.5k | case VARFIX: | 697 | 62.5k | ch_data->t_env[0] = get_bits(gb, 2); | 698 | 62.5k | num_rel_lead = get_bits(gb, 2); | 699 | 62.5k | ch_data->bs_num_env = num_rel_lead + 1; | 700 | 62.5k | ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; | 701 | | | 702 | 137k | for (i = 0; i < num_rel_lead; i++) | 703 | 74.9k | ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2; | 704 | | | 705 | 62.5k | bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); | 706 | | | 707 | 62.5k | get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env); | 708 | 62.5k | break; | 709 | 50.2k | case VARVAR: | 710 | 50.2k | ch_data->t_env[0] = get_bits(gb, 2); | 711 | 50.2k | abs_bord_trail += get_bits(gb, 2); | 712 | 50.2k | num_rel_lead = get_bits(gb, 2); | 713 | 50.2k | num_rel_trail = get_bits(gb, 2); | 714 | 50.2k | bs_num_env = num_rel_lead + num_rel_trail + 1; | 715 | | | 716 | 50.2k | if (bs_num_env > 5) { | 717 | 19.0k | av_log(ac->avctx, AV_LOG_ERROR, | 718 | 19.0k | "Invalid bitstream, too many SBR envelopes in VARVAR type SBR frame: %d\n", | 719 | 19.0k | bs_num_env); | 720 | 19.0k | return -1; | 721 | 19.0k | } | 722 | 31.2k | ch_data->bs_num_env = bs_num_env; | 723 | | | 724 | 31.2k | ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; | 725 | | | 726 | 59.4k | for (i = 0; i < num_rel_lead; i++) | 727 | 28.1k | ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2; | 728 | 63.8k | for (i = 0; i < num_rel_trail; i++) | 729 | 32.6k | ch_data->t_env[ch_data->bs_num_env - 1 - i] = | 730 | 32.6k | ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2; | 731 | | | 732 | 31.2k | bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); | 733 | | | 734 | 31.2k | get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env); | 735 | 31.2k | break; | 736 | 1.23M | } | 737 | 1.21M | ch_data->bs_frame_class = bs_frame_class; | 738 | | | 739 | 1.21M | av_assert0(bs_pointer >= 0); | 740 | 1.21M | if (bs_pointer > ch_data->bs_num_env + 1) { | 741 | 10.2k | av_log(ac->avctx, AV_LOG_ERROR, | 742 | 10.2k | "Invalid bitstream, bs_pointer points to a middle noise border outside the time borders table: %d\n", | 743 | 10.2k | bs_pointer); | 744 | 10.2k | return -1; | 745 | 10.2k | } | 746 | | | 747 | 2.77M | for (i = 1; i <= ch_data->bs_num_env; i++) { | 748 | 1.58M | if (ch_data->t_env[i-1] >= ch_data->t_env[i]) { | 749 | 9.47k | av_log(ac->avctx, AV_LOG_ERROR, "Not strictly monotone time borders\n"); | 750 | 9.47k | return -1; | 751 | 9.47k | } | 752 | 1.58M | } | 753 | | | 754 | 1.19M | ch_data->bs_num_noise = (ch_data->bs_num_env > 1) + 1; | 755 | | | 756 | 1.19M | ch_data->t_q[0] = ch_data->t_env[0]; | 757 | 1.19M | ch_data->t_q[ch_data->bs_num_noise] = ch_data->t_env[ch_data->bs_num_env]; | 758 | 1.19M | if (ch_data->bs_num_noise > 1) { | 759 | 218k | int idx; | 760 | 218k | if (ch_data->bs_frame_class == FIXFIX) { | 761 | 83.7k | idx = ch_data->bs_num_env >> 1; | 762 | 135k | } else if (ch_data->bs_frame_class & 1) { // FIXVAR or VARVAR | 763 | 89.9k | idx = ch_data->bs_num_env - FFMAX(bs_pointer - 1, 1); | 764 | 89.9k | } else { // VARFIX | 765 | 45.1k | if (!bs_pointer) | 766 | 5.50k | idx = 1; | 767 | 39.6k | else if (bs_pointer == 1) | 768 | 5.27k | idx = ch_data->bs_num_env - 1; | 769 | 34.3k | else // bs_pointer > 1 | 770 | 34.3k | idx = bs_pointer - 1; | 771 | 45.1k | } | 772 | 218k | ch_data->t_q[1] = ch_data->t_env[idx]; | 773 | 218k | } | 774 | | | 775 | 1.19M | ch_data->e_a[0] = -(ch_data->e_a[1] != bs_num_env_old); // l_APrev | 776 | 1.19M | ch_data->e_a[1] = -1; | 777 | 1.19M | if ((ch_data->bs_frame_class & 1) && bs_pointer) { // FIXVAR or VARVAR and bs_pointer != 0 | 778 | 45.8k | ch_data->e_a[1] = ch_data->bs_num_env + 1 - bs_pointer; | 779 | 1.14M | } else if ((ch_data->bs_frame_class == 2) && (bs_pointer > 1)) // VARFIX and bs_pointer > 1 | 780 | 34.3k | ch_data->e_a[1] = bs_pointer - 1; | 781 | | | 782 | 1.19M | return 0; | 783 | 1.20M | } |
aacsbr_fixed.c:read_sbr_grid Line | Count | Source | 640 | 162k | { | 641 | 162k | int i; | 642 | 162k | int bs_pointer = 0; | 643 | | // frameLengthFlag ? 15 : 16; 960 sample length frames unsupported; this value is numTimeSlots | 644 | 162k | int abs_bord_trail = 16; | 645 | 162k | int num_rel_lead, num_rel_trail; | 646 | 162k | unsigned bs_num_env_old = ch_data->bs_num_env; | 647 | 162k | int bs_frame_class, bs_num_env; | 648 | | | 649 | 162k | ch_data->bs_freq_res[0] = ch_data->bs_freq_res[ch_data->bs_num_env]; | 650 | 162k | ch_data->bs_amp_res = sbr->bs_amp_res_header; | 651 | 162k | ch_data->t_env_num_env_old = ch_data->t_env[bs_num_env_old]; | 652 | | | 653 | 162k | switch (bs_frame_class = get_bits(gb, 2)) { | 654 | 80.2k | case FIXFIX: | 655 | 80.2k | bs_num_env = 1 << get_bits(gb, 2); | 656 | 80.2k | if (bs_num_env > (sbr->usac ? 8 : 5)) { | 657 | 1.22k | av_log(ac->avctx, AV_LOG_ERROR, | 658 | 1.22k | "Invalid bitstream, too many SBR envelopes in FIXFIX type SBR frame: %d\n", | 659 | 1.22k | bs_num_env); | 660 | 1.22k | return -1; | 661 | 1.22k | } | 662 | 79.0k | ch_data->bs_num_env = bs_num_env; | 663 | 79.0k | num_rel_lead = ch_data->bs_num_env - 1; | 664 | 79.0k | if (ch_data->bs_num_env == 1) | 665 | 68.0k | ch_data->bs_amp_res = 0; | 666 | | | 667 | | | 668 | 79.0k | ch_data->t_env[0] = 0; | 669 | 79.0k | ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; | 670 | | | 671 | 79.0k | abs_bord_trail = (abs_bord_trail + (ch_data->bs_num_env >> 1)) / | 672 | 79.0k | ch_data->bs_num_env; | 673 | 96.5k | for (i = 0; i < num_rel_lead; i++) | 674 | 17.5k | ch_data->t_env[i + 1] = ch_data->t_env[i] + abs_bord_trail; | 675 | | | 676 | 79.0k | ch_data->bs_freq_res[1] = get_bits1(gb); | 677 | 96.5k | for (i = 1; i < ch_data->bs_num_env; i++) | 678 | 17.5k | ch_data->bs_freq_res[i + 1] = ch_data->bs_freq_res[1]; | 679 | 79.0k | break; | 680 | 16.7k | case FIXVAR: | 681 | 16.7k | abs_bord_trail += get_bits(gb, 2); | 682 | 16.7k | num_rel_trail = get_bits(gb, 2); | 683 | 16.7k | ch_data->bs_num_env = num_rel_trail + 1; | 684 | 16.7k | ch_data->t_env[0] = 0; | 685 | 16.7k | ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; | 686 | | | 687 | 29.5k | for (i = 0; i < num_rel_trail; i++) | 688 | 12.7k | ch_data->t_env[ch_data->bs_num_env - 1 - i] = | 689 | 12.7k | ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2; | 690 | | | 691 | 16.7k | bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); | 692 | | | 693 | 46.2k | for (i = 0; i < ch_data->bs_num_env; i++) | 694 | 29.5k | ch_data->bs_freq_res[ch_data->bs_num_env - i] = get_bits1(gb); | 695 | 16.7k | break; | 696 | 16.7k | case VARFIX: | 697 | 16.7k | ch_data->t_env[0] = get_bits(gb, 2); | 698 | 16.7k | num_rel_lead = get_bits(gb, 2); | 699 | 16.7k | ch_data->bs_num_env = num_rel_lead + 1; | 700 | 16.7k | ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; | 701 | | | 702 | 42.3k | for (i = 0; i < num_rel_lead; i++) | 703 | 25.5k | ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2; | 704 | | | 705 | 16.7k | bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); | 706 | | | 707 | 16.7k | get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env); | 708 | 16.7k | break; | 709 | 49.0k | case VARVAR: | 710 | 49.0k | ch_data->t_env[0] = get_bits(gb, 2); | 711 | 49.0k | abs_bord_trail += get_bits(gb, 2); | 712 | 49.0k | num_rel_lead = get_bits(gb, 2); | 713 | 49.0k | num_rel_trail = get_bits(gb, 2); | 714 | 49.0k | bs_num_env = num_rel_lead + num_rel_trail + 1; | 715 | | | 716 | 49.0k | if (bs_num_env > 5) { | 717 | 1.87k | av_log(ac->avctx, AV_LOG_ERROR, | 718 | 1.87k | "Invalid bitstream, too many SBR envelopes in VARVAR type SBR frame: %d\n", | 719 | 1.87k | bs_num_env); | 720 | 1.87k | return -1; | 721 | 1.87k | } | 722 | 47.1k | ch_data->bs_num_env = bs_num_env; | 723 | | | 724 | 47.1k | ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; | 725 | | | 726 | 140k | for (i = 0; i < num_rel_lead; i++) | 727 | 93.3k | ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2; | 728 | 82.6k | for (i = 0; i < num_rel_trail; i++) | 729 | 35.4k | ch_data->t_env[ch_data->bs_num_env - 1 - i] = | 730 | 35.4k | ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2; | 731 | | | 732 | 47.1k | bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); | 733 | | | 734 | 47.1k | get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env); | 735 | 47.1k | break; | 736 | 162k | } | 737 | 159k | ch_data->bs_frame_class = bs_frame_class; | 738 | | | 739 | 159k | av_assert0(bs_pointer >= 0); | 740 | 159k | if (bs_pointer > ch_data->bs_num_env + 1) { | 741 | 2.47k | av_log(ac->avctx, AV_LOG_ERROR, | 742 | 2.47k | "Invalid bitstream, bs_pointer points to a middle noise border outside the time borders table: %d\n", | 743 | 2.47k | bs_pointer); | 744 | 2.47k | return -1; | 745 | 2.47k | } | 746 | | | 747 | 487k | for (i = 1; i <= ch_data->bs_num_env; i++) { | 748 | 332k | if (ch_data->t_env[i-1] >= ch_data->t_env[i]) { | 749 | 1.84k | av_log(ac->avctx, AV_LOG_ERROR, "Not strictly monotone time borders\n"); | 750 | 1.84k | return -1; | 751 | 1.84k | } | 752 | 332k | } | 753 | | | 754 | 155k | ch_data->bs_num_noise = (ch_data->bs_num_env > 1) + 1; | 755 | | | 756 | 155k | ch_data->t_q[0] = ch_data->t_env[0]; | 757 | 155k | ch_data->t_q[ch_data->bs_num_noise] = ch_data->t_env[ch_data->bs_num_env]; | 758 | 155k | if (ch_data->bs_num_noise > 1) { | 759 | 67.5k | int idx; | 760 | 67.5k | if (ch_data->bs_frame_class == FIXFIX) { | 761 | 10.9k | idx = ch_data->bs_num_env >> 1; | 762 | 56.5k | } else if (ch_data->bs_frame_class & 1) { // FIXVAR or VARVAR | 763 | 46.7k | idx = ch_data->bs_num_env - FFMAX(bs_pointer - 1, 1); | 764 | 46.7k | } else { // VARFIX | 765 | 9.82k | if (!bs_pointer) | 766 | 1.43k | idx = 1; | 767 | 8.38k | else if (bs_pointer == 1) | 768 | 5.23k | idx = ch_data->bs_num_env - 1; | 769 | 3.15k | else // bs_pointer > 1 | 770 | 3.15k | idx = bs_pointer - 1; | 771 | 9.82k | } | 772 | 67.5k | ch_data->t_q[1] = ch_data->t_env[idx]; | 773 | 67.5k | } | 774 | | | 775 | 155k | ch_data->e_a[0] = -(ch_data->e_a[1] != bs_num_env_old); // l_APrev | 776 | 155k | ch_data->e_a[1] = -1; | 777 | 155k | if ((ch_data->bs_frame_class & 1) && bs_pointer) { // FIXVAR or VARVAR and bs_pointer != 0 | 778 | 34.0k | ch_data->e_a[1] = ch_data->bs_num_env + 1 - bs_pointer; | 779 | 121k | } else if ((ch_data->bs_frame_class == 2) && (bs_pointer > 1)) // VARFIX and bs_pointer > 1 | 780 | 3.15k | ch_data->e_a[1] = bs_pointer - 1; | 781 | | | 782 | 155k | return 0; | 783 | 157k | } |
|
784 | | |
785 | 101k | static void copy_sbr_grid(SBRData *dst, const SBRData *src) { |
786 | | //These variables are saved from the previous frame rather than copied |
787 | 101k | dst->bs_freq_res[0] = dst->bs_freq_res[dst->bs_num_env]; |
788 | 101k | dst->t_env_num_env_old = dst->t_env[dst->bs_num_env]; |
789 | 101k | dst->e_a[0] = -(dst->e_a[1] != dst->bs_num_env); |
790 | | |
791 | | //These variables are read from the bitstream and therefore copied |
792 | 101k | memcpy(dst->bs_freq_res+1, src->bs_freq_res+1, sizeof(dst->bs_freq_res)-sizeof(*dst->bs_freq_res)); |
793 | 101k | memcpy(dst->t_env, src->t_env, sizeof(dst->t_env)); |
794 | 101k | memcpy(dst->t_q, src->t_q, sizeof(dst->t_q)); |
795 | 101k | dst->bs_num_env = src->bs_num_env; |
796 | 101k | dst->bs_amp_res = src->bs_amp_res; |
797 | 101k | dst->bs_num_noise = src->bs_num_noise; |
798 | 101k | dst->bs_frame_class = src->bs_frame_class; |
799 | 101k | dst->e_a[1] = src->e_a[1]; |
800 | 101k | } Line | Count | Source | 785 | 68.7k | static void copy_sbr_grid(SBRData *dst, const SBRData *src) { | 786 | | //These variables are saved from the previous frame rather than copied | 787 | 68.7k | dst->bs_freq_res[0] = dst->bs_freq_res[dst->bs_num_env]; | 788 | 68.7k | dst->t_env_num_env_old = dst->t_env[dst->bs_num_env]; | 789 | 68.7k | dst->e_a[0] = -(dst->e_a[1] != dst->bs_num_env); | 790 | | | 791 | | //These variables are read from the bitstream and therefore copied | 792 | 68.7k | memcpy(dst->bs_freq_res+1, src->bs_freq_res+1, sizeof(dst->bs_freq_res)-sizeof(*dst->bs_freq_res)); | 793 | 68.7k | memcpy(dst->t_env, src->t_env, sizeof(dst->t_env)); | 794 | 68.7k | memcpy(dst->t_q, src->t_q, sizeof(dst->t_q)); | 795 | 68.7k | dst->bs_num_env = src->bs_num_env; | 796 | 68.7k | dst->bs_amp_res = src->bs_amp_res; | 797 | 68.7k | dst->bs_num_noise = src->bs_num_noise; | 798 | 68.7k | dst->bs_frame_class = src->bs_frame_class; | 799 | 68.7k | dst->e_a[1] = src->e_a[1]; | 800 | 68.7k | } |
aacsbr_fixed.c:copy_sbr_grid Line | Count | Source | 785 | 33.1k | static void copy_sbr_grid(SBRData *dst, const SBRData *src) { | 786 | | //These variables are saved from the previous frame rather than copied | 787 | 33.1k | dst->bs_freq_res[0] = dst->bs_freq_res[dst->bs_num_env]; | 788 | 33.1k | dst->t_env_num_env_old = dst->t_env[dst->bs_num_env]; | 789 | 33.1k | dst->e_a[0] = -(dst->e_a[1] != dst->bs_num_env); | 790 | | | 791 | | //These variables are read from the bitstream and therefore copied | 792 | 33.1k | memcpy(dst->bs_freq_res+1, src->bs_freq_res+1, sizeof(dst->bs_freq_res)-sizeof(*dst->bs_freq_res)); | 793 | 33.1k | memcpy(dst->t_env, src->t_env, sizeof(dst->t_env)); | 794 | 33.1k | memcpy(dst->t_q, src->t_q, sizeof(dst->t_q)); | 795 | 33.1k | dst->bs_num_env = src->bs_num_env; | 796 | 33.1k | dst->bs_amp_res = src->bs_amp_res; | 797 | 33.1k | dst->bs_num_noise = src->bs_num_noise; | 798 | 33.1k | dst->bs_frame_class = src->bs_frame_class; | 799 | 33.1k | dst->e_a[1] = src->e_a[1]; | 800 | 33.1k | } |
|
801 | | |
802 | | /// Read how the envelope and noise floor data is delta coded |
803 | | static void read_sbr_dtdf(SpectralBandReplication *sbr, GetBitContext *gb, |
804 | | SBRData *ch_data, int indep_flag) |
805 | 1.43M | { |
806 | 1.43M | if (sbr->usac) { |
807 | 644k | if (indep_flag) { |
808 | 27.3k | ch_data->bs_df_env[0] = 0; |
809 | 27.3k | get_bits1_vector(gb, &ch_data->bs_df_env[1], ch_data->bs_num_env - 1); |
810 | 616k | } else { |
811 | 616k | get_bits1_vector(gb, ch_data->bs_df_env, ch_data->bs_num_env); |
812 | 616k | } |
813 | | |
814 | 644k | if (indep_flag) { |
815 | 27.3k | ch_data->bs_df_noise[0] = 0; |
816 | 27.3k | get_bits1_vector(gb, &ch_data->bs_df_noise[1], ch_data->bs_num_noise - 1); |
817 | 616k | } else { |
818 | 616k | get_bits1_vector(gb, ch_data->bs_df_noise, ch_data->bs_num_noise); |
819 | 616k | } |
820 | 795k | } else { |
821 | 795k | get_bits1_vector(gb, ch_data->bs_df_env, ch_data->bs_num_env); |
822 | 795k | get_bits1_vector(gb, ch_data->bs_df_noise, ch_data->bs_num_noise); |
823 | 795k | } |
824 | 1.43M | } Line | Count | Source | 805 | 1.25M | { | 806 | 1.25M | if (sbr->usac) { | 807 | 644k | if (indep_flag) { | 808 | 27.3k | ch_data->bs_df_env[0] = 0; | 809 | 27.3k | get_bits1_vector(gb, &ch_data->bs_df_env[1], ch_data->bs_num_env - 1); | 810 | 616k | } else { | 811 | 616k | get_bits1_vector(gb, ch_data->bs_df_env, ch_data->bs_num_env); | 812 | 616k | } | 813 | | | 814 | 644k | if (indep_flag) { | 815 | 27.3k | ch_data->bs_df_noise[0] = 0; | 816 | 27.3k | get_bits1_vector(gb, &ch_data->bs_df_noise[1], ch_data->bs_num_noise - 1); | 817 | 616k | } else { | 818 | 616k | get_bits1_vector(gb, ch_data->bs_df_noise, ch_data->bs_num_noise); | 819 | 616k | } | 820 | 644k | } else { | 821 | 608k | get_bits1_vector(gb, ch_data->bs_df_env, ch_data->bs_num_env); | 822 | 608k | get_bits1_vector(gb, ch_data->bs_df_noise, ch_data->bs_num_noise); | 823 | 608k | } | 824 | 1.25M | } |
aacsbr_fixed.c:read_sbr_dtdf Line | Count | Source | 805 | 187k | { | 806 | 187k | if (sbr->usac) { | 807 | 0 | if (indep_flag) { | 808 | 0 | ch_data->bs_df_env[0] = 0; | 809 | 0 | get_bits1_vector(gb, &ch_data->bs_df_env[1], ch_data->bs_num_env - 1); | 810 | 0 | } else { | 811 | 0 | get_bits1_vector(gb, ch_data->bs_df_env, ch_data->bs_num_env); | 812 | 0 | } | 813 | |
| 814 | 0 | if (indep_flag) { | 815 | 0 | ch_data->bs_df_noise[0] = 0; | 816 | 0 | get_bits1_vector(gb, &ch_data->bs_df_noise[1], ch_data->bs_num_noise - 1); | 817 | 0 | } else { | 818 | 0 | get_bits1_vector(gb, ch_data->bs_df_noise, ch_data->bs_num_noise); | 819 | 0 | } | 820 | 187k | } else { | 821 | 187k | get_bits1_vector(gb, ch_data->bs_df_env, ch_data->bs_num_env); | 822 | 187k | get_bits1_vector(gb, ch_data->bs_df_noise, ch_data->bs_num_noise); | 823 | 187k | } | 824 | 187k | } |
|
825 | | |
826 | | /// Read inverse filtering data |
827 | | static void read_sbr_invf(SpectralBandReplication *sbr, GetBitContext *gb, |
828 | | SBRData *ch_data) |
829 | 1.33M | { |
830 | 1.33M | int i; |
831 | | |
832 | 1.33M | memcpy(ch_data->bs_invf_mode[1], ch_data->bs_invf_mode[0], 5 * sizeof(uint8_t)); |
833 | 3.31M | for (i = 0; i < sbr->n_q; i++) |
834 | 1.97M | ch_data->bs_invf_mode[0][i] = get_bits(gb, 2); |
835 | 1.33M | } Line | Count | Source | 829 | 1.18M | { | 830 | 1.18M | int i; | 831 | | | 832 | 1.18M | memcpy(ch_data->bs_invf_mode[1], ch_data->bs_invf_mode[0], 5 * sizeof(uint8_t)); | 833 | 2.87M | for (i = 0; i < sbr->n_q; i++) | 834 | 1.69M | ch_data->bs_invf_mode[0][i] = get_bits(gb, 2); | 835 | 1.18M | } |
aacsbr_fixed.c:read_sbr_invf Line | Count | Source | 829 | 154k | { | 830 | 154k | int i; | 831 | | | 832 | 154k | memcpy(ch_data->bs_invf_mode[1], ch_data->bs_invf_mode[0], 5 * sizeof(uint8_t)); | 833 | 441k | for (i = 0; i < sbr->n_q; i++) | 834 | 287k | ch_data->bs_invf_mode[0][i] = get_bits(gb, 2); | 835 | 154k | } |
|
836 | | |
837 | | static int read_sbr_envelope(AACDecContext *ac, SpectralBandReplication *sbr, GetBitContext *gb, |
838 | | SBRData *ch_data, int ch) |
839 | 1.41M | { |
840 | 1.41M | int bits; |
841 | 1.41M | int i, j, k; |
842 | 1.41M | const VLCElem *t_huff, *f_huff; |
843 | 1.41M | const int delta = (ch == 1 && sbr->bs_coupling == 1) + 1; |
844 | 1.41M | const int odd = sbr->n[1] & 1; |
845 | | |
846 | 1.41M | if (sbr->bs_coupling && ch) { |
847 | 90.4k | if (ch_data->bs_amp_res) { |
848 | 72.8k | bits = 5; |
849 | 72.8k | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_BAL_3_0DB]; |
850 | 72.8k | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_3_0DB]; |
851 | 72.8k | } else { |
852 | 17.6k | bits = 6; |
853 | 17.6k | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_BAL_1_5DB]; |
854 | 17.6k | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_1_5DB]; |
855 | 17.6k | } |
856 | 1.32M | } else { |
857 | 1.32M | if (ch_data->bs_amp_res) { |
858 | 250k | bits = 6; |
859 | 250k | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_3_0DB]; |
860 | 250k | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_3_0DB]; |
861 | 1.07M | } else { |
862 | 1.07M | bits = 7; |
863 | 1.07M | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_1_5DB]; |
864 | 1.07M | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_1_5DB]; |
865 | 1.07M | } |
866 | 1.32M | } |
867 | | |
868 | 3.33M | for (i = 0; i < ch_data->bs_num_env; i++) { |
869 | 2.00M | if (ch_data->bs_df_env[i]) { |
870 | | // bs_freq_res[0] == bs_freq_res[bs_num_env] from prev frame |
871 | 413k | if (ch_data->bs_freq_res[i + 1] == ch_data->bs_freq_res[i]) { |
872 | 1.71M | for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { |
873 | 1.49M | ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][j] + delta * get_vlc2(gb, t_huff, 9, 3); |
874 | 1.49M | if (ch_data->env_facs_q[i + 1][j] > 127U) { |
875 | 21.3k | av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]); |
876 | 21.3k | return AVERROR_INVALIDDATA; |
877 | 21.3k | } |
878 | 1.49M | } |
879 | 248k | } else if (ch_data->bs_freq_res[i + 1]) { |
880 | 1.09M | for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { |
881 | 1.02M | k = (j + odd) >> 1; // find k such that f_tablelow[k] <= f_tablehigh[j] < f_tablelow[k + 1] |
882 | 1.02M | ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][k] + delta * get_vlc2(gb, t_huff, 9, 3); |
883 | 1.02M | if (ch_data->env_facs_q[i + 1][j] > 127U) { |
884 | 7.86k | av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]); |
885 | 7.86k | return AVERROR_INVALIDDATA; |
886 | 7.86k | } |
887 | 1.02M | } |
888 | 83.2k | } else { |
889 | 761k | for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { |
890 | 706k | k = j ? 2*j - odd : 0; // find k such that f_tablehigh[k] == f_tablelow[j] |
891 | 706k | ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][k] + delta * get_vlc2(gb, t_huff, 9, 3); |
892 | 706k | if (ch_data->env_facs_q[i + 1][j] > 127U) { |
893 | 28.2k | av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]); |
894 | 28.2k | return AVERROR_INVALIDDATA; |
895 | 28.2k | } |
896 | 706k | } |
897 | 83.2k | } |
898 | 1.59M | } else { |
899 | 1.59M | ch_data->env_facs_q[i + 1][0] = delta * get_bits(gb, bits); // bs_env_start_value_balance |
900 | 9.87M | for (j = 1; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { |
901 | 8.31M | 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); |
902 | 8.31M | if (ch_data->env_facs_q[i + 1][j] > 127U) { |
903 | 28.6k | av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]); |
904 | 28.6k | return AVERROR_INVALIDDATA; |
905 | 28.6k | } |
906 | 8.31M | } |
907 | 1.59M | } |
908 | 1.92M | if (sbr->usac) { |
909 | 698k | if (sbr->inter_tes) { |
910 | 0 | ch_data->temp_shape[i] = get_bits(gb, 1); |
911 | 0 | if (ch_data->temp_shape[i]) |
912 | 0 | ch_data->temp_shape_mode[i] = get_bits(gb, 2); |
913 | 0 | } |
914 | 698k | } |
915 | 1.92M | } |
916 | | |
917 | | //assign 0th elements of env_facs_q from last elements |
918 | 1.32M | memcpy(ch_data->env_facs_q[0], ch_data->env_facs_q[ch_data->bs_num_env], |
919 | 1.32M | sizeof(ch_data->env_facs_q[0])); |
920 | | |
921 | 1.32M | return 0; |
922 | 1.41M | } aacsbr.c:read_sbr_envelope Line | Count | Source | 839 | 1.22M | { | 840 | 1.22M | int bits; | 841 | 1.22M | int i, j, k; | 842 | 1.22M | const VLCElem *t_huff, *f_huff; | 843 | 1.22M | const int delta = (ch == 1 && sbr->bs_coupling == 1) + 1; | 844 | 1.22M | const int odd = sbr->n[1] & 1; | 845 | | | 846 | 1.22M | if (sbr->bs_coupling && ch) { | 847 | 59.6k | if (ch_data->bs_amp_res) { | 848 | 48.0k | bits = 5; | 849 | 48.0k | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_BAL_3_0DB]; | 850 | 48.0k | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_3_0DB]; | 851 | 48.0k | } else { | 852 | 11.5k | bits = 6; | 853 | 11.5k | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_BAL_1_5DB]; | 854 | 11.5k | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_1_5DB]; | 855 | 11.5k | } | 856 | 1.16M | } else { | 857 | 1.16M | if (ch_data->bs_amp_res) { | 858 | 180k | bits = 6; | 859 | 180k | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_3_0DB]; | 860 | 180k | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_3_0DB]; | 861 | 988k | } else { | 862 | 988k | bits = 7; | 863 | 988k | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_1_5DB]; | 864 | 988k | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_1_5DB]; | 865 | 988k | } | 866 | 1.16M | } | 867 | | | 868 | 2.74M | for (i = 0; i < ch_data->bs_num_env; i++) { | 869 | 1.58M | if (ch_data->bs_df_env[i]) { | 870 | | // bs_freq_res[0] == bs_freq_res[bs_num_env] from prev frame | 871 | 181k | if (ch_data->bs_freq_res[i + 1] == ch_data->bs_freq_res[i]) { | 872 | 659k | for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { | 873 | 574k | ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][j] + delta * get_vlc2(gb, t_huff, 9, 3); | 874 | 574k | if (ch_data->env_facs_q[i + 1][j] > 127U) { | 875 | 18.1k | av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]); | 876 | 18.1k | return AVERROR_INVALIDDATA; | 877 | 18.1k | } | 878 | 574k | } | 879 | 103k | } else if (ch_data->bs_freq_res[i + 1]) { | 880 | 319k | for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { | 881 | 298k | k = (j + odd) >> 1; // find k such that f_tablelow[k] <= f_tablehigh[j] < f_tablelow[k + 1] | 882 | 298k | ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][k] + delta * get_vlc2(gb, t_huff, 9, 3); | 883 | 298k | if (ch_data->env_facs_q[i + 1][j] > 127U) { | 884 | 5.87k | av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]); | 885 | 5.87k | return AVERROR_INVALIDDATA; | 886 | 5.87k | } | 887 | 298k | } | 888 | 50.6k | } else { | 889 | 474k | for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { | 890 | 449k | k = j ? 2*j - odd : 0; // find k such that f_tablehigh[k] == f_tablelow[j] | 891 | 449k | ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][k] + delta * get_vlc2(gb, t_huff, 9, 3); | 892 | 449k | if (ch_data->env_facs_q[i + 1][j] > 127U) { | 893 | 26.5k | av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]); | 894 | 26.5k | return AVERROR_INVALIDDATA; | 895 | 26.5k | } | 896 | 449k | } | 897 | 50.6k | } | 898 | 1.40M | } else { | 899 | 1.40M | ch_data->env_facs_q[i + 1][0] = delta * get_bits(gb, bits); // bs_env_start_value_balance | 900 | 8.43M | for (j = 1; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { | 901 | 7.04M | 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); | 902 | 7.04M | if (ch_data->env_facs_q[i + 1][j] > 127U) { | 903 | 20.2k | av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]); | 904 | 20.2k | return AVERROR_INVALIDDATA; | 905 | 20.2k | } | 906 | 7.04M | } | 907 | 1.40M | } | 908 | 1.51M | if (sbr->usac) { | 909 | 698k | if (sbr->inter_tes) { | 910 | 0 | ch_data->temp_shape[i] = get_bits(gb, 1); | 911 | 0 | if (ch_data->temp_shape[i]) | 912 | 0 | ch_data->temp_shape_mode[i] = get_bits(gb, 2); | 913 | 0 | } | 914 | 698k | } | 915 | 1.51M | } | 916 | | | 917 | | //assign 0th elements of env_facs_q from last elements | 918 | 1.15M | memcpy(ch_data->env_facs_q[0], ch_data->env_facs_q[ch_data->bs_num_env], | 919 | 1.15M | sizeof(ch_data->env_facs_q[0])); | 920 | | | 921 | 1.15M | return 0; | 922 | 1.22M | } |
aacsbr_fixed.c:read_sbr_envelope Line | Count | Source | 839 | 183k | { | 840 | 183k | int bits; | 841 | 183k | int i, j, k; | 842 | 183k | const VLCElem *t_huff, *f_huff; | 843 | 183k | const int delta = (ch == 1 && sbr->bs_coupling == 1) + 1; | 844 | 183k | const int odd = sbr->n[1] & 1; | 845 | | | 846 | 183k | if (sbr->bs_coupling && ch) { | 847 | 30.8k | if (ch_data->bs_amp_res) { | 848 | 24.7k | bits = 5; | 849 | 24.7k | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_BAL_3_0DB]; | 850 | 24.7k | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_3_0DB]; | 851 | 24.7k | } else { | 852 | 6.06k | bits = 6; | 853 | 6.06k | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_BAL_1_5DB]; | 854 | 6.06k | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_1_5DB]; | 855 | 6.06k | } | 856 | 152k | } else { | 857 | 152k | if (ch_data->bs_amp_res) { | 858 | 70.3k | bits = 6; | 859 | 70.3k | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_3_0DB]; | 860 | 70.3k | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_3_0DB]; | 861 | 82.4k | } else { | 862 | 82.4k | bits = 7; | 863 | 82.4k | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_1_5DB]; | 864 | 82.4k | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_1_5DB]; | 865 | 82.4k | } | 866 | 152k | } | 867 | | | 868 | 587k | for (i = 0; i < ch_data->bs_num_env; i++) { | 869 | 419k | if (ch_data->bs_df_env[i]) { | 870 | | // bs_freq_res[0] == bs_freq_res[bs_num_env] from prev frame | 871 | 232k | if (ch_data->bs_freq_res[i + 1] == ch_data->bs_freq_res[i]) { | 872 | 1.06M | for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { | 873 | 918k | ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][j] + delta * get_vlc2(gb, t_huff, 9, 3); | 874 | 918k | if (ch_data->env_facs_q[i + 1][j] > 127U) { | 875 | 3.20k | av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]); | 876 | 3.20k | return AVERROR_INVALIDDATA; | 877 | 3.20k | } | 878 | 918k | } | 879 | 144k | } else if (ch_data->bs_freq_res[i + 1]) { | 880 | 777k | for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { | 881 | 724k | k = (j + odd) >> 1; // find k such that f_tablelow[k] <= f_tablehigh[j] < f_tablelow[k + 1] | 882 | 724k | ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][k] + delta * get_vlc2(gb, t_huff, 9, 3); | 883 | 724k | if (ch_data->env_facs_q[i + 1][j] > 127U) { | 884 | 1.99k | av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]); | 885 | 1.99k | return AVERROR_INVALIDDATA; | 886 | 1.99k | } | 887 | 724k | } | 888 | 55.3k | } else { | 889 | 287k | for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { | 890 | 256k | k = j ? 2*j - odd : 0; // find k such that f_tablehigh[k] == f_tablelow[j] | 891 | 256k | ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][k] + delta * get_vlc2(gb, t_huff, 9, 3); | 892 | 256k | if (ch_data->env_facs_q[i + 1][j] > 127U) { | 893 | 1.73k | av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]); | 894 | 1.73k | return AVERROR_INVALIDDATA; | 895 | 1.73k | } | 896 | 256k | } | 897 | 32.5k | } | 898 | 232k | } else { | 899 | 186k | ch_data->env_facs_q[i + 1][0] = delta * get_bits(gb, bits); // bs_env_start_value_balance | 900 | 1.44M | for (j = 1; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { | 901 | 1.26M | 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); | 902 | 1.26M | if (ch_data->env_facs_q[i + 1][j] > 127U) { | 903 | 8.37k | av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]); | 904 | 8.37k | return AVERROR_INVALIDDATA; | 905 | 8.37k | } | 906 | 1.26M | } | 907 | 186k | } | 908 | 403k | if (sbr->usac) { | 909 | 0 | if (sbr->inter_tes) { | 910 | 0 | ch_data->temp_shape[i] = get_bits(gb, 1); | 911 | 0 | if (ch_data->temp_shape[i]) | 912 | 0 | ch_data->temp_shape_mode[i] = get_bits(gb, 2); | 913 | 0 | } | 914 | 0 | } | 915 | 403k | } | 916 | | | 917 | | //assign 0th elements of env_facs_q from last elements | 918 | 168k | memcpy(ch_data->env_facs_q[0], ch_data->env_facs_q[ch_data->bs_num_env], | 919 | 168k | sizeof(ch_data->env_facs_q[0])); | 920 | | | 921 | 168k | return 0; | 922 | 183k | } |
|
923 | | |
924 | | static int read_sbr_noise(AACDecContext *ac, SpectralBandReplication *sbr, GetBitContext *gb, |
925 | | SBRData *ch_data, int ch) |
926 | 1.30M | { |
927 | 1.30M | int i, j; |
928 | 1.30M | const VLCElem *t_huff, *f_huff; |
929 | 1.30M | int delta = (ch == 1 && sbr->bs_coupling == 1) + 1; |
930 | | |
931 | 1.30M | if (sbr->bs_coupling && ch) { |
932 | 57.9k | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_NOISE_BAL_3_0DB]; |
933 | 57.9k | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_3_0DB]; |
934 | 1.24M | } else { |
935 | 1.24M | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_NOISE_3_0DB]; |
936 | 1.24M | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_3_0DB]; |
937 | 1.24M | } |
938 | | |
939 | 2.82M | for (i = 0; i < ch_data->bs_num_noise; i++) { |
940 | 1.56M | if (ch_data->bs_df_noise[i]) { |
941 | 717k | for (j = 0; j < sbr->n_q; j++) { |
942 | 479k | ch_data->noise_facs_q[i + 1][j] = ch_data->noise_facs_q[i][j] + delta * get_vlc2(gb, t_huff, 9, 2); |
943 | 479k | if (ch_data->noise_facs_q[i + 1][j] > 30U) { |
944 | 28.9k | av_log(ac->avctx, AV_LOG_ERROR, "noise_facs_q %d is invalid\n", ch_data->noise_facs_q[i + 1][j]); |
945 | 28.9k | return AVERROR_INVALIDDATA; |
946 | 28.9k | } |
947 | 479k | } |
948 | 1.29M | } else { |
949 | 1.29M | ch_data->noise_facs_q[i + 1][0] = delta * get_bits(gb, 5); // bs_noise_start_value_balance or bs_noise_start_value_level |
950 | 2.37M | for (j = 1; j < sbr->n_q; j++) { |
951 | 1.09M | 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); |
952 | 1.09M | if (ch_data->noise_facs_q[i + 1][j] > 30U) { |
953 | 16.5k | av_log(ac->avctx, AV_LOG_ERROR, "noise_facs_q %d is invalid\n", ch_data->noise_facs_q[i + 1][j]); |
954 | 16.5k | return AVERROR_INVALIDDATA; |
955 | 16.5k | } |
956 | 1.09M | } |
957 | 1.29M | } |
958 | 1.56M | } |
959 | | |
960 | | //assign 0th elements of noise_facs_q from last elements |
961 | 1.26M | memcpy(ch_data->noise_facs_q[0], ch_data->noise_facs_q[ch_data->bs_num_noise], |
962 | 1.26M | sizeof(ch_data->noise_facs_q[0])); |
963 | 1.26M | return 0; |
964 | 1.30M | } Line | Count | Source | 926 | 1.14M | { | 927 | 1.14M | int i, j; | 928 | 1.14M | const VLCElem *t_huff, *f_huff; | 929 | 1.14M | int delta = (ch == 1 && sbr->bs_coupling == 1) + 1; | 930 | | | 931 | 1.14M | if (sbr->bs_coupling && ch) { | 932 | 28.3k | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_NOISE_BAL_3_0DB]; | 933 | 28.3k | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_3_0DB]; | 934 | 1.11M | } else { | 935 | 1.11M | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_NOISE_3_0DB]; | 936 | 1.11M | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_3_0DB]; | 937 | 1.11M | } | 938 | | | 939 | 2.42M | for (i = 0; i < ch_data->bs_num_noise; i++) { | 940 | 1.31M | if (ch_data->bs_df_noise[i]) { | 941 | 520k | for (j = 0; j < sbr->n_q; j++) { | 942 | 363k | ch_data->noise_facs_q[i + 1][j] = ch_data->noise_facs_q[i][j] + delta * get_vlc2(gb, t_huff, 9, 2); | 943 | 363k | if (ch_data->noise_facs_q[i + 1][j] > 30U) { | 944 | 23.4k | av_log(ac->avctx, AV_LOG_ERROR, "noise_facs_q %d is invalid\n", ch_data->noise_facs_q[i + 1][j]); | 945 | 23.4k | return AVERROR_INVALIDDATA; | 946 | 23.4k | } | 947 | 363k | } | 948 | 1.13M | } else { | 949 | 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 | 950 | 2.05M | for (j = 1; j < sbr->n_q; j++) { | 951 | 930k | 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); | 952 | 930k | if (ch_data->noise_facs_q[i + 1][j] > 30U) { | 953 | 14.5k | av_log(ac->avctx, AV_LOG_ERROR, "noise_facs_q %d is invalid\n", ch_data->noise_facs_q[i + 1][j]); | 954 | 14.5k | return AVERROR_INVALIDDATA; | 955 | 14.5k | } | 956 | 930k | } | 957 | 1.13M | } | 958 | 1.31M | } | 959 | | | 960 | | //assign 0th elements of noise_facs_q from last elements | 961 | 1.10M | memcpy(ch_data->noise_facs_q[0], ch_data->noise_facs_q[ch_data->bs_num_noise], | 962 | 1.10M | sizeof(ch_data->noise_facs_q[0])); | 963 | 1.10M | return 0; | 964 | 1.14M | } |
aacsbr_fixed.c:read_sbr_noise Line | Count | Source | 926 | 163k | { | 927 | 163k | int i, j; | 928 | 163k | const VLCElem *t_huff, *f_huff; | 929 | 163k | int delta = (ch == 1 && sbr->bs_coupling == 1) + 1; | 930 | | | 931 | 163k | if (sbr->bs_coupling && ch) { | 932 | 29.5k | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_NOISE_BAL_3_0DB]; | 933 | 29.5k | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_3_0DB]; | 934 | 134k | } else { | 935 | 134k | t_huff = ff_aac_sbr_vlc[T_HUFFMAN_NOISE_3_0DB]; | 936 | 134k | f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_3_0DB]; | 937 | 134k | } | 938 | | | 939 | 401k | for (i = 0; i < ch_data->bs_num_noise; i++) { | 940 | 245k | if (ch_data->bs_df_noise[i]) { | 941 | 197k | for (j = 0; j < sbr->n_q; j++) { | 942 | 115k | ch_data->noise_facs_q[i + 1][j] = ch_data->noise_facs_q[i][j] + delta * get_vlc2(gb, t_huff, 9, 2); | 943 | 115k | if (ch_data->noise_facs_q[i + 1][j] > 30U) { | 944 | 5.46k | av_log(ac->avctx, AV_LOG_ERROR, "noise_facs_q %d is invalid\n", ch_data->noise_facs_q[i + 1][j]); | 945 | 5.46k | return AVERROR_INVALIDDATA; | 946 | 5.46k | } | 947 | 115k | } | 948 | 158k | } else { | 949 | 158k | ch_data->noise_facs_q[i + 1][0] = delta * get_bits(gb, 5); // bs_noise_start_value_balance or bs_noise_start_value_level | 950 | 319k | for (j = 1; j < sbr->n_q; j++) { | 951 | 163k | 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); | 952 | 163k | if (ch_data->noise_facs_q[i + 1][j] > 30U) { | 953 | 1.99k | av_log(ac->avctx, AV_LOG_ERROR, "noise_facs_q %d is invalid\n", ch_data->noise_facs_q[i + 1][j]); | 954 | 1.99k | return AVERROR_INVALIDDATA; | 955 | 1.99k | } | 956 | 163k | } | 957 | 158k | } | 958 | 245k | } | 959 | | | 960 | | //assign 0th elements of noise_facs_q from last elements | 961 | 156k | memcpy(ch_data->noise_facs_q[0], ch_data->noise_facs_q[ch_data->bs_num_noise], | 962 | 156k | sizeof(ch_data->noise_facs_q[0])); | 963 | 156k | return 0; | 964 | 163k | } |
|
965 | | |
966 | | static void read_sbr_extension(AACDecContext *ac, SpectralBandReplication *sbr, |
967 | | GetBitContext *gb, |
968 | | int bs_extension_id, int *num_bits_left) |
969 | 98.2k | { |
970 | 98.2k | switch (bs_extension_id) { |
971 | 61.4k | case EXTENSION_ID_PS: |
972 | 61.4k | if (!ac->oc[1].m4ac.ps) { |
973 | 2.99k | av_log(ac->avctx, AV_LOG_ERROR, "Parametric Stereo signaled to be not-present but was found in the bitstream.\n"); |
974 | 2.99k | skip_bits_long(gb, *num_bits_left); // bs_fill_bits |
975 | 2.99k | *num_bits_left = 0; |
976 | 58.4k | } else { |
977 | 58.4k | *num_bits_left -= ff_ps_read_data(ac->avctx, gb, &sbr->ps.common, *num_bits_left); |
978 | 58.4k | ac->avctx->profile = AV_PROFILE_AAC_HE_V2; |
979 | | // ensure the warning is not printed if PS extension is present |
980 | 58.4k | ac->warned_he_aac_mono = 1; |
981 | 58.4k | } |
982 | 61.4k | break; |
983 | 36.8k | default: |
984 | | // some files contain 0-padding |
985 | 36.8k | if (bs_extension_id || *num_bits_left > 16 || show_bits(gb, *num_bits_left)) |
986 | 35.7k | avpriv_request_sample(ac->avctx, "Reserved SBR extensions"); |
987 | 36.8k | skip_bits_long(gb, *num_bits_left); // bs_fill_bits |
988 | 36.8k | *num_bits_left = 0; |
989 | 36.8k | break; |
990 | 98.2k | } |
991 | 98.2k | } aacsbr.c:read_sbr_extension Line | Count | Source | 969 | 49.0k | { | 970 | 49.0k | switch (bs_extension_id) { | 971 | 29.0k | case EXTENSION_ID_PS: | 972 | 29.0k | if (!ac->oc[1].m4ac.ps) { | 973 | 2.45k | av_log(ac->avctx, AV_LOG_ERROR, "Parametric Stereo signaled to be not-present but was found in the bitstream.\n"); | 974 | 2.45k | skip_bits_long(gb, *num_bits_left); // bs_fill_bits | 975 | 2.45k | *num_bits_left = 0; | 976 | 26.5k | } else { | 977 | 26.5k | *num_bits_left -= ff_ps_read_data(ac->avctx, gb, &sbr->ps.common, *num_bits_left); | 978 | 26.5k | ac->avctx->profile = AV_PROFILE_AAC_HE_V2; | 979 | | // ensure the warning is not printed if PS extension is present | 980 | 26.5k | ac->warned_he_aac_mono = 1; | 981 | 26.5k | } | 982 | 29.0k | break; | 983 | 20.0k | default: | 984 | | // some files contain 0-padding | 985 | 20.0k | if (bs_extension_id || *num_bits_left > 16 || show_bits(gb, *num_bits_left)) | 986 | 19.1k | avpriv_request_sample(ac->avctx, "Reserved SBR extensions"); | 987 | 20.0k | skip_bits_long(gb, *num_bits_left); // bs_fill_bits | 988 | 20.0k | *num_bits_left = 0; | 989 | 20.0k | break; | 990 | 49.0k | } | 991 | 49.0k | } |
aacsbr_fixed.c:read_sbr_extension Line | Count | Source | 969 | 49.2k | { | 970 | 49.2k | switch (bs_extension_id) { | 971 | 32.4k | case EXTENSION_ID_PS: | 972 | 32.4k | if (!ac->oc[1].m4ac.ps) { | 973 | 537 | av_log(ac->avctx, AV_LOG_ERROR, "Parametric Stereo signaled to be not-present but was found in the bitstream.\n"); | 974 | 537 | skip_bits_long(gb, *num_bits_left); // bs_fill_bits | 975 | 537 | *num_bits_left = 0; | 976 | 31.8k | } else { | 977 | 31.8k | *num_bits_left -= ff_ps_read_data(ac->avctx, gb, &sbr->ps.common, *num_bits_left); | 978 | 31.8k | ac->avctx->profile = AV_PROFILE_AAC_HE_V2; | 979 | | // ensure the warning is not printed if PS extension is present | 980 | 31.8k | ac->warned_he_aac_mono = 1; | 981 | 31.8k | } | 982 | 32.4k | break; | 983 | 16.8k | default: | 984 | | // some files contain 0-padding | 985 | 16.8k | if (bs_extension_id || *num_bits_left > 16 || show_bits(gb, *num_bits_left)) | 986 | 16.5k | avpriv_request_sample(ac->avctx, "Reserved SBR extensions"); | 987 | 16.8k | skip_bits_long(gb, *num_bits_left); // bs_fill_bits | 988 | 16.8k | *num_bits_left = 0; | 989 | 16.8k | break; | 990 | 49.2k | } | 991 | 49.2k | } |
|
992 | | |
993 | | static int read_sbr_single_channel_element(AACDecContext *ac, |
994 | | SpectralBandReplication *sbr, |
995 | | GetBitContext *gb) |
996 | 147k | { |
997 | 147k | int ret; |
998 | | |
999 | 147k | if (get_bits1(gb)) // bs_data_extra |
1000 | 36.0k | skip_bits(gb, 4); // bs_reserved |
1001 | | |
1002 | 147k | if (read_sbr_grid(ac, sbr, gb, &sbr->data[0])) |
1003 | 7.83k | return -1; |
1004 | 139k | read_sbr_dtdf(sbr, gb, &sbr->data[0], 0); |
1005 | 139k | read_sbr_invf(sbr, gb, &sbr->data[0]); |
1006 | 139k | if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0) |
1007 | 15.0k | return ret; |
1008 | 124k | if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0) |
1009 | 6.73k | return ret; |
1010 | | |
1011 | 117k | if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb))) |
1012 | 44.7k | get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]); |
1013 | | |
1014 | 117k | return 0; |
1015 | 124k | } aacsbr.c:read_sbr_single_channel_element Line | Count | Source | 996 | 82.3k | { | 997 | 82.3k | int ret; | 998 | | | 999 | 82.3k | if (get_bits1(gb)) // bs_data_extra | 1000 | 17.3k | skip_bits(gb, 4); // bs_reserved | 1001 | | | 1002 | 82.3k | if (read_sbr_grid(ac, sbr, gb, &sbr->data[0])) | 1003 | 4.32k | return -1; | 1004 | 78.0k | read_sbr_dtdf(sbr, gb, &sbr->data[0], 0); | 1005 | 78.0k | read_sbr_invf(sbr, gb, &sbr->data[0]); | 1006 | 78.0k | if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0) | 1007 | 7.80k | return ret; | 1008 | 70.2k | if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0) | 1009 | 2.35k | return ret; | 1010 | | | 1011 | 67.8k | if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb))) | 1012 | 30.3k | get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]); | 1013 | | | 1014 | 67.8k | return 0; | 1015 | 70.2k | } |
aacsbr_fixed.c:read_sbr_single_channel_element Line | Count | Source | 996 | 64.8k | { | 997 | 64.8k | int ret; | 998 | | | 999 | 64.8k | if (get_bits1(gb)) // bs_data_extra | 1000 | 18.6k | skip_bits(gb, 4); // bs_reserved | 1001 | | | 1002 | 64.8k | if (read_sbr_grid(ac, sbr, gb, &sbr->data[0])) | 1003 | 3.51k | return -1; | 1004 | 61.3k | read_sbr_dtdf(sbr, gb, &sbr->data[0], 0); | 1005 | 61.3k | read_sbr_invf(sbr, gb, &sbr->data[0]); | 1006 | 61.3k | if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0) | 1007 | 7.20k | return ret; | 1008 | 54.1k | if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0) | 1009 | 4.37k | return ret; | 1010 | | | 1011 | 49.7k | if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb))) | 1012 | 14.3k | get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]); | 1013 | | | 1014 | 49.7k | return 0; | 1015 | 54.1k | } |
|
1016 | | |
1017 | | static int read_sbr_channel_pair_element(AACDecContext *ac, |
1018 | | SpectralBandReplication *sbr, |
1019 | | GetBitContext *gb) |
1020 | 178k | { |
1021 | 178k | int ret; |
1022 | | |
1023 | 178k | if (get_bits1(gb)) // bs_data_extra |
1024 | 15.9k | skip_bits(gb, 8); // bs_reserved |
1025 | | |
1026 | 178k | if ((sbr->bs_coupling = get_bits1(gb))) { |
1027 | 87.9k | if (read_sbr_grid(ac, sbr, gb, &sbr->data[0])) |
1028 | 4.16k | return -1; |
1029 | 83.7k | copy_sbr_grid(&sbr->data[1], &sbr->data[0]); |
1030 | 83.7k | read_sbr_dtdf(sbr, gb, &sbr->data[0], 0); |
1031 | 83.7k | read_sbr_dtdf(sbr, gb, &sbr->data[1], 0); |
1032 | 83.7k | read_sbr_invf(sbr, gb, &sbr->data[0]); |
1033 | 83.7k | memcpy(sbr->data[1].bs_invf_mode[1], sbr->data[1].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0])); |
1034 | 83.7k | memcpy(sbr->data[1].bs_invf_mode[0], sbr->data[0].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0])); |
1035 | 83.7k | if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0) |
1036 | 4.72k | return ret; |
1037 | 79.0k | if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0) |
1038 | 2.72k | return ret; |
1039 | 76.3k | if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0) |
1040 | 31.4k | return ret; |
1041 | 44.8k | if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0) |
1042 | 5.81k | return ret; |
1043 | 90.9k | } else { |
1044 | 90.9k | if (read_sbr_grid(ac, sbr, gb, &sbr->data[0]) || |
1045 | 86.4k | read_sbr_grid(ac, sbr, gb, &sbr->data[1])) |
1046 | 7.82k | return -1; |
1047 | 83.1k | read_sbr_dtdf(sbr, gb, &sbr->data[0], 0); |
1048 | 83.1k | read_sbr_dtdf(sbr, gb, &sbr->data[1], 0); |
1049 | 83.1k | read_sbr_invf(sbr, gb, &sbr->data[0]); |
1050 | 83.1k | read_sbr_invf(sbr, gb, &sbr->data[1]); |
1051 | 83.1k | if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0) |
1052 | 3.67k | return ret; |
1053 | 79.4k | if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0) |
1054 | 4.38k | return ret; |
1055 | 75.0k | if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0) |
1056 | 7.15k | return ret; |
1057 | 67.9k | if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0) |
1058 | 18.0k | return ret; |
1059 | 67.9k | } |
1060 | | |
1061 | 88.8k | if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb))) |
1062 | 31.5k | get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]); |
1063 | 88.8k | if ((sbr->data[1].bs_add_harmonic_flag = get_bits1(gb))) |
1064 | 28.5k | get_bits1_vector(gb, sbr->data[1].bs_add_harmonic, sbr->n[1]); |
1065 | | |
1066 | 88.8k | return 0; |
1067 | 178k | } aacsbr.c:read_sbr_channel_pair_element Line | Count | Source | 1020 | 111k | { | 1021 | 111k | int ret; | 1022 | | | 1023 | 111k | if (get_bits1(gb)) // bs_data_extra | 1024 | 8.77k | skip_bits(gb, 8); // bs_reserved | 1025 | | | 1026 | 111k | if ((sbr->bs_coupling = get_bits1(gb))) { | 1027 | 53.7k | if (read_sbr_grid(ac, sbr, gb, &sbr->data[0])) | 1028 | 3.13k | return -1; | 1029 | 50.6k | copy_sbr_grid(&sbr->data[1], &sbr->data[0]); | 1030 | 50.6k | read_sbr_dtdf(sbr, gb, &sbr->data[0], 0); | 1031 | 50.6k | read_sbr_dtdf(sbr, gb, &sbr->data[1], 0); | 1032 | 50.6k | read_sbr_invf(sbr, gb, &sbr->data[0]); | 1033 | 50.6k | memcpy(sbr->data[1].bs_invf_mode[1], sbr->data[1].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0])); | 1034 | 50.6k | memcpy(sbr->data[1].bs_invf_mode[0], sbr->data[0].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0])); | 1035 | 50.6k | if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0) | 1036 | 3.12k | return ret; | 1037 | 47.4k | if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0) | 1038 | 1.97k | return ret; | 1039 | 45.5k | if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0) | 1040 | 30.1k | return ret; | 1041 | 15.3k | if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0) | 1042 | 4.96k | return ret; | 1043 | 58.1k | } else { | 1044 | 58.1k | if (read_sbr_grid(ac, sbr, gb, &sbr->data[0]) || | 1045 | 55.3k | read_sbr_grid(ac, sbr, gb, &sbr->data[1])) | 1046 | 4.96k | return -1; | 1047 | 53.2k | read_sbr_dtdf(sbr, gb, &sbr->data[0], 0); | 1048 | 53.2k | read_sbr_dtdf(sbr, gb, &sbr->data[1], 0); | 1049 | 53.2k | read_sbr_invf(sbr, gb, &sbr->data[0]); | 1050 | 53.2k | read_sbr_invf(sbr, gb, &sbr->data[1]); | 1051 | 53.2k | if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0) | 1052 | 2.10k | return ret; | 1053 | 51.1k | if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0) | 1054 | 755 | return ret; | 1055 | 50.3k | if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0) | 1056 | 6.14k | return ret; | 1057 | 44.2k | if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0) | 1058 | 17.6k | return ret; | 1059 | 44.2k | } | 1060 | | | 1061 | 36.9k | if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb))) | 1062 | 18.9k | get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]); | 1063 | 36.9k | if ((sbr->data[1].bs_add_harmonic_flag = get_bits1(gb))) | 1064 | 17.9k | get_bits1_vector(gb, sbr->data[1].bs_add_harmonic, sbr->n[1]); | 1065 | | | 1066 | 36.9k | return 0; | 1067 | 111k | } |
aacsbr_fixed.c:read_sbr_channel_pair_element Line | Count | Source | 1020 | 67.0k | { | 1021 | 67.0k | int ret; | 1022 | | | 1023 | 67.0k | if (get_bits1(gb)) // bs_data_extra | 1024 | 7.17k | skip_bits(gb, 8); // bs_reserved | 1025 | | | 1026 | 67.0k | if ((sbr->bs_coupling = get_bits1(gb))) { | 1027 | 34.2k | if (read_sbr_grid(ac, sbr, gb, &sbr->data[0])) | 1028 | 1.03k | return -1; | 1029 | 33.1k | copy_sbr_grid(&sbr->data[1], &sbr->data[0]); | 1030 | 33.1k | read_sbr_dtdf(sbr, gb, &sbr->data[0], 0); | 1031 | 33.1k | read_sbr_dtdf(sbr, gb, &sbr->data[1], 0); | 1032 | 33.1k | read_sbr_invf(sbr, gb, &sbr->data[0]); | 1033 | 33.1k | memcpy(sbr->data[1].bs_invf_mode[1], sbr->data[1].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0])); | 1034 | 33.1k | memcpy(sbr->data[1].bs_invf_mode[0], sbr->data[0].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0])); | 1035 | 33.1k | if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0) | 1036 | 1.60k | return ret; | 1037 | 31.5k | if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0) | 1038 | 749 | return ret; | 1039 | 30.8k | if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0) | 1040 | 1.30k | return ret; | 1041 | 29.5k | if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0) | 1042 | 853 | return ret; | 1043 | 32.7k | } else { | 1044 | 32.7k | if (read_sbr_grid(ac, sbr, gb, &sbr->data[0]) || | 1045 | 31.0k | read_sbr_grid(ac, sbr, gb, &sbr->data[1])) | 1046 | 2.86k | return -1; | 1047 | 29.9k | read_sbr_dtdf(sbr, gb, &sbr->data[0], 0); | 1048 | 29.9k | read_sbr_dtdf(sbr, gb, &sbr->data[1], 0); | 1049 | 29.9k | read_sbr_invf(sbr, gb, &sbr->data[0]); | 1050 | 29.9k | read_sbr_invf(sbr, gb, &sbr->data[1]); | 1051 | 29.9k | if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0) | 1052 | 1.57k | return ret; | 1053 | 28.3k | if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0) | 1054 | 3.62k | return ret; | 1055 | 24.7k | if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0) | 1056 | 1.00k | return ret; | 1057 | 23.7k | if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0) | 1058 | 477 | return ret; | 1059 | 23.7k | } | 1060 | | | 1061 | 51.9k | if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb))) | 1062 | 12.6k | get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]); | 1063 | 51.9k | if ((sbr->data[1].bs_add_harmonic_flag = get_bits1(gb))) | 1064 | 10.5k | get_bits1_vector(gb, sbr->data[1].bs_add_harmonic, sbr->n[1]); | 1065 | | | 1066 | 51.9k | return 0; | 1067 | 67.0k | } |
|
1068 | | |
1069 | | static unsigned int read_sbr_data(AACDecContext *ac, SpectralBandReplication *sbr, |
1070 | | GetBitContext *gb, int id_aac) |
1071 | 326k | { |
1072 | 326k | unsigned int cnt = get_bits_count(gb); |
1073 | | |
1074 | 326k | sbr->id_aac = id_aac; |
1075 | 326k | sbr->ready_for_dequant = 1; |
1076 | | |
1077 | 326k | if (id_aac == TYPE_SCE || id_aac == TYPE_CCE) { |
1078 | 147k | if (read_sbr_single_channel_element(ac, sbr, gb)) { |
1079 | 29.5k | sbr_turnoff(sbr); |
1080 | 29.5k | return get_bits_count(gb) - cnt; |
1081 | 29.5k | } |
1082 | 179k | } else if (id_aac == TYPE_CPE) { |
1083 | 178k | if (read_sbr_channel_pair_element(ac, sbr, gb)) { |
1084 | 90.0k | sbr_turnoff(sbr); |
1085 | 90.0k | return get_bits_count(gb) - cnt; |
1086 | 90.0k | } |
1087 | 178k | } else { |
1088 | 227 | av_log(ac->avctx, AV_LOG_ERROR, |
1089 | 227 | "Invalid bitstream - cannot apply SBR to element type %d\n", id_aac); |
1090 | 227 | sbr_turnoff(sbr); |
1091 | 227 | return get_bits_count(gb) - cnt; |
1092 | 227 | } |
1093 | 206k | if (get_bits1(gb)) { // bs_extended_data |
1094 | 86.6k | int num_bits_left = get_bits(gb, 4); // bs_extension_size |
1095 | 86.6k | if (num_bits_left == 15) |
1096 | 8.06k | num_bits_left += get_bits(gb, 8); // bs_esc_count |
1097 | | |
1098 | 86.6k | num_bits_left <<= 3; |
1099 | 184k | while (num_bits_left > 7) { |
1100 | 98.2k | num_bits_left -= 2; |
1101 | 98.2k | read_sbr_extension(ac, sbr, gb, get_bits(gb, 2), &num_bits_left); // bs_extension_id |
1102 | 98.2k | } |
1103 | 86.6k | if (num_bits_left < 0) { |
1104 | 0 | av_log(ac->avctx, AV_LOG_ERROR, "SBR Extension over read.\n"); |
1105 | 0 | } |
1106 | 86.6k | if (num_bits_left > 0) |
1107 | 1.50k | skip_bits(gb, num_bits_left); |
1108 | 86.6k | } |
1109 | | |
1110 | 206k | return get_bits_count(gb) - cnt; |
1111 | 326k | } Line | Count | Source | 1071 | 194k | { | 1072 | 194k | unsigned int cnt = get_bits_count(gb); | 1073 | | | 1074 | 194k | sbr->id_aac = id_aac; | 1075 | 194k | sbr->ready_for_dequant = 1; | 1076 | | | 1077 | 194k | if (id_aac == TYPE_SCE || id_aac == TYPE_CCE) { | 1078 | 82.3k | if (read_sbr_single_channel_element(ac, sbr, gb)) { | 1079 | 14.4k | sbr_turnoff(sbr); | 1080 | 14.4k | return get_bits_count(gb) - cnt; | 1081 | 14.4k | } | 1082 | 111k | } else if (id_aac == TYPE_CPE) { | 1083 | 111k | if (read_sbr_channel_pair_element(ac, sbr, gb)) { | 1084 | 74.9k | sbr_turnoff(sbr); | 1085 | 74.9k | return get_bits_count(gb) - cnt; | 1086 | 74.9k | } | 1087 | 111k | } else { | 1088 | 69 | av_log(ac->avctx, AV_LOG_ERROR, | 1089 | 69 | "Invalid bitstream - cannot apply SBR to element type %d\n", id_aac); | 1090 | 69 | sbr_turnoff(sbr); | 1091 | 69 | return get_bits_count(gb) - cnt; | 1092 | 69 | } | 1093 | 104k | if (get_bits1(gb)) { // bs_extended_data | 1094 | 49.0k | int num_bits_left = get_bits(gb, 4); // bs_extension_size | 1095 | 49.0k | if (num_bits_left == 15) | 1096 | 3.46k | num_bits_left += get_bits(gb, 8); // bs_esc_count | 1097 | | | 1098 | 49.0k | num_bits_left <<= 3; | 1099 | 98.0k | while (num_bits_left > 7) { | 1100 | 49.0k | num_bits_left -= 2; | 1101 | 49.0k | read_sbr_extension(ac, sbr, gb, get_bits(gb, 2), &num_bits_left); // bs_extension_id | 1102 | 49.0k | } | 1103 | 49.0k | if (num_bits_left < 0) { | 1104 | 0 | av_log(ac->avctx, AV_LOG_ERROR, "SBR Extension over read.\n"); | 1105 | 0 | } | 1106 | 49.0k | if (num_bits_left > 0) | 1107 | 791 | skip_bits(gb, num_bits_left); | 1108 | 49.0k | } | 1109 | | | 1110 | 104k | return get_bits_count(gb) - cnt; | 1111 | 194k | } |
aacsbr_fixed.c:read_sbr_data Line | Count | Source | 1071 | 132k | { | 1072 | 132k | unsigned int cnt = get_bits_count(gb); | 1073 | | | 1074 | 132k | sbr->id_aac = id_aac; | 1075 | 132k | sbr->ready_for_dequant = 1; | 1076 | | | 1077 | 132k | if (id_aac == TYPE_SCE || id_aac == TYPE_CCE) { | 1078 | 64.8k | if (read_sbr_single_channel_element(ac, sbr, gb)) { | 1079 | 15.0k | sbr_turnoff(sbr); | 1080 | 15.0k | return get_bits_count(gb) - cnt; | 1081 | 15.0k | } | 1082 | 67.1k | } else if (id_aac == TYPE_CPE) { | 1083 | 67.0k | if (read_sbr_channel_pair_element(ac, sbr, gb)) { | 1084 | 15.0k | sbr_turnoff(sbr); | 1085 | 15.0k | return get_bits_count(gb) - cnt; | 1086 | 15.0k | } | 1087 | 67.0k | } else { | 1088 | 158 | av_log(ac->avctx, AV_LOG_ERROR, | 1089 | 158 | "Invalid bitstream - cannot apply SBR to element type %d\n", id_aac); | 1090 | 158 | sbr_turnoff(sbr); | 1091 | 158 | return get_bits_count(gb) - cnt; | 1092 | 158 | } | 1093 | 101k | if (get_bits1(gb)) { // bs_extended_data | 1094 | 37.6k | int num_bits_left = get_bits(gb, 4); // bs_extension_size | 1095 | 37.6k | if (num_bits_left == 15) | 1096 | 4.60k | num_bits_left += get_bits(gb, 8); // bs_esc_count | 1097 | | | 1098 | 37.6k | num_bits_left <<= 3; | 1099 | 86.9k | while (num_bits_left > 7) { | 1100 | 49.2k | num_bits_left -= 2; | 1101 | 49.2k | read_sbr_extension(ac, sbr, gb, get_bits(gb, 2), &num_bits_left); // bs_extension_id | 1102 | 49.2k | } | 1103 | 37.6k | if (num_bits_left < 0) { | 1104 | 0 | av_log(ac->avctx, AV_LOG_ERROR, "SBR Extension over read.\n"); | 1105 | 0 | } | 1106 | 37.6k | if (num_bits_left > 0) | 1107 | 718 | skip_bits(gb, num_bits_left); | 1108 | 37.6k | } | 1109 | | | 1110 | 101k | return get_bits_count(gb) - cnt; | 1111 | 132k | } |
|
1112 | | |
1113 | | static void sbr_reset(AACDecContext *ac, SpectralBandReplication *sbr) |
1114 | 597k | { |
1115 | 597k | int err; |
1116 | 597k | err = sbr_make_f_master(ac, sbr, &sbr->spectrum_params); |
1117 | 597k | if (err >= 0) |
1118 | 319k | err = sbr_make_f_derived(ac, sbr); |
1119 | 597k | if (err < 0) { |
1120 | 293k | av_log(ac->avctx, AV_LOG_ERROR, |
1121 | 293k | "SBR reset failed. Switching SBR to pure upsampling mode.\n"); |
1122 | 293k | sbr_turnoff(sbr); |
1123 | 293k | } |
1124 | 597k | } Line | Count | Source | 1114 | 485k | { | 1115 | 485k | int err; | 1116 | 485k | err = sbr_make_f_master(ac, sbr, &sbr->spectrum_params); | 1117 | 485k | if (err >= 0) | 1118 | 215k | err = sbr_make_f_derived(ac, sbr); | 1119 | 485k | if (err < 0) { | 1120 | 278k | av_log(ac->avctx, AV_LOG_ERROR, | 1121 | 278k | "SBR reset failed. Switching SBR to pure upsampling mode.\n"); | 1122 | 278k | sbr_turnoff(sbr); | 1123 | 278k | } | 1124 | 485k | } |
Line | Count | Source | 1114 | 112k | { | 1115 | 112k | int err; | 1116 | 112k | err = sbr_make_f_master(ac, sbr, &sbr->spectrum_params); | 1117 | 112k | if (err >= 0) | 1118 | 104k | err = sbr_make_f_derived(ac, sbr); | 1119 | 112k | if (err < 0) { | 1120 | 15.2k | av_log(ac->avctx, AV_LOG_ERROR, | 1121 | 15.2k | "SBR reset failed. Switching SBR to pure upsampling mode.\n"); | 1122 | 15.2k | sbr_turnoff(sbr); | 1123 | 15.2k | } | 1124 | 112k | } |
|
1125 | | |
1126 | | /** |
1127 | | * Decode Spectral Band Replication extension data; reference: table 4.55. |
1128 | | * |
1129 | | * @param crc flag indicating the presence of CRC checksum |
1130 | | * @param cnt length of TYPE_FIL syntactic element in bytes |
1131 | | * |
1132 | | * @return Returns number of bytes consumed from the TYPE_FIL element. |
1133 | | */ |
1134 | | int AAC_RENAME(ff_aac_sbr_decode_extension)(AACDecContext *ac, ChannelElement *che, |
1135 | | GetBitContext *gb_host, int crc, |
1136 | | int cnt, int id_aac) |
1137 | 376k | { |
1138 | 376k | SpectralBandReplication *sbr = get_sbr(che); |
1139 | 376k | unsigned int num_sbr_bits = 0, num_align_bits; |
1140 | 376k | unsigned bytes_read; |
1141 | 376k | GetBitContext gbc = *gb_host, *gb = &gbc; |
1142 | 376k | skip_bits_long(gb_host, cnt*8 - 4); |
1143 | | |
1144 | 376k | sbr->reset = 0; |
1145 | | |
1146 | 376k | if (!sbr->sample_rate) |
1147 | 12.5k | sbr->sample_rate = 2 * ac->oc[1].m4ac.sample_rate; //TODO use the nominal sample rate for arbitrary sample rate support |
1148 | 376k | if (!ac->oc[1].m4ac.ext_sample_rate) |
1149 | 29.5k | ac->oc[1].m4ac.ext_sample_rate = 2 * ac->oc[1].m4ac.sample_rate; |
1150 | | |
1151 | 376k | if (crc) { |
1152 | 167k | skip_bits(gb, 10); // bs_sbr_crc_bits; TODO - implement CRC check |
1153 | 167k | num_sbr_bits += 10; |
1154 | 167k | } |
1155 | | |
1156 | | //Save some state from the previous frame. |
1157 | 376k | sbr->kx[0] = sbr->kx[1]; |
1158 | 376k | sbr->m[0] = sbr->m[1]; |
1159 | 376k | sbr->kx_and_m_pushed = 1; |
1160 | | |
1161 | 376k | num_sbr_bits++; |
1162 | 376k | if (get_bits1(gb)) // bs_header_flag |
1163 | 367k | num_sbr_bits += read_sbr_header(sbr, gb, 0); |
1164 | | |
1165 | 376k | if (sbr->reset) |
1166 | 329k | sbr_reset(ac, sbr); |
1167 | | |
1168 | 376k | if (sbr->start) |
1169 | 326k | num_sbr_bits += read_sbr_data(ac, sbr, gb, id_aac); |
1170 | | |
1171 | 376k | num_align_bits = ((cnt << 3) - 4 - num_sbr_bits) & 7; |
1172 | 376k | bytes_read = ((num_sbr_bits + num_align_bits + 4) >> 3); |
1173 | | |
1174 | 376k | if (bytes_read > cnt) { |
1175 | 259k | av_log(ac->avctx, AV_LOG_ERROR, |
1176 | 259k | "Expected to read %d SBR bytes actually read %d.\n", cnt, bytes_read); |
1177 | 259k | sbr_turnoff(sbr); |
1178 | 259k | } |
1179 | 376k | return cnt; |
1180 | 376k | } ff_aac_sbr_decode_extension Line | Count | Source | 1137 | 227k | { | 1138 | 227k | SpectralBandReplication *sbr = get_sbr(che); | 1139 | 227k | unsigned int num_sbr_bits = 0, num_align_bits; | 1140 | 227k | unsigned bytes_read; | 1141 | 227k | GetBitContext gbc = *gb_host, *gb = &gbc; | 1142 | 227k | skip_bits_long(gb_host, cnt*8 - 4); | 1143 | | | 1144 | 227k | sbr->reset = 0; | 1145 | | | 1146 | 227k | if (!sbr->sample_rate) | 1147 | 8.63k | sbr->sample_rate = 2 * ac->oc[1].m4ac.sample_rate; //TODO use the nominal sample rate for arbitrary sample rate support | 1148 | 227k | if (!ac->oc[1].m4ac.ext_sample_rate) | 1149 | 20.0k | ac->oc[1].m4ac.ext_sample_rate = 2 * ac->oc[1].m4ac.sample_rate; | 1150 | | | 1151 | 227k | if (crc) { | 1152 | 128k | skip_bits(gb, 10); // bs_sbr_crc_bits; TODO - implement CRC check | 1153 | 128k | num_sbr_bits += 10; | 1154 | 128k | } | 1155 | | | 1156 | | //Save some state from the previous frame. | 1157 | 227k | sbr->kx[0] = sbr->kx[1]; | 1158 | 227k | sbr->m[0] = sbr->m[1]; | 1159 | 227k | sbr->kx_and_m_pushed = 1; | 1160 | | | 1161 | 227k | num_sbr_bits++; | 1162 | 227k | if (get_bits1(gb)) // bs_header_flag | 1163 | 221k | num_sbr_bits += read_sbr_header(sbr, gb, 0); | 1164 | | | 1165 | 227k | if (sbr->reset) | 1166 | 217k | sbr_reset(ac, sbr); | 1167 | | | 1168 | 227k | if (sbr->start) | 1169 | 194k | num_sbr_bits += read_sbr_data(ac, sbr, gb, id_aac); | 1170 | | | 1171 | 227k | num_align_bits = ((cnt << 3) - 4 - num_sbr_bits) & 7; | 1172 | 227k | bytes_read = ((num_sbr_bits + num_align_bits + 4) >> 3); | 1173 | | | 1174 | 227k | if (bytes_read > cnt) { | 1175 | 205k | av_log(ac->avctx, AV_LOG_ERROR, | 1176 | 205k | "Expected to read %d SBR bytes actually read %d.\n", cnt, bytes_read); | 1177 | 205k | sbr_turnoff(sbr); | 1178 | 205k | } | 1179 | 227k | return cnt; | 1180 | 227k | } |
ff_aac_sbr_decode_extension_fixed Line | Count | Source | 1137 | 149k | { | 1138 | 149k | SpectralBandReplication *sbr = get_sbr(che); | 1139 | 149k | unsigned int num_sbr_bits = 0, num_align_bits; | 1140 | 149k | unsigned bytes_read; | 1141 | 149k | GetBitContext gbc = *gb_host, *gb = &gbc; | 1142 | 149k | skip_bits_long(gb_host, cnt*8 - 4); | 1143 | | | 1144 | 149k | sbr->reset = 0; | 1145 | | | 1146 | 149k | if (!sbr->sample_rate) | 1147 | 3.91k | sbr->sample_rate = 2 * ac->oc[1].m4ac.sample_rate; //TODO use the nominal sample rate for arbitrary sample rate support | 1148 | 149k | if (!ac->oc[1].m4ac.ext_sample_rate) | 1149 | 9.43k | ac->oc[1].m4ac.ext_sample_rate = 2 * ac->oc[1].m4ac.sample_rate; | 1150 | | | 1151 | 149k | if (crc) { | 1152 | 39.2k | skip_bits(gb, 10); // bs_sbr_crc_bits; TODO - implement CRC check | 1153 | 39.2k | num_sbr_bits += 10; | 1154 | 39.2k | } | 1155 | | | 1156 | | //Save some state from the previous frame. | 1157 | 149k | sbr->kx[0] = sbr->kx[1]; | 1158 | 149k | sbr->m[0] = sbr->m[1]; | 1159 | 149k | sbr->kx_and_m_pushed = 1; | 1160 | | | 1161 | 149k | num_sbr_bits++; | 1162 | 149k | if (get_bits1(gb)) // bs_header_flag | 1163 | 146k | num_sbr_bits += read_sbr_header(sbr, gb, 0); | 1164 | | | 1165 | 149k | if (sbr->reset) | 1166 | 112k | sbr_reset(ac, sbr); | 1167 | | | 1168 | 149k | if (sbr->start) | 1169 | 132k | num_sbr_bits += read_sbr_data(ac, sbr, gb, id_aac); | 1170 | | | 1171 | 149k | num_align_bits = ((cnt << 3) - 4 - num_sbr_bits) & 7; | 1172 | 149k | bytes_read = ((num_sbr_bits + num_align_bits + 4) >> 3); | 1173 | | | 1174 | 149k | if (bytes_read > cnt) { | 1175 | 53.4k | av_log(ac->avctx, AV_LOG_ERROR, | 1176 | 53.4k | "Expected to read %d SBR bytes actually read %d.\n", cnt, bytes_read); | 1177 | 53.4k | sbr_turnoff(sbr); | 1178 | 53.4k | } | 1179 | 149k | return cnt; | 1180 | 149k | } |
|
1181 | | |
1182 | | #if !USE_FIXED |
1183 | | static void copy_usac_default_header(SpectralBandReplication *sbr, |
1184 | | AACUsacElemConfig *ue) |
1185 | 33.4k | { |
1186 | 33.4k | sbr->inter_tes = ue->sbr.bs_intertes; |
1187 | | |
1188 | 33.4k | sbr->spectrum_params.bs_start_freq = ue->sbr.dflt.start_freq; |
1189 | 33.4k | sbr->spectrum_params.bs_stop_freq = ue->sbr.dflt.stop_freq; |
1190 | | |
1191 | 33.4k | sbr->spectrum_params.bs_freq_scale = ue->sbr.dflt.freq_scale; |
1192 | 33.4k | sbr->spectrum_params.bs_alter_scale = ue->sbr.dflt.alter_scale; |
1193 | 33.4k | sbr->spectrum_params.bs_noise_bands = ue->sbr.dflt.noise_bands; |
1194 | | |
1195 | 33.4k | sbr->bs_limiter_bands = ue->sbr.dflt.limiter_bands; |
1196 | 33.4k | sbr->bs_limiter_gains = ue->sbr.dflt.limiter_gains; |
1197 | 33.4k | sbr->bs_interpol_freq = ue->sbr.dflt.interpol_freq; |
1198 | 33.4k | sbr->bs_smoothing_mode = ue->sbr.dflt.smoothing_mode; |
1199 | 33.4k | } |
1200 | | |
1201 | | int ff_aac_sbr_config_usac(AACDecContext *ac, ChannelElement *che, |
1202 | | AACUsacElemConfig *ue) |
1203 | 667k | { |
1204 | 667k | SpectralBandReplication *sbr = get_sbr(che); |
1205 | 667k | sbr_turnoff(sbr); |
1206 | 667k | return 0; |
1207 | 667k | } |
1208 | | |
1209 | | int ff_aac_sbr_decode_usac_data(AACDecContext *ac, ChannelElement *che, |
1210 | | AACUsacElemConfig *ue, GetBitContext *gb, |
1211 | | int sbr_ch, int indep_flag) |
1212 | 739k | { |
1213 | 739k | int ret; |
1214 | 739k | SpectralBandReplication *sbr = get_sbr(che); |
1215 | 739k | int info_present = 1; |
1216 | 739k | int header_present = 1; |
1217 | | |
1218 | 739k | sbr->reset = 0; |
1219 | 739k | sbr->usac = 1; |
1220 | | |
1221 | 739k | sbr->sample_rate = ac->oc[1].m4ac.ext_sample_rate; |
1222 | 739k | sbr->id_aac = sbr_ch == 2 ? TYPE_CPE : TYPE_SCE; |
1223 | | |
1224 | 739k | if (!indep_flag) { |
1225 | 481k | info_present = get_bits1(gb); |
1226 | 481k | if (info_present) |
1227 | 32.4k | header_present = get_bits1(gb); |
1228 | 449k | else |
1229 | 449k | header_present = 0; |
1230 | 481k | } |
1231 | | |
1232 | 739k | if (info_present) { |
1233 | | /* SbrInfo() */ |
1234 | 290k | sbr->bs_amp_res_header = get_bits1(gb); |
1235 | 290k | sbr->spectrum_params.bs_xover_band = get_bits(gb, 4); |
1236 | 290k | sbr->bs_sbr_preprocessing = get_bits1(gb); |
1237 | | /* if (bs_pvc) ... */ |
1238 | 290k | } |
1239 | | |
1240 | 739k | if (header_present) { |
1241 | 272k | if (get_bits1(gb)) { |
1242 | 33.4k | int old_bs_limiter_bands = sbr->bs_limiter_bands; |
1243 | 33.4k | SpectrumParameters old_spectrum_params; |
1244 | 33.4k | memcpy(&old_spectrum_params, &sbr->spectrum_params, |
1245 | 33.4k | sizeof(SpectrumParameters)); |
1246 | | |
1247 | 33.4k | copy_usac_default_header(sbr, ue); |
1248 | | // Check if spectrum parameters changed |
1249 | 33.4k | if (memcmp(&old_spectrum_params, &sbr->spectrum_params, |
1250 | 33.4k | sizeof(SpectrumParameters))) |
1251 | 32.4k | sbr->reset = 1; |
1252 | | |
1253 | 33.4k | if (sbr->bs_limiter_bands != old_bs_limiter_bands && !sbr->reset) |
1254 | 0 | sbr_make_f_tablelim(sbr); |
1255 | 239k | } else { |
1256 | 239k | read_sbr_header(sbr, gb, 1); |
1257 | 239k | } |
1258 | | |
1259 | 272k | sbr->start = 1; |
1260 | 272k | } |
1261 | | |
1262 | | //Save some state from the previous frame. |
1263 | 739k | sbr->kx[0] = sbr->kx[1]; |
1264 | 739k | sbr->m[0] = sbr->m[1]; |
1265 | 739k | sbr->kx_and_m_pushed = 1; |
1266 | | |
1267 | 739k | if (sbr->reset) |
1268 | 267k | sbr_reset(ac, sbr); |
1269 | | |
1270 | 739k | sbr->ready_for_dequant = 1; |
1271 | | |
1272 | 739k | if (sbr_ch == 1) { /* sbr_single_channel_element */ |
1273 | | /* if (harmonicSBR) ... */ |
1274 | | |
1275 | 465k | if (read_sbr_grid(ac, sbr, gb, &sbr->data[0])) |
1276 | 9.34k | return -1; |
1277 | | |
1278 | 456k | read_sbr_dtdf(sbr, gb, &sbr->data[0], indep_flag); |
1279 | 456k | read_sbr_invf(sbr, gb, &sbr->data[0]); |
1280 | | |
1281 | 456k | if ((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0) |
1282 | 4.02k | return ret; |
1283 | | |
1284 | 452k | if ((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0) |
1285 | 998 | return ret; |
1286 | | |
1287 | 451k | if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb))) |
1288 | 16.5k | get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]); |
1289 | 451k | } else if (get_bits1(gb)) { /* bs_coupling == 1 */ |
1290 | 25.9k | sbr->bs_coupling = 1; |
1291 | | |
1292 | | /* if (harmonicSBR) ... */ |
1293 | | |
1294 | 25.9k | if (read_sbr_grid(ac, sbr, gb, &sbr->data[0])) |
1295 | 7.88k | return -1; |
1296 | 18.1k | copy_sbr_grid(&sbr->data[1], &sbr->data[0]); |
1297 | | |
1298 | 18.1k | read_sbr_dtdf(sbr, gb, &sbr->data[0], indep_flag); |
1299 | 18.1k | read_sbr_dtdf(sbr, gb, &sbr->data[1], indep_flag); |
1300 | | |
1301 | 18.1k | read_sbr_invf(sbr, gb, &sbr->data[0]); |
1302 | 18.1k | memcpy(sbr->data[1].bs_invf_mode[1], sbr->data[1].bs_invf_mode[0], |
1303 | 18.1k | sizeof(sbr->data[1].bs_invf_mode[0])); |
1304 | 18.1k | memcpy(sbr->data[1].bs_invf_mode[0], sbr->data[0].bs_invf_mode[0], |
1305 | 18.1k | sizeof(sbr->data[1].bs_invf_mode[0])); |
1306 | | |
1307 | 18.1k | if ((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0) |
1308 | 2.20k | return ret; |
1309 | 15.8k | if ((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0) |
1310 | 1.76k | return ret; |
1311 | | |
1312 | 14.1k | if ((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0) |
1313 | 1.08k | return ret; |
1314 | 13.0k | if ((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0) |
1315 | 757 | return ret; |
1316 | | |
1317 | 12.2k | if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb))) |
1318 | 1.90k | get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]); |
1319 | 12.2k | if ((sbr->data[1].bs_add_harmonic_flag = get_bits1(gb))) |
1320 | 4.77k | get_bits1_vector(gb, sbr->data[1].bs_add_harmonic, sbr->n[1]); |
1321 | 248k | } else { /* bs_coupling == 0 */ |
1322 | 248k | sbr->bs_coupling = 0; |
1323 | | |
1324 | | /* if (harmonicSBR) ... */ |
1325 | | |
1326 | 248k | if (read_sbr_grid(ac, sbr, gb, &sbr->data[0])) |
1327 | 1.86k | return -1; |
1328 | 246k | if (read_sbr_grid(ac, sbr, gb, &sbr->data[1])) |
1329 | 9.28k | return -1; |
1330 | | |
1331 | 237k | read_sbr_dtdf(sbr, gb, &sbr->data[0], indep_flag); |
1332 | 237k | read_sbr_dtdf(sbr, gb, &sbr->data[1], indep_flag); |
1333 | | |
1334 | 237k | read_sbr_invf(sbr, gb, &sbr->data[0]); |
1335 | 237k | read_sbr_invf(sbr, gb, &sbr->data[1]); |
1336 | | |
1337 | 237k | if ((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0) |
1338 | 12.4k | return ret; |
1339 | 224k | if ((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0) |
1340 | 7.14k | return ret; |
1341 | | |
1342 | 217k | if ((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0) |
1343 | 889 | return ret; |
1344 | 216k | if ((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0) |
1345 | 572 | return ret; |
1346 | | |
1347 | 216k | if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb))) |
1348 | 10.0k | get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]); |
1349 | 216k | if ((sbr->data[1].bs_add_harmonic_flag = get_bits1(gb))) |
1350 | 14.1k | get_bits1_vector(gb, sbr->data[1].bs_add_harmonic, sbr->n[1]); |
1351 | 216k | } |
1352 | | |
1353 | 679k | return 0; |
1354 | 739k | } |
1355 | | #endif |
1356 | | |
1357 | | /** |
1358 | | * Analysis QMF Bank (14496-3 sp04 p206) |
1359 | | * |
1360 | | * @param x pointer to the beginning of the first sample window |
1361 | | * @param W array of complex-valued samples split into subbands |
1362 | | */ |
1363 | | #ifndef sbr_qmf_analysis |
1364 | | #if USE_FIXED |
1365 | | static void sbr_qmf_analysis(AVFixedDSPContext *dsp, AVTXContext *mdct, |
1366 | | av_tx_fn mdct_fn, |
1367 | | #else |
1368 | | static void sbr_qmf_analysis(AVFloatDSPContext *dsp, AVTXContext *mdct, |
1369 | | av_tx_fn mdct_fn, |
1370 | | #endif /* USE_FIXED */ |
1371 | | SBRDSPContext *sbrdsp, const INTFLOAT *in, INTFLOAT *x, |
1372 | | INTFLOAT z[320], INTFLOAT W[2][32][32][2], int buf_idx) |
1373 | 1.25M | { |
1374 | 1.25M | int i; |
1375 | | #if USE_FIXED |
1376 | | int j; |
1377 | | #endif |
1378 | 1.25M | memcpy(x , x+1024, (320-32)*sizeof(x[0])); |
1379 | 1.25M | memcpy(x+288, in, 1024*sizeof(x[0])); |
1380 | 41.5M | for (i = 0; i < 32; i++) { // numTimeSlots*RATE = 16*2 as 960 sample frames |
1381 | | // are not supported |
1382 | 40.2M | dsp->vector_fmul_reverse(z, sbr_qmf_window_ds, x, 320); |
1383 | 40.2M | sbrdsp->sum64x5(z); |
1384 | 40.2M | sbrdsp->qmf_pre_shuffle(z); |
1385 | | #if USE_FIXED |
1386 | 566M | for (j = 64; j < 128; j++) { |
1387 | 558M | if (z[j] > 1<<24) { |
1388 | 41.6M | av_log(NULL, AV_LOG_WARNING, |
1389 | 41.6M | "sbr_qmf_analysis: value %09d too large, setting to %09d\n", |
1390 | 41.6M | z[j], 1<<24); |
1391 | 41.6M | z[j] = 1<<24; |
1392 | 516M | } else if (z[j] < -(1<<24)) { |
1393 | 41.7M | av_log(NULL, AV_LOG_WARNING, |
1394 | 41.7M | "sbr_qmf_analysis: value %09d too small, setting to %09d\n", |
1395 | 41.7M | z[j], -(1<<24)); |
1396 | 41.7M | z[j] = -(1<<24); |
1397 | 41.7M | } |
1398 | 558M | } |
1399 | | #endif |
1400 | 40.2M | mdct_fn(mdct, z, z + 64, sizeof(INTFLOAT)); |
1401 | 40.2M | sbrdsp->qmf_post_shuffle(W[buf_idx][i], z); |
1402 | 40.2M | x += 32; |
1403 | 40.2M | } |
1404 | 1.25M | } aacsbr.c:sbr_qmf_analysis Line | Count | Source | 1373 | 985k | { | 1374 | 985k | int i; | 1375 | | #if USE_FIXED | 1376 | | int j; | 1377 | | #endif | 1378 | 985k | memcpy(x , x+1024, (320-32)*sizeof(x[0])); | 1379 | 985k | memcpy(x+288, in, 1024*sizeof(x[0])); | 1380 | 32.5M | for (i = 0; i < 32; i++) { // numTimeSlots*RATE = 16*2 as 960 sample frames | 1381 | | // are not supported | 1382 | 31.5M | dsp->vector_fmul_reverse(z, sbr_qmf_window_ds, x, 320); | 1383 | 31.5M | sbrdsp->sum64x5(z); | 1384 | 31.5M | sbrdsp->qmf_pre_shuffle(z); | 1385 | | #if USE_FIXED | 1386 | | for (j = 64; j < 128; j++) { | 1387 | | if (z[j] > 1<<24) { | 1388 | | av_log(NULL, AV_LOG_WARNING, | 1389 | | "sbr_qmf_analysis: value %09d too large, setting to %09d\n", | 1390 | | z[j], 1<<24); | 1391 | | z[j] = 1<<24; | 1392 | | } else if (z[j] < -(1<<24)) { | 1393 | | av_log(NULL, AV_LOG_WARNING, | 1394 | | "sbr_qmf_analysis: value %09d too small, setting to %09d\n", | 1395 | | z[j], -(1<<24)); | 1396 | | z[j] = -(1<<24); | 1397 | | } | 1398 | | } | 1399 | | #endif | 1400 | 31.5M | mdct_fn(mdct, z, z + 64, sizeof(INTFLOAT)); | 1401 | 31.5M | sbrdsp->qmf_post_shuffle(W[buf_idx][i], z); | 1402 | 31.5M | x += 32; | 1403 | 31.5M | } | 1404 | 985k | } |
aacsbr_fixed.c:sbr_qmf_analysis Line | Count | Source | 1373 | 272k | { | 1374 | 272k | int i; | 1375 | 272k | #if USE_FIXED | 1376 | 272k | int j; | 1377 | 272k | #endif | 1378 | 272k | memcpy(x , x+1024, (320-32)*sizeof(x[0])); | 1379 | 272k | memcpy(x+288, in, 1024*sizeof(x[0])); | 1380 | 8.99M | for (i = 0; i < 32; i++) { // numTimeSlots*RATE = 16*2 as 960 sample frames | 1381 | | // are not supported | 1382 | 8.72M | dsp->vector_fmul_reverse(z, sbr_qmf_window_ds, x, 320); | 1383 | 8.72M | sbrdsp->sum64x5(z); | 1384 | 8.72M | sbrdsp->qmf_pre_shuffle(z); | 1385 | 8.72M | #if USE_FIXED | 1386 | 566M | for (j = 64; j < 128; j++) { | 1387 | 558M | if (z[j] > 1<<24) { | 1388 | 41.6M | av_log(NULL, AV_LOG_WARNING, | 1389 | 41.6M | "sbr_qmf_analysis: value %09d too large, setting to %09d\n", | 1390 | 41.6M | z[j], 1<<24); | 1391 | 41.6M | z[j] = 1<<24; | 1392 | 516M | } else if (z[j] < -(1<<24)) { | 1393 | 41.7M | av_log(NULL, AV_LOG_WARNING, | 1394 | 41.7M | "sbr_qmf_analysis: value %09d too small, setting to %09d\n", | 1395 | 41.7M | z[j], -(1<<24)); | 1396 | 41.7M | z[j] = -(1<<24); | 1397 | 41.7M | } | 1398 | 558M | } | 1399 | 8.72M | #endif | 1400 | 8.72M | mdct_fn(mdct, z, z + 64, sizeof(INTFLOAT)); | 1401 | 8.72M | sbrdsp->qmf_post_shuffle(W[buf_idx][i], z); | 1402 | 8.72M | x += 32; | 1403 | 8.72M | } | 1404 | 272k | } |
|
1405 | | #endif |
1406 | | |
1407 | | /** |
1408 | | * Synthesis QMF Bank (14496-3 sp04 p206) and Downsampled Synthesis QMF Bank |
1409 | | * (14496-3 sp04 p206) |
1410 | | */ |
1411 | | #ifndef sbr_qmf_synthesis |
1412 | | static void sbr_qmf_synthesis(AVTXContext *mdct, av_tx_fn mdct_fn, |
1413 | | #if USE_FIXED |
1414 | | SBRDSPContext *sbrdsp, AVFixedDSPContext *dsp, |
1415 | | #else |
1416 | | SBRDSPContext *sbrdsp, AVFloatDSPContext *dsp, |
1417 | | #endif /* USE_FIXED */ |
1418 | | INTFLOAT *out, INTFLOAT X[2][38][64], |
1419 | | INTFLOAT mdct_buf[2][64], |
1420 | | INTFLOAT *v0, int *v_off, const unsigned int div) |
1421 | 1.35M | { |
1422 | 1.35M | int i, n; |
1423 | 1.35M | const INTFLOAT *sbr_qmf_window = div ? sbr_qmf_window_ds : sbr_qmf_window_us; |
1424 | 1.35M | const int step = 128 >> div; |
1425 | 1.35M | INTFLOAT *v; |
1426 | 44.5M | for (i = 0; i < 32; i++) { |
1427 | 43.2M | if (*v_off < step) { |
1428 | 4.72M | int saved_samples = (1280 - 128) >> div; |
1429 | 4.72M | memcpy(&v0[SBR_SYNTHESIS_BUF_SIZE - saved_samples], v0, saved_samples * sizeof(INTFLOAT)); |
1430 | 4.72M | *v_off = SBR_SYNTHESIS_BUF_SIZE - saved_samples - step; |
1431 | 38.5M | } else { |
1432 | 38.5M | *v_off -= step; |
1433 | 38.5M | } |
1434 | 43.2M | v = v0 + *v_off; |
1435 | 43.2M | if (div) { |
1436 | 28.6M | for (n = 0; n < 32; n++) { |
1437 | 27.7M | X[0][i][ n] = -X[0][i][n]; |
1438 | 27.7M | X[0][i][32+n] = X[1][i][31-n]; |
1439 | 27.7M | } |
1440 | 868k | mdct_fn(mdct, mdct_buf[0], X[0][i], sizeof(INTFLOAT)); |
1441 | 868k | sbrdsp->qmf_deint_neg(v, mdct_buf[0]); |
1442 | 42.3M | } else { |
1443 | 42.3M | sbrdsp->neg_odd_64(X[1][i]); |
1444 | 42.3M | mdct_fn(mdct, mdct_buf[0], X[0][i], sizeof(INTFLOAT)); |
1445 | 42.3M | mdct_fn(mdct, mdct_buf[1], X[1][i], sizeof(INTFLOAT)); |
1446 | 42.3M | sbrdsp->qmf_deint_bfly(v, mdct_buf[1], mdct_buf[0]); |
1447 | 42.3M | } |
1448 | 43.2M | dsp->vector_fmul (out, v , sbr_qmf_window , 64 >> div); |
1449 | 43.2M | dsp->vector_fmul_add(out, v + ( 192 >> div), sbr_qmf_window + ( 64 >> div), out , 64 >> div); |
1450 | 43.2M | dsp->vector_fmul_add(out, v + ( 256 >> div), sbr_qmf_window + (128 >> div), out , 64 >> div); |
1451 | 43.2M | dsp->vector_fmul_add(out, v + ( 448 >> div), sbr_qmf_window + (192 >> div), out , 64 >> div); |
1452 | 43.2M | dsp->vector_fmul_add(out, v + ( 512 >> div), sbr_qmf_window + (256 >> div), out , 64 >> div); |
1453 | 43.2M | dsp->vector_fmul_add(out, v + ( 704 >> div), sbr_qmf_window + (320 >> div), out , 64 >> div); |
1454 | 43.2M | dsp->vector_fmul_add(out, v + ( 768 >> div), sbr_qmf_window + (384 >> div), out , 64 >> div); |
1455 | 43.2M | dsp->vector_fmul_add(out, v + ( 960 >> div), sbr_qmf_window + (448 >> div), out , 64 >> div); |
1456 | 43.2M | dsp->vector_fmul_add(out, v + (1024 >> div), sbr_qmf_window + (512 >> div), out , 64 >> div); |
1457 | 43.2M | dsp->vector_fmul_add(out, v + (1216 >> div), sbr_qmf_window + (576 >> div), out , 64 >> div); |
1458 | 43.2M | out += 64 >> div; |
1459 | 43.2M | } |
1460 | 1.35M | } aacsbr.c:sbr_qmf_synthesis Line | Count | Source | 1421 | 1.01M | { | 1422 | 1.01M | int i, n; | 1423 | 1.01M | const INTFLOAT *sbr_qmf_window = div ? sbr_qmf_window_ds : sbr_qmf_window_us; | 1424 | 1.01M | const int step = 128 >> div; | 1425 | 1.01M | INTFLOAT *v; | 1426 | 33.5M | for (i = 0; i < 32; i++) { | 1427 | 32.5M | if (*v_off < step) { | 1428 | 3.59M | int saved_samples = (1280 - 128) >> div; | 1429 | 3.59M | memcpy(&v0[SBR_SYNTHESIS_BUF_SIZE - saved_samples], v0, saved_samples * sizeof(INTFLOAT)); | 1430 | 3.59M | *v_off = SBR_SYNTHESIS_BUF_SIZE - saved_samples - step; | 1431 | 28.9M | } else { | 1432 | 28.9M | *v_off -= step; | 1433 | 28.9M | } | 1434 | 32.5M | v = v0 + *v_off; | 1435 | 32.5M | if (div) { | 1436 | 4.41M | for (n = 0; n < 32; n++) { | 1437 | 4.28M | X[0][i][ n] = -X[0][i][n]; | 1438 | 4.28M | X[0][i][32+n] = X[1][i][31-n]; | 1439 | 4.28M | } | 1440 | 133k | mdct_fn(mdct, mdct_buf[0], X[0][i], sizeof(INTFLOAT)); | 1441 | 133k | sbrdsp->qmf_deint_neg(v, mdct_buf[0]); | 1442 | 32.3M | } else { | 1443 | 32.3M | sbrdsp->neg_odd_64(X[1][i]); | 1444 | 32.3M | mdct_fn(mdct, mdct_buf[0], X[0][i], sizeof(INTFLOAT)); | 1445 | 32.3M | mdct_fn(mdct, mdct_buf[1], X[1][i], sizeof(INTFLOAT)); | 1446 | 32.3M | sbrdsp->qmf_deint_bfly(v, mdct_buf[1], mdct_buf[0]); | 1447 | 32.3M | } | 1448 | 32.5M | dsp->vector_fmul (out, v , sbr_qmf_window , 64 >> div); | 1449 | 32.5M | dsp->vector_fmul_add(out, v + ( 192 >> div), sbr_qmf_window + ( 64 >> div), out , 64 >> div); | 1450 | 32.5M | dsp->vector_fmul_add(out, v + ( 256 >> div), sbr_qmf_window + (128 >> div), out , 64 >> div); | 1451 | 32.5M | dsp->vector_fmul_add(out, v + ( 448 >> div), sbr_qmf_window + (192 >> div), out , 64 >> div); | 1452 | 32.5M | dsp->vector_fmul_add(out, v + ( 512 >> div), sbr_qmf_window + (256 >> div), out , 64 >> div); | 1453 | 32.5M | dsp->vector_fmul_add(out, v + ( 704 >> div), sbr_qmf_window + (320 >> div), out , 64 >> div); | 1454 | 32.5M | dsp->vector_fmul_add(out, v + ( 768 >> div), sbr_qmf_window + (384 >> div), out , 64 >> div); | 1455 | 32.5M | dsp->vector_fmul_add(out, v + ( 960 >> div), sbr_qmf_window + (448 >> div), out , 64 >> div); | 1456 | 32.5M | dsp->vector_fmul_add(out, v + (1024 >> div), sbr_qmf_window + (512 >> div), out , 64 >> div); | 1457 | 32.5M | dsp->vector_fmul_add(out, v + (1216 >> div), sbr_qmf_window + (576 >> div), out , 64 >> div); | 1458 | 32.5M | out += 64 >> div; | 1459 | 32.5M | } | 1460 | 1.01M | } |
aacsbr_fixed.c:sbr_qmf_synthesis Line | Count | Source | 1421 | 335k | { | 1422 | 335k | int i, n; | 1423 | 335k | const INTFLOAT *sbr_qmf_window = div ? sbr_qmf_window_ds : sbr_qmf_window_us; | 1424 | 335k | const int step = 128 >> div; | 1425 | 335k | INTFLOAT *v; | 1426 | 11.0M | for (i = 0; i < 32; i++) { | 1427 | 10.7M | if (*v_off < step) { | 1428 | 1.13M | int saved_samples = (1280 - 128) >> div; | 1429 | 1.13M | memcpy(&v0[SBR_SYNTHESIS_BUF_SIZE - saved_samples], v0, saved_samples * sizeof(INTFLOAT)); | 1430 | 1.13M | *v_off = SBR_SYNTHESIS_BUF_SIZE - saved_samples - step; | 1431 | 9.60M | } else { | 1432 | 9.60M | *v_off -= step; | 1433 | 9.60M | } | 1434 | 10.7M | v = v0 + *v_off; | 1435 | 10.7M | if (div) { | 1436 | 24.2M | for (n = 0; n < 32; n++) { | 1437 | 23.5M | X[0][i][ n] = -X[0][i][n]; | 1438 | 23.5M | X[0][i][32+n] = X[1][i][31-n]; | 1439 | 23.5M | } | 1440 | 734k | mdct_fn(mdct, mdct_buf[0], X[0][i], sizeof(INTFLOAT)); | 1441 | 734k | sbrdsp->qmf_deint_neg(v, mdct_buf[0]); | 1442 | 10.0M | } else { | 1443 | 10.0M | sbrdsp->neg_odd_64(X[1][i]); | 1444 | 10.0M | mdct_fn(mdct, mdct_buf[0], X[0][i], sizeof(INTFLOAT)); | 1445 | 10.0M | mdct_fn(mdct, mdct_buf[1], X[1][i], sizeof(INTFLOAT)); | 1446 | 10.0M | sbrdsp->qmf_deint_bfly(v, mdct_buf[1], mdct_buf[0]); | 1447 | 10.0M | } | 1448 | 10.7M | dsp->vector_fmul (out, v , sbr_qmf_window , 64 >> div); | 1449 | 10.7M | dsp->vector_fmul_add(out, v + ( 192 >> div), sbr_qmf_window + ( 64 >> div), out , 64 >> div); | 1450 | 10.7M | dsp->vector_fmul_add(out, v + ( 256 >> div), sbr_qmf_window + (128 >> div), out , 64 >> div); | 1451 | 10.7M | dsp->vector_fmul_add(out, v + ( 448 >> div), sbr_qmf_window + (192 >> div), out , 64 >> div); | 1452 | 10.7M | dsp->vector_fmul_add(out, v + ( 512 >> div), sbr_qmf_window + (256 >> div), out , 64 >> div); | 1453 | 10.7M | dsp->vector_fmul_add(out, v + ( 704 >> div), sbr_qmf_window + (320 >> div), out , 64 >> div); | 1454 | 10.7M | dsp->vector_fmul_add(out, v + ( 768 >> div), sbr_qmf_window + (384 >> div), out , 64 >> div); | 1455 | 10.7M | dsp->vector_fmul_add(out, v + ( 960 >> div), sbr_qmf_window + (448 >> div), out , 64 >> div); | 1456 | 10.7M | dsp->vector_fmul_add(out, v + (1024 >> div), sbr_qmf_window + (512 >> div), out , 64 >> div); | 1457 | 10.7M | dsp->vector_fmul_add(out, v + (1216 >> div), sbr_qmf_window + (576 >> div), out , 64 >> div); | 1458 | 10.7M | out += 64 >> div; | 1459 | 10.7M | } | 1460 | 335k | } |
|
1461 | | #endif |
1462 | | |
1463 | | /// Generate the subband filtered lowband |
1464 | | static int sbr_lf_gen(SpectralBandReplication *sbr, |
1465 | | INTFLOAT X_low[32][40][2], const INTFLOAT W[2][32][32][2], |
1466 | | int buf_idx) |
1467 | 1.25M | { |
1468 | 1.25M | int i, k; |
1469 | 1.25M | const int t_HFGen = 8; |
1470 | 1.25M | const int i_f = 32; |
1471 | 1.25M | memset(X_low, 0, 32*sizeof(*X_low)); |
1472 | 40.2M | for (k = 0; k < sbr->kx[1]; k++) { |
1473 | 1.28G | for (i = t_HFGen; i < i_f + t_HFGen; i++) { |
1474 | 1.24G | X_low[k][i][0] = W[buf_idx][i - t_HFGen][k][0]; |
1475 | 1.24G | X_low[k][i][1] = W[buf_idx][i - t_HFGen][k][1]; |
1476 | 1.24G | } |
1477 | 39.0M | } |
1478 | 1.25M | buf_idx = 1-buf_idx; |
1479 | 40.5M | for (k = 0; k < sbr->kx[0]; k++) { |
1480 | 353M | for (i = 0; i < t_HFGen; i++) { |
1481 | 314M | X_low[k][i][0] = W[buf_idx][i + i_f - t_HFGen][k][0]; |
1482 | 314M | X_low[k][i][1] = W[buf_idx][i + i_f - t_HFGen][k][1]; |
1483 | 314M | } |
1484 | 39.2M | } |
1485 | 1.25M | return 0; |
1486 | 1.25M | } Line | Count | Source | 1467 | 985k | { | 1468 | 985k | int i, k; | 1469 | 985k | const int t_HFGen = 8; | 1470 | 985k | const int i_f = 32; | 1471 | 985k | memset(X_low, 0, 32*sizeof(*X_low)); | 1472 | 32.0M | for (k = 0; k < sbr->kx[1]; k++) { | 1473 | 1.02G | for (i = t_HFGen; i < i_f + t_HFGen; i++) { | 1474 | 993M | X_low[k][i][0] = W[buf_idx][i - t_HFGen][k][0]; | 1475 | 993M | X_low[k][i][1] = W[buf_idx][i - t_HFGen][k][1]; | 1476 | 993M | } | 1477 | 31.0M | } | 1478 | 985k | buf_idx = 1-buf_idx; | 1479 | 32.1M | for (k = 0; k < sbr->kx[0]; k++) { | 1480 | 280M | for (i = 0; i < t_HFGen; i++) { | 1481 | 249M | X_low[k][i][0] = W[buf_idx][i + i_f - t_HFGen][k][0]; | 1482 | 249M | X_low[k][i][1] = W[buf_idx][i + i_f - t_HFGen][k][1]; | 1483 | 249M | } | 1484 | 31.1M | } | 1485 | 985k | return 0; | 1486 | 985k | } |
aacsbr_fixed.c:sbr_lf_gen Line | Count | Source | 1467 | 272k | { | 1468 | 272k | int i, k; | 1469 | 272k | const int t_HFGen = 8; | 1470 | 272k | const int i_f = 32; | 1471 | 272k | memset(X_low, 0, 32*sizeof(*X_low)); | 1472 | 8.27M | for (k = 0; k < sbr->kx[1]; k++) { | 1473 | 264M | for (i = t_HFGen; i < i_f + t_HFGen; i++) { | 1474 | 256M | X_low[k][i][0] = W[buf_idx][i - t_HFGen][k][0]; | 1475 | 256M | X_low[k][i][1] = W[buf_idx][i - t_HFGen][k][1]; | 1476 | 256M | } | 1477 | 8.00M | } | 1478 | 272k | buf_idx = 1-buf_idx; | 1479 | 8.37M | for (k = 0; k < sbr->kx[0]; k++) { | 1480 | 72.8M | for (i = 0; i < t_HFGen; i++) { | 1481 | 64.7M | X_low[k][i][0] = W[buf_idx][i + i_f - t_HFGen][k][0]; | 1482 | 64.7M | X_low[k][i][1] = W[buf_idx][i + i_f - t_HFGen][k][1]; | 1483 | 64.7M | } | 1484 | 8.09M | } | 1485 | 272k | return 0; | 1486 | 272k | } |
|
1487 | | |
1488 | | /// High Frequency Generator (14496-3 sp04 p215) |
1489 | | static int sbr_hf_gen(AACDecContext *ac, SpectralBandReplication *sbr, |
1490 | | INTFLOAT X_high[64][40][2], const INTFLOAT X_low[32][40][2], |
1491 | | const INTFLOAT (*alpha0)[2], const INTFLOAT (*alpha1)[2], |
1492 | | const INTFLOAT bw_array[5], const uint8_t *t_env, |
1493 | | int bs_num_env) |
1494 | 128k | { |
1495 | 128k | int j, x; |
1496 | 128k | int g = 0; |
1497 | 128k | int k = sbr->kx[1]; |
1498 | 382k | for (j = 0; j < sbr->num_patches; j++) { |
1499 | 2.87M | for (x = 0; x < sbr->patch_num_subbands[j]; x++, k++) { |
1500 | 2.62M | const int p = sbr->patch_start_subband[j] + x; |
1501 | 5.33M | while (g <= sbr->n_q && k >= sbr->f_tablenoise[g]) |
1502 | 2.71M | g++; |
1503 | 2.62M | g--; |
1504 | | |
1505 | 2.62M | if (g < 0) { |
1506 | 0 | av_log(ac->avctx, AV_LOG_ERROR, |
1507 | 0 | "ERROR : no subband found for frequency %d\n", k); |
1508 | 0 | return -1; |
1509 | 0 | } |
1510 | | |
1511 | 2.62M | sbr->dsp.hf_gen(X_high[k] + ENVELOPE_ADJUSTMENT_OFFSET, |
1512 | 2.62M | X_low[p] + ENVELOPE_ADJUSTMENT_OFFSET, |
1513 | 2.62M | alpha0[p], alpha1[p], bw_array[g], |
1514 | 2.62M | 2 * t_env[0], 2 * t_env[bs_num_env]); |
1515 | 2.62M | } |
1516 | 254k | } |
1517 | 128k | if (k < sbr->m[1] + sbr->kx[1]) |
1518 | 1.50k | memset(X_high + k, 0, (sbr->m[1] + sbr->kx[1] - k) * sizeof(*X_high)); |
1519 | | |
1520 | 128k | return 0; |
1521 | 128k | } Line | Count | Source | 1494 | 34.4k | { | 1495 | 34.4k | int j, x; | 1496 | 34.4k | int g = 0; | 1497 | 34.4k | int k = sbr->kx[1]; | 1498 | 116k | for (j = 0; j < sbr->num_patches; j++) { | 1499 | 861k | for (x = 0; x < sbr->patch_num_subbands[j]; x++, k++) { | 1500 | 780k | const int p = sbr->patch_start_subband[j] + x; | 1501 | 1.60M | while (g <= sbr->n_q && k >= sbr->f_tablenoise[g]) | 1502 | 823k | g++; | 1503 | 780k | g--; | 1504 | | | 1505 | 780k | if (g < 0) { | 1506 | 0 | av_log(ac->avctx, AV_LOG_ERROR, | 1507 | 0 | "ERROR : no subband found for frequency %d\n", k); | 1508 | 0 | return -1; | 1509 | 0 | } | 1510 | | | 1511 | 780k | sbr->dsp.hf_gen(X_high[k] + ENVELOPE_ADJUSTMENT_OFFSET, | 1512 | 780k | X_low[p] + ENVELOPE_ADJUSTMENT_OFFSET, | 1513 | 780k | alpha0[p], alpha1[p], bw_array[g], | 1514 | 780k | 2 * t_env[0], 2 * t_env[bs_num_env]); | 1515 | 780k | } | 1516 | 81.5k | } | 1517 | 34.4k | if (k < sbr->m[1] + sbr->kx[1]) | 1518 | 889 | memset(X_high + k, 0, (sbr->m[1] + sbr->kx[1] - k) * sizeof(*X_high)); | 1519 | | | 1520 | 34.4k | return 0; | 1521 | 34.4k | } |
aacsbr_fixed.c:sbr_hf_gen Line | Count | Source | 1494 | 93.8k | { | 1495 | 93.8k | int j, x; | 1496 | 93.8k | int g = 0; | 1497 | 93.8k | int k = sbr->kx[1]; | 1498 | 266k | for (j = 0; j < sbr->num_patches; j++) { | 1499 | 2.01M | for (x = 0; x < sbr->patch_num_subbands[j]; x++, k++) { | 1500 | 1.84M | const int p = sbr->patch_start_subband[j] + x; | 1501 | 3.73M | while (g <= sbr->n_q && k >= sbr->f_tablenoise[g]) | 1502 | 1.88M | g++; | 1503 | 1.84M | g--; | 1504 | | | 1505 | 1.84M | if (g < 0) { | 1506 | 0 | av_log(ac->avctx, AV_LOG_ERROR, | 1507 | 0 | "ERROR : no subband found for frequency %d\n", k); | 1508 | 0 | return -1; | 1509 | 0 | } | 1510 | | | 1511 | 1.84M | sbr->dsp.hf_gen(X_high[k] + ENVELOPE_ADJUSTMENT_OFFSET, | 1512 | 1.84M | X_low[p] + ENVELOPE_ADJUSTMENT_OFFSET, | 1513 | 1.84M | alpha0[p], alpha1[p], bw_array[g], | 1514 | 1.84M | 2 * t_env[0], 2 * t_env[bs_num_env]); | 1515 | 1.84M | } | 1516 | 172k | } | 1517 | 93.8k | if (k < sbr->m[1] + sbr->kx[1]) | 1518 | 617 | memset(X_high + k, 0, (sbr->m[1] + sbr->kx[1] - k) * sizeof(*X_high)); | 1519 | | | 1520 | 93.8k | return 0; | 1521 | 93.8k | } |
|
1522 | | |
1523 | | /// Generate the subband filtered lowband |
1524 | | static int sbr_x_gen(SpectralBandReplication *sbr, INTFLOAT X[2][38][64], |
1525 | | const INTFLOAT Y0[38][64][2], const INTFLOAT Y1[38][64][2], |
1526 | | const INTFLOAT X_low[32][40][2], int ch) |
1527 | 1.25M | { |
1528 | 1.25M | int k, i; |
1529 | 1.25M | const int i_f = 32; |
1530 | 1.25M | const int i_Temp = FFMAX(2*sbr->data[ch].t_env_num_env_old - i_f, 0); |
1531 | 1.25M | memset(X, 0, 2*sizeof(*X)); |
1532 | 40.5M | for (k = 0; k < sbr->kx[0]; k++) { |
1533 | 57.0M | for (i = 0; i < i_Temp; i++) { |
1534 | 17.8M | X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0]; |
1535 | 17.8M | X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1]; |
1536 | 17.8M | } |
1537 | 39.2M | } |
1538 | 3.44M | for (; k < sbr->kx[0] + sbr->m[0]; k++) { |
1539 | 6.43M | for (i = 0; i < i_Temp; i++) { |
1540 | 4.24M | X[0][i][k] = Y0[i + i_f][k][0]; |
1541 | 4.24M | X[1][i][k] = Y0[i + i_f][k][1]; |
1542 | 4.24M | } |
1543 | 2.18M | } |
1544 | | |
1545 | 40.2M | for (k = 0; k < sbr->kx[1]; k++) { |
1546 | 1.50G | for (i = i_Temp; i < 38; i++) { |
1547 | 1.46G | X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0]; |
1548 | 1.46G | X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1]; |
1549 | 1.46G | } |
1550 | 39.0M | } |
1551 | 3.88M | for (; k < sbr->kx[1] + sbr->m[1]; k++) { |
1552 | 81.2M | for (i = i_Temp; i < i_f; i++) { |
1553 | 78.6M | X[0][i][k] = Y1[i][k][0]; |
1554 | 78.6M | X[1][i][k] = Y1[i][k][1]; |
1555 | 78.6M | } |
1556 | 2.62M | } |
1557 | 1.25M | return 0; |
1558 | 1.25M | } Line | Count | Source | 1527 | 985k | { | 1528 | 985k | int k, i; | 1529 | 985k | const int i_f = 32; | 1530 | 985k | const int i_Temp = FFMAX(2*sbr->data[ch].t_env_num_env_old - i_f, 0); | 1531 | 985k | memset(X, 0, 2*sizeof(*X)); | 1532 | 32.1M | for (k = 0; k < sbr->kx[0]; k++) { | 1533 | 36.6M | for (i = 0; i < i_Temp; i++) { | 1534 | 5.48M | X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0]; | 1535 | 5.48M | X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1]; | 1536 | 5.48M | } | 1537 | 31.1M | } | 1538 | 1.58M | for (; k < sbr->kx[0] + sbr->m[0]; k++) { | 1539 | 995k | for (i = 0; i < i_Temp; i++) { | 1540 | 399k | X[0][i][k] = Y0[i + i_f][k][0]; | 1541 | 399k | X[1][i][k] = Y0[i + i_f][k][1]; | 1542 | 399k | } | 1543 | 595k | } | 1544 | | | 1545 | 32.0M | for (k = 0; k < sbr->kx[1]; k++) { | 1546 | 1.20G | for (i = i_Temp; i < 38; i++) { | 1547 | 1.17G | X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0]; | 1548 | 1.17G | X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1]; | 1549 | 1.17G | } | 1550 | 31.0M | } | 1551 | 1.76M | for (; k < sbr->kx[1] + sbr->m[1]; k++) { | 1552 | 25.2M | for (i = i_Temp; i < i_f; i++) { | 1553 | 24.4M | X[0][i][k] = Y1[i][k][0]; | 1554 | 24.4M | X[1][i][k] = Y1[i][k][1]; | 1555 | 24.4M | } | 1556 | 781k | } | 1557 | 985k | return 0; | 1558 | 985k | } |
Line | Count | Source | 1527 | 272k | { | 1528 | 272k | int k, i; | 1529 | 272k | const int i_f = 32; | 1530 | 272k | const int i_Temp = FFMAX(2*sbr->data[ch].t_env_num_env_old - i_f, 0); | 1531 | 272k | memset(X, 0, 2*sizeof(*X)); | 1532 | 8.37M | for (k = 0; k < sbr->kx[0]; k++) { | 1533 | 20.4M | for (i = 0; i < i_Temp; i++) { | 1534 | 12.3M | X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0]; | 1535 | 12.3M | X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1]; | 1536 | 12.3M | } | 1537 | 8.09M | } | 1538 | 1.86M | for (; k < sbr->kx[0] + sbr->m[0]; k++) { | 1539 | 5.43M | for (i = 0; i < i_Temp; i++) { | 1540 | 3.84M | X[0][i][k] = Y0[i + i_f][k][0]; | 1541 | 3.84M | X[1][i][k] = Y0[i + i_f][k][1]; | 1542 | 3.84M | } | 1543 | 1.58M | } | 1544 | | | 1545 | 8.27M | for (k = 0; k < sbr->kx[1]; k++) { | 1546 | 299M | for (i = i_Temp; i < 38; i++) { | 1547 | 291M | X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0]; | 1548 | 291M | X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1]; | 1549 | 291M | } | 1550 | 8.00M | } | 1551 | 2.11M | for (; k < sbr->kx[1] + sbr->m[1]; k++) { | 1552 | 55.9M | for (i = i_Temp; i < i_f; i++) { | 1553 | 54.1M | X[0][i][k] = Y1[i][k][0]; | 1554 | 54.1M | X[1][i][k] = Y1[i][k][1]; | 1555 | 54.1M | } | 1556 | 1.84M | } | 1557 | 272k | return 0; | 1558 | 272k | } |
|
1559 | | |
1560 | | /** High Frequency Adjustment (14496-3 sp04 p217) and Mapping |
1561 | | * (14496-3 sp04 p217) |
1562 | | */ |
1563 | | static int sbr_mapping(AACDecContext *ac, SpectralBandReplication *sbr, |
1564 | | SBRData *ch_data, int e_a[2]) |
1565 | 128k | { |
1566 | 128k | int e, i, m; |
1567 | | |
1568 | 128k | memset(ch_data->s_indexmapped[1], 0, 7*sizeof(ch_data->s_indexmapped[1])); |
1569 | 423k | for (e = 0; e < ch_data->bs_num_env; e++) { |
1570 | 294k | const unsigned int ilim = sbr->n[ch_data->bs_freq_res[e + 1]]; |
1571 | 294k | uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow; |
1572 | 294k | int k; |
1573 | | |
1574 | 294k | if (sbr->kx[1] != table[0]) { |
1575 | 0 | av_log(ac->avctx, AV_LOG_ERROR, "kx != f_table{high,low}[0]. " |
1576 | 0 | "Derived frequency tables were not regenerated.\n"); |
1577 | 0 | sbr_turnoff(sbr); |
1578 | 0 | return AVERROR_BUG; |
1579 | 0 | } |
1580 | 1.78M | for (i = 0; i < ilim; i++) |
1581 | 7.03M | for (m = table[i]; m < table[i + 1]; m++) |
1582 | 5.54M | sbr->e_origmapped[e][m - sbr->kx[1]] = ch_data->env_facs[e+1][i]; |
1583 | | |
1584 | | // ch_data->bs_num_noise > 1 => 2 noise floors |
1585 | 294k | k = (ch_data->bs_num_noise > 1) && (ch_data->t_env[e] >= ch_data->t_q[1]); |
1586 | 721k | for (i = 0; i < sbr->n_q; i++) |
1587 | 5.97M | for (m = sbr->f_tablenoise[i]; m < sbr->f_tablenoise[i + 1]; m++) |
1588 | 5.54M | sbr->q_mapped[e][m - sbr->kx[1]] = ch_data->noise_facs[k+1][i]; |
1589 | | |
1590 | 2.45M | for (i = 0; i < sbr->n[1]; i++) { |
1591 | 2.15M | if (ch_data->bs_add_harmonic_flag) { |
1592 | 424k | const unsigned int m_midpoint = |
1593 | 424k | (sbr->f_tablehigh[i] + sbr->f_tablehigh[i + 1]) >> 1; |
1594 | | |
1595 | 424k | ch_data->s_indexmapped[e + 1][m_midpoint - sbr->kx[1]] = ch_data->bs_add_harmonic[i] * |
1596 | 424k | (e >= e_a[1] || (ch_data->s_indexmapped[0][m_midpoint - sbr->kx[1]] == 1)); |
1597 | 424k | } |
1598 | 2.15M | } |
1599 | | |
1600 | 1.78M | for (i = 0; i < ilim; i++) { |
1601 | 1.48M | int additional_sinusoid_present = 0; |
1602 | 6.60M | for (m = table[i]; m < table[i + 1]; m++) { |
1603 | 5.33M | if (ch_data->s_indexmapped[e + 1][m - sbr->kx[1]]) { |
1604 | 214k | additional_sinusoid_present = 1; |
1605 | 214k | break; |
1606 | 214k | } |
1607 | 5.33M | } |
1608 | 1.48M | memset(&sbr->s_mapped[e][table[i] - sbr->kx[1]], additional_sinusoid_present, |
1609 | 1.48M | (table[i + 1] - table[i]) * sizeof(sbr->s_mapped[e][0])); |
1610 | 1.48M | } |
1611 | 294k | } |
1612 | | |
1613 | 128k | memcpy(ch_data->s_indexmapped[0], ch_data->s_indexmapped[ch_data->bs_num_env], sizeof(ch_data->s_indexmapped[0])); |
1614 | 128k | return 0; |
1615 | 128k | } Line | Count | Source | 1565 | 34.4k | { | 1566 | 34.4k | int e, i, m; | 1567 | | | 1568 | 34.4k | memset(ch_data->s_indexmapped[1], 0, 7*sizeof(ch_data->s_indexmapped[1])); | 1569 | 84.8k | for (e = 0; e < ch_data->bs_num_env; e++) { | 1570 | 50.3k | const unsigned int ilim = sbr->n[ch_data->bs_freq_res[e + 1]]; | 1571 | 50.3k | uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow; | 1572 | 50.3k | int k; | 1573 | | | 1574 | 50.3k | if (sbr->kx[1] != table[0]) { | 1575 | 0 | av_log(ac->avctx, AV_LOG_ERROR, "kx != f_table{high,low}[0]. " | 1576 | 0 | "Derived frequency tables were not regenerated.\n"); | 1577 | 0 | sbr_turnoff(sbr); | 1578 | 0 | return AVERROR_BUG; | 1579 | 0 | } | 1580 | 310k | for (i = 0; i < ilim; i++) | 1581 | 1.20M | for (m = table[i]; m < table[i + 1]; m++) | 1582 | 945k | sbr->e_origmapped[e][m - sbr->kx[1]] = ch_data->env_facs[e+1][i]; | 1583 | | | 1584 | | // ch_data->bs_num_noise > 1 => 2 noise floors | 1585 | 50.3k | k = (ch_data->bs_num_noise > 1) && (ch_data->t_env[e] >= ch_data->t_q[1]); | 1586 | 152k | for (i = 0; i < sbr->n_q; i++) | 1587 | 1.04M | for (m = sbr->f_tablenoise[i]; m < sbr->f_tablenoise[i + 1]; m++) | 1588 | 945k | sbr->q_mapped[e][m - sbr->kx[1]] = ch_data->noise_facs[k+1][i]; | 1589 | | | 1590 | 493k | for (i = 0; i < sbr->n[1]; i++) { | 1591 | 443k | if (ch_data->bs_add_harmonic_flag) { | 1592 | 53.9k | const unsigned int m_midpoint = | 1593 | 53.9k | (sbr->f_tablehigh[i] + sbr->f_tablehigh[i + 1]) >> 1; | 1594 | | | 1595 | 53.9k | ch_data->s_indexmapped[e + 1][m_midpoint - sbr->kx[1]] = ch_data->bs_add_harmonic[i] * | 1596 | 53.9k | (e >= e_a[1] || (ch_data->s_indexmapped[0][m_midpoint - sbr->kx[1]] == 1)); | 1597 | 53.9k | } | 1598 | 443k | } | 1599 | | | 1600 | 310k | for (i = 0; i < ilim; i++) { | 1601 | 259k | int additional_sinusoid_present = 0; | 1602 | 1.16M | for (m = table[i]; m < table[i + 1]; m++) { | 1603 | 926k | if (ch_data->s_indexmapped[e + 1][m - sbr->kx[1]]) { | 1604 | 17.4k | additional_sinusoid_present = 1; | 1605 | 17.4k | break; | 1606 | 17.4k | } | 1607 | 926k | } | 1608 | 259k | memset(&sbr->s_mapped[e][table[i] - sbr->kx[1]], additional_sinusoid_present, | 1609 | 259k | (table[i + 1] - table[i]) * sizeof(sbr->s_mapped[e][0])); | 1610 | 259k | } | 1611 | 50.3k | } | 1612 | | | 1613 | 34.4k | memcpy(ch_data->s_indexmapped[0], ch_data->s_indexmapped[ch_data->bs_num_env], sizeof(ch_data->s_indexmapped[0])); | 1614 | 34.4k | return 0; | 1615 | 34.4k | } |
aacsbr_fixed.c:sbr_mapping Line | Count | Source | 1565 | 93.8k | { | 1566 | 93.8k | int e, i, m; | 1567 | | | 1568 | 93.8k | memset(ch_data->s_indexmapped[1], 0, 7*sizeof(ch_data->s_indexmapped[1])); | 1569 | 338k | for (e = 0; e < ch_data->bs_num_env; e++) { | 1570 | 244k | const unsigned int ilim = sbr->n[ch_data->bs_freq_res[e + 1]]; | 1571 | 244k | uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow; | 1572 | 244k | int k; | 1573 | | | 1574 | 244k | if (sbr->kx[1] != table[0]) { | 1575 | 0 | av_log(ac->avctx, AV_LOG_ERROR, "kx != f_table{high,low}[0]. " | 1576 | 0 | "Derived frequency tables were not regenerated.\n"); | 1577 | 0 | sbr_turnoff(sbr); | 1578 | 0 | return AVERROR_BUG; | 1579 | 0 | } | 1580 | 1.47M | for (i = 0; i < ilim; i++) | 1581 | 5.83M | for (m = table[i]; m < table[i + 1]; m++) | 1582 | 4.60M | sbr->e_origmapped[e][m - sbr->kx[1]] = ch_data->env_facs[e+1][i]; | 1583 | | | 1584 | | // ch_data->bs_num_noise > 1 => 2 noise floors | 1585 | 244k | k = (ch_data->bs_num_noise > 1) && (ch_data->t_env[e] >= ch_data->t_q[1]); | 1586 | 569k | for (i = 0; i < sbr->n_q; i++) | 1587 | 4.92M | for (m = sbr->f_tablenoise[i]; m < sbr->f_tablenoise[i + 1]; m++) | 1588 | 4.60M | sbr->q_mapped[e][m - sbr->kx[1]] = ch_data->noise_facs[k+1][i]; | 1589 | | | 1590 | 1.95M | for (i = 0; i < sbr->n[1]; i++) { | 1591 | 1.71M | if (ch_data->bs_add_harmonic_flag) { | 1592 | 370k | const unsigned int m_midpoint = | 1593 | 370k | (sbr->f_tablehigh[i] + sbr->f_tablehigh[i + 1]) >> 1; | 1594 | | | 1595 | 370k | ch_data->s_indexmapped[e + 1][m_midpoint - sbr->kx[1]] = ch_data->bs_add_harmonic[i] * | 1596 | 370k | (e >= e_a[1] || (ch_data->s_indexmapped[0][m_midpoint - sbr->kx[1]] == 1)); | 1597 | 370k | } | 1598 | 1.71M | } | 1599 | | | 1600 | 1.47M | for (i = 0; i < ilim; i++) { | 1601 | 1.22M | int additional_sinusoid_present = 0; | 1602 | 5.43M | for (m = table[i]; m < table[i + 1]; m++) { | 1603 | 4.40M | if (ch_data->s_indexmapped[e + 1][m - sbr->kx[1]]) { | 1604 | 197k | additional_sinusoid_present = 1; | 1605 | 197k | break; | 1606 | 197k | } | 1607 | 4.40M | } | 1608 | 1.22M | memset(&sbr->s_mapped[e][table[i] - sbr->kx[1]], additional_sinusoid_present, | 1609 | 1.22M | (table[i + 1] - table[i]) * sizeof(sbr->s_mapped[e][0])); | 1610 | 1.22M | } | 1611 | 244k | } | 1612 | | | 1613 | 93.8k | memcpy(ch_data->s_indexmapped[0], ch_data->s_indexmapped[ch_data->bs_num_env], sizeof(ch_data->s_indexmapped[0])); | 1614 | 93.8k | return 0; | 1615 | 93.8k | } |
|
1616 | | |
1617 | | /// Estimation of current envelope (14496-3 sp04 p218) |
1618 | | static void sbr_env_estimate(AAC_FLOAT (*e_curr)[48], INTFLOAT X_high[64][40][2], |
1619 | | SpectralBandReplication *sbr, SBRData *ch_data) |
1620 | 128k | { |
1621 | 128k | int e, m; |
1622 | 128k | int kx1 = sbr->kx[1]; |
1623 | | |
1624 | 128k | if (sbr->bs_interpol_freq) { |
1625 | 201k | for (e = 0; e < ch_data->bs_num_env; e++) { |
1626 | | #if USE_FIXED |
1627 | | const SoftFloat recip_env_size = av_int2sf(0x20000000 / (ch_data->t_env[e + 1] - ch_data->t_env[e]), 30); |
1628 | | #else |
1629 | | const float recip_env_size = 0.5f / (ch_data->t_env[e + 1] - ch_data->t_env[e]); |
1630 | | #endif /* USE_FIXED */ |
1631 | 129k | int ilb = ch_data->t_env[e] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; |
1632 | 129k | int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; |
1633 | | |
1634 | 129k | if (ilb >= 40) |
1635 | 1 | return; |
1636 | | |
1637 | 2.70M | for (m = 0; m < sbr->m[1]; m++) { |
1638 | 2.57M | AAC_FLOAT sum = sbr->dsp.sum_square(X_high[m+kx1] + ilb, iub - ilb); |
1639 | | #if USE_FIXED |
1640 | | e_curr[e][m] = av_mul_sf(sum, recip_env_size); |
1641 | | #else |
1642 | | e_curr[e][m] = sum * recip_env_size; |
1643 | | #endif /* USE_FIXED */ |
1644 | 2.57M | } |
1645 | 129k | } |
1646 | 72.3k | } else { |
1647 | 55.9k | int k, p; |
1648 | | |
1649 | 221k | for (e = 0; e < ch_data->bs_num_env; e++) { |
1650 | 165k | const int env_size = 2 * (ch_data->t_env[e + 1] - ch_data->t_env[e]); |
1651 | 165k | int ilb = ch_data->t_env[e] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; |
1652 | 165k | int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; |
1653 | 165k | const uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow; |
1654 | | |
1655 | 165k | if (ilb >= 40) |
1656 | 2 | return; |
1657 | | |
1658 | 1.02M | for (p = 0; p < sbr->n[ch_data->bs_freq_res[e + 1]]; p++) { |
1659 | | #if USE_FIXED |
1660 | | SoftFloat sum = FLOAT_0; |
1661 | | const SoftFloat den = av_int2sf(0x20000000 / (env_size * (table[p + 1] - table[p])), 29); |
1662 | 3.33M | for (k = table[p]; k < table[p + 1]; k++) { |
1663 | 2.57M | sum = av_add_sf(sum, sbr->dsp.sum_square(X_high[k] + ilb, iub - ilb)); |
1664 | 2.57M | } |
1665 | | sum = av_mul_sf(sum, den); |
1666 | | #else |
1667 | | float sum = 0.0f; |
1668 | | const int den = env_size * (table[p + 1] - table[p]); |
1669 | | |
1670 | 498k | for (k = table[p]; k < table[p + 1]; k++) { |
1671 | 395k | sum += sbr->dsp.sum_square(X_high[k] + ilb, iub - ilb); |
1672 | 395k | } |
1673 | | sum /= den; |
1674 | | #endif /* USE_FIXED */ |
1675 | 3.82M | for (k = table[p]; k < table[p + 1]; k++) { |
1676 | 2.96M | e_curr[e][k - kx1] = sum; |
1677 | 2.96M | } |
1678 | 860k | } |
1679 | 165k | } |
1680 | 55.9k | } |
1681 | 128k | } aacsbr.c:sbr_env_estimate Line | Count | Source | 1620 | 34.4k | { | 1621 | 34.4k | int e, m; | 1622 | 34.4k | int kx1 = sbr->kx[1]; | 1623 | | | 1624 | 34.4k | if (sbr->bs_interpol_freq) { | 1625 | 52.6k | for (e = 0; e < ch_data->bs_num_env; e++) { | 1626 | | #if USE_FIXED | 1627 | | const SoftFloat recip_env_size = av_int2sf(0x20000000 / (ch_data->t_env[e + 1] - ch_data->t_env[e]), 30); | 1628 | | #else | 1629 | 30.7k | const float recip_env_size = 0.5f / (ch_data->t_env[e + 1] - ch_data->t_env[e]); | 1630 | 30.7k | #endif /* USE_FIXED */ | 1631 | 30.7k | int ilb = ch_data->t_env[e] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; | 1632 | 30.7k | int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; | 1633 | | | 1634 | 30.7k | if (ilb >= 40) | 1635 | 1 | return; | 1636 | | | 1637 | 580k | for (m = 0; m < sbr->m[1]; m++) { | 1638 | 549k | AAC_FLOAT sum = sbr->dsp.sum_square(X_high[m+kx1] + ilb, iub - ilb); | 1639 | | #if USE_FIXED | 1640 | | e_curr[e][m] = av_mul_sf(sum, recip_env_size); | 1641 | | #else | 1642 | 549k | e_curr[e][m] = sum * recip_env_size; | 1643 | 549k | #endif /* USE_FIXED */ | 1644 | 549k | } | 1645 | 30.7k | } | 1646 | 21.8k | } else { | 1647 | 12.5k | int k, p; | 1648 | | | 1649 | 32.1k | for (e = 0; e < ch_data->bs_num_env; e++) { | 1650 | 19.6k | const int env_size = 2 * (ch_data->t_env[e + 1] - ch_data->t_env[e]); | 1651 | 19.6k | int ilb = ch_data->t_env[e] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; | 1652 | 19.6k | int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; | 1653 | 19.6k | const uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow; | 1654 | | | 1655 | 19.6k | if (ilb >= 40) | 1656 | 2 | return; | 1657 | | | 1658 | 122k | for (p = 0; p < sbr->n[ch_data->bs_freq_res[e + 1]]; p++) { | 1659 | | #if USE_FIXED | 1660 | | SoftFloat sum = FLOAT_0; | 1661 | | const SoftFloat den = av_int2sf(0x20000000 / (env_size * (table[p + 1] - table[p])), 29); | 1662 | | for (k = table[p]; k < table[p + 1]; k++) { | 1663 | | sum = av_add_sf(sum, sbr->dsp.sum_square(X_high[k] + ilb, iub - ilb)); | 1664 | | } | 1665 | | sum = av_mul_sf(sum, den); | 1666 | | #else | 1667 | 102k | float sum = 0.0f; | 1668 | 102k | const int den = env_size * (table[p + 1] - table[p]); | 1669 | | | 1670 | 498k | for (k = table[p]; k < table[p + 1]; k++) { | 1671 | 395k | sum += sbr->dsp.sum_square(X_high[k] + ilb, iub - ilb); | 1672 | 395k | } | 1673 | 102k | sum /= den; | 1674 | 102k | #endif /* USE_FIXED */ | 1675 | 498k | for (k = table[p]; k < table[p + 1]; k++) { | 1676 | 395k | e_curr[e][k - kx1] = sum; | 1677 | 395k | } | 1678 | 102k | } | 1679 | 19.6k | } | 1680 | 12.5k | } | 1681 | 34.4k | } |
aacsbr_fixed.c:sbr_env_estimate Line | Count | Source | 1620 | 93.8k | { | 1621 | 93.8k | int e, m; | 1622 | 93.8k | int kx1 = sbr->kx[1]; | 1623 | | | 1624 | 93.8k | if (sbr->bs_interpol_freq) { | 1625 | 148k | for (e = 0; e < ch_data->bs_num_env; e++) { | 1626 | 98.4k | #if USE_FIXED | 1627 | 98.4k | const SoftFloat recip_env_size = av_int2sf(0x20000000 / (ch_data->t_env[e + 1] - ch_data->t_env[e]), 30); | 1628 | | #else | 1629 | | const float recip_env_size = 0.5f / (ch_data->t_env[e + 1] - ch_data->t_env[e]); | 1630 | | #endif /* USE_FIXED */ | 1631 | 98.4k | int ilb = ch_data->t_env[e] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; | 1632 | 98.4k | int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; | 1633 | | | 1634 | 98.4k | if (ilb >= 40) | 1635 | 0 | return; | 1636 | | | 1637 | 2.12M | for (m = 0; m < sbr->m[1]; m++) { | 1638 | 2.02M | AAC_FLOAT sum = sbr->dsp.sum_square(X_high[m+kx1] + ilb, iub - ilb); | 1639 | 2.02M | #if USE_FIXED | 1640 | 2.02M | e_curr[e][m] = av_mul_sf(sum, recip_env_size); | 1641 | | #else | 1642 | | e_curr[e][m] = sum * recip_env_size; | 1643 | | #endif /* USE_FIXED */ | 1644 | 2.02M | } | 1645 | 98.4k | } | 1646 | 50.4k | } else { | 1647 | 43.4k | int k, p; | 1648 | | | 1649 | 189k | for (e = 0; e < ch_data->bs_num_env; e++) { | 1650 | 145k | const int env_size = 2 * (ch_data->t_env[e + 1] - ch_data->t_env[e]); | 1651 | 145k | int ilb = ch_data->t_env[e] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; | 1652 | 145k | int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; | 1653 | 145k | const uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow; | 1654 | | | 1655 | 145k | if (ilb >= 40) | 1656 | 0 | return; | 1657 | | | 1658 | 903k | for (p = 0; p < sbr->n[ch_data->bs_freq_res[e + 1]]; p++) { | 1659 | 757k | #if USE_FIXED | 1660 | 757k | SoftFloat sum = FLOAT_0; | 1661 | 757k | const SoftFloat den = av_int2sf(0x20000000 / (env_size * (table[p + 1] - table[p])), 29); | 1662 | 3.33M | for (k = table[p]; k < table[p + 1]; k++) { | 1663 | 2.57M | sum = av_add_sf(sum, sbr->dsp.sum_square(X_high[k] + ilb, iub - ilb)); | 1664 | 2.57M | } | 1665 | 757k | sum = av_mul_sf(sum, den); | 1666 | | #else | 1667 | | float sum = 0.0f; | 1668 | | const int den = env_size * (table[p + 1] - table[p]); | 1669 | | | 1670 | | for (k = table[p]; k < table[p + 1]; k++) { | 1671 | | sum += sbr->dsp.sum_square(X_high[k] + ilb, iub - ilb); | 1672 | | } | 1673 | | sum /= den; | 1674 | | #endif /* USE_FIXED */ | 1675 | 3.33M | for (k = table[p]; k < table[p + 1]; k++) { | 1676 | 2.57M | e_curr[e][k - kx1] = sum; | 1677 | 2.57M | } | 1678 | 757k | } | 1679 | 145k | } | 1680 | 43.4k | } | 1681 | 93.8k | } |
|
1682 | | |
1683 | | void AAC_RENAME(ff_aac_sbr_apply)(AACDecContext *ac, ChannelElement *che, |
1684 | | int id_aac, void *L_, void *R_) |
1685 | 947k | { |
1686 | 947k | INTFLOAT *L = L_, *R = R_; |
1687 | 947k | SpectralBandReplication *sbr = get_sbr(che); |
1688 | 947k | int downsampled = ac->oc[1].m4ac.ext_sample_rate < sbr->sample_rate; |
1689 | 947k | int ch; |
1690 | 947k | int nch = (id_aac == TYPE_CPE) ? 2 : 1; |
1691 | 947k | int err; |
1692 | | |
1693 | 947k | if (id_aac != sbr->id_aac) { |
1694 | 1.81k | av_log(ac->avctx, id_aac == TYPE_LFE ? AV_LOG_VERBOSE : AV_LOG_WARNING, |
1695 | 1.81k | "element type mismatch %d != %d\n", id_aac, sbr->id_aac); |
1696 | 1.81k | sbr_turnoff(sbr); |
1697 | 1.81k | } |
1698 | | |
1699 | 947k | if (sbr->start && !sbr->ready_for_dequant) { |
1700 | 7.37k | av_log(ac->avctx, AV_LOG_ERROR, |
1701 | 7.37k | "No quantized data read for sbr_dequant.\n"); |
1702 | 7.37k | sbr_turnoff(sbr); |
1703 | 7.37k | } |
1704 | | |
1705 | 947k | if (!sbr->kx_and_m_pushed) { |
1706 | 140k | sbr->kx[0] = sbr->kx[1]; |
1707 | 140k | sbr->m[0] = sbr->m[1]; |
1708 | 807k | } else { |
1709 | 807k | sbr->kx_and_m_pushed = 0; |
1710 | 807k | } |
1711 | | |
1712 | 947k | if (sbr->start) { |
1713 | 81.4k | sbr_dequant(sbr, id_aac); |
1714 | 81.4k | sbr->ready_for_dequant = 0; |
1715 | 81.4k | } |
1716 | 2.20M | for (ch = 0; ch < nch; ch++) { |
1717 | | /* decode channel */ |
1718 | 1.25M | sbr_qmf_analysis(ac->fdsp, sbr->mdct_ana, sbr->mdct_ana_fn, &sbr->dsp, |
1719 | 1.25M | ch ? R : L, sbr->data[ch].analysis_filterbank_samples, |
1720 | 1.25M | (INTFLOAT*)sbr->qmf_filter_scratch, |
1721 | 1.25M | sbr->data[ch].W, sbr->data[ch].Ypos); |
1722 | 1.25M | sbr->c.sbr_lf_gen(sbr, sbr->X_low, |
1723 | 1.25M | (const INTFLOAT (*)[32][32][2]) sbr->data[ch].W, |
1724 | 1.25M | sbr->data[ch].Ypos); |
1725 | 1.25M | sbr->data[ch].Ypos ^= 1; |
1726 | 1.25M | if (sbr->start) { |
1727 | 128k | sbr->c.sbr_hf_inverse_filter(&sbr->dsp, sbr->alpha0, sbr->alpha1, |
1728 | 128k | (const INTFLOAT (*)[40][2]) sbr->X_low, sbr->k[0]); |
1729 | 128k | sbr_chirp(sbr, &sbr->data[ch]); |
1730 | 128k | av_assert0(sbr->data[ch].bs_num_env > 0); |
1731 | 128k | sbr_hf_gen(ac, sbr, sbr->X_high, |
1732 | 128k | (const INTFLOAT (*)[40][2]) sbr->X_low, |
1733 | 128k | (const INTFLOAT (*)[2]) sbr->alpha0, |
1734 | 128k | (const INTFLOAT (*)[2]) sbr->alpha1, |
1735 | 128k | sbr->data[ch].bw_array, sbr->data[ch].t_env, |
1736 | 128k | sbr->data[ch].bs_num_env); |
1737 | | |
1738 | | // hf_adj |
1739 | 128k | err = sbr_mapping(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a); |
1740 | 128k | if (!err) { |
1741 | 128k | sbr_env_estimate(sbr->e_curr, sbr->X_high, sbr, &sbr->data[ch]); |
1742 | 128k | sbr_gain_calc(sbr, &sbr->data[ch], sbr->data[ch].e_a); |
1743 | 128k | sbr->c.sbr_hf_assemble(sbr->data[ch].Y[sbr->data[ch].Ypos], |
1744 | 128k | (const INTFLOAT (*)[40][2]) sbr->X_high, |
1745 | 128k | sbr, &sbr->data[ch], |
1746 | 128k | sbr->data[ch].e_a); |
1747 | 128k | } |
1748 | 128k | } |
1749 | | |
1750 | | /* synthesis */ |
1751 | 1.25M | sbr->c.sbr_x_gen(sbr, sbr->X[ch], |
1752 | 1.25M | (const INTFLOAT (*)[64][2]) sbr->data[ch].Y[1-sbr->data[ch].Ypos], |
1753 | 1.25M | (const INTFLOAT (*)[64][2]) sbr->data[ch].Y[ sbr->data[ch].Ypos], |
1754 | 1.25M | (const INTFLOAT (*)[40][2]) sbr->X_low, ch); |
1755 | 1.25M | } |
1756 | | |
1757 | 947k | if (ac->oc[1].m4ac.ps == 1) { |
1758 | 105k | if (sbr->ps.common.start) { |
1759 | 46.2k | AAC_RENAME(ff_ps_apply)(&sbr->ps, sbr->X[0], sbr->X[1], sbr->kx[1] + sbr->m[1]); |
1760 | 59.2k | } else { |
1761 | 59.2k | memcpy(sbr->X[1], sbr->X[0], sizeof(sbr->X[0])); |
1762 | 59.2k | } |
1763 | 105k | nch = 2; |
1764 | 105k | } |
1765 | | |
1766 | 947k | sbr_qmf_synthesis(sbr->mdct, sbr->mdct_fn, &sbr->dsp, ac->fdsp, |
1767 | 947k | L, sbr->X[0], sbr->qmf_filter_scratch, |
1768 | 947k | sbr->data[0].synthesis_filterbank_samples, |
1769 | 947k | &sbr->data[0].synthesis_filterbank_samples_offset, |
1770 | 947k | downsampled); |
1771 | 947k | if (nch == 2) |
1772 | 403k | sbr_qmf_synthesis(sbr->mdct, sbr->mdct_fn, &sbr->dsp, ac->fdsp, |
1773 | 403k | R, sbr->X[1], sbr->qmf_filter_scratch, |
1774 | 403k | sbr->data[1].synthesis_filterbank_samples, |
1775 | 403k | &sbr->data[1].synthesis_filterbank_samples_offset, |
1776 | 403k | downsampled); |
1777 | 947k | } Line | Count | Source | 1685 | 750k | { | 1686 | 750k | INTFLOAT *L = L_, *R = R_; | 1687 | 750k | SpectralBandReplication *sbr = get_sbr(che); | 1688 | 750k | int downsampled = ac->oc[1].m4ac.ext_sample_rate < sbr->sample_rate; | 1689 | 750k | int ch; | 1690 | 750k | int nch = (id_aac == TYPE_CPE) ? 2 : 1; | 1691 | 750k | int err; | 1692 | | | 1693 | 750k | if (id_aac != sbr->id_aac) { | 1694 | 965 | av_log(ac->avctx, id_aac == TYPE_LFE ? AV_LOG_VERBOSE : AV_LOG_WARNING, | 1695 | 965 | "element type mismatch %d != %d\n", id_aac, sbr->id_aac); | 1696 | 965 | sbr_turnoff(sbr); | 1697 | 965 | } | 1698 | | | 1699 | 750k | if (sbr->start && !sbr->ready_for_dequant) { | 1700 | 676 | av_log(ac->avctx, AV_LOG_ERROR, | 1701 | 676 | "No quantized data read for sbr_dequant.\n"); | 1702 | 676 | sbr_turnoff(sbr); | 1703 | 676 | } | 1704 | | | 1705 | 750k | if (!sbr->kx_and_m_pushed) { | 1706 | 57.3k | sbr->kx[0] = sbr->kx[1]; | 1707 | 57.3k | sbr->m[0] = sbr->m[1]; | 1708 | 693k | } else { | 1709 | 693k | sbr->kx_and_m_pushed = 0; | 1710 | 693k | } | 1711 | | | 1712 | 750k | if (sbr->start) { | 1713 | 23.5k | sbr_dequant(sbr, id_aac); | 1714 | 23.5k | sbr->ready_for_dequant = 0; | 1715 | 23.5k | } | 1716 | 1.73M | for (ch = 0; ch < nch; ch++) { | 1717 | | /* decode channel */ | 1718 | 985k | sbr_qmf_analysis(ac->fdsp, sbr->mdct_ana, sbr->mdct_ana_fn, &sbr->dsp, | 1719 | 985k | ch ? R : L, sbr->data[ch].analysis_filterbank_samples, | 1720 | 985k | (INTFLOAT*)sbr->qmf_filter_scratch, | 1721 | 985k | sbr->data[ch].W, sbr->data[ch].Ypos); | 1722 | 985k | sbr->c.sbr_lf_gen(sbr, sbr->X_low, | 1723 | 985k | (const INTFLOAT (*)[32][32][2]) sbr->data[ch].W, | 1724 | 985k | sbr->data[ch].Ypos); | 1725 | 985k | sbr->data[ch].Ypos ^= 1; | 1726 | 985k | if (sbr->start) { | 1727 | 34.4k | sbr->c.sbr_hf_inverse_filter(&sbr->dsp, sbr->alpha0, sbr->alpha1, | 1728 | 34.4k | (const INTFLOAT (*)[40][2]) sbr->X_low, sbr->k[0]); | 1729 | 34.4k | sbr_chirp(sbr, &sbr->data[ch]); | 1730 | 34.4k | av_assert0(sbr->data[ch].bs_num_env > 0); | 1731 | 34.4k | sbr_hf_gen(ac, sbr, sbr->X_high, | 1732 | 34.4k | (const INTFLOAT (*)[40][2]) sbr->X_low, | 1733 | 34.4k | (const INTFLOAT (*)[2]) sbr->alpha0, | 1734 | 34.4k | (const INTFLOAT (*)[2]) sbr->alpha1, | 1735 | 34.4k | sbr->data[ch].bw_array, sbr->data[ch].t_env, | 1736 | 34.4k | sbr->data[ch].bs_num_env); | 1737 | | | 1738 | | // hf_adj | 1739 | 34.4k | err = sbr_mapping(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a); | 1740 | 34.4k | if (!err) { | 1741 | 34.4k | sbr_env_estimate(sbr->e_curr, sbr->X_high, sbr, &sbr->data[ch]); | 1742 | 34.4k | sbr_gain_calc(sbr, &sbr->data[ch], sbr->data[ch].e_a); | 1743 | 34.4k | sbr->c.sbr_hf_assemble(sbr->data[ch].Y[sbr->data[ch].Ypos], | 1744 | 34.4k | (const INTFLOAT (*)[40][2]) sbr->X_high, | 1745 | 34.4k | sbr, &sbr->data[ch], | 1746 | 34.4k | sbr->data[ch].e_a); | 1747 | 34.4k | } | 1748 | 34.4k | } | 1749 | | | 1750 | | /* synthesis */ | 1751 | 985k | sbr->c.sbr_x_gen(sbr, sbr->X[ch], | 1752 | 985k | (const INTFLOAT (*)[64][2]) sbr->data[ch].Y[1-sbr->data[ch].Ypos], | 1753 | 985k | (const INTFLOAT (*)[64][2]) sbr->data[ch].Y[ sbr->data[ch].Ypos], | 1754 | 985k | (const INTFLOAT (*)[40][2]) sbr->X_low, ch); | 1755 | 985k | } | 1756 | | | 1757 | 750k | if (ac->oc[1].m4ac.ps == 1) { | 1758 | 33.3k | if (sbr->ps.common.start) { | 1759 | 24.0k | AAC_RENAME(ff_ps_apply)(&sbr->ps, sbr->X[0], sbr->X[1], sbr->kx[1] + sbr->m[1]); | 1760 | 24.0k | } else { | 1761 | 9.23k | memcpy(sbr->X[1], sbr->X[0], sizeof(sbr->X[0])); | 1762 | 9.23k | } | 1763 | 33.3k | nch = 2; | 1764 | 33.3k | } | 1765 | | | 1766 | 750k | sbr_qmf_synthesis(sbr->mdct, sbr->mdct_fn, &sbr->dsp, ac->fdsp, | 1767 | 750k | L, sbr->X[0], sbr->qmf_filter_scratch, | 1768 | 750k | sbr->data[0].synthesis_filterbank_samples, | 1769 | 750k | &sbr->data[0].synthesis_filterbank_samples_offset, | 1770 | 750k | downsampled); | 1771 | 750k | if (nch == 2) | 1772 | 265k | sbr_qmf_synthesis(sbr->mdct, sbr->mdct_fn, &sbr->dsp, ac->fdsp, | 1773 | 265k | R, sbr->X[1], sbr->qmf_filter_scratch, | 1774 | 265k | sbr->data[1].synthesis_filterbank_samples, | 1775 | 265k | &sbr->data[1].synthesis_filterbank_samples_offset, | 1776 | 265k | downsampled); | 1777 | 750k | } |
Line | Count | Source | 1685 | 197k | { | 1686 | 197k | INTFLOAT *L = L_, *R = R_; | 1687 | 197k | SpectralBandReplication *sbr = get_sbr(che); | 1688 | 197k | int downsampled = ac->oc[1].m4ac.ext_sample_rate < sbr->sample_rate; | 1689 | 197k | int ch; | 1690 | 197k | int nch = (id_aac == TYPE_CPE) ? 2 : 1; | 1691 | 197k | int err; | 1692 | | | 1693 | 197k | if (id_aac != sbr->id_aac) { | 1694 | 851 | av_log(ac->avctx, id_aac == TYPE_LFE ? AV_LOG_VERBOSE : AV_LOG_WARNING, | 1695 | 851 | "element type mismatch %d != %d\n", id_aac, sbr->id_aac); | 1696 | 851 | sbr_turnoff(sbr); | 1697 | 851 | } | 1698 | | | 1699 | 197k | if (sbr->start && !sbr->ready_for_dequant) { | 1700 | 6.69k | av_log(ac->avctx, AV_LOG_ERROR, | 1701 | 6.69k | "No quantized data read for sbr_dequant.\n"); | 1702 | 6.69k | sbr_turnoff(sbr); | 1703 | 6.69k | } | 1704 | | | 1705 | 197k | if (!sbr->kx_and_m_pushed) { | 1706 | 83.2k | sbr->kx[0] = sbr->kx[1]; | 1707 | 83.2k | sbr->m[0] = sbr->m[1]; | 1708 | 113k | } else { | 1709 | 113k | sbr->kx_and_m_pushed = 0; | 1710 | 113k | } | 1711 | | | 1712 | 197k | if (sbr->start) { | 1713 | 57.8k | sbr_dequant(sbr, id_aac); | 1714 | 57.8k | sbr->ready_for_dequant = 0; | 1715 | 57.8k | } | 1716 | 469k | for (ch = 0; ch < nch; ch++) { | 1717 | | /* decode channel */ | 1718 | 272k | sbr_qmf_analysis(ac->fdsp, sbr->mdct_ana, sbr->mdct_ana_fn, &sbr->dsp, | 1719 | 272k | ch ? R : L, sbr->data[ch].analysis_filterbank_samples, | 1720 | 272k | (INTFLOAT*)sbr->qmf_filter_scratch, | 1721 | 272k | sbr->data[ch].W, sbr->data[ch].Ypos); | 1722 | 272k | sbr->c.sbr_lf_gen(sbr, sbr->X_low, | 1723 | 272k | (const INTFLOAT (*)[32][32][2]) sbr->data[ch].W, | 1724 | 272k | sbr->data[ch].Ypos); | 1725 | 272k | sbr->data[ch].Ypos ^= 1; | 1726 | 272k | if (sbr->start) { | 1727 | 93.8k | sbr->c.sbr_hf_inverse_filter(&sbr->dsp, sbr->alpha0, sbr->alpha1, | 1728 | 93.8k | (const INTFLOAT (*)[40][2]) sbr->X_low, sbr->k[0]); | 1729 | 93.8k | sbr_chirp(sbr, &sbr->data[ch]); | 1730 | 93.8k | av_assert0(sbr->data[ch].bs_num_env > 0); | 1731 | 93.8k | sbr_hf_gen(ac, sbr, sbr->X_high, | 1732 | 93.8k | (const INTFLOAT (*)[40][2]) sbr->X_low, | 1733 | 93.8k | (const INTFLOAT (*)[2]) sbr->alpha0, | 1734 | 93.8k | (const INTFLOAT (*)[2]) sbr->alpha1, | 1735 | 93.8k | sbr->data[ch].bw_array, sbr->data[ch].t_env, | 1736 | 93.8k | sbr->data[ch].bs_num_env); | 1737 | | | 1738 | | // hf_adj | 1739 | 93.8k | err = sbr_mapping(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a); | 1740 | 93.8k | if (!err) { | 1741 | 93.8k | sbr_env_estimate(sbr->e_curr, sbr->X_high, sbr, &sbr->data[ch]); | 1742 | 93.8k | sbr_gain_calc(sbr, &sbr->data[ch], sbr->data[ch].e_a); | 1743 | 93.8k | sbr->c.sbr_hf_assemble(sbr->data[ch].Y[sbr->data[ch].Ypos], | 1744 | 93.8k | (const INTFLOAT (*)[40][2]) sbr->X_high, | 1745 | 93.8k | sbr, &sbr->data[ch], | 1746 | 93.8k | sbr->data[ch].e_a); | 1747 | 93.8k | } | 1748 | 93.8k | } | 1749 | | | 1750 | | /* synthesis */ | 1751 | 272k | sbr->c.sbr_x_gen(sbr, sbr->X[ch], | 1752 | 272k | (const INTFLOAT (*)[64][2]) sbr->data[ch].Y[1-sbr->data[ch].Ypos], | 1753 | 272k | (const INTFLOAT (*)[64][2]) sbr->data[ch].Y[ sbr->data[ch].Ypos], | 1754 | 272k | (const INTFLOAT (*)[40][2]) sbr->X_low, ch); | 1755 | 272k | } | 1756 | | | 1757 | 197k | if (ac->oc[1].m4ac.ps == 1) { | 1758 | 72.1k | if (sbr->ps.common.start) { | 1759 | 22.1k | AAC_RENAME(ff_ps_apply)(&sbr->ps, sbr->X[0], sbr->X[1], sbr->kx[1] + sbr->m[1]); | 1760 | 50.0k | } else { | 1761 | 50.0k | memcpy(sbr->X[1], sbr->X[0], sizeof(sbr->X[0])); | 1762 | 50.0k | } | 1763 | 72.1k | nch = 2; | 1764 | 72.1k | } | 1765 | | | 1766 | 197k | sbr_qmf_synthesis(sbr->mdct, sbr->mdct_fn, &sbr->dsp, ac->fdsp, | 1767 | 197k | L, sbr->X[0], sbr->qmf_filter_scratch, | 1768 | 197k | sbr->data[0].synthesis_filterbank_samples, | 1769 | 197k | &sbr->data[0].synthesis_filterbank_samples_offset, | 1770 | 197k | downsampled); | 1771 | 197k | if (nch == 2) | 1772 | 138k | sbr_qmf_synthesis(sbr->mdct, sbr->mdct_fn, &sbr->dsp, ac->fdsp, | 1773 | 138k | R, sbr->X[1], sbr->qmf_filter_scratch, | 1774 | 138k | sbr->data[1].synthesis_filterbank_samples, | 1775 | 138k | &sbr->data[1].synthesis_filterbank_samples_offset, | 1776 | 138k | downsampled); | 1777 | 197k | } |
|
1778 | | |
1779 | | static void aacsbr_func_ptr_init(AACSBRContext *c) |
1780 | 149k | { |
1781 | 149k | c->sbr_lf_gen = sbr_lf_gen; |
1782 | 149k | c->sbr_hf_assemble = sbr_hf_assemble; |
1783 | 149k | c->sbr_x_gen = sbr_x_gen; |
1784 | 149k | c->sbr_hf_inverse_filter = sbr_hf_inverse_filter; |
1785 | 149k | } aacsbr.c:aacsbr_func_ptr_init Line | Count | Source | 1780 | 114k | { | 1781 | 114k | c->sbr_lf_gen = sbr_lf_gen; | 1782 | 114k | c->sbr_hf_assemble = sbr_hf_assemble; | 1783 | 114k | c->sbr_x_gen = sbr_x_gen; | 1784 | 114k | c->sbr_hf_inverse_filter = sbr_hf_inverse_filter; | 1785 | 114k | } |
aacsbr_fixed.c:aacsbr_func_ptr_init Line | Count | Source | 1780 | 34.3k | { | 1781 | 34.3k | c->sbr_lf_gen = sbr_lf_gen; | 1782 | 34.3k | c->sbr_hf_assemble = sbr_hf_assemble; | 1783 | 34.3k | c->sbr_x_gen = sbr_x_gen; | 1784 | 34.3k | c->sbr_hf_inverse_filter = sbr_hf_inverse_filter; | 1785 | 34.3k | } |
|