Mercurial > libavcodec.hg
annotate aac.c @ 9896:bbefbca72722 libavcodec
Drop code that attempts to decode frames that are prefixed by junk.
Too often it ends up decoding random data into noise without detecting
it (for example after seeking of some MP3 data with oddly often occurring
startcode emulation).
Fixes issue1154.
| author | michael |
|---|---|
| date | Tue, 30 Jun 2009 03:57:27 +0000 |
| parents | 7ad7d4094d1f |
| children | 98fd723f72e7 |
| 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 | |
|
9179
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
96 union float754 { float f; uint32_t i; }; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
97 |
| 7501 | 98 static VLC vlc_scalefactors; |
| 99 static VLC vlc_spectral[11]; | |
| 100 | |
| 101 | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
102 static ChannelElement* get_che(AACContext *ac, int type, int elem_id) { |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
103 static const int8_t tags_per_config[16] = { 0, 1, 1, 2, 3, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0 }; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
104 if (ac->tag_che_map[type][elem_id]) { |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
105 return ac->tag_che_map[type][elem_id]; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
106 } |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
107 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
|
108 return NULL; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
109 } |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
110 switch (ac->m4ac.chan_config) { |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
111 case 7: |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
112 if (ac->tags_mapped == 3 && type == TYPE_CPE) { |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
113 ac->tags_mapped++; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
114 return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][2]; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
115 } |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
116 case 6: |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
117 /* Some streams incorrectly code 5.1 audio as SCE[0] CPE[0] CPE[1] SCE[1] |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
118 instead of SCE[0] CPE[0] CPE[0] LFE[0]. If we seem to have |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
119 encountered such a stream, transfer the LFE[0] element to SCE[1] */ |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
120 if (ac->tags_mapped == tags_per_config[ac->m4ac.chan_config] - 1 && (type == TYPE_LFE || type == TYPE_SCE)) { |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
121 ac->tags_mapped++; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
122 return ac->tag_che_map[type][elem_id] = ac->che[TYPE_LFE][0]; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
123 } |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
124 case 5: |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
125 if (ac->tags_mapped == 2 && type == TYPE_CPE) { |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
126 ac->tags_mapped++; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
127 return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][1]; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
128 } |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
129 case 4: |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
130 if (ac->tags_mapped == 2 && ac->m4ac.chan_config == 4 && type == TYPE_SCE) { |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
131 ac->tags_mapped++; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
132 return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][1]; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
133 } |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
134 case 3: |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
135 case 2: |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
136 if (ac->tags_mapped == (ac->m4ac.chan_config != 2) && type == TYPE_CPE) { |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
137 ac->tags_mapped++; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
138 return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][0]; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
139 } else if (ac->m4ac.chan_config == 2) { |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
140 return NULL; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
141 } |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
142 case 1: |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
143 if (!ac->tags_mapped && type == TYPE_SCE) { |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
144 ac->tags_mapped++; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
145 return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][0]; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
146 } |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
147 default: |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
148 return NULL; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
149 } |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
150 } |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
151 |
| 7539 | 152 /** |
| 7578 | 153 * Configure output channel order based on the current program configuration element. |
| 154 * | |
| 155 * @param che_pos current channel position configuration | |
| 156 * @param new_che_pos New channel position configuration - we only do something if it differs from the current one. | |
| 157 * | |
| 158 * @return Returns error status. 0 - OK, !0 - error | |
| 159 */ | |
| 160 static int output_configure(AACContext *ac, enum ChannelPosition che_pos[4][MAX_ELEM_ID], | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
161 enum ChannelPosition new_che_pos[4][MAX_ELEM_ID], int channel_config) { |
| 7578 | 162 AVCodecContext *avctx = ac->avccontext; |
| 163 int i, type, channels = 0; | |
| 164 | |
| 165 memcpy(che_pos, new_che_pos, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0])); | |
| 166 | |
| 167 /* Allocate or free elements depending on if they are in the | |
| 168 * current program configuration. | |
| 169 * | |
| 170 * Set up default 1:1 output mapping. | |
| 171 * | |
| 172 * For a 5.1 stream the output order will be: | |
|
7633
bf34cb99da5b
The comment about channel order for AAC 5.1 audio was not correct, fix it.
andoma
parents:
7632
diff
changeset
|
173 * [ Center ] [ Front Left ] [ Front Right ] [ LFE ] [ Surround Left ] [ Surround Right ] |
| 7578 | 174 */ |
| 175 | |
| 176 for(i = 0; i < MAX_ELEM_ID; i++) { | |
| 177 for(type = 0; type < 4; type++) { | |
| 178 if(che_pos[type][i]) { | |
| 179 if(!ac->che[type][i] && !(ac->che[type][i] = av_mallocz(sizeof(ChannelElement)))) | |
| 180 return AVERROR(ENOMEM); | |
| 181 if(type != TYPE_CCE) { | |
| 182 ac->output_data[channels++] = ac->che[type][i]->ch[0].ret; | |
| 183 if(type == TYPE_CPE) { | |
| 184 ac->output_data[channels++] = ac->che[type][i]->ch[1].ret; | |
| 185 } | |
| 186 } | |
| 187 } else | |
| 188 av_freep(&ac->che[type][i]); | |
| 189 } | |
| 190 } | |
| 191 | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
192 if (channel_config) { |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
193 memset(ac->tag_che_map, 0, 4 * MAX_ELEM_ID * sizeof(ac->che[0][0])); |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
194 ac->tags_mapped = 0; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
195 } else { |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
196 memcpy(ac->tag_che_map, ac->che, 4 * MAX_ELEM_ID * sizeof(ac->che[0][0])); |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
197 ac->tags_mapped = 4*MAX_ELEM_ID; |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
198 } |
|
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
199 |
| 7578 | 200 avctx->channels = channels; |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
201 |
| 7578 | 202 return 0; |
| 203 } | |
| 204 | |
| 205 /** | |
| 7539 | 206 * Decode an array of 4 bit element IDs, optionally interleaved with a stereo/mono switching bit. |
| 207 * | |
| 208 * @param cpe_map Stereo (Channel Pair Element) map, NULL if stereo bit is not present. | |
| 209 * @param sce_map mono (Single Channel Element) map | |
| 210 * @param type speaker type/position for these channels | |
| 211 */ | |
| 212 static void decode_channel_map(enum ChannelPosition *cpe_map, | |
| 213 enum ChannelPosition *sce_map, enum ChannelPosition type, GetBitContext * gb, int n) { | |
| 214 while(n--) { | |
| 215 enum ChannelPosition *map = cpe_map && get_bits1(gb) ? cpe_map : sce_map; // stereo or mono map | |
| 216 map[get_bits(gb, 4)] = type; | |
| 217 } | |
| 218 } | |
| 219 | |
| 220 /** | |
| 221 * Decode program configuration element; reference: table 4.2. | |
| 222 * | |
| 223 * @param new_che_pos New channel position configuration - we only do something if it differs from the current one. | |
| 224 * | |
| 225 * @return Returns error status. 0 - OK, !0 - error | |
| 226 */ | |
| 227 static int decode_pce(AACContext * ac, enum ChannelPosition new_che_pos[4][MAX_ELEM_ID], | |
| 228 GetBitContext * gb) { | |
|
8412
2d48043ab521
AAC: Don't write an illegal sampling_index in a PCE to the MPEG4AudioConfig
superdump
parents:
8286
diff
changeset
|
229 int num_front, num_side, num_back, num_lfe, num_assoc_data, num_cc, sampling_index; |
| 7539 | 230 |
| 231 skip_bits(gb, 2); // object_type | |
| 232 | |
|
8412
2d48043ab521
AAC: Don't write an illegal sampling_index in a PCE to the MPEG4AudioConfig
superdump
parents:
8286
diff
changeset
|
233 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
|
234 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
|
235 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
|
236 |
| 7501 | 237 num_front = get_bits(gb, 4); |
| 238 num_side = get_bits(gb, 4); | |
| 239 num_back = get_bits(gb, 4); | |
| 240 num_lfe = get_bits(gb, 2); | |
| 241 num_assoc_data = get_bits(gb, 3); | |
| 242 num_cc = get_bits(gb, 4); | |
| 243 | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
244 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
|
245 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
|
246 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
|
247 skip_bits(gb, 4); // stereo_mixdown_tag |
| 7501 | 248 |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
249 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
|
250 skip_bits(gb, 3); // mixdown_coeff_index and pseudo_surround |
| 7501 | 251 |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
252 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
|
253 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
|
254 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
|
255 decode_channel_map(NULL, new_che_pos[TYPE_LFE], AAC_CHANNEL_LFE, gb, num_lfe ); |
| 7501 | 256 |
| 257 skip_bits_long(gb, 4 * num_assoc_data); | |
| 258 | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
259 decode_channel_map(new_che_pos[TYPE_CCE], new_che_pos[TYPE_CCE], AAC_CHANNEL_CC, gb, num_cc ); |
| 7501 | 260 |
| 261 align_get_bits(gb); | |
| 262 | |
| 263 /* comment field, first byte is length */ | |
| 264 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
|
265 return 0; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
266 } |
| 7501 | 267 |
| 7539 | 268 /** |
| 269 * Set up channel positions based on a default channel configuration | |
| 270 * as specified in table 1.17. | |
| 271 * | |
| 272 * @param new_che_pos New channel position configuration - we only do something if it differs from the current one. | |
| 273 * | |
| 274 * @return Returns error status. 0 - OK, !0 - error | |
| 275 */ | |
| 276 static int set_default_channel_config(AACContext *ac, enum ChannelPosition new_che_pos[4][MAX_ELEM_ID], | |
| 277 int channel_config) | |
| 278 { | |
| 279 if(channel_config < 1 || channel_config > 7) { | |
| 280 av_log(ac->avccontext, AV_LOG_ERROR, "invalid default channel configuration (%d)\n", | |
| 281 channel_config); | |
| 282 return -1; | |
| 283 } | |
| 284 | |
| 285 /* default channel configurations: | |
| 286 * | |
| 287 * 1ch : front center (mono) | |
| 288 * 2ch : L + R (stereo) | |
| 289 * 3ch : front center + L + R | |
| 290 * 4ch : front center + L + R + back center | |
| 291 * 5ch : front center + L + R + back stereo | |
| 292 * 6ch : front center + L + R + back stereo + LFE | |
| 293 * 7ch : front center + L + R + outer front left + outer front right + back stereo + LFE | |
| 294 */ | |
| 295 | |
| 296 if(channel_config != 2) | |
| 297 new_che_pos[TYPE_SCE][0] = AAC_CHANNEL_FRONT; // front center (or mono) | |
| 298 if(channel_config > 1) | |
| 299 new_che_pos[TYPE_CPE][0] = AAC_CHANNEL_FRONT; // L + R (or stereo) | |
| 300 if(channel_config == 4) | |
| 301 new_che_pos[TYPE_SCE][1] = AAC_CHANNEL_BACK; // back center | |
| 302 if(channel_config > 4) | |
| 303 new_che_pos[TYPE_CPE][(channel_config == 7) + 1] | |
| 304 = AAC_CHANNEL_BACK; // back stereo | |
| 305 if(channel_config > 5) | |
| 306 new_che_pos[TYPE_LFE][0] = AAC_CHANNEL_LFE; // LFE | |
| 307 if(channel_config == 7) | |
| 308 new_che_pos[TYPE_CPE][1] = AAC_CHANNEL_FRONT; // outer front left + outer front right | |
| 309 | |
| 310 return 0; | |
| 311 } | |
| 312 | |
| 7578 | 313 /** |
| 314 * Decode GA "General Audio" specific configuration; reference: table 4.1. | |
| 315 * | |
| 316 * @return Returns error status. 0 - OK, !0 - error | |
| 317 */ | |
| 318 static int decode_ga_specific_config(AACContext * ac, GetBitContext * gb, int channel_config) { | |
| 319 enum ChannelPosition new_che_pos[4][MAX_ELEM_ID]; | |
| 320 int extension_flag, ret; | |
| 321 | |
| 322 if(get_bits1(gb)) { // frameLengthFlag | |
|
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9847
diff
changeset
|
323 av_log_missing_feature(ac->avccontext, "960/120 MDCT window is", 1); |
| 7539 | 324 return -1; |
| 325 } | |
| 326 | |
| 327 if (get_bits1(gb)) // dependsOnCoreCoder | |
| 328 skip_bits(gb, 14); // coreCoderDelay | |
| 329 extension_flag = get_bits1(gb); | |
| 330 | |
| 331 if(ac->m4ac.object_type == AOT_AAC_SCALABLE || | |
| 332 ac->m4ac.object_type == AOT_ER_AAC_SCALABLE) | |
| 333 skip_bits(gb, 3); // layerNr | |
| 334 | |
| 335 memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0])); | |
| 336 if (channel_config == 0) { | |
| 337 skip_bits(gb, 4); // element_instance_tag | |
| 338 if((ret = decode_pce(ac, new_che_pos, gb))) | |
| 339 return ret; | |
| 340 } else { | |
| 341 if((ret = set_default_channel_config(ac, new_che_pos, channel_config))) | |
| 342 return ret; | |
| 343 } | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
344 if((ret = output_configure(ac, ac->che_pos, new_che_pos, channel_config))) |
| 7539 | 345 return ret; |
| 346 | |
| 347 if (extension_flag) { | |
| 348 switch (ac->m4ac.object_type) { | |
| 349 case AOT_ER_BSAC: | |
| 350 skip_bits(gb, 5); // numOfSubFrame | |
| 351 skip_bits(gb, 11); // layer_length | |
| 352 break; | |
| 353 case AOT_ER_AAC_LC: | |
| 354 case AOT_ER_AAC_LTP: | |
| 355 case AOT_ER_AAC_SCALABLE: | |
| 356 case AOT_ER_AAC_LD: | |
| 357 skip_bits(gb, 3); /* aacSectionDataResilienceFlag | |
| 358 * aacScalefactorDataResilienceFlag | |
| 359 * aacSpectralDataResilienceFlag | |
| 360 */ | |
| 361 break; | |
| 362 } | |
| 363 skip_bits1(gb); // extensionFlag3 (TBD in version 3) | |
| 364 } | |
| 365 return 0; | |
| 366 } | |
| 367 | |
| 368 /** | |
| 369 * Decode audio specific configuration; reference: table 1.13. | |
| 370 * | |
| 371 * @param data pointer to AVCodecContext extradata | |
| 372 * @param data_size size of AVCCodecContext extradata | |
| 373 * | |
| 374 * @return Returns error status. 0 - OK, !0 - error | |
| 375 */ | |
| 376 static int decode_audio_specific_config(AACContext * ac, void *data, int data_size) { | |
| 377 GetBitContext gb; | |
| 378 int i; | |
| 379 | |
| 380 init_get_bits(&gb, data, data_size * 8); | |
| 381 | |
| 382 if((i = ff_mpeg4audio_get_config(&ac->m4ac, data, data_size)) < 0) | |
| 383 return -1; | |
| 8812 | 384 if(ac->m4ac.sampling_index > 12) { |
| 7539 | 385 av_log(ac->avccontext, AV_LOG_ERROR, "invalid sampling rate index %d\n", ac->m4ac.sampling_index); |
| 386 return -1; | |
| 387 } | |
| 388 | |
| 389 skip_bits_long(&gb, i); | |
| 390 | |
| 391 switch (ac->m4ac.object_type) { | |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
392 case AOT_AAC_MAIN: |
| 7539 | 393 case AOT_AAC_LC: |
| 394 if (decode_ga_specific_config(ac, &gb, ac->m4ac.chan_config)) | |
| 395 return -1; | |
| 396 break; | |
| 397 default: | |
| 398 av_log(ac->avccontext, AV_LOG_ERROR, "Audio object type %s%d is not supported.\n", | |
| 399 ac->m4ac.sbr == 1? "SBR+" : "", ac->m4ac.object_type); | |
| 400 return -1; | |
| 401 } | |
| 402 return 0; | |
| 403 } | |
| 404 | |
| 7578 | 405 /** |
| 406 * linear congruential pseudorandom number generator | |
| 407 * | |
| 408 * @param previous_val pointer to the current state of the generator | |
| 409 * | |
| 410 * @return Returns a 32-bit pseudorandom integer | |
| 411 */ | |
| 412 static av_always_inline int lcg_random(int previous_val) { | |
| 413 return previous_val * 1664525 + 1013904223; | |
| 414 } | |
| 415 | |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
416 static void reset_predict_state(PredictorState * ps) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
417 ps->r0 = 0.0f; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
418 ps->r1 = 0.0f; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
419 ps->cor0 = 0.0f; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
420 ps->cor1 = 0.0f; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
421 ps->var0 = 1.0f; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
422 ps->var1 = 1.0f; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
423 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
424 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
425 static void reset_all_predictors(PredictorState * ps) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
426 int i; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
427 for (i = 0; i < MAX_PREDICTORS; i++) |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
428 reset_predict_state(&ps[i]); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
429 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
430 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
431 static void reset_predictor_group(PredictorState * ps, int group_num) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
432 int i; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
433 for (i = group_num-1; i < MAX_PREDICTORS; i+=30) |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
434 reset_predict_state(&ps[i]); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
435 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
436 |
| 7501 | 437 static av_cold int aac_decode_init(AVCodecContext * avccontext) { |
| 438 AACContext * ac = avccontext->priv_data; | |
| 439 int i; | |
| 440 | |
| 441 ac->avccontext = avccontext; | |
| 442 | |
|
8549
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
443 if (avccontext->extradata_size > 0) { |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
444 if(decode_audio_specific_config(ac, avccontext->extradata, avccontext->extradata_size)) |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
445 return -1; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
446 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
|
447 } else if (avccontext->channels > 0) { |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
448 enum ChannelPosition new_che_pos[4][MAX_ELEM_ID]; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
449 memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0])); |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
450 if(set_default_channel_config(ac, new_che_pos, avccontext->channels - (avccontext->channels == 8))) |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
451 return -1; |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
452 if(output_configure(ac, ac->che_pos, new_che_pos, 1)) |
|
8549
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
453 return -1; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
454 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
|
455 } |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
456 |
| 7539 | 457 avccontext->sample_fmt = SAMPLE_FMT_S16; |
| 7501 | 458 avccontext->frame_size = 1024; |
| 459 | |
| 460 AAC_INIT_VLC_STATIC( 0, 144); | |
| 461 AAC_INIT_VLC_STATIC( 1, 114); | |
| 462 AAC_INIT_VLC_STATIC( 2, 188); | |
| 463 AAC_INIT_VLC_STATIC( 3, 180); | |
| 464 AAC_INIT_VLC_STATIC( 4, 172); | |
| 465 AAC_INIT_VLC_STATIC( 5, 140); | |
| 466 AAC_INIT_VLC_STATIC( 6, 168); | |
| 467 AAC_INIT_VLC_STATIC( 7, 114); | |
| 468 AAC_INIT_VLC_STATIC( 8, 262); | |
| 469 AAC_INIT_VLC_STATIC( 9, 248); | |
| 470 AAC_INIT_VLC_STATIC(10, 384); | |
| 471 | |
| 472 dsputil_init(&ac->dsp, avccontext); | |
| 473 | |
| 7539 | 474 ac->random_state = 0x1f2e3d4c; |
| 475 | |
| 7501 | 476 // -1024 - Compensate wrong IMDCT method. |
| 477 // 32768 - Required to scale values to the correct range for the bias method | |
| 478 // for float to int16 conversion. | |
| 479 | |
| 480 if(ac->dsp.float_to_int16 == ff_float_to_int16_c) { | |
| 481 ac->add_bias = 385.0f; | |
| 482 ac->sf_scale = 1. / (-1024. * 32768.); | |
| 483 ac->sf_offset = 0; | |
| 484 } else { | |
| 485 ac->add_bias = 0.0f; | |
| 486 ac->sf_scale = 1. / -1024.; | |
| 487 ac->sf_offset = 60; | |
| 488 } | |
| 489 | |
| 8590 | 490 #if !CONFIG_HARDCODED_TABLES |
|
8109
7baa25290231
Fix perceptual noise shaping scaling including an oversight of the offset for
superdump
parents:
8042
diff
changeset
|
491 for (i = 0; i < 428; i++) |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
492 ff_aac_pow2sf_tab[i] = pow(2, (i - 200)/4.); |
| 7501 | 493 #endif /* CONFIG_HARDCODED_TABLES */ |
| 494 | |
| 8042 | 495 INIT_VLC_STATIC(&vlc_scalefactors,7,FF_ARRAY_ELEMS(ff_aac_scalefactor_code), |
| 7501 | 496 ff_aac_scalefactor_bits, sizeof(ff_aac_scalefactor_bits[0]), sizeof(ff_aac_scalefactor_bits[0]), |
| 497 ff_aac_scalefactor_code, sizeof(ff_aac_scalefactor_code[0]), sizeof(ff_aac_scalefactor_code[0]), | |
| 498 352); | |
| 499 | |
|
9658
67a20f0eb42c
Support for getting (i)MDCT output multiplied by a constant scaling factor.
serge
parents:
9634
diff
changeset
|
500 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
|
501 ff_mdct_init(&ac->mdct_small, 8, 1, 1.0); |
| 7581 | 502 // window initialization |
| 503 ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024); | |
| 504 ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128); | |
| 505 ff_sine_window_init(ff_sine_1024, 1024); | |
| 506 ff_sine_window_init(ff_sine_128, 128); | |
| 507 | |
| 7501 | 508 return 0; |
| 509 } | |
| 510 | |
| 7539 | 511 /** |
| 512 * Skip data_stream_element; reference: table 4.10. | |
| 513 */ | |
| 514 static void skip_data_stream_element(GetBitContext * gb) { | |
| 7501 | 515 int byte_align = get_bits1(gb); |
| 516 int count = get_bits(gb, 8); | |
| 517 if (count == 255) | |
| 518 count += get_bits(gb, 8); | |
| 519 if (byte_align) | |
| 520 align_get_bits(gb); | |
| 521 skip_bits_long(gb, 8 * count); | |
| 522 } | |
| 523 | |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
524 static int decode_prediction(AACContext * ac, IndividualChannelStream * ics, GetBitContext * gb) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
525 int sfb; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
526 if (get_bits1(gb)) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
527 ics->predictor_reset_group = get_bits(gb, 5); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
528 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
|
529 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
|
530 return -1; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
531 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
532 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
533 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
|
534 ics->prediction_used[sfb] = get_bits1(gb); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
535 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
536 return 0; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
537 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
538 |
| 7501 | 539 /** |
| 7539 | 540 * Decode Individual Channel Stream info; reference: table 4.6. |
| 541 * | |
| 542 * @param common_window Channels have independent [0], or shared [1], Individual Channel Stream information. | |
| 543 */ | |
| 544 static int decode_ics_info(AACContext * ac, IndividualChannelStream * ics, GetBitContext * gb, int common_window) { | |
| 545 if (get_bits1(gb)) { | |
| 546 av_log(ac->avccontext, AV_LOG_ERROR, "Reserved bit set.\n"); | |
| 547 memset(ics, 0, sizeof(IndividualChannelStream)); | |
| 548 return -1; | |
| 549 } | |
| 550 ics->window_sequence[1] = ics->window_sequence[0]; | |
| 551 ics->window_sequence[0] = get_bits(gb, 2); | |
| 552 ics->use_kb_window[1] = ics->use_kb_window[0]; | |
| 553 ics->use_kb_window[0] = get_bits1(gb); | |
| 554 ics->num_window_groups = 1; | |
| 555 ics->group_len[0] = 1; | |
| 7581 | 556 if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { |
| 557 int i; | |
| 558 ics->max_sfb = get_bits(gb, 4); | |
| 559 for (i = 0; i < 7; i++) { | |
| 560 if (get_bits1(gb)) { | |
| 561 ics->group_len[ics->num_window_groups-1]++; | |
| 562 } else { | |
| 563 ics->num_window_groups++; | |
| 564 ics->group_len[ics->num_window_groups-1] = 1; | |
| 565 } | |
| 566 } | |
| 567 ics->num_windows = 8; | |
| 9847 | 568 ics->swb_offset = ff_swb_offset_128[ac->m4ac.sampling_index]; |
| 569 ics->num_swb = ff_aac_num_swb_128[ac->m4ac.sampling_index]; | |
|
9846
4cac4001dd23
Move TNS and swb_offset tables from aacdectab.h to aactab.c so that they can be
alexc
parents:
9716
diff
changeset
|
570 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
|
571 ics->predictor_present = 0; |
| 7581 | 572 } else { |
| 573 ics->max_sfb = get_bits(gb, 6); | |
| 574 ics->num_windows = 1; | |
| 9847 | 575 ics->swb_offset = ff_swb_offset_1024[ac->m4ac.sampling_index]; |
| 576 ics->num_swb = ff_aac_num_swb_1024[ac->m4ac.sampling_index]; | |
|
9846
4cac4001dd23
Move TNS and swb_offset tables from aacdectab.h to aactab.c so that they can be
alexc
parents:
9716
diff
changeset
|
577 ics->tns_max_bands = ff_tns_max_bands_1024[ac->m4ac.sampling_index]; |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
578 ics->predictor_present = get_bits1(gb); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
579 ics->predictor_reset_group = 0; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
580 if (ics->predictor_present) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
581 if (ac->m4ac.object_type == AOT_AAC_MAIN) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
582 if (decode_prediction(ac, ics, gb)) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
583 memset(ics, 0, sizeof(IndividualChannelStream)); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
584 return -1; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
585 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
586 } else if (ac->m4ac.object_type == AOT_AAC_LC) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
587 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
|
588 memset(ics, 0, sizeof(IndividualChannelStream)); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
589 return -1; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
590 } else { |
|
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9847
diff
changeset
|
591 av_log_missing_feature(ac->avccontext, "Predictor bit set but LTP is", 1); |
| 8200 | 592 memset(ics, 0, sizeof(IndividualChannelStream)); |
| 593 return -1; | |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
594 } |
| 7578 | 595 } |
| 596 } | |
| 597 | |
| 598 if(ics->max_sfb > ics->num_swb) { | |
| 599 av_log(ac->avccontext, AV_LOG_ERROR, | |
| 600 "Number of scalefactor bands in group (%d) exceeds limit (%d).\n", | |
| 601 ics->max_sfb, ics->num_swb); | |
| 602 memset(ics, 0, sizeof(IndividualChannelStream)); | |
| 603 return -1; | |
| 604 } | |
| 605 | |
| 7539 | 606 return 0; |
| 607 } | |
| 608 | |
| 609 /** | |
| 610 * Decode band types (section_data payload); reference: table 4.46. | |
| 611 * | |
| 612 * @param band_type array of the used band type | |
| 613 * @param band_type_run_end array of the last scalefactor band of a band type run | |
| 614 * | |
| 615 * @return Returns error status. 0 - OK, !0 - error | |
| 616 */ | |
| 617 static int decode_band_types(AACContext * ac, enum BandType band_type[120], | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
618 int band_type_run_end[120], GetBitContext * gb, IndividualChannelStream * ics) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
619 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
|
620 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
|
621 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
|
622 int k = 0; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
623 while (k < ics->max_sfb) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
624 uint8_t sect_len = k; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
625 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
|
626 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
|
627 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
|
628 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
|
629 return -1; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
630 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
631 while ((sect_len_incr = get_bits(gb, bits)) == (1 << bits)-1) |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
632 sect_len += sect_len_incr; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
633 sect_len += sect_len_incr; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
634 if (sect_len > ics->max_sfb) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
635 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
|
636 "Number of bands (%d) exceeds limit (%d).\n", |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
637 sect_len, ics->max_sfb); |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
638 return -1; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
639 } |
| 7581 | 640 for (; k < sect_len; k++) { |
| 641 band_type [idx] = sect_band_type; | |
| 642 band_type_run_end[idx++] = sect_len; | |
| 643 } | |
| 7539 | 644 } |
| 645 } | |
| 646 return 0; | |
| 647 } | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
648 |
| 7539 | 649 /** |
| 650 * 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
|
651 * |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
652 * @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
|
653 * @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
|
654 * @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
|
655 * @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
|
656 * |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
657 * @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
|
658 */ |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
659 static int decode_scalefactors(AACContext * ac, float sf[120], GetBitContext * gb, |
| 7540 | 660 unsigned int global_gain, IndividualChannelStream * ics, |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
661 enum BandType band_type[120], int band_type_run_end[120]) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
662 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
|
663 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
|
664 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
|
665 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
|
666 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
|
667 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
|
668 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
|
669 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
|
670 if (band_type[idx] == ZERO_BT) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
671 for(; i < run_end; i++, idx++) |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
672 sf[idx] = 0.; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
673 }else if((band_type[idx] == INTENSITY_BT) || (band_type[idx] == INTENSITY_BT2)) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
674 for(; i < run_end; i++, idx++) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
675 offset[2] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
676 if(offset[2] > 255U) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
677 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
|
678 "%s (%d) out of range.\n", sf_str[2], offset[2]); |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
679 return -1; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
680 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
681 sf[idx] = ff_aac_pow2sf_tab[-offset[2] + 300]; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
682 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
683 }else if(band_type[idx] == NOISE_BT) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
684 for(; i < run_end; i++, idx++) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
685 if(noise_flag-- > 0) |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
686 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
|
687 else |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
688 offset[1] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
689 if(offset[1] > 255U) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
690 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
|
691 "%s (%d) out of range.\n", sf_str[1], offset[1]); |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
692 return -1; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
693 } |
|
8109
7baa25290231
Fix perceptual noise shaping scaling including an oversight of the offset for
superdump
parents:
8042
diff
changeset
|
694 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
|
695 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
696 }else { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
697 for(; i < run_end; i++, idx++) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
698 offset[0] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
699 if(offset[0] > 255U) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
700 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
|
701 "%s (%d) out of range.\n", sf_str[0], offset[0]); |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
702 return -1; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
703 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
704 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
|
705 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
706 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
707 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
708 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
709 return 0; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
710 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
711 |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
712 /** |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
713 * 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
|
714 */ |
|
7871
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
715 static int decode_pulses(Pulse * pulse, GetBitContext * gb, const uint16_t * swb_offset, int num_swb) { |
|
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
716 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
|
717 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
|
718 pulse_swb = get_bits(gb, 6); |
|
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
719 if (pulse_swb >= num_swb) |
|
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
720 return -1; |
|
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
721 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
|
722 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
|
723 if (pulse->pos[0] > 1023) |
|
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
724 return -1; |
| 7580 | 725 pulse->amp[0] = get_bits(gb, 4); |
| 726 for (i = 1; i < pulse->num_pulse; i++) { | |
| 727 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
|
728 if (pulse->pos[i] > 1023) |
|
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
729 return -1; |
| 7580 | 730 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
|
731 } |
|
7871
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
732 return 0; |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
733 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
734 |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
735 /** |
| 7609 | 736 * Decode Temporal Noise Shaping data; reference: table 4.48. |
| 737 * | |
| 738 * @return Returns error status. 0 - OK, !0 - error | |
| 739 */ | |
| 740 static int decode_tns(AACContext * ac, TemporalNoiseShaping * tns, | |
| 741 GetBitContext * gb, const IndividualChannelStream * ics) { | |
| 742 int w, filt, i, coef_len, coef_res, coef_compress; | |
| 743 const int is8 = ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE; | |
| 744 const int tns_max_order = is8 ? 7 : ac->m4ac.object_type == AOT_AAC_MAIN ? 20 : 12; | |
| 745 for (w = 0; w < ics->num_windows; w++) { | |
|
7637
1fd8e319e8b6
Work around GCC variable may be used uninitialised warning
superdump
parents:
7636
diff
changeset
|
746 if ((tns->n_filt[w] = get_bits(gb, 2 - is8))) { |
| 7609 | 747 coef_res = get_bits1(gb); |
| 748 | |
| 7638 | 749 for (filt = 0; filt < tns->n_filt[w]; filt++) { |
| 750 int tmp2_idx; | |
| 751 tns->length[w][filt] = get_bits(gb, 6 - 2*is8); | |
| 7609 | 752 |
| 7638 | 753 if ((tns->order[w][filt] = get_bits(gb, 5 - 2*is8)) > tns_max_order) { |
| 754 av_log(ac->avccontext, AV_LOG_ERROR, "TNS filter order %d is greater than maximum %d.", | |
| 755 tns->order[w][filt], tns_max_order); | |
| 756 tns->order[w][filt] = 0; | |
| 757 return -1; | |
| 758 } | |
|
7850
77030651ddd0
Only read some of TNS bitstream data in the case that the TNS filter order is
superdump
parents:
7845
diff
changeset
|
759 if (tns->order[w][filt]) { |
| 7851 | 760 tns->direction[w][filt] = get_bits1(gb); |
| 761 coef_compress = get_bits1(gb); | |
| 762 coef_len = coef_res + 3 - coef_compress; | |
| 763 tmp2_idx = 2*coef_compress + coef_res; | |
| 7638 | 764 |
| 7851 | 765 for (i = 0; i < tns->order[w][filt]; i++) |
| 766 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
|
767 } |
| 7609 | 768 } |
|
7637
1fd8e319e8b6
Work around GCC variable may be used uninitialised warning
superdump
parents:
7636
diff
changeset
|
769 } |
| 7609 | 770 } |
| 771 return 0; | |
| 772 } | |
| 773 | |
| 774 /** | |
| 7539 | 775 * Decode Mid/Side data; reference: table 4.54. |
| 776 * | |
| 777 * @param ms_present Indicates mid/side stereo presence. [0] mask is all 0s; | |
| 778 * [1] mask is decoded from bitstream; [2] mask is all 1s; | |
| 779 * [3] reserved for scalable AAC | |
| 780 */ | |
| 781 static void decode_mid_side_stereo(ChannelElement * cpe, GetBitContext * gb, | |
| 782 int ms_present) { | |
| 7578 | 783 int idx; |
| 784 if (ms_present == 1) { | |
| 785 for (idx = 0; idx < cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb; idx++) | |
| 786 cpe->ms_mask[idx] = get_bits1(gb); | |
| 787 } else if (ms_present == 2) { | |
| 788 memset(cpe->ms_mask, 1, cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb * sizeof(cpe->ms_mask[0])); | |
| 789 } | |
| 790 } | |
| 7539 | 791 |
| 792 /** | |
| 7581 | 793 * Decode spectral data; reference: table 4.50. |
| 794 * Dequantize and scale spectral data; reference: 4.6.3.3. | |
| 795 * | |
| 796 * @param coef array of dequantized, scaled spectral data | |
| 797 * @param sf array of scalefactors or intensity stereo positions | |
| 798 * @param pulse_present set if pulses are present | |
| 799 * @param pulse pointer to pulse data struct | |
| 800 * @param band_type array of the used band type | |
| 801 * | |
| 802 * @return Returns error status. 0 - OK, !0 - error | |
| 803 */ | |
| 804 static int decode_spectrum_and_dequant(AACContext * ac, float coef[1024], GetBitContext * gb, float sf[120], | |
| 805 int pulse_present, const Pulse * pulse, const IndividualChannelStream * ics, enum BandType band_type[120]) { | |
| 806 int i, k, g, idx = 0; | |
| 807 const int c = 1024/ics->num_windows; | |
| 808 const uint16_t * offsets = ics->swb_offset; | |
| 809 float *coef_base = coef; | |
| 8284 | 810 static const float sign_lookup[] = { 1.0f, -1.0f }; |
| 7581 | 811 |
| 812 for (g = 0; g < ics->num_windows; g++) | |
| 813 memset(coef + g * 128 + offsets[ics->max_sfb], 0, sizeof(float)*(c - offsets[ics->max_sfb])); | |
| 814 | |
| 815 for (g = 0; g < ics->num_window_groups; g++) { | |
| 816 for (i = 0; i < ics->max_sfb; i++, idx++) { | |
| 817 const int cur_band_type = band_type[idx]; | |
| 818 const int dim = cur_band_type >= FIRST_PAIR_BT ? 2 : 4; | |
| 819 const int is_cb_unsigned = IS_CODEBOOK_UNSIGNED(cur_band_type); | |
| 820 int group; | |
|
8413
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
821 if (cur_band_type == ZERO_BT || cur_band_type == INTENSITY_BT2 || cur_band_type == INTENSITY_BT) { |
| 7581 | 822 for (group = 0; group < ics->group_len[g]; group++) { |
| 823 memset(coef + group * 128 + offsets[i], 0, (offsets[i+1] - offsets[i])*sizeof(float)); | |
| 824 } | |
| 825 }else if (cur_band_type == NOISE_BT) { | |
| 826 for (group = 0; group < ics->group_len[g]; group++) { | |
|
8109
7baa25290231
Fix perceptual noise shaping scaling including an oversight of the offset for
superdump
parents:
8042
diff
changeset
|
827 float scale; |
|
7baa25290231
Fix perceptual noise shaping scaling including an oversight of the offset for
superdump
parents:
8042
diff
changeset
|
828 float band_energy = 0; |
| 7581 | 829 for (k = offsets[i]; k < offsets[i+1]; k++) { |
| 830 ac->random_state = lcg_random(ac->random_state); | |
|
8109
7baa25290231
Fix perceptual noise shaping scaling including an oversight of the offset for
superdump
parents:
8042
diff
changeset
|
831 coef[group*128+k] = ac->random_state; |
|
7baa25290231
Fix perceptual noise shaping scaling including an oversight of the offset for
superdump
parents:
8042
diff
changeset
|
832 band_energy += coef[group*128+k]*coef[group*128+k]; |
|
7baa25290231
Fix perceptual noise shaping scaling including an oversight of the offset for
superdump
parents:
8042
diff
changeset
|
833 } |
|
7baa25290231
Fix perceptual noise shaping scaling including an oversight of the offset for
superdump
parents:
8042
diff
changeset
|
834 scale = sf[idx] / sqrtf(band_energy); |
|
7baa25290231
Fix perceptual noise shaping scaling including an oversight of the offset for
superdump
parents:
8042
diff
changeset
|
835 for (k = offsets[i]; k < offsets[i+1]; k++) { |
|
7baa25290231
Fix perceptual noise shaping scaling including an oversight of the offset for
superdump
parents:
8042
diff
changeset
|
836 coef[group*128+k] *= scale; |
| 7581 | 837 } |
| 838 } | |
|
8413
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
839 }else { |
| 7581 | 840 for (group = 0; group < ics->group_len[g]; group++) { |
| 841 for (k = offsets[i]; k < offsets[i+1]; k += dim) { | |
| 842 const int index = get_vlc2(gb, vlc_spectral[cur_band_type - 1].table, 6, 3); | |
| 843 const int coef_tmp_idx = (group << 7) + k; | |
| 844 const float *vq_ptr; | |
| 845 int j; | |
| 846 if(index >= ff_aac_spectral_sizes[cur_band_type - 1]) { | |
| 847 av_log(ac->avccontext, AV_LOG_ERROR, | |
| 848 "Read beyond end of ff_aac_codebook_vectors[%d][]. index %d >= %d\n", | |
| 849 cur_band_type - 1, index, ff_aac_spectral_sizes[cur_band_type - 1]); | |
| 850 return -1; | |
| 851 } | |
| 852 vq_ptr = &ff_aac_codebook_vectors[cur_band_type - 1][index * dim]; | |
| 853 if (is_cb_unsigned) { | |
| 8284 | 854 if (vq_ptr[0]) coef[coef_tmp_idx ] = sign_lookup[get_bits1(gb)]; |
| 855 if (vq_ptr[1]) coef[coef_tmp_idx + 1] = sign_lookup[get_bits1(gb)]; | |
|
8283
ea8e4095d980
AAC: Unroll code within decode_spectrum_and_dequant(). Gives 12% net speed gain.
superdump
parents:
8282
diff
changeset
|
856 if (dim == 4) { |
| 8284 | 857 if (vq_ptr[2]) coef[coef_tmp_idx + 2] = sign_lookup[get_bits1(gb)]; |
| 858 if (vq_ptr[3]) coef[coef_tmp_idx + 3] = sign_lookup[get_bits1(gb)]; | |
|
8283
ea8e4095d980
AAC: Unroll code within decode_spectrum_and_dequant(). Gives 12% net speed gain.
superdump
parents:
8282
diff
changeset
|
859 } |
| 9053 | 860 if (cur_band_type == ESC_BT) { |
| 861 for (j = 0; j < 2; j++) { | |
| 862 if (vq_ptr[j] == 64.0f) { | |
| 863 int n = 4; | |
| 864 /* The total length of escape_sequence must be < 22 bits according | |
| 865 to the specification (i.e. max is 11111111110xxxxxxxxxx). */ | |
| 866 while (get_bits1(gb) && n < 15) n++; | |
| 867 if(n == 15) { | |
| 868 av_log(ac->avccontext, AV_LOG_ERROR, "error in spectral data, ESC overflow\n"); | |
| 869 return -1; | |
| 870 } | |
| 871 n = (1<<n) + get_bits(gb, n); | |
| 872 coef[coef_tmp_idx + j] *= cbrtf(n) * n; | |
| 873 }else | |
| 874 coef[coef_tmp_idx + j] *= vq_ptr[j]; | |
| 875 } | |
| 876 }else | |
| 877 { | |
| 878 coef[coef_tmp_idx ] *= vq_ptr[0]; | |
| 879 coef[coef_tmp_idx + 1] *= vq_ptr[1]; | |
| 880 if (dim == 4) { | |
| 881 coef[coef_tmp_idx + 2] *= vq_ptr[2]; | |
| 882 coef[coef_tmp_idx + 3] *= vq_ptr[3]; | |
| 883 } | |
| 7581 | 884 } |
|
9052
54973ad4b7cf
Refactor AAC unsigned band type decoding for a modest speedup.
alexc
parents:
9051
diff
changeset
|
885 }else { |
|
54973ad4b7cf
Refactor AAC unsigned band type decoding for a modest speedup.
alexc
parents:
9051
diff
changeset
|
886 coef[coef_tmp_idx ] = vq_ptr[0]; |
|
54973ad4b7cf
Refactor AAC unsigned band type decoding for a modest speedup.
alexc
parents:
9051
diff
changeset
|
887 coef[coef_tmp_idx + 1] = vq_ptr[1]; |
|
54973ad4b7cf
Refactor AAC unsigned band type decoding for a modest speedup.
alexc
parents:
9051
diff
changeset
|
888 if (dim == 4) { |
|
54973ad4b7cf
Refactor AAC unsigned band type decoding for a modest speedup.
alexc
parents:
9051
diff
changeset
|
889 coef[coef_tmp_idx + 2] = vq_ptr[2]; |
|
54973ad4b7cf
Refactor AAC unsigned band type decoding for a modest speedup.
alexc
parents:
9051
diff
changeset
|
890 coef[coef_tmp_idx + 3] = vq_ptr[3]; |
|
54973ad4b7cf
Refactor AAC unsigned band type decoding for a modest speedup.
alexc
parents:
9051
diff
changeset
|
891 } |
|
54973ad4b7cf
Refactor AAC unsigned band type decoding for a modest speedup.
alexc
parents:
9051
diff
changeset
|
892 } |
|
8283
ea8e4095d980
AAC: Unroll code within decode_spectrum_and_dequant(). Gives 12% net speed gain.
superdump
parents:
8282
diff
changeset
|
893 coef[coef_tmp_idx ] *= sf[idx]; |
|
ea8e4095d980
AAC: Unroll code within decode_spectrum_and_dequant(). Gives 12% net speed gain.
superdump
parents:
8282
diff
changeset
|
894 coef[coef_tmp_idx + 1] *= sf[idx]; |
|
ea8e4095d980
AAC: Unroll code within decode_spectrum_and_dequant(). Gives 12% net speed gain.
superdump
parents:
8282
diff
changeset
|
895 if (dim == 4) { |
|
ea8e4095d980
AAC: Unroll code within decode_spectrum_and_dequant(). Gives 12% net speed gain.
superdump
parents:
8282
diff
changeset
|
896 coef[coef_tmp_idx + 2] *= sf[idx]; |
|
ea8e4095d980
AAC: Unroll code within decode_spectrum_and_dequant(). Gives 12% net speed gain.
superdump
parents:
8282
diff
changeset
|
897 coef[coef_tmp_idx + 3] *= sf[idx]; |
|
ea8e4095d980
AAC: Unroll code within decode_spectrum_and_dequant(). Gives 12% net speed gain.
superdump
parents:
8282
diff
changeset
|
898 } |
| 7581 | 899 } |
| 900 } | |
| 901 } | |
| 902 } | |
| 903 coef += ics->group_len[g]<<7; | |
| 904 } | |
| 905 | |
| 906 if (pulse_present) { | |
|
7857
d7801471cd52
Apply pulses to unscaled coefficients rather than scaled.
superdump
parents:
7856
diff
changeset
|
907 idx = 0; |
| 7581 | 908 for(i = 0; i < pulse->num_pulse; i++){ |
| 909 float co = coef_base[ pulse->pos[i] ]; | |
|
7857
d7801471cd52
Apply pulses to unscaled coefficients rather than scaled.
superdump
parents:
7856
diff
changeset
|
910 while(offsets[idx + 1] <= pulse->pos[i]) |
|
d7801471cd52
Apply pulses to unscaled coefficients rather than scaled.
superdump
parents:
7856
diff
changeset
|
911 idx++; |
|
d7801471cd52
Apply pulses to unscaled coefficients rather than scaled.
superdump
parents:
7856
diff
changeset
|
912 if (band_type[idx] != NOISE_BT && sf[idx]) { |
| 7858 | 913 float ico = -pulse->amp[i]; |
| 914 if (co) { | |
| 915 co /= sf[idx]; | |
| 916 ico = co / sqrtf(sqrtf(fabsf(co))) + (co > 0 ? -ico : ico); | |
| 917 } | |
| 918 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
|
919 } |
| 7581 | 920 } |
| 921 } | |
| 922 return 0; | |
| 923 } | |
| 924 | |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
925 static av_always_inline float flt16_round(float pf) { |
|
9179
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
926 union float754 tmp; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
927 tmp.f = pf; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
928 tmp.i = (tmp.i + 0x00008000U) & 0xFFFF0000U; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
929 return tmp.f; |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
930 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
931 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
932 static av_always_inline float flt16_even(float pf) { |
|
9179
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
933 union float754 tmp; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
934 tmp.f = pf; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
935 tmp.i = (tmp.i + 0x00007FFFU + (tmp.i & 0x00010000U>>16)) & 0xFFFF0000U; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
936 return tmp.f; |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
937 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
938 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
939 static av_always_inline float flt16_trunc(float pf) { |
|
9179
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
940 union float754 pun; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
941 pun.f = pf; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
942 pun.i &= 0xFFFF0000U; |
|
4172c9ef331a
AAC: IEEE-754 type punning for 16-bit floating point rounding.
alexc
parents:
9151
diff
changeset
|
943 return pun.f; |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
944 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
945 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
946 static void predict(AACContext * ac, PredictorState * ps, float* coef, int output_enable) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
947 const float a = 0.953125; // 61.0/64 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
948 const float alpha = 0.90625; // 29.0/32 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
949 float e0, e1; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
950 float pv; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
951 float k1, k2; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
952 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
953 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
|
954 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
|
955 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
956 pv = flt16_round(k1 * ps->r0 + k2 * ps->r1); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
957 if (output_enable) |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
958 *coef += pv * ac->sf_scale; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
959 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
960 e0 = *coef / ac->sf_scale; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
961 e1 = e0 - k1 * ps->r0; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
962 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
963 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
|
964 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
|
965 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
|
966 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
|
967 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
968 ps->r1 = flt16_trunc(a * (ps->r0 - k1 * e0)); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
969 ps->r0 = flt16_trunc(a * e0); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
970 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
971 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
972 /** |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
973 * Apply AAC-Main style frequency domain prediction. |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
974 */ |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
975 static void apply_prediction(AACContext * ac, SingleChannelElement * sce) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
976 int sfb, k; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
977 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
978 if (!sce->ics.predictor_initialized) { |
|
8413
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
979 reset_all_predictors(sce->predictor_state); |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
980 sce->ics.predictor_initialized = 1; |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
981 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
982 |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
983 if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) { |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
984 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
|
985 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
|
986 predict(ac, &sce->predictor_state[k], &sce->coeffs[k], |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
987 sce->ics.predictor_present && sce->ics.prediction_used[sfb]); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
988 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
989 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
990 if (sce->ics.predictor_reset_group) |
|
8413
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
991 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
|
992 } else |
|
8413
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
993 reset_all_predictors(sce->predictor_state); |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
994 } |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
995 |
| 7581 | 996 /** |
| 7539 | 997 * Decode an individual_channel_stream payload; reference: table 4.44. |
| 998 * | |
| 999 * @param common_window Channels have independent [0], or shared [1], Individual Channel Stream information. | |
| 1000 * @param scale_flag scalable [1] or non-scalable [0] AAC (Unused until scalable AAC is implemented.) | |
| 1001 * | |
| 1002 * @return Returns error status. 0 - OK, !0 - error | |
| 1003 */ | |
| 1004 static int decode_ics(AACContext * ac, SingleChannelElement * sce, GetBitContext * gb, int common_window, int scale_flag) { | |
| 1005 Pulse pulse; | |
| 1006 TemporalNoiseShaping * tns = &sce->tns; | |
| 1007 IndividualChannelStream * ics = &sce->ics; | |
| 1008 float * out = sce->coeffs; | |
| 1009 int global_gain, pulse_present = 0; | |
| 1010 | |
| 7580 | 1011 /* This assignment is to silence a GCC warning about the variable being used |
| 1012 * uninitialized when in fact it always is. | |
| 7539 | 1013 */ |
| 1014 pulse.num_pulse = 0; | |
| 1015 | |
| 1016 global_gain = get_bits(gb, 8); | |
| 1017 | |
| 1018 if (!common_window && !scale_flag) { | |
| 1019 if (decode_ics_info(ac, ics, gb, 0) < 0) | |
| 1020 return -1; | |
| 1021 } | |
| 1022 | |
| 1023 if (decode_band_types(ac, sce->band_type, sce->band_type_run_end, gb, ics) < 0) | |
| 1024 return -1; | |
| 1025 if (decode_scalefactors(ac, sce->sf, gb, global_gain, ics, sce->band_type, sce->band_type_run_end) < 0) | |
| 1026 return -1; | |
| 1027 | |
| 1028 pulse_present = 0; | |
| 1029 if (!scale_flag) { | |
| 1030 if ((pulse_present = get_bits1(gb))) { | |
| 1031 if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { | |
| 1032 av_log(ac->avccontext, AV_LOG_ERROR, "Pulse tool not allowed in eight short sequence.\n"); | |
| 1033 return -1; | |
| 1034 } | |
|
7871
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
1035 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
|
1036 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
|
1037 return -1; |
|
8277c41b7160
Validate pulse position and error out if an invalid position is encountered.
superdump
parents:
7858
diff
changeset
|
1038 } |
| 7539 | 1039 } |
| 1040 if ((tns->present = get_bits1(gb)) && decode_tns(ac, tns, gb, ics)) | |
| 1041 return -1; | |
| 1042 if (get_bits1(gb)) { | |
|
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9847
diff
changeset
|
1043 av_log_missing_feature(ac->avccontext, "SSR", 1); |
| 7539 | 1044 return -1; |
| 1045 } | |
| 1046 } | |
| 1047 | |
| 7580 | 1048 if (decode_spectrum_and_dequant(ac, out, gb, sce->sf, pulse_present, &pulse, ics, sce->band_type) < 0) |
| 7539 | 1049 return -1; |
|
8199
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1050 |
|
8413
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1051 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
|
1052 apply_prediction(ac, sce); |
|
8a8d40fe77d9
AAC: Frequency domain prediction and hence Main profile support
superdump
parents:
8109
diff
changeset
|
1053 |
| 7539 | 1054 return 0; |
| 1055 } | |
| 1056 | |
| 1057 /** | |
| 7581 | 1058 * Mid/Side stereo decoding; reference: 4.6.8.1.3. |
| 1059 */ | |
| 1060 static void apply_mid_side_stereo(ChannelElement * cpe) { | |
| 1061 const IndividualChannelStream * ics = &cpe->ch[0].ics; | |
| 1062 float *ch0 = cpe->ch[0].coeffs; | |
| 1063 float *ch1 = cpe->ch[1].coeffs; | |
| 1064 int g, i, k, group, idx = 0; | |
| 1065 const uint16_t * offsets = ics->swb_offset; | |
| 1066 for (g = 0; g < ics->num_window_groups; g++) { | |
| 1067 for (i = 0; i < ics->max_sfb; i++, idx++) { | |
| 1068 if (cpe->ms_mask[idx] && | |
| 1069 cpe->ch[0].band_type[idx] < NOISE_BT && cpe->ch[1].band_type[idx] < NOISE_BT) { | |
| 1070 for (group = 0; group < ics->group_len[g]; group++) { | |
| 1071 for (k = offsets[i]; k < offsets[i+1]; k++) { | |
| 1072 float tmp = ch0[group*128 + k] - ch1[group*128 + k]; | |
| 1073 ch0[group*128 + k] += ch1[group*128 + k]; | |
| 1074 ch1[group*128 + k] = tmp; | |
| 1075 } | |
| 1076 } | |
| 1077 } | |
| 1078 } | |
| 1079 ch0 += ics->group_len[g]*128; | |
| 1080 ch1 += ics->group_len[g]*128; | |
| 1081 } | |
| 1082 } | |
| 1083 | |
| 1084 /** | |
| 1085 * intensity stereo decoding; reference: 4.6.8.2.3 | |
| 1086 * | |
| 1087 * @param ms_present Indicates mid/side stereo presence. [0] mask is all 0s; | |
| 1088 * [1] mask is decoded from bitstream; [2] mask is all 1s; | |
| 1089 * [3] reserved for scalable AAC | |
| 1090 */ | |
| 1091 static void apply_intensity_stereo(ChannelElement * cpe, int ms_present) { | |
| 1092 const IndividualChannelStream * ics = &cpe->ch[1].ics; | |
| 1093 SingleChannelElement * sce1 = &cpe->ch[1]; | |
| 1094 float *coef0 = cpe->ch[0].coeffs, *coef1 = cpe->ch[1].coeffs; | |
| 1095 const uint16_t * offsets = ics->swb_offset; | |
| 1096 int g, group, i, k, idx = 0; | |
| 1097 int c; | |
| 1098 float scale; | |
| 1099 for (g = 0; g < ics->num_window_groups; g++) { | |
| 1100 for (i = 0; i < ics->max_sfb;) { | |
| 1101 if (sce1->band_type[idx] == INTENSITY_BT || sce1->band_type[idx] == INTENSITY_BT2) { | |
| 1102 const int bt_run_end = sce1->band_type_run_end[idx]; | |
| 1103 for (; i < bt_run_end; i++, idx++) { | |
| 1104 c = -1 + 2 * (sce1->band_type[idx] - 14); | |
| 1105 if (ms_present) | |
| 1106 c *= 1 - 2 * cpe->ms_mask[idx]; | |
| 1107 scale = c * sce1->sf[idx]; | |
| 1108 for (group = 0; group < ics->group_len[g]; group++) | |
| 1109 for (k = offsets[i]; k < offsets[i+1]; k++) | |
| 1110 coef1[group*128 + k] = scale * coef0[group*128 + k]; | |
| 1111 } | |
| 1112 } else { | |
| 1113 int bt_run_end = sce1->band_type_run_end[idx]; | |
| 1114 idx += bt_run_end - i; | |
| 1115 i = bt_run_end; | |
| 1116 } | |
| 1117 } | |
| 1118 coef0 += ics->group_len[g]*128; | |
| 1119 coef1 += ics->group_len[g]*128; | |
| 1120 } | |
| 1121 } | |
| 1122 | |
| 1123 /** | |
| 7539 | 1124 * Decode a channel_pair_element; reference: table 4.4. |
| 1125 * | |
| 1126 * @param elem_id Identifies the instance of a syntax element. | |
| 1127 * | |
| 1128 * @return Returns error status. 0 - OK, !0 - error | |
| 1129 */ | |
|
9074
0e2f21d65473
AAC: Make the CPE function more consistent with the functions for other channel elements.
alexc
parents:
9053
diff
changeset
|
1130 static int decode_cpe(AACContext * ac, GetBitContext * gb, ChannelElement * cpe) { |
| 7539 | 1131 int i, ret, common_window, ms_present = 0; |
| 1132 | |
| 1133 common_window = get_bits1(gb); | |
| 1134 if (common_window) { | |
| 1135 if (decode_ics_info(ac, &cpe->ch[0].ics, gb, 1)) | |
| 1136 return -1; | |
| 1137 i = cpe->ch[1].ics.use_kb_window[0]; | |
| 1138 cpe->ch[1].ics = cpe->ch[0].ics; | |
| 1139 cpe->ch[1].ics.use_kb_window[1] = i; | |
| 1140 ms_present = get_bits(gb, 2); | |
| 1141 if(ms_present == 3) { | |
| 1142 av_log(ac->avccontext, AV_LOG_ERROR, "ms_present = 3 is reserved.\n"); | |
| 1143 return -1; | |
| 1144 } else if(ms_present) | |
| 1145 decode_mid_side_stereo(cpe, gb, ms_present); | |
| 1146 } | |
| 1147 if ((ret = decode_ics(ac, &cpe->ch[0], gb, common_window, 0))) | |
| 1148 return ret; | |
| 1149 if ((ret = decode_ics(ac, &cpe->ch[1], gb, common_window, 0))) | |
| 1150 return ret; | |
| 1151 | |
|
8413
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1152 if (common_window) { |
|
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1153 if (ms_present) |
| 8414 | 1154 apply_mid_side_stereo(cpe); |
|
8413
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1155 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
|
1156 apply_prediction(ac, &cpe->ch[0]); |
|
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1157 apply_prediction(ac, &cpe->ch[1]); |
|
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1158 } |
|
6f40f7d77263
AAC: Fix AAC prediction when used in conjunction with the CPE
superdump
parents:
8412
diff
changeset
|
1159 } |
| 7539 | 1160 |
| 7580 | 1161 apply_intensity_stereo(cpe, ms_present); |
| 7539 | 1162 return 0; |
| 1163 } | |
| 1164 | |
| 7581 | 1165 /** |
| 1166 * Decode coupling_channel_element; reference: table 4.8. | |
| 1167 * | |
| 1168 * @param elem_id Identifies the instance of a syntax element. | |
| 1169 * | |
| 1170 * @return Returns error status. 0 - OK, !0 - error | |
| 1171 */ | |
| 1172 static int decode_cce(AACContext * ac, GetBitContext * gb, ChannelElement * che) { | |
| 1173 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
|
1174 int c, g, sfb, ret; |
| 7581 | 1175 int sign; |
| 1176 float scale; | |
| 1177 SingleChannelElement * sce = &che->ch[0]; | |
| 1178 ChannelCoupling * coup = &che->coup; | |
| 1179 | |
| 7578 | 1180 coup->coupling_point = 2*get_bits1(gb); |
| 1181 coup->num_coupled = get_bits(gb, 3); | |
| 1182 for (c = 0; c <= coup->num_coupled; c++) { | |
| 1183 num_gain++; | |
| 1184 coup->type[c] = get_bits1(gb) ? TYPE_CPE : TYPE_SCE; | |
| 1185 coup->id_select[c] = get_bits(gb, 4); | |
| 1186 if (coup->type[c] == TYPE_CPE) { | |
| 1187 coup->ch_select[c] = get_bits(gb, 2); | |
| 1188 if (coup->ch_select[c] == 3) | |
| 1189 num_gain++; | |
| 1190 } else | |
|
8004
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1191 coup->ch_select[c] = 2; |
| 7578 | 1192 } |
|
9251
3fc2f6c6b684
AAC: Ignore cc_domain for independent (time domain) coupling.
alexc
parents:
9179
diff
changeset
|
1193 coup->coupling_point += get_bits1(gb) || (coup->coupling_point>>1); |
| 7578 | 1194 |
| 1195 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
|
1196 scale = pow(2., pow(2., (int)get_bits(gb, 2) - 3)); |
| 7578 | 1197 |
| 1198 if ((ret = decode_ics(ac, sce, gb, 0, 0))) | |
| 1199 return ret; | |
| 1200 | |
| 1201 for (c = 0; c < num_gain; c++) { | |
|
7891
13ee9bb85721
Zero 'idx' for each iteration of the coupling gain loop and as it is only used
superdump
parents:
7890
diff
changeset
|
1202 int idx = 0; |
| 7578 | 1203 int cge = 1; |
| 1204 int gain = 0; | |
| 1205 float gain_cache = 1.; | |
| 1206 if (c) { | |
| 1207 cge = coup->coupling_point == AFTER_IMDCT ? 1 : get_bits1(gb); | |
| 1208 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
|
1209 gain_cache = pow(scale, -gain); |
| 7578 | 1210 } |
|
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
|
1211 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
|
1212 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
|
1213 } else { |
| 8823 | 1214 for (g = 0; g < sce->ics.num_window_groups; g++) { |
| 1215 for (sfb = 0; sfb < sce->ics.max_sfb; sfb++, idx++) { | |
| 1216 if (sce->band_type[idx] != ZERO_BT) { | |
| 1217 if (!cge) { | |
| 1218 int t = get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60; | |
| 1219 if (t) { | |
| 1220 int s = 1; | |
| 1221 t = gain += t; | |
| 1222 if (sign) { | |
| 1223 s -= 2 * (t & 0x1); | |
| 1224 t >>= 1; | |
| 1225 } | |
| 1226 gain_cache = pow(scale, -t) * s; | |
| 7578 | 1227 } |
| 1228 } | |
| 8823 | 1229 coup->gain[c][idx] = gain_cache; |
| 7578 | 1230 } |
| 1231 } | |
| 7890 | 1232 } |
| 1233 } | |
| 7578 | 1234 } |
| 1235 return 0; | |
| 1236 } | |
| 1237 | |
| 7539 | 1238 /** |
| 1239 * 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
|
1240 * |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1241 * @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
|
1242 * @param cnt length of TYPE_FIL syntactic element in bytes |
| 7539 | 1243 * |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1244 * @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
|
1245 */ |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1246 static int decode_sbr_extension(AACContext * ac, GetBitContext * gb, int crc, int cnt) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1247 // TODO : sbr_extension implementation |
|
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9847
diff
changeset
|
1248 av_log_missing_feature(ac->avccontext, "SBR", 0); |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1249 skip_bits_long(gb, 8*cnt - 4); // -4 due to reading extension type |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1250 return cnt; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1251 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1252 |
| 7539 | 1253 /** |
| 7578 | 1254 * Parse whether channels are to be excluded from Dynamic Range Compression; reference: table 4.53. |
| 1255 * | |
| 1256 * @return Returns number of bytes consumed. | |
| 1257 */ | |
| 1258 static int decode_drc_channel_exclusions(DynamicRangeControl *che_drc, GetBitContext * gb) { | |
| 1259 int i; | |
| 1260 int num_excl_chan = 0; | |
| 1261 | |
| 1262 do { | |
| 1263 for (i = 0; i < 7; i++) | |
| 1264 che_drc->exclude_mask[num_excl_chan++] = get_bits1(gb); | |
| 1265 } while (num_excl_chan < MAX_CHANNELS - 7 && get_bits1(gb)); | |
| 1266 | |
| 1267 return num_excl_chan / 7; | |
| 1268 } | |
| 1269 | |
| 1270 /** | |
| 7539 | 1271 * Decode dynamic range information; reference: table 4.52. |
| 1272 * | |
| 1273 * @param cnt length of TYPE_FIL syntactic element in bytes | |
| 1274 * | |
| 1275 * @return Returns number of bytes consumed. | |
| 1276 */ | |
| 1277 static int decode_dynamic_range(DynamicRangeControl *che_drc, GetBitContext * gb, int cnt) { | |
| 1278 int n = 1; | |
| 1279 int drc_num_bands = 1; | |
| 1280 int i; | |
| 1281 | |
| 1282 /* pce_tag_present? */ | |
| 1283 if(get_bits1(gb)) { | |
| 1284 che_drc->pce_instance_tag = get_bits(gb, 4); | |
| 1285 skip_bits(gb, 4); // tag_reserved_bits | |
| 1286 n++; | |
| 1287 } | |
| 1288 | |
| 1289 /* excluded_chns_present? */ | |
| 1290 if(get_bits1(gb)) { | |
| 1291 n += decode_drc_channel_exclusions(che_drc, gb); | |
| 1292 } | |
| 1293 | |
| 1294 /* drc_bands_present? */ | |
| 1295 if (get_bits1(gb)) { | |
| 1296 che_drc->band_incr = get_bits(gb, 4); | |
| 1297 che_drc->interpolation_scheme = get_bits(gb, 4); | |
| 1298 n++; | |
| 1299 drc_num_bands += che_drc->band_incr; | |
| 1300 for (i = 0; i < drc_num_bands; i++) { | |
| 1301 che_drc->band_top[i] = get_bits(gb, 8); | |
| 1302 n++; | |
| 1303 } | |
| 1304 } | |
| 1305 | |
| 1306 /* prog_ref_level_present? */ | |
| 1307 if (get_bits1(gb)) { | |
| 1308 che_drc->prog_ref_level = get_bits(gb, 7); | |
| 1309 skip_bits1(gb); // prog_ref_level_reserved_bits | |
| 1310 n++; | |
| 1311 } | |
| 1312 | |
| 1313 for (i = 0; i < drc_num_bands; i++) { | |
| 1314 che_drc->dyn_rng_sgn[i] = get_bits1(gb); | |
| 1315 che_drc->dyn_rng_ctl[i] = get_bits(gb, 7); | |
| 1316 n++; | |
| 1317 } | |
| 1318 | |
| 1319 return n; | |
| 1320 } | |
| 1321 | |
| 1322 /** | |
| 1323 * Decode extension data (incomplete); reference: table 4.51. | |
| 1324 * | |
| 1325 * @param cnt length of TYPE_FIL syntactic element in bytes | |
| 1326 * | |
| 1327 * @return Returns number of bytes consumed | |
| 1328 */ | |
| 1329 static int decode_extension_payload(AACContext * ac, GetBitContext * gb, int cnt) { | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1330 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
|
1331 int res = cnt; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1332 switch (get_bits(gb, 4)) { // extension type |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1333 case EXT_SBR_DATA_CRC: |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1334 crc_flag++; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1335 case EXT_SBR_DATA: |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1336 res = decode_sbr_extension(ac, gb, crc_flag, cnt); |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1337 break; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1338 case EXT_DYNAMIC_RANGE: |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1339 res = decode_dynamic_range(&ac->che_drc, gb, cnt); |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1340 break; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1341 case EXT_FILL: |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1342 case EXT_FILL_DATA: |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1343 case EXT_DATA_ELEMENT: |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1344 default: |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1345 skip_bits_long(gb, 8*cnt - 4); |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1346 break; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1347 }; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1348 return res; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1349 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1350 |
|
7632
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1351 /** |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1352 * 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
|
1353 * |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1354 * @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
|
1355 * @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
|
1356 */ |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1357 static void apply_tns(float coef[1024], TemporalNoiseShaping * tns, IndividualChannelStream * ics, int decode) { |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1358 const int mmm = FFMIN(ics->tns_max_bands, ics->max_sfb); |
| 7636 | 1359 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
|
1360 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
|
1361 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
|
1362 |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1363 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
|
1364 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
|
1365 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
|
1366 top = bottom; |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1367 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
|
1368 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
|
1369 if (order == 0) |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1370 continue; |
|
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1371 |
|
7788
ffd4b1364b62
Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
vitor
parents:
7733
diff
changeset
|
1372 // tns_decode_coef |
|
ffd4b1364b62
Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
vitor
parents:
7733
diff
changeset
|
1373 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
|
1374 |
| 7609 | 1375 start = ics->swb_offset[FFMIN(bottom, mmm)]; |
| 1376 end = ics->swb_offset[FFMIN( top, mmm)]; | |
| 1377 if ((size = end - start) <= 0) | |
| 1378 continue; | |
| 1379 if (tns->direction[w][filt]) { | |
| 1380 inc = -1; start = end - 1; | |
| 1381 } else { | |
| 1382 inc = 1; | |
| 1383 } | |
| 1384 start += w * 128; | |
| 1385 | |
| 1386 // ar filter | |
| 1387 for (m = 0; m < size; m++, start += inc) | |
| 1388 for (i = 1; i <= FFMIN(m, order); i++) | |
|
7632
ac583bd8f8b3
Last hunk of the AAC decoder code to be OKed and build system and documentation
superdump
parents:
7609
diff
changeset
|
1389 coef[start] -= coef[start - i*inc] * lpc[i-1]; |
| 7609 | 1390 } |
| 1391 } | |
| 1392 } | |
| 1393 | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1394 /** |
| 7539 | 1395 * Conduct IMDCT and windowing. |
| 1396 */ | |
| 1397 static void imdct_and_windowing(AACContext * ac, SingleChannelElement * sce) { | |
| 1398 IndividualChannelStream * ics = &sce->ics; | |
| 1399 float * in = sce->coeffs; | |
| 1400 float * out = sce->ret; | |
| 1401 float * saved = sce->saved; | |
| 7580 | 1402 const float * swindow = ics->use_kb_window[0] ? ff_aac_kbd_short_128 : ff_sine_128; |
| 1403 const float * lwindow_prev = ics->use_kb_window[1] ? ff_aac_kbd_long_1024 : ff_sine_1024; | |
| 1404 const float * swindow_prev = ics->use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128; | |
| 7539 | 1405 float * buf = ac->buf_mdct; |
|
8286
e06b2b848b74
AAC: move scratch array to context to ensure 16-byte alignment
mru
parents:
8284
diff
changeset
|
1406 float * temp = ac->temp; |
| 7539 | 1407 int i; |
| 1408 | |
|
7661
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1409 // imdct |
| 7578 | 1410 if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { |
| 1411 if (ics->window_sequence[1] == ONLY_LONG_SEQUENCE || ics->window_sequence[1] == LONG_STOP_SEQUENCE) | |
| 1412 av_log(ac->avccontext, AV_LOG_WARNING, | |
| 1413 "Transition from an ONLY_LONG or LONG_STOP to an EIGHT_SHORT sequence detected. " | |
| 1414 "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
|
1415 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
|
1416 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
|
1417 } else |
|
7663
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1418 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
|
1419 |
|
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1420 /* window overlapping |
|
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1421 * 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
|
1422 * 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
|
1423 * 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
|
1424 * 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
|
1425 */ |
|
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1426 if ((ics->window_sequence[1] == ONLY_LONG_SEQUENCE || ics->window_sequence[1] == LONG_STOP_SEQUENCE) && |
|
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1427 (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
|
1428 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
|
1429 } else { |
| 7662 | 1430 for (i = 0; i < 448; i++) |
| 1431 out[i] = saved[i] + ac->add_bias; | |
| 7578 | 1432 |
|
7661
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1433 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
|
1434 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
|
1435 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
|
1436 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
|
1437 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
|
1438 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
|
1439 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
|
1440 } else { |
|
7663
66fb1f3937fa
Use ff_imdct_half() and vector_fmul_window() for IMDCT and windowing. Reduce
superdump
parents:
7662
diff
changeset
|
1441 ac->dsp.vector_fmul_window(out + 448, saved + 448, buf, swindow_prev, ac->add_bias, 64); |
| 7662 | 1442 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
|
1443 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
|
1444 } |
|
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1445 } |
| 7578 | 1446 |
|
7661
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1447 // buffer update |
|
258eb30e6f7d
Separate code in imdct_and_windowing() into distinct IMDCT, windowing and
superdump
parents:
7638
diff
changeset
|
1448 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
|
1449 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
|
1450 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
|
1451 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
|
1452 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
|
1453 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
|
1454 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
|
1455 } 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
|
1456 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
|
1457 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
|
1458 } 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
|
1459 memcpy( saved, buf + 512, 512 * sizeof(float)); |
| 7578 | 1460 } |
| 1461 } | |
| 1462 | |
| 7539 | 1463 /** |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1464 * 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
|
1465 * |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1466 * @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
|
1467 */ |
|
8006
c7c1e85d14bc
Rename variables to clarify the channel coupling element and corresponding
superdump
parents:
8004
diff
changeset
|
1468 static void apply_dependent_coupling(AACContext * ac, SingleChannelElement * target, ChannelElement * cce, int index) { |
|
c7c1e85d14bc
Rename variables to clarify the channel coupling element and corresponding
superdump
parents:
8004
diff
changeset
|
1469 IndividualChannelStream * ics = &cce->ch[0].ics; |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1470 const uint16_t * offsets = ics->swb_offset; |
|
8006
c7c1e85d14bc
Rename variables to clarify the channel coupling element and corresponding
superdump
parents:
8004
diff
changeset
|
1471 float * dest = target->coeffs; |
|
c7c1e85d14bc
Rename variables to clarify the channel coupling element and corresponding
superdump
parents:
8004
diff
changeset
|
1472 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
|
1473 int g, i, group, k, idx = 0; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1474 if(ac->m4ac.object_type == AOT_AAC_LTP) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1475 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
|
1476 "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
|
1477 return; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1478 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1479 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
|
1480 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
|
1481 if (cce->ch[0].band_type[idx] != ZERO_BT) { |
| 9143 | 1482 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
|
1483 for (group = 0; group < ics->group_len[g]; group++) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1484 for (k = offsets[i]; k < offsets[i+1]; k++) { |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1485 // XXX dsputil-ize |
| 9143 | 1486 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
|
1487 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1488 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1489 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1490 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1491 dest += ics->group_len[g]*128; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1492 src += ics->group_len[g]*128; |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1493 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1494 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1495 |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1496 /** |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1497 * 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
|
1498 * |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1499 * @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
|
1500 */ |
|
8006
c7c1e85d14bc
Rename variables to clarify the channel coupling element and corresponding
superdump
parents:
8004
diff
changeset
|
1501 static void apply_independent_coupling(AACContext * ac, SingleChannelElement * target, ChannelElement * cce, int index) { |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1502 int i; |
|
9051
0cffed11ee33
Use const to better allow the compiler to optimize AAC independent coupling.
alexc
parents:
8823
diff
changeset
|
1503 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
|
1504 const float bias = ac->add_bias; |
|
0cffed11ee33
Use const to better allow the compiler to optimize AAC independent coupling.
alexc
parents:
8823
diff
changeset
|
1505 const float* src = cce->ch[0].ret; |
|
0cffed11ee33
Use const to better allow the compiler to optimize AAC independent coupling.
alexc
parents:
8823
diff
changeset
|
1506 float* dest = target->ret; |
|
0cffed11ee33
Use const to better allow the compiler to optimize AAC independent coupling.
alexc
parents:
8823
diff
changeset
|
1507 |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1508 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
|
1509 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
|
1510 } |
|
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1511 |
| 7581 | 1512 /** |
| 1513 * channel coupling transformation interface | |
| 1514 * | |
| 1515 * @param index index into coupling gain array | |
| 1516 * @param apply_coupling_method pointer to (in)dependent coupling function | |
| 1517 */ | |
| 1518 static void apply_channel_coupling(AACContext * ac, ChannelElement * cc, | |
|
8004
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1519 enum RawDataBlockType type, int elem_id, enum CouplingPoint coupling_point, |
|
8006
c7c1e85d14bc
Rename variables to clarify the channel coupling element and corresponding
superdump
parents:
8004
diff
changeset
|
1520 void (*apply_coupling_method)(AACContext * ac, SingleChannelElement * target, ChannelElement * cce, int index)) |
| 7581 | 1521 { |
|
8004
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1522 int i, c; |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1523 |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1524 for (i = 0; i < MAX_ELEM_ID; i++) { |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1525 ChannelElement *cce = ac->che[TYPE_CCE][i]; |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1526 int index = 0; |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1527 |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1528 if (cce && cce->coup.coupling_point == coupling_point) { |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1529 ChannelCoupling * coup = &cce->coup; |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1530 |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1531 for (c = 0; c <= coup->num_coupled; c++) { |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1532 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
|
1533 if (coup->ch_select[c] != 1) { |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1534 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
|
1535 if (coup->ch_select[c] != 0) |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1536 index++; |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1537 } |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1538 if (coup->ch_select[c] != 2) |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1539 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
|
1540 } else |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1541 index += 1 + (coup->ch_select[c] == 3); |
| 7581 | 1542 } |
| 1543 } | |
| 1544 } | |
| 1545 } | |
| 1546 | |
| 1547 /** | |
| 1548 * Convert spectral data to float samples, applying all supported tools as appropriate. | |
| 1549 */ | |
| 1550 static void spectral_to_sample(AACContext * ac) { | |
| 8502 | 1551 int i, type; |
|
8004
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1552 for(type = 3; type >= 0; type--) { |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1553 for (i = 0; i < MAX_ELEM_ID; i++) { |
| 7581 | 1554 ChannelElement *che = ac->che[type][i]; |
| 1555 if(che) { | |
|
8004
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1556 if(type <= TYPE_CPE) |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1557 apply_channel_coupling(ac, che, type, i, BEFORE_TNS, apply_dependent_coupling); |
| 7581 | 1558 if(che->ch[0].tns.present) |
| 1559 apply_tns(che->ch[0].coeffs, &che->ch[0].tns, &che->ch[0].ics, 1); | |
| 1560 if(che->ch[1].tns.present) | |
| 1561 apply_tns(che->ch[1].coeffs, &che->ch[1].tns, &che->ch[1].ics, 1); | |
|
8004
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1562 if(type <= TYPE_CPE) |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1563 apply_channel_coupling(ac, che, type, i, BETWEEN_TNS_AND_IMDCT, apply_dependent_coupling); |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1564 if(type != TYPE_CCE || che->coup.coupling_point == AFTER_IMDCT) |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1565 imdct_and_windowing(ac, &che->ch[0]); |
| 7581 | 1566 if(type == TYPE_CPE) |
| 1567 imdct_and_windowing(ac, &che->ch[1]); | |
|
8004
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1568 if(type <= TYPE_CCE) |
|
8fd8f23be794
Corrections to channel coupling code to attain conformance for appropriate
superdump
parents:
7891
diff
changeset
|
1569 apply_channel_coupling(ac, che, type, i, AFTER_IMDCT, apply_independent_coupling); |
| 7578 | 1570 } |
| 1571 } | |
| 1572 } | |
| 1573 } | |
| 1574 | |
|
8549
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1575 static int parse_adts_frame_header(AACContext * ac, GetBitContext * gb) { |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1576 |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1577 int size; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1578 AACADTSHeaderInfo hdr_info; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1579 |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1580 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
|
1581 if (size > 0) { |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1582 if (hdr_info.chan_config) |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1583 ac->m4ac.chan_config = hdr_info.chan_config; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1584 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
|
1585 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
|
1586 ac->m4ac.object_type = hdr_info.object_type; |
| 9151 | 1587 if (hdr_info.num_aac_frames == 1) { |
| 1588 if (!hdr_info.crc_absent) | |
| 1589 skip_bits(gb, 16); | |
| 1590 } else { | |
|
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9847
diff
changeset
|
1591 av_log_missing_feature(ac->avccontext, "More than one AAC RDB per ADTS frame is", 0); |
| 9151 | 1592 return -1; |
| 1593 } | |
|
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
|
1594 } |
|
8549
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1595 return size; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1596 } |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1597 |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9251
diff
changeset
|
1598 static int aac_decode_frame(AVCodecContext * avccontext, void * data, int * data_size, AVPacket *avpkt) { |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9251
diff
changeset
|
1599 const uint8_t *buf = avpkt->data; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9251
diff
changeset
|
1600 int buf_size = avpkt->size; |
| 7578 | 1601 AACContext * ac = avccontext->priv_data; |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
1602 ChannelElement * che = NULL; |
| 7578 | 1603 GetBitContext gb; |
| 1604 enum RawDataBlockType elem_type; | |
| 1605 int err, elem_id, data_size_tmp; | |
| 1606 | |
| 1607 init_get_bits(&gb, buf, buf_size*8); | |
| 1608 | |
|
8549
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1609 if (show_bits(&gb, 12) == 0xfff) { |
| 9510 | 1610 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
|
1611 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
|
1612 return -1; |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1613 } |
| 8812 | 1614 if (ac->m4ac.sampling_index > 12) { |
| 8789 | 1615 av_log(ac->avccontext, AV_LOG_ERROR, "invalid sampling rate index %d\n", ac->m4ac.sampling_index); |
| 1616 return -1; | |
| 1617 } | |
|
8549
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1618 } |
|
2cbfa4cd4670
Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents:
8502
diff
changeset
|
1619 |
| 7578 | 1620 // parse |
| 1621 while ((elem_type = get_bits(&gb, 3)) != TYPE_END) { | |
| 1622 elem_id = get_bits(&gb, 4); | |
| 1623 | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
1624 if(elem_type < TYPE_DSE && !(che=get_che(ac, elem_type, elem_id))) { |
| 8814 | 1625 av_log(ac->avccontext, AV_LOG_ERROR, "channel element %d.%d is not allocated\n", elem_type, elem_id); |
| 1626 return -1; | |
| 7578 | 1627 } |
| 1628 | |
| 1629 switch (elem_type) { | |
| 1630 | |
| 1631 case TYPE_SCE: | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
1632 err = decode_ics(ac, &che->ch[0], &gb, 0, 0); |
| 7578 | 1633 break; |
| 1634 | |
| 1635 case TYPE_CPE: | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
1636 err = decode_cpe(ac, &gb, che); |
| 7578 | 1637 break; |
| 1638 | |
| 1639 case TYPE_CCE: | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
1640 err = decode_cce(ac, &gb, che); |
| 7578 | 1641 break; |
| 1642 | |
| 1643 case TYPE_LFE: | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
1644 err = decode_ics(ac, &che->ch[0], &gb, 0, 0); |
| 7578 | 1645 break; |
| 1646 | |
| 1647 case TYPE_DSE: | |
| 1648 skip_data_stream_element(&gb); | |
| 1649 err = 0; | |
| 1650 break; | |
| 1651 | |
| 1652 case TYPE_PCE: | |
| 1653 { | |
| 1654 enum ChannelPosition new_che_pos[4][MAX_ELEM_ID]; | |
| 1655 memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0])); | |
| 1656 if((err = decode_pce(ac, new_che_pos, &gb))) | |
| 1657 break; | |
|
9149
955835e2bc99
Fix the channel allocation bug/assumption (issue 800).
alexc
parents:
9143
diff
changeset
|
1658 err = output_configure(ac, ac->che_pos, new_che_pos, 0); |
| 7578 | 1659 break; |
| 1660 } | |
| 1661 | |
| 1662 case TYPE_FIL: | |
| 1663 if (elem_id == 15) | |
| 1664 elem_id += get_bits(&gb, 8) - 1; | |
| 1665 while (elem_id > 0) | |
| 1666 elem_id -= decode_extension_payload(ac, &gb, elem_id); | |
| 1667 err = 0; /* FIXME */ | |
| 1668 break; | |
| 1669 | |
| 1670 default: | |
| 1671 err = -1; /* should not happen, but keeps compiler happy */ | |
| 1672 break; | |
| 1673 } | |
| 1674 | |
| 1675 if(err) | |
| 1676 return err; | |
| 1677 } | |
| 1678 | |
| 1679 spectral_to_sample(ac); | |
| 1680 | |
| 7539 | 1681 if (!ac->is_saved) { |
| 1682 ac->is_saved = 1; | |
| 1683 *data_size = 0; | |
| 7580 | 1684 return buf_size; |
| 7539 | 1685 } |
| 1686 | |
| 1687 data_size_tmp = 1024 * avccontext->channels * sizeof(int16_t); | |
| 1688 if(*data_size < data_size_tmp) { | |
| 1689 av_log(avccontext, AV_LOG_ERROR, | |
| 1690 "Output buffer too small (%d) or trying to output too many samples (%d) for this frame.\n", | |
| 1691 *data_size, data_size_tmp); | |
| 1692 return -1; | |
| 1693 } | |
| 1694 *data_size = data_size_tmp; | |
| 1695 | |
| 1696 ac->dsp.float_to_int16_interleave(data, (const float **)ac->output_data, 1024, avccontext->channels); | |
| 1697 | |
| 1698 return buf_size; | |
| 1699 } | |
| 1700 | |
| 7501 | 1701 static av_cold int aac_decode_close(AVCodecContext * avccontext) { |
| 1702 AACContext * ac = avccontext->priv_data; | |
| 7540 | 1703 int i, type; |
| 7501 | 1704 |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1705 for (i = 0; i < MAX_ELEM_ID; i++) { |
| 7540 | 1706 for(type = 0; type < 4; type++) |
| 1707 av_freep(&ac->che[type][i]); | |
| 7501 | 1708 } |
| 1709 | |
| 1710 ff_mdct_end(&ac->mdct); | |
| 1711 ff_mdct_end(&ac->mdct_small); | |
| 1712 return 0 ; | |
| 1713 } | |
| 1714 | |
| 1715 AVCodec aac_decoder = { | |
| 1716 "aac", | |
| 1717 CODEC_TYPE_AUDIO, | |
| 1718 CODEC_ID_AAC, | |
| 1719 sizeof(AACContext), | |
| 1720 aac_decode_init, | |
| 1721 NULL, | |
| 1722 aac_decode_close, | |
| 1723 aac_decode_frame, | |
| 1724 .long_name = NULL_IF_CONFIG_SMALL("Advanced Audio Coding"), | |
|
7523
a3f7ffdb676d
Sync already committed code with that in SoC and commit more OKed hunks of code
superdump
parents:
7501
diff
changeset
|
1725 .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, |
| 7501 | 1726 }; |
