avformat/dtsdec: dts_probe: check reserved bit, check lfe, check sr_code similarity
Fixes misdetection of s16le Fixes Ticket4109 Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
fbb6de2ad7
commit
0dba982bb4
@ -34,7 +34,7 @@ static int dts_probe(AVProbeData *p)
|
|||||||
{
|
{
|
||||||
const uint8_t *buf, *bufp;
|
const uint8_t *buf, *bufp;
|
||||||
uint32_t state = -1;
|
uint32_t state = -1;
|
||||||
int markers[4] = {0};
|
int markers[4*16] = {0};
|
||||||
int sum, max, i;
|
int sum, max, i;
|
||||||
int64_t diff = 0;
|
int64_t diff = 0;
|
||||||
uint8_t hdr[12 + FF_INPUT_BUFFER_PADDING_SIZE] = { 0 };
|
uint8_t hdr[12 + FF_INPUT_BUFFER_PADDING_SIZE] = { 0 };
|
||||||
@ -43,6 +43,7 @@ static int dts_probe(AVProbeData *p)
|
|||||||
|
|
||||||
for(; buf < (p->buf+p->buf_size)-2; buf+=2) {
|
for(; buf < (p->buf+p->buf_size)-2; buf+=2) {
|
||||||
int marker, sample_blocks, sample_rate, sr_code, framesize;
|
int marker, sample_blocks, sample_rate, sr_code, framesize;
|
||||||
|
int lfe;
|
||||||
GetBitContext gb;
|
GetBitContext gb;
|
||||||
|
|
||||||
bufp = buf;
|
bufp = buf;
|
||||||
@ -89,13 +90,27 @@ static int dts_probe(AVProbeData *p)
|
|||||||
if (sample_rate == 0)
|
if (sample_rate == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
get_bits(&gb, 5);
|
||||||
|
if (get_bits(&gb, 1))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
skip_bits_long(&gb, 9);
|
||||||
|
lfe = get_bits(&gb, 2);
|
||||||
|
if (lfe > 2)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
marker += 4* sr_code;
|
||||||
|
|
||||||
markers[marker] ++;
|
markers[marker] ++;
|
||||||
}
|
}
|
||||||
sum = markers[0] + markers[1] + markers[2] + markers[3];
|
|
||||||
max = 0;
|
sum = max = 0;
|
||||||
for (i=1; i<4; i++)
|
for (i=0; i<FF_ARRAY_ELEMS(markers); i++) {
|
||||||
|
sum += markers[i];
|
||||||
if (markers[max] < markers[i])
|
if (markers[max] < markers[i])
|
||||||
max = i;
|
max = i;
|
||||||
|
}
|
||||||
|
|
||||||
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 / p->buf_size > 200)
|
||||||
|
Loading…
Reference in New Issue
Block a user