FFmpeg
mpeg4audio.c
Go to the documentation of this file.
1 /*
2  * MPEG-4 Audio common code
3  * Copyright (c) 2008 Baptiste Coudurier <baptiste.coudurier@free.fr>
4  * Copyright (c) 2009 Alex Converse <alex.converse@gmail.com>
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include "get_bits.h"
24 #include "mpeg4audio.h"
25 
26 /**
27  * Parse MPEG-4 audio configuration for ALS object type.
28  * @param[in] gb bit reader context
29  * @param[in] c MPEG4AudioConfig structure to fill
30  * @return on success 0 is returned, otherwise a value < 0
31  */
32 static int parse_config_ALS(GetBitContext *gb, MPEG4AudioConfig *c, void *logctx)
33 {
34  if (get_bits_left(gb) < 112)
35  return AVERROR_INVALIDDATA;
36 
37  if (get_bits_long(gb, 32) != MKBETAG('A','L','S','\0'))
38  return AVERROR_INVALIDDATA;
39 
40  // override AudioSpecificConfig channel configuration and sample rate
41  // which are buggy in old ALS conformance files
42  c->sample_rate = get_bits_long(gb, 32);
43 
44  if (c->sample_rate <= 0) {
45  av_log(logctx, AV_LOG_ERROR, "Invalid sample rate %d\n", c->sample_rate);
46  return AVERROR_INVALIDDATA;
47  }
48 
49  // skip number of samples
50  skip_bits_long(gb, 32);
51 
52  // read number of channels
53  c->chan_config = 0;
54  c->channels = get_bits(gb, 16) + 1;
55 
56  return 0;
57 }
58 
59 const uint8_t ff_mpeg4audio_channels[15] = {
60  0,
61  1, // mono (1/0)
62  2, // stereo (2/0)
63  3, // 3/0
64  4, // 3/1
65  5, // 3/2
66  6, // 3/2.1
67  8, // 5/2.1
68  0,
69  0,
70  0,
71  7, // 3/3.1
72  8, // 3/2/2.1
73  24, // 3/3/3 - 5/2/3 - 3/0/0.2
74  8, // 3/2.1 - 2/0
75 };
76 
77 static inline int get_object_type(GetBitContext *gb)
78 {
79  int object_type = get_bits(gb, 5);
80  if (object_type == AOT_ESCAPE)
81  object_type = 32 + get_bits(gb, 6);
82  return object_type;
83 }
84 
85 static inline int get_sample_rate(GetBitContext *gb, int *index)
86 {
87  *index = get_bits(gb, 4);
88  return *index == 0x0f ? get_bits(gb, 24) :
90 }
91 
93  int sync_extension, void *logctx)
94 {
95  int specific_config_bitindex, ret;
96  int start_bit_index = get_bits_count(gb);
97  c->object_type = get_object_type(gb);
98  c->sample_rate = get_sample_rate(gb, &c->sampling_index);
99  c->chan_config = get_bits(gb, 4);
100  if (c->chan_config < FF_ARRAY_ELEMS(ff_mpeg4audio_channels))
101  c->channels = ff_mpeg4audio_channels[c->chan_config];
102  else {
103  av_log(logctx, AV_LOG_ERROR, "Invalid chan_config %d\n", c->chan_config);
104  return AVERROR_INVALIDDATA;
105  }
106  c->sbr = -1;
107  c->ps = -1;
108  if (c->object_type == AOT_SBR || (c->object_type == AOT_PS &&
109  // check for W6132 Annex YYYY draft MP3onMP4
110  !(show_bits(gb, 3) & 0x03 && !(show_bits(gb, 9) & 0x3F)))) {
111  if (c->object_type == AOT_PS)
112  c->ps = 1;
113  c->ext_object_type = AOT_SBR;
114  c->sbr = 1;
115  c->ext_sample_rate = get_sample_rate(gb, &c->ext_sampling_index);
116  c->object_type = get_object_type(gb);
117  if (c->object_type == AOT_ER_BSAC)
118  c->ext_chan_config = get_bits(gb, 4);
119  } else {
120  c->ext_object_type = AOT_NULL;
121  c->ext_sample_rate = 0;
122  }
123  specific_config_bitindex = get_bits_count(gb);
124 
125  if (c->object_type == AOT_ALS) {
126  skip_bits(gb, 5);
127  if (show_bits(gb, 24) != MKBETAG('\0','A','L','S'))
128  skip_bits(gb, 24);
129 
130  specific_config_bitindex = get_bits_count(gb);
131 
132  ret = parse_config_ALS(gb, c, logctx);
133  if (ret < 0)
134  return ret;
135  }
136 
137  if (c->ext_object_type != AOT_SBR && sync_extension) {
138  while (get_bits_left(gb) > 15) {
139  if (show_bits(gb, 11) == 0x2b7) { // sync extension
140  get_bits(gb, 11);
141  c->ext_object_type = get_object_type(gb);
142  if (c->ext_object_type == AOT_SBR && (c->sbr = get_bits1(gb)) == 1) {
143  c->ext_sample_rate = get_sample_rate(gb, &c->ext_sampling_index);
144  if (c->ext_sample_rate == c->sample_rate)
145  c->sbr = -1;
146  }
147  if (get_bits_left(gb) > 11 && get_bits(gb, 11) == 0x548)
148  c->ps = get_bits1(gb);
149  break;
150  } else
151  get_bits1(gb); // skip 1 bit
152  }
153  }
154 
155  //PS requires SBR
156  if (!c->sbr)
157  c->ps = 0;
158  //Limit implicit PS to the HE-AACv2 Profile
159  if ((c->ps == -1 && c->object_type != AOT_AAC_LC) || c->channels & ~0x01)
160  c->ps = 0;
161 
162  return specific_config_bitindex - start_bit_index;
163 }
164 
166  int size, int sync_extension, void *logctx)
167 {
168  GetBitContext gb;
169  int ret;
170 
171  if (size <= 0)
172  return AVERROR_INVALIDDATA;
173 
174  ret = init_get_bits8(&gb, buf, size);
175  if (ret < 0)
176  return ret;
177 
178  return ff_mpeg4audio_get_config_gb(c, &gb, sync_extension, logctx);
179 }
get_sample_rate
static int get_sample_rate(GetBitContext *gb, int *index)
Definition: mpeg4audio.c:85
skip_bits_long
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:268
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:664
AOT_PS
@ AOT_PS
N Parametric Stereo.
Definition: mpeg4audio.h:98
get_bits_long
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:411
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:256
MPEG4AudioConfig
Definition: mpeg4audio.h:29
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:371
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:325
mpeg4audio.h
AOT_ESCAPE
@ AOT_ESCAPE
Y Escape Value.
Definition: mpeg4audio.h:100
GetBitContext
Definition: get_bits.h:107
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:524
avpriv_mpeg4audio_get_config2
int avpriv_mpeg4audio_get_config2(MPEG4AudioConfig *c, const uint8_t *buf, int size, int sync_extension, void *logctx)
Parse MPEG-4 systems extradata from a raw buffer to retrieve audio configuration.
Definition: mpeg4audio.c:165
get_bits.h
parse_config_ALS
static int parse_config_ALS(GetBitContext *gb, MPEG4AudioConfig *c, void *logctx)
Parse MPEG-4 audio configuration for ALS object type.
Definition: mpeg4audio.c:32
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:378
get_object_type
static int get_object_type(GetBitContext *gb)
Definition: mpeg4audio.c:77
index
int index
Definition: gxfenc.c:89
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
size
int size
Definition: twinvq_data.h:10344
MKBETAG
#define MKBETAG(a, b, c, d)
Definition: macros.h:56
ff_mpeg4audio_get_config_gb
int ff_mpeg4audio_get_config_gb(MPEG4AudioConfig *c, GetBitContext *gb, int sync_extension, void *logctx)
Parse MPEG-4 systems extradata from a potentially unaligned GetBitContext to retrieve audio configura...
Definition: mpeg4audio.c:92
show_bits
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition: get_bits.h:361
AOT_NULL
@ AOT_NULL
Definition: mpeg4audio.h:71
AOT_ER_BSAC
@ AOT_ER_BSAC
N Error Resilient Bit-Sliced Arithmetic Coding.
Definition: mpeg4audio.h:91
ret
ret
Definition: filter_design.txt:187
AOT_SBR
@ AOT_SBR
Y Spectral Band Replication.
Definition: mpeg4audio.h:77
ff_mpeg4audio_channels
const uint8_t ff_mpeg4audio_channels[15]
Definition: mpeg4audio.c:59
ff_mpeg4audio_sample_rates
const int ff_mpeg4audio_sample_rates[16]
Definition: mpeg4audio_sample_rates.h:26
AOT_ALS
@ AOT_ALS
Y Audio LosslesS.
Definition: mpeg4audio.h:105
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
AOT_AAC_LC
@ AOT_AAC_LC
Y Low Complexity.
Definition: mpeg4audio.h:74