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: mp4.c,v 1.32 2004/09/04 14:56:28 menno Exp $
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
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 */
NeAACDecAudioSpecificConfig(uint8_t * pBuffer,uint32_t buffer_size,mp4AudioSpecificConfig * mp4ASC)122 int8_t NEAACDECAPI NeAACDecAudioSpecificConfig(uint8_t *pBuffer,
123                                                uint32_t buffer_size,
124                                                mp4AudioSpecificConfig *mp4ASC)
125 {
126     return AudioSpecificConfig2(pBuffer, buffer_size, mp4ASC, NULL);
127 }
128 
AudioSpecificConfig2(uint8_t * pBuffer,uint32_t buffer_size,mp4AudioSpecificConfig * mp4ASC,program_config * pce)129 int8_t AudioSpecificConfig2(uint8_t *pBuffer,
130                             uint32_t buffer_size,
131                             mp4AudioSpecificConfig *mp4ASC,
132                             program_config *pce)
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 
159     mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex);
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 
179 #if (defined(PS_DEC) || defined(DRM_PS))
180     /* check if we have a mono file */
181     if (mp4ASC->channelsConfiguration == 1)
182     {
183         /* upMatrix to 2 channels for implicit signalling of PS */
184         mp4ASC->channelsConfiguration = 2;
185     }
186 #endif
187 
188 #ifdef SBR_DEC
189     mp4ASC->sbr_present_flag = -1;
190     if (mp4ASC->objectTypeIndex == 5)
191     {
192         uint8_t tmp;
193 
194         mp4ASC->sbr_present_flag = 1;
195         tmp = (uint8_t)faad_getbits(&ld, 4
196             DEBUGVAR(1,5,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex"));
197         /* check for downsampled SBR */
198         if (tmp == mp4ASC->samplingFrequencyIndex)
199             mp4ASC->downSampledSBR = 1;
200         mp4ASC->samplingFrequencyIndex = tmp;
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 {
206             mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex);
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
242     bits_to_decode = (int8_t)(buffer_size*8 - faad_get_processed_bits(&ld));
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                 {
261                     uint8_t tmp;
262                     tmp = (uint8_t)faad_getbits(&ld, 4
263                         DEBUGVAR(1,12,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex"));
264 
265                     /* check for downsampled SBR */
266                     if (tmp == mp4ASC->samplingFrequencyIndex)
267                         mp4ASC->downSampledSBR = 1;
268                     mp4ASC->samplingFrequencyIndex = tmp;
269 
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 {
275                         mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex);
276                     }
277                 }
278             }
279         }
280     }
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;
290         } else /* > 24000*/ {
291             mp4ASC->downSampledSBR = 1;
292         }
293     }
294 #endif
295 
296     faad_endbits(&ld);
297 
298     return result;
299 }
300