changeset 5237:496723640f94 libavformat

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.
author reimar
date Tue, 29 Sep 2009 10:12:18 +0000
parents 1403c88b1ce7
children c872818a8e1f
files dv.c
diffstat 1 files changed, 6 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/dv.c	Tue Sep 29 07:05:03 2009 +0000
+++ b/dv.c	Tue Sep 29 10:12:18 2009 +0000
@@ -489,6 +489,7 @@
     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 @@
     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 @@
     }
 
     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;
     }