FFmpeg  4.4.4
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 "put_bits.h"
25 #include "mpeg4audio.h"
26 
27 /**
28  * Parse MPEG-4 audio configuration for ALS object type.
29  * @param[in] gb bit reader context
30  * @param[in] c MPEG4AudioConfig structure to fill
31  * @return on success 0 is returned, otherwise a value < 0
32  */
33 static int parse_config_ALS(GetBitContext *gb, MPEG4AudioConfig *c, void *logctx)
34 {
35  if (get_bits_left(gb) < 112)
36  return AVERROR_INVALIDDATA;
37 
38  if (get_bits_long(gb, 32) != MKBETAG('A','L','S','\0'))
39  return AVERROR_INVALIDDATA;
40 
41  // override AudioSpecificConfig channel configuration and sample rate
42  // which are buggy in old ALS conformance files
43  c->sample_rate = get_bits_long(gb, 32);
44 
45  if (c->sample_rate <= 0) {
46  av_log(logctx, AV_LOG_ERROR, "Invalid sample rate %d\n", c->sample_rate);
47  return AVERROR_INVALIDDATA;
48  }
49 
50  // skip number of samples
51  skip_bits_long(gb, 32);
52 
53  // read number of channels
54  c->chan_config = 0;
55  c->channels = get_bits(gb, 16) + 1;
56 
57  return 0;
58 }
59 
60 /* XXX: make sure to update the copies in the different encoders if you change
61  * this table */
63  96000, 88200, 64000, 48000, 44100, 32000,
64  24000, 22050, 16000, 12000, 11025, 8000, 7350
65 };
66 
68  0,
69  1, // mono (1/0)
70  2, // stereo (2/0)
71  3, // 3/0
72  4, // 3/1
73  5, // 3/2
74  6, // 3/2.1
75  8, // 5/2.1
76  0,
77  0,
78  0,
79  7, // 3/3.1
80  8, // 3/2/2.1
81  24 // 3/3/3 - 5/2/3 - 3/0/0.2
82 };
83 
84 static inline int get_object_type(GetBitContext *gb)
85 {
86  int object_type = get_bits(gb, 5);
87  if (object_type == AOT_ESCAPE)
88  object_type = 32 + get_bits(gb, 6);
89  return object_type;
90 }
91 
92 static inline int get_sample_rate(GetBitContext *gb, int *index)
93 {
94  *index = get_bits(gb, 4);
95  return *index == 0x0f ? get_bits(gb, 24) :
97 }
98 
100  int sync_extension, void *logctx)
101 {
102  int specific_config_bitindex, ret;
103  int start_bit_index = get_bits_count(gb);
104  c->object_type = get_object_type(gb);
105  c->sample_rate = get_sample_rate(gb, &c->sampling_index);
106  c->chan_config = get_bits(gb, 4);
107  if (c->chan_config < FF_ARRAY_ELEMS(ff_mpeg4audio_channels))
108  c->channels = ff_mpeg4audio_channels[c->chan_config];
109  else {
110  av_log(logctx, AV_LOG_ERROR, "Invalid chan_config %d\n", c->chan_config);
111  return AVERROR_INVALIDDATA;
112  }
113  c->sbr = -1;
114  c->ps = -1;
115  if (c->object_type == AOT_SBR || (c->object_type == AOT_PS &&
116  // check for W6132 Annex YYYY draft MP3onMP4
117  !(show_bits(gb, 3) & 0x03 && !(show_bits(gb, 9) & 0x3F)))) {
118  if (c->object_type == AOT_PS)
119  c->ps = 1;
120  c->ext_object_type = AOT_SBR;
121  c->sbr = 1;
122  c->ext_sample_rate = get_sample_rate(gb, &c->ext_sampling_index);
123  c->object_type = get_object_type(gb);
124  if (c->object_type == AOT_ER_BSAC)
125  c->ext_chan_config = get_bits(gb, 4);
126  } else {
127  c->ext_object_type = AOT_NULL;
128  c->ext_sample_rate = 0;
129  }
130  specific_config_bitindex = get_bits_count(gb);
131 
132  if (c->object_type == AOT_ALS) {
133  skip_bits(gb, 5);
134  if (show_bits(gb, 24) != MKBETAG('\0','A','L','S'))
135  skip_bits(gb, 24);
136 
137  specific_config_bitindex = get_bits_count(gb);
138 
139  ret = parse_config_ALS(gb, c, logctx);
140  if (ret < 0)
141  return ret;
142  }
143 
144  if (c->ext_object_type != AOT_SBR && sync_extension) {
145  while (get_bits_left(gb) > 15) {
146  if (show_bits(gb, 11) == 0x2b7) { // sync extension
147  get_bits(gb, 11);
148  c->ext_object_type = get_object_type(gb);
149  if (c->ext_object_type == AOT_SBR && (c->sbr = get_bits1(gb)) == 1) {
150  c->ext_sample_rate = get_sample_rate(gb, &c->ext_sampling_index);
151  if (c->ext_sample_rate == c->sample_rate)
152  c->sbr = -1;
153  }
154  if (get_bits_left(gb) > 11 && get_bits(gb, 11) == 0x548)
155  c->ps = get_bits1(gb);
156  break;
157  } else
158  get_bits1(gb); // skip 1 bit
159  }
160  }
161 
162  //PS requires SBR
163  if (!c->sbr)
164  c->ps = 0;
165  //Limit implicit PS to the HE-AACv2 Profile
166  if ((c->ps == -1 && c->object_type != AOT_AAC_LC) || c->channels & ~0x01)
167  c->ps = 0;
168 
169  return specific_config_bitindex - start_bit_index;
170 }
171 
172 #if LIBAVCODEC_VERSION_MAJOR < 59
174  int bit_size, int sync_extension)
175 {
176  GetBitContext gb;
177  int ret;
178 
179  if (bit_size <= 0)
180  return AVERROR_INVALIDDATA;
181 
182  ret = init_get_bits(&gb, buf, bit_size);
183  if (ret < 0)
184  return ret;
185 
186  return ff_mpeg4audio_get_config_gb(c, &gb, sync_extension, NULL);
187 }
188 #endif
189 
191  int size, int sync_extension, void *logctx)
192 {
193  GetBitContext gb;
194  int ret;
195 
196  if (size <= 0)
197  return AVERROR_INVALIDDATA;
198 
199  ret = init_get_bits8(&gb, buf, size);
200  if (ret < 0)
201  return ret;
202 
203  return ff_mpeg4audio_get_config_gb(c, &gb, sync_extension, logctx);
204 }
uint8_t
#define MKBETAG(a, b, c, d)
Definition: common.h:479
#define NULL
Definition: coverity.c:32
bitstream reader API header.
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:546
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:849
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:291
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:498
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:467
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:677
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:219
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition: get_bits.h:446
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:659
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:194
int index
Definition: gxfenc.c:89
static int get_object_type(GetBitContext *gb)
Definition: mpeg4audio.c:84
int avpriv_mpeg4audio_get_config(MPEG4AudioConfig *c, const uint8_t *buf, int bit_size, int sync_extension)
Parse MPEG-4 systems extradata from a raw buffer to retrieve audio configuration.
Definition: mpeg4audio.c:173
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:99
const int avpriv_mpeg4audio_sample_rates[16]
Definition: mpeg4audio.c:62
static int get_sample_rate(GetBitContext *gb, int *index)
Definition: mpeg4audio.c:92
const uint8_t ff_mpeg4audio_channels[14]
Definition: mpeg4audio.c:67
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:190
static int parse_config_ALS(GetBitContext *gb, MPEG4AudioConfig *c, void *logctx)
Parse MPEG-4 audio configuration for ALS object type.
Definition: mpeg4audio.c:33
@ AOT_ALS
Y Audio LosslesS.
Definition: mpeg4audio.h:122
@ AOT_ESCAPE
Y Escape Value.
Definition: mpeg4audio.h:117
@ AOT_SBR
Y Spectral Band Replication.
Definition: mpeg4audio.h:94
@ AOT_ER_BSAC
N Error Resilient Bit-Sliced Arithmetic Coding.
Definition: mpeg4audio.h:108
@ AOT_AAC_LC
Y Low Complexity.
Definition: mpeg4audio.h:91
@ AOT_NULL
Definition: mpeg4audio.h:88
@ AOT_PS
N Parametric Stereo.
Definition: mpeg4audio.h:115
bitstream writer API
#define FF_ARRAY_ELEMS(a)
#define av_log(a,...)
int size
static double c[64]