summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2009-09-29 10:12:18 +0000
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>2009-09-29 10:12:18 +0000
commitf6765f3f04518bd0c2172733139422be49c1c82c (patch)
tree6377331c2661bc638a55095967fb75872f98d3f5
parent6378b062081f461b4e7d245aad7c8f67ba4bb2f1 (diff)
Extend DV autodetection to also reliably detect single-frame DVs with
a higher score that MAX/4. It checks that there are at least 10 DIF headers and at least one per 24000 bytes, and if so considers the file reliably detected as DV. Passes probetest, too. Originally committed as revision 20074 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavformat/dv.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/libavformat/dv.c b/libavformat/dv.c
index 1623953440..8e0a83492e 100644
--- a/libavformat/dv.c
+++ b/libavformat/dv.c
@@ -489,6 +489,7 @@ static int dv_probe(AVProbeData *p)
unsigned state, marker_pos = 0;
int i;
int matches = 0;
+ int secondary_matches = 0;
if (p->buf_size < 5)
return 0;
@@ -497,6 +498,10 @@ static int dv_probe(AVProbeData *p)
for (i = 4; i < p->buf_size; i++) {
if ((state & 0xffffff7f) == 0x1f07003f)
matches++;
+ // any section header, also with seq/chan num != 0,
+ // should appear around every 12000 bytes, at least 10 per frame
+ if ((state & 0xff07ff7f) == 0x1f07003f)
+ secondary_matches++;
if (state == 0x003f0700 || state == 0xff3f0700)
marker_pos = i;
if (state == 0xff3f0701 && i - marker_pos == 80)
@@ -505,7 +510,7 @@ static int dv_probe(AVProbeData *p)
}
if (matches && p->buf_size / matches < 1024*1024) {
- if (matches > 4)
+ if (matches > 4 || (secondary_matches >= 10 && p->buf_size / secondary_matches < 24000))
return AVPROBE_SCORE_MAX*3/4; // not max to avoid dv in mov to match
return AVPROBE_SCORE_MAX/4;
}