From 934cc1faf4b474542a18a4ae28cb5e6e4ce67d88 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Tue, 31 Dec 2019 14:05:28 +0100 Subject: [PATCH] avformat/dtsdec: make S16LE discrimination sharper Both S16LE as well as DTS can have lots of 0 bytes in silent segments Using these results in error. Thus this patch skips 0 bytes in comparission. Fixes Ticket6561 Signed-off-by: Michael Niedermayer --- libavformat/dtsdec.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/libavformat/dtsdec.c b/libavformat/dtsdec.c index ab59a56dfc..0215ee18bd 100644 --- a/libavformat/dtsdec.c +++ b/libavformat/dtsdec.c @@ -37,6 +37,7 @@ static int dts_probe(const 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(const 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,7 +126,7 @@ static int dts_probe(const 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;