avformat: add mjpeg_probe()
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 9 Jun 2014 15:52:44 +0000 (17:52 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 9 Jun 2014 15:52:44 +0000 (17:52 +0200)
Fixes Ticket3679

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavformat/rawdec.c

index 9b2aa35..62e5901 100644 (file)
@@ -135,7 +135,65 @@ AVInputFormat ff_latm_demuxer = {
 #endif
 
 #if CONFIG_MJPEG_DEMUXER
-FF_DEF_RAWVIDEO_DEMUXER(mjpeg, "raw MJPEG video", NULL, "mjpg,mjpeg,mpo", AV_CODEC_ID_MJPEG)
+static int mjpeg_probe(AVProbeData *p)
+{
+    int i;
+    int state = -1;
+    int nb_invalid = 0;
+    int nb_frames = 0;
+
+    for (i=0; i<p->buf_size-2; i++) {
+        int c;
+        if (p->buf[i] != 0xFF)
+            continue;
+        c = p->buf[i+1];
+        switch (c) {
+        case 0xD8:
+            state = 0xD8;
+            break;
+        case 0xC0:
+        case 0xC1:
+        case 0xC2:
+        case 0xC3:
+        case 0xC5:
+        case 0xC6:
+        case 0xC7:
+        case 0xF7:
+            if (state == 0xD8) {
+                state = 0xC0;
+            } else
+                nb_invalid++;
+            break;
+        case 0xDA:
+            if (state == 0xC0) {
+                state = 0xDA;
+            } else
+                nb_invalid++;
+            break;
+        case 0xD9:
+            if (state == 0xDA) {
+                state = 0xD9;
+                nb_frames++;
+            } else
+                nb_invalid++;
+            break;
+        default:
+            if (  (c >= 0x02 && c <= 0xBF)
+                || c == 0xC8) {
+                nb_invalid++;
+            }
+        }
+    }
+
+    if (nb_invalid == 0 && nb_frames > 2)
+        return AVPROBE_SCORE_EXTENSION / 2;
+    if (nb_invalid*4 + 1 < nb_frames)
+        return AVPROBE_SCORE_EXTENSION / 4;
+
+    return 0;
+}
+
+FF_DEF_RAWVIDEO_DEMUXER(mjpeg, "raw MJPEG video", mjpeg_probe, "mjpg,mjpeg,mpo", AV_CODEC_ID_MJPEG)
 #endif
 
 #if CONFIG_MLP_DEMUXER