diff --git a/libavformat/nsvdec.c b/libavformat/nsvdec.c index 4b294d3591..300a8fd7f8 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 = {