From 45faf7fcd335b91e41b0e3ba4e397a9640d8c694 Mon Sep 17 00:00:00 2001 From: Thierry Foucu Date: Wed, 11 May 2011 21:27:04 -0700 Subject: [PATCH] nsv: Fix misdetection of MP3 files as NSV. If an MP3 file contains the string NSVs, the NSV probe will confuse it for an NSV file. Check for 0xBEEF after a Video/Audio chunk to achieve more accuracy. Signed-off-by: Diego Biurrun --- libavformat/nsvdec.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/libavformat/nsvdec.c b/libavformat/nsvdec.c index b70d3b9..8f55bbc 100644 --- a/libavformat/nsvdec.c +++ b/libavformat/nsvdec.c @@ -737,6 +737,9 @@ static int nsv_read_close(AVFormatContext *s) static int nsv_probe(AVProbeData *p) { int i; + int score; + int vsize, asize, auxcount; + score = 0; av_dlog(NULL, "nsv_probe(), buf_size %d\n", p->buf_size); /* check file header */ /* streamed files might not have any header */ @@ -749,14 +752,25 @@ static int nsv_probe(AVProbeData *p) /* sometimes even the first header is at 9KB or something :^) */ for (i = 1; i < p->buf_size - 3; i++) { if (p->buf[i+0] == 'N' && p->buf[i+1] == 'S' && - p->buf[i+2] == 'V' && p->buf[i+3] == 's') - return AVPROBE_SCORE_MAX-20; + p->buf[i+2] == 'V' && p->buf[i+3] == 's') { + score = AVPROBE_SCORE_MAX/5; + /* Get the chunk size and check if at the end we are getting 0xBEEF */ + auxcount = p->buf[i+19]; + vsize = p->buf[i+20] | p->buf[i+21] << 8; + asize = p->buf[i+22] | p->buf[i+23] << 8; + vsize = (vsize << 4) | (auxcount >> 4); + if ((asize + vsize + i + 23) < p->buf_size - 2) { + if (p->buf[i+23+asize+vsize+1] == 0xEF && + p->buf[i+23+asize+vsize+2] == 0xBE) + return AVPROBE_SCORE_MAX-20; + } + } } /* so we'll have more luck on extension... */ if (av_match_ext(p->filename, "nsv")) return AVPROBE_SCORE_MAX/2; /* FIXME: add mime-type check */ - return 0; + return score; } AVInputFormat ff_nsv_demuxer = { -- 2.7.4