Mercurial > mplayer.hg
annotate libfaad2/mp4.c @ 22153:0cf24df5d97b
Revert part of commit r22170.
FFmpeg lavcodecs version is still
(or according to ffmpeg commit r7868, it's back to)
49.3.0, so global variables are not yet directly accessable (if ever).
author | iive |
---|---|
date | Wed, 07 Feb 2007 12:31:37 +0000 |
parents | 59b6fa5b4201 |
children | 645cbba10a57 |
rev | line source |
---|---|
10725 | 1 /* |
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding | |
12527 | 3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com |
10725 | 4 ** |
5 ** This program is free software; you can redistribute it and/or modify | |
6 ** it under the terms of the GNU General Public License as published by | |
7 ** the Free Software Foundation; either version 2 of the License, or | |
8 ** (at your option) any later version. | |
9 ** | |
10 ** This program is distributed in the hope that it will be useful, | |
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 ** GNU General Public License for more details. | |
14 ** | |
15 ** You should have received a copy of the GNU General Public License | |
16 ** along with this program; if not, write to the Free Software | |
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
18 ** | |
19 ** Any non-GPL usage of this software or parts of this software is strictly | |
20 ** forbidden. | |
21 ** | |
22 ** Commercial non-GPL licensing of this software is possible. | |
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. | |
24 ** | |
18141 | 25 ** $Id: mp4.c,v 1.32 2004/09/04 14:56:28 menno Exp $ |
10725 | 26 **/ |
27 | |
28 #include "common.h" | |
29 #include "structs.h" | |
30 | |
31 #include <stdlib.h> | |
32 | |
33 #include "bits.h" | |
34 #include "mp4.h" | |
35 #include "syntax.h" | |
36 | |
37 /* defines if an object type can be decoded by this library or not */ | |
38 static uint8_t ObjectTypesTable[32] = { | |
39 0, /* 0 NULL */ | |
40 #ifdef MAIN_DEC | |
41 1, /* 1 AAC Main */ | |
42 #else | |
43 0, /* 1 AAC Main */ | |
44 #endif | |
45 1, /* 2 AAC LC */ | |
46 #ifdef SSR_DEC | |
47 1, /* 3 AAC SSR */ | |
48 #else | |
49 0, /* 3 AAC SSR */ | |
50 #endif | |
51 #ifdef LTP_DEC | |
52 1, /* 4 AAC LTP */ | |
53 #else | |
54 0, /* 4 AAC LTP */ | |
55 #endif | |
56 #ifdef SBR_DEC | |
57 1, /* 5 SBR */ | |
58 #else | |
59 0, /* 5 SBR */ | |
60 #endif | |
12527 | 61 #ifdef SCALABLE_DEC |
62 1, /* 6 AAC Scalable */ | |
63 #else | |
10725 | 64 0, /* 6 AAC Scalable */ |
12527 | 65 #endif |
10725 | 66 0, /* 7 TwinVQ */ |
67 0, /* 8 CELP */ | |
68 0, /* 9 HVXC */ | |
69 0, /* 10 Reserved */ | |
70 0, /* 11 Reserved */ | |
71 0, /* 12 TTSI */ | |
72 0, /* 13 Main synthetic */ | |
73 0, /* 14 Wavetable synthesis */ | |
74 0, /* 15 General MIDI */ | |
75 0, /* 16 Algorithmic Synthesis and Audio FX */ | |
76 | |
77 /* MPEG-4 Version 2 */ | |
78 #ifdef ERROR_RESILIENCE | |
79 1, /* 17 ER AAC LC */ | |
80 0, /* 18 (Reserved) */ | |
81 #ifdef LTP_DEC | |
82 1, /* 19 ER AAC LTP */ | |
83 #else | |
84 0, /* 19 ER AAC LTP */ | |
85 #endif | |
12527 | 86 #ifdef SCALABLE_DEC |
87 1, /* 20 ER AAC scalable */ | |
88 #else | |
10725 | 89 0, /* 20 ER AAC scalable */ |
12527 | 90 #endif |
10725 | 91 0, /* 21 ER TwinVQ */ |
92 0, /* 22 ER BSAC */ | |
93 #ifdef LD_DEC | |
94 1, /* 23 ER AAC LD */ | |
95 #else | |
96 0, /* 23 ER AAC LD */ | |
97 #endif | |
98 0, /* 24 ER CELP */ | |
99 0, /* 25 ER HVXC */ | |
100 0, /* 26 ER HILN */ | |
101 0, /* 27 ER Parametric */ | |
102 #else /* No ER defined */ | |
103 0, /* 17 ER AAC LC */ | |
104 0, /* 18 (Reserved) */ | |
105 0, /* 19 ER AAC LTP */ | |
106 0, /* 20 ER AAC scalable */ | |
107 0, /* 21 ER TwinVQ */ | |
108 0, /* 22 ER BSAC */ | |
109 0, /* 23 ER AAC LD */ | |
110 0, /* 24 ER CELP */ | |
111 0, /* 25 ER HVXC */ | |
112 0, /* 26 ER HILN */ | |
113 0, /* 27 ER Parametric */ | |
114 #endif | |
115 0, /* 28 (Reserved) */ | |
116 0, /* 29 (Reserved) */ | |
117 0, /* 30 (Reserved) */ | |
118 0 /* 31 (Reserved) */ | |
119 }; | |
120 | |
121 /* Table 1.6.1 */ | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
122 int8_t NEAACDECAPI NeAACDecAudioSpecificConfig(uint8_t *pBuffer, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
123 uint32_t buffer_size, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
124 mp4AudioSpecificConfig *mp4ASC) |
10725 | 125 { |
126 return AudioSpecificConfig2(pBuffer, buffer_size, mp4ASC, NULL); | |
127 } | |
128 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
129 int8_t AudioSpecificConfig2(uint8_t *pBuffer, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
130 uint32_t buffer_size, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
131 mp4AudioSpecificConfig *mp4ASC, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
132 program_config *pce) |
10725 | 133 { |
134 bitfile ld; | |
135 int8_t result = 0; | |
136 #ifdef SBR_DEC | |
137 int8_t bits_to_decode = 0; | |
138 #endif | |
139 | |
140 if (pBuffer == NULL) | |
141 return -7; | |
142 if (mp4ASC == NULL) | |
143 return -8; | |
144 | |
145 memset(mp4ASC, 0, sizeof(mp4AudioSpecificConfig)); | |
146 | |
147 faad_initbits(&ld, pBuffer, buffer_size); | |
148 faad_byte_align(&ld); | |
149 | |
150 mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(&ld, 5 | |
151 DEBUGVAR(1,1,"parse_audio_decoder_specific_info(): ObjectTypeIndex")); | |
152 | |
153 mp4ASC->samplingFrequencyIndex = (uint8_t)faad_getbits(&ld, 4 | |
154 DEBUGVAR(1,2,"parse_audio_decoder_specific_info(): SamplingFrequencyIndex")); | |
155 | |
156 mp4ASC->channelsConfiguration = (uint8_t)faad_getbits(&ld, 4 | |
157 DEBUGVAR(1,3,"parse_audio_decoder_specific_info(): ChannelsConfiguration")); | |
158 | |
10989 | 159 mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); |
10725 | 160 |
161 if (ObjectTypesTable[mp4ASC->objectTypeIndex] != 1) | |
162 { | |
163 faad_endbits(&ld); | |
164 return -1; | |
165 } | |
166 | |
167 if (mp4ASC->samplingFrequency == 0) | |
168 { | |
169 faad_endbits(&ld); | |
170 return -2; | |
171 } | |
172 | |
173 if (mp4ASC->channelsConfiguration > 7) | |
174 { | |
175 faad_endbits(&ld); | |
176 return -3; | |
177 } | |
178 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
179 #if (defined(PS_DEC) || defined(DRM_PS)) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
180 /* check if we have a mono file */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
181 if (mp4ASC->channelsConfiguration == 1) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
182 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
183 /* upMatrix to 2 channels for implicit signalling of PS */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
184 mp4ASC->channelsConfiguration = 2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
185 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
186 #endif |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
187 |
10725 | 188 #ifdef SBR_DEC |
189 mp4ASC->sbr_present_flag = -1; | |
190 if (mp4ASC->objectTypeIndex == 5) | |
191 { | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
192 uint8_t tmp; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
193 |
10725 | 194 mp4ASC->sbr_present_flag = 1; |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
195 tmp = (uint8_t)faad_getbits(&ld, 4 |
10725 | 196 DEBUGVAR(1,5,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
197 /* check for downsampled SBR */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
198 if (tmp == mp4ASC->samplingFrequencyIndex) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
199 mp4ASC->downSampledSBR = 1; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
200 mp4ASC->samplingFrequencyIndex = tmp; |
10725 | 201 if (mp4ASC->samplingFrequencyIndex == 15) |
202 { | |
203 mp4ASC->samplingFrequency = (uint32_t)faad_getbits(&ld, 24 | |
204 DEBUGVAR(1,6,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); | |
205 } else { | |
10989 | 206 mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); |
10725 | 207 } |
208 mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(&ld, 5 | |
209 DEBUGVAR(1,7,"parse_audio_decoder_specific_info(): ObjectTypeIndex")); | |
210 } | |
211 #endif | |
212 | |
213 /* get GASpecificConfig */ | |
214 if (mp4ASC->objectTypeIndex == 1 || mp4ASC->objectTypeIndex == 2 || | |
215 mp4ASC->objectTypeIndex == 3 || mp4ASC->objectTypeIndex == 4 || | |
216 mp4ASC->objectTypeIndex == 6 || mp4ASC->objectTypeIndex == 7) | |
217 { | |
218 result = GASpecificConfig(&ld, mp4ASC, pce); | |
219 | |
220 #ifdef ERROR_RESILIENCE | |
221 } else if (mp4ASC->objectTypeIndex >= ER_OBJECT_START) { /* ER */ | |
222 result = GASpecificConfig(&ld, mp4ASC, pce); | |
223 mp4ASC->epConfig = (uint8_t)faad_getbits(&ld, 2 | |
224 DEBUGVAR(1,143,"parse_audio_decoder_specific_info(): epConfig")); | |
225 | |
226 if (mp4ASC->epConfig != 0) | |
227 result = -5; | |
228 #endif | |
229 | |
230 } else { | |
231 result = -4; | |
232 } | |
233 | |
234 #ifdef SSR_DEC | |
235 /* shorter frames not allowed for SSR */ | |
236 if ((mp4ASC->objectTypeIndex == 4) && mp4ASC->frameLengthFlag) | |
237 return -6; | |
238 #endif | |
239 | |
240 | |
241 #ifdef SBR_DEC | |
10989 | 242 bits_to_decode = (int8_t)(buffer_size*8 - faad_get_processed_bits(&ld)); |
10725 | 243 |
244 if ((mp4ASC->objectTypeIndex != 5) && (bits_to_decode >= 16)) | |
245 { | |
246 int16_t syncExtensionType = (int16_t)faad_getbits(&ld, 11 | |
247 DEBUGVAR(1,9,"parse_audio_decoder_specific_info(): syncExtensionType")); | |
248 | |
249 if (syncExtensionType == 0x2b7) | |
250 { | |
251 mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(&ld, 5 | |
252 DEBUGVAR(1,10,"parse_audio_decoder_specific_info(): extensionAudioObjectType")); | |
253 | |
254 if (mp4ASC->objectTypeIndex == 5) | |
255 { | |
256 mp4ASC->sbr_present_flag = (uint8_t)faad_get1bit(&ld | |
257 DEBUGVAR(1,11,"parse_audio_decoder_specific_info(): sbr_present_flag")); | |
258 | |
259 if (mp4ASC->sbr_present_flag) | |
260 { | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
261 uint8_t tmp; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
262 tmp = (uint8_t)faad_getbits(&ld, 4 |
10725 | 263 DEBUGVAR(1,12,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
264 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
265 /* check for downsampled SBR */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
266 if (tmp == mp4ASC->samplingFrequencyIndex) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
267 mp4ASC->downSampledSBR = 1; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
268 mp4ASC->samplingFrequencyIndex = tmp; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
269 |
10725 | 270 if (mp4ASC->samplingFrequencyIndex == 15) |
271 { | |
272 mp4ASC->samplingFrequency = (uint32_t)faad_getbits(&ld, 24 | |
273 DEBUGVAR(1,13,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); | |
274 } else { | |
10989 | 275 mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); |
10725 | 276 } |
277 } | |
278 } | |
279 } | |
280 } | |
10989 | 281 |
282 /* no SBR signalled, this could mean either implicit signalling or no SBR in this file */ | |
283 /* MPEG specification states: assume SBR on files with samplerate <= 24000 Hz */ | |
284 if (mp4ASC->sbr_present_flag == -1) | |
285 { | |
286 if (mp4ASC->samplingFrequency <= 24000) | |
287 { | |
288 mp4ASC->samplingFrequency *= 2; | |
289 mp4ASC->forceUpSampling = 1; | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
290 } else /* > 24000*/ { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
291 mp4ASC->downSampledSBR = 1; |
10989 | 292 } |
293 } | |
10725 | 294 #endif |
295 | |
296 faad_endbits(&ld); | |
297 | |
298 return result; | |
299 } |