summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2009-09-14 22:03:07 +0000
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>2009-09-14 22:03:07 +0000
commit6377de611a778273f307dfe43e43b4f9f0401186 (patch)
treeccf37fc1d4c61915435477acecf0cbcddc5dd956
parent98487a5b69d9641b4ed66a5281752ea5617eeac7 (diff)
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. Originally committed as revision 19848 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavformat/dv.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/libavformat/dv.c b/libavformat/dv.c
index a75b4a6b0d..1623953440 100644
--- a/libavformat/dv.c
+++ b/libavformat/dv.c
@@ -488,6 +488,7 @@ static int dv_probe(AVProbeData *p)
{
unsigned state, marker_pos = 0;
int i;
+ int matches = 0;
if (p->buf_size < 5)
return 0;
@@ -495,14 +496,19 @@ static int dv_probe(AVProbeData *p)
state = AV_RB32(p->buf);
for (i = 4; i < p->buf_size; i++) {
if ((state & 0xffffff7f) == 0x1f07003f)
- return AVPROBE_SCORE_MAX*3/4; // not max to avoid dv in mov to match
+ matches++;
if (state == 0x003f0700 || state == 0xff3f0700)
marker_pos = i;
if (state == 0xff3f0701 && i - marker_pos == 80)
- return AVPROBE_SCORE_MAX/4;
+ matches++;
state = (state << 8) | p->buf[i];
}
+ if (matches && p->buf_size / matches < 1024*1024) {
+ if (matches > 4)
+ return AVPROBE_SCORE_MAX*3/4; // not max to avoid dv in mov to match
+ return AVPROBE_SCORE_MAX/4;
+ }
return 0;
}