|
|
@@ -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 = { |
|
|
|