diff options
author | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2008-04-01 12:01:40 +0000 |
---|---|---|
committer | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2008-04-01 12:01:40 +0000 |
commit | 4d34bb19c16aa271ce65a4726325cb809a29d51e (patch) | |
tree | b27314bb2bf002ae2765ac8a18dee4254e182e9c | |
parent | ce53144bac00bff5e7fd682c4d72daf80b21d6fb (diff) | |
download | ffmpeg-4d34bb19c16aa271ce65a4726325cb809a29d51e.tar.gz |
mpeg4audio common code
Originally committed as revision 12662 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/mpeg4audio.c | 83 | ||||
-rw-r--r-- | libavcodec/mpeg4audio.h | 49 |
2 files changed, 132 insertions, 0 deletions
diff --git a/libavcodec/mpeg4audio.c b/libavcodec/mpeg4audio.c new file mode 100644 index 0000000000..ce5c723411 --- /dev/null +++ b/libavcodec/mpeg4audio.c @@ -0,0 +1,83 @@ +/* + * MPEG-4 Audio common code + * Copyright (c) 2008 Baptiste Coudurier <baptiste.coudurier@free.fr> + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "bitstream.h" +#include "mpeg4audio.h" + +const int ff_mpeg4audio_sample_rates[16] = { + 96000, 88200, 64000, 48000, 44100, 32000, + 24000, 22050, 16000, 12000, 11025, 8000, 7350 +}; + +const uint8_t ff_mpeg4audio_channels[8] = { + 0, 1, 2, 3, 4, 5, 6, 8 +}; + +static inline int get_object_type(GetBitContext *gb) +{ + int object_type = get_bits(gb, 5); + if (object_type == 31) + object_type = 32 + get_bits(gb, 6); + return object_type; +} + +static inline int get_sample_rate(GetBitContext *gb, int *index) +{ + *index = get_bits(gb, 4); + return *index == 0x0f ? get_bits(gb, 24) : + ff_mpeg4audio_sample_rates[*index]; +} + +int ff_mpeg4audio_get_config(MPEG4AudioConfig *c, const uint8_t *buf, int buf_size) +{ + GetBitContext gb; + int specific_config_bitindex; + + init_get_bits(&gb, buf, buf_size*8); + c->object_type = get_object_type(&gb); + c->sample_rate = get_sample_rate(&gb, &c->sampling_index); + c->chan_config = get_bits(&gb, 4); + c->sbr = -1; + if (c->object_type == 5) { + c->ext_object_type = c->object_type; + c->sbr = 1; + c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index); + c->object_type = get_object_type(&gb); + } else + c->ext_object_type = 0; + + specific_config_bitindex = get_bits_count(&gb); + + if (c->ext_object_type != 5) { + int bits_left = buf_size*8 - specific_config_bitindex; + for (; bits_left > 15; bits_left--) { + if (show_bits(&gb, 11) == 0x2b7) { // sync extension + get_bits(&gb, 11); + c->ext_object_type = get_object_type(&gb); + if (c->ext_object_type == 5 && (c->sbr = get_bits1(&gb)) == 1) + c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index); + break; + } else + get_bits1(&gb); // skip 1 bit + } + } + return specific_config_bitindex; +} diff --git a/libavcodec/mpeg4audio.h b/libavcodec/mpeg4audio.h new file mode 100644 index 0000000000..06a1a366db --- /dev/null +++ b/libavcodec/mpeg4audio.h @@ -0,0 +1,49 @@ +/* + * MPEG-4 Audio common header + * Copyright (c) 2008 Baptiste Coudurier <baptiste.coudurier@free.fr> + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef FFMPEG_MPEG4AUDIO_H +#define FFMPEG_MPEG4AUDIO_H + +#include <stdint.h> + +typedef struct { + int object_type; + int sampling_index; + int sample_rate; + int chan_config; + int sbr; //< -1 implicit, 1 presence + int ext_object_type; + int ext_sampling_index; + int ext_sample_rate; +} MPEG4AudioConfig; + +extern const int ff_mpeg4audio_sample_rates[16]; +extern const uint8_t ff_mpeg4audio_channels[8]; +/** + * Parse MPEG-4 systems extradata to retrieve audio configuration. + * @param[in] c MPEG4AudioConfig structure to fill. + * @param[in] buf Extradata from container. + * @param[in] buf_size Extradata size. + * @return On error -1 is returned, on success AudioSpecificConfig bit index in extradata. + */ +int ff_mpeg4audio_get_config(MPEG4AudioConfig *c, const uint8_t *buf, int buf_size); + +#endif /* FFMPEG_MPEGAUDIO_H */ |