mirror of https://git.ffmpeg.org/ffmpeg.git
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>
This commit is contained in:
parent
6a69f04927
commit
934cc1faf4
|
@ -37,6 +37,7 @@ static int dts_probe(const AVProbeData *p)
|
||||||
int exss_markers = 0, exss_nextpos = 0;
|
int exss_markers = 0, exss_nextpos = 0;
|
||||||
int sum, max, pos, ret, i;
|
int sum, max, pos, ret, i;
|
||||||
int64_t diff = 0;
|
int64_t diff = 0;
|
||||||
|
int diffcount = 1;
|
||||||
uint8_t hdr[DCA_CORE_FRAME_HEADER_SIZE + AV_INPUT_BUFFER_PADDING_SIZE] = { 0 };
|
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) {
|
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;
|
bufp = buf = p->buf + pos;
|
||||||
state = (state << 16) | bytestream_get_be16(&bufp);
|
state = (state << 16) | bytestream_get_be16(&bufp);
|
||||||
|
|
||||||
if (pos >= 4)
|
if (pos >= 4) {
|
||||||
diff += FFABS(((int16_t)AV_RL16(buf)) - (int16_t)AV_RL16(buf-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) */
|
/* extension substream (EXSS) */
|
||||||
if (state == DCA_SYNCWORD_SUBSTREAM) {
|
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 &&
|
if (markers[max] > 3 && p->buf_size / markers[max] < 32*1024 &&
|
||||||
markers[max] * 4 > sum * 3 &&
|
markers[max] * 4 > sum * 3 &&
|
||||||
diff / p->buf_size > 200)
|
diff / diffcount > 600)
|
||||||
return AVPROBE_SCORE_EXTENSION + 1;
|
return AVPROBE_SCORE_EXTENSION + 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue