Enhance Musepack SV8 probing code
authorKostya Shishkov <kostya.shishkov@gmail.com>
Wed, 16 Sep 2009 04:43:33 +0000 (04:43 +0000)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Wed, 16 Sep 2009 04:43:33 +0000 (04:43 +0000)
Originally committed as revision 19874 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/mpc8.c

index 687853b..284d8d1 100644 (file)
@@ -53,9 +53,35 @@ typedef struct {
 
 static int mpc8_probe(AVProbeData *p)
 {
-    if (AV_RL32(p->buf) == TAG_MPCK)
+    if (p->buf_size < 16)
+        return 0;
+    if (AV_RL32(p->buf) != TAG_MPCK)
+        return 0;
+    if (p->buf[4] == 'S' && p->buf[5] == 'H') {
+        int size = p->buf[6];
+
+        if (size < 12 || size > 30)
+            return 0;
+        if (!AV_RL32(&p->buf[7])) //zero CRC is invalid
+            return 0;
+        //check whether some tag follows stream header or not
+        if (p->buf[4 + size] < 'A' || p->buf[4 + size] > 'Z')
+            return 0;
+        if (p->buf[5 + size] < 'A' || p->buf[5 + size] > 'Z')
+            return 0;
+        if (p->buf[6 + size] < 3)
+            return 0;
         return AVPROBE_SCORE_MAX;
-    return 0;
+    }
+    /* file magic number should be followed by tag name which consists of
+       two uppercase letters */
+    if (p->buf[4] < 'A' || p->buf[4] > 'Z' || p->buf[5] < 'A' || p->buf[5] > 'Z')
+        return 0;
+    // tag size should be >= 3
+    if (p->buf[6] < 3)
+        return 0;
+    // if first tag is not stream header, that's suspicious
+    return AVPROBE_SCORE_MAX / 4;
 }
 
 static inline int64_t gb_get_v(GetBitContext *gb)