Mercurial > libavformat.hg
comparison dv.c @ 5185:0c742c9c4aa7 libavformat
Try harder to avoid false positives for DV probe.
Require at least one signature match per provided 1MB of probe data,
and if there is only a single match, return at most MAX/4.
Fixes issue1382 but could/should probably still be improved.
author | reimar |
---|---|
date | Mon, 14 Sep 2009 22:03:07 +0000 |
parents | 0a4137d6a7a5 |
children | 496723640f94 |
comparison
equal
deleted
inserted
replaced
5184:2d15ea28c450 | 5185:0c742c9c4aa7 |
---|---|
486 | 486 |
487 static int dv_probe(AVProbeData *p) | 487 static int dv_probe(AVProbeData *p) |
488 { | 488 { |
489 unsigned state, marker_pos = 0; | 489 unsigned state, marker_pos = 0; |
490 int i; | 490 int i; |
491 int matches = 0; | |
491 | 492 |
492 if (p->buf_size < 5) | 493 if (p->buf_size < 5) |
493 return 0; | 494 return 0; |
494 | 495 |
495 state = AV_RB32(p->buf); | 496 state = AV_RB32(p->buf); |
496 for (i = 4; i < p->buf_size; i++) { | 497 for (i = 4; i < p->buf_size; i++) { |
497 if ((state & 0xffffff7f) == 0x1f07003f) | 498 if ((state & 0xffffff7f) == 0x1f07003f) |
498 return AVPROBE_SCORE_MAX*3/4; // not max to avoid dv in mov to match | 499 matches++; |
499 if (state == 0x003f0700 || state == 0xff3f0700) | 500 if (state == 0x003f0700 || state == 0xff3f0700) |
500 marker_pos = i; | 501 marker_pos = i; |
501 if (state == 0xff3f0701 && i - marker_pos == 80) | 502 if (state == 0xff3f0701 && i - marker_pos == 80) |
502 return AVPROBE_SCORE_MAX/4; | 503 matches++; |
503 state = (state << 8) | p->buf[i]; | 504 state = (state << 8) | p->buf[i]; |
504 } | 505 } |
505 | 506 |
507 if (matches && p->buf_size / matches < 1024*1024) { | |
508 if (matches > 4) | |
509 return AVPROBE_SCORE_MAX*3/4; // not max to avoid dv in mov to match | |
510 return AVPROBE_SCORE_MAX/4; | |
511 } | |
506 return 0; | 512 return 0; |
507 } | 513 } |
508 | 514 |
509 #if CONFIG_DV_DEMUXER | 515 #if CONFIG_DV_DEMUXER |
510 AVInputFormat dv_demuxer = { | 516 AVInputFormat dv_demuxer = { |