summaryrefslogtreecommitdiff
path: root/libavformat/dtsdec.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2019-12-31 14:05:28 +0100
committerMichael Niedermayer <michael@niedermayer.cc>2020-01-18 18:35:57 +0100
commit934cc1faf4b474542a18a4ae28cb5e6e4ce67d88 (patch)
tree1282565d74d1cf1310fae084d2801ef136e03d7f /libavformat/dtsdec.c
parent6a69f049274fcc22b462e3997596a28bef3feda6 (diff)
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 <michael@niedermayer.cc>
Diffstat (limited to 'libavformat/dtsdec.c')
-rw-r--r--libavformat/dtsdec.c11
1 files 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;