/proc/self/cwd/libfaad/mp4.c
Line | Count | Source |
1 | | /* |
2 | | ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding |
3 | | ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com |
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 | | ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 |
23 | | ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" |
24 | | ** |
25 | | ** Commercial non-GPL licensing of this software is possible. |
26 | | ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. |
27 | | ** |
28 | | ** $Id: mp4.c,v 1.41 2016/11/11 11:25:58 knik Exp $ |
29 | | **/ |
30 | | |
31 | | #include "common.h" |
32 | | #include "structs.h" |
33 | | |
34 | | #include <stdlib.h> |
35 | | |
36 | | #include "mp4.h" |
37 | | #include "syntax.h" |
38 | | |
39 | | /* defines if an object type can be decoded by this library or not */ |
40 | | static uint8_t ObjectTypesTable[32] = { |
41 | | 0, /* 0 NULL */ |
42 | | #ifdef MAIN_DEC |
43 | | 1, /* 1 AAC Main */ |
44 | | #else |
45 | | 0, /* 1 AAC Main */ |
46 | | #endif |
47 | | 1, /* 2 AAC LC */ |
48 | | #ifdef SSR_DEC |
49 | | 1, /* 3 AAC SSR */ |
50 | | #else |
51 | | 0, /* 3 AAC SSR */ |
52 | | #endif |
53 | | #ifdef LTP_DEC |
54 | | 1, /* 4 AAC LTP */ |
55 | | #else |
56 | | 0, /* 4 AAC LTP */ |
57 | | #endif |
58 | | #ifdef SBR_DEC |
59 | | 1, /* 5 SBR */ |
60 | | #else |
61 | | 0, /* 5 SBR */ |
62 | | #endif |
63 | | 0, /* 6 AAC Scalable */ |
64 | | 0, /* 7 TwinVQ */ |
65 | | 0, /* 8 CELP */ |
66 | | 0, /* 9 HVXC */ |
67 | | 0, /* 10 Reserved */ |
68 | | 0, /* 11 Reserved */ |
69 | | 0, /* 12 TTSI */ |
70 | | 0, /* 13 Main synthetic */ |
71 | | 0, /* 14 Wavetable synthesis */ |
72 | | 0, /* 15 General MIDI */ |
73 | | 0, /* 16 Algorithmic Synthesis and Audio FX */ |
74 | | |
75 | | /* MPEG-4 Version 2 */ |
76 | | #ifdef ERROR_RESILIENCE |
77 | | 1, /* 17 ER AAC LC */ |
78 | | 0, /* 18 (Reserved) */ |
79 | | #ifdef LTP_DEC |
80 | | 1, /* 19 ER AAC LTP */ |
81 | | #else |
82 | | 0, /* 19 ER AAC LTP */ |
83 | | #endif |
84 | | 0, /* 20 ER AAC scalable */ |
85 | | 0, /* 21 ER TwinVQ */ |
86 | | 0, /* 22 ER BSAC */ |
87 | | #ifdef LD_DEC |
88 | | 1, /* 23 ER AAC LD */ |
89 | | #else |
90 | | 0, /* 23 ER AAC LD */ |
91 | | #endif |
92 | | 0, /* 24 ER CELP */ |
93 | | 0, /* 25 ER HVXC */ |
94 | | 0, /* 26 ER HILN */ |
95 | | 0, /* 27 ER Parametric */ |
96 | | #else /* No ER defined */ |
97 | | 0, /* 17 ER AAC LC */ |
98 | | 0, /* 18 (Reserved) */ |
99 | | 0, /* 19 ER AAC LTP */ |
100 | | 0, /* 20 ER AAC scalable */ |
101 | | 0, /* 21 ER TwinVQ */ |
102 | | 0, /* 22 ER BSAC */ |
103 | | 0, /* 23 ER AAC LD */ |
104 | | 0, /* 24 ER CELP */ |
105 | | 0, /* 25 ER HVXC */ |
106 | | 0, /* 26 ER HILN */ |
107 | | 0, /* 27 ER Parametric */ |
108 | | #endif |
109 | | 0, /* 28 (Reserved) */ |
110 | | #ifdef PS_DEC |
111 | | 1, /* 29 AAC LC + SBR + PS */ |
112 | | #else |
113 | | 0, /* 29 AAC LC + SBR + PS */ |
114 | | #endif |
115 | | 0, /* 30 (Reserved) */ |
116 | | 0 /* 31 (Reserved) */ |
117 | | }; |
118 | | |
119 | | /* Table 1.6.1 */ |
120 | | char NeAACDecAudioSpecificConfig(unsigned char *pBuffer, |
121 | | unsigned long buffer_size, |
122 | | mp4AudioSpecificConfig *mp4ASC) |
123 | 372 | { |
124 | 372 | return AudioSpecificConfig2(pBuffer, buffer_size, mp4ASC, NULL, 0); |
125 | 372 | } |
126 | | |
127 | | int8_t AudioSpecificConfigFromBitfile(bitfile *ld, |
128 | | mp4AudioSpecificConfig *mp4ASC, |
129 | | program_config *pce, uint32_t buffer_size, uint8_t short_form) |
130 | 359 | { |
131 | 359 | int8_t result = 0; |
132 | 359 | #ifdef SBR_DEC |
133 | 359 | uint32_t startpos = faad_get_processed_bits(ld); |
134 | 359 | int32_t bits_to_decode = 0; |
135 | 359 | #endif |
136 | | |
137 | 359 | if (mp4ASC == NULL) |
138 | 0 | return -8; |
139 | | |
140 | 359 | memset(mp4ASC, 0, sizeof(mp4AudioSpecificConfig)); |
141 | | |
142 | 359 | mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(ld, 5 |
143 | 359 | DEBUGVAR(1,1,"parse_audio_decoder_specific_info(): ObjectTypeIndex")); |
144 | | |
145 | 359 | mp4ASC->samplingFrequencyIndex = (uint8_t)faad_getbits(ld, 4 |
146 | 359 | DEBUGVAR(1,2,"parse_audio_decoder_specific_info(): SamplingFrequencyIndex")); |
147 | 359 | if(mp4ASC->samplingFrequencyIndex==0x0f) |
148 | 4 | faad_getbits(ld, 24); |
149 | | |
150 | 359 | mp4ASC->channelsConfiguration = (uint8_t)faad_getbits(ld, 4 |
151 | 359 | DEBUGVAR(1,3,"parse_audio_decoder_specific_info(): ChannelsConfiguration")); |
152 | | |
153 | 359 | mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); |
154 | | |
155 | 359 | if (ObjectTypesTable[mp4ASC->objectTypeIndex] != 1) |
156 | 15 | { |
157 | 15 | return -1; |
158 | 15 | } |
159 | | |
160 | 344 | if (mp4ASC->samplingFrequency == 0) |
161 | 1 | { |
162 | 1 | return -2; |
163 | 1 | } |
164 | | |
165 | 343 | if (mp4ASC->channelsConfiguration > 7) |
166 | 2 | { |
167 | 2 | return -3; |
168 | 2 | } |
169 | | |
170 | 341 | #ifdef SBR_DEC |
171 | 341 | mp4ASC->sbr_present_flag = -1; |
172 | 341 | mp4ASC->ps_present_flag = -1; |
173 | 341 | if (mp4ASC->objectTypeIndex == 5 || mp4ASC->objectTypeIndex == 29) |
174 | 117 | { |
175 | 117 | uint8_t tmp; |
176 | | |
177 | 117 | mp4ASC->sbr_present_flag = 1; |
178 | 117 | if (mp4ASC->objectTypeIndex == 29) |
179 | 15 | mp4ASC->ps_present_flag = 1; |
180 | | |
181 | 117 | tmp = (uint8_t)faad_getbits(ld, 4 |
182 | 117 | DEBUGVAR(1,5,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); |
183 | | /* check for downsampled SBR */ |
184 | 117 | if (tmp == mp4ASC->samplingFrequencyIndex) |
185 | 4 | mp4ASC->downSampledSBR = 1; |
186 | 117 | mp4ASC->samplingFrequencyIndex = tmp; |
187 | 117 | if (mp4ASC->samplingFrequencyIndex == 15) |
188 | 10 | { |
189 | 10 | mp4ASC->samplingFrequency = (uint32_t)faad_getbits(ld, 24 |
190 | 10 | DEBUGVAR(1,6,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); |
191 | 107 | } else { |
192 | 107 | mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); |
193 | 107 | } |
194 | 117 | mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(ld, 5 |
195 | 117 | DEBUGVAR(1,7,"parse_audio_decoder_specific_info(): ObjectTypeIndex")); |
196 | 117 | } |
197 | 341 | #endif |
198 | | |
199 | | /* get GASpecificConfig */ |
200 | 341 | if (mp4ASC->objectTypeIndex == 1 || mp4ASC->objectTypeIndex == 2 || |
201 | 217 | mp4ASC->objectTypeIndex == 3 || mp4ASC->objectTypeIndex == 4 || |
202 | 156 | mp4ASC->objectTypeIndex == 6 || mp4ASC->objectTypeIndex == 7) |
203 | 191 | { |
204 | 191 | result = GASpecificConfig(ld, mp4ASC, pce); |
205 | | |
206 | 191 | #ifdef ERROR_RESILIENCE |
207 | 191 | } else if (mp4ASC->objectTypeIndex >= ER_OBJECT_START) { /* ER */ |
208 | 119 | result = GASpecificConfig(ld, mp4ASC, pce); |
209 | 119 | mp4ASC->epConfig = (uint8_t)faad_getbits(ld, 2 |
210 | 119 | DEBUGVAR(1,143,"parse_audio_decoder_specific_info(): epConfig")); |
211 | | |
212 | 119 | if (mp4ASC->epConfig != 0) |
213 | 55 | result = -5; |
214 | 119 | #endif |
215 | | |
216 | 119 | } else { |
217 | 31 | result = -4; |
218 | 31 | } |
219 | | |
220 | | #ifdef SSR_DEC |
221 | | /* shorter frames not allowed for SSR */ |
222 | | if ((mp4ASC->objectTypeIndex == 4) && mp4ASC->frameLengthFlag) |
223 | | return -6; |
224 | | #endif |
225 | | |
226 | | |
227 | 341 | #ifdef SBR_DEC |
228 | 341 | if(short_form) |
229 | 0 | bits_to_decode = 0; |
230 | 341 | else |
231 | 341 | bits_to_decode = (int32_t)(buffer_size*8 - (faad_get_processed_bits(ld) - startpos)); |
232 | | |
233 | 341 | if ((mp4ASC->objectTypeIndex != 5 && mp4ASC->objectTypeIndex != 29) && (bits_to_decode >= 16)) |
234 | 162 | { |
235 | 162 | int16_t syncExtensionType = (int16_t)faad_getbits(ld, 11 |
236 | 162 | DEBUGVAR(1,9,"parse_audio_decoder_specific_info(): syncExtensionType")); |
237 | | |
238 | 162 | if (syncExtensionType == 0x2b7) |
239 | 98 | { |
240 | 98 | uint8_t tmp_OTi = (uint8_t)faad_getbits(ld, 5 |
241 | 98 | DEBUGVAR(1,10,"parse_audio_decoder_specific_info(): extensionAudioObjectType")); |
242 | | |
243 | 98 | if (tmp_OTi == 5 || tmp_OTi == 29) |
244 | 88 | { |
245 | 88 | mp4ASC->sbr_present_flag = (uint8_t)faad_get1bit(ld |
246 | 88 | DEBUGVAR(1,11,"parse_audio_decoder_specific_info(): sbr_present_flag")); |
247 | | |
248 | 88 | if (mp4ASC->sbr_present_flag) |
249 | 86 | { |
250 | 86 | uint8_t tmp; |
251 | | |
252 | | /* Don't set OT to SBR until checked that it is actually there. |
253 | | * PS is carried by ps_present_flag: an object type >= 17 |
254 | | * would send the LC core down the ER syntax path. */ |
255 | 86 | mp4ASC->objectTypeIndex = HE_AAC; |
256 | | |
257 | 86 | if (tmp_OTi == 29) |
258 | 13 | mp4ASC->ps_present_flag = 1; |
259 | | |
260 | 86 | tmp = (uint8_t)faad_getbits(ld, 4 |
261 | 86 | DEBUGVAR(1,12,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); |
262 | | |
263 | | /* check for downsampled SBR */ |
264 | 86 | if (tmp == mp4ASC->samplingFrequencyIndex) |
265 | 6 | mp4ASC->downSampledSBR = 1; |
266 | 86 | mp4ASC->samplingFrequencyIndex = tmp; |
267 | | |
268 | 86 | if (mp4ASC->samplingFrequencyIndex == 15) |
269 | 8 | { |
270 | 8 | mp4ASC->samplingFrequency = (uint32_t)faad_getbits(ld, 24 |
271 | 8 | DEBUGVAR(1,13,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); |
272 | 78 | } else { |
273 | 78 | mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); |
274 | 78 | } |
275 | | |
276 | 86 | bits_to_decode = (int32_t)(buffer_size*8 - (faad_get_processed_bits(ld) - startpos)); |
277 | 86 | if (bits_to_decode >= 12) |
278 | 65 | { |
279 | 65 | syncExtensionType = (int16_t)faad_getbits(ld, 11 |
280 | 65 | DEBUGVAR(1,14,"parse_audio_decoder_specific_info(): syncExtensionType")); |
281 | 65 | if (syncExtensionType == 0x548) |
282 | 1 | { |
283 | 1 | mp4ASC->ps_present_flag = (uint8_t)faad_get1bit(ld |
284 | 1 | DEBUGVAR(1,15,"parse_audio_decoder_specific_info(): ps_present_flag")); |
285 | 1 | } |
286 | 65 | } |
287 | 86 | } |
288 | 88 | } |
289 | 98 | } |
290 | 162 | } |
291 | | |
292 | | /* no SBR signalled, this could mean either implicit signalling or no SBR in this file */ |
293 | | /* MPEG specification states: assume SBR on files with samplerate <= 24000 Hz */ |
294 | 341 | if (mp4ASC->sbr_present_flag == (char)-1) /* cannot be -1 on systems with unsigned char */ |
295 | 191 | { |
296 | 191 | if (mp4ASC->samplingFrequency <= 24000) |
297 | 67 | { |
298 | 67 | mp4ASC->samplingFrequency *= 2; |
299 | 67 | mp4ASC->forceUpSampling = 1; |
300 | 124 | } else /* > 24000*/ { |
301 | 124 | mp4ASC->downSampledSBR = 1; |
302 | 124 | } |
303 | 191 | } |
304 | 341 | #endif |
305 | | |
306 | 341 | faad_endbits(ld); |
307 | | |
308 | 341 | return result; |
309 | 343 | } |
310 | | |
311 | | int8_t AudioSpecificConfig2(uint8_t *pBuffer, |
312 | | uint32_t buffer_size, |
313 | | mp4AudioSpecificConfig *mp4ASC, |
314 | | program_config *pce, |
315 | | uint8_t short_form) |
316 | 372 | { |
317 | 372 | uint8_t ret = 0; |
318 | 372 | bitfile ld; |
319 | 372 | faad_initbits(&ld, pBuffer, buffer_size); |
320 | 372 | if (ld.error != 0) |
321 | 13 | return -7; |
322 | 359 | ret = AudioSpecificConfigFromBitfile(&ld, mp4ASC, pce, buffer_size, short_form); |
323 | 359 | faad_endbits(&ld); |
324 | 359 | return ret; |
325 | 372 | } |