Mercurial > libavcodec.hg
annotate aac.c @ 11032:01bd040f8607 libavcodec
Unroll main loop so the edge==0 case is seperate.
This allows many things to be simplified away.
h264 decoder is overall 1% faster with a mbaff sample and
0.1% slower with the cathedral sample, probably because the slow loop
filter code must be loaded into the code cache for each first MB of each
row but isnt used for the following MBs.
| author | michael |
|---|---|
| date | Thu, 28 Jan 2010 01:24:25 +0000 |
| parents | 966a8afdd9aa |
| children | 134644e36859 |
| rev | line source |
|---|---|
| 7501 | 1 /* |
| 2 * AAC decoder | |
| 3 * Copyright (c) 2005-2006 Oded Shimon ( ods15 ods15 dyndns org ) | |
| 4 * Copyright (c) 2006-2007 Maxim Gavrilov ( maxim.gavrilov gmail com ) | |
| 5 * | |
| 6 * This file is part of FFmpeg. | |
| 7 * | |
| 8 * FFmpeg is free software; you can redistribute it and/or | |
| 9 * modify it under the terms of the GNU Lesser General Public | |
| 10 * License as published by the Free Software Foundation; either | |
| 11 * version 2.1 of the License, or (at your option) any later version. | |
| 12 * | |
| 13 * FFmpeg is distributed in the hope that it will be useful, | |
| 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 16 * Lesser General Public License for more details. | |
| 17 * | |
| 18 * You should have received a copy of the GNU Lesser General Public | |
| 19 * License along with FFmpeg; if not, write to the Free Software | |
| 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
| 21 */ | |
| 22 | |
| 23 /** | |
|
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8590
diff
changeset
|
24 * @file libavcodec/aac.c |
| 7501 | 25 * AAC decoder |
| 26 * @author Oded Shimon ( ods15 ods15 dyndns org ) | |
| 27 * @author Maxim Gavrilov ( maxim.gavrilov gmail com ) | |
| 28 */ | |
| 29 | |
| 30 /* | |
| 31 * supported tools | |
| 32 * | |
| 33 * Support? Name | |
| 34 * N (code in SoC repo) gain control | |
| 35 * Y block switching | |
| 36 * Y window shapes - standard | |
| 37 * N window shapes - Low Delay | |
| 38 * Y filterbank - standard | |
| 39 * N (code in SoC repo) filterbank - Scalable Sample Rate | |
| 40 * Y Temporal Noise Shaping | |
| 41 * N (code in SoC repo) Long Term Prediction | |
| 42 * Y intensity stereo | |
| 43 * Y channel coupling | |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
44 * Y frequency domain prediction |
| 7501 | 45 * Y Perceptual Noise Substitution |
| 46 * Y Mid/Side stereo | |
| 47 * N Scalable Inverse AAC Quantization | |
| 48 * N Frequency Selective Switch | |
| 49 * N upsampling filter | |
| 50 * Y quantization & coding - AAC | |
| 51 * N quantization & coding - TwinVQ | |
| 52 * N quantization & coding - BSAC | |
| 53 * N AAC Error Resilience tools | |
| 54 * N Error Resilience payload syntax | |
| 55 * N Error Protection tool | |
| 56 * N CELP | |
| 57 * N Silence Compression | |
| 58 * N HVXC | |
| 59 * N HVXC 4kbits/s VR | |
| 60 * N Structured Audio tools | |
| 61 * N Structured Audio Sample Bank Format | |
| 62 * N MIDI | |
| 63 * N Harmonic and Individual Lines plus Noise | |
| 64 * N Text-To-Speech Interface | |
| 65 * N (in progress) Spectral Band Replication | |
| 66 * Y (not in this code) Layer-1 | |
| 67 * Y (not in this code) Layer-2 | |
| 68 * Y (not in this code) Layer-3 | |
| 69 * N SinuSoidal Coding (Transient, Sinusoid, Noise) | |
| 70 * N (planned) Parametric Stereo | |
| 71 * N Direct Stream Transfer | |
| 72 * | |
| 73 * Note: - HE AAC v1 comprises LC AAC with Spectral Band Replication. | |
| 74 * - HE AAC v2 comprises LC AAC with Spectral Band Replication and | |
| 75 Parametric Stereo. | |
| 76 */ | |
| 77 | |
| 78 | |
| 79 #include "avcodec.h" | |
|
8281
f93efc084e41
Make av_log_missing_feature an internal function, and change its name
stefano
parents:
8200
diff
changeset
|
80 #include "internal.h" |
| 9428 | 81 #include "get_bits.h" |
| 7501 | 82 #include "dsputil.h" |
|
7788
ffd4b1364b62
Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
vitor
parents:
7733
diff
changeset
|
83 #include "lpc.h" |
| 7501 | 84 |
| 85 #include "aac.h" | |
| 86 #include "aactab.h" | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
87 #include "aacdectab.h" |
| 7501 | 88 #include "mpeg4audio.h" |
|
8549
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
89 #include "aac_parser.h" |
| 7501 | 90 |
| 91 #include <assert.h> | |
| 92 #include <errno.h> | |
| 93 #include <math.h> | |
| 94 #include <string.h> | |
| 95 | |
| 10881 | 96 #if ARCH_ARM |
| 97 # include "arm/aac.h" | |
| 98 #endif | |
| 99 | |
| 10004 | 100 union float754 { |
| 101 float f; | |
| 102 uint32_t i; | |
| 103 }; | |
|
9179
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
104 |
| 7501 | 105 static VLC vlc_scalefactors; |
| 106 static VLC vlc_spectral[11]; | |
| 107 | |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
108 static uint32_t cbrt_tab[1<<13]; |
| 7501 | 109 |
| 10004 | 110 static ChannelElement *get_che(AACContext *ac, int type, int elem_id) |
| 111 { | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
112 if (ac->tag_che_map[type][elem_id]) { |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
113 return ac->tag_che_map[type][elem_id]; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
114 } |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
115 if (ac->tags_mapped >= tags_per_config[ac->m4ac.chan_config]) { |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
116 return NULL; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
117 } |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
118 switch (ac->m4ac.chan_config) { |
| 10004 | 119 case 7: |
| 120 if (ac->tags_mapped == 3 && type == TYPE_CPE) { | |
| 121 ac->tags_mapped++; | |
| 122 return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][2]; | |
| 123 } | |
| 124 case 6: | |
| 125 /* Some streams incorrectly code 5.1 audio as SCE[0] CPE[0] CPE[1] SCE[1] | |
| 126 instead of SCE[0] CPE[0] CPE[0] LFE[0]. If we seem to have | |
| 127 encountered such a stream, transfer the LFE[0] element to SCE[1] */ | |
| 128 if (ac->tags_mapped == tags_per_config[ac->m4ac.chan_config] - 1 && (type == TYPE_LFE || type == TYPE_SCE)) { | |
| 129 ac->tags_mapped++; | |
| 130 return ac->tag_che_map[type][elem_id] = ac->che[TYPE_LFE][0]; | |
| 131 } | |
| 132 case 5: | |
| 133 if (ac->tags_mapped == 2 && type == TYPE_CPE) { | |
| 134 ac->tags_mapped++; | |
| 135 return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][1]; | |
| 136 } | |
| 137 case 4: | |
| 138 if (ac->tags_mapped == 2 && ac->m4ac.chan_config == 4 && type == TYPE_SCE) { | |
| 139 ac->tags_mapped++; | |
| 140 return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][1]; | |
| 141 } | |
| 142 case 3: | |
| 143 case 2: | |
| 144 if (ac->tags_mapped == (ac->m4ac.chan_config != 2) && type == TYPE_CPE) { | |
| 145 ac->tags_mapped++; | |
| 146 return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][0]; | |
| 147 } else if (ac->m4ac.chan_config == 2) { | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
148 return NULL; |
| 10004 | 149 } |
| 150 case 1: | |
| 151 if (!ac->tags_mapped && type == TYPE_SCE) { | |
| 152 ac->tags_mapped++; | |
| 153 return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][0]; | |
| 154 } | |
| 155 default: | |
| 156 return NULL; | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
157 } |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
158 } |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
159 |
| 7539 | 160 /** |
|
10308
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
161 * Check for the channel element in the current channel position configuration. |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
162 * If it exists, make sure the appropriate element is allocated and map the |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
163 * channel order to match the internal FFmpeg channel layout. |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
164 * |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
165 * @param che_pos current channel position configuration |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
166 * @param type channel element type |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
167 * @param id channel element id |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
168 * @param channels count of the number of channels in the configuration |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
169 * |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
170 * @return Returns error status. 0 - OK, !0 - error |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
171 */ |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
172 static int che_configure(AACContext *ac, |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
173 enum ChannelPosition che_pos[4][MAX_ELEM_ID], |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
174 int type, int id, |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
175 int *channels) |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
176 { |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
177 if (che_pos[type][id]) { |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
178 if (!ac->che[type][id] && !(ac->che[type][id] = av_mallocz(sizeof(ChannelElement)))) |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
179 return AVERROR(ENOMEM); |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
180 if (type != TYPE_CCE) { |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
181 ac->output_data[(*channels)++] = ac->che[type][id]->ch[0].ret; |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
182 if (type == TYPE_CPE) { |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
183 ac->output_data[(*channels)++] = ac->che[type][id]->ch[1].ret; |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
184 } |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
185 } |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
186 } else |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
187 av_freep(&ac->che[type][id]); |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
188 return 0; |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
189 } |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
190 |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
191 /** |
| 7578 | 192 * Configure output channel order based on the current program configuration element. |
| 193 * | |
| 194 * @param che_pos current channel position configuration | |
| 195 * @param new_che_pos New channel position configuration - we only do something if it differs from the current one. | |
| 196 * | |
| 197 * @return Returns error status. 0 - OK, !0 - error | |
| 198 */ | |
| 10004 | 199 static int output_configure(AACContext *ac, |
| 200 enum ChannelPosition che_pos[4][MAX_ELEM_ID], | |
| 201 enum ChannelPosition new_che_pos[4][MAX_ELEM_ID], | |
|
10491
74e51b86b934
Don't lock the channel output configuration based on the first value seen for
alexc
parents:
10378
diff
changeset
|
202 int channel_config, enum OCStatus oc_type) |
| 10004 | 203 { |
| 7578 | 204 AVCodecContext *avctx = ac->avccontext; |
|
10308
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
205 int i, type, channels = 0, ret; |
| 7578 | 206 |
| 207 memcpy(che_pos, new_che_pos, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0])); | |
| 208 | |
|
10306
c97a6cabee62
AAC: Add channel layout support for channel configuration as defined in the
superdump
parents:
10252
diff
changeset
|
209 if (channel_config) { |
|
c97a6cabee62
AAC: Add channel layout support for channel configuration as defined in the
superdump
parents:
10252
diff
changeset
|
210 for (i = 0; i < tags_per_config[channel_config]; i++) { |
|
10308
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
211 if ((ret = che_configure(ac, che_pos, |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
212 aac_channel_layout_map[channel_config - 1][i][0], |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
213 aac_channel_layout_map[channel_config - 1][i][1], |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
214 &channels))) |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
215 return ret; |
|
10306
c97a6cabee62
AAC: Add channel layout support for channel configuration as defined in the
superdump
parents:
10252
diff
changeset
|
216 } |
|
c97a6cabee62
AAC: Add channel layout support for channel configuration as defined in the
superdump
parents:
10252
diff
changeset
|
217 |
|
c97a6cabee62
AAC: Add channel layout support for channel configuration as defined in the
superdump
parents:
10252
diff
changeset
|
218 memset(ac->tag_che_map, 0, 4 * MAX_ELEM_ID * sizeof(ac->che[0][0])); |
|
c97a6cabee62
AAC: Add channel layout support for channel configuration as defined in the
superdump
parents:
10252
diff
changeset
|
219 ac->tags_mapped = 0; |
|
c97a6cabee62
AAC: Add channel layout support for channel configuration as defined in the
superdump
parents:
10252
diff
changeset
|
220 |
|
c97a6cabee62
AAC: Add channel layout support for channel configuration as defined in the
superdump
parents:
10252
diff
changeset
|
221 avctx->channel_layout = aac_channel_layout[channel_config - 1]; |
|
c97a6cabee62
AAC: Add channel layout support for channel configuration as defined in the
superdump
parents:
10252
diff
changeset
|
222 } else { |
| 10307 | 223 /* Allocate or free elements depending on if they are in the |
| 224 * current program configuration. | |
| 225 * | |
| 226 * Set up default 1:1 output mapping. | |
| 227 * | |
| 228 * For a 5.1 stream the output order will be: | |
| 229 * [ Center ] [ Front Left ] [ Front Right ] [ LFE ] [ Surround Left ] [ Surround Right ] | |
| 230 */ | |
| 7578 | 231 |
| 10307 | 232 for (i = 0; i < MAX_ELEM_ID; i++) { |
| 233 for (type = 0; type < 4; type++) { | |
|
10308
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
234 if ((ret = che_configure(ac, che_pos, type, i, &channels))) |
|
28b0f87cfdf1
Refactor channel element configuration and mapping code into its own function
superdump
parents:
10307
diff
changeset
|
235 return ret; |
| 10307 | 236 } |
| 7578 | 237 } |
| 238 | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
239 memcpy(ac->tag_che_map, ac->che, 4 * MAX_ELEM_ID * sizeof(ac->che[0][0])); |
| 10004 | 240 ac->tags_mapped = 4 * MAX_ELEM_ID; |
|
10306
c97a6cabee62
AAC: Add channel layout support for channel configuration as defined in the
superdump
parents:
10252
diff
changeset
|
241 |
|
c97a6cabee62
AAC: Add channel layout support for channel configuration as defined in the
superdump
parents:
10252
diff
changeset
|
242 avctx->channel_layout = 0; |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
243 } |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
244 |
| 7578 | 245 avctx->channels = channels; |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
246 |
|
10491
74e51b86b934
Don't lock the channel output configuration based on the first value seen for
alexc
parents:
10378
diff
changeset
|
247 ac->output_configured = oc_type; |
|
9948
98fd723f72e7
Ignore subsequent channel configurations after the first in an AAC file. The
alexc
parents:
9891
diff
changeset
|
248 |
| 7578 | 249 return 0; |
| 250 } | |
| 251 | |
| 252 /** | |
| 7539 | 253 * Decode an array of 4 bit element IDs, optionally interleaved with a stereo/mono switching bit. |
| 254 * | |
| 255 * @param cpe_map Stereo (Channel Pair Element) map, NULL if stereo bit is not present. | |
| 256 * @param sce_map mono (Single Channel Element) map | |
| 257 * @param type speaker type/position for these channels | |
| 258 */ | |
| 259 static void decode_channel_map(enum ChannelPosition *cpe_map, | |
| 10004 | 260 enum ChannelPosition *sce_map, |
| 261 enum ChannelPosition type, | |
| 262 GetBitContext *gb, int n) | |
| 263 { | |
| 264 while (n--) { | |
| 7539 | 265 enum ChannelPosition *map = cpe_map && get_bits1(gb) ? cpe_map : sce_map; // stereo or mono map |
| 266 map[get_bits(gb, 4)] = type; | |
| 267 } | |
| 268 } | |
| 269 | |
| 270 /** | |
| 271 * Decode program configuration element; reference: table 4.2. | |
| 272 * | |
| 273 * @param new_che_pos New channel position configuration - we only do something if it differs from the current one. | |
| 274 * | |
| 275 * @return Returns error status. 0 - OK, !0 - error | |
| 276 */ | |
| 10004 | 277 static int decode_pce(AACContext *ac, enum ChannelPosition new_che_pos[4][MAX_ELEM_ID], |
| 278 GetBitContext *gb) | |
| 279 { | |
|
8412
2d48043ab521
AAC: Don't write an illegal sampling_index in a PCE to the MPEG4AudioConfig
superdump
parents:
8286
diff
changeset
|
280 int num_front, num_side, num_back, num_lfe, num_assoc_data, num_cc, sampling_index; |
| 7539 | 281 |
| 282 skip_bits(gb, 2); // object_type | |
| 283 | |
|
8412
2d48043ab521
AAC: Don't write an illegal sampling_index in a PCE to the MPEG4AudioConfig
superdump
parents:
8286
diff
changeset
|
284 sampling_index = get_bits(gb, 4); |
|
9716
d45e44454d13
In the event of a mismatch, do not follow the sample rate index in an AAC PCE.
alexc
parents:
9658
diff
changeset
|
285 if (ac->m4ac.sampling_index != sampling_index) |
|
d45e44454d13
In the event of a mismatch, do not follow the sample rate index in an AAC PCE.
alexc
parents:
9658
diff
changeset
|
286 av_log(ac->avccontext, AV_LOG_WARNING, "Sample rate index in program config element does not match the sample rate index configured by the container.\n"); |
|
d45e44454d13
In the event of a mismatch, do not follow the sample rate index in an AAC PCE.
alexc
parents:
9658
diff
changeset
|
287 |
| 7501 | 288 num_front = get_bits(gb, 4); |
| 289 num_side = get_bits(gb, 4); | |
| 290 num_back = get_bits(gb, 4); | |
| 291 num_lfe = get_bits(gb, 2); | |
| 292 num_assoc_data = get_bits(gb, 3); | |
| 293 num_cc = get_bits(gb, 4); | |
| 294 | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
295 if (get_bits1(gb)) |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
296 skip_bits(gb, 4); // mono_mixdown_tag |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
297 if (get_bits1(gb)) |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
298 skip_bits(gb, 4); // stereo_mixdown_tag |
| 7501 | 299 |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
300 if (get_bits1(gb)) |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
301 skip_bits(gb, 3); // mixdown_coeff_index and pseudo_surround |
| 7501 | 302 |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
303 decode_channel_map(new_che_pos[TYPE_CPE], new_che_pos[TYPE_SCE], AAC_CHANNEL_FRONT, gb, num_front); |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
304 decode_channel_map(new_che_pos[TYPE_CPE], new_che_pos[TYPE_SCE], AAC_CHANNEL_SIDE, gb, num_side ); |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
305 decode_channel_map(new_che_pos[TYPE_CPE], new_che_pos[TYPE_SCE], AAC_CHANNEL_BACK, gb, num_back ); |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
306 decode_channel_map(NULL, new_che_pos[TYPE_LFE], AAC_CHANNEL_LFE, gb, num_lfe ); |
| 7501 | 307 |
| 308 skip_bits_long(gb, 4 * num_assoc_data); | |
| 309 | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
310 decode_channel_map(new_che_pos[TYPE_CCE], new_che_pos[TYPE_CCE], AAC_CHANNEL_CC, gb, num_cc ); |
| 7501 | 311 |
| 312 align_get_bits(gb); | |
| 313 | |
| 314 /* comment field, first byte is length */ | |
| 315 skip_bits_long(gb, 8 * get_bits(gb, 8)); | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
316 return 0; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
317 } |
| 7501 | 318 |
| 7539 | 319 /** |
| 320 * Set up channel positions based on a default channel configuration | |
| 321 * as specified in table 1.17. | |
| 322 * | |
| 323 * @param new_che_pos New channel position configuration - we only do something if it differs from the current one. | |
| 324 * | |
| 325 * @return Returns error status. 0 - OK, !0 - error | |
| 326 */ | |
| 10004 | 327 static int set_default_channel_config(AACContext *ac, |
| 328 enum ChannelPosition new_che_pos[4][MAX_ELEM_ID], | |
| 329 int channel_config) | |
| 7539 | 330 { |
| 10004 | 331 if (channel_config < 1 || channel_config > 7) { |
| 7539 | 332 av_log(ac->avccontext, AV_LOG_ERROR, "invalid default channel configuration (%d)\n", |
| 333 channel_config); | |
| 334 return -1; | |
| 335 } | |
| 336 | |
| 337 /* default channel configurations: | |
| 338 * | |
| 339 * 1ch : front center (mono) | |
| 340 * 2ch : L + R (stereo) | |
| 341 * 3ch : front center + L + R | |
| 342 * 4ch : front center + L + R + back center | |
| 343 * 5ch : front center + L + R + back stereo | |
| 344 * 6ch : front center + L + R + back stereo + LFE | |
| 345 * 7ch : front center + L + R + outer front left + outer front right + back stereo + LFE | |
| 346 */ | |
| 347 | |
| 10004 | 348 if (channel_config != 2) |
| 7539 | 349 new_che_pos[TYPE_SCE][0] = AAC_CHANNEL_FRONT; // front center (or mono) |
| 10004 | 350 if (channel_config > 1) |
| 7539 | 351 new_che_pos[TYPE_CPE][0] = AAC_CHANNEL_FRONT; // L + R (or stereo) |
| 10004 | 352 if (channel_config == 4) |
| 7539 | 353 new_che_pos[TYPE_SCE][1] = AAC_CHANNEL_BACK; // back center |
| 10004 | 354 if (channel_config > 4) |
| 7539 | 355 new_che_pos[TYPE_CPE][(channel_config == 7) + 1] |
| 10004 | 356 = AAC_CHANNEL_BACK; // back stereo |
| 357 if (channel_config > 5) | |
| 7539 | 358 new_che_pos[TYPE_LFE][0] = AAC_CHANNEL_LFE; // LFE |
| 10004 | 359 if (channel_config == 7) |
| 7539 | 360 new_che_pos[TYPE_CPE][1] = AAC_CHANNEL_FRONT; // outer front left + outer front right |
| 361 | |
| 362 return 0; | |
| 363 } | |
| 364 | |
| 7578 | 365 /** |
| 366 * Decode GA "General Audio" specific configuration; reference: table 4.1. | |
| 367 * | |
| 368 * @return Returns error status. 0 - OK, !0 - error | |
| 369 */ | |
| 10004 | 370 static int decode_ga_specific_config(AACContext *ac, GetBitContext *gb, |
| 371 int channel_config) | |
| 372 { | |
| 7578 | 373 enum ChannelPosition new_che_pos[4][MAX_ELEM_ID]; |
| 374 int extension_flag, ret; | |
| 375 | |
| 10004 | 376 if (get_bits1(gb)) { // frameLengthFlag |
|
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9847
diff
changeset
|
377 av_log_missing_feature(ac->avccontext, "960/120 MDCT window is", 1); |
| 7539 | 378 return -1; |
| 379 } | |
| 380 | |
| 381 if (get_bits1(gb)) // dependsOnCoreCoder | |
| 382 skip_bits(gb, 14); // coreCoderDelay | |
| 383 extension_flag = get_bits1(gb); | |
| 384 | |
| 10004 | 385 if (ac->m4ac.object_type == AOT_AAC_SCALABLE || |
| 386 ac->m4ac.object_type == AOT_ER_AAC_SCALABLE) | |
| 7539 | 387 skip_bits(gb, 3); // layerNr |
| 388 | |
| 389 memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0])); | |
| 390 if (channel_config == 0) { | |
| 391 skip_bits(gb, 4); // element_instance_tag | |
| 10004 | 392 if ((ret = decode_pce(ac, new_che_pos, gb))) |
| 7539 | 393 return ret; |
| 394 } else { | |
| 10004 | 395 if ((ret = set_default_channel_config(ac, new_che_pos, channel_config))) |
| 7539 | 396 return ret; |
| 397 } | |
|
10622
2474aceea736
AAC: Add a global header but output not locked output configuration status.
alexc
parents:
10621
diff
changeset
|
398 if ((ret = output_configure(ac, ac->che_pos, new_che_pos, channel_config, OC_GLOBAL_HDR))) |
| 7539 | 399 return ret; |
| 400 | |
| 401 if (extension_flag) { | |
| 402 switch (ac->m4ac.object_type) { | |
| 10004 | 403 case AOT_ER_BSAC: |
| 404 skip_bits(gb, 5); // numOfSubFrame | |
| 405 skip_bits(gb, 11); // layer_length | |
| 406 break; | |
| 407 case AOT_ER_AAC_LC: | |
| 408 case AOT_ER_AAC_LTP: | |
| 409 case AOT_ER_AAC_SCALABLE: | |
| 410 case AOT_ER_AAC_LD: | |
| 411 skip_bits(gb, 3); /* aacSectionDataResilienceFlag | |
| 7539 | 412 * aacScalefactorDataResilienceFlag |
| 413 * aacSpectralDataResilienceFlag | |
| 414 */ | |
| 10004 | 415 break; |
| 7539 | 416 } |
| 417 skip_bits1(gb); // extensionFlag3 (TBD in version 3) | |
| 418 } | |
| 419 return 0; | |
| 420 } | |
| 421 | |
| 422 /** | |
| 423 * Decode audio specific configuration; reference: table 1.13. | |
| 424 * | |
| 425 * @param data pointer to AVCodecContext extradata | |
| 426 * @param data_size size of AVCCodecContext extradata | |
| 427 * | |
| 428 * @return Returns error status. 0 - OK, !0 - error | |
| 429 */ | |
| 10004 | 430 static int decode_audio_specific_config(AACContext *ac, void *data, |
| 431 int data_size) | |
| 432 { | |
| 7539 | 433 GetBitContext gb; |
| 434 int i; | |
| 435 | |
| 436 init_get_bits(&gb, data, data_size * 8); | |
| 437 | |
| 10004 | 438 if ((i = ff_mpeg4audio_get_config(&ac->m4ac, data, data_size)) < 0) |
| 7539 | 439 return -1; |
| 10004 | 440 if (ac->m4ac.sampling_index > 12) { |
| 7539 | 441 av_log(ac->avccontext, AV_LOG_ERROR, "invalid sampling rate index %d\n", ac->m4ac.sampling_index); |
| 442 return -1; | |
| 443 } | |
| 444 | |
| 445 skip_bits_long(&gb, i); | |
| 446 | |
| 447 switch (ac->m4ac.object_type) { | |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
448 case AOT_AAC_MAIN: |
| 7539 | 449 case AOT_AAC_LC: |
| 450 if (decode_ga_specific_config(ac, &gb, ac->m4ac.chan_config)) | |
| 451 return -1; | |
| 452 break; | |
| 453 default: | |
| 454 av_log(ac->avccontext, AV_LOG_ERROR, "Audio object type %s%d is not supported.\n", | |
| 455 ac->m4ac.sbr == 1? "SBR+" : "", ac->m4ac.object_type); | |
| 456 return -1; | |
| 457 } | |
| 458 return 0; | |
| 459 } | |
| 460 | |
| 7578 | 461 /** |
| 462 * linear congruential pseudorandom number generator | |
| 463 * | |
| 464 * @param previous_val pointer to the current state of the generator | |
| 465 * | |
| 466 * @return Returns a 32-bit pseudorandom integer | |
| 467 */ | |
| 10004 | 468 static av_always_inline int lcg_random(int previous_val) |
| 469 { | |
| 7578 | 470 return previous_val * 1664525 + 1013904223; |
| 471 } | |
| 472 | |
| 10004 | 473 static void reset_predict_state(PredictorState *ps) |
| 474 { | |
| 475 ps->r0 = 0.0f; | |
| 476 ps->r1 = 0.0f; | |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
477 ps->cor0 = 0.0f; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
478 ps->cor1 = 0.0f; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
479 ps->var0 = 1.0f; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
480 ps->var1 = 1.0f; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
481 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
482 |
| 10004 | 483 static void reset_all_predictors(PredictorState *ps) |
| 484 { | |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
485 int i; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
486 for (i = 0; i < MAX_PREDICTORS; i++) |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
487 reset_predict_state(&ps[i]); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
488 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
489 |
| 10004 | 490 static void reset_predictor_group(PredictorState *ps, int group_num) |
| 491 { | |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
492 int i; |
| 10004 | 493 for (i = group_num - 1; i < MAX_PREDICTORS; i += 30) |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
494 reset_predict_state(&ps[i]); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
495 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
496 |
| 10004 | 497 static av_cold int aac_decode_init(AVCodecContext *avccontext) |
| 498 { | |
| 499 AACContext *ac = avccontext->priv_data; | |
| 7501 | 500 int i; |
| 501 | |
| 502 ac->avccontext = avccontext; | |
| 503 | |
|
8549
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
504 if (avccontext->extradata_size > 0) { |
| 10004 | 505 if (decode_audio_specific_config(ac, avccontext->extradata, avccontext->extradata_size)) |
|
8549
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
506 return -1; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
507 avccontext->sample_rate = ac->m4ac.sample_rate; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
508 } else if (avccontext->channels > 0) { |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
509 ac->m4ac.sample_rate = avccontext->sample_rate; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
510 } |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
511 |
| 10004 | 512 avccontext->sample_fmt = SAMPLE_FMT_S16; |
| 513 avccontext->frame_size = 1024; | |
| 7501 | 514 |
| 10877 | 515 AAC_INIT_VLC_STATIC( 0, 304); |
| 516 AAC_INIT_VLC_STATIC( 1, 270); | |
| 517 AAC_INIT_VLC_STATIC( 2, 550); | |
| 518 AAC_INIT_VLC_STATIC( 3, 300); | |
| 519 AAC_INIT_VLC_STATIC( 4, 328); | |
| 520 AAC_INIT_VLC_STATIC( 5, 294); | |
| 521 AAC_INIT_VLC_STATIC( 6, 306); | |
| 522 AAC_INIT_VLC_STATIC( 7, 268); | |
| 523 AAC_INIT_VLC_STATIC( 8, 510); | |
| 524 AAC_INIT_VLC_STATIC( 9, 366); | |
| 525 AAC_INIT_VLC_STATIC(10, 462); | |
| 7501 | 526 |
| 527 dsputil_init(&ac->dsp, avccontext); | |
| 528 | |
| 7539 | 529 ac->random_state = 0x1f2e3d4c; |
| 530 | |
| 7501 | 531 // -1024 - Compensate wrong IMDCT method. |
| 532 // 32768 - Required to scale values to the correct range for the bias method | |
| 533 // for float to int16 conversion. | |
| 534 | |
|
10377
98816e4d5522
dca and aac decoders use float_to_int16_interleave, so check for
conrad
parents:
10308
diff
changeset
|
535 if (ac->dsp.float_to_int16_interleave == ff_float_to_int16_interleave_c) { |
| 10004 | 536 ac->add_bias = 385.0f; |
| 537 ac->sf_scale = 1. / (-1024. * 32768.); | |
| 7501 | 538 ac->sf_offset = 0; |
| 539 } else { | |
| 10004 | 540 ac->add_bias = 0.0f; |
| 541 ac->sf_scale = 1. / -1024.; | |
| 7501 | 542 ac->sf_offset = 60; |
| 543 } | |
| 544 | |
| 8590 | 545 #if !CONFIG_HARDCODED_TABLES |
|
8109
7baa25290231
Fix perceptual noise shaping scaling including an oversight of the offset for
superdump
parents:
8042
diff
changeset
|
546 for (i = 0; i < 428; i++) |
| 10004 | 547 ff_aac_pow2sf_tab[i] = pow(2, (i - 200) / 4.); |
| 7501 | 548 #endif /* CONFIG_HARDCODED_TABLES */ |
| 549 | |
| 8042 | 550 INIT_VLC_STATIC(&vlc_scalefactors,7,FF_ARRAY_ELEMS(ff_aac_scalefactor_code), |
| 10004 | 551 ff_aac_scalefactor_bits, sizeof(ff_aac_scalefactor_bits[0]), sizeof(ff_aac_scalefactor_bits[0]), |
| 552 ff_aac_scalefactor_code, sizeof(ff_aac_scalefactor_code[0]), sizeof(ff_aac_scalefactor_code[0]), | |
| 553 352); | |
| 7501 | 554 |
|
9658
67a20f0eb42c
Support for getting (i)MDCT output multiplied by a constant scaling factor.
serge
parents:
9634
diff
changeset
|
555 ff_mdct_init(&ac->mdct, 11, 1, 1.0); |
|
67a20f0eb42c
Support for getting (i)MDCT output multiplied by a constant scaling factor.
serge
parents:
9634
diff
changeset
|
556 ff_mdct_init(&ac->mdct_small, 8, 1, 1.0); |
| 7581 | 557 // window initialization |
| 558 ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024); | |
| 559 ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128); | |
|
10827
3d011a01a6a0
Add support for hard-coded MDCT-related ff_sine_windows tables.
reimar
parents:
10819
diff
changeset
|
560 ff_init_ff_sine_windows(10); |
|
3d011a01a6a0
Add support for hard-coded MDCT-related ff_sine_windows tables.
reimar
parents:
10819
diff
changeset
|
561 ff_init_ff_sine_windows( 7); |
| 7581 | 562 |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
563 if (!cbrt_tab[(1<<13) - 1]) { |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
564 for (i = 0; i < 1<<13; i++) { |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
565 union float754 f; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
566 f.f = cbrtf(i) * i; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
567 cbrt_tab[i] = f.i; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
568 } |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
569 } |
| 10849 | 570 |
| 7501 | 571 return 0; |
| 572 } | |
| 573 | |
| 7539 | 574 /** |
| 575 * Skip data_stream_element; reference: table 4.10. | |
| 576 */ | |
| 10004 | 577 static void skip_data_stream_element(GetBitContext *gb) |
| 578 { | |
| 7501 | 579 int byte_align = get_bits1(gb); |
| 580 int count = get_bits(gb, 8); | |
| 581 if (count == 255) | |
| 582 count += get_bits(gb, 8); | |
| 583 if (byte_align) | |
| 584 align_get_bits(gb); | |
| 585 skip_bits_long(gb, 8 * count); | |
| 586 } | |
| 587 | |
| 10004 | 588 static int decode_prediction(AACContext *ac, IndividualChannelStream *ics, |
| 589 GetBitContext *gb) | |
| 590 { | |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
591 int sfb; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
592 if (get_bits1(gb)) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
593 ics->predictor_reset_group = get_bits(gb, 5); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
594 if (ics->predictor_reset_group == 0 || ics->predictor_reset_group > 30) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
595 av_log(ac->avccontext, AV_LOG_ERROR, "Invalid Predictor Reset Group.\n"); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
596 return -1; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
597 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
598 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
599 for (sfb = 0; sfb < FFMIN(ics->max_sfb, ff_aac_pred_sfb_max[ac->m4ac.sampling_index]); sfb++) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
600 ics->prediction_used[sfb] = get_bits1(gb); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
601 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
602 return 0; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
603 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
604 |
| 7501 | 605 /** |
| 7539 | 606 * Decode Individual Channel Stream info; reference: table 4.6. |
| 607 * | |
| 608 * @param common_window Channels have independent [0], or shared [1], Individual Channel Stream information. | |
| 609 */ | |
| 10004 | 610 static int decode_ics_info(AACContext *ac, IndividualChannelStream *ics, |
| 611 GetBitContext *gb, int common_window) | |
| 612 { | |
| 7539 | 613 if (get_bits1(gb)) { |
| 614 av_log(ac->avccontext, AV_LOG_ERROR, "Reserved bit set.\n"); | |
| 615 memset(ics, 0, sizeof(IndividualChannelStream)); | |
| 616 return -1; | |
| 617 } | |
| 618 ics->window_sequence[1] = ics->window_sequence[0]; | |
| 619 ics->window_sequence[0] = get_bits(gb, 2); | |
| 10004 | 620 ics->use_kb_window[1] = ics->use_kb_window[0]; |
| 621 ics->use_kb_window[0] = get_bits1(gb); | |
| 622 ics->num_window_groups = 1; | |
| 623 ics->group_len[0] = 1; | |
| 7581 | 624 if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { |
| 625 int i; | |
| 626 ics->max_sfb = get_bits(gb, 4); | |
| 627 for (i = 0; i < 7; i++) { | |
| 628 if (get_bits1(gb)) { | |
| 10004 | 629 ics->group_len[ics->num_window_groups - 1]++; |
| 7581 | 630 } else { |
| 631 ics->num_window_groups++; | |
| 10004 | 632 ics->group_len[ics->num_window_groups - 1] = 1; |
| 7581 | 633 } |
| 634 } | |
| 10004 | 635 ics->num_windows = 8; |
| 636 ics->swb_offset = ff_swb_offset_128[ac->m4ac.sampling_index]; | |
| 637 ics->num_swb = ff_aac_num_swb_128[ac->m4ac.sampling_index]; | |
| 638 ics->tns_max_bands = ff_tns_max_bands_128[ac->m4ac.sampling_index]; | |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
639 ics->predictor_present = 0; |
| 7581 | 640 } else { |
| 10004 | 641 ics->max_sfb = get_bits(gb, 6); |
| 642 ics->num_windows = 1; | |
| 643 ics->swb_offset = ff_swb_offset_1024[ac->m4ac.sampling_index]; | |
| 644 ics->num_swb = ff_aac_num_swb_1024[ac->m4ac.sampling_index]; | |
| 645 ics->tns_max_bands = ff_tns_max_bands_1024[ac->m4ac.sampling_index]; | |
| 646 ics->predictor_present = get_bits1(gb); | |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
647 ics->predictor_reset_group = 0; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
648 if (ics->predictor_present) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
649 if (ac->m4ac.object_type == AOT_AAC_MAIN) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
650 if (decode_prediction(ac, ics, gb)) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
651 memset(ics, 0, sizeof(IndividualChannelStream)); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
652 return -1; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
653 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
654 } else if (ac->m4ac.object_type == AOT_AAC_LC) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
655 av_log(ac->avccontext, AV_LOG_ERROR, "Prediction is not allowed in AAC-LC.\n"); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
656 memset(ics, 0, sizeof(IndividualChannelStream)); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
657 return -1; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
658 } else { |
|
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9847
diff
changeset
|
659 av_log_missing_feature(ac->avccontext, "Predictor bit set but LTP is", 1); |
| 8200 | 660 memset(ics, 0, sizeof(IndividualChannelStream)); |
| 661 return -1; | |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
662 } |
| 7578 | 663 } |
| 664 } | |
| 665 | |
| 10004 | 666 if (ics->max_sfb > ics->num_swb) { |
| 7578 | 667 av_log(ac->avccontext, AV_LOG_ERROR, |
| 10004 | 668 "Number of scalefactor bands in group (%d) exceeds limit (%d).\n", |
| 669 ics->max_sfb, ics->num_swb); | |
| 7578 | 670 memset(ics, 0, sizeof(IndividualChannelStream)); |
| 671 return -1; | |
| 672 } | |
| 673 | |
| 7539 | 674 return 0; |
| 675 } | |
| 676 | |
| 677 /** | |
| 678 * Decode band types (section_data payload); reference: table 4.46. | |
| 679 * | |
| 680 * @param band_type array of the used band type | |
| 681 * @param band_type_run_end array of the last scalefactor band of a band type run | |
| 682 * | |
| 683 * @return Returns error status. 0 - OK, !0 - error | |
| 684 */ | |
| 10004 | 685 static int decode_band_types(AACContext *ac, enum BandType band_type[120], |
| 686 int band_type_run_end[120], GetBitContext *gb, | |
| 687 IndividualChannelStream *ics) | |
| 688 { | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
689 int g, idx = 0; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
690 const int bits = (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) ? 3 : 5; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
691 for (g = 0; g < ics->num_window_groups; g++) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
692 int k = 0; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
693 while (k < ics->max_sfb) { |
|
10519
06d6393bbaeb
AAC: Rename sect_len to sect_end. It marks the last sfb of the section, not the
alexc
parents:
10491
diff
changeset
|
694 uint8_t sect_end = k; |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
695 int sect_len_incr; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
696 int sect_band_type = get_bits(gb, 4); |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
697 if (sect_band_type == 12) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
698 av_log(ac->avccontext, AV_LOG_ERROR, "invalid band type\n"); |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
699 return -1; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
700 } |
| 10004 | 701 while ((sect_len_incr = get_bits(gb, bits)) == (1 << bits) - 1) |
|
10519
06d6393bbaeb
AAC: Rename sect_len to sect_end. It marks the last sfb of the section, not the
alexc
parents:
10491
diff
changeset
|
702 sect_end += sect_len_incr; |
|
06d6393bbaeb
AAC: Rename sect_len to sect_end. It marks the last sfb of the section, not the
alexc
parents:
10491
diff
changeset
|
703 sect_end += sect_len_incr; |
|
06d6393bbaeb
AAC: Rename sect_len to sect_end. It marks the last sfb of the section, not the
alexc
parents:
10491
diff
changeset
|
704 if (sect_end > ics->max_sfb) { |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
705 av_log(ac->avccontext, AV_LOG_ERROR, |
| 10004 | 706 "Number of bands (%d) exceeds limit (%d).\n", |
|
10519
06d6393bbaeb
AAC: Rename sect_len to sect_end. It marks the last sfb of the section, not the
alexc
parents:
10491
diff
changeset
|
707 sect_end, ics->max_sfb); |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
708 return -1; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
709 } |
|
10519
06d6393bbaeb
AAC: Rename sect_len to sect_end. It marks the last sfb of the section, not the
alexc
parents:
10491
diff
changeset
|
710 for (; k < sect_end; k++) { |
| 7581 | 711 band_type [idx] = sect_band_type; |
|
10519
06d6393bbaeb
AAC: Rename sect_len to sect_end. It marks the last sfb of the section, not the
alexc
parents:
10491
diff
changeset
|
712 band_type_run_end[idx++] = sect_end; |
| 7581 | 713 } |
| 7539 | 714 } |
| 715 } | |
| 716 return 0; | |
| 717 } | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
718 |
| 7539 | 719 /** |
| 720 * Decode scalefactors; reference: table 4.47. | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
721 * |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
722 * @param global_gain first scalefactor value as scalefactors are differentially coded |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
723 * @param band_type array of the used band type |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
724 * @param band_type_run_end array of the last scalefactor band of a band type run |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
725 * @param sf array of scalefactors or intensity stereo positions |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
726 * |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
727 * @return Returns error status. 0 - OK, !0 - error |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
728 */ |
| 10004 | 729 static int decode_scalefactors(AACContext *ac, float sf[120], GetBitContext *gb, |
| 730 unsigned int global_gain, | |
| 731 IndividualChannelStream *ics, | |
| 732 enum BandType band_type[120], | |
| 733 int band_type_run_end[120]) | |
| 734 { | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
735 const int sf_offset = ac->sf_offset + (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE ? 12 : 0); |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
736 int g, i, idx = 0; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
737 int offset[3] = { global_gain, global_gain - 90, 100 }; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
738 int noise_flag = 1; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
739 static const char *sf_str[3] = { "Global gain", "Noise gain", "Intensity stereo position" }; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
740 for (g = 0; g < ics->num_window_groups; g++) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
741 for (i = 0; i < ics->max_sfb;) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
742 int run_end = band_type_run_end[idx]; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
743 if (band_type[idx] == ZERO_BT) { |
| 10004 | 744 for (; i < run_end; i++, idx++) |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
745 sf[idx] = 0.; |
| 10004 | 746 } else if ((band_type[idx] == INTENSITY_BT) || (band_type[idx] == INTENSITY_BT2)) { |
| 747 for (; i < run_end; i++, idx++) { | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
748 offset[2] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60; |
| 10004 | 749 if (offset[2] > 255U) { |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
750 av_log(ac->avccontext, AV_LOG_ERROR, |
| 10004 | 751 "%s (%d) out of range.\n", sf_str[2], offset[2]); |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
752 return -1; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
753 } |
| 10004 | 754 sf[idx] = ff_aac_pow2sf_tab[-offset[2] + 300]; |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
755 } |
| 10004 | 756 } else if (band_type[idx] == NOISE_BT) { |
| 757 for (; i < run_end; i++, idx++) { | |
| 758 if (noise_flag-- > 0) | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
759 offset[1] += get_bits(gb, 9) - 256; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
760 else |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
761 offset[1] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60; |
| 10004 | 762 if (offset[1] > 255U) { |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
763 av_log(ac->avccontext, AV_LOG_ERROR, |
| 10004 | 764 "%s (%d) out of range.\n", sf_str[1], offset[1]); |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
765 return -1; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
766 } |
| 10004 | 767 sf[idx] = -ff_aac_pow2sf_tab[offset[1] + sf_offset + 100]; |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
768 } |
| 10004 | 769 } else { |
| 770 for (; i < run_end; i++, idx++) { | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
771 offset[0] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60; |
| 10004 | 772 if (offset[0] > 255U) { |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
773 av_log(ac->avccontext, AV_LOG_ERROR, |
| 10004 | 774 "%s (%d) out of range.\n", sf_str[0], offset[0]); |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
775 return -1; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
776 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
777 sf[idx] = -ff_aac_pow2sf_tab[ offset[0] + sf_offset]; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
778 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
779 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
780 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
781 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
782 return 0; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
783 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
784 |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
785 /** |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
786 * Decode pulse data; reference: table 4.7. |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
787 */ |
| 10004 | 788 static int decode_pulses(Pulse *pulse, GetBitContext *gb, |
| 789 const uint16_t *swb_offset, int num_swb) | |
| 790 { | |
|
7871
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
791 int i, pulse_swb; |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
792 pulse->num_pulse = get_bits(gb, 2) + 1; |
|
7871
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
793 pulse_swb = get_bits(gb, 6); |
|
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
794 if (pulse_swb >= num_swb) |
|
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
795 return -1; |
|
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
796 pulse->pos[0] = swb_offset[pulse_swb]; |
|
7856
0882c93a0c11
Operands of '+' are not necessarily evaluated in order so r15311 was pointless.
superdump
parents:
7855
diff
changeset
|
797 pulse->pos[0] += get_bits(gb, 5); |
|
7871
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
798 if (pulse->pos[0] > 1023) |
|
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
799 return -1; |
| 7580 | 800 pulse->amp[0] = get_bits(gb, 4); |
| 801 for (i = 1; i < pulse->num_pulse; i++) { | |
| 10004 | 802 pulse->pos[i] = get_bits(gb, 5) + pulse->pos[i - 1]; |
|
7871
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
803 if (pulse->pos[i] > 1023) |
|
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
804 return -1; |
| 7580 | 805 pulse->amp[i] = get_bits(gb, 4); |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
806 } |
|
7871
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
807 return 0; |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
808 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
809 |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
810 /** |
| 7609 | 811 * Decode Temporal Noise Shaping data; reference: table 4.48. |
| 812 * | |
| 813 * @return Returns error status. 0 - OK, !0 - error | |
| 814 */ | |
| 10004 | 815 static int decode_tns(AACContext *ac, TemporalNoiseShaping *tns, |
| 816 GetBitContext *gb, const IndividualChannelStream *ics) | |
| 817 { | |
| 7609 | 818 int w, filt, i, coef_len, coef_res, coef_compress; |
| 819 const int is8 = ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE; | |
| 820 const int tns_max_order = is8 ? 7 : ac->m4ac.object_type == AOT_AAC_MAIN ? 20 : 12; | |
| 821 for (w = 0; w < ics->num_windows; w++) { | |
|
7637
1fd8e319e8b6
Work around GCC variable may be used uninitialised warning
superdump
parents:
7636
diff
changeset
|
822 if ((tns->n_filt[w] = get_bits(gb, 2 - is8))) { |
| 7609 | 823 coef_res = get_bits1(gb); |
| 824 | |
| 7638 | 825 for (filt = 0; filt < tns->n_filt[w]; filt++) { |
| 826 int tmp2_idx; | |
| 10004 | 827 tns->length[w][filt] = get_bits(gb, 6 - 2 * is8); |
| 7609 | 828 |
| 10004 | 829 if ((tns->order[w][filt] = get_bits(gb, 5 - 2 * is8)) > tns_max_order) { |
| 7638 | 830 av_log(ac->avccontext, AV_LOG_ERROR, "TNS filter order %d is greater than maximum %d.", |
| 831 tns->order[w][filt], tns_max_order); | |
| 832 tns->order[w][filt] = 0; | |
| 833 return -1; | |
| 834 } | |
|
7850
77030651ddd0
Only read some of TNS bitstream data in the case that the TNS filter order is
superdump
parents:
7845
diff
changeset
|
835 if (tns->order[w][filt]) { |
| 7851 | 836 tns->direction[w][filt] = get_bits1(gb); |
| 837 coef_compress = get_bits1(gb); | |
| 838 coef_len = coef_res + 3 - coef_compress; | |
| 10004 | 839 tmp2_idx = 2 * coef_compress + coef_res; |
| 7638 | 840 |
| 7851 | 841 for (i = 0; i < tns->order[w][filt]; i++) |
| 842 tns->coef[w][filt][i] = tns_tmp2_map[tmp2_idx][get_bits(gb, coef_len)]; | |
|
7850
77030651ddd0
Only read some of TNS bitstream data in the case that the TNS filter order is
superdump
parents:
7845
diff
changeset
|
843 } |
| 7609 | 844 } |
|
7637
1fd8e319e8b6
Work around GCC variable may be used uninitialised warning
superdump
parents:
7636
diff
changeset
|
845 } |
| 7609 | 846 } |
| 847 return 0; | |
| 848 } | |
| 849 | |
| 850 /** | |
| 7539 | 851 * Decode Mid/Side data; reference: table 4.54. |
| 852 * | |
| 853 * @param ms_present Indicates mid/side stereo presence. [0] mask is all 0s; | |
| 854 * [1] mask is decoded from bitstream; [2] mask is all 1s; | |
| 855 * [3] reserved for scalable AAC | |
| 856 */ | |
| 10004 | 857 static void decode_mid_side_stereo(ChannelElement *cpe, GetBitContext *gb, |
| 858 int ms_present) | |
| 859 { | |
| 7578 | 860 int idx; |
| 861 if (ms_present == 1) { | |
| 862 for (idx = 0; idx < cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb; idx++) | |
| 863 cpe->ms_mask[idx] = get_bits1(gb); | |
| 864 } else if (ms_present == 2) { | |
| 865 memset(cpe->ms_mask, 1, cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb * sizeof(cpe->ms_mask[0])); | |
| 866 } | |
| 867 } | |
| 7539 | 868 |
| 10881 | 869 #ifndef VMUL2 |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
870 static inline float *VMUL2(float *dst, const float *v, unsigned idx, |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
871 const float *scale) |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
872 { |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
873 float s = *scale; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
874 *dst++ = v[idx & 15] * s; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
875 *dst++ = v[idx>>4 & 15] * s; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
876 return dst; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
877 } |
| 10881 | 878 #endif |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
879 |
| 10881 | 880 #ifndef VMUL4 |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
881 static inline float *VMUL4(float *dst, const float *v, unsigned idx, |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
882 const float *scale) |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
883 { |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
884 float s = *scale; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
885 *dst++ = v[idx & 3] * s; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
886 *dst++ = v[idx>>2 & 3] * s; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
887 *dst++ = v[idx>>4 & 3] * s; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
888 *dst++ = v[idx>>6 & 3] * s; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
889 return dst; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
890 } |
| 10881 | 891 #endif |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
892 |
| 10881 | 893 #ifndef VMUL2S |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
894 static inline float *VMUL2S(float *dst, const float *v, unsigned idx, |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
895 unsigned sign, const float *scale) |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
896 { |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
897 union float754 s0, s1; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
898 |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
899 s0.f = s1.f = *scale; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
900 s0.i ^= sign >> 1 << 31; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
901 s1.i ^= sign << 31; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
902 |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
903 *dst++ = v[idx & 15] * s0.f; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
904 *dst++ = v[idx>>4 & 15] * s1.f; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
905 |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
906 return dst; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
907 } |
| 10881 | 908 #endif |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
909 |
| 10881 | 910 #ifndef VMUL4S |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
911 static inline float *VMUL4S(float *dst, const float *v, unsigned idx, |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
912 unsigned sign, const float *scale) |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
913 { |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
914 unsigned nz = idx >> 12; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
915 union float754 s = { .f = *scale }; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
916 union float754 t; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
917 |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
918 t.i = s.i ^ (sign & 1<<31); |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
919 *dst++ = v[idx & 3] * t.f; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
920 |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
921 sign <<= nz & 1; nz >>= 1; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
922 t.i = s.i ^ (sign & 1<<31); |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
923 *dst++ = v[idx>>2 & 3] * t.f; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
924 |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
925 sign <<= nz & 1; nz >>= 1; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
926 t.i = s.i ^ (sign & 1<<31); |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
927 *dst++ = v[idx>>4 & 3] * t.f; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
928 |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
929 sign <<= nz & 1; nz >>= 1; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
930 t.i = s.i ^ (sign & 1<<31); |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
931 *dst++ = v[idx>>6 & 3] * t.f; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
932 |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
933 return dst; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
934 } |
| 10881 | 935 #endif |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
936 |
| 7539 | 937 /** |
| 7581 | 938 * Decode spectral data; reference: table 4.50. |
| 939 * Dequantize and scale spectral data; reference: 4.6.3.3. | |
| 940 * | |
| 941 * @param coef array of dequantized, scaled spectral data | |
| 942 * @param sf array of scalefactors or intensity stereo positions | |
| 943 * @param pulse_present set if pulses are present | |
| 944 * @param pulse pointer to pulse data struct | |
| 945 * @param band_type array of the used band type | |
| 946 * | |
| 947 * @return Returns error status. 0 - OK, !0 - error | |
| 948 */ | |
| 10004 | 949 static int decode_spectrum_and_dequant(AACContext *ac, float coef[1024], |
|
10819
dc84199b3306
AAC: add a const to decode_spectrum_and_dequant() args
mru
parents:
10688
diff
changeset
|
950 GetBitContext *gb, const float sf[120], |
| 10004 | 951 int pulse_present, const Pulse *pulse, |
| 952 const IndividualChannelStream *ics, | |
| 953 enum BandType band_type[120]) | |
| 954 { | |
| 7581 | 955 int i, k, g, idx = 0; |
| 10004 | 956 const int c = 1024 / ics->num_windows; |
| 957 const uint16_t *offsets = ics->swb_offset; | |
| 7581 | 958 float *coef_base = coef; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
959 int err_idx; |
| 7581 | 960 |
| 961 for (g = 0; g < ics->num_windows; g++) | |
| 10004 | 962 memset(coef + g * 128 + offsets[ics->max_sfb], 0, sizeof(float) * (c - offsets[ics->max_sfb])); |
| 7581 | 963 |
| 964 for (g = 0; g < ics->num_window_groups; g++) { | |
|
10875
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
965 unsigned g_len = ics->group_len[g]; |
|
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
966 |
| 7581 | 967 for (i = 0; i < ics->max_sfb; i++, idx++) { |
|
10875
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
968 const unsigned cbt_m1 = band_type[idx] - 1; |
|
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
969 float *cfo = coef + offsets[i]; |
|
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
970 int off_len = offsets[i + 1] - offsets[i]; |
| 7581 | 971 int group; |
|
10875
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
972 |
|
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
973 if (cbt_m1 >= INTENSITY_BT2 - 1) { |
|
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
974 for (group = 0; group < g_len; group++, cfo+=128) { |
|
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
975 memset(cfo, 0, off_len * sizeof(float)); |
| 7581 | 976 } |
|
10875
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
977 } else if (cbt_m1 == NOISE_BT - 1) { |
|
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
978 for (group = 0; group < g_len; group++, cfo+=128) { |
|
8109
7baa25290231
Fix perceptual noise shaping scaling including an oversight of the offset for
superdump
parents:
8042
diff
changeset
|
979 float scale; |
| 10252 | 980 float band_energy; |
| 10220 | 981 |
|
10875
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
982 for (k = 0; k < off_len; k++) { |
| 7581 | 983 ac->random_state = lcg_random(ac->random_state); |
|
10875
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
984 cfo[k] = ac->random_state; |
|
8109
7baa25290231
Fix perceptual noise shaping scaling including an oversight of the offset for
superdump
parents:
8042
diff
changeset
|
985 } |
| 10220 | 986 |
|
10875
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
987 band_energy = ac->dsp.scalarproduct_float(cfo, cfo, off_len); |
|
8109
7baa25290231
Fix perceptual noise shaping scaling including an oversight of the offset for
superdump
parents:
8042
diff
changeset
|
988 scale = sf[idx] / sqrtf(band_energy); |
|
10875
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
989 ac->dsp.vector_fmul_scalar(cfo, cfo, scale, off_len); |
| 7581 | 990 } |
| 10004 | 991 } else { |
|
10875
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
992 const float *vq = ff_aac_codebook_vector_vals[cbt_m1]; |
|
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
993 const uint16_t *cb_vector_idx = ff_aac_codebook_vector_idx[cbt_m1]; |
|
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
994 VLC_TYPE (*vlc_tab)[2] = vlc_spectral[cbt_m1].table; |
|
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
995 const int cb_size = ff_aac_spectral_sizes[cbt_m1]; |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
996 OPEN_READER(re, gb); |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
997 |
|
10876
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
998 switch (cbt_m1 >> 1) { |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
999 case 0: |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1000 for (group = 0; group < g_len; group++, cfo+=128) { |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1001 float *cf = cfo; |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1002 int len = off_len; |
| 10220 | 1003 |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1004 do { |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1005 int code; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1006 unsigned cb_idx; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1007 |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1008 UPDATE_CACHE(re, gb); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1009 GET_VLC(code, re, gb, vlc_tab, 8, 2); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1010 |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1011 if (code >= cb_size) { |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1012 err_idx = code; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1013 goto err_cb_overflow; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1014 } |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1015 |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1016 cb_idx = cb_vector_idx[code]; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1017 cf = VMUL4(cf, vq, cb_idx, sf + idx); |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1018 } while (len -= 4); |
|
10876
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1019 } |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1020 break; |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1021 |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1022 case 1: |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1023 for (group = 0; group < g_len; group++, cfo+=128) { |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1024 float *cf = cfo; |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1025 int len = off_len; |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1026 |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1027 do { |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1028 int code; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1029 unsigned nnz; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1030 unsigned cb_idx; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1031 uint32_t bits; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1032 |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1033 UPDATE_CACHE(re, gb); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1034 GET_VLC(code, re, gb, vlc_tab, 8, 2); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1035 |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1036 if (code >= cb_size) { |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1037 err_idx = code; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1038 goto err_cb_overflow; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1039 } |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1040 |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1041 #if MIN_CACHE_BITS < 20 |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1042 UPDATE_CACHE(re, gb); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1043 #endif |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1044 cb_idx = cb_vector_idx[code]; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1045 nnz = cb_idx >> 8 & 15; |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1046 bits = SHOW_UBITS(re, gb, nnz) << (32-nnz); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1047 LAST_SKIP_BITS(re, gb, nnz); |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1048 cf = VMUL4S(cf, vq, cb_idx, bits, sf + idx); |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1049 } while (len -= 4); |
|
10876
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1050 } |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1051 break; |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1052 |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1053 case 2: |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1054 for (group = 0; group < g_len; group++, cfo+=128) { |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1055 float *cf = cfo; |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1056 int len = off_len; |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1057 |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1058 do { |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1059 int code; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1060 unsigned cb_idx; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1061 |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1062 UPDATE_CACHE(re, gb); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1063 GET_VLC(code, re, gb, vlc_tab, 8, 2); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1064 |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1065 if (code >= cb_size) { |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1066 err_idx = code; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1067 goto err_cb_overflow; |
|
8283
ea8e4095d980
AAC: Unroll code within decode_spectrum_and_dequant(). Gives 12% net speed gain.
superdump
parents:
8282
diff
changeset
|
1068 } |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1069 |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1070 cb_idx = cb_vector_idx[code]; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1071 cf = VMUL2(cf, vq, cb_idx, sf + idx); |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1072 } while (len -= 2); |
|
10876
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1073 } |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1074 break; |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1075 |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1076 case 3: |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1077 case 4: |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1078 for (group = 0; group < g_len; group++, cfo+=128) { |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1079 float *cf = cfo; |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1080 int len = off_len; |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1081 |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1082 do { |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1083 int code; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1084 unsigned nnz; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1085 unsigned cb_idx; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1086 unsigned sign; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1087 |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1088 UPDATE_CACHE(re, gb); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1089 GET_VLC(code, re, gb, vlc_tab, 8, 2); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1090 |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1091 if (code >= cb_size) { |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1092 err_idx = code; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1093 goto err_cb_overflow; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1094 } |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1095 |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1096 cb_idx = cb_vector_idx[code]; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1097 nnz = cb_idx >> 8 & 15; |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1098 sign = SHOW_UBITS(re, gb, nnz) << (cb_idx >> 12); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1099 LAST_SKIP_BITS(re, gb, nnz); |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1100 cf = VMUL2S(cf, vq, cb_idx, sign, sf + idx); |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1101 } while (len -= 2); |
|
10876
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1102 } |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1103 break; |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1104 |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1105 default: |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1106 for (group = 0; group < g_len; group++, cfo+=128) { |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1107 float *cf = cfo; |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1108 uint32_t *icf = (uint32_t *) cf; |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1109 int len = off_len; |
|
03d8758218d2
AAC: Unswitch loop over window groups in decode_spectrum_and_dequant()
mru
parents:
10875
diff
changeset
|
1110 |
|
10875
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
1111 do { |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1112 int code; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1113 unsigned nzt, nnz; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1114 unsigned cb_idx; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1115 uint32_t bits; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1116 int j; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1117 |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1118 UPDATE_CACHE(re, gb); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1119 GET_VLC(code, re, gb, vlc_tab, 8, 2); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1120 |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1121 if (!code) { |
|
10875
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
1122 *icf++ = 0; |
|
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
1123 *icf++ = 0; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1124 continue; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1125 } |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1126 |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1127 if (code >= cb_size) { |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1128 err_idx = code; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1129 goto err_cb_overflow; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1130 } |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1131 |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1132 cb_idx = cb_vector_idx[code]; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1133 nnz = cb_idx >> 12; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1134 nzt = cb_idx >> 8; |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1135 bits = SHOW_UBITS(re, gb, nnz) << (32-nnz); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1136 LAST_SKIP_BITS(re, gb, nnz); |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1137 |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1138 for (j = 0; j < 2; j++) { |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1139 if (nzt & 1<<j) { |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1140 uint32_t b; |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1141 int n; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1142 /* The total length of escape_sequence must be < 22 bits according |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1143 to the specification (i.e. max is 111111110xxxxxxxxxxxx). */ |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1144 UPDATE_CACHE(re, gb); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1145 b = GET_CACHE(re, gb); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1146 b = 31 - av_log2(~b); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1147 |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1148 if (b > 8) { |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1149 av_log(ac->avccontext, AV_LOG_ERROR, "error in spectral data, ESC overflow\n"); |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1150 return -1; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1151 } |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1152 |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1153 #if MIN_CACHE_BITS < 21 |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1154 LAST_SKIP_BITS(re, gb, b + 1); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1155 UPDATE_CACHE(re, gb); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1156 #else |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1157 SKIP_BITS(re, gb, b + 1); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1158 #endif |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1159 b += 4; |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1160 n = (1 << b) + SHOW_UBITS(re, gb, b); |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1161 LAST_SKIP_BITS(re, gb, b); |
|
10875
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
1162 *icf++ = cbrt_tab[n] | (bits & 1<<31); |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1163 bits <<= 1; |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1164 } else { |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1165 unsigned v = ((const uint32_t*)vq)[cb_idx & 15]; |
|
10875
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
1166 *icf++ = (bits & 1<<31) | v; |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1167 bits <<= !!v; |
| 9053 | 1168 } |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1169 cb_idx >>= 4; |
|
9052
54973ad4b7cf
Refactor AAC unsigned band type decoding for a modest speedup.
alexc
parents:
9051
diff
changeset
|
1170 } |
|
10875
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
1171 } while (len -= 2); |
| 10220 | 1172 |
|
10875
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
1173 ac->dsp.vector_fmul_scalar(cfo, cfo, sf[idx], off_len); |
| 7581 | 1174 } |
| 1175 } | |
|
10886
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1176 |
|
966a8afdd9aa
AAC: optimise bitstream reading in decode_spectrum_and_dequant()
mru
parents:
10881
diff
changeset
|
1177 CLOSE_READER(re, gb); |
| 7581 | 1178 } |
| 1179 } | |
|
10875
6a6a1c2d8745
AAC: simplify some calculations in decode_spectrum_and_dequant()
mru
parents:
10874
diff
changeset
|
1180 coef += g_len << 7; |
| 7581 | 1181 } |
| 1182 | |
| 1183 if (pulse_present) { | |
|
7857
d7801471cd52
Apply pulses to unscaled coefficients rather than scaled.
superdump
parents:
7856
diff
changeset
|
1184 idx = 0; |
| 10004 | 1185 for (i = 0; i < pulse->num_pulse; i++) { |
| 1186 float co = coef_base[ pulse->pos[i] ]; | |
| 1187 while (offsets[idx + 1] <= pulse->pos[i]) | |
|
7857
d7801471cd52
Apply pulses to unscaled coefficients rather than scaled.
superdump
parents:
7856
diff
changeset
|
1188 idx++; |
|
d7801471cd52
Apply pulses to unscaled coefficients rather than scaled.
superdump
parents:
7856
diff
changeset
|
1189 if (band_type[idx] != NOISE_BT && sf[idx]) { |
| 7858 | 1190 float ico = -pulse->amp[i]; |
| 1191 if (co) { | |
| 1192 co /= sf[idx]; | |
| 1193 ico = co / sqrtf(sqrtf(fabsf(co))) + (co > 0 ? -ico : ico); | |
| 1194 } | |
| 1195 coef_base[ pulse->pos[i] ] = cbrtf(fabsf(ico)) * ico * sf[idx]; | |
|
7857
d7801471cd52
Apply pulses to unscaled coefficients rather than scaled.
superdump
parents:
7856
diff
changeset
|
1196 } |
| 7581 | 1197 } |
| 1198 } | |
| 1199 return 0; | |
|
10874
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1200 |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1201 err_cb_overflow: |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1202 av_log(ac->avccontext, AV_LOG_ERROR, |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1203 "Read beyond end of ff_aac_codebook_vectors[%d][]. index %d >= %d\n", |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1204 band_type[idx], err_idx, ff_aac_spectral_sizes[band_type[idx]]); |
|
bcfe2acbf190
AAC: Compress codebook tables and optimise sign bit handling
mru
parents:
10849
diff
changeset
|
1205 return -1; |
| 7581 | 1206 } |
| 1207 | |
| 10004 | 1208 static av_always_inline float flt16_round(float pf) |
| 1209 { | |
|
9179
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
1210 union float754 tmp; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
1211 tmp.f = pf; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
1212 tmp.i = (tmp.i + 0x00008000U) & 0xFFFF0000U; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
1213 return tmp.f; |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1214 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1215 |
| 10004 | 1216 static av_always_inline float flt16_even(float pf) |
| 1217 { | |
|
9179
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
1218 union float754 tmp; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
1219 tmp.f = pf; |
| 10004 | 1220 tmp.i = (tmp.i + 0x00007FFFU + (tmp.i & 0x00010000U >> 16)) & 0xFFFF0000U; |
|
9179
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
1221 return tmp.f; |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1222 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1223 |
| 10004 | 1224 static av_always_inline float flt16_trunc(float pf) |
| 1225 { | |
|
9179
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
1226 union float754 pun; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
1227 pun.f = pf; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
1228 pun.i &= 0xFFFF0000U; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
1229 return pun.f; |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1230 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1231 |
| 10004 | 1232 static void predict(AACContext *ac, PredictorState *ps, float *coef, |
| 1233 int output_enable) | |
| 1234 { | |
| 1235 const float a = 0.953125; // 61.0 / 64 | |
| 1236 const float alpha = 0.90625; // 29.0 / 32 | |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1237 float e0, e1; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1238 float pv; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1239 float k1, k2; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1240 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1241 k1 = ps->var0 > 1 ? ps->cor0 * flt16_even(a / ps->var0) : 0; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1242 k2 = ps->var1 > 1 ? ps->cor1 * flt16_even(a / ps->var1) : 0; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1243 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1244 pv = flt16_round(k1 * ps->r0 + k2 * ps->r1); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1245 if (output_enable) |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1246 *coef += pv * ac->sf_scale; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1247 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1248 e0 = *coef / ac->sf_scale; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1249 e1 = e0 - k1 * ps->r0; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1250 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1251 ps->cor1 = flt16_trunc(alpha * ps->cor1 + ps->r1 * e1); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1252 ps->var1 = flt16_trunc(alpha * ps->var1 + 0.5 * (ps->r1 * ps->r1 + e1 * e1)); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1253 ps->cor0 = flt16_trunc(alpha * ps->cor0 + ps->r0 * e0); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1254 ps->var0 = flt16_trunc(alpha * ps->var0 + 0.5 * (ps->r0 * ps->r0 + e0 * e0)); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1255 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1256 ps->r1 = flt16_trunc(a * (ps->r0 - k1 * e0)); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1257 ps->r0 = flt16_trunc(a * e0); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1258 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1259 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1260 /** |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1261 * Apply AAC-Main style frequency domain prediction. |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1262 */ |
| 10004 | 1263 static void apply_prediction(AACContext *ac, SingleChannelElement *sce) |
| 1264 { | |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1265 int sfb, k; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1266 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1267 if (!sce->ics.predictor_initialized) { |
|
8413
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1268 reset_all_predictors(sce->predictor_state); |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1269 sce->ics.predictor_initialized = 1; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1270 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1271 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1272 if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1273 for (sfb = 0; sfb < ff_aac_pred_sfb_max[ac->m4ac.sampling_index]; sfb++) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1274 for (k = sce->ics.swb_offset[sfb]; k < sce->ics.swb_offset[sfb + 1]; k++) { |
|
8413
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1275 predict(ac, &sce->predictor_state[k], &sce->coeffs[k], |
| 10004 | 1276 sce->ics.predictor_present && sce->ics.prediction_used[sfb]); |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1277 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1278 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1279 if (sce->ics.predictor_reset_group) |
|
8413
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1280 reset_predictor_group(sce->predictor_state, sce->ics.predictor_reset_group); |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1281 } else |
|
8413
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1282 reset_all_predictors(sce->predictor_state); |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1283 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1284 |
| 7581 | 1285 /** |
| 7539 | 1286 * Decode an individual_channel_stream payload; reference: table 4.44. |
| 1287 * | |
| 1288 * @param common_window Channels have independent [0], or shared [1], Individual Channel Stream information. | |
| 1289 * @param scale_flag scalable [1] or non-scalable [0] AAC (Unused until scalable AAC is implemented.) | |
| 1290 * | |
| 1291 * @return Returns error status. 0 - OK, !0 - error | |
| 1292 */ | |
| 10004 | 1293 static int decode_ics(AACContext *ac, SingleChannelElement *sce, |
| 1294 GetBitContext *gb, int common_window, int scale_flag) | |
| 1295 { | |
| 7539 | 1296 Pulse pulse; |
| 10004 | 1297 TemporalNoiseShaping *tns = &sce->tns; |
| 1298 IndividualChannelStream *ics = &sce->ics; | |
| 1299 float *out = sce->coeffs; | |
| 7539 | 1300 int global_gain, pulse_present = 0; |
| 1301 | |
| 7580 | 1302 /* This assignment is to silence a GCC warning about the variable being used |
| 1303 * uninitialized when in fact it always is. | |
| 7539 | 1304 */ |
| 1305 pulse.num_pulse = 0; | |
| 1306 | |
| 1307 global_gain = get_bits(gb, 8); | |
| 1308 | |
| 1309 if (!common_window && !scale_flag) { | |
| 1310 if (decode_ics_info(ac, ics, gb, 0) < 0) | |
| 1311 return -1; | |
| 1312 } | |
| 1313 | |
| 1314 if (decode_band_types(ac, sce->band_type, sce->band_type_run_end, gb, ics) < 0) | |
| 1315 return -1; | |
| 1316 if (decode_scalefactors(ac, sce->sf, gb, global_gain, ics, sce->band_type, sce->band_type_run_end) < 0) | |
| 1317 return -1; | |
| 1318 | |
| 1319 pulse_present = 0; | |
| 1320 if (!scale_flag) { | |
| 1321 if ((pulse_present = get_bits1(gb))) { | |
| 1322 if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { | |
| 1323 av_log(ac->avccontext, AV_LOG_ERROR, "Pulse tool not allowed in eight short sequence.\n"); | |
| 1324 return -1; | |
| 1325 } | |
|
7871
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
1326 if (decode_pulses(&pulse, gb, ics->swb_offset, ics->num_swb)) { |
|
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
1327 av_log(ac->avccontext, AV_LOG_ERROR, "Pulse data corrupt or invalid.\n"); |
|
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
1328 return -1; |
|
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
1329 } |
| 7539 | 1330 } |
| 1331 if ((tns->present = get_bits1(gb)) && decode_tns(ac, tns, gb, ics)) | |
| 1332 return -1; | |
| 1333 if (get_bits1(gb)) { | |
|
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9847
diff
changeset
|
1334 av_log_missing_feature(ac->avccontext, "SSR", 1); |
| 7539 | 1335 return -1; |
| 1336 } | |
| 1337 } | |
| 1338 | |
| 7580 | 1339 if (decode_spectrum_and_dequant(ac, out, gb, sce->sf, pulse_present, &pulse, ics, sce->band_type) < 0) |
| 7539 | 1340 return -1; |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1341 |
| 10004 | 1342 if (ac->m4ac.object_type == AOT_AAC_MAIN && !common_window) |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1343 apply_prediction(ac, sce); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1344 |
| 7539 | 1345 return 0; |
| 1346 } | |
| 1347 | |
| 1348 /** | |
| 7581 | 1349 * Mid/Side stereo decoding; reference: 4.6.8.1.3. |
| 1350 */ | |
| 10220 | 1351 static void apply_mid_side_stereo(AACContext *ac, ChannelElement *cpe) |
| 10004 | 1352 { |
| 1353 const IndividualChannelStream *ics = &cpe->ch[0].ics; | |
| 7581 | 1354 float *ch0 = cpe->ch[0].coeffs; |
| 1355 float *ch1 = cpe->ch[1].coeffs; | |
| 10220 | 1356 int g, i, group, idx = 0; |
| 10004 | 1357 const uint16_t *offsets = ics->swb_offset; |
| 7581 | 1358 for (g = 0; g < ics->num_window_groups; g++) { |
| 1359 for (i = 0; i < ics->max_sfb; i++, idx++) { | |
| 1360 if (cpe->ms_mask[idx] && | |
| 10004 | 1361 cpe->ch[0].band_type[idx] < NOISE_BT && cpe->ch[1].band_type[idx] < NOISE_BT) { |
| 7581 | 1362 for (group = 0; group < ics->group_len[g]; group++) { |
| 10220 | 1363 ac->dsp.butterflies_float(ch0 + group * 128 + offsets[i], |
| 1364 ch1 + group * 128 + offsets[i], | |
| 1365 offsets[i+1] - offsets[i]); | |
| 7581 | 1366 } |
| 1367 } | |
| 1368 } | |
| 10004 | 1369 ch0 += ics->group_len[g] * 128; |
| 1370 ch1 += ics->group_len[g] * 128; | |
| 7581 | 1371 } |
| 1372 } | |
| 1373 | |
| 1374 /** | |
| 1375 * intensity stereo decoding; reference: 4.6.8.2.3 | |
| 1376 * | |
| 1377 * @param ms_present Indicates mid/side stereo presence. [0] mask is all 0s; | |
| 1378 * [1] mask is decoded from bitstream; [2] mask is all 1s; | |
| 1379 * [3] reserved for scalable AAC | |
| 1380 */ | |
| 10004 | 1381 static void apply_intensity_stereo(ChannelElement *cpe, int ms_present) |
| 1382 { | |
| 1383 const IndividualChannelStream *ics = &cpe->ch[1].ics; | |
| 1384 SingleChannelElement *sce1 = &cpe->ch[1]; | |
| 7581 | 1385 float *coef0 = cpe->ch[0].coeffs, *coef1 = cpe->ch[1].coeffs; |
| 10004 | 1386 const uint16_t *offsets = ics->swb_offset; |
| 7581 | 1387 int g, group, i, k, idx = 0; |
| 1388 int c; | |
| 1389 float scale; | |
| 1390 for (g = 0; g < ics->num_window_groups; g++) { | |
| 1391 for (i = 0; i < ics->max_sfb;) { | |
| 1392 if (sce1->band_type[idx] == INTENSITY_BT || sce1->band_type[idx] == INTENSITY_BT2) { | |
| 1393 const int bt_run_end = sce1->band_type_run_end[idx]; | |
| 1394 for (; i < bt_run_end; i++, idx++) { | |
| 1395 c = -1 + 2 * (sce1->band_type[idx] - 14); | |
| 1396 if (ms_present) | |
| 1397 c *= 1 - 2 * cpe->ms_mask[idx]; | |
| 1398 scale = c * sce1->sf[idx]; | |
| 1399 for (group = 0; group < ics->group_len[g]; group++) | |
| 10004 | 1400 for (k = offsets[i]; k < offsets[i + 1]; k++) |
| 1401 coef1[group * 128 + k] = scale * coef0[group * 128 + k]; | |
| 7581 | 1402 } |
| 1403 } else { | |
| 1404 int bt_run_end = sce1->band_type_run_end[idx]; | |
| 1405 idx += bt_run_end - i; | |
| 1406 i = bt_run_end; | |
| 1407 } | |
| 1408 } | |
| 10004 | 1409 coef0 += ics->group_len[g] * 128; |
| 1410 coef1 += ics->group_len[g] * 128; | |
| 7581 | 1411 } |
| 1412 } | |
| 1413 | |
| 1414 /** | |
| 7539 | 1415 * Decode a channel_pair_element; reference: table 4.4. |
| 1416 * | |
| 1417 * @param elem_id Identifies the instance of a syntax element. | |
| 1418 * | |
| 1419 * @return Returns error status. 0 - OK, !0 - error | |
| 1420 */ | |
| 10004 | 1421 static int decode_cpe(AACContext *ac, GetBitContext *gb, ChannelElement *cpe) |
| 1422 { | |
| 7539 | 1423 int i, ret, common_window, ms_present = 0; |
| 1424 | |
| 1425 common_window = get_bits1(gb); | |
| 1426 if (common_window) { | |
| 1427 if (decode_ics_info(ac, &cpe->ch[0].ics, gb, 1)) | |
| 1428 return -1; | |
| 1429 i = cpe->ch[1].ics.use_kb_window[0]; | |
| 1430 cpe->ch[1].ics = cpe->ch[0].ics; | |
| 1431 cpe->ch[1].ics.use_kb_window[1] = i; | |
| 1432 ms_present = get_bits(gb, 2); | |
| 10004 | 1433 if (ms_present == 3) { |
| 7539 | 1434 av_log(ac->avccontext, AV_LOG_ERROR, "ms_present = 3 is reserved.\n"); |
| 1435 return -1; | |
| 10004 | 1436 } else if (ms_present) |
| 7539 | 1437 decode_mid_side_stereo(cpe, gb, ms_present); |
| 1438 } | |
| 1439 if ((ret = decode_ics(ac, &cpe->ch[0], gb, common_window, 0))) | |
| 1440 return ret; | |
| 1441 if ((ret = decode_ics(ac, &cpe->ch[1], gb, common_window, 0))) | |
| 1442 return ret; | |
| 1443 | |
|
8413
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1444 if (common_window) { |
|
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1445 if (ms_present) |
| 10220 | 1446 apply_mid_side_stereo(ac, cpe); |
|
8413
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1447 if (ac->m4ac.object_type == AOT_AAC_MAIN) { |
|
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1448 apply_prediction(ac, &cpe->ch[0]); |
|
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1449 apply_prediction(ac, &cpe->ch[1]); |
|
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1450 } |
|
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1451 } |
| 7539 | 1452 |
| 7580 | 1453 apply_intensity_stereo(cpe, ms_present); |
| 7539 | 1454 return 0; |
| 1455 } | |
| 1456 | |
| 7581 | 1457 /** |
| 1458 * Decode coupling_channel_element; reference: table 4.8. | |
| 1459 * | |
| 1460 * @param elem_id Identifies the instance of a syntax element. | |
| 1461 * | |
| 1462 * @return Returns error status. 0 - OK, !0 - error | |
| 1463 */ | |
| 10004 | 1464 static int decode_cce(AACContext *ac, GetBitContext *gb, ChannelElement *che) |
| 1465 { | |
| 7581 | 1466 int num_gain = 0; |
|
7891
13ee9bb85721
Zero 'idx' for each iteration of the coupling gain loop and as it is only used
superdump
parents:
7890
diff
changeset
|
1467 int c, g, sfb, ret; |
| 7581 | 1468 int sign; |
| 1469 float scale; | |
| 10004 | 1470 SingleChannelElement *sce = &che->ch[0]; |
| 1471 ChannelCoupling *coup = &che->coup; | |
| 7581 | 1472 |
| 10004 | 1473 coup->coupling_point = 2 * get_bits1(gb); |
| 7578 | 1474 coup->num_coupled = get_bits(gb, 3); |
| 1475 for (c = 0; c <= coup->num_coupled; c++) { | |
| 1476 num_gain++; | |
| 1477 coup->type[c] = get_bits1(gb) ? TYPE_CPE : TYPE_SCE; | |
| 1478 coup->id_select[c] = get_bits(gb, 4); | |
| 1479 if (coup->type[c] == TYPE_CPE) { | |
| 1480 coup->ch_select[c] = get_bits(gb, 2); | |
| 1481 if (coup->ch_select[c] == 3) | |
| 1482 num_gain++; | |
| 1483 } else | |
|
8004
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1484 coup->ch_select[c] = 2; |
| 7578 | 1485 } |
| 10004 | 1486 coup->coupling_point += get_bits1(gb) || (coup->coupling_point >> 1); |
| 7578 | 1487 |
| 10004 | 1488 sign = get_bits(gb, 1); |
|
7889
fdd3e68dcf94
Cast the return value of get_bits() to signed integer such that the subtraction
superdump
parents:
7871
diff
changeset
|
1489 scale = pow(2., pow(2., (int)get_bits(gb, 2) - 3)); |
| 7578 | 1490 |
| 1491 if ((ret = decode_ics(ac, sce, gb, 0, 0))) | |
| 1492 return ret; | |
| 1493 | |
| 1494 for (c = 0; c < num_gain; c++) { | |
| 10004 | 1495 int idx = 0; |
| 1496 int cge = 1; | |
| 7578 | 1497 int gain = 0; |
| 1498 float gain_cache = 1.; | |
| 1499 if (c) { | |
| 1500 cge = coup->coupling_point == AFTER_IMDCT ? 1 : get_bits1(gb); | |
| 1501 gain = cge ? get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60: 0; | |
|
8004
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1502 gain_cache = pow(scale, -gain); |
| 7578 | 1503 } |
|
8822
01271e32d74e
Make set coup.gain[c][0] aand only coup.gain[c][0] is set for a independently switched CCE.
alexc
parents:
8814
diff
changeset
|
1504 if (coup->coupling_point == AFTER_IMDCT) { |
|
01271e32d74e
Make set coup.gain[c][0] aand only coup.gain[c][0] is set for a independently switched CCE.
alexc
parents:
8814
diff
changeset
|
1505 coup->gain[c][0] = gain_cache; |
|
01271e32d74e
Make set coup.gain[c][0] aand only coup.gain[c][0] is set for a independently switched CCE.
alexc
parents:
8814
diff
changeset
|
1506 } else { |
| 8823 | 1507 for (g = 0; g < sce->ics.num_window_groups; g++) { |
| 1508 for (sfb = 0; sfb < sce->ics.max_sfb; sfb++, idx++) { | |
| 1509 if (sce->band_type[idx] != ZERO_BT) { | |
| 1510 if (!cge) { | |
| 1511 int t = get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60; | |
| 10004 | 1512 if (t) { |
| 8823 | 1513 int s = 1; |
| 1514 t = gain += t; | |
| 1515 if (sign) { | |
| 1516 s -= 2 * (t & 0x1); | |
| 1517 t >>= 1; | |
| 1518 } | |
| 1519 gain_cache = pow(scale, -t) * s; | |
| 7578 | 1520 } |
| 1521 } | |
| 8823 | 1522 coup->gain[c][idx] = gain_cache; |
| 7578 | 1523 } |
| 1524 } | |
| 7890 | 1525 } |
| 1526 } | |
| 7578 | 1527 } |
| 1528 return 0; | |
| 1529 } | |
| 1530 | |
| 7539 | 1531 /** |
| 1532 * Decode Spectral Band Replication extension data; reference: table 4.55. | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1533 * |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1534 * @param crc flag indicating the presence of CRC checksum |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1535 * @param cnt length of TYPE_FIL syntactic element in bytes |
| 7539 | 1536 * |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1537 * @return Returns number of bytes consumed from the TYPE_FIL element. |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1538 */ |
| 10004 | 1539 static int decode_sbr_extension(AACContext *ac, GetBitContext *gb, |
| 1540 int crc, int cnt) | |
| 1541 { | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1542 // TODO : sbr_extension implementation |
|
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9847
diff
changeset
|
1543 av_log_missing_feature(ac->avccontext, "SBR", 0); |
| 10004 | 1544 skip_bits_long(gb, 8 * cnt - 4); // -4 due to reading extension type |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1545 return cnt; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1546 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1547 |
| 7539 | 1548 /** |
| 7578 | 1549 * Parse whether channels are to be excluded from Dynamic Range Compression; reference: table 4.53. |
| 1550 * | |
| 1551 * @return Returns number of bytes consumed. | |
| 1552 */ | |
| 10004 | 1553 static int decode_drc_channel_exclusions(DynamicRangeControl *che_drc, |
| 1554 GetBitContext *gb) | |
| 1555 { | |
| 7578 | 1556 int i; |
| 1557 int num_excl_chan = 0; | |
| 1558 | |
| 1559 do { | |
| 1560 for (i = 0; i < 7; i++) | |
| 1561 che_drc->exclude_mask[num_excl_chan++] = get_bits1(gb); | |
| 1562 } while (num_excl_chan < MAX_CHANNELS - 7 && get_bits1(gb)); | |
| 1563 | |
| 1564 return num_excl_chan / 7; | |
| 1565 } | |
| 1566 | |
| 1567 /** | |
| 7539 | 1568 * Decode dynamic range information; reference: table 4.52. |
| 1569 * | |
| 1570 * @param cnt length of TYPE_FIL syntactic element in bytes | |
| 1571 * | |
| 1572 * @return Returns number of bytes consumed. | |
| 1573 */ | |
| 10004 | 1574 static int decode_dynamic_range(DynamicRangeControl *che_drc, |
| 1575 GetBitContext *gb, int cnt) | |
| 1576 { | |
| 1577 int n = 1; | |
| 7539 | 1578 int drc_num_bands = 1; |
| 1579 int i; | |
| 1580 | |
| 1581 /* pce_tag_present? */ | |
| 10004 | 1582 if (get_bits1(gb)) { |
| 7539 | 1583 che_drc->pce_instance_tag = get_bits(gb, 4); |
| 1584 skip_bits(gb, 4); // tag_reserved_bits | |
| 1585 n++; | |
| 1586 } | |
| 1587 | |
| 1588 /* excluded_chns_present? */ | |
| 10004 | 1589 if (get_bits1(gb)) { |
| 7539 | 1590 n += decode_drc_channel_exclusions(che_drc, gb); |
| 1591 } | |
| 1592 | |
| 1593 /* drc_bands_present? */ | |
| 1594 if (get_bits1(gb)) { | |
| 1595 che_drc->band_incr = get_bits(gb, 4); | |
| 1596 che_drc->interpolation_scheme = get_bits(gb, 4); | |
| 1597 n++; | |
| 1598 drc_num_bands += che_drc->band_incr; | |
| 1599 for (i = 0; i < drc_num_bands; i++) { | |
| 1600 che_drc->band_top[i] = get_bits(gb, 8); | |
| 1601 n++; | |
| 1602 } | |
| 1603 } | |
| 1604 | |
| 1605 /* prog_ref_level_present? */ | |
| 1606 if (get_bits1(gb)) { | |
| 1607 che_drc->prog_ref_level = get_bits(gb, 7); | |
| 1608 skip_bits1(gb); // prog_ref_level_reserved_bits | |
| 1609 n++; | |
| 1610 } | |
| 1611 | |
| 1612 for (i = 0; i < drc_num_bands; i++) { | |
| 1613 che_drc->dyn_rng_sgn[i] = get_bits1(gb); | |
| 1614 che_drc->dyn_rng_ctl[i] = get_bits(gb, 7); | |
| 1615 n++; | |
| 1616 } | |
| 1617 | |
| 1618 return n; | |
| 1619 } | |
| 1620 | |
| 1621 /** | |
| 1622 * Decode extension data (incomplete); reference: table 4.51. | |
| 1623 * | |
| 1624 * @param cnt length of TYPE_FIL syntactic element in bytes | |
| 1625 * | |
| 1626 * @return Returns number of bytes consumed | |
| 1627 */ | |
| 10004 | 1628 static int decode_extension_payload(AACContext *ac, GetBitContext *gb, int cnt) |
| 1629 { | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1630 int crc_flag = 0; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1631 int res = cnt; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1632 switch (get_bits(gb, 4)) { // extension type |
| 10004 | 1633 case EXT_SBR_DATA_CRC: |
| 1634 crc_flag++; | |
| 1635 case EXT_SBR_DATA: | |
| 1636 res = decode_sbr_extension(ac, gb, crc_flag, cnt); | |
| 1637 break; | |
| 1638 case EXT_DYNAMIC_RANGE: | |
| 1639 res = decode_dynamic_range(&ac->che_drc, gb, cnt); | |
| 1640 break; | |
| 1641 case EXT_FILL: | |
| 1642 case EXT_FILL_DATA: | |
| 1643 case EXT_DATA_ELEMENT: | |
| 1644 default: | |
| 1645 skip_bits_long(gb, 8 * cnt - 4); | |
| 1646 break; | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1647 }; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1648 return res; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1649 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1650 |
|
7632
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1651 /** |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1652 * Decode Temporal Noise Shaping filter coefficients and apply all-pole filters; reference: 4.6.9.3. |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1653 * |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1654 * @param decode 1 if tool is used normally, 0 if tool is used in LTP. |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1655 * @param coef spectral coefficients |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1656 */ |
| 10004 | 1657 static void apply_tns(float coef[1024], TemporalNoiseShaping *tns, |
| 1658 IndividualChannelStream *ics, int decode) | |
| 1659 { | |
| 1660 const int mmm = FFMIN(ics->tns_max_bands, ics->max_sfb); | |
| 7636 | 1661 int w, filt, m, i; |
|
7632
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1662 int bottom, top, order, start, end, size, inc; |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1663 float lpc[TNS_MAX_ORDER]; |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1664 |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1665 for (w = 0; w < ics->num_windows; w++) { |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1666 bottom = ics->num_swb; |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1667 for (filt = 0; filt < tns->n_filt[w]; filt++) { |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1668 top = bottom; |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1669 bottom = FFMAX(0, top - tns->length[w][filt]); |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1670 order = tns->order[w][filt]; |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1671 if (order == 0) |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1672 continue; |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1673 |
|
7788
ffd4b1364b62
Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
vitor
parents:
7733
diff
changeset
|
1674 // tns_decode_coef |
|
ffd4b1364b62
Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
vitor
parents:
7733
diff
changeset
|
1675 compute_lpc_coefs(tns->coef[w][filt], order, lpc, 0, 0, 0); |
|
7632
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1676 |
| 7609 | 1677 start = ics->swb_offset[FFMIN(bottom, mmm)]; |
| 1678 end = ics->swb_offset[FFMIN( top, mmm)]; | |
| 1679 if ((size = end - start) <= 0) | |
| 1680 continue; | |
| 1681 if (tns->direction[w][filt]) { | |
| 10004 | 1682 inc = -1; |
| 1683 start = end - 1; | |
| 7609 | 1684 } else { |
| 1685 inc = 1; | |
| 1686 } | |
| 1687 start += w * 128; | |
| 1688 | |
| 1689 // ar filter | |
| 1690 for (m = 0; m < size; m++, start += inc) | |
| 1691 for (i = 1; i <= FFMIN(m, order); i++) | |
| 10004 | 1692 coef[start] -= coef[start - i * inc] * lpc[i - 1]; |
| 7609 | 1693 } |
| 1694 } | |
| 1695 } | |
| 1696 | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1697 /** |
| 7539 | 1698 * Conduct IMDCT and windowing. |
| 1699 */ | |
| 10004 | 1700 static void imdct_and_windowing(AACContext *ac, SingleChannelElement *sce) |
| 1701 { | |
| 1702 IndividualChannelStream *ics = &sce->ics; | |
| 1703 float *in = sce->coeffs; | |
| 1704 float *out = sce->ret; | |
| 1705 float *saved = sce->saved; | |
| 1706 const float *swindow = ics->use_kb_window[0] ? ff_aac_kbd_short_128 : ff_sine_128; | |
| 1707 const float *lwindow_prev = ics->use_kb_window[1] ? ff_aac_kbd_long_1024 : ff_sine_1024; | |
| 1708 const float *swindow_prev = ics->use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128; | |
| 1709 float *buf = ac->buf_mdct; | |
| 1710 float *temp = ac->temp; | |
| 7539 | 1711 int i; |
| 1712 | |
|
7661
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1713 // imdct |
| 7578 | 1714 if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { |
| 1715 if (ics->window_sequence[1] == ONLY_LONG_SEQUENCE || ics->window_sequence[1] == LONG_STOP_SEQUENCE) | |
| 1716 av_log(ac->avccontext, AV_LOG_WARNING, | |
| 1717 "Transition from an ONLY_LONG or LONG_STOP to an EIGHT_SHORT sequence detected. " | |
| 1718 "If you heard an audible artifact, please submit the sample to the FFmpeg developers.\n"); | |
|
7663
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1719 for (i = 0; i < 1024; i += 128) |
|
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1720 ff_imdct_half(&ac->mdct_small, buf + i, in + i); |
|
7661
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1721 } else |
|
7663
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1722 ff_imdct_half(&ac->mdct, buf, in); |
|
7661
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1723 |
|
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1724 /* window overlapping |
|
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1725 * NOTE: To simplify the overlapping code, all 'meaningless' short to long |
|
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1726 * and long to short transitions are considered to be short to short |
|
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1727 * transitions. This leaves just two cases (long to long and short to short) |
|
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1728 * with a little special sauce for EIGHT_SHORT_SEQUENCE. |
|
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1729 */ |
|
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1730 if ((ics->window_sequence[1] == ONLY_LONG_SEQUENCE || ics->window_sequence[1] == LONG_STOP_SEQUENCE) && |
| 10004 | 1731 (ics->window_sequence[0] == ONLY_LONG_SEQUENCE || ics->window_sequence[0] == LONG_START_SEQUENCE)) { |
|
7663
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1732 ac->dsp.vector_fmul_window( out, saved, buf, lwindow_prev, ac->add_bias, 512); |
|
7661
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1733 } else { |
| 7662 | 1734 for (i = 0; i < 448; i++) |
| 1735 out[i] = saved[i] + ac->add_bias; | |
| 7578 | 1736 |
|
7661
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1737 if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { |
|
7663
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1738 ac->dsp.vector_fmul_window(out + 448 + 0*128, saved + 448, buf + 0*128, swindow_prev, ac->add_bias, 64); |
|
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1739 ac->dsp.vector_fmul_window(out + 448 + 1*128, buf + 0*128 + 64, buf + 1*128, swindow, ac->add_bias, 64); |
|
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1740 ac->dsp.vector_fmul_window(out + 448 + 2*128, buf + 1*128 + 64, buf + 2*128, swindow, ac->add_bias, 64); |
|
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1741 ac->dsp.vector_fmul_window(out + 448 + 3*128, buf + 2*128 + 64, buf + 3*128, swindow, ac->add_bias, 64); |
|
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1742 ac->dsp.vector_fmul_window(temp, buf + 3*128 + 64, buf + 4*128, swindow, ac->add_bias, 64); |
|
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1743 memcpy( out + 448 + 4*128, temp, 64 * sizeof(float)); |
|
7661
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1744 } else { |
|
7663
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1745 ac->dsp.vector_fmul_window(out + 448, saved + 448, buf, swindow_prev, ac->add_bias, 64); |
| 7662 | 1746 for (i = 576; i < 1024; i++) |
|
7663
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1747 out[i] = buf[i-512] + ac->add_bias; |
|
7661
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1748 } |
|
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1749 } |
| 7578 | 1750 |
|
7661
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1751 // buffer update |
|
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1752 if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { |
|
7663
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1753 for (i = 0; i < 64; i++) |
|
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1754 saved[i] = temp[64 + i] - ac->add_bias; |
|
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1755 ac->dsp.vector_fmul_window(saved + 64, buf + 4*128 + 64, buf + 5*128, swindow, 0, 64); |
|
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1756 ac->dsp.vector_fmul_window(saved + 192, buf + 5*128 + 64, buf + 6*128, swindow, 0, 64); |
|
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1757 ac->dsp.vector_fmul_window(saved + 320, buf + 6*128 + 64, buf + 7*128, swindow, 0, 64); |
|
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1758 memcpy( saved + 448, buf + 7*128 + 64, 64 * sizeof(float)); |
|
7661
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1759 } else if (ics->window_sequence[0] == LONG_START_SEQUENCE) { |
|
7663
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1760 memcpy( saved, buf + 512, 448 * sizeof(float)); |
|
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1761 memcpy( saved + 448, buf + 7*128 + 64, 64 * sizeof(float)); |
|
7661
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1762 } else { // LONG_STOP or ONLY_LONG |
|
7663
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1763 memcpy( saved, buf + 512, 512 * sizeof(float)); |
| 7578 | 1764 } |
| 1765 } | |
| 1766 | |
| 7539 | 1767 /** |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1768 * Apply dependent channel coupling (applied before IMDCT). |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1769 * |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1770 * @param index index into coupling gain array |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1771 */ |
| 10004 | 1772 static void apply_dependent_coupling(AACContext *ac, |
| 1773 SingleChannelElement *target, | |
| 1774 ChannelElement *cce, int index) | |
| 1775 { | |
| 1776 IndividualChannelStream *ics = &cce->ch[0].ics; | |
| 1777 const uint16_t *offsets = ics->swb_offset; | |
| 1778 float *dest = target->coeffs; | |
| 1779 const float *src = cce->ch[0].coeffs; | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1780 int g, i, group, k, idx = 0; |
| 10004 | 1781 if (ac->m4ac.object_type == AOT_AAC_LTP) { |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1782 av_log(ac->avccontext, AV_LOG_ERROR, |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1783 "Dependent coupling is not supported together with LTP\n"); |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1784 return; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1785 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1786 for (g = 0; g < ics->num_window_groups; g++) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1787 for (i = 0; i < ics->max_sfb; i++, idx++) { |
|
8006
c7c1e85d14bc
Rename variables to clarify the channel coupling element and corresponding
superdump
parents:
8004
diff
changeset
|
1788 if (cce->ch[0].band_type[idx] != ZERO_BT) { |
| 9143 | 1789 const float gain = cce->coup.gain[index][idx]; |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1790 for (group = 0; group < ics->group_len[g]; group++) { |
| 10004 | 1791 for (k = offsets[i]; k < offsets[i + 1]; k++) { |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1792 // XXX dsputil-ize |
| 10004 | 1793 dest[group * 128 + k] += gain * src[group * 128 + k]; |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1794 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1795 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1796 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1797 } |
| 10004 | 1798 dest += ics->group_len[g] * 128; |
| 1799 src += ics->group_len[g] * 128; | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1800 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1801 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1802 |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1803 /** |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1804 * Apply independent channel coupling (applied after IMDCT). |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1805 * |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1806 * @param index index into coupling gain array |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1807 */ |
| 10004 | 1808 static void apply_independent_coupling(AACContext *ac, |
| 1809 SingleChannelElement *target, | |
| 1810 ChannelElement *cce, int index) | |
| 1811 { | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1812 int i; |
|
9051
0cffed11ee33
Use const to better allow the compiler to optimize AAC independent coupling.
alexc
parents:
8823
diff
changeset
|
1813 const float gain = cce->coup.gain[index][0]; |
|
0cffed11ee33
Use const to better allow the compiler to optimize AAC independent coupling.
alexc
parents:
8823
diff
changeset
|
1814 const float bias = ac->add_bias; |
| 10004 | 1815 const float *src = cce->ch[0].ret; |
| 1816 float *dest = target->ret; | |
|
9051
0cffed11ee33
Use const to better allow the compiler to optimize AAC independent coupling.
alexc
parents:
8823
diff
changeset
|
1817 |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1818 for (i = 0; i < 1024; i++) |
|
9051
0cffed11ee33
Use const to better allow the compiler to optimize AAC independent coupling.
alexc
parents:
8823
diff
changeset
|
1819 dest[i] += gain * (src[i] - bias); |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1820 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1821 |
| 7581 | 1822 /** |
| 1823 * channel coupling transformation interface | |
| 1824 * | |
| 1825 * @param index index into coupling gain array | |
| 1826 * @param apply_coupling_method pointer to (in)dependent coupling function | |
| 1827 */ | |
| 10004 | 1828 static void apply_channel_coupling(AACContext *ac, ChannelElement *cc, |
| 1829 enum RawDataBlockType type, int elem_id, | |
| 1830 enum CouplingPoint coupling_point, | |
| 1831 void (*apply_coupling_method)(AACContext *ac, SingleChannelElement *target, ChannelElement *cce, int index)) | |
| 7581 | 1832 { |
|
8004
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1833 int i, c; |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1834 |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1835 for (i = 0; i < MAX_ELEM_ID; i++) { |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1836 ChannelElement *cce = ac->che[TYPE_CCE][i]; |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1837 int index = 0; |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1838 |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1839 if (cce && cce->coup.coupling_point == coupling_point) { |
| 10004 | 1840 ChannelCoupling *coup = &cce->coup; |
|
8004
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1841 |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1842 for (c = 0; c <= coup->num_coupled; c++) { |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1843 if (coup->type[c] == type && coup->id_select[c] == elem_id) { |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1844 if (coup->ch_select[c] != 1) { |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1845 apply_coupling_method(ac, &cc->ch[0], cce, index); |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1846 if (coup->ch_select[c] != 0) |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1847 index++; |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1848 } |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1849 if (coup->ch_select[c] != 2) |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1850 apply_coupling_method(ac, &cc->ch[1], cce, index++); |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1851 } else |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1852 index += 1 + (coup->ch_select[c] == 3); |
| 7581 | 1853 } |
| 1854 } | |
| 1855 } | |
| 1856 } | |
| 1857 | |
| 1858 /** | |
| 1859 * Convert spectral data to float samples, applying all supported tools as appropriate. | |
| 1860 */ | |
| 10004 | 1861 static void spectral_to_sample(AACContext *ac) |
| 1862 { | |
| 10688 | 1863 int i, type; |
| 1864 for (type = 3; type >= 0; type--) { | |
|
8004
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1865 for (i = 0; i < MAX_ELEM_ID; i++) { |
| 7581 | 1866 ChannelElement *che = ac->che[type][i]; |
| 10004 | 1867 if (che) { |
| 1868 if (type <= TYPE_CPE) | |
|
8004
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1869 apply_channel_coupling(ac, che, type, i, BEFORE_TNS, apply_dependent_coupling); |
| 10004 | 1870 if (che->ch[0].tns.present) |
| 7581 | 1871 apply_tns(che->ch[0].coeffs, &che->ch[0].tns, &che->ch[0].ics, 1); |
| 10004 | 1872 if (che->ch[1].tns.present) |
| 7581 | 1873 apply_tns(che->ch[1].coeffs, &che->ch[1].tns, &che->ch[1].ics, 1); |
| 10004 | 1874 if (type <= TYPE_CPE) |
|
8004
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1875 apply_channel_coupling(ac, che, type, i, BETWEEN_TNS_AND_IMDCT, apply_dependent_coupling); |
| 10004 | 1876 if (type != TYPE_CCE || che->coup.coupling_point == AFTER_IMDCT) |
|
8004
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1877 imdct_and_windowing(ac, &che->ch[0]); |
| 10004 | 1878 if (type == TYPE_CPE) |
| 7581 | 1879 imdct_and_windowing(ac, &che->ch[1]); |
| 10004 | 1880 if (type <= TYPE_CCE) |
|
8004
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1881 apply_channel_coupling(ac, che, type, i, AFTER_IMDCT, apply_independent_coupling); |
| 7578 | 1882 } |
| 1883 } | |
| 1884 } | |
| 1885 } | |
| 1886 | |
| 10004 | 1887 static int parse_adts_frame_header(AACContext *ac, GetBitContext *gb) |
| 1888 { | |
|
8549
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1889 int size; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1890 AACADTSHeaderInfo hdr_info; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1891 |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1892 size = ff_aac_parse_header(gb, &hdr_info); |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1893 if (size > 0) { |
|
10491
74e51b86b934
Don't lock the channel output configuration based on the first value seen for
alexc
parents:
10378
diff
changeset
|
1894 if (ac->output_configured != OC_LOCKED && hdr_info.chan_config) { |
|
9948
98fd723f72e7
Ignore subsequent channel configurations after the first in an AAC file. The
alexc
parents:
9891
diff
changeset
|
1895 enum ChannelPosition new_che_pos[4][MAX_ELEM_ID]; |
|
98fd723f72e7
Ignore subsequent channel configurations after the first in an AAC file. The
alexc
parents:
9891
diff
changeset
|
1896 memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0])); |
|
8549
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1897 ac->m4ac.chan_config = hdr_info.chan_config; |
|
9948
98fd723f72e7
Ignore subsequent channel configurations after the first in an AAC file. The
alexc
parents:
9891
diff
changeset
|
1898 if (set_default_channel_config(ac, new_che_pos, hdr_info.chan_config)) |
|
98fd723f72e7
Ignore subsequent channel configurations after the first in an AAC file. The
alexc
parents:
9891
diff
changeset
|
1899 return -7; |
|
10491
74e51b86b934
Don't lock the channel output configuration based on the first value seen for
alexc
parents:
10378
diff
changeset
|
1900 if (output_configure(ac, ac->che_pos, new_che_pos, hdr_info.chan_config, OC_TRIAL_FRAME)) |
|
9948
98fd723f72e7
Ignore subsequent channel configurations after the first in an AAC file. The
alexc
parents:
9891
diff
changeset
|
1901 return -7; |
|
10491
74e51b86b934
Don't lock the channel output configuration based on the first value seen for
alexc
parents:
10378
diff
changeset
|
1902 } else if (ac->output_configured != OC_LOCKED) { |
|
74e51b86b934
Don't lock the channel output configuration based on the first value seen for
alexc
parents:
10378
diff
changeset
|
1903 ac->output_configured = OC_NONE; |
|
9948
98fd723f72e7
Ignore subsequent channel configurations after the first in an AAC file. The
alexc
parents:
9891
diff
changeset
|
1904 } |
|
10621
62b3faabb663
Set the SBR mode to implicit on ADTS frames occurring before the output is locked.
alexc
parents:
10551
diff
changeset
|
1905 if (ac->output_configured != OC_LOCKED) |
|
62b3faabb663
Set the SBR mode to implicit on ADTS frames occurring before the output is locked.
alexc
parents:
10551
diff
changeset
|
1906 ac->m4ac.sbr = -1; |
|
8549
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1907 ac->m4ac.sample_rate = hdr_info.sample_rate; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1908 ac->m4ac.sampling_index = hdr_info.sampling_index; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1909 ac->m4ac.object_type = hdr_info.object_type; |
|
10657
168ea860d58f
aac: Set sample rate in avctx from ADTS header (if not already set by some
andoma
parents:
10622
diff
changeset
|
1910 if (!ac->avccontext->sample_rate) |
|
168ea860d58f
aac: Set sample rate in avctx from ADTS header (if not already set by some
andoma
parents:
10622
diff
changeset
|
1911 ac->avccontext->sample_rate = hdr_info.sample_rate; |
| 9151 | 1912 if (hdr_info.num_aac_frames == 1) { |
| 1913 if (!hdr_info.crc_absent) | |
| 1914 skip_bits(gb, 16); | |
| 1915 } else { | |
|
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9847
diff
changeset
|
1916 av_log_missing_feature(ac->avccontext, "More than one AAC RDB per ADTS frame is", 0); |
| 9151 | 1917 return -1; |
| 1918 } | |
|
9150
4fe6dee5f1dd
If we get an error from ff_aac_parse_header() we should not trust the header info that it provides.
alexc
parents:
9149
diff
changeset
|
1919 } |
|
8549
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1920 return size; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1921 } |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1922 |
| 10004 | 1923 static int aac_decode_frame(AVCodecContext *avccontext, void *data, |
| 1924 int *data_size, AVPacket *avpkt) | |
| 1925 { | |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9251
diff
changeset
|
1926 const uint8_t *buf = avpkt->data; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9251
diff
changeset
|
1927 int buf_size = avpkt->size; |
| 10004 | 1928 AACContext *ac = avccontext->priv_data; |
| 1929 ChannelElement *che = NULL; | |
| 7578 | 1930 GetBitContext gb; |
| 1931 enum RawDataBlockType elem_type; | |
| 1932 int err, elem_id, data_size_tmp; | |
| 1933 | |
| 10004 | 1934 init_get_bits(&gb, buf, buf_size * 8); |
| 7578 | 1935 |
|
8549
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1936 if (show_bits(&gb, 12) == 0xfff) { |
| 9510 | 1937 if (parse_adts_frame_header(ac, &gb) < 0) { |
|
8549
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1938 av_log(avccontext, AV_LOG_ERROR, "Error decoding AAC frame header.\n"); |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1939 return -1; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1940 } |
| 8812 | 1941 if (ac->m4ac.sampling_index > 12) { |
| 8789 | 1942 av_log(ac->avccontext, AV_LOG_ERROR, "invalid sampling rate index %d\n", ac->m4ac.sampling_index); |
| 1943 return -1; | |
| 1944 } | |
|
8549
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1945 } |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1946 |
| 7578 | 1947 // parse |
| 1948 while ((elem_type = get_bits(&gb, 3)) != TYPE_END) { | |
| 1949 elem_id = get_bits(&gb, 4); | |
| 1950 | |
| 10004 | 1951 if (elem_type < TYPE_DSE && !(che=get_che(ac, elem_type, elem_id))) { |
| 8814 | 1952 av_log(ac->avccontext, AV_LOG_ERROR, "channel element %d.%d is not allocated\n", elem_type, elem_id); |
| 1953 return -1; | |
| 7578 | 1954 } |
| 1955 | |
| 1956 switch (elem_type) { | |
| 1957 | |
| 1958 case TYPE_SCE: | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
1959 err = decode_ics(ac, &che->ch[0], &gb, 0, 0); |
| 7578 | 1960 break; |
| 1961 | |
| 1962 case TYPE_CPE: | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
1963 err = decode_cpe(ac, &gb, che); |
| 7578 | 1964 break; |
| 1965 | |
| 1966 case TYPE_CCE: | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
1967 err = decode_cce(ac, &gb, che); |
| 7578 | 1968 break; |
| 1969 | |
| 1970 case TYPE_LFE: | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
1971 err = decode_ics(ac, &che->ch[0], &gb, 0, 0); |
| 7578 | 1972 break; |
| 1973 | |
| 1974 case TYPE_DSE: | |
| 1975 skip_data_stream_element(&gb); | |
| 1976 err = 0; | |
| 1977 break; | |
| 1978 | |
| 10004 | 1979 case TYPE_PCE: { |
| 7578 | 1980 enum ChannelPosition new_che_pos[4][MAX_ELEM_ID]; |
| 1981 memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0])); | |
| 10004 | 1982 if ((err = decode_pce(ac, new_che_pos, &gb))) |
| 7578 | 1983 break; |
|
10551
a0dd118e82ae
10l: Fix inverted if-condition from r20448. Fixes issue 1562.
alexc
parents:
10519
diff
changeset
|
1984 if (ac->output_configured > OC_TRIAL_PCE) |
|
9948
98fd723f72e7
Ignore subsequent channel configurations after the first in an AAC file. The
alexc
parents:
9891
diff
changeset
|
1985 av_log(avccontext, AV_LOG_ERROR, |
|
98fd723f72e7
Ignore subsequent channel configurations after the first in an AAC file. The
alexc
parents:
9891
diff
changeset
|
1986 "Not evaluating a further program_config_element as this construct is dubious at best.\n"); |
|
98fd723f72e7
Ignore subsequent channel configurations after the first in an AAC file. The
alexc
parents:
9891
diff
changeset
|
1987 else |
|
10491
74e51b86b934
Don't lock the channel output configuration based on the first value seen for
alexc
parents:
10378
diff
changeset
|
1988 err = output_configure(ac, ac->che_pos, new_che_pos, 0, OC_TRIAL_PCE); |
| 7578 | 1989 break; |
| 1990 } | |
| 1991 | |
| 1992 case TYPE_FIL: | |
| 1993 if (elem_id == 15) | |
| 1994 elem_id += get_bits(&gb, 8) - 1; | |
| 1995 while (elem_id > 0) | |
| 1996 elem_id -= decode_extension_payload(ac, &gb, elem_id); | |
| 1997 err = 0; /* FIXME */ | |
| 1998 break; | |
| 1999 | |
| 2000 default: | |
| 2001 err = -1; /* should not happen, but keeps compiler happy */ | |
| 2002 break; | |
| 2003 } | |
| 2004 | |
| 10004 | 2005 if (err) |
| 7578 | 2006 return err; |
| 2007 } | |
| 2008 | |
| 2009 spectral_to_sample(ac); | |
| 2010 | |
| 7539 | 2011 if (!ac->is_saved) { |
| 2012 ac->is_saved = 1; | |
| 2013 *data_size = 0; | |
| 7580 | 2014 return buf_size; |
| 7539 | 2015 } |
| 2016 | |
| 2017 data_size_tmp = 1024 * avccontext->channels * sizeof(int16_t); | |
| 10004 | 2018 if (*data_size < data_size_tmp) { |
| 7539 | 2019 av_log(avccontext, AV_LOG_ERROR, |
| 2020 "Output buffer too small (%d) or trying to output too many samples (%d) for this frame.\n", | |
| 2021 *data_size, data_size_tmp); | |
| 2022 return -1; | |
| 2023 } | |
| 2024 *data_size = data_size_tmp; | |
| 2025 | |
| 2026 ac->dsp.float_to_int16_interleave(data, (const float **)ac->output_data, 1024, avccontext->channels); | |
| 2027 | |
|
10491
74e51b86b934
Don't lock the channel output configuration based on the first value seen for
alexc
parents:
10378
diff
changeset
|
2028 if (ac->output_configured) |
|
74e51b86b934
Don't lock the channel output configuration based on the first value seen for
alexc
parents:
10378
diff
changeset
|
2029 ac->output_configured = OC_LOCKED; |
|
74e51b86b934
Don't lock the channel output configuration based on the first value seen for
alexc
parents:
10378
diff
changeset
|
2030 |
| 7539 | 2031 return buf_size; |
| 2032 } | |
| 2033 | |
| 10004 | 2034 static av_cold int aac_decode_close(AVCodecContext *avccontext) |
| 2035 { | |
| 2036 AACContext *ac = avccontext->priv_data; | |
| 7540 | 2037 int i, type; |
| 7501 | 2038 |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
2039 for (i = 0; i < MAX_ELEM_ID; i++) { |
| 10004 | 2040 for (type = 0; type < 4; type++) |
| 7540 | 2041 av_freep(&ac->che[type][i]); |
| 7501 | 2042 } |
| 2043 | |
| 2044 ff_mdct_end(&ac->mdct); | |
| 2045 ff_mdct_end(&ac->mdct_small); | |
| 10004 | 2046 return 0; |
| 7501 | 2047 } |
| 2048 | |
| 2049 AVCodec aac_decoder = { | |
| 2050 "aac", | |
| 2051 CODEC_TYPE_AUDIO, | |
| 2052 CODEC_ID_AAC, | |
| 2053 sizeof(AACContext), | |
| 2054 aac_decode_init, | |
| 2055 NULL, | |
| 2056 aac_decode_close, | |
| 2057 aac_decode_frame, | |
| 2058 .long_name = NULL_IF_CONFIG_SMALL("Advanced Audio Coding"), | |
|
10145
7955db355703
Make sample_fmts and channel_layouts compound literals const to reduce size of
reimar
parents:
10004
diff
changeset
|
2059 .sample_fmts = (const enum SampleFormat[]) { |
| 10004 | 2060 SAMPLE_FMT_S16,SAMPLE_FMT_NONE |
| 2061 }, | |
|
10306
c97a6cabee62
AAC: Add channel layout support for channel configuration as defined in the
superdump
parents:
10252
diff
changeset
|
2062 .channel_layouts = aac_channel_layout, |
| 7501 | 2063 }; |
