X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fdtsdec.c;h=7f8f73fe05243108c6a353e0b077ca26336872bb;hb=bc70684e74a185d7b80c8b80bdedda659cb581b8;hp=a3e52cd5966a4358c5682b9aeddab2029d1ad0df;hpb=ff44c2d4f483cda53859ce019f3815c69239a7e0;p=ffmpeg diff --git a/libavformat/dtsdec.c b/libavformat/dtsdec.c index a3e52cd5966..7f8f73fe052 100644 --- a/libavformat/dtsdec.c +++ b/libavformat/dtsdec.c @@ -29,7 +29,7 @@ #include "avformat.h" #include "rawdec.h" -static int dts_probe(AVProbeData *p) +static int dts_probe(const AVProbeData *p) { const uint8_t *buf, *bufp; uint32_t state = -1; @@ -37,6 +37,7 @@ static int dts_probe(AVProbeData *p) int exss_markers = 0, exss_nextpos = 0; int sum, max, pos, ret, i; int64_t diff = 0; + int diffcount = 1; uint8_t hdr[DCA_CORE_FRAME_HEADER_SIZE + AV_INPUT_BUFFER_PADDING_SIZE] = { 0 }; for (pos = FFMIN(4096, p->buf_size); pos < p->buf_size - 2; pos += 2) { @@ -47,8 +48,12 @@ static int dts_probe(AVProbeData *p) bufp = buf = p->buf + pos; state = (state << 16) | bytestream_get_be16(&bufp); - if (pos >= 4) - diff += FFABS(((int16_t)AV_RL16(buf)) - (int16_t)AV_RL16(buf-4)); + if (pos >= 4) { + if (AV_RL16(buf) || AV_RL16(buf-4)) { + diff += FFABS(((int16_t)AV_RL16(buf)) - (int16_t)AV_RL16(buf-4)); + diffcount ++; + } + } /* extension substream (EXSS) */ if (state == DCA_SYNCWORD_SUBSTREAM) { @@ -121,13 +126,14 @@ static int dts_probe(AVProbeData *p) if (markers[max] > 3 && p->buf_size / markers[max] < 32*1024 && markers[max] * 4 > sum * 3 && - diff / p->buf_size > 200) + diff / diffcount > 600) return AVPROBE_SCORE_EXTENSION + 1; return 0; } -AVInputFormat ff_dts_demuxer = { +FF_RAW_DEMUXER_CLASS(dts) +const AVInputFormat ff_dts_demuxer = { .name = "dts", .long_name = NULL_IF_CONFIG_SMALL("raw DTS"), .read_probe = dts_probe, @@ -136,4 +142,5 @@ AVInputFormat ff_dts_demuxer = { .flags = AVFMT_GENERIC_INDEX, .extensions = "dts", .raw_codec_id = AV_CODEC_ID_DTS, -}; + .priv_data_size = sizeof(FFRawDemuxerContext), + .priv_class = &dts_demuxer_class,};