summaryrefslogtreecommitdiff
path: root/lib/rbcodec/codecs/libfaad/mp4.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rbcodec/codecs/libfaad/mp4.c')
-rw-r--r--lib/rbcodec/codecs/libfaad/mp4.c300
1 files changed, 300 insertions, 0 deletions
diff --git a/lib/rbcodec/codecs/libfaad/mp4.c b/lib/rbcodec/codecs/libfaad/mp4.c
new file mode 100644
index 0000000000..94e1a1daaa
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/mp4.c
@@ -0,0 +1,300 @@
1/*
2** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3** Copyright (C) 2003-2004 M. Bakker, Ahead Software 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** Commercial non-GPL licensing of this software is possible.
23** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
24**
25** $Id$
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 */
38static 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
61#ifdef SCALABLE_DEC
62 1, /* 6 AAC Scalable */
63#else
64 0, /* 6 AAC Scalable */
65#endif
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
86#ifdef SCALABLE_DEC
87 1, /* 20 ER AAC scalable */
88#else
89 0, /* 20 ER AAC scalable */
90#endif
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 */
122/* rockbox: not used
123int8_t NEAACDECAPI NeAACDecAudioSpecificConfig(uint8_t *pBuffer,
124 uint32_t buffer_size,
125 mp4AudioSpecificConfig *mp4ASC)
126{
127 return AudioSpecificConfig2(pBuffer, buffer_size, mp4ASC, NULL);
128}*/
129
130int8_t AudioSpecificConfig2(uint8_t *pBuffer,
131 uint32_t buffer_size,
132 mp4AudioSpecificConfig *mp4ASC,
133 program_config *pce)
134{
135 bitfile ld;
136 int8_t result = 0;
137#ifdef SBR_DEC
138 int8_t bits_to_decode = 0;
139#endif
140
141 if (pBuffer == NULL)
142 return -7;
143 if (mp4ASC == NULL)
144 return -8;
145
146 memset(mp4ASC, 0, sizeof(mp4AudioSpecificConfig));
147
148 faad_initbits(&ld, pBuffer, buffer_size);
149 faad_byte_align(&ld);
150
151 mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(&ld, 5
152 DEBUGVAR(1,1,"parse_audio_decoder_specific_info(): ObjectTypeIndex"));
153
154 mp4ASC->samplingFrequencyIndex = (uint8_t)faad_getbits(&ld, 4
155 DEBUGVAR(1,2,"parse_audio_decoder_specific_info(): SamplingFrequencyIndex"));
156
157 mp4ASC->channelsConfiguration = (uint8_t)faad_getbits(&ld, 4
158 DEBUGVAR(1,3,"parse_audio_decoder_specific_info(): ChannelsConfiguration"));
159
160 mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex);
161
162 if (ObjectTypesTable[mp4ASC->objectTypeIndex] != 1)
163 {
164 faad_endbits(&ld);
165 return -1;
166 }
167
168 if (mp4ASC->samplingFrequency == 0)
169 {
170 faad_endbits(&ld);
171 return -2;
172 }
173
174 if (mp4ASC->channelsConfiguration > 7)
175 {
176 faad_endbits(&ld);
177 return -3;
178 }
179
180#if (defined(PS_DEC) || defined(DRM_PS))
181 /* check if we have a mono file */
182 if (mp4ASC->channelsConfiguration == 1)
183 {
184 /* upMatrix to 2 channels for implicit signalling of PS */
185 mp4ASC->channelsConfiguration = 2;
186 }
187#endif
188
189#ifdef SBR_DEC
190 mp4ASC->sbr_present_flag = -1;
191 if (mp4ASC->objectTypeIndex == 5)
192 {
193 uint8_t tmp;
194
195 mp4ASC->sbr_present_flag = 1;
196 tmp = (uint8_t)faad_getbits(&ld, 4
197 DEBUGVAR(1,5,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex"));
198 /* check for downsampled SBR */
199 if (tmp == mp4ASC->samplingFrequencyIndex)
200 mp4ASC->downSampledSBR = 1;
201 mp4ASC->samplingFrequencyIndex = tmp;
202 if (mp4ASC->samplingFrequencyIndex == 15)
203 {
204 mp4ASC->samplingFrequency = (uint32_t)faad_getbits(&ld, 24
205 DEBUGVAR(1,6,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex"));
206 } else {
207 mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex);
208 }
209 mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(&ld, 5
210 DEBUGVAR(1,7,"parse_audio_decoder_specific_info(): ObjectTypeIndex"));
211 }
212#endif
213
214 /* get GASpecificConfig */
215 if (mp4ASC->objectTypeIndex == 1 || mp4ASC->objectTypeIndex == 2 ||
216 mp4ASC->objectTypeIndex == 3 || mp4ASC->objectTypeIndex == 4 ||
217 mp4ASC->objectTypeIndex == 6 || mp4ASC->objectTypeIndex == 7)
218 {
219 result = GASpecificConfig(&ld, mp4ASC, pce);
220
221#ifdef ERROR_RESILIENCE
222 } else if (mp4ASC->objectTypeIndex >= ER_OBJECT_START) { /* ER */
223 result = GASpecificConfig(&ld, mp4ASC, pce);
224 mp4ASC->epConfig = (uint8_t)faad_getbits(&ld, 2
225 DEBUGVAR(1,143,"parse_audio_decoder_specific_info(): epConfig"));
226
227 if (mp4ASC->epConfig != 0)
228 result = -5;
229#endif
230
231 } else {
232 result = -4;
233 }
234
235#ifdef SSR_DEC
236 /* shorter frames not allowed for SSR */
237 if ((mp4ASC->objectTypeIndex == 4) && mp4ASC->frameLengthFlag)
238 return -6;
239#endif
240
241
242#ifdef SBR_DEC
243 bits_to_decode = (int8_t)(buffer_size*8 - faad_get_processed_bits(&ld));
244
245 if ((mp4ASC->objectTypeIndex != 5) && (bits_to_decode >= 16))
246 {
247 int16_t syncExtensionType = (int16_t)faad_getbits(&ld, 11
248 DEBUGVAR(1,9,"parse_audio_decoder_specific_info(): syncExtensionType"));
249
250 if (syncExtensionType == 0x2b7)
251 {
252 mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(&ld, 5
253 DEBUGVAR(1,10,"parse_audio_decoder_specific_info(): extensionAudioObjectType"));
254
255 if (mp4ASC->objectTypeIndex == 5)
256 {
257 mp4ASC->sbr_present_flag = (uint8_t)faad_get1bit(&ld
258 DEBUGVAR(1,11,"parse_audio_decoder_specific_info(): sbr_present_flag"));
259
260 if (mp4ASC->sbr_present_flag)
261 {
262 uint8_t tmp;
263 tmp = (uint8_t)faad_getbits(&ld, 4
264 DEBUGVAR(1,12,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex"));
265
266 /* check for downsampled SBR */
267 if (tmp == mp4ASC->samplingFrequencyIndex)
268 mp4ASC->downSampledSBR = 1;
269 mp4ASC->samplingFrequencyIndex = tmp;
270
271 if (mp4ASC->samplingFrequencyIndex == 15)
272 {
273 mp4ASC->samplingFrequency = (uint32_t)faad_getbits(&ld, 24
274 DEBUGVAR(1,13,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex"));
275 } else {
276 mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex);
277 }
278 }
279 }
280 }
281 }
282
283 /* no SBR signalled, this could mean either implicit signalling or no SBR in this file */
284 /* MPEG specification states: assume SBR on files with samplerate <= 24000 Hz */
285 if (mp4ASC->sbr_present_flag == -1)
286 {
287 if (mp4ASC->samplingFrequency <= 24000)
288 {
289 mp4ASC->samplingFrequency *= 2;
290 mp4ASC->forceUpSampling = 1;
291 } else /* > 24000*/ {
292 mp4ASC->downSampledSBR = 1;
293 }
294 }
295#endif
296
297 faad_endbits(&ld);
298
299 return result;
300}