]> git.sesse.net Git - ffmpeg/commitdiff
flac demuxer: improve probing
authorAnton Khirnov <anton@khirnov.net>
Sat, 30 Jul 2016 13:14:26 +0000 (15:14 +0200)
committerAnton Khirnov <anton@khirnov.net>
Sun, 31 Jul 2016 06:19:45 +0000 (08:19 +0200)
Extend the probe function to validate the STREAMINFO block that must
follow the fLaC ID tag.

libavformat/flacdec.c

index 7a75527333e2122aa489bead34d35e63b086ec33..2f4ac56040fa016cdb135823853ca7fd33f19eb2 100644 (file)
@@ -177,9 +177,24 @@ static int flac_read_header(AVFormatContext *s)
 
 static int flac_probe(AVProbeData *p)
 {
-    if (p->buf_size < 4 || memcmp(p->buf, "fLaC", 4))
-        return 0;
-    return AVPROBE_SCORE_EXTENSION;
+    /* file header + metadata header + checked bytes of streaminfo */
+    if (p->buf_size >= 4 + 4 + 13) {
+        int type           = p->buf[4] & 0x7f;
+        int size           = AV_RB24(p->buf + 5);
+        int min_block_size = AV_RB16(p->buf + 8);
+        int max_block_size = AV_RB16(p->buf + 10);
+        int sample_rate    = AV_RB24(p->buf + 18) >> 4;
+
+        if (!memcmp(p->buf, "fLaC", 4)            &&
+            type == FLAC_METADATA_TYPE_STREAMINFO &&
+            size == FLAC_STREAMINFO_SIZE          &&
+            min_block_size >= 16                  &&
+            max_block_size >= min_block_size      &&
+            sample_rate && sample_rate <= 655350)
+            return AVPROBE_SCORE_MAX;
+    }
+
+    return 0;
 }
 
 AVInputFormat ff_flac_demuxer = {