add nihav-llaudio crate with FLAC, Monkey's Audio, TTA and WavPack support
[nihav.git] / nihav-registry / src / detect.rs
index 44b6e54c919b074646c167cf9bc94890ff8d6a77..210d0008faa25b5540ce0eb1bde16241dd4d960c 100644 (file)
@@ -198,6 +198,28 @@ const DETECTORS: &[DetectConditions] = &[
                                                                &CC::Str(b"ON2fLIST")) },
                      ]
     },
+    DetectConditions {
+        demux_name: "wav",
+        extensions: ".wav",
+        conditions: &[CheckItem{offs: 0, cond: &CC::Str(b"RIFF") },
+                      CheckItem{offs: 8, cond: &CC::Str(b"WAVEfmt ") }
+                     ]
+    },
+    DetectConditions {
+        demux_name: "mov",
+        extensions: ".mov",
+        conditions: &[CheckItem{offs: 4, cond: &CC::Or(&CC::Or(&CC::Str(b"mdat"),
+                                                               &CC::Str(b"moov")),
+                                                               &CC::Str(b"ftyp")) }],
+    },
+    DetectConditions {
+        demux_name: "mov",
+        extensions: ".mov",
+        conditions: &[CheckItem{offs:  0, cond: &CC::Str(b"\x00\x00\x00\x08wide") },
+                      CheckItem{offs: 12, cond: &CC::Or(&CC::Or(&CC::Str(b"mdat"),
+                                                                &CC::Str(b"moov")),
+                                                                &CC::Str(b"ftyp")) }],
+    },
     DetectConditions {
         demux_name: "gdv",
         extensions: ".gdv",
@@ -222,8 +244,8 @@ const DETECTORS: &[DetectConditions] = &[
     DetectConditions {
         demux_name: "bink",
         extensions: ".bik,.bk2",
-        conditions: &[CheckItem{offs: 0, cond: &CC::Or(&CC::In(Arg::U32BE(0x32494B62),     // BIKb
-                                                               Arg::U32BE(0x32494B7B)),    // BIKz
+        conditions: &[CheckItem{offs: 0, cond: &CC::Or(&CC::In(Arg::U32BE(0x42494B62),     // BIKb
+                                                               Arg::U32BE(0x42494B7B)),    // BIKz
                                                        &CC::In(Arg::U32BE(0x4B423261),     // KB2a
                                                                Arg::U32BE(0x4B42327B)))}], // KB2z
     },
@@ -232,6 +254,40 @@ const DETECTORS: &[DetectConditions] = &[
         extensions: ".smk",
         conditions: &[CheckItem{offs: 0, cond: &CC::Or(&CC::Str(b"SMK2"), &CC::Str(b"SMK4"))}],
     },
+    DetectConditions {
+        demux_name: "ape",
+        extensions: ".ape",
+        conditions: &[CheckItem{offs: 0, cond: &CC::Str(b"MAC ") },
+                      CheckItem{offs: 4, cond: &CC::In(Arg::U16LE(3800), Arg::U16LE(3990))}],
+    },
+    DetectConditions {
+        demux_name: "flac",
+        extensions: ".flac",
+        conditions: &[CheckItem{offs: 0, cond: &CC::Str(b"fLaC") }],
+    },
+    DetectConditions {
+        demux_name: "tta",
+        extensions: ".tta",
+        conditions: &[CheckItem{offs: 0, cond: &CC::Str(b"TTA1") }],
+    },
+    DetectConditions {
+        demux_name: "wavpack",
+        extensions: ".wv",
+        conditions: &[CheckItem{offs: 0, cond: &CC::Str(b"wvpk") },
+                      CheckItem{offs: 8, cond: &CC::In(Arg::U16LE(0x402), Arg::U16LE(0x410))}],
+    },
+    DetectConditions {
+        demux_name: "vivo",
+        extensions: ".viv",
+        conditions: &[CheckItem{offs: 0, cond: &CC::In(Arg::U16BE(1), Arg::U16BE(0xFF))},
+                      CheckItem{offs: 2, cond: &CC::Str(b"\x0D\x0AVersion:Vivo/")}],
+    },
+    DetectConditions {
+        demux_name: "vivo",
+        extensions: ".viv",
+        conditions: &[CheckItem{offs: 0, cond: &CC::In(Arg::U16BE(1), Arg::U16BE(0xFF))},
+                      CheckItem{offs: 3, cond: &CC::Str(b"\x0D\x0AVersion:Vivo/")}],
+    },
     DetectConditions {
         demux_name: "bmv",
         extensions: ".bmv",
@@ -248,6 +304,11 @@ const DETECTORS: &[DetectConditions] = &[
         extensions: ".vmd",
         conditions: &[],
     },
+    DetectConditions {
+        demux_name: "vx",
+        extensions: ".vx",
+        conditions: &[CheckItem{offs: 0, cond: &CC::Str(b"VXDS") }],
+    },
 ];
 
 /// Tries to detect container format.
@@ -298,6 +359,22 @@ pub fn detect_format(name: &str, src: &mut ByteReader) -> Option<(&'static str,
     result
 }
 
+/// Tries to detect container format for provided file name.
+pub fn detect_format_by_name(name: &str) -> Option<(&'static str)> {
+    if name.is_empty() {
+        return None;
+    }
+    let lname = name.to_lowercase();
+    for detector in DETECTORS {
+        for ext in detector.extensions.split(',') {
+            if lname.ends_with(ext) {
+                return Some(detector.demux_name);
+            }
+        }
+    }
+    None
+}
+
 #[cfg(test)]
 mod test {
     use super::*;