diff options
author | Alex Converse <alex.converse@gmail.com> | 2010-07-12 18:52:03 +0000 |
---|---|---|
committer | Alex Converse <alex.converse@gmail.com> | 2010-07-12 18:52:03 +0000 |
commit | 3cac899af968f9963241c0d0236a16d70eb6b06d (patch) | |
tree | 761092f304d74ed56bef732c075cc6a8fb0b75d3 | |
parent | 65415bb93a32f1be81cb852e6caf925511078fc2 (diff) | |
download | ffmpeg-3cac899af968f9963241c0d0236a16d70eb6b06d.tar.gz |
Split the ADTS header decoder off of the ADTS parser.
The AAC decoder and ADTS-to-ASC BSF both require the header decoder
but not full parsing capabilities.
Originally committed as revision 24217 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rwxr-xr-x | configure | 5 | ||||
-rw-r--r-- | libavcodec/Makefile | 8 | ||||
-rw-r--r-- | libavcodec/aac_adtstoasc_bsf.c | 2 | ||||
-rw-r--r-- | libavcodec/aac_parser.c | 45 | ||||
-rw-r--r-- | libavcodec/aacadtsdec.c | 70 | ||||
-rw-r--r-- | libavcodec/aacadtsdec.h (renamed from libavcodec/aac_parser.h) | 9 | ||||
-rw-r--r-- | libavcodec/aacdec.c | 2 | ||||
-rw-r--r-- | libavformat/spdif.c | 2 |
8 files changed, 84 insertions, 59 deletions
@@ -1162,7 +1162,7 @@ mdct_select="fft" rdft_select="fft" # decoders / encoders / hardware accelerators -aac_decoder_select="mdct rdft aac_parser" +aac_decoder_select="mdct rdft" aac_encoder_select="mdct" ac3_decoder_select="mdct ac3_parser" alac_encoder_select="lpc" @@ -1294,9 +1294,6 @@ vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h" # parsers h264_parser_select="golomb h264dsp" -# bitstream_filters -aac_adtstoasc_bsf_select="aac_parser" - # external libraries libdirac_decoder_deps="libdirac !libschroedinger" libdirac_encoder_deps="libdirac" diff --git a/libavcodec/Makefile b/libavcodec/Makefile index e98173aab6..545c355ce8 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -42,7 +42,8 @@ OBJS-$(CONFIG_VAAPI) += vaapi.o OBJS-$(CONFIG_VDPAU) += vdpau.o # decoders/encoders/hardware accelerators -OBJS-$(CONFIG_AAC_DECODER) += aacdec.o aactab.o aacsbr.o aacps.o +OBJS-$(CONFIG_AAC_DECODER) += aacdec.o aactab.o aacsbr.o aacps.o \ + aacadtsdec.o mpeg4audio.o OBJS-$(CONFIG_AAC_ENCODER) += aacenc.o aaccoder.o \ aacpsy.o aactab.o \ psymodel.o iirfilter.o \ @@ -550,7 +551,7 @@ OBJS-$(CONFIG_LIBXVID) += libxvidff.o libxvid_rc.o # parsers OBJS-$(CONFIG_AAC_PARSER) += aac_parser.o aac_ac3_parser.o \ - mpeg4audio.o + aacadtsdec.o mpeg4audio.o OBJS-$(CONFIG_AC3_PARSER) += ac3_parser.o ac3tab.o \ aac_ac3_parser.o OBJS-$(CONFIG_CAVSVIDEO_PARSER) += cavs_parser.o @@ -586,7 +587,8 @@ OBJS-$(CONFIG_VP3_PARSER) += vp3_parser.o OBJS-$(CONFIG_VP8_PARSER) += vp8_parser.o # bitstream filters -OBJS-$(CONFIG_AAC_ADTSTOASC_BSF) += aac_adtstoasc_bsf.o +OBJS-$(CONFIG_AAC_ADTSTOASC_BSF) += aac_adtstoasc_bsf.o aacadtsdec.o \ + mpeg4audio.o OBJS-$(CONFIG_CHOMP_BSF) += chomp_bsf.o OBJS-$(CONFIG_DUMP_EXTRADATA_BSF) += dump_extradata_bsf.o OBJS-$(CONFIG_H264_MP4TOANNEXB_BSF) += h264_mp4toannexb_bsf.o diff --git a/libavcodec/aac_adtstoasc_bsf.c b/libavcodec/aac_adtstoasc_bsf.c index 9d53a011c8..9b615e65d3 100644 --- a/libavcodec/aac_adtstoasc_bsf.c +++ b/libavcodec/aac_adtstoasc_bsf.c @@ -20,7 +20,7 @@ */ #include "avcodec.h" -#include "aac_parser.h" +#include "aacadtsdec.h" #include "put_bits.h" #include "get_bits.h" #include "mpeg4audio.h" diff --git a/libavcodec/aac_parser.c b/libavcodec/aac_parser.c index 23ac8cebbd..3ad4610e95 100644 --- a/libavcodec/aac_parser.c +++ b/libavcodec/aac_parser.c @@ -22,53 +22,10 @@ #include "parser.h" #include "aac_ac3_parser.h" -#include "aac_parser.h" +#include "aacadtsdec.h" #include "get_bits.h" #include "mpeg4audio.h" -int ff_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr) -{ - int size, rdb, ch, sr; - int aot, crc_abs; - - if(get_bits(gbc, 12) != 0xfff) - return AAC_AC3_PARSE_ERROR_SYNC; - - skip_bits1(gbc); /* id */ - skip_bits(gbc, 2); /* layer */ - crc_abs = get_bits1(gbc); /* protection_absent */ - aot = get_bits(gbc, 2); /* profile_objecttype */ - sr = get_bits(gbc, 4); /* sample_frequency_index */ - if(!ff_mpeg4audio_sample_rates[sr]) - return AAC_AC3_PARSE_ERROR_SAMPLE_RATE; - skip_bits1(gbc); /* private_bit */ - ch = get_bits(gbc, 3); /* channel_configuration */ - - skip_bits1(gbc); /* original/copy */ - skip_bits1(gbc); /* home */ - - /* adts_variable_header */ - skip_bits1(gbc); /* copyright_identification_bit */ - skip_bits1(gbc); /* copyright_identification_start */ - size = get_bits(gbc, 13); /* aac_frame_length */ - if(size < AAC_ADTS_HEADER_SIZE) - return AAC_AC3_PARSE_ERROR_FRAME_SIZE; - - skip_bits(gbc, 11); /* adts_buffer_fullness */ - rdb = get_bits(gbc, 2); /* number_of_raw_data_blocks_in_frame */ - - hdr->object_type = aot + 1; - hdr->chan_config = ch; - hdr->crc_absent = crc_abs; - hdr->num_aac_frames = rdb + 1; - hdr->sampling_index = sr; - hdr->sample_rate = ff_mpeg4audio_sample_rates[sr]; - hdr->samples = (rdb + 1) * 1024; - hdr->bit_rate = size * 8 * hdr->sample_rate / hdr->samples; - - return size; -} - static int aac_sync(uint64_t state, AACAC3ParseContext *hdr_info, int *need_next_header, int *new_frame_start) { diff --git a/libavcodec/aacadtsdec.c b/libavcodec/aacadtsdec.c new file mode 100644 index 0000000000..fd86d288a6 --- /dev/null +++ b/libavcodec/aacadtsdec.c @@ -0,0 +1,70 @@ +/* + * Audio and Video frame extraction + * Copyright (c) 2003 Fabrice Bellard + * Copyright (c) 2003 Michael Niedermayer + * Copyright (c) 2009 Alex Converse + * + * 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 "aac_ac3_parser.h" +#include "aacadtsdec.h" +#include "get_bits.h" +#include "mpeg4audio.h" + +int ff_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr) +{ + int size, rdb, ch, sr; + int aot, crc_abs; + + if(get_bits(gbc, 12) != 0xfff) + return AAC_AC3_PARSE_ERROR_SYNC; + + skip_bits1(gbc); /* id */ + skip_bits(gbc, 2); /* layer */ + crc_abs = get_bits1(gbc); /* protection_absent */ + aot = get_bits(gbc, 2); /* profile_objecttype */ + sr = get_bits(gbc, 4); /* sample_frequency_index */ + if(!ff_mpeg4audio_sample_rates[sr]) + return AAC_AC3_PARSE_ERROR_SAMPLE_RATE; + skip_bits1(gbc); /* private_bit */ + ch = get_bits(gbc, 3); /* channel_configuration */ + + skip_bits1(gbc); /* original/copy */ + skip_bits1(gbc); /* home */ + + /* adts_variable_header */ + skip_bits1(gbc); /* copyright_identification_bit */ + skip_bits1(gbc); /* copyright_identification_start */ + size = get_bits(gbc, 13); /* aac_frame_length */ + if(size < AAC_ADTS_HEADER_SIZE) + return AAC_AC3_PARSE_ERROR_FRAME_SIZE; + + skip_bits(gbc, 11); /* adts_buffer_fullness */ + rdb = get_bits(gbc, 2); /* number_of_raw_data_blocks_in_frame */ + + hdr->object_type = aot + 1; + hdr->chan_config = ch; + hdr->crc_absent = crc_abs; + hdr->num_aac_frames = rdb + 1; + hdr->sampling_index = sr; + hdr->sample_rate = ff_mpeg4audio_sample_rates[sr]; + hdr->samples = (rdb + 1) * 1024; + hdr->bit_rate = size * 8 * hdr->sample_rate / hdr->samples; + + return size; +} diff --git a/libavcodec/aac_parser.h b/libavcodec/aacadtsdec.h index 1e32cd84f4..bdc577179f 100644 --- a/libavcodec/aac_parser.h +++ b/libavcodec/aacadtsdec.h @@ -1,5 +1,5 @@ /* - * AAC parser prototypes + * AAC ADTS header decoding prototypes and structures * Copyright (c) 2003 Fabrice Bellard * Copyright (c) 2003 Michael Niedermayer * @@ -20,11 +20,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef AVCODEC_AAC_PARSER_H -#define AVCODEC_AAC_PARSER_H +#ifndef AVCODEC_AACADTSDEC_H +#define AVCODEC_AACADTSDEC_H #include <stdint.h> -#include "aac_ac3_parser.h" #include "get_bits.h" #define AAC_ADTS_HEADER_SIZE 7 @@ -52,4 +51,4 @@ typedef struct { */ int ff_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr); -#endif /* AVCODEC_AAC_PARSER_H */ +#endif /* AVCODEC_AACADTSDEC_H */ diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c index f85b29240f..19e7783dbf 100644 --- a/libavcodec/aacdec.c +++ b/libavcodec/aacdec.c @@ -90,7 +90,7 @@ #include "sbr.h" #include "aacsbr.h" #include "mpeg4audio.h" -#include "aac_parser.h" +#include "aacadtsdec.h" #include <assert.h> #include <errno.h> diff --git a/libavformat/spdif.c b/libavformat/spdif.c index 1355797593..ac84c50e07 100644 --- a/libavformat/spdif.c +++ b/libavformat/spdif.c @@ -43,7 +43,7 @@ #include "avformat.h" #include "libavcodec/ac3.h" #include "libavcodec/dca.h" -#include "libavcodec/aac_parser.h" +#include "libavcodec/aacadtsdec.h" #define SYNCWORD1 0xF872 #define SYNCWORD2 0x4E1F |