Coverage Report

Created: 2026-10-17 06:34

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}