From aac0aad90bcfce0fd92c3dd1914f6bda9eef1bf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferry=20J=C3=A9r=C3=A9mie?= Date: Sun, 15 Sep 2024 01:03:41 +0200 Subject: [PATCH] avif decode on full rust. --- Cargo.lock | 249 ++++++++++++++++++++------ Cargo.toml | 1 + README.md | 6 + house_source_avif.avif | Bin 0 -> 4701 bytes src/bin/machmap.rs | 1 + src/machmap/avif/mod.rs | 19 ++ src/machmap/macros.rs | 24 ++- src/machmap/mod.rs | 18 +- tests/datasets/house_source_avif.avif | Bin 0 -> 4701 bytes tests/machmap.rs | 11 ++ 10 files changed, 273 insertions(+), 56 deletions(-) create mode 100644 house_source_avif.avif create mode 100644 src/machmap/avif/mod.rs create mode 100644 tests/datasets/house_source_avif.avif diff --git a/Cargo.lock b/Cargo.lock index 205cedf..ab6cf9d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -25,6 +25,18 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -106,9 +118,22 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "4e1496f8fb1fbf272686b8d37f523dab3e4a7443300055e74cdaa449f3114356" + +[[package]] +name = "aom-decode" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b4bc244b59f851b3445dfdd06914b194e1a8128d69c75acdaf6f79919b42afb" +dependencies = [ + "avif-parse", + "imgref", + "libaom-sys", + "quick-error", + "yuv", +] [[package]] name = "arbitrary" @@ -162,6 +187,35 @@ dependencies = [ "v_frame", ] +[[package]] +name = "avif-decode" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5093f6d7c910d1859387a8d7d29a26ec4822d60cba632fdb32121c5c0cb1312a" +dependencies = [ + "aom-decode", + "avif-parse", + "imgref", + "lodepng", + "owning_ref", + "quick-error", + "rgb", + "yuv", +] + +[[package]] +name = "avif-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fb3f9afbbb9f71ae53da13771284895f51c6acc77cfb3571ab966780250dee" +dependencies = [ + "bitreader", + "byteorder", + "fallible_collections", + "log", + "static_assertions", +] + [[package]] name = "avif-serialize" version = "0.8.1" @@ -201,6 +255,15 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +[[package]] +name = "bitreader" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd859c9d97f7c468252795b35aeccc412bdbb1e90ee6969c4fa6328272eaeff" +dependencies = [ + "cfg-if", +] + [[package]] name = "bitstream-io" version = "2.5.3" @@ -240,9 +303,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd4c6dcc3b0aea2f5c0b4b82c2b15fe39ddbc76041a310848f4706edf76bb31" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" [[package]] name = "byteorder" @@ -279,9 +342,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.14" +version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d2eb3cd3d1bf4529e31c215ee6f93ec5a3d536d9f578f93d9d33ee19562932" +checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" dependencies = [ "jobserver", "libc", @@ -350,18 +413,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.16" +version = "4.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019" +checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.15" +version = "4.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6" +checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" dependencies = [ "anstream", "anstyle", @@ -371,9 +434,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.23" +version = "4.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531d7959c5bbb6e266cecdd0f20213639c3a5c3e4d615f97db87661745f781ff" +checksum = "205d5ef6d485fa47606b98b0ddc4ead26eb850aaa86abfb562a94fb3280ecba0" dependencies = [ "clap", ] @@ -384,6 +447,15 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +[[package]] +name = "cmake" +version = "0.1.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" +dependencies = [ + "cc", +] + [[package]] name = "color_quant" version = "1.1.0" @@ -429,9 +501,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -614,6 +686,15 @@ dependencies = [ "zune-inflate", ] +[[package]] +name = "fallible_collections" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a88c69768c0a15262df21899142bc6df9b9b823546d4b4b9a7bc2d6c448ec6fd" +dependencies = [ + "hashbrown 0.13.2", +] + [[package]] name = "fastrand" version = "2.1.1" @@ -631,9 +712,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.32" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c0596c1eac1f9e04ed902702e9878208b336edc9d6fddc8a48387349bab3666" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" dependencies = [ "crc32fast", "miniz_oxide 0.8.0", @@ -733,9 +814,9 @@ dependencies = [ [[package]] name = "globset" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" +checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" dependencies = [ "aho-corasick", "bstr", @@ -765,6 +846,15 @@ dependencies = [ "crunchy", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + [[package]] name = "hashbrown" version = "0.14.5" @@ -830,9 +920,9 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.22" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" +checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" dependencies = [ "crossbeam-deque", "globset", @@ -915,12 +1005,12 @@ checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" [[package]] name = "indexmap" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.14.5", ] [[package]] @@ -993,9 +1083,9 @@ dependencies = [ [[package]] name = "kurbo" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5aa9f0f96a938266bdb12928a67169e8d22c6a786fda8ed984b85e6ba93c3c" +checksum = "89234b2cc610a7dd927ebde6b41dd1a5d4214cffaef4cf1fb2195d592f92518f" dependencies = [ "arrayvec", "smallvec", @@ -1013,6 +1103,15 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" +[[package]] +name = "libaom-sys" +version = "0.17.0+libaom.3.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cba7f0c21a491ce72470f31026d2cd8ddda1032fb09b69ef61b8a9076b6a184f" +dependencies = [ + "cmake", +] + [[package]] name = "libc" version = "0.2.158" @@ -1064,6 +1163,18 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" +[[package]] +name = "lodepng" +version = "3.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2dea7cda68e381418c985fd8f32a9c279a21ae8c715f2376adb20c27a0fad3" +dependencies = [ + "crc32fast", + "flate2", + "libc", + "rgb", +] + [[package]] name = "log" version = "0.4.22" @@ -1114,6 +1225,7 @@ dependencies = [ name = "machin" version = "0.6.1" dependencies = [ + "avif-decode", "clap", "clap_complete", "colored", @@ -1182,9 +1294,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ "libc", ] @@ -1310,9 +1422,18 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "33ea5043e58958ee56f3e15a90aee535795cd7dfd319846288d93c5b57d85cbe" + +[[package]] +name = "owning_ref" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff55baddef9e4ad00f88b6c743a2a8062d4c6ade126c2a528644b8e444d52ce" +dependencies = [ + "stable_deref_trait", +] [[package]] name = "parse-zoneinfo" @@ -1359,9 +1480,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.11" +version = "2.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" +checksum = "9c73c26c01b8c87956cea613c907c9d6ecffd8d18a2a5908e5de0adfaa185cea" dependencies = [ "memchr", "thiserror", @@ -1370,9 +1491,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.11" +version = "2.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a" +checksum = "664d22978e2815783adbdd2c588b455b1bd625299ce36b2a99881ac9627e6d8d" dependencies = [ "pest", "pest_generator", @@ -1380,9 +1501,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.11" +version = "2.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183" +checksum = "a2d5487022d5d33f4c30d91c22afa240ce2a644e87fe08caad974d4eab6badbe" dependencies = [ "pest", "pest_meta", @@ -1393,9 +1514,9 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.7.11" +version = "2.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f" +checksum = "0091754bbd0ea592c4deb3a122ce8ecbb0753b738aa82bc055fcc2eccc8d8174" dependencies = [ "once_cell", "pest", @@ -1701,9 +1822,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.48" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f86ae463694029097b846d8f99fd5536740602ae00022c0c50c5600720b2f71" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" dependencies = [ "bytemuck", ] @@ -1716,9 +1837,9 @@ checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ "bitflags 2.6.0", "errno", @@ -1784,18 +1905,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", @@ -1804,9 +1925,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "indexmap", "itoa", @@ -1935,6 +2056,18 @@ dependencies = [ "lock_api", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strict-num" version = "0.1.1" @@ -2009,9 +2142,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.76" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", @@ -2327,9 +2460,9 @@ checksum = "260bc6647b3893a9a90668360803a15f96b85a5257b1c3a0c3daf6ae2496de42" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" @@ -2712,9 +2845,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "539a77ee7c0de333dcc6da69b177380a0b81e0dacfa4f7344c465a36871ee601" +checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26" [[package]] name = "xmlwriter" @@ -2722,6 +2855,16 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" +[[package]] +name = "yuv" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c028614bf7ce7a9cb9b07ea3b0f4705c303e27afc5b5fd2948766a5bd2cc66b0" +dependencies = [ + "num-traits", + "rgb", +] + [[package]] name = "zerocopy" version = "0.7.35" diff --git a/Cargo.toml b/Cargo.toml index d230c2e..3f30788 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,7 @@ resvg="0.43" usvg="0.43" tiny-skia="0.11" image = { version="0.25" } +avif-decode = "1.0" markdown = "0.3" colored = "2" zip = "2" diff --git a/README.md b/README.md index af70380..158a670 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,12 @@ ls *.svg | machmap -e avif ls *.svg | machmap -e pdf ``` +Convert avif files to png : + +```zsh +ls *.avif | machmap -e png +``` + Convert webp files to png, jpg and avif : ```zsh diff --git a/house_source_avif.avif b/house_source_avif.avif new file mode 100644 index 0000000000000000000000000000000000000000..84757e0ae99eb51c400e0714e988555ed0a7d43d GIT binary patch literal 4701 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 AVIFInputFile<'a> { + pub fn new(input_file: &'a str, output_file: &'a str) -> AVIFInputFile<'a> { + convert_img!(AvifToPng, "avif", "png"); + let png = AvifToPng::new(input_file, output_file); + + let mut map: HashMap<&'a str, Box + 'a>> = HashMap::new(); + map.insert("image/png", Box::new(png)); + AVIFInputFile { + input_file, + output_file, + map, + } + } +} diff --git a/src/machmap/macros.rs b/src/machmap/macros.rs index 6047a5c..7c74e03 100644 --- a/src/machmap/macros.rs +++ b/src/machmap/macros.rs @@ -55,7 +55,29 @@ macro_rules! convert_img { impl<'a> InputTo<'a> for $struct_name<'a> { fn convert(&self) -> Result> { - let img = ImageReader::open(&self.input_file)?.decode()?; + println!("before open avif"); + let dyn_img = ImageReader::open(&self.input_file)?; + let format = ImageFormat::from_path(&self.input_file); + if format == Some(Avif) { + let data = std::fs::read(&self.input_file)?; + let d = Decoder::from_avif(&data)?; + let encoded = match d.to_image()? { + Image::Rgb8(img) => { + let (buf, width, height) = img.into_contiguous_buf(); + lodepng::encode_memory(&buf, width, height, lodepng::ColorType::RGB, 8) + }, + _ => {} + }?; + std::fs::write(&eslf.output_file, encoded); + Ok(format!( + "convert {} to {} : {} -> {}", + $input_name, $output_name, self.input_file, self.output_file, + )) + } + + println!("after open avif {:?}", ImageFormat::from_path(&self.input_file).ok()); + let img = dyn_img.decode()?; + println!("after decode avif"); let format = ImageFormat::from_path(self.output_file)?; if format == ImageFormat::Jpeg { if img.color().has_alpha() { diff --git a/src/machmap/mod.rs b/src/machmap/mod.rs index 6238c76..ece8131 100644 --- a/src/machmap/mod.rs +++ b/src/machmap/mod.rs @@ -8,6 +8,7 @@ pub mod macros; pub mod jpg; pub mod png; +pub mod avif; pub mod webp; pub mod markdown; @@ -29,18 +30,22 @@ pub struct InputsFiles<'a> { impl<'a> InputsFiles<'a> { pub fn new(input_file: &'a str, output_file: &'a str) -> InputsFiles<'a> { + println!("yolo0"); let mut map: HashMap<&'a str, Box> = HashMap::new(); let svg = SVGInputFile::new(input_file, output_file); let jpg = JPGInputFile::new(input_file, output_file); let png = PNGInputFile::new(input_file, output_file); + let avif = AVIFInputFile::new(input_file, output_file); let webp = WebpInputFile::new(input_file, output_file); let markdown = MarkdownInputFile::new(input_file, output_file); let yaml = YamlInputFile::new(input_file, output_file); let json = JsonInputFile::new(input_file, output_file); + println!("yolo1"); map.insert("image/svg+xml", Box::new(svg)); map.insert("image/jpeg", Box::new(jpg)); map.insert("image/png", Box::new(png)); + map.insert("image/avif", Box::new(avif)); map.insert("image/webp", Box::new(webp)); map.insert("text/markdown", Box::new(markdown)); map.insert("text/x-yaml", Box::new(yaml)); @@ -68,17 +73,25 @@ impl<'a> InputsFiles<'a> { } pub fn mime_map(&self) -> Result> { + println!("yolo2"); let input_mime = mime_guess::from_path(self.input_file); + println!("{:?}", input_mime); let e = UnSupportedError { input_file: self.input_file, output_ext: self.output_file, }; match &input_mime.first_raw() { Some(i_mime) => match self.map.get(i_mime) { - Some(val) => val.mime_map(), + Some(val) => { + println!("ok boomer"); + val.mime_map() + }, None => Err(Box::new(e)), }, - None => Err(Box::new(e)), + None => { + println!("yolo3"); + Err(Box::new(e)) + }, } } } @@ -90,6 +103,7 @@ trait InputTo<'a> { create_input!(SVGInputFile, InputTo); create_input!(JPGInputFile, InputTo); create_input!(PNGInputFile, InputTo); +create_input!(AVIFInputFile, InputTo); create_input!(WebpInputFile, InputTo); create_input!(MarkdownInputFile, InputTo); create_input!(YamlInputFile, InputTo); diff --git a/tests/datasets/house_source_avif.avif b/tests/datasets/house_source_avif.avif new file mode 100644 index 0000000000000000000000000000000000000000..84757e0ae99eb51c400e0714e988555ed0a7d43d GIT binary patch literal 4701 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