Skip to content
Snippets Groups Projects
Commit 5dea25aa authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Initial commit

parents
No related branches found
No related tags found
No related merge requests found
/target
/.idea
\ No newline at end of file
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "adler32"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2"
[[package]]
name = "aho-corasick"
version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "743ad5a418686aad3b87fd14c43badd828cf26e214a00f92a384291cf22e1811"
dependencies = [
"memchr",
]
[[package]]
name = "ansi_term"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
dependencies = [
"winapi",
]
[[package]]
name = "atty"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
dependencies = [
"hermit-abi",
"libc",
"winapi",
]
[[package]]
name = "autocfg"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
[[package]]
name = "backtrace"
version = "0.3.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e4036b9bf40f3cf16aba72a3d65e8a520fc4bafcdc7079aea8f848c58c5b5536"
dependencies = [
"backtrace-sys",
"cfg-if",
"libc",
"rustc-demangle",
]
[[package]]
name = "backtrace-sys"
version = "0.1.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491"
dependencies = [
"cc",
"libc",
]
[[package]]
name = "bindgen"
version = "0.51.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebd71393f1ec0509b553aa012b9b58e81dadbdff7130bd3b8cba576e69b32f75"
dependencies = [
"bitflags",
"cexpr",
"cfg-if",
"clang-sys",
"clap",
"env_logger",
"lazy_static",
"log",
"peeking_take_while",
"proc-macro2",
"quote",
"regex",
"rustc-hash",
"shlex",
"which",
]
[[package]]
name = "bitflags"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
[[package]]
name = "bytemuck"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37fa13df2292ecb479ec23aa06f4507928bef07839be9ef15281411076629431"
[[package]]
name = "byteorder"
version = "1.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
[[package]]
name = "cc"
version = "1.0.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd"
[[package]]
name = "cexpr"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fce5b5fb86b0c57c20c834c1b412fd09c77c8a59b9473f86272709e78874cd1d"
dependencies = [
"nom",
]
[[package]]
name = "cfg-if"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
[[package]]
name = "clang-sys"
version = "0.28.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81de550971c976f176130da4b2978d3b524eaa0fd9ac31f3ceb5ae1231fb4853"
dependencies = [
"glob",
"libc",
"libloading",
]
[[package]]
name = "clap"
version = "2.33.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
dependencies = [
"ansi_term",
"atty",
"bitflags",
"strsim",
"textwrap",
"unicode-width",
"vec_map",
]
[[package]]
name = "color_quant"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0dbbb57365263e881e805dc77d94697c9118fd94d8da011240555aa7b23445bd"
[[package]]
name = "crc32fast"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1"
dependencies = [
"cfg-if",
]
[[package]]
name = "crossbeam-deque"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285"
dependencies = [
"crossbeam-epoch",
"crossbeam-utils",
"maybe-uninit",
]
[[package]]
name = "crossbeam-epoch"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace"
dependencies = [
"autocfg",
"cfg-if",
"crossbeam-utils",
"lazy_static",
"maybe-uninit",
"memoffset",
"scopeguard",
]
[[package]]
name = "crossbeam-queue"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db"
dependencies = [
"cfg-if",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
dependencies = [
"autocfg",
"cfg-if",
"lazy_static",
]
[[package]]
name = "deflate"
version = "0.7.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "707b6a7b384888a70c8d2e8650b3e60170dfc6a67bb4aa67b6dfca57af4bedb4"
dependencies = [
"adler32",
"byteorder",
]
[[package]]
name = "either"
version = "1.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
[[package]]
name = "enum_primitive"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180"
dependencies = [
"num-traits 0.1.43",
]
[[package]]
name = "env_logger"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3"
dependencies = [
"atty",
"humantime",
"log",
"regex",
"termcolor",
]
[[package]]
name = "failure"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9"
dependencies = [
"backtrace",
"failure_derive",
]
[[package]]
name = "failure_derive"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08"
dependencies = [
"proc-macro2",
"quote",
"syn",
"synstructure",
]
[[package]]
name = "ffmpeg-dev"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e4cab3aaa1dee258d1055790beb2af6b853d80f2e6ffc222f04dc4f1369b7b8d"
dependencies = [
"bindgen",
"cc",
"flate2",
"libc",
"num_cpus",
"tar",
]
[[package]]
name = "filetime"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ff6d4dab0aa0c8e6346d46052e93b13a16cf847b54ed357087c35011048cc7d"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"winapi",
]
[[package]]
name = "flate2"
version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f"
dependencies = [
"cfg-if",
"crc32fast",
"libc",
"miniz_oxide",
]
[[package]]
name = "fraction"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1055159ac82fb210c813303f716b6c8db57ace9d5ec2dbbc2e1d7a864c1dd74e"
dependencies = [
"lazy_static",
"num",
]
[[package]]
name = "gif"
version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "471d90201b3b223f3451cd4ad53e34295f16a1df17b1edf3736d47761c3981af"
dependencies = [
"color_quant",
"lzw",
]
[[package]]
name = "glob"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
[[package]]
name = "hermit-abi"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2c55f143919fbc0bc77e427fe2d74cf23786d7c1875666f2fde3ac3c659bb67"
dependencies = [
"libc",
]
[[package]]
name = "humantime"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
dependencies = [
"quick-error",
]
[[package]]
name = "image"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef4e336ec01a678e7ab692914c641181528e8656451e6252f8f9e33728882eaf"
dependencies = [
"bytemuck",
"byteorder",
"gif",
"jpeg-decoder",
"num-iter",
"num-rational",
"num-traits 0.2.11",
"png",
"scoped_threadpool",
"tiff",
]
[[package]]
name = "inflate"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff"
dependencies = [
"adler32",
]
[[package]]
name = "jpeg-decoder"
version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0256f0aec7352539102a9efbcb75543227b7ab1117e0f95450023af730128451"
dependencies = [
"byteorder",
"rayon",
]
[[package]]
name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
version = "0.2.66"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558"
[[package]]
name = "libloading"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753"
dependencies = [
"cc",
"winapi",
]
[[package]]
name = "log"
version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
dependencies = [
"cfg-if",
]
[[package]]
name = "lzw"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084"
[[package]]
name = "maybe-uninit"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
[[package]]
name = "memchr"
version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53445de381a1f436797497c61d851644d0e8e88e6140f22872ad33a704933978"
[[package]]
name = "memoffset"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9"
dependencies = [
"rustc_version",
]
[[package]]
name = "miniz_oxide"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5"
dependencies = [
"adler32",
]
[[package]]
name = "nom"
version = "4.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6"
dependencies = [
"memchr",
"version_check",
]
[[package]]
name = "num"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36"
dependencies = [
"num-bigint",
"num-complex",
"num-integer",
"num-iter",
"num-rational",
"num-traits 0.2.11",
]
[[package]]
name = "num-bigint"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304"
dependencies = [
"autocfg",
"num-integer",
"num-traits 0.2.11",
]
[[package]]
name = "num-complex"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95"
dependencies = [
"autocfg",
"num-traits 0.2.11",
]
[[package]]
name = "num-integer"
version = "0.1.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba"
dependencies = [
"autocfg",
"num-traits 0.2.11",
]
[[package]]
name = "num-iter"
version = "0.1.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfb0800a0291891dd9f4fe7bd9c19384f98f7fbe0cd0f39a2c6b88b9868bbc00"
dependencies = [
"autocfg",
"num-integer",
"num-traits 0.2.11",
]
[[package]]
name = "num-rational"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da4dc79f9e6c81bef96148c8f6b8e72ad4541caa4a24373e900a36da07de03a3"
dependencies = [
"autocfg",
"num-bigint",
"num-integer",
"num-traits 0.2.11",
]
[[package]]
name = "num-traits"
version = "0.1.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31"
dependencies = [
"num-traits 0.2.11",
]
[[package]]
name = "num-traits"
version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096"
dependencies = [
"autocfg",
]
[[package]]
name = "num_cpus"
version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6"
dependencies = [
"hermit-abi",
"libc",
]
[[package]]
name = "peeking_take_while"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
[[package]]
name = "png"
version = "0.15.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef859a23054bbfee7811284275ae522f0434a3c8e7f4b74bd4a35ae7e1c4a283"
dependencies = [
"bitflags",
"crc32fast",
"deflate",
"inflate",
]
[[package]]
name = "proc-macro2"
version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548"
dependencies = [
"unicode-xid",
]
[[package]]
name = "quick-error"
version = "1.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
[[package]]
name = "quote"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rayon"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098"
dependencies = [
"crossbeam-deque",
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9"
dependencies = [
"crossbeam-deque",
"crossbeam-queue",
"crossbeam-utils",
"lazy_static",
"num_cpus",
]
[[package]]
name = "redox_syscall"
version = "0.1.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
[[package]]
name = "regex"
version = "1.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "322cf97724bea3ee221b78fe25ac9c46114ebb51747ad5babd51a2fc6a8235a8"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
"thread_local",
]
[[package]]
name = "regex-syntax"
version = "0.6.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b28dfe3fe9badec5dbf0a79a9cccad2cfc2ab5484bdb3e44cbd1ae8b3ba2be06"
[[package]]
name = "rustc-demangle"
version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
[[package]]
name = "rustc-hash"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
[[package]]
name = "rustc_version"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
dependencies = [
"semver",
]
[[package]]
name = "scoped_threadpool"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8"
[[package]]
name = "scopeguard"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]]
name = "semver"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
dependencies = [
"semver-parser",
]
[[package]]
name = "semver-parser"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
[[package]]
name = "shlex"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2"
[[package]]
name = "strsim"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
[[package]]
name = "syn"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a0294dc449adc58bb6592fff1a23d3e5e6e235afc6a0ffca2657d19e7bbffe5"
dependencies = [
"proc-macro2",
"quote",
"unicode-xid",
]
[[package]]
name = "synstructure"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545"
dependencies = [
"proc-macro2",
"quote",
"syn",
"unicode-xid",
]
[[package]]
name = "tar"
version = "0.4.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3196bfbffbba3e57481b6ea32249fbaf590396a52505a2615adbb79d9d826d3"
dependencies = [
"filetime",
"libc",
"redox_syscall",
"xattr",
]
[[package]]
name = "termcolor"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f"
dependencies = [
"winapi-util",
]
[[package]]
name = "textwrap"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
dependencies = [
"unicode-width",
]
[[package]]
name = "thread_local"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
dependencies = [
"lazy_static",
]
[[package]]
name = "thumbnailgen"
version = "0.1.0"
dependencies = [
"enum_primitive",
"failure",
"ffmpeg-dev",
"fraction",
"image",
"log",
]
[[package]]
name = "tiff"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "002351e428db1eb1d8656d4ca61947c3519ac3191e1c804d4600cd32093b77ad"
dependencies = [
"byteorder",
"lzw",
"miniz_oxide",
]
[[package]]
name = "unicode-width"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479"
[[package]]
name = "unicode-xid"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
[[package]]
name = "vec_map"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a"
[[package]]
name = "version_check"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
[[package]]
name = "which"
version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5475d47078209a02e60614f7ba5e645ef3ed60f771920ac1906d7c1cc65024c8"
dependencies = [
"libc",
]
[[package]]
name = "winapi"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
dependencies = [
"winapi-i686-pc-windows-gnu",
"winapi-x86_64-pc-windows-gnu",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ccfbf554c6ad11084fb7517daca16cfdcaccbdadba4fc336f032a8b12c2ad80"
dependencies = [
"winapi",
]
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "xattr"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c"
dependencies = [
"libc",
]
[package]
name = "thumbnailgen"
version = "0.1.0"
authors = ["Janne Mareike Koschinski <janne@kuschku.de>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
ffmpeg-dev = "0.3.8"
log = "0.4.8"
image = "0.23.0"
enum_primitive = "0.1.1"
failure = "0.1.6"
fraction = "0.6.2"
\ No newline at end of file
use ffmpeg_dev::sys as ffi;
use failure::bail;
use enum_primitive::*;
use std::marker::PhantomData;
use fraction::{Decimal, Fraction};
enum_from_primitive! {
#[derive(Debug, Copy, Clone, PartialEq)]
#[repr(i32)]
pub enum AVMediaType {
Unknown = ffi::AVMediaType_AVMEDIA_TYPE_UNKNOWN,
Video = ffi::AVMediaType_AVMEDIA_TYPE_VIDEO,
Audio = ffi::AVMediaType_AVMEDIA_TYPE_AUDIO,
Data = ffi::AVMediaType_AVMEDIA_TYPE_DATA,
Subtitle = ffi::AVMediaType_AVMEDIA_TYPE_SUBTITLE,
Attachment = ffi::AVMediaType_AVMEDIA_TYPE_ATTACHMENT,
Nb = ffi::AVMediaType_AVMEDIA_TYPE_NB,
}
}
enum_from_primitive! {
#[allow(non_camel_case_types)]
#[doc = " Identify the syntax and semantics of the bitstream."]
#[doc = " The principle is roughly:"]
#[doc = " Two decoders with the same ID can decode the same streams."]
#[doc = " Two encoders with the same ID can encode compatible streams."]
#[doc = " There may be slight deviations from the principle due to implementation"]
#[doc = " details."]
#[derive(Debug, Copy, Clone, PartialEq)]
#[repr(u32)]
pub enum AVCodecID {
NONE = ffi::AVCodecID_AV_CODEC_ID_NONE,
MPEG1VIDEO = ffi::AVCodecID_AV_CODEC_ID_MPEG1VIDEO,
#[doc = "< preferred ID for MPEG-1/2 video decoding"]
MPEG2VIDEO = ffi::AVCodecID_AV_CODEC_ID_MPEG2VIDEO,
H261 = ffi::AVCodecID_AV_CODEC_ID_H261,
H263 = ffi::AVCodecID_AV_CODEC_ID_H263,
RV10 = ffi::AVCodecID_AV_CODEC_ID_RV10,
RV20 = ffi::AVCodecID_AV_CODEC_ID_RV20,
MJPEG = ffi::AVCodecID_AV_CODEC_ID_MJPEG,
MJPEGB = ffi::AVCodecID_AV_CODEC_ID_MJPEGB,
LJPEG = ffi::AVCodecID_AV_CODEC_ID_LJPEG,
SP5X = ffi::AVCodecID_AV_CODEC_ID_SP5X,
JPEGLS = ffi::AVCodecID_AV_CODEC_ID_JPEGLS,
MPEG4 = ffi::AVCodecID_AV_CODEC_ID_MPEG4,
RAWVIDEO = ffi::AVCodecID_AV_CODEC_ID_RAWVIDEO,
MSMPEG4V1 = ffi::AVCodecID_AV_CODEC_ID_MSMPEG4V1,
MSMPEG4V2 = ffi::AVCodecID_AV_CODEC_ID_MSMPEG4V2,
MSMPEG4V3 = ffi::AVCodecID_AV_CODEC_ID_MSMPEG4V3,
WMV1 = ffi::AVCodecID_AV_CODEC_ID_WMV1,
WMV2 = ffi::AVCodecID_AV_CODEC_ID_WMV2,
H263P = ffi::AVCodecID_AV_CODEC_ID_H263P,
H263I = ffi::AVCodecID_AV_CODEC_ID_H263I,
FLV1 = ffi::AVCodecID_AV_CODEC_ID_FLV1,
SVQ1 = ffi::AVCodecID_AV_CODEC_ID_SVQ1,
SVQ3 = ffi::AVCodecID_AV_CODEC_ID_SVQ3,
DVVIDEO = ffi::AVCodecID_AV_CODEC_ID_DVVIDEO,
HUFFYUV = ffi::AVCodecID_AV_CODEC_ID_HUFFYUV,
CYUV = ffi::AVCodecID_AV_CODEC_ID_CYUV,
H264 = ffi::AVCodecID_AV_CODEC_ID_H264,
INDEO3 = ffi::AVCodecID_AV_CODEC_ID_INDEO3,
VP3 = ffi::AVCodecID_AV_CODEC_ID_VP3,
THEORA = ffi::AVCodecID_AV_CODEC_ID_THEORA,
ASV1 = ffi::AVCodecID_AV_CODEC_ID_ASV1,
ASV2 = ffi::AVCodecID_AV_CODEC_ID_ASV2,
FFV1 = ffi::AVCodecID_AV_CODEC_ID_FFV1,
_4XM = ffi::AVCodecID_AV_CODEC_ID_4XM,
VCR1 = ffi::AVCodecID_AV_CODEC_ID_VCR1,
CLJR = ffi::AVCodecID_AV_CODEC_ID_CLJR,
MDEC = ffi::AVCodecID_AV_CODEC_ID_MDEC,
ROQ = ffi::AVCodecID_AV_CODEC_ID_ROQ,
INTERPLAY_VIDEO = ffi::AVCodecID_AV_CODEC_ID_INTERPLAY_VIDEO,
XAN_WC3 = ffi::AVCodecID_AV_CODEC_ID_XAN_WC3,
XAN_WC4 = ffi::AVCodecID_AV_CODEC_ID_XAN_WC4,
RPZA = ffi::AVCodecID_AV_CODEC_ID_RPZA,
CINEPAK = ffi::AVCodecID_AV_CODEC_ID_CINEPAK,
WS_VQA = ffi::AVCodecID_AV_CODEC_ID_WS_VQA,
MSRLE = ffi::AVCodecID_AV_CODEC_ID_MSRLE,
MSVIDEO1 = ffi::AVCodecID_AV_CODEC_ID_MSVIDEO1,
IDCIN = ffi::AVCodecID_AV_CODEC_ID_IDCIN,
_8BPS = ffi::AVCodecID_AV_CODEC_ID_8BPS,
SMC = ffi::AVCodecID_AV_CODEC_ID_SMC,
FLIC = ffi::AVCodecID_AV_CODEC_ID_FLIC,
TRUEMOTION1 = ffi::AVCodecID_AV_CODEC_ID_TRUEMOTION1,
VMDVIDEO = ffi::AVCodecID_AV_CODEC_ID_VMDVIDEO,
MSZH = ffi::AVCodecID_AV_CODEC_ID_MSZH,
ZLIB = ffi::AVCodecID_AV_CODEC_ID_ZLIB,
QTRLE = ffi::AVCodecID_AV_CODEC_ID_QTRLE,
TSCC = ffi::AVCodecID_AV_CODEC_ID_TSCC,
ULTI = ffi::AVCodecID_AV_CODEC_ID_ULTI,
QDRAW = ffi::AVCodecID_AV_CODEC_ID_QDRAW,
VIXL = ffi::AVCodecID_AV_CODEC_ID_VIXL,
QPEG = ffi::AVCodecID_AV_CODEC_ID_QPEG,
PNG = ffi::AVCodecID_AV_CODEC_ID_PNG,
PPM = ffi::AVCodecID_AV_CODEC_ID_PPM,
PBM = ffi::AVCodecID_AV_CODEC_ID_PBM,
PGM = ffi::AVCodecID_AV_CODEC_ID_PGM,
PGMYUV = ffi::AVCodecID_AV_CODEC_ID_PGMYUV,
PAM = ffi::AVCodecID_AV_CODEC_ID_PAM,
FFVHUFF = ffi::AVCodecID_AV_CODEC_ID_FFVHUFF,
RV30 = ffi::AVCodecID_AV_CODEC_ID_RV30,
RV40 = ffi::AVCodecID_AV_CODEC_ID_RV40,
VC1 = ffi::AVCodecID_AV_CODEC_ID_VC1,
WMV3 = ffi::AVCodecID_AV_CODEC_ID_WMV3,
LOCO = ffi::AVCodecID_AV_CODEC_ID_LOCO,
WNV1 = ffi::AVCodecID_AV_CODEC_ID_WNV1,
AASC = ffi::AVCodecID_AV_CODEC_ID_AASC,
INDEO2 = ffi::AVCodecID_AV_CODEC_ID_INDEO2,
FRAPS = ffi::AVCodecID_AV_CODEC_ID_FRAPS,
TRUEMOTION2 = ffi::AVCodecID_AV_CODEC_ID_TRUEMOTION2,
BMP = ffi::AVCodecID_AV_CODEC_ID_BMP,
CSCD = ffi::AVCodecID_AV_CODEC_ID_CSCD,
MMVIDEO = ffi::AVCodecID_AV_CODEC_ID_MMVIDEO,
ZMBV = ffi::AVCodecID_AV_CODEC_ID_ZMBV,
AVS = ffi::AVCodecID_AV_CODEC_ID_AVS,
SMACKVIDEO = ffi::AVCodecID_AV_CODEC_ID_SMACKVIDEO,
NUV = ffi::AVCodecID_AV_CODEC_ID_NUV,
KMVC = ffi::AVCodecID_AV_CODEC_ID_KMVC,
FLASHSV = ffi::AVCodecID_AV_CODEC_ID_FLASHSV,
CAVS = ffi::AVCodecID_AV_CODEC_ID_CAVS,
JPEG2000 = ffi::AVCodecID_AV_CODEC_ID_JPEG2000,
VMNC = ffi::AVCodecID_AV_CODEC_ID_VMNC,
VP5 = ffi::AVCodecID_AV_CODEC_ID_VP5,
VP6 = ffi::AVCodecID_AV_CODEC_ID_VP6,
VP6F = ffi::AVCodecID_AV_CODEC_ID_VP6F,
TARGA = ffi::AVCodecID_AV_CODEC_ID_TARGA,
DSICINVIDEO = ffi::AVCodecID_AV_CODEC_ID_DSICINVIDEO,
TIERTEXSEQVIDEO = ffi::AVCodecID_AV_CODEC_ID_TIERTEXSEQVIDEO,
TIFF = ffi::AVCodecID_AV_CODEC_ID_TIFF,
GIF = ffi::AVCodecID_AV_CODEC_ID_GIF,
DXA = ffi::AVCodecID_AV_CODEC_ID_DXA,
DNXHD = ffi::AVCodecID_AV_CODEC_ID_DNXHD,
THP = ffi::AVCodecID_AV_CODEC_ID_THP,
SGI = ffi::AVCodecID_AV_CODEC_ID_SGI,
C93 = ffi::AVCodecID_AV_CODEC_ID_C93,
BETHSOFTVID = ffi::AVCodecID_AV_CODEC_ID_BETHSOFTVID,
PTX = ffi::AVCodecID_AV_CODEC_ID_PTX,
TXD = ffi::AVCodecID_AV_CODEC_ID_TXD,
VP6A = ffi::AVCodecID_AV_CODEC_ID_VP6A,
AMV = ffi::AVCodecID_AV_CODEC_ID_AMV,
VB = ffi::AVCodecID_AV_CODEC_ID_VB,
PCX = ffi::AVCodecID_AV_CODEC_ID_PCX,
SUNRAST = ffi::AVCodecID_AV_CODEC_ID_SUNRAST,
INDEO4 = ffi::AVCodecID_AV_CODEC_ID_INDEO4,
INDEO5 = ffi::AVCodecID_AV_CODEC_ID_INDEO5,
MIMIC = ffi::AVCodecID_AV_CODEC_ID_MIMIC,
RL2 = ffi::AVCodecID_AV_CODEC_ID_RL2,
ESCAPE124 = ffi::AVCodecID_AV_CODEC_ID_ESCAPE124,
DIRAC = ffi::AVCodecID_AV_CODEC_ID_DIRAC,
BFI = ffi::AVCodecID_AV_CODEC_ID_BFI,
CMV = ffi::AVCodecID_AV_CODEC_ID_CMV,
MOTIONPIXELS = ffi::AVCodecID_AV_CODEC_ID_MOTIONPIXELS,
TGV = ffi::AVCodecID_AV_CODEC_ID_TGV,
TGQ = ffi::AVCodecID_AV_CODEC_ID_TGQ,
TQI = ffi::AVCodecID_AV_CODEC_ID_TQI,
AURA = ffi::AVCodecID_AV_CODEC_ID_AURA,
AURA2 = ffi::AVCodecID_AV_CODEC_ID_AURA2,
V210X = ffi::AVCodecID_AV_CODEC_ID_V210X,
TMV = ffi::AVCodecID_AV_CODEC_ID_TMV,
V210 = ffi::AVCodecID_AV_CODEC_ID_V210,
DPX = ffi::AVCodecID_AV_CODEC_ID_DPX,
MAD = ffi::AVCodecID_AV_CODEC_ID_MAD,
FRWU = ffi::AVCodecID_AV_CODEC_ID_FRWU,
FLASHSV2 = ffi::AVCodecID_AV_CODEC_ID_FLASHSV2,
CDGRAPHICS = ffi::AVCodecID_AV_CODEC_ID_CDGRAPHICS,
R210 = ffi::AVCodecID_AV_CODEC_ID_R210,
ANM = ffi::AVCodecID_AV_CODEC_ID_ANM,
BINKVIDEO = ffi::AVCodecID_AV_CODEC_ID_BINKVIDEO,
IFF_ILBM = ffi::AVCodecID_AV_CODEC_ID_IFF_ILBM,
KGV1 = ffi::AVCodecID_AV_CODEC_ID_KGV1,
YOP = ffi::AVCodecID_AV_CODEC_ID_YOP,
VP8 = ffi::AVCodecID_AV_CODEC_ID_VP8,
PICTOR = ffi::AVCodecID_AV_CODEC_ID_PICTOR,
ANSI = ffi::AVCodecID_AV_CODEC_ID_ANSI,
A64_MULTI = ffi::AVCodecID_AV_CODEC_ID_A64_MULTI,
A64_MULTI5 = ffi::AVCodecID_AV_CODEC_ID_A64_MULTI5,
R10K = ffi::AVCodecID_AV_CODEC_ID_R10K,
MXPEG = ffi::AVCodecID_AV_CODEC_ID_MXPEG,
LAGARITH = ffi::AVCodecID_AV_CODEC_ID_LAGARITH,
PRORES = ffi::AVCodecID_AV_CODEC_ID_PRORES,
JV = ffi::AVCodecID_AV_CODEC_ID_JV,
DFA = ffi::AVCodecID_AV_CODEC_ID_DFA,
WMV3IMAGE = ffi::AVCodecID_AV_CODEC_ID_WMV3IMAGE,
VC1IMAGE = ffi::AVCodecID_AV_CODEC_ID_VC1IMAGE,
UTVIDEO = ffi::AVCodecID_AV_CODEC_ID_UTVIDEO,
BMV_VIDEO = ffi::AVCodecID_AV_CODEC_ID_BMV_VIDEO,
VBLE = ffi::AVCodecID_AV_CODEC_ID_VBLE,
DXTORY = ffi::AVCodecID_AV_CODEC_ID_DXTORY,
V410 = ffi::AVCodecID_AV_CODEC_ID_V410,
XWD = ffi::AVCodecID_AV_CODEC_ID_XWD,
CDXL = ffi::AVCodecID_AV_CODEC_ID_CDXL,
XBM = ffi::AVCodecID_AV_CODEC_ID_XBM,
ZEROCODEC = ffi::AVCodecID_AV_CODEC_ID_ZEROCODEC,
MSS1 = ffi::AVCodecID_AV_CODEC_ID_MSS1,
MSA1 = ffi::AVCodecID_AV_CODEC_ID_MSA1,
TSCC2 = ffi::AVCodecID_AV_CODEC_ID_TSCC2,
MTS2 = ffi::AVCodecID_AV_CODEC_ID_MTS2,
CLLC = ffi::AVCodecID_AV_CODEC_ID_CLLC,
MSS2 = ffi::AVCodecID_AV_CODEC_ID_MSS2,
VP9 = ffi::AVCodecID_AV_CODEC_ID_VP9,
AIC = ffi::AVCodecID_AV_CODEC_ID_AIC,
ESCAPE130 = ffi::AVCodecID_AV_CODEC_ID_ESCAPE130,
G2M = ffi::AVCodecID_AV_CODEC_ID_G2M,
WEBP = ffi::AVCodecID_AV_CODEC_ID_WEBP,
HNM4_VIDEO = ffi::AVCodecID_AV_CODEC_ID_HNM4_VIDEO,
HEVC = ffi::AVCodecID_AV_CODEC_ID_HEVC,
FIC = ffi::AVCodecID_AV_CODEC_ID_FIC,
ALIAS_PIX = ffi::AVCodecID_AV_CODEC_ID_ALIAS_PIX,
BRENDER_PIX = ffi::AVCodecID_AV_CODEC_ID_BRENDER_PIX,
PAF_VIDEO = ffi::AVCodecID_AV_CODEC_ID_PAF_VIDEO,
EXR = ffi::AVCodecID_AV_CODEC_ID_EXR,
VP7 = ffi::AVCodecID_AV_CODEC_ID_VP7,
SANM = ffi::AVCodecID_AV_CODEC_ID_SANM,
SGIRLE = ffi::AVCodecID_AV_CODEC_ID_SGIRLE,
MVC1 = ffi::AVCodecID_AV_CODEC_ID_MVC1,
MVC2 = ffi::AVCodecID_AV_CODEC_ID_MVC2,
HQX = ffi::AVCodecID_AV_CODEC_ID_HQX,
TDSC = ffi::AVCodecID_AV_CODEC_ID_TDSC,
HQ_HQA = ffi::AVCodecID_AV_CODEC_ID_HQ_HQA,
HAP = ffi::AVCodecID_AV_CODEC_ID_HAP,
DDS = ffi::AVCodecID_AV_CODEC_ID_DDS,
DXV = ffi::AVCodecID_AV_CODEC_ID_DXV,
SCREENPRESSO = ffi::AVCodecID_AV_CODEC_ID_SCREENPRESSO,
RSCC = ffi::AVCodecID_AV_CODEC_ID_RSCC,
AVS2 = ffi::AVCodecID_AV_CODEC_ID_AVS2,
Y41P = ffi::AVCodecID_AV_CODEC_ID_Y41P,
AVRP = ffi::AVCodecID_AV_CODEC_ID_AVRP,
_012V = ffi::AVCodecID_AV_CODEC_ID_012V,
AVUI = ffi::AVCodecID_AV_CODEC_ID_AVUI,
AYUV = ffi::AVCodecID_AV_CODEC_ID_AYUV,
TARGA_Y216 = ffi::AVCodecID_AV_CODEC_ID_TARGA_Y216,
V308 = ffi::AVCodecID_AV_CODEC_ID_V308,
V408 = ffi::AVCodecID_AV_CODEC_ID_V408,
YUV4 = ffi::AVCodecID_AV_CODEC_ID_YUV4,
AVRN = ffi::AVCodecID_AV_CODEC_ID_AVRN,
CPIA = ffi::AVCodecID_AV_CODEC_ID_CPIA,
XFACE = ffi::AVCodecID_AV_CODEC_ID_XFACE,
SNOW = ffi::AVCodecID_AV_CODEC_ID_SNOW,
SMVJPEG = ffi::AVCodecID_AV_CODEC_ID_SMVJPEG,
APNG = ffi::AVCodecID_AV_CODEC_ID_APNG,
DAALA = ffi::AVCodecID_AV_CODEC_ID_DAALA,
CFHD = ffi::AVCodecID_AV_CODEC_ID_CFHD,
TRUEMOTION2RT = ffi::AVCodecID_AV_CODEC_ID_TRUEMOTION2RT,
M101 = ffi::AVCodecID_AV_CODEC_ID_M101,
MAGICYUV = ffi::AVCodecID_AV_CODEC_ID_MAGICYUV,
SHEERVIDEO = ffi::AVCodecID_AV_CODEC_ID_SHEERVIDEO,
YLC = ffi::AVCodecID_AV_CODEC_ID_YLC,
PSD = ffi::AVCodecID_AV_CODEC_ID_PSD,
PIXLET = ffi::AVCodecID_AV_CODEC_ID_PIXLET,
SPEEDHQ = ffi::AVCodecID_AV_CODEC_ID_SPEEDHQ,
FMVC = ffi::AVCodecID_AV_CODEC_ID_FMVC,
SCPR = ffi::AVCodecID_AV_CODEC_ID_SCPR,
CLEARVIDEO = ffi::AVCodecID_AV_CODEC_ID_CLEARVIDEO,
XPM = ffi::AVCodecID_AV_CODEC_ID_XPM,
AV1 = ffi::AVCodecID_AV_CODEC_ID_AV1,
BITPACKED = ffi::AVCodecID_AV_CODEC_ID_BITPACKED,
MSCC = ffi::AVCodecID_AV_CODEC_ID_MSCC,
SRGC = ffi::AVCodecID_AV_CODEC_ID_SRGC,
SVG = ffi::AVCodecID_AV_CODEC_ID_SVG,
GDV = ffi::AVCodecID_AV_CODEC_ID_GDV,
FITS = ffi::AVCodecID_AV_CODEC_ID_FITS,
IMM4 = ffi::AVCodecID_AV_CODEC_ID_IMM4,
PROSUMER = ffi::AVCodecID_AV_CODEC_ID_PROSUMER,
MWSC = ffi::AVCodecID_AV_CODEC_ID_MWSC,
WCMV = ffi::AVCodecID_AV_CODEC_ID_WCMV,
RASC = ffi::AVCodecID_AV_CODEC_ID_RASC,
HYMT = ffi::AVCodecID_AV_CODEC_ID_HYMT,
ARBC = ffi::AVCodecID_AV_CODEC_ID_ARBC,
AGM = ffi::AVCodecID_AV_CODEC_ID_AGM,
LSCR = ffi::AVCodecID_AV_CODEC_ID_LSCR,
VP4 = ffi::AVCodecID_AV_CODEC_ID_VP4,
PCM_S16LE = ffi::AVCodecID_AV_CODEC_ID_PCM_S16LE,
PCM_S16BE = ffi::AVCodecID_AV_CODEC_ID_PCM_S16BE,
PCM_U16LE = ffi::AVCodecID_AV_CODEC_ID_PCM_U16LE,
PCM_U16BE = ffi::AVCodecID_AV_CODEC_ID_PCM_U16BE,
PCM_S8 = ffi::AVCodecID_AV_CODEC_ID_PCM_S8,
PCM_U8 = ffi::AVCodecID_AV_CODEC_ID_PCM_U8,
PCM_MULAW = ffi::AVCodecID_AV_CODEC_ID_PCM_MULAW,
PCM_ALAW = ffi::AVCodecID_AV_CODEC_ID_PCM_ALAW,
PCM_S32LE = ffi::AVCodecID_AV_CODEC_ID_PCM_S32LE,
PCM_S32BE = ffi::AVCodecID_AV_CODEC_ID_PCM_S32BE,
PCM_U32LE = ffi::AVCodecID_AV_CODEC_ID_PCM_U32LE,
PCM_U32BE = ffi::AVCodecID_AV_CODEC_ID_PCM_U32BE,
PCM_S24LE = ffi::AVCodecID_AV_CODEC_ID_PCM_S24LE,
PCM_S24BE = ffi::AVCodecID_AV_CODEC_ID_PCM_S24BE,
PCM_U24LE = ffi::AVCodecID_AV_CODEC_ID_PCM_U24LE,
PCM_U24BE = ffi::AVCodecID_AV_CODEC_ID_PCM_U24BE,
PCM_S24DAUD = ffi::AVCodecID_AV_CODEC_ID_PCM_S24DAUD,
PCM_ZORK = ffi::AVCodecID_AV_CODEC_ID_PCM_ZORK,
PCM_S16LE_PLANAR = ffi::AVCodecID_AV_CODEC_ID_PCM_S16LE_PLANAR,
PCM_DVD = ffi::AVCodecID_AV_CODEC_ID_PCM_DVD,
PCM_F32BE = ffi::AVCodecID_AV_CODEC_ID_PCM_F32BE,
PCM_F32LE = ffi::AVCodecID_AV_CODEC_ID_PCM_F32LE,
PCM_F64BE = ffi::AVCodecID_AV_CODEC_ID_PCM_F64BE,
PCM_F64LE = ffi::AVCodecID_AV_CODEC_ID_PCM_F64LE,
PCM_BLURAY = ffi::AVCodecID_AV_CODEC_ID_PCM_BLURAY,
PCM_LXF = ffi::AVCodecID_AV_CODEC_ID_PCM_LXF,
S302M = ffi::AVCodecID_AV_CODEC_ID_S302M,
PCM_S8_PLANAR = ffi::AVCodecID_AV_CODEC_ID_PCM_S8_PLANAR,
PCM_S24LE_PLANAR = ffi::AVCodecID_AV_CODEC_ID_PCM_S24LE_PLANAR,
PCM_S32LE_PLANAR = ffi::AVCodecID_AV_CODEC_ID_PCM_S32LE_PLANAR,
PCM_S16BE_PLANAR = ffi::AVCodecID_AV_CODEC_ID_PCM_S16BE_PLANAR,
PCM_S64LE = ffi::AVCodecID_AV_CODEC_ID_PCM_S64LE,
PCM_S64BE = ffi::AVCodecID_AV_CODEC_ID_PCM_S64BE,
PCM_F16LE = ffi::AVCodecID_AV_CODEC_ID_PCM_F16LE,
PCM_F24LE = ffi::AVCodecID_AV_CODEC_ID_PCM_F24LE,
PCM_VIDC = ffi::AVCodecID_AV_CODEC_ID_PCM_VIDC,
ADPCM_IMA_QT = ffi::AVCodecID_AV_CODEC_ID_ADPCM_IMA_QT,
ADPCM_IMA_WAV = ffi::AVCodecID_AV_CODEC_ID_ADPCM_IMA_WAV,
ADPCM_IMA_DK3 = ffi::AVCodecID_AV_CODEC_ID_ADPCM_IMA_DK3,
ADPCM_IMA_DK4 = ffi::AVCodecID_AV_CODEC_ID_ADPCM_IMA_DK4,
ADPCM_IMA_WS = ffi::AVCodecID_AV_CODEC_ID_ADPCM_IMA_WS,
ADPCM_IMA_SMJPEG = ffi::AVCodecID_AV_CODEC_ID_ADPCM_IMA_SMJPEG,
ADPCM_MS = ffi::AVCodecID_AV_CODEC_ID_ADPCM_MS,
ADPCM_4XM = ffi::AVCodecID_AV_CODEC_ID_ADPCM_4XM,
ADPCM_XA = ffi::AVCodecID_AV_CODEC_ID_ADPCM_XA,
ADPCM_ADX = ffi::AVCodecID_AV_CODEC_ID_ADPCM_ADX,
ADPCM_EA = ffi::AVCodecID_AV_CODEC_ID_ADPCM_EA,
ADPCM_G726 = ffi::AVCodecID_AV_CODEC_ID_ADPCM_G726,
ADPCM_CT = ffi::AVCodecID_AV_CODEC_ID_ADPCM_CT,
ADPCM_SWF = ffi::AVCodecID_AV_CODEC_ID_ADPCM_SWF,
ADPCM_YAMAHA = ffi::AVCodecID_AV_CODEC_ID_ADPCM_YAMAHA,
ADPCM_SBPRO_4 = ffi::AVCodecID_AV_CODEC_ID_ADPCM_SBPRO_4,
ADPCM_SBPRO_3 = ffi::AVCodecID_AV_CODEC_ID_ADPCM_SBPRO_3,
ADPCM_SBPRO_2 = ffi::AVCodecID_AV_CODEC_ID_ADPCM_SBPRO_2,
ADPCM_THP = ffi::AVCodecID_AV_CODEC_ID_ADPCM_THP,
ADPCM_IMA_AMV = ffi::AVCodecID_AV_CODEC_ID_ADPCM_IMA_AMV,
ADPCM_EA_R1 = ffi::AVCodecID_AV_CODEC_ID_ADPCM_EA_R1,
ADPCM_EA_R3 = ffi::AVCodecID_AV_CODEC_ID_ADPCM_EA_R3,
ADPCM_EA_R2 = ffi::AVCodecID_AV_CODEC_ID_ADPCM_EA_R2,
ADPCM_IMA_EA_SEAD = ffi::AVCodecID_AV_CODEC_ID_ADPCM_IMA_EA_SEAD,
ADPCM_IMA_EA_EACS = ffi::AVCodecID_AV_CODEC_ID_ADPCM_IMA_EA_EACS,
ADPCM_EA_XAS = ffi::AVCodecID_AV_CODEC_ID_ADPCM_EA_XAS,
ADPCM_EA_MAXIS_XA = ffi::AVCodecID_AV_CODEC_ID_ADPCM_EA_MAXIS_XA,
ADPCM_IMA_ISS = ffi::AVCodecID_AV_CODEC_ID_ADPCM_IMA_ISS,
ADPCM_G722 = ffi::AVCodecID_AV_CODEC_ID_ADPCM_G722,
ADPCM_IMA_APC = ffi::AVCodecID_AV_CODEC_ID_ADPCM_IMA_APC,
ADPCM_VIMA = ffi::AVCodecID_AV_CODEC_ID_ADPCM_VIMA,
ADPCM_AFC = ffi::AVCodecID_AV_CODEC_ID_ADPCM_AFC,
ADPCM_IMA_OKI = ffi::AVCodecID_AV_CODEC_ID_ADPCM_IMA_OKI,
ADPCM_DTK = ffi::AVCodecID_AV_CODEC_ID_ADPCM_DTK,
ADPCM_IMA_RAD = ffi::AVCodecID_AV_CODEC_ID_ADPCM_IMA_RAD,
ADPCM_G726LE = ffi::AVCodecID_AV_CODEC_ID_ADPCM_G726LE,
ADPCM_THP_LE = ffi::AVCodecID_AV_CODEC_ID_ADPCM_THP_LE,
ADPCM_PSX = ffi::AVCodecID_AV_CODEC_ID_ADPCM_PSX,
ADPCM_AICA = ffi::AVCodecID_AV_CODEC_ID_ADPCM_AICA,
ADPCM_IMA_DAT4 = ffi::AVCodecID_AV_CODEC_ID_ADPCM_IMA_DAT4,
ADPCM_MTAF = ffi::AVCodecID_AV_CODEC_ID_ADPCM_MTAF,
ADPCM_AGM = ffi::AVCodecID_AV_CODEC_ID_ADPCM_AGM,
AMR_NB = ffi::AVCodecID_AV_CODEC_ID_AMR_NB,
AMR_WB = ffi::AVCodecID_AV_CODEC_ID_AMR_WB,
RA_144 = ffi::AVCodecID_AV_CODEC_ID_RA_144,
RA_288 = ffi::AVCodecID_AV_CODEC_ID_RA_288,
ROQ_DPCM = ffi::AVCodecID_AV_CODEC_ID_ROQ_DPCM,
INTERPLAY_DPCM = ffi::AVCodecID_AV_CODEC_ID_INTERPLAY_DPCM,
XAN_DPCM = ffi::AVCodecID_AV_CODEC_ID_XAN_DPCM,
SOL_DPCM = ffi::AVCodecID_AV_CODEC_ID_SOL_DPCM,
SDX2_DPCM = ffi::AVCodecID_AV_CODEC_ID_SDX2_DPCM,
GREMLIN_DPCM = ffi::AVCodecID_AV_CODEC_ID_GREMLIN_DPCM,
MP2 = ffi::AVCodecID_AV_CODEC_ID_MP2,
#[doc = "< preferred ID for decoding MPEG audio layer 1, 2 or 3"]
MP3 = ffi::AVCodecID_AV_CODEC_ID_MP3,
AAC = ffi::AVCodecID_AV_CODEC_ID_AAC,
AC3 = ffi::AVCodecID_AV_CODEC_ID_AC3,
DTS = ffi::AVCodecID_AV_CODEC_ID_DTS,
VORBIS = ffi::AVCodecID_AV_CODEC_ID_VORBIS,
DVAUDIO = ffi::AVCodecID_AV_CODEC_ID_DVAUDIO,
WMAV1 = ffi::AVCodecID_AV_CODEC_ID_WMAV1,
WMAV2 = ffi::AVCodecID_AV_CODEC_ID_WMAV2,
MACE3 = ffi::AVCodecID_AV_CODEC_ID_MACE3,
MACE6 = ffi::AVCodecID_AV_CODEC_ID_MACE6,
VMDAUDIO = ffi::AVCodecID_AV_CODEC_ID_VMDAUDIO,
FLAC = ffi::AVCodecID_AV_CODEC_ID_FLAC,
MP3ADU = ffi::AVCodecID_AV_CODEC_ID_MP3ADU,
MP3ON4 = ffi::AVCodecID_AV_CODEC_ID_MP3ON4,
SHORTEN = ffi::AVCodecID_AV_CODEC_ID_SHORTEN,
ALAC = ffi::AVCodecID_AV_CODEC_ID_ALAC,
WESTWOOD_SND1 = ffi::AVCodecID_AV_CODEC_ID_WESTWOOD_SND1,
#[doc = "< as in Berlin toast format"]
GSM = ffi::AVCodecID_AV_CODEC_ID_GSM,
QDM2 = ffi::AVCodecID_AV_CODEC_ID_QDM2,
COOK = ffi::AVCodecID_AV_CODEC_ID_COOK,
TRUESPEECH = ffi::AVCodecID_AV_CODEC_ID_TRUESPEECH,
TTA = ffi::AVCodecID_AV_CODEC_ID_TTA,
SMACKAUDIO = ffi::AVCodecID_AV_CODEC_ID_SMACKAUDIO,
QCELP = ffi::AVCodecID_AV_CODEC_ID_QCELP,
WAVPACK = ffi::AVCodecID_AV_CODEC_ID_WAVPACK,
DSICINAUDIO = ffi::AVCodecID_AV_CODEC_ID_DSICINAUDIO,
IMC = ffi::AVCodecID_AV_CODEC_ID_IMC,
MUSEPACK7 = ffi::AVCodecID_AV_CODEC_ID_MUSEPACK7,
MLP = ffi::AVCodecID_AV_CODEC_ID_MLP,
GSM_MS = ffi::AVCodecID_AV_CODEC_ID_GSM_MS,
ATRAC3 = ffi::AVCodecID_AV_CODEC_ID_ATRAC3,
APE = ffi::AVCodecID_AV_CODEC_ID_APE,
NELLYMOSER = ffi::AVCodecID_AV_CODEC_ID_NELLYMOSER,
MUSEPACK8 = ffi::AVCodecID_AV_CODEC_ID_MUSEPACK8,
SPEEX = ffi::AVCodecID_AV_CODEC_ID_SPEEX,
WMAVOICE = ffi::AVCodecID_AV_CODEC_ID_WMAVOICE,
WMAPRO = ffi::AVCodecID_AV_CODEC_ID_WMAPRO,
WMALOSSLESS = ffi::AVCodecID_AV_CODEC_ID_WMALOSSLESS,
ATRAC3P = ffi::AVCodecID_AV_CODEC_ID_ATRAC3P,
EAC3 = ffi::AVCodecID_AV_CODEC_ID_EAC3,
SIPR = ffi::AVCodecID_AV_CODEC_ID_SIPR,
MP1 = ffi::AVCodecID_AV_CODEC_ID_MP1,
TWINVQ = ffi::AVCodecID_AV_CODEC_ID_TWINVQ,
TRUEHD = ffi::AVCodecID_AV_CODEC_ID_TRUEHD,
MP4ALS = ffi::AVCodecID_AV_CODEC_ID_MP4ALS,
ATRAC1 = ffi::AVCodecID_AV_CODEC_ID_ATRAC1,
BINKAUDIO_RDFT = ffi::AVCodecID_AV_CODEC_ID_BINKAUDIO_RDFT,
BINKAUDIO_DCT = ffi::AVCodecID_AV_CODEC_ID_BINKAUDIO_DCT,
AAC_LATM = ffi::AVCodecID_AV_CODEC_ID_AAC_LATM,
QDMC = ffi::AVCodecID_AV_CODEC_ID_QDMC,
CELT = ffi::AVCodecID_AV_CODEC_ID_CELT,
G723_1 = ffi::AVCodecID_AV_CODEC_ID_G723_1,
G729 = ffi::AVCodecID_AV_CODEC_ID_G729,
_8SVX_EXP = ffi::AVCodecID_AV_CODEC_ID_8SVX_EXP,
_8SVX_FIB = ffi::AVCodecID_AV_CODEC_ID_8SVX_FIB,
BMV_AUDIO = ffi::AVCodecID_AV_CODEC_ID_BMV_AUDIO,
RALF = ffi::AVCodecID_AV_CODEC_ID_RALF,
IAC = ffi::AVCodecID_AV_CODEC_ID_IAC,
ILBC = ffi::AVCodecID_AV_CODEC_ID_ILBC,
OPUS = ffi::AVCodecID_AV_CODEC_ID_OPUS,
COMFORT_NOISE = ffi::AVCodecID_AV_CODEC_ID_COMFORT_NOISE,
TAK = ffi::AVCodecID_AV_CODEC_ID_TAK,
METASOUND = ffi::AVCodecID_AV_CODEC_ID_METASOUND,
PAF_AUDIO = ffi::AVCodecID_AV_CODEC_ID_PAF_AUDIO,
ON2AVC = ffi::AVCodecID_AV_CODEC_ID_ON2AVC,
DSS_SP = ffi::AVCodecID_AV_CODEC_ID_DSS_SP,
CODEC2 = ffi::AVCodecID_AV_CODEC_ID_CODEC2,
FFWAVESYNTH = ffi::AVCodecID_AV_CODEC_ID_FFWAVESYNTH,
SONIC = ffi::AVCodecID_AV_CODEC_ID_SONIC,
SONIC_LS = ffi::AVCodecID_AV_CODEC_ID_SONIC_LS,
EVRC = ffi::AVCodecID_AV_CODEC_ID_EVRC,
SMV = ffi::AVCodecID_AV_CODEC_ID_SMV,
DSD_LSBF = ffi::AVCodecID_AV_CODEC_ID_DSD_LSBF,
DSD_MSBF = ffi::AVCodecID_AV_CODEC_ID_DSD_MSBF,
DSD_LSBF_PLANAR = ffi::AVCodecID_AV_CODEC_ID_DSD_LSBF_PLANAR,
DSD_MSBF_PLANAR = ffi::AVCodecID_AV_CODEC_ID_DSD_MSBF_PLANAR,
_4GV = ffi::AVCodecID_AV_CODEC_ID_4GV,
INTERPLAY_ACM = ffi::AVCodecID_AV_CODEC_ID_INTERPLAY_ACM,
XMA1 = ffi::AVCodecID_AV_CODEC_ID_XMA1,
XMA2 = ffi::AVCodecID_AV_CODEC_ID_XMA2,
DST = ffi::AVCodecID_AV_CODEC_ID_DST,
ATRAC3AL = ffi::AVCodecID_AV_CODEC_ID_ATRAC3AL,
ATRAC3PAL = ffi::AVCodecID_AV_CODEC_ID_ATRAC3PAL,
DOLBY_E = ffi::AVCodecID_AV_CODEC_ID_DOLBY_E,
APTX = ffi::AVCodecID_AV_CODEC_ID_APTX,
APTX_HD = ffi::AVCodecID_AV_CODEC_ID_APTX_HD,
SBC = ffi::AVCodecID_AV_CODEC_ID_SBC,
ATRAC9 = ffi::AVCodecID_AV_CODEC_ID_ATRAC9,
HCOM = ffi::AVCodecID_AV_CODEC_ID_HCOM,
DVD_SUBTITLE = ffi::AVCodecID_AV_CODEC_ID_DVD_SUBTITLE,
DVB_SUBTITLE = ffi::AVCodecID_AV_CODEC_ID_DVB_SUBTITLE,
#[doc = "< raw UTF-8 text"]
TEXT = ffi::AVCodecID_AV_CODEC_ID_TEXT,
XSUB = ffi::AVCodecID_AV_CODEC_ID_XSUB,
SSA = ffi::AVCodecID_AV_CODEC_ID_SSA,
MOV_TEXT = ffi::AVCodecID_AV_CODEC_ID_MOV_TEXT,
HDMV_PGS_SUBTITLE = ffi::AVCodecID_AV_CODEC_ID_HDMV_PGS_SUBTITLE,
DVB_TELETEXT = ffi::AVCodecID_AV_CODEC_ID_DVB_TELETEXT,
SRT = ffi::AVCodecID_AV_CODEC_ID_SRT,
MICRODVD = ffi::AVCodecID_AV_CODEC_ID_MICRODVD,
EIA_608 = ffi::AVCodecID_AV_CODEC_ID_EIA_608,
JACOSUB = ffi::AVCodecID_AV_CODEC_ID_JACOSUB,
SAMI = ffi::AVCodecID_AV_CODEC_ID_SAMI,
REALTEXT = ffi::AVCodecID_AV_CODEC_ID_REALTEXT,
STL = ffi::AVCodecID_AV_CODEC_ID_STL,
SUBVIEWER1 = ffi::AVCodecID_AV_CODEC_ID_SUBVIEWER1,
SUBVIEWER = ffi::AVCodecID_AV_CODEC_ID_SUBVIEWER,
SUBRIP = ffi::AVCodecID_AV_CODEC_ID_SUBRIP,
WEBVTT = ffi::AVCodecID_AV_CODEC_ID_WEBVTT,
MPL2 = ffi::AVCodecID_AV_CODEC_ID_MPL2,
VPLAYER = ffi::AVCodecID_AV_CODEC_ID_VPLAYER,
PJS = ffi::AVCodecID_AV_CODEC_ID_PJS,
ASS = ffi::AVCodecID_AV_CODEC_ID_ASS,
HDMV_TEXT_SUBTITLE = ffi::AVCodecID_AV_CODEC_ID_HDMV_TEXT_SUBTITLE,
TTML = ffi::AVCodecID_AV_CODEC_ID_TTML,
ARIB_CAPTION = ffi::AVCodecID_AV_CODEC_ID_ARIB_CAPTION
}
}
// TODO: Use proper errors (with struct etc) for this
enum_from_primitive! {
#[derive(Debug, Copy, Clone, PartialEq)]
#[repr(i32)]
pub enum AVErrorKind {
Unknown = ffi::AVERROR_EXPERIMENTAL,
InputChanged = ffi::AVERROR_INPUT_CHANGED,
OutputChanged = ffi::AVERROR_OUTPUT_CHANGED
}
}
pub struct AVFormatContext {
base: *mut ffi::AVFormatContext,
}
impl<'a> AVFormatContext {
pub fn new() -> Result<Self, failure::Error> {
let base = unsafe { ffi::avformat_alloc_context() };
if base.is_null() {
bail!("avformat_alloc_context() failed");
}
Ok(AVFormatContext { base })
}
// TODO: Just for testing
pub unsafe fn raw(&mut self) -> *mut ffi::AVFormatContext {
self.base
}
pub fn open_input(&mut self, path: &str) -> Result<(), failure::Error> {
match unsafe {
ffi::avformat_open_input(
&mut self.base,
std::ffi::CString::new(path)
.map_err(|_| failure::format_err!("Could not convert path to c string"))?
.as_ptr(),
std::ptr::null_mut(),
std::ptr::null_mut(),
)
} {
0 => Ok(()),
_ => bail!("Could not open input")
}
}
pub fn streams(&self) -> Vec<AVStream> {
return unsafe {
std::slice::from_raw_parts(
(*self.base).streams,
(*self.base).nb_streams as usize,
)
}
.iter()
.map(|stream| {
AVStream::new(unsafe { (*stream).as_mut() }.expect("not null"), self)
})
.collect();
}
}
impl Drop for AVFormatContext {
fn drop(&mut self) {
unsafe { ffi::avformat_free_context(self.base) }
}
}
enum_from_primitive! {
# [derive(Debug, Copy, Clone, PartialEq)]
# [repr(i32)]
pub enum AVDiscard {
# [doc = "< discard nothing"]
None = ffi::AVDiscard_AVDISCARD_NONE,
# [doc = "< discard useless packets like 0 size packets in avi"]
Default =ffi::AVDiscard_AVDISCARD_DEFAULT,
# [doc = "< discard all non reference"]
NonReference = ffi::AVDiscard_AVDISCARD_NONREF,
# [doc = "< discard all bidirectional frames"]
BiDirectional = ffi::AVDiscard_AVDISCARD_BIDIR,
# [doc = "< discard all non intra frames"]
NonIntra = ffi::AVDiscard_AVDISCARD_NONINTRA,
# [doc = "< discard all frames except keyframes"]
NonKey = ffi::AVDiscard_AVDISCARD_NONKEY,
# [doc = "< discard all"]
All =ffi::AVDiscard_AVDISCARD_ALL
}
}
pub struct AVStream<'a> {
base: &'a mut ffi::AVStream,
phantom: PhantomData<&'a AVFormatContext>,
}
impl<'a> AVStream<'a> {
fn new(base: &'a mut ffi::AVStream, _: &'a AVFormatContext) -> Self {
return AVStream { base, phantom: PhantomData };
}
// TODO: Just for testing
pub unsafe fn as_ref(&self) -> &ffi::AVStream {
self.base
}
pub unsafe fn as_mut(&mut self) -> &mut ffi::AVStream {
self.base
}
pub fn index(self: &AVStream<'a>) -> i32 {
self.base.index
}
pub fn time_base(self: &AVStream<'a>) -> Fraction {
Fraction::new(
self.base.time_base.num as u32,
self.base.time_base.den as u32,
)
}
pub fn timestamp(self: &AVStream<'a>, timestamp: i64) -> std::time::Duration {
std::time::Duration::from_millis(
1000 *
timestamp as u64 *
self.base.time_base.num as u64 /
self.base.time_base.den as u64
)
}
pub fn duration(self: &AVStream<'a>) -> std::time::Duration {
self.timestamp(self.base.duration)
}
pub fn frame_count(self: &AVStream<'a>) -> i64 {
self.base.nb_frames
}
pub fn discard(self: &AVStream<'a>) -> Option<AVDiscard> {
AVDiscard::from_i32(self.base.discard)
}
pub fn set_discard(self: &mut AVStream<'a>, value: AVDiscard) {
self.base.discard = value as i32;
}
pub fn sample_aspect_ratio(self: &AVStream<'a>) -> Fraction {
Fraction::new(
self.base.sample_aspect_ratio.num as u32,
self.base.sample_aspect_ratio.den as u32,
)
}
pub fn codec_parameters(self: &AVStream<'a>) -> AVCodecParameters {
AVCodecParameters::new(unsafe { self.base.codecpar.as_mut() }.expect("not null"), self)
}
}
pub struct AVCodecParameters<'a> {
base: &'a mut ffi::AVCodecParameters,
phantom: PhantomData<&'a AVStream<'a>>,
}
impl<'a> AVCodecParameters<'a> {
fn new(base: &'a mut ffi::AVCodecParameters, _: &'a AVStream) -> Self {
return AVCodecParameters { base, phantom: PhantomData };
}
// TODO: Just for testing
pub unsafe fn as_ref(&self) -> &ffi::AVCodecParameters {
self.base
}
pub unsafe fn as_mut(&mut self) -> &mut ffi::AVCodecParameters {
self.base
}
pub fn codec_type(self: &AVCodecParameters<'a>) -> AVMediaType {
AVMediaType::from_i32(self.base.codec_type).unwrap_or(AVMediaType::Unknown)
}
pub fn codec_id(self: &AVCodecParameters<'a>) -> Option<AVCodecID> {
AVCodecID::from_u32(self.base.codec_id)
}
pub fn find_decoder(self: &AVCodecParameters<'a>) -> AVCodec {
AVCodec::new(
unsafe { ffi::avcodec_find_decoder(self.base.codec_id).as_mut() }.expect("Decoder not found"),
self,
)
}
}
pub struct AVCodec<'a> {
base: &'a mut ffi::AVCodec,
phantom: PhantomData<&'a AVCodecParameters<'a>>,
}
impl<'a> AVCodec<'a> {
fn new(base: &'a mut ffi::AVCodec, _: &'a AVCodecParameters) -> Self {
return AVCodec { base, phantom: PhantomData };
}
// TODO: Just for testing
pub unsafe fn as_ref(&self) -> &ffi::AVCodec {
self.base
}
pub unsafe fn as_mut(&mut self) -> &mut ffi::AVCodec {
self.base
}
pub fn name(self: &AVCodec<'a>) -> std::string::String {
String::from(unsafe { std::ffi::CStr::from_ptr(self.base.name) }.to_str().unwrap())
}
}
use ffmpeg_dev::sys as ffi;
use enum_primitive::*;
use std::collections::HashMap;
mod ffmpeg_api;
use ffmpeg_api::*;
fn main() -> Result<(), std::io::Error> {
let mut before = std::time::SystemTime::now();
let path = "/home/janne/Workspace/justflix/data/video.mp4";
let mut avformat_context = AVFormatContext::new().unwrap_or_else(|error| {
panic!("Could not allocate a context to process the video: {:?}", error)
});
avformat_context.open_input(path).unwrap_or_else(|error| {
panic!("Could not open video input: {:?}", error)
});
for mut stream in avformat_context.streams() {
stream.set_discard(AVDiscard::NonKey);
let codec_parameters = stream.codec_parameters();
let local_codec = codec_parameters.find_decoder();
println!(
"Stream #{}, type: {:#?}, codec: {:#?}",
stream.index(),
codec_parameters.codec_type(),
local_codec.name()
);
// TODO: HERE BE DRAGONS
let output_frame = unsafe {
ffi::av_frame_alloc().as_mut()
}.expect("not null");
let num_bytes: usize = unsafe {
ffi::avpicture_get_size(ffi::AVPixelFormat_AV_PIX_FMT_RGB24, 160, 90) as usize
};
let output_frame_buffer = unsafe {
(ffi::av_malloc(num_bytes) as *mut u8).as_ref()
}.expect("not null");
unsafe {
ffi::avpicture_fill(
output_frame as *mut ffi::AVFrame as *mut ffi::AVPicture,
output_frame_buffer,
ffi::AVPixelFormat_AV_PIX_FMT_RGB24,
160,
90,
);
}
match codec_parameters.codec_type() {
AVMediaType::Video => {
let avc_ctx: &mut ffi::AVCodecContext = unsafe {
ffi::avcodec_alloc_context3(local_codec.as_ref()).as_mut()
}.expect("not null");
unsafe {
ffi::avcodec_parameters_to_context(avc_ctx, codec_parameters.as_ref());
ffi::avcodec_open2(avc_ctx, local_codec.as_ref(), std::ptr::null_mut());
}
let packet: &mut ffi::AVPacket = unsafe {
ffi::av_packet_alloc().as_mut()
}.expect("not null");
let frame: &mut ffi::AVFrame = unsafe {
ffi::av_frame_alloc().as_mut()
}.expect("not null");
avc_ctx.skip_loop_filter = ffi::AVDiscard_AVDISCARD_NONKEY;
avc_ctx.skip_idct = ffi::AVDiscard_AVDISCARD_NONKEY;
avc_ctx.skip_frame = ffi::AVDiscard_AVDISCARD_NONKEY;
let mut i = 0;
println!("Time: {:#?}", before.elapsed().unwrap());
before = std::time::SystemTime::now();
while unsafe { ffi::av_read_frame(avformat_context.raw(), packet) } >= 0 && i < 10 {
if packet.stream_index == stream.index() {
unsafe {
ffi::avcodec_send_packet(avc_ctx, packet);
}
while unsafe { ffi::avcodec_receive_frame(avc_ctx, frame) } >= 0 {
let key_frame = frame.key_frame != 0;
let frame_index = frame.coded_picture_number;
println!(
"Frame {}: {:?} @ {}",
frame_index,
stream.timestamp(frame.pts as i64),
key_frame
);
println!("Reading Time: {:#?}", before.elapsed().unwrap());
before = std::time::SystemTime::now();
/*
if frame.width == last_width && frame.height == last_height && (frame.format as AVPixelFormat) == last_format {
}
*/
let sws_context: &mut ffi::SwsContext = unsafe {
ffi::sws_getContext(
frame.width,
frame.height,
frame.format as ffi::AVPixelFormat,
160,
90,
ffi::AVPixelFormat_AV_PIX_FMT_RGB24,
ffi::SWS_FAST_BILINEAR as i32,
std::ptr::null_mut(),
std::ptr::null_mut(),
std::ptr::null(),
).as_mut()
}.expect("not null");
let success = unsafe {
ffi::sws_scale(
sws_context,
frame.data.as_ptr() as *const *const u8,
&frame.linesize[0],
0,
frame.height,
&output_frame.data[0],
&output_frame.linesize[0],
)
};
println!("success: {}, size: {}", success, num_bytes);
println!("Processing Time: {:#?}", before.elapsed().unwrap());
before = std::time::SystemTime::now();
if success > 0 {
image::save_buffer(
format!("/home/janne/Workspace/justflix/data/test/image_{}.png", i),
unsafe {
std::slice::from_raw_parts(output_frame.data[0], num_bytes)
},
160,
90,
image::ColorType::Rgb8,
).unwrap();
i += 1;
}
println!("Writing Time: {:#?}", before.elapsed().unwrap());
before = std::time::SystemTime::now();
}
}
}
}
_ => {}
}
}
Ok(())
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment