summaryrefslogtreecommitdiff
path: root/libavformat/nsvdec.c
diff options
context:
space:
mode:
authorThierry Foucu <tfoucu@gmail.com>2011-05-11 21:27:04 -0700
committerDiego Biurrun <diego@biurrun.de>2011-05-12 11:32:39 +0200
commit45faf7fcd335b91e41b0e3ba4e397a9640d8c694 (patch)
tree8edd85712a99f4795c2a7bd18decae5a18b54fb4 /libavformat/nsvdec.c
parentb3bbc6fdc588ff03d9d1d2f17ef6608cf1cfff90 (diff)
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 <diego@biurrun.de>
Diffstat (limited to 'libavformat/nsvdec.c')
-rw-r--r--libavformat/nsvdec.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/libavformat/nsvdec.c b/libavformat/nsvdec.c
index b70d3b9943..8f55bbc841 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 = {