diff --git a/libavformat/Makefile b/libavformat/Makefile index 12f90a309a..f6d1f2c309 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -57,7 +57,7 @@ OBJS-$(CONFIG_DIRAC_MUXER) += raw.o OBJS-$(CONFIG_DNXHD_DEMUXER) += raw.o OBJS-$(CONFIG_DNXHD_MUXER) += raw.o OBJS-$(CONFIG_DSICIN_DEMUXER) += dsicin.o -OBJS-$(CONFIG_DTS_DEMUXER) += raw.o +OBJS-$(CONFIG_DTS_DEMUXER) += dtsdec.o raw.o OBJS-$(CONFIG_DTS_MUXER) += raw.o OBJS-$(CONFIG_DV_DEMUXER) += dv.o OBJS-$(CONFIG_DV_MUXER) += dvenc.o diff --git a/libavformat/dtsdec.c b/libavformat/dtsdec.c new file mode 100644 index 0000000000..67e3d0f34f --- /dev/null +++ b/libavformat/dtsdec.c @@ -0,0 +1,78 @@ +/* + * RAW DTS demuxer + * Copyright (c) 2008 Benjamin Larsson + * + * 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 "libavcodec/bytestream.h" +#include "avformat.h" +#include "raw.h" + +#define DCA_MARKER_14B_BE 0x1FFFE800 +#define DCA_MARKER_14B_LE 0xFF1F00E8 +#define DCA_MARKER_RAW_BE 0x7FFE8001 +#define DCA_MARKER_RAW_LE 0xFE7F0180 + +static int dts_probe(AVProbeData *p) +{ + const uint8_t *buf, *bufp; + uint32_t state = -1; + int markers[3] = {0}; + int sum, max; + + buf = p->buf; + + for(; buf < (p->buf+p->buf_size)-2; buf+=2) { + bufp = buf; + state = (state << 16) | bytestream_get_be16(&bufp); + + /* regular bitstream */ + if (state == DCA_MARKER_RAW_BE || state == DCA_MARKER_RAW_LE) + markers[0]++; + + /* 14 bits big-endian bitstream */ + if (state == DCA_MARKER_14B_BE) + if ((bytestream_get_be16(&bufp) & 0xFFF0) == 0x07F0) + markers[1]++; + + /* 14 bits little-endian bitstream */ + if (state == DCA_MARKER_14B_LE) + if ((bytestream_get_be16(&bufp) & 0xF0FF) == 0xF007) + markers[2]++; + } + sum = markers[0] + markers[1] + markers[2]; + max = markers[1] > markers[0]; + max = markers[2] > markers[max] ? 2 : max; + if (markers[max] > 3 && p->buf_size / markers[max] < 32*1024 && + markers[max] * 4 > sum * 3) + return AVPROBE_SCORE_MAX/2+1; + + return 0; +} + +AVInputFormat dts_demuxer = { + "dts", + NULL_IF_CONFIG_SMALL("raw DTS"), + 0, + dts_probe, + ff_raw_audio_read_header, + ff_raw_read_partial_packet, + .flags= AVFMT_GENERIC_INDEX, + .extensions = "dts", + .value = CODEC_ID_DTS, +}; diff --git a/libavformat/raw.c b/libavformat/raw.c index 969858346d..55457bd4e0 100644 --- a/libavformat/raw.c +++ b/libavformat/raw.c @@ -233,7 +233,7 @@ int pcm_read_seek(AVFormatContext *s, return 0; } -static int audio_read_header(AVFormatContext *s, +int ff_raw_audio_read_header(AVFormatContext *s, AVFormatParameters *ap) { AVStream *st = av_new_stream(s, 0); @@ -519,49 +519,6 @@ static int h261_probe(AVProbeData *p) } #endif -#if CONFIG_DTS_DEMUXER -#define DCA_MARKER_14B_BE 0x1FFFE800 -#define DCA_MARKER_14B_LE 0xFF1F00E8 -#define DCA_MARKER_RAW_BE 0x7FFE8001 -#define DCA_MARKER_RAW_LE 0xFE7F0180 -static int dts_probe(AVProbeData *p) -{ - const uint8_t *buf, *bufp; - uint32_t state = -1; - int markers[3] = {0}; - int sum, max; - - buf = p->buf; - - for(; buf < (p->buf+p->buf_size)-2; buf+=2) { - bufp = buf; - state = (state << 16) | bytestream_get_be16(&bufp); - - /* regular bitstream */ - if (state == DCA_MARKER_RAW_BE || state == DCA_MARKER_RAW_LE) - markers[0]++; - - /* 14 bits big-endian bitstream */ - if (state == DCA_MARKER_14B_BE) - if ((bytestream_get_be16(&bufp) & 0xFFF0) == 0x07F0) - markers[1]++; - - /* 14 bits little-endian bitstream */ - if (state == DCA_MARKER_14B_LE) - if ((bytestream_get_be16(&bufp) & 0xF0FF) == 0xF007) - markers[2]++; - } - sum = markers[0] + markers[1] + markers[2]; - max = markers[1] > markers[0]; - max = markers[2] > markers[max] ? 2 : max; - if (markers[max] > 3 && p->buf_size / markers[max] < 32*1024 && - markers[max] * 4 > sum * 3) - return AVPROBE_SCORE_MAX/2+1; - - return 0; -} -#endif - #if CONFIG_DIRAC_DEMUXER static int dirac_probe(AVProbeData *p) { @@ -656,7 +613,7 @@ AVInputFormat ac3_demuxer = { NULL_IF_CONFIG_SMALL("raw AC-3"), 0, ac3_probe, - audio_read_header, + ff_raw_audio_read_header, ff_raw_read_partial_packet, .flags= AVFMT_GENERIC_INDEX, .extensions = "ac3", @@ -735,20 +692,6 @@ AVOutputFormat dnxhd_muxer = { }; #endif -#if CONFIG_DTS_DEMUXER -AVInputFormat dts_demuxer = { - "dts", - NULL_IF_CONFIG_SMALL("raw DTS"), - 0, - dts_probe, - audio_read_header, - ff_raw_read_partial_packet, - .flags= AVFMT_GENERIC_INDEX, - .extensions = "dts", - .value = CODEC_ID_DTS, -}; -#endif - #if CONFIG_DTS_MUXER AVOutputFormat dts_muxer = { "dts", @@ -770,7 +713,7 @@ AVInputFormat eac3_demuxer = { NULL_IF_CONFIG_SMALL("raw E-AC-3"), 0, eac3_probe, - audio_read_header, + ff_raw_audio_read_header, ff_raw_read_partial_packet, .flags= AVFMT_GENERIC_INDEX, .extensions = "eac3", @@ -799,7 +742,7 @@ AVInputFormat gsm_demuxer = { NULL_IF_CONFIG_SMALL("raw GSM"), 0, NULL, - audio_read_header, + ff_raw_audio_read_header, ff_raw_read_partial_packet, .flags= AVFMT_GENERIC_INDEX, .extensions = "gsm", @@ -987,7 +930,7 @@ AVInputFormat mlp_demuxer = { NULL_IF_CONFIG_SMALL("raw MLP"), 0, NULL, - audio_read_header, + ff_raw_audio_read_header, ff_raw_read_partial_packet, .flags= AVFMT_GENERIC_INDEX, .extensions = "mlp", @@ -1028,7 +971,7 @@ AVInputFormat truehd_demuxer = { NULL_IF_CONFIG_SMALL("raw TrueHD"), 0, NULL, - audio_read_header, + ff_raw_audio_read_header, ff_raw_read_partial_packet, .flags= AVFMT_GENERIC_INDEX, .extensions = "thd", @@ -1157,7 +1100,7 @@ AVInputFormat shorten_demuxer = { NULL_IF_CONFIG_SMALL("raw Shorten"), 0, NULL, - audio_read_header, + ff_raw_audio_read_header, ff_raw_read_partial_packet, .flags= AVFMT_GENERIC_INDEX, .extensions = "shn", diff --git a/libavformat/raw.h b/libavformat/raw.h index c0b8fb608d..b59efa75a7 100644 --- a/libavformat/raw.h +++ b/libavformat/raw.h @@ -31,4 +31,6 @@ int ff_raw_write_packet(AVFormatContext *s, AVPacket *pkt); int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt); +int ff_raw_audio_read_header(AVFormatContext *s, AVFormatParameters *ap); + #endif /* AVFORMAT_RAW_H */