diff mpc8.c @ 5204:9dea59f5436a libavformat

Enhance Musepack SV8 probing code
author kostya
date Wed, 16 Sep 2009 04:43:33 +0000
parents 06903f8f7247
children af13c900ff26
line wrap: on
line diff
--- a/mpc8.c	Wed Sep 16 01:49:34 2009 +0000
+++ b/mpc8.c	Wed Sep 16 04:43:33 2009 +0000
@@ -53,9 +53,35 @@
 
 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)