From ee124285a59c5356a9d15b75940b66b25eb492e7 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Thu, 9 Apr 2020 16:54:11 +0200 Subject: [PATCH] Cleanup error handling and enums --- Cargo.lock | 239 ++-- Cargo.toml | 4 +- lib/ffmpeg_api/Cargo.toml | 5 +- lib/ffmpeg_api/src/api.rs | 243 ++-- lib/ffmpeg_api/src/enums.rs | 1829 +++++++++++++++--------------- lib/ffmpeg_api/src/err.rs | 36 + lib/ffmpeg_api/src/err_av.rs | 63 + lib/ffmpeg_api/src/err_ffi.rs | 269 +++++ lib/ffmpeg_api/src/lib.rs | 6 + lib/media_time/Cargo.toml | 3 +- lib/media_time/src/errors.rs | 17 - lib/media_time/src/lib.rs | 4 +- lib/media_time/src/media_time.rs | 21 +- lib/webvtt/Cargo.toml | 3 +- lib/webvtt/src/webvtt.rs | 21 +- src/lib.rs | 13 +- src/main.rs | 9 +- src/spritesheet.rs | 2 +- 18 files changed, 1589 insertions(+), 1198 deletions(-) create mode 100644 lib/ffmpeg_api/src/err.rs create mode 100644 lib/ffmpeg_api/src/err_av.rs create mode 100644 lib/ffmpeg_api/src/err_ffi.rs delete mode 100644 lib/media_time/src/errors.rs diff --git a/Cargo.lock b/Cargo.lock index a31f669..8791e8c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,6 +24,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "anyhow" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9a60d744a80c30fcb657dfe2c1b22bcb3e814c1a1e3674f32bf5820b570fbff" + [[package]] name = "atty" version = "0.2.14" @@ -41,28 +47,6 @@ 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" @@ -78,8 +62,8 @@ dependencies = [ "lazy_static", "log", "peeking_take_while", - "proc-macro2", - "quote", + "proc-macro2 1.0.8", + "quote 1.0.2", "regex", "rustc-hash", "shlex", @@ -229,15 +213,6 @@ 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" @@ -251,28 +226,6 @@ dependencies = [ "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" @@ -292,11 +245,12 @@ name = "ffmpeg_api" version = "0.1.0" dependencies = [ "bitflags", - "enum_primitive", - "failure", "ffmpeg-dev", "fraction", "media_time", + "num-derive", + "num-traits", + "thiserror", ] [[package]] @@ -388,7 +342,7 @@ dependencies = [ "jpeg-decoder", "num-iter", "num-rational", - "num-traits 0.2.11", + "num-traits", "png", "scoped_threadpool", "tiff", @@ -464,9 +418,9 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "media-ingestion" -version = "0.1.0" +version = "0.1.1" dependencies = [ - "failure", + "anyhow", "ffmpeg_api", "fraction", "image", @@ -482,6 +436,7 @@ name = "media_time" version = "0.1.0" dependencies = [ "fraction", + "thiserror", "time", ] @@ -530,7 +485,7 @@ dependencies = [ "num-integer", "num-iter", "num-rational", - "num-traits 0.2.11", + "num-traits", ] [[package]] @@ -541,7 +496,7 @@ checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" dependencies = [ "autocfg", "num-integer", - "num-traits 0.2.11", + "num-traits", ] [[package]] @@ -551,7 +506,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" dependencies = [ "autocfg", - "num-traits 0.2.11", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eafd0b45c5537c3ba526f79d3e75120036502bebacbb3f3220914067ce39dbf2" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", ] [[package]] @@ -561,7 +527,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" dependencies = [ "autocfg", - "num-traits 0.2.11", + "num-traits", ] [[package]] @@ -572,7 +538,7 @@ checksum = "dfb0800a0291891dd9f4fe7bd9c19384f98f7fbe0cd0f39a2c6b88b9868bbc00" dependencies = [ "autocfg", "num-integer", - "num-traits 0.2.11", + "num-traits", ] [[package]] @@ -584,16 +550,7 @@ 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", + "num-traits", ] [[package]] @@ -640,9 +597,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7959c6467d962050d639361f7703b2051c43036d03493c36f01d440fdd3138a" dependencies = [ "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn 1.0.15", "version_check 0.9.1", ] @@ -652,9 +609,9 @@ version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4002d9f55991d5e019fb940a90e1a95eb80c24e77cb2462dd4dc869604d543a" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn 1.0.15", "syn-mid", "version_check 0.9.1", ] @@ -665,9 +622,18 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn 1.0.15", +] + +[[package]] +name = "proc-macro2" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +dependencies = [ + "unicode-xid 0.1.0", ] [[package]] @@ -676,7 +642,7 @@ version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" dependencies = [ - "unicode-xid", + "unicode-xid 0.2.0", ] [[package]] @@ -685,13 +651,22 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +[[package]] +name = "quote" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +dependencies = [ + "proc-macro2 0.4.30", +] + [[package]] name = "quote" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" dependencies = [ - "proc-macro2", + "proc-macro2 1.0.8", ] [[package]] @@ -742,12 +717,6 @@ version = "0.6.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1132f845907680735a84409c3bebc64d1364a5683ffbce899550cd09d5eaefc1" -[[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" @@ -769,9 +738,9 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3bba175698996010c4f6dce5e7f173b6eb781fce25d2cfc45e27091ce0b79f6" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn 1.0.15", ] [[package]] @@ -822,9 +791,9 @@ version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn 1.0.15", ] [[package]] @@ -869,43 +838,42 @@ checksum = "c6e79c80e0f4efd86ca960218d4e056249be189ff1c42824dcd9a7f51a56f0bd" dependencies = [ "heck", "proc-macro-error", - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn 1.0.15", ] [[package]] name = "syn" -version = "1.0.15" +version = "0.15.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a0294dc449adc58bb6592fff1a23d3e5e6e235afc6a0ffca2657d19e7bbffe5" +checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", + "proc-macro2 0.4.30", + "quote 0.6.13", + "unicode-xid 0.1.0", ] [[package]] -name = "syn-mid" -version = "0.5.0" +name = "syn" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be3539f6c128a931cf19dcee741c1af532c7fd387baa739c03dd2e96479338a" +checksum = "7a0294dc449adc58bb6592fff1a23d3e5e6e235afc6a0ffca2657d19e7bbffe5" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.8", + "quote 1.0.2", + "unicode-xid 0.2.0", ] [[package]] -name = "synstructure" -version = "0.12.3" +name = "syn-mid" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" +checksum = "7be3539f6c128a931cf19dcee741c1af532c7fd387baa739c03dd2e96479338a" dependencies = [ - "proc-macro2", - "quote", - "syn", - "unicode-xid", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn 1.0.15", ] [[package]] @@ -938,6 +906,26 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "thiserror" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b3d3d2ff68104100ab257bb6bb0cb26c901abe4bd4ba15961f3bf867924012" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca972988113b7715266f91250ddb98070d033c62a011fa0fcc57434a649310dd" +dependencies = [ + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn 1.0.15", +] + [[package]] name = "thread_local" version = "1.0.1" @@ -987,9 +975,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e987cfe0537f575b5fc99909de6185f6c19c3ad8889e2275e686a873d0869ba1" dependencies = [ "proc-macro-hack", - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn 1.0.15", ] [[package]] @@ -1004,6 +992,12 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" + [[package]] name = "unicode-xid" version = "0.2.0" @@ -1033,6 +1027,7 @@ name = "webvtt" version = "0.1.0" dependencies = [ "media_time", + "thiserror", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 38df703..b656bcd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "media-ingestion" -version = "0.1.0" +version = "0.1.1" authors = ["Janne Mareike Koschinski <janne@kuschku.de>"] description = """ @@ -17,7 +17,7 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -failure = "0.1.6" +anyhow = "1.0.28" fraction = "0.6.2" image = "0.23.0" serde_json = "1.0" diff --git a/lib/ffmpeg_api/Cargo.toml b/lib/ffmpeg_api/Cargo.toml index ae7ec40..192c697 100644 --- a/lib/ffmpeg_api/Cargo.toml +++ b/lib/ffmpeg_api/Cargo.toml @@ -8,9 +8,10 @@ edition = "2018" [dependencies] bitflags = "1.2.1" -enum_primitive = "0.1.1" -failure = "0.1.6" ffmpeg-dev = "0.3.8" fraction = "0.6.2" +num-traits = "0.2" +num-derive = "0.2" +thiserror = "1.0" media_time = { path = "../media_time" } \ No newline at end of file diff --git a/lib/ffmpeg_api/src/api.rs b/lib/ffmpeg_api/src/api.rs index 233eb32..63dbb37 100644 --- a/lib/ffmpeg_api/src/api.rs +++ b/lib/ffmpeg_api/src/api.rs @@ -1,21 +1,36 @@ use std::marker::PhantomData; -use std::path::Path; +use std::path::{Path, PathBuf}; -use enum_primitive::*; -use failure::{bail, format_err, Error}; use ffmpeg_dev::sys as ffi; use fraction::Fraction; +use num_traits::FromPrimitive; +use media_time::MediaTimeError; +use thiserror::Error; use crate::enums::*; +use crate::err::AVError; -fn native_string(ptr: *const std::os::raw::c_char) -> Result<String, Error> { +#[derive(Error, Debug)] +pub enum AVAllocError { + #[error("Allocating a new {0} failed")] + AllocFailed(String) +} + +#[derive(Error, Debug)] +pub enum StringError { + #[error("String is unexpectedly null")] + NullError, + #[error(transparent)] + Utf8Error(#[from] std::str::Utf8Error) +} + +fn native_string(ptr: *const std::os::raw::c_char) -> Result<String, StringError> { if ptr.is_null() { - Err(format_err!("String is null")) + Err(StringError::NullError) } else { Ok(String::from( unsafe { std::ffi::CStr::from_ptr(ptr) } - .to_str() - .map_err(|err| format_err!("String is not valid utf-8: {}", err))?, + .to_str()?, )) } } @@ -24,38 +39,48 @@ pub struct AVFormatContext { base: *mut ffi::AVFormatContext, } +#[derive(Error, Debug)] +pub enum AVFormatContextError { + #[error(transparent)] + AllocFailed(#[from] AVAllocError), + #[error("Path {0} is invalid")] + PathInvalid(PathBuf), + #[error("Path {0} contains null byte")] + PathContainsNull(PathBuf, #[source] std::ffi::NulError), + #[error("Opening media file {0} failed")] + OpenInputFailed(PathBuf, #[source] AVError) +} + impl AVFormatContext { - pub fn new() -> Result<Self, Error> { + pub fn new() -> Result<Self, AVAllocError> { let base = unsafe { ffi::avformat_alloc_context() }; - if base.is_null() { - bail!("avformat_alloc_context() failed"); + return if base.is_null() { + Err(AVAllocError::AllocFailed("AVFormatContext".to_string())) + } else { + Ok(AVFormatContext { base }) } - Ok(AVFormatContext { base }) } - pub fn open_input(&mut self, path: &Path) -> Result<(), Error> { - let path = path + pub fn open_input(&mut self, path: &Path) -> Result<(), AVFormatContextError> { + let pathname = path .to_str() - .ok_or(format_err!("Could not convert path to c string"))?; - let path = std::ffi::CString::new(path) - .map_err(|err| format_err!("Could not convert path to c string: {}", err))?; + .ok_or(AVFormatContextError::PathInvalid(path.to_path_buf()))?; + let pathname = std::ffi::CString::new(pathname) + .map_err(|err| AVFormatContextError::PathContainsNull(path.to_path_buf(), err))?; - match unsafe { + AVError::from_errno(unsafe { ffi::avformat_open_input( &mut self.base, - path.as_ptr(), + pathname.as_ptr(), std::ptr::null_mut(), std::ptr::null_mut(), ) - } { - 0 => Ok(()), - _ => bail!("Could not open input"), - } + }).map_err(|err| AVFormatContextError::OpenInputFailed(path.to_path_buf(), err)) } - pub fn input_format(&self) -> Result<AVInputFormat, Error> { + pub fn input_format(&self) -> Result<AVInputFormat, AVInputFormatError> { let base: &mut ffi::AVInputFormat = unsafe { (*self.base).iformat.as_mut() } - .ok_or(format_err!("No AVInputFormat found"))?; + .ok_or(AVInputFormatError::Invalid)?; Ok(AVInputFormat::new(base)) } @@ -69,19 +94,16 @@ impl AVFormatContext { .map(|stream| AVStream::new(stream)) } - pub fn read_frame(&mut self, packet: &mut AVPacket) -> Result<(), Error> { - match unsafe { ffi::av_read_frame(self.base, packet.base) } { - 0 => Ok(()), - errno => bail!("Error while decoding frame: {}", errno), - } + pub fn read_frame(&mut self, packet: &mut AVPacket) -> Result<(), AVFrameError> { + AVError::from_errno(unsafe { ffi::av_read_frame(self.base, packet.base) }) + .map_err(|err| AVFrameError::DecodingFailed(packet.stream_index(), packet.pts(), err)) } - pub fn duration(&self) -> Result<media_time::MediaTime, Error> { + pub fn duration(&self) -> Result<media_time::MediaTime, MediaTimeError> { media_time::MediaTime::from_rational( unsafe { (*self.base).duration }, - Fraction::new(1 as u64, ffi::AV_TIME_BASE as u64), + &Fraction::new(1 as u64, ffi::AV_TIME_BASE as u64), ) - .map_err(|err| format_err!("error extracting duration: {}", err)) } } @@ -95,22 +117,32 @@ pub struct AVInputFormat<'a> { base: &'a mut ffi::AVInputFormat, } +#[derive(Error, Debug)] +pub enum AVInputFormatError { + #[error("AVInputFormat not valid")] + Invalid, + #[error("Field {0} is invalid")] + FieldInaccessible(String, #[source] StringError), + #[error("Mime type invalid: codec {0} in container {1}")] + InvalidMime(String, String), +} + impl<'a> AVInputFormat<'a> { fn new(base: &'a mut ffi::AVInputFormat) -> Self { return AVInputFormat { base }; } - pub fn long_name(&self) -> Result<String, Error> { + pub fn long_name(&self) -> Result<String, AVInputFormatError> { native_string(self.base.long_name) - .map_err(|err| format_err!("Could not access long name for input format: {}", err)) + .map_err(|err| AVInputFormatError::FieldInaccessible("long_name".to_string(), err)) } - pub fn name(&self) -> Result<String, Error> { + pub fn name(&self) -> Result<String, AVInputFormatError> { native_string(self.base.name) - .map_err(|err| format_err!("Could not access short name for input format: {}", err)) + .map_err(|err| AVInputFormatError::FieldInaccessible("name".to_string(), err)) } - pub fn determine_mime(&self, stream_codec: impl AsRef<str>) -> Result<&str, Error> { + pub fn determine_mime(&self, stream_codec: impl AsRef<str>) -> Result<&str, AVInputFormatError> { let containers = self.name()?; let stream_codec = stream_codec.as_ref(); @@ -123,11 +155,7 @@ impl<'a> AVInputFormat<'a> { } } - bail!( - "Could not determine mime type: {} video in {} container", - stream_codec, - containers - ) + Err(AVInputFormatError::InvalidMime(stream_codec.to_string(), containers.to_string())) } } @@ -137,12 +165,13 @@ pub struct AVBuffer { } impl AVBuffer { - pub fn new(size: usize) -> Result<Self, Error> { + pub fn new(size: usize) -> Result<Self, AVAllocError> { let base = unsafe { ffi::av_malloc(size) } as *mut u8; - if base.is_null() { - bail!("av_malloc() failed"); + return if base.is_null() { + Err(AVAllocError::AllocFailed("AVBufferContext".to_string())) + } else { + Ok(AVBuffer { base, size }) } - Ok(AVBuffer { base, size }) } pub fn empty() -> Self { @@ -165,13 +194,20 @@ pub struct AVPacket { base: *mut ffi::AVPacket, } +#[derive(Error, Debug)] +pub enum AVPacketError { + #[error(transparent)] + AllocFailed(#[from] AVAllocError), +} + impl AVPacket { - pub fn new() -> Result<Self, Error> { + pub fn new() -> Result<Self, AVAllocError> { let base = unsafe { ffi::av_packet_alloc() }; - if base.is_null() { - bail!("av_packet_alloc() failed"); + return if base.is_null() { + Err(AVAllocError::AllocFailed("AVPacket".to_string())) + } else { + Ok(AVPacket { base }) } - Ok(AVPacket { base }) } fn as_ref(&self) -> &ffi::AVPacket { @@ -202,19 +238,25 @@ pub struct AVFrame { buffer: AVBuffer, } +#[derive(Error, Debug)] +pub enum AVFrameError { + #[error(transparent)] + AllocFailed(#[from] AVAllocError), + #[error("Decoding a frame from packet of stream {0} at timestamp {1} failed")] + DecodingFailed(i32, i64, #[source] AVError) +} + impl AVFrame { - pub fn new() -> Result<Self, Error> { + pub fn new() -> Result<Self, AVAllocError> { let base = unsafe { ffi::av_frame_alloc() }; - if base.is_null() { - bail!("avformat_alloc_frame() failed"); + return if base.is_null() { + Err(AVAllocError::AllocFailed("AVFrame".to_string())) + } else { + Ok(AVFrame { base, buffer: AVBuffer::empty(), }) } - Ok(AVFrame { - base, - buffer: AVBuffer::empty(), - }) } - pub fn init(&mut self, width: i32, height: i32, format: AVPixelFormat) -> Result<(), Error> { + pub fn init(&mut self, width: i32, height: i32, format: AVPixelFormat) -> Result<(), AVFrameError> { self.as_mut().width = width; self.as_mut().height = height; self.as_mut().format = format as ffi::AVPixelFormat; @@ -327,12 +369,11 @@ impl<'a> AVStream<'a> { ) } - pub fn timestamp(&self, timestamp: i64) -> Result<media_time::MediaTime, Error> { - media_time::MediaTime::from_rational(timestamp, self.time_base()) - .map_err(|err| format_err!("error extracting timestamp: {}", err)) + pub fn timestamp(&self, timestamp: i64) -> Result<media_time::MediaTime, MediaTimeError> { + media_time::MediaTime::from_rational(timestamp, &self.time_base()) } - pub fn duration(&self) -> Result<media_time::MediaTime, Error> { + pub fn duration(&self) -> Result<media_time::MediaTime, MediaTimeError> { self.timestamp(self.base.duration) } @@ -362,10 +403,10 @@ impl<'a> AVStream<'a> { ) } - pub fn codec_parameters(&self) -> Result<AVCodecParameters, Error> { + pub fn codec_parameters(&self) -> Result<AVCodecParameters, AVCodecParametersError> { Ok(AVCodecParameters::new( unsafe { self.base.codecpar.as_mut() } - .ok_or(format_err!("No AVCodecParameters found"))?, + .ok_or(AVCodecParametersError::Invalid(self.index()))?, self, )) } @@ -376,6 +417,12 @@ pub struct AVCodecParameters<'a> { phantom: PhantomData<&'a AVStream<'a>>, } +#[derive(Error, Debug)] +pub enum AVCodecParametersError { + #[error("AVCodecParameters not valid for stream {0}")] + Invalid(i32), +} + impl<'a> AVCodecParameters<'a> { fn new(base: &'a mut ffi::AVCodecParameters, _: &'a AVStream) -> Self { return AVCodecParameters { @@ -396,10 +443,10 @@ impl<'a> AVCodecParameters<'a> { self.base.bit_rate } - pub fn find_decoder(&self) -> Result<AVCodec, Error> { + pub fn find_decoder(&self) -> Result<AVCodec, AVCodecError> { Ok(AVCodec::new( unsafe { ffi::avcodec_find_decoder(self.base.codec_id).as_mut() } - .ok_or(format_err!("No AVCodec found"))?, + .ok_or(AVCodecError::Invalid)?, self, )) } @@ -410,6 +457,14 @@ pub struct AVCodec<'a> { phantom: PhantomData<&'a AVCodecParameters<'a>>, } +#[derive(Error, Debug)] +pub enum AVCodecError { + #[error("AVCodec not valid")] + Invalid, + #[error("Field {0} is invalid")] + FieldInaccessible(String, #[source] StringError), +} + impl<'a> AVCodec<'a> { fn new(base: &'a mut ffi::AVCodec, _: &'a AVCodecParameters) -> Self { return AVCodec { @@ -418,9 +473,9 @@ impl<'a> AVCodec<'a> { }; } - pub fn name(&self) -> Result<String, Error> { + pub fn name(&self) -> Result<String, AVCodecError> { native_string(self.base.name) - .map_err(|err| format_err!("Could not access name for codec: {}", err)) + .map_err(|err| AVCodecError::FieldInaccessible("name".to_string(), err)) } } @@ -428,27 +483,36 @@ pub struct AVCodecContext { base: *mut ffi::AVCodecContext, } +#[derive(Error, Debug)] +pub enum AVCodecContextError { + #[error(transparent)] + AllocFailed(#[from] AVAllocError), + #[error("Field {0} is invalid")] + FieldInaccessible(String, #[source] StringError), + #[error("Error decoding packet")] + PacketError(#[source] AVError), + #[error("Error decoding frame")] + FrameError(#[source] AVError), +} + impl AVCodecContext { - pub fn new(codec: &AVCodec) -> Result<Self, Error> { + pub fn new(codec: &AVCodec) -> Result<Self, AVAllocError> { let base = unsafe { ffi::avcodec_alloc_context3(codec.base) }; if base.is_null() { - bail!("avcodec_alloc_context3() failed"); + Err(AVAllocError::AllocFailed("AVCodecContext".to_string())) + } else { + Ok(AVCodecContext { base }) } - Ok(AVCodecContext { base }) } - pub fn in_packet(&mut self, packet: &mut AVPacket) -> Result<(), Error> { - match unsafe { ffi::avcodec_send_packet(self.base, packet.base) } { - 0 => Ok(()), - errno => Err(format_err!("Error while loading packet: {}", errno)), - } + pub fn in_packet(&mut self, packet: &mut AVPacket) -> Result<(), AVCodecContextError> { + AVError::from_errno(unsafe { ffi::avcodec_send_packet(self.base, packet.base) }) + .map_err(|err| AVCodecContextError::PacketError(err)) } - pub fn out_frame(&mut self, frame: &mut AVFrame) -> Result<(), Error> { - match unsafe { ffi::avcodec_receive_frame(self.base, frame.base) } { - 0 => Ok(()), - errno => Err(format_err!("Error while decoding frame: {}", errno)), - } + pub fn out_frame(&mut self, frame: &mut AVFrame) -> Result<(), AVCodecContextError> { + AVError::from_errno( unsafe { ffi::avcodec_receive_frame(self.base, frame.base) }) + .map_err(|err| AVCodecContextError::FrameError(err)) } fn as_ref(&self) -> &ffi::AVCodecContext { @@ -508,6 +572,12 @@ pub struct SwsContext { base: *mut ffi::SwsContext, } +#[derive(Error, Debug)] +pub enum SwsContextError { + #[error(transparent)] + AllocFailed(#[from] AVAllocError), +} + impl SwsContext { pub fn new() -> Self { SwsContext { @@ -521,7 +591,7 @@ impl SwsContext { target: &AVFrame, scaler: SwsScaler, flags: SwsFlags, - ) -> Result<(), Error> { + ) -> Result<(), AVAllocError> { let base = unsafe { ffi::sws_getCachedContext( self.base, @@ -537,12 +607,13 @@ impl SwsContext { std::ptr::null(), ) }; + if base.is_null() { - bail!("sws_getCachedContext() failed"); + Err(AVAllocError::AllocFailed("SwsContext".to_string())) + } else { + self.base = base; + Ok(()) } - self.base = base; - - Ok(()) } pub fn scale(&self, source: &AVFrame, target: &mut AVFrame) -> i32 { diff --git a/lib/ffmpeg_api/src/enums.rs b/lib/ffmpeg_api/src/enums.rs index e2b108e..7e4fa58 100644 --- a/lib/ffmpeg_api/src/enums.rs +++ b/lib/ffmpeg_api/src/enums.rs @@ -1,6 +1,6 @@ use bitflags::*; -use enum_primitive::*; use ffmpeg_dev::sys as ffi; +use num_derive::FromPrimitive; bitflags! { #[derive(Default)] @@ -13,952 +13,899 @@ bitflags! { } } -enum_from_primitive! { - #[doc = " Pixel format."] - #[doc = ""] - #[doc = " @note"] - #[doc = " AV_PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA"] - #[doc = " color is put together as:"] - #[doc = " (A << 24) | (R << 16) | (G << 8) | B"] - #[doc = " This is stored as BGRA on little-endian CPU architectures and ARGB on"] - #[doc = " big-endian CPUs."] - #[doc = ""] - #[doc = " @note"] - #[doc = " If the resolution is not a multiple of the chroma subsampling factor"] - #[doc = " then the chroma plane resolution must be rounded up."] - #[doc = ""] - #[doc = " @par"] - #[doc = " When the pixel format is palettized RGB32 (AV_PIX_FMT_PAL8), the palettized"] - #[doc = " image data is stored in AVFrame.data[0]. The palette is transported in"] - #[doc = " AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is"] - #[doc = " formatted the same as in AV_PIX_FMT_RGB32 described above (i.e., it is"] - #[doc = " also endian-specific). Note also that the individual RGB32 palette"] - #[doc = " components stored in AVFrame.data[1] should be in the range 0..255."] - #[doc = " This is important as many custom PAL8 video codecs that were designed"] - #[doc = " to run on the IBM VGA graphics adapter use 6-bit palette components."] - #[doc = ""] - #[doc = " @par"] - #[doc = " For all the 8 bits per pixel formats, an RGB32 palette is in data[1] like"] - #[doc = " for pal8. This palette is filled in automatically by the function"] - #[doc = " allocating the picture."] - #[allow(non_camel_case_types)] - #[derive(Debug, Copy, Clone, PartialEq)] - #[repr(i32)] - pub enum AVPixelFormat { - NONE = ffi::AVPixelFormat_AV_PIX_FMT_NONE, - #[doc = "< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)"] - YUV420P = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P, - #[doc = "< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr"] - YUYV422 = ffi::AVPixelFormat_AV_PIX_FMT_YUYV422, - #[doc = "< packed RGB 8:8:8, 24bpp, RGBRGB..."] - RGB24 = ffi::AVPixelFormat_AV_PIX_FMT_RGB24, - #[doc = "< packed RGB 8:8:8, 24bpp, BGRBGR..."] - BGR24 = ffi::AVPixelFormat_AV_PIX_FMT_BGR24, - #[doc = "< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)"] - YUV422P = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P, - #[doc = "< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)"] - YUV444P = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P, - #[doc = "< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)"] - YUV410P = ffi::AVPixelFormat_AV_PIX_FMT_YUV410P, - #[doc = "< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)"] - YUV411P = ffi::AVPixelFormat_AV_PIX_FMT_YUV411P, - #[doc = "< Y , 8bpp"] - GRAY8 = ffi::AVPixelFormat_AV_PIX_FMT_GRAY8, - #[doc = "< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb"] - MONOWHITE = ffi::AVPixelFormat_AV_PIX_FMT_MONOWHITE, - #[doc = "< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb"] - MONOBLACK = ffi::AVPixelFormat_AV_PIX_FMT_MONOBLACK, - #[doc = "< 8 bits with AV_PIX_FMT_RGB32 palette"] - PAL8 = ffi::AVPixelFormat_AV_PIX_FMT_PAL8, - #[doc = "< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range"] - YUVJ420P = ffi::AVPixelFormat_AV_PIX_FMT_YUVJ420P, - #[doc = "< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting color_range"] - YUVJ422P = ffi::AVPixelFormat_AV_PIX_FMT_YUVJ422P, - #[doc = "< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting color_range"] - YUVJ444P = ffi::AVPixelFormat_AV_PIX_FMT_YUVJ444P, - #[doc = "< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1"] - UYVY422 = ffi::AVPixelFormat_AV_PIX_FMT_UYVY422, - #[doc = "< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3"] - UYYVYY411 = ffi::AVPixelFormat_AV_PIX_FMT_UYYVYY411, - #[doc = "< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)"] - BGR8 = ffi::AVPixelFormat_AV_PIX_FMT_BGR8, - #[doc = "< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits"] - BGR4 = ffi::AVPixelFormat_AV_PIX_FMT_BGR4, - #[doc = "< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)"] - BGR4_BYTE = ffi::AVPixelFormat_AV_PIX_FMT_BGR4_BYTE, - #[doc = "< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)"] - RGB8 = ffi::AVPixelFormat_AV_PIX_FMT_RGB8, - #[doc = "< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits"] - RGB4 = ffi::AVPixelFormat_AV_PIX_FMT_RGB4, - #[doc = "< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)"] - RGB4_BYTE = ffi::AVPixelFormat_AV_PIX_FMT_RGB4_BYTE, - #[doc = "< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)"] - NV12 = ffi::AVPixelFormat_AV_PIX_FMT_NV12, - #[doc = "< as above, but U and V bytes are swapped"] - NV21 = ffi::AVPixelFormat_AV_PIX_FMT_NV21, - #[doc = "< packed ARGB 8:8:8:8, 32bpp, ARGBARGB..."] - ARGB = ffi::AVPixelFormat_AV_PIX_FMT_ARGB, - #[doc = "< packed RGBA 8:8:8:8, 32bpp, RGBARGBA..."] - RGBA = ffi::AVPixelFormat_AV_PIX_FMT_RGBA, - #[doc = "< packed ABGR 8:8:8:8, 32bpp, ABGRABGR..."] - ABGR = ffi::AVPixelFormat_AV_PIX_FMT_ABGR, - #[doc = "< packed BGRA 8:8:8:8, 32bpp, BGRABGRA..."] - BGRA = ffi::AVPixelFormat_AV_PIX_FMT_BGRA, - #[doc = "< Y , 16bpp, big-endian"] - GRAY16BE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY16BE, - #[doc = "< Y , 16bpp, little-endian"] - GRAY16LE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY16LE, - #[doc = "< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)"] - YUV440P = ffi::AVPixelFormat_AV_PIX_FMT_YUV440P, - #[doc = "< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range"] - YUVJ440P = ffi::AVPixelFormat_AV_PIX_FMT_YUVJ440P, - #[doc = "< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)"] - YUVA420P = ffi::AVPixelFormat_AV_PIX_FMT_YUVA420P, - #[doc = "< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian"] - RGB48BE = ffi::AVPixelFormat_AV_PIX_FMT_RGB48BE, - #[doc = "< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian"] - RGB48LE = ffi::AVPixelFormat_AV_PIX_FMT_RGB48LE, - #[doc = "< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian"] - RGB565BE = ffi::AVPixelFormat_AV_PIX_FMT_RGB565BE, - #[doc = "< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian"] - RGB565LE = ffi::AVPixelFormat_AV_PIX_FMT_RGB565LE, - #[doc = "< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined"] - RGB555BE = ffi::AVPixelFormat_AV_PIX_FMT_RGB555BE, - #[doc = "< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined"] - RGB555LE = ffi::AVPixelFormat_AV_PIX_FMT_RGB555LE, - #[doc = "< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian"] - BGR565BE = ffi::AVPixelFormat_AV_PIX_FMT_BGR565BE, - #[doc = "< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian"] - BGR565LE = ffi::AVPixelFormat_AV_PIX_FMT_BGR565LE, - #[doc = "< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined"] - BGR555BE = ffi::AVPixelFormat_AV_PIX_FMT_BGR555BE, - #[doc = "< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined"] - BGR555LE = ffi::AVPixelFormat_AV_PIX_FMT_BGR555LE, - #[doc = "< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers"] - VAAPI_MOCO = ffi::AVPixelFormat_AV_PIX_FMT_VAAPI_MOCO, - #[doc = "< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers"] - VAAPI_IDCT = ffi::AVPixelFormat_AV_PIX_FMT_VAAPI_IDCT, - #[doc = "< HW decoding through VA API, Picture.data[3] contains a VASurfaceID"] - VAAPI_VLD = ffi::AVPixelFormat_AV_PIX_FMT_VAAPI_VLD, - #[doc = "< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian"] - YUV420P16LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P16LE, - #[doc = "< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian"] - YUV420P16BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P16BE, - #[doc = "< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian"] - YUV422P16LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P16LE, - #[doc = "< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian"] - YUV422P16BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P16BE, - #[doc = "< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian"] - YUV444P16LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P16LE, - #[doc = "< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian"] - YUV444P16BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P16BE, - #[doc = "< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer"] - DXVA2_VLD = ffi::AVPixelFormat_AV_PIX_FMT_DXVA2_VLD, - #[doc = "< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined"] - RGB444LE = ffi::AVPixelFormat_AV_PIX_FMT_RGB444LE, - #[doc = "< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined"] - RGB444BE = ffi::AVPixelFormat_AV_PIX_FMT_RGB444BE, - #[doc = "< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined"] - BGR444LE = ffi::AVPixelFormat_AV_PIX_FMT_BGR444LE, - #[doc = "< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined"] - BGR444BE = ffi::AVPixelFormat_AV_PIX_FMT_BGR444BE, - #[doc = "< 8 bits gray, 8 bits alpha"] - YA8 = ffi::AVPixelFormat_AV_PIX_FMT_YA8, - #[doc = "< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian"] - BGR48BE = ffi::AVPixelFormat_AV_PIX_FMT_BGR48BE, - #[doc = "< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian"] - BGR48LE = ffi::AVPixelFormat_AV_PIX_FMT_BGR48LE, - #[doc = "< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian"] - YUV420P9BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P9BE, - #[doc = "< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian"] - YUV420P9LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P9LE, - #[doc = "< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian"] - YUV420P10BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P10BE, - #[doc = "< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian"] - YUV420P10LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P10LE, - #[doc = "< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian"] - YUV422P10BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P10BE, - #[doc = "< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian"] - YUV422P10LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P10LE, - #[doc = "< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian"] - YUV444P9BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P9BE, - #[doc = "< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian"] - YUV444P9LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P9LE, - #[doc = "< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian"] - YUV444P10BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P10BE, - #[doc = "< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian"] - YUV444P10LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P10LE, - #[doc = "< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian"] - YUV422P9BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P9BE, - #[doc = "< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian"] - YUV422P9LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P9LE, - #[doc = "< planar GBR 4:4:4 24bpp"] - GBRP = ffi::AVPixelFormat_AV_PIX_FMT_GBRP, - #[doc = "< planar GBR 4:4:4 27bpp, big-endian"] - GBRP9BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP9BE, - #[doc = "< planar GBR 4:4:4 27bpp, little-endian"] - GBRP9LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP9LE, - #[doc = "< planar GBR 4:4:4 30bpp, big-endian"] - GBRP10BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP10BE, - #[doc = "< planar GBR 4:4:4 30bpp, little-endian"] - GBRP10LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP10LE, - #[doc = "< planar GBR 4:4:4 48bpp, big-endian"] - GBRP16BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP16BE, - #[doc = "< planar GBR 4:4:4 48bpp, little-endian"] - GBRP16LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP16LE, - #[doc = "< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)"] - YUVA422P = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P, - #[doc = "< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)"] - YUVA444P = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P, - #[doc = "< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian"] - YUVA420P9BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA420P9BE, - #[doc = "< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian"] - YUVA420P9LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA420P9LE, - #[doc = "< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian"] - YUVA422P9BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P9BE, - #[doc = "< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian"] - YUVA422P9LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P9LE, - #[doc = "< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian"] - YUVA444P9BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P9BE, - #[doc = "< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian"] - YUVA444P9LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P9LE, - #[doc = "< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)"] - YUVA420P10BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA420P10BE, - #[doc = "< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)"] - YUVA420P10LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA420P10LE, - #[doc = "< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)"] - YUVA422P10BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P10BE, - #[doc = "< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)"] - YUVA422P10LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P10LE, - #[doc = "< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)"] - YUVA444P10BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P10BE, - #[doc = "< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)"] - YUVA444P10LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P10LE, - #[doc = "< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)"] - YUVA420P16BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA420P16BE, - #[doc = "< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)"] - YUVA420P16LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA420P16LE, - #[doc = "< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)"] - YUVA422P16BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P16BE, - #[doc = "< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)"] - YUVA422P16LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P16LE, - #[doc = "< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)"] - YUVA444P16BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P16BE, - #[doc = "< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)"] - YUVA444P16LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P16LE, - #[doc = "< HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface"] - VDPAU = ffi::AVPixelFormat_AV_PIX_FMT_VDPAU, - #[doc = "< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as little-endian, the 4 lower bits are set to 0"] - XYZ12LE = ffi::AVPixelFormat_AV_PIX_FMT_XYZ12LE, - #[doc = "< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big-endian, the 4 lower bits are set to 0"] - XYZ12BE = ffi::AVPixelFormat_AV_PIX_FMT_XYZ12BE, - #[doc = "< interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)"] - NV16 = ffi::AVPixelFormat_AV_PIX_FMT_NV16, - #[doc = "< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian"] - NV20LE = ffi::AVPixelFormat_AV_PIX_FMT_NV20LE, - #[doc = "< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian"] - NV20BE = ffi::AVPixelFormat_AV_PIX_FMT_NV20BE, - #[doc = "< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian"] - RGBA64BE = ffi::AVPixelFormat_AV_PIX_FMT_RGBA64BE, - #[doc = "< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian"] - RGBA64LE = ffi::AVPixelFormat_AV_PIX_FMT_RGBA64LE, - #[doc = "< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian"] - BGRA64BE = ffi::AVPixelFormat_AV_PIX_FMT_BGRA64BE, - #[doc = "< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian"] - BGRA64LE = ffi::AVPixelFormat_AV_PIX_FMT_BGRA64LE, - #[doc = "< packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb"] - YVYU422 = ffi::AVPixelFormat_AV_PIX_FMT_YVYU422, - #[doc = "< 16 bits gray, 16 bits alpha (big-endian)"] - YA16BE = ffi::AVPixelFormat_AV_PIX_FMT_YA16BE, - #[doc = "< 16 bits gray, 16 bits alpha (little-endian)"] - YA16LE = ffi::AVPixelFormat_AV_PIX_FMT_YA16LE, - #[doc = "< planar GBRA 4:4:4:4 32bpp"] - GBRAP = ffi::AVPixelFormat_AV_PIX_FMT_GBRAP, - #[doc = "< planar GBRA 4:4:4:4 64bpp, big-endian"] - GBRAP16BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRAP16BE, - #[doc = "< planar GBRA 4:4:4:4 64bpp, little-endian"] - GBRAP16LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRAP16LE, - #[doc = " HW acceleration through QSV, data[3] contains a pointer to the"] - #[doc = " mfxFrameSurface1 structure."] - QSV = ffi::AVPixelFormat_AV_PIX_FMT_QSV, - #[doc = " HW acceleration though MMAL, data[3] contains a pointer to the"] - #[doc = " MMAL_BUFFER_HEADER_T structure."] - MMAL = ffi::AVPixelFormat_AV_PIX_FMT_MMAL, - #[doc = "< HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer"] - D3D11VA_VLD = ffi::AVPixelFormat_AV_PIX_FMT_D3D11VA_VLD, - #[doc = " HW acceleration through CUDA. data[i] contain CUdeviceptr pointers"] - #[doc = " exactly as for system memory frames."] - CUDA = ffi::AVPixelFormat_AV_PIX_FMT_CUDA, - #[doc = "< packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined"] - _0RGB = ffi::AVPixelFormat_AV_PIX_FMT_0RGB, - #[doc = "< packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined"] - RGB0 = ffi::AVPixelFormat_AV_PIX_FMT_RGB0, - #[doc = "< packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined"] - _0BGR = ffi::AVPixelFormat_AV_PIX_FMT_0BGR, - #[doc = "< packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined"] - BGR0 = ffi::AVPixelFormat_AV_PIX_FMT_BGR0, - #[doc = "< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian"] - YUV420P12BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P12BE, - #[doc = "< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian"] - YUV420P12LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P12LE, - #[doc = "< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian"] - YUV420P14BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P14BE, - #[doc = "< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian"] - YUV420P14LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P14LE, - #[doc = "< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian"] - YUV422P12BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P12BE, - #[doc = "< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian"] - YUV422P12LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P12LE, - #[doc = "< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian"] - YUV422P14BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P14BE, - #[doc = "< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian"] - YUV422P14LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P14LE, - #[doc = "< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian"] - YUV444P12BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P12BE, - #[doc = "< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian"] - YUV444P12LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P12LE, - #[doc = "< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian"] - YUV444P14BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P14BE, - #[doc = "< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian"] - YUV444P14LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P14LE, - #[doc = "< planar GBR 4:4:4 36bpp, big-endian"] - GBRP12BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP12BE, - #[doc = "< planar GBR 4:4:4 36bpp, little-endian"] - GBRP12LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP12LE, - #[doc = "< planar GBR 4:4:4 42bpp, big-endian"] - GBRP14BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP14BE, - #[doc = "< planar GBR 4:4:4 42bpp, little-endian"] - GBRP14LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP14LE, - #[doc = "< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV411P and setting color_range"] - YUVJ411P = ffi::AVPixelFormat_AV_PIX_FMT_YUVJ411P, - #[doc = "< bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples */"] - BAYER_BGGR8 = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_BGGR8, - #[doc = "< bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples */"] - BAYER_RGGB8 = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_RGGB8, - #[doc = "< bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples */"] - BAYER_GBRG8 = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_GBRG8, - #[doc = "< bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples */"] - BAYER_GRBG8 = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_GRBG8, - #[doc = "< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian */"] - BAYER_BGGR16LE = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_BGGR16LE, - #[doc = "< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian */"] - BAYER_BGGR16BE = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_BGGR16BE, - #[doc = "< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian */"] - BAYER_RGGB16LE = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_RGGB16LE, - #[doc = "< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian */"] - BAYER_RGGB16BE = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_RGGB16BE, - #[doc = "< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian */"] - BAYER_GBRG16LE = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_GBRG16LE, - #[doc = "< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian */"] - BAYER_GBRG16BE = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_GBRG16BE, - #[doc = "< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian */"] - BAYER_GRBG16LE = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_GRBG16LE, - #[doc = "< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian */"] - BAYER_GRBG16BE = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_GRBG16BE, - #[doc = "< XVideo Motion Acceleration via common packet passing"] - XVMC = ffi::AVPixelFormat_AV_PIX_FMT_XVMC, - #[doc = "< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian"] - YUV440P10LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV440P10LE, - #[doc = "< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian"] - YUV440P10BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV440P10BE, - #[doc = "< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian"] - YUV440P12LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV440P12LE, - #[doc = "< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian"] - YUV440P12BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV440P12BE, - #[doc = "< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), little-endian"] - AYUV64LE = ffi::AVPixelFormat_AV_PIX_FMT_AYUV64LE, - #[doc = "< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), big-endian"] - AYUV64BE = ffi::AVPixelFormat_AV_PIX_FMT_AYUV64BE, - #[doc = "< hardware decoding through Videotoolbox"] - VIDEOTOOLBOX = ffi::AVPixelFormat_AV_PIX_FMT_VIDEOTOOLBOX, - #[doc = "< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, little-endian"] - P010LE = ffi::AVPixelFormat_AV_PIX_FMT_P010LE, - #[doc = "< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, big-endian"] - P010BE = ffi::AVPixelFormat_AV_PIX_FMT_P010BE, - #[doc = "< planar GBR 4:4:4:4 48bpp, big-endian"] - GBRAP12BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRAP12BE, - #[doc = "< planar GBR 4:4:4:4 48bpp, little-endian"] - GBRAP12LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRAP12LE, - #[doc = "< planar GBR 4:4:4:4 40bpp, big-endian"] - GBRAP10BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRAP10BE, - #[doc = "< planar GBR 4:4:4:4 40bpp, little-endian"] - GBRAP10LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRAP10LE, - #[doc = "< hardware decoding through MediaCodec"] - MEDIACODEC = ffi::AVPixelFormat_AV_PIX_FMT_MEDIACODEC, - #[doc = "< Y , 12bpp, big-endian"] - GRAY12BE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY12BE, - #[doc = "< Y , 12bpp, little-endian"] - GRAY12LE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY12LE, - #[doc = "< Y , 10bpp, big-endian"] - GRAY10BE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY10BE, - #[doc = "< Y , 10bpp, little-endian"] - GRAY10LE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY10LE, - #[doc = "< like NV12, with 16bpp per component, little-endian"] - P016LE = ffi::AVPixelFormat_AV_PIX_FMT_P016LE, - #[doc = "< like NV12, with 16bpp per component, big-endian"] - P016BE = ffi::AVPixelFormat_AV_PIX_FMT_P016BE, - #[doc = " Hardware surfaces for Direct3D11."] - #[doc = ""] - #[doc = " This is preferred over the legacy AV_PIX_FMT_D3D11VA_VLD. The new D3D11"] - #[doc = " hwaccel API and filtering support AV_PIX_FMT_D3D11 only."] - #[doc = ""] - #[doc = " data[0] contains a ID3D11Texture2D pointer, and data[1] contains the"] - #[doc = " texture array index of the frame as intptr_t if the ID3D11Texture2D is"] - #[doc = " an array texture (or always 0 if it's a normal texture)."] - D3D11 = ffi::AVPixelFormat_AV_PIX_FMT_D3D11, - #[doc = "< Y , 9bpp, big-endian"] - GRAY9BE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY9BE, - #[doc = "< Y , 9bpp, little-endian"] - GRAY9LE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY9LE, - #[doc = "< IEEE-754 single precision planar GBR 4:4:4, 96bpp, big-endian"] - GBRPF32BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRPF32BE, - #[doc = "< IEEE-754 single precision planar GBR 4:4:4, 96bpp, little-endian"] - GBRPF32LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRPF32LE, - #[doc = "< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, big-endian"] - GBRAPF32BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRAPF32BE, - #[doc = "< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, little-endian"] - GBRAPF32LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRAPF32LE, - #[doc = " DRM-managed buffers exposed through PRIME buffer sharing."] - #[doc = ""] - #[doc = " data[0] points to an AVDRMFrameDescriptor."] - DRM_PRIME = ffi::AVPixelFormat_AV_PIX_FMT_DRM_PRIME, - #[doc = " Hardware surfaces for OpenCL."] - #[doc = ""] - #[doc = " data[i] contain 2D image objects (typed in C as cl_mem, used"] - #[doc = " in OpenCL as image2d_t) for each plane of the surface."] - OPENCL = ffi::AVPixelFormat_AV_PIX_FMT_OPENCL, - #[doc = "< Y , 14bpp, big-endian"] - GRAY14BE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY14BE, - #[doc = "< Y , 14bpp, little-endian"] - GRAY14LE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY14LE, - #[doc = "< IEEE-754 single precision Y, 32bpp, big-endian"] - GRAYF32BE = ffi::AVPixelFormat_AV_PIX_FMT_GRAYF32BE, - #[doc = "< IEEE-754 single precision Y, 32bpp, little-endian"] - GRAYF32LE = ffi::AVPixelFormat_AV_PIX_FMT_GRAYF32LE, - #[doc = "< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, big-endian"] - YUVA422P12BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P12BE, - #[doc = "< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, little-endian"] - YUVA422P12LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P12LE, - #[doc = "< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, big-endian"] - YUVA444P12BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P12BE, - #[doc = "< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, little-endian"] - YUVA444P12LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P12LE, - #[doc = "< planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)"] - NV24 = ffi::AVPixelFormat_AV_PIX_FMT_NV24, - #[doc = "< as above, but U and V bytes are swapped"] - NV42 = ffi::AVPixelFormat_AV_PIX_FMT_NV42 - } +#[doc = "Pixel format."] +#[allow(non_camel_case_types)] +#[derive(Debug, Copy, Clone, PartialEq, FromPrimitive, ToPrimitive)] +#[repr(i32)] +pub enum AVPixelFormat { + NONE = ffi::AVPixelFormat_AV_PIX_FMT_NONE, + #[doc = " planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)"] + YUV420P = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P, + #[doc = " packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr"] + YUYV422 = ffi::AVPixelFormat_AV_PIX_FMT_YUYV422, + #[doc = " packed RGB 8:8:8, 24bpp, RGBRGB..."] + RGB24 = ffi::AVPixelFormat_AV_PIX_FMT_RGB24, + #[doc = " packed RGB 8:8:8, 24bpp, BGRBGR..."] + BGR24 = ffi::AVPixelFormat_AV_PIX_FMT_BGR24, + #[doc = " planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)"] + YUV422P = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P, + #[doc = " planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)"] + YUV444P = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P, + #[doc = " planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)"] + YUV410P = ffi::AVPixelFormat_AV_PIX_FMT_YUV410P, + #[doc = " planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)"] + YUV411P = ffi::AVPixelFormat_AV_PIX_FMT_YUV411P, + #[doc = " Y , 8bpp"] + GRAY8 = ffi::AVPixelFormat_AV_PIX_FMT_GRAY8, + #[doc = " Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb"] + MONOWHITE = ffi::AVPixelFormat_AV_PIX_FMT_MONOWHITE, + #[doc = " Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb"] + MONOBLACK = ffi::AVPixelFormat_AV_PIX_FMT_MONOBLACK, + #[doc = " 8 bits with AV_PIX_FMT_RGB32 palette"] + PAL8 = ffi::AVPixelFormat_AV_PIX_FMT_PAL8, + #[doc = " planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range"] + YUVJ420P = ffi::AVPixelFormat_AV_PIX_FMT_YUVJ420P, + #[doc = " planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting color_range"] + YUVJ422P = ffi::AVPixelFormat_AV_PIX_FMT_YUVJ422P, + #[doc = " planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting color_range"] + YUVJ444P = ffi::AVPixelFormat_AV_PIX_FMT_YUVJ444P, + #[doc = " packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1"] + UYVY422 = ffi::AVPixelFormat_AV_PIX_FMT_UYVY422, + #[doc = " packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3"] + UYYVYY411 = ffi::AVPixelFormat_AV_PIX_FMT_UYYVYY411, + #[doc = " packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)"] + BGR8 = ffi::AVPixelFormat_AV_PIX_FMT_BGR8, + #[doc = " packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits"] + BGR4 = ffi::AVPixelFormat_AV_PIX_FMT_BGR4, + #[doc = " packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)"] + BGR4_BYTE = ffi::AVPixelFormat_AV_PIX_FMT_BGR4_BYTE, + #[doc = " packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)"] + RGB8 = ffi::AVPixelFormat_AV_PIX_FMT_RGB8, + #[doc = " packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits"] + RGB4 = ffi::AVPixelFormat_AV_PIX_FMT_RGB4, + #[doc = " packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)"] + RGB4_BYTE = ffi::AVPixelFormat_AV_PIX_FMT_RGB4_BYTE, + #[doc = " planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)"] + NV12 = ffi::AVPixelFormat_AV_PIX_FMT_NV12, + #[doc = " as above, but U and V bytes are swapped"] + NV21 = ffi::AVPixelFormat_AV_PIX_FMT_NV21, + #[doc = " packed ARGB 8:8:8:8, 32bpp, ARGBARGB..."] + ARGB = ffi::AVPixelFormat_AV_PIX_FMT_ARGB, + #[doc = " packed RGBA 8:8:8:8, 32bpp, RGBARGBA..."] + RGBA = ffi::AVPixelFormat_AV_PIX_FMT_RGBA, + #[doc = " packed ABGR 8:8:8:8, 32bpp, ABGRABGR..."] + ABGR = ffi::AVPixelFormat_AV_PIX_FMT_ABGR, + #[doc = " packed BGRA 8:8:8:8, 32bpp, BGRABGRA..."] + BGRA = ffi::AVPixelFormat_AV_PIX_FMT_BGRA, + #[doc = " Y , 16bpp, big-endian"] + GRAY16BE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY16BE, + #[doc = " Y , 16bpp, little-endian"] + GRAY16LE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY16LE, + #[doc = " planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)"] + YUV440P = ffi::AVPixelFormat_AV_PIX_FMT_YUV440P, + #[doc = " planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range"] + YUVJ440P = ffi::AVPixelFormat_AV_PIX_FMT_YUVJ440P, + #[doc = " planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)"] + YUVA420P = ffi::AVPixelFormat_AV_PIX_FMT_YUVA420P, + #[doc = " packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian"] + RGB48BE = ffi::AVPixelFormat_AV_PIX_FMT_RGB48BE, + #[doc = " packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian"] + RGB48LE = ffi::AVPixelFormat_AV_PIX_FMT_RGB48LE, + #[doc = " packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian"] + RGB565BE = ffi::AVPixelFormat_AV_PIX_FMT_RGB565BE, + #[doc = " packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian"] + RGB565LE = ffi::AVPixelFormat_AV_PIX_FMT_RGB565LE, + #[doc = " packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined"] + RGB555BE = ffi::AVPixelFormat_AV_PIX_FMT_RGB555BE, + #[doc = " packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined"] + RGB555LE = ffi::AVPixelFormat_AV_PIX_FMT_RGB555LE, + #[doc = " packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian"] + BGR565BE = ffi::AVPixelFormat_AV_PIX_FMT_BGR565BE, + #[doc = " packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian"] + BGR565LE = ffi::AVPixelFormat_AV_PIX_FMT_BGR565LE, + #[doc = " packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined"] + BGR555BE = ffi::AVPixelFormat_AV_PIX_FMT_BGR555BE, + #[doc = " packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined"] + BGR555LE = ffi::AVPixelFormat_AV_PIX_FMT_BGR555LE, + #[doc = " HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers"] + VAAPI_MOCO = ffi::AVPixelFormat_AV_PIX_FMT_VAAPI_MOCO, + #[doc = " HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers"] + VAAPI_IDCT = ffi::AVPixelFormat_AV_PIX_FMT_VAAPI_IDCT, + #[doc = " HW decoding through VA API, Picture.data[3] contains a VASurfaceID"] + VAAPI_VLD = ffi::AVPixelFormat_AV_PIX_FMT_VAAPI_VLD, + #[doc = " planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian"] + YUV420P16LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P16LE, + #[doc = " planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian"] + YUV420P16BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P16BE, + #[doc = " planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian"] + YUV422P16LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P16LE, + #[doc = " planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian"] + YUV422P16BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P16BE, + #[doc = " planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian"] + YUV444P16LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P16LE, + #[doc = " planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian"] + YUV444P16BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P16BE, + #[doc = " HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer"] + DXVA2_VLD = ffi::AVPixelFormat_AV_PIX_FMT_DXVA2_VLD, + #[doc = " packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined"] + RGB444LE = ffi::AVPixelFormat_AV_PIX_FMT_RGB444LE, + #[doc = " packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined"] + RGB444BE = ffi::AVPixelFormat_AV_PIX_FMT_RGB444BE, + #[doc = " packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined"] + BGR444LE = ffi::AVPixelFormat_AV_PIX_FMT_BGR444LE, + #[doc = " packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined"] + BGR444BE = ffi::AVPixelFormat_AV_PIX_FMT_BGR444BE, + #[doc = " 8 bits gray, 8 bits alpha"] + YA8 = ffi::AVPixelFormat_AV_PIX_FMT_YA8, + #[doc = " packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian"] + BGR48BE = ffi::AVPixelFormat_AV_PIX_FMT_BGR48BE, + #[doc = " packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian"] + BGR48LE = ffi::AVPixelFormat_AV_PIX_FMT_BGR48LE, + #[doc = " planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian"] + YUV420P9BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P9BE, + #[doc = " planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian"] + YUV420P9LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P9LE, + #[doc = " planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian"] + YUV420P10BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P10BE, + #[doc = " planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian"] + YUV420P10LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P10LE, + #[doc = " planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian"] + YUV422P10BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P10BE, + #[doc = " planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian"] + YUV422P10LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P10LE, + #[doc = " planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian"] + YUV444P9BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P9BE, + #[doc = " planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian"] + YUV444P9LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P9LE, + #[doc = " planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian"] + YUV444P10BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P10BE, + #[doc = " planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian"] + YUV444P10LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P10LE, + #[doc = " planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian"] + YUV422P9BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P9BE, + #[doc = " planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian"] + YUV422P9LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P9LE, + #[doc = " planar GBR 4:4:4 24bpp"] + GBRP = ffi::AVPixelFormat_AV_PIX_FMT_GBRP, + #[doc = " planar GBR 4:4:4 27bpp, big-endian"] + GBRP9BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP9BE, + #[doc = " planar GBR 4:4:4 27bpp, little-endian"] + GBRP9LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP9LE, + #[doc = " planar GBR 4:4:4 30bpp, big-endian"] + GBRP10BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP10BE, + #[doc = " planar GBR 4:4:4 30bpp, little-endian"] + GBRP10LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP10LE, + #[doc = " planar GBR 4:4:4 48bpp, big-endian"] + GBRP16BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP16BE, + #[doc = " planar GBR 4:4:4 48bpp, little-endian"] + GBRP16LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP16LE, + #[doc = " planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)"] + YUVA422P = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P, + #[doc = " planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)"] + YUVA444P = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P, + #[doc = " planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian"] + YUVA420P9BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA420P9BE, + #[doc = " planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian"] + YUVA420P9LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA420P9LE, + #[doc = " planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian"] + YUVA422P9BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P9BE, + #[doc = " planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian"] + YUVA422P9LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P9LE, + #[doc = " planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian"] + YUVA444P9BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P9BE, + #[doc = " planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian"] + YUVA444P9LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P9LE, + #[doc = " planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)"] + YUVA420P10BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA420P10BE, + #[doc = " planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)"] + YUVA420P10LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA420P10LE, + #[doc = " planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)"] + YUVA422P10BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P10BE, + #[doc = " planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)"] + YUVA422P10LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P10LE, + #[doc = " planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)"] + YUVA444P10BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P10BE, + #[doc = " planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)"] + YUVA444P10LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P10LE, + #[doc = " planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)"] + YUVA420P16BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA420P16BE, + #[doc = " planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)"] + YUVA420P16LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA420P16LE, + #[doc = " planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)"] + YUVA422P16BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P16BE, + #[doc = " planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)"] + YUVA422P16LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P16LE, + #[doc = " planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)"] + YUVA444P16BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P16BE, + #[doc = " planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)"] + YUVA444P16LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P16LE, + #[doc = " HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface"] + VDPAU = ffi::AVPixelFormat_AV_PIX_FMT_VDPAU, + #[doc = " packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as little-endian, the 4 lower bits are set to 0"] + XYZ12LE = ffi::AVPixelFormat_AV_PIX_FMT_XYZ12LE, + #[doc = " packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big-endian, the 4 lower bits are set to 0"] + XYZ12BE = ffi::AVPixelFormat_AV_PIX_FMT_XYZ12BE, + #[doc = " interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)"] + NV16 = ffi::AVPixelFormat_AV_PIX_FMT_NV16, + #[doc = " interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian"] + NV20LE = ffi::AVPixelFormat_AV_PIX_FMT_NV20LE, + #[doc = " interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian"] + NV20BE = ffi::AVPixelFormat_AV_PIX_FMT_NV20BE, + #[doc = " packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian"] + RGBA64BE = ffi::AVPixelFormat_AV_PIX_FMT_RGBA64BE, + #[doc = " packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian"] + RGBA64LE = ffi::AVPixelFormat_AV_PIX_FMT_RGBA64LE, + #[doc = " packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian"] + BGRA64BE = ffi::AVPixelFormat_AV_PIX_FMT_BGRA64BE, + #[doc = " packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian"] + BGRA64LE = ffi::AVPixelFormat_AV_PIX_FMT_BGRA64LE, + #[doc = " packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb"] + YVYU422 = ffi::AVPixelFormat_AV_PIX_FMT_YVYU422, + #[doc = " 16 bits gray, 16 bits alpha (big-endian)"] + YA16BE = ffi::AVPixelFormat_AV_PIX_FMT_YA16BE, + #[doc = " 16 bits gray, 16 bits alpha (little-endian)"] + YA16LE = ffi::AVPixelFormat_AV_PIX_FMT_YA16LE, + #[doc = " planar GBRA 4:4:4:4 32bpp"] + GBRAP = ffi::AVPixelFormat_AV_PIX_FMT_GBRAP, + #[doc = " planar GBRA 4:4:4:4 64bpp, big-endian"] + GBRAP16BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRAP16BE, + #[doc = " planar GBRA 4:4:4:4 64bpp, little-endian"] + GBRAP16LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRAP16LE, + #[doc = " HW acceleration through QSV, data[3] contains a pointer to the"] + #[doc = " mfxFrameSurface1 structure."] + QSV = ffi::AVPixelFormat_AV_PIX_FMT_QSV, + #[doc = " HW acceleration though MMAL, data[3] contains a pointer to the"] + #[doc = " MMAL_BUFFER_HEADER_T structure."] + MMAL = ffi::AVPixelFormat_AV_PIX_FMT_MMAL, + #[doc = " HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer"] + D3D11VA_VLD = ffi::AVPixelFormat_AV_PIX_FMT_D3D11VA_VLD, + #[doc = " HW acceleration through CUDA. data[i] contain CUdeviceptr pointers"] + #[doc = " exactly as for system memory frames."] + CUDA = ffi::AVPixelFormat_AV_PIX_FMT_CUDA, + #[doc = " packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined"] + _0RGB = ffi::AVPixelFormat_AV_PIX_FMT_0RGB, + #[doc = " packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined"] + RGB0 = ffi::AVPixelFormat_AV_PIX_FMT_RGB0, + #[doc = " packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined"] + _0BGR = ffi::AVPixelFormat_AV_PIX_FMT_0BGR, + #[doc = " packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined"] + BGR0 = ffi::AVPixelFormat_AV_PIX_FMT_BGR0, + #[doc = " planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian"] + YUV420P12BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P12BE, + #[doc = " planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian"] + YUV420P12LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P12LE, + #[doc = " planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian"] + YUV420P14BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P14BE, + #[doc = " planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian"] + YUV420P14LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV420P14LE, + #[doc = " planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian"] + YUV422P12BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P12BE, + #[doc = " planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian"] + YUV422P12LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P12LE, + #[doc = " planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian"] + YUV422P14BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P14BE, + #[doc = " planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian"] + YUV422P14LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV422P14LE, + #[doc = " planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian"] + YUV444P12BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P12BE, + #[doc = " planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian"] + YUV444P12LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P12LE, + #[doc = " planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian"] + YUV444P14BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P14BE, + #[doc = " planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian"] + YUV444P14LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV444P14LE, + #[doc = " planar GBR 4:4:4 36bpp, big-endian"] + GBRP12BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP12BE, + #[doc = " planar GBR 4:4:4 36bpp, little-endian"] + GBRP12LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP12LE, + #[doc = " planar GBR 4:4:4 42bpp, big-endian"] + GBRP14BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP14BE, + #[doc = " planar GBR 4:4:4 42bpp, little-endian"] + GBRP14LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRP14LE, + #[doc = " planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV411P and setting color_range"] + YUVJ411P = ffi::AVPixelFormat_AV_PIX_FMT_YUVJ411P, + #[doc = " bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples */"] + BAYER_BGGR8 = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_BGGR8, + #[doc = " bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples */"] + BAYER_RGGB8 = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_RGGB8, + #[doc = " bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples */"] + BAYER_GBRG8 = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_GBRG8, + #[doc = " bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples */"] + BAYER_GRBG8 = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_GRBG8, + #[doc = " bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian */"] + BAYER_BGGR16LE = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_BGGR16LE, + #[doc = " bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian */"] + BAYER_BGGR16BE = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_BGGR16BE, + #[doc = " bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian */"] + BAYER_RGGB16LE = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_RGGB16LE, + #[doc = " bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian */"] + BAYER_RGGB16BE = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_RGGB16BE, + #[doc = " bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian */"] + BAYER_GBRG16LE = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_GBRG16LE, + #[doc = " bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian */"] + BAYER_GBRG16BE = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_GBRG16BE, + #[doc = " bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian */"] + BAYER_GRBG16LE = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_GRBG16LE, + #[doc = " bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian */"] + BAYER_GRBG16BE = ffi::AVPixelFormat_AV_PIX_FMT_BAYER_GRBG16BE, + #[doc = " XVideo Motion Acceleration via common packet passing"] + XVMC = ffi::AVPixelFormat_AV_PIX_FMT_XVMC, + #[doc = " planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian"] + YUV440P10LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV440P10LE, + #[doc = " planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian"] + YUV440P10BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV440P10BE, + #[doc = " planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian"] + YUV440P12LE = ffi::AVPixelFormat_AV_PIX_FMT_YUV440P12LE, + #[doc = " planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian"] + YUV440P12BE = ffi::AVPixelFormat_AV_PIX_FMT_YUV440P12BE, + #[doc = " packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), little-endian"] + AYUV64LE = ffi::AVPixelFormat_AV_PIX_FMT_AYUV64LE, + #[doc = " packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), big-endian"] + AYUV64BE = ffi::AVPixelFormat_AV_PIX_FMT_AYUV64BE, + #[doc = " hardware decoding through Videotoolbox"] + VIDEOTOOLBOX = ffi::AVPixelFormat_AV_PIX_FMT_VIDEOTOOLBOX, + #[doc = " like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, little-endian"] + P010LE = ffi::AVPixelFormat_AV_PIX_FMT_P010LE, + #[doc = " like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, big-endian"] + P010BE = ffi::AVPixelFormat_AV_PIX_FMT_P010BE, + #[doc = " planar GBR 4:4:4:4 48bpp, big-endian"] + GBRAP12BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRAP12BE, + #[doc = " planar GBR 4:4:4:4 48bpp, little-endian"] + GBRAP12LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRAP12LE, + #[doc = " planar GBR 4:4:4:4 40bpp, big-endian"] + GBRAP10BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRAP10BE, + #[doc = " planar GBR 4:4:4:4 40bpp, little-endian"] + GBRAP10LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRAP10LE, + #[doc = " hardware decoding through MediaCodec"] + MEDIACODEC = ffi::AVPixelFormat_AV_PIX_FMT_MEDIACODEC, + #[doc = " Y , 12bpp, big-endian"] + GRAY12BE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY12BE, + #[doc = " Y , 12bpp, little-endian"] + GRAY12LE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY12LE, + #[doc = " Y , 10bpp, big-endian"] + GRAY10BE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY10BE, + #[doc = " Y , 10bpp, little-endian"] + GRAY10LE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY10LE, + #[doc = " like NV12, with 16bpp per component, little-endian"] + P016LE = ffi::AVPixelFormat_AV_PIX_FMT_P016LE, + #[doc = " like NV12, with 16bpp per component, big-endian"] + P016BE = ffi::AVPixelFormat_AV_PIX_FMT_P016BE, + #[doc = " Hardware surfaces for Direct3D11."] + D3D11 = ffi::AVPixelFormat_AV_PIX_FMT_D3D11, + #[doc = " Y , 9bpp, big-endian"] + GRAY9BE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY9BE, + #[doc = " Y , 9bpp, little-endian"] + GRAY9LE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY9LE, + #[doc = " IEEE-754 single precision planar GBR 4:4:4, 96bpp, big-endian"] + GBRPF32BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRPF32BE, + #[doc = " IEEE-754 single precision planar GBR 4:4:4, 96bpp, little-endian"] + GBRPF32LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRPF32LE, + #[doc = " IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, big-endian"] + GBRAPF32BE = ffi::AVPixelFormat_AV_PIX_FMT_GBRAPF32BE, + #[doc = " IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, little-endian"] + GBRAPF32LE = ffi::AVPixelFormat_AV_PIX_FMT_GBRAPF32LE, + #[doc = " DRM-managed buffers exposed through PRIME buffer sharing."] + DRM_PRIME = ffi::AVPixelFormat_AV_PIX_FMT_DRM_PRIME, + #[doc = " Hardware surfaces for OpenCL."] + OPENCL = ffi::AVPixelFormat_AV_PIX_FMT_OPENCL, + #[doc = " Y , 14bpp, big-endian"] + GRAY14BE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY14BE, + #[doc = " Y , 14bpp, little-endian"] + GRAY14LE = ffi::AVPixelFormat_AV_PIX_FMT_GRAY14LE, + #[doc = " IEEE-754 single precision Y, 32bpp, big-endian"] + GRAYF32BE = ffi::AVPixelFormat_AV_PIX_FMT_GRAYF32BE, + #[doc = " IEEE-754 single precision Y, 32bpp, little-endian"] + GRAYF32LE = ffi::AVPixelFormat_AV_PIX_FMT_GRAYF32LE, + #[doc = " planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, big-endian"] + YUVA422P12BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P12BE, + #[doc = " planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, little-endian"] + YUVA422P12LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA422P12LE, + #[doc = " planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, big-endian"] + YUVA444P12BE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P12BE, + #[doc = " planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, little-endian"] + YUVA444P12LE = ffi::AVPixelFormat_AV_PIX_FMT_YUVA444P12LE, + #[doc = " planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)"] + NV24 = ffi::AVPixelFormat_AV_PIX_FMT_NV24, + #[doc = " as above, but U and V bytes are swapped"] + NV42 = ffi::AVPixelFormat_AV_PIX_FMT_NV42, } -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 - } +#[derive(Debug, Copy, Clone, PartialEq, FromPrimitive, ToPrimitive)] +#[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, } -enum_from_primitive! { - #[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."] - #[allow(non_camel_case_types)] - #[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 - } +#[doc = " Identify the syntax and semantics of the bitstream."] +#[allow(non_camel_case_types)] +#[derive(Debug, Copy, Clone, PartialEq, FromPrimitive, ToPrimitive)] +#[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, } -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, - } +#[derive(Debug, Copy, Clone, PartialEq, FromPrimitive, ToPrimitive)] +#[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, } -enum_from_primitive! { - #[derive(Debug, Copy, Clone, PartialEq)] - #[repr(u32)] - pub enum SwsScaler { - FastBilinear = ffi::SWS_FAST_BILINEAR, - Bilinear = ffi::SWS_BILINEAR, - Bicubic = ffi::SWS_BICUBIC, - X = ffi::SWS_X, - Point = ffi::SWS_POINT, - Area = ffi::SWS_AREA, - Bicublin = ffi::SWS_BICUBLIN, - Gauss = ffi::SWS_GAUSS, - Sinc = ffi::SWS_SINC, - Lanczos = ffi::SWS_LANCZOS, - Spline = ffi::SWS_SPLINE, - } +#[derive(Debug, Copy, Clone, PartialEq, FromPrimitive, ToPrimitive)] +#[repr(u32)] +pub enum SwsScaler { + FastBilinear = ffi::SWS_FAST_BILINEAR, + Bilinear = ffi::SWS_BILINEAR, + Bicubic = ffi::SWS_BICUBIC, + X = ffi::SWS_X, + Point = ffi::SWS_POINT, + Area = ffi::SWS_AREA, + Bicublin = ffi::SWS_BICUBLIN, + Gauss = ffi::SWS_GAUSS, + Sinc = ffi::SWS_SINC, + Lanczos = ffi::SWS_LANCZOS, + Spline = ffi::SWS_SPLINE, } diff --git a/lib/ffmpeg_api/src/err.rs b/lib/ffmpeg_api/src/err.rs new file mode 100644 index 0000000..b2debc0 --- /dev/null +++ b/lib/ffmpeg_api/src/err.rs @@ -0,0 +1,36 @@ +use num_traits::FromPrimitive; +use thiserror::Error; + +use crate::err_ffi::AvFfiError; +use crate::err_av::AvInternalError; + +#[derive(Error, Debug, Copy, Clone, PartialEq)] +pub enum AVError { + #[error(transparent)] + Internal(AvInternalError), + #[error(transparent)] + System(AvFfiError), + #[error("Unknown error occured: {0}")] + Unknown(i32), +} + +impl AVError { + pub fn from_errno(errno: i32) -> Result<(), AVError> { + match errno { + 0 => Ok(()), + errno => Err(AVError::from(-errno)), + } + } +} + +impl From<i32> for AVError { + fn from(value: i32) -> Self { + if let Some(error) = AvFfiError::from_i32(value) { + return AVError::System(error); + } + if let Some(error) = AvInternalError::from_i32(value) { + return AVError::Internal(error); + } + return AVError::Unknown(value); + } +} \ No newline at end of file diff --git a/lib/ffmpeg_api/src/err_av.rs b/lib/ffmpeg_api/src/err_av.rs new file mode 100644 index 0000000..1e81159 --- /dev/null +++ b/lib/ffmpeg_api/src/err_av.rs @@ -0,0 +1,63 @@ +use num_derive::FromPrimitive; +use thiserror::Error; + +#[derive(Error, Debug, Copy, Clone, PartialEq, FromPrimitive, ToPrimitive)] +#[repr(i32)] +pub enum AvInternalError { + #[error("Bitstream filter not found")] + BitstreamFilterNotFound = 0x465342F8, + #[error("Internal bug, also see AVERROR_BUG2")] + Bug = 0x21475542, + #[error("Internal bug, also see AVERROR_BUG")] + Bug2 = 0x20475542, + #[error("Buffer too small")] + BufferTooSmall = 0x53465542, + #[error("Decoder not found")] + DecoderNotFound = 0x434544F8, + #[error("Demuxer not found")] + DemuxerNotFound = 0x4D4544F8, + #[error("Encoder not found")] + EncoderNotFound = 0x434E45F8, + #[error("End of file")] + EndOfFile = 0x20464F45, + #[error("Immediate exit was requested; the called function should not be restarted")] + Exit = 0x54495845, + #[error("Generic error in an external library")] + External = 0x20545845, + #[error("Filter not found")] + FilterNotFound = 0x4C4946F8, + #[error("Input changed between calls. Reconfiguration is required.")] + InputChanged = 0x636e6701, + #[error("Invalid data found when processing input")] + InvalidData = 0x41444E49, + #[error("Muxer not found")] + MuxerNotFound = 0x58554DF8, + #[error("Option not found")] + OptionNotFound = 0x54504FF8, + #[error("Output changed between calls. Reconfiguration is required.")] + OutputChanged = 0x636e6702, + #[error("Not yet implemented in FFmpeg, patches welcome")] + NotImplemented = 0x45574150, + #[error("Protocol not found")] + ProtocolNotFound = 0x4F5250F8, + #[error("Stream not found")] + StreamNotFound = 0x525453F8, + #[error("Unknown error, typically from an external library")] + Unknown = 0x4E4B4E55, + #[error("Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it.")] + Experimental = 0x2bb2afa8, + #[error("Input and output changed between calls. Reconfiguration is required.")] + InputAndOutputChanged = 0x636e6703, + #[error("HTTP: Bad Request")] + HttpBadRequest = 0x303034F8, + #[error("HTTP: Unauthorized")] + HttpUnauthorized = 0x313034F8, + #[error("HTTP: Forbidden")] + HttpForbidden = 0x333034F8, + #[error("HTTP: Not Found")] + HttpNotFound = 0x343034F8, + #[error("HTTP: Other 4xx error")] + HttpOther4xx = 0x585834F8, + #[error("HTTP: Other 5xx error")] + HttpServerError = 0x585835F8, +} \ No newline at end of file diff --git a/lib/ffmpeg_api/src/err_ffi.rs b/lib/ffmpeg_api/src/err_ffi.rs new file mode 100644 index 0000000..8de1fcf --- /dev/null +++ b/lib/ffmpeg_api/src/err_ffi.rs @@ -0,0 +1,269 @@ +use num_derive::FromPrimitive; +use thiserror::Error; + +#[derive(Error, Debug, Copy, Clone, PartialEq, FromPrimitive, ToPrimitive)] +#[repr(i32)] +pub enum AvFfiError { + #[error("Operation not permitted")] + OperationNotPermitted = 1, + #[error("No such file or directory")] + NoSuchFileOrDirectory = 2, + #[error("No such process")] + NoSuchProcess = 3, + #[error("Interrupted system call")] + InterruptedSystemCall = 4, + #[error("I/O error")] + IoError = 5, + #[error("No such device or address")] + NoSuchDeviceOrAddress = 6, + #[error("Argument list too long")] + ArgumentListTooLong = 7, + #[error("Exec format error")] + ExecFormatError = 8, + #[error("Bad file number")] + BadFileNumber = 9, + #[error("No child processes")] + NoChildProcesses = 10, + #[error("Try again")] + TryAgain = 11, + #[error("Out of memory")] + OutOfMemory = 12, + #[error("Permission denied")] + PermissionDenied = 13, + #[error("Bad address")] + BadAddress = 14, + #[error("Block device required")] + BlockDeviceRequired = 15, + #[error("Device or resource busy")] + DeviceOrResourceBusy = 16, + #[error("File exists")] + FileExists = 17, + #[error("Cross-device link")] + CrossDeviceLink = 18, + #[error("No such device")] + NoSuchDevice = 19, + #[error("Not a directory")] + NotDirectory = 20, + #[error("Is a directory")] + Directory = 21, + #[error("Invalid argument")] + InvalidArgument = 22, + #[error("File table overflow")] + FileTableOverflow = 23, + #[error("Too many open files")] + TooManyOpenFiles = 24, + #[error("Not a typewriter")] + NotATypewriter = 25, + #[error("Text file busy")] + TextFileBusy = 26, + #[error("File too large")] + FileTooLarge = 27, + #[error("No space left on device")] + NoSpaceLeftOnDevice = 28, + #[error("Illegal seek")] + IllegalSeek = 29, + #[error("Read-only file system")] + ReadOnlyFileSystem = 30, + #[error("Too many links")] + TooManyLinks = 31, + #[error("Broken pipe")] + BrokenPipe = 32, + #[error("Math argument out of domain of func")] + MathArgumentOutOfDomain = 33, + #[error("Math result not representable")] + MathResultNotRepresentable = 34, + #[error("Resource deadlock would occur")] + ResourceDeadlock = 35, + #[error("File name too long")] + FileNameTooLong = 36, + #[error("No record locks available")] + NoRecordLocksAvailable = 37, + #[error("Invalid system call number")] + InvalidSystemCall = 38, + #[error("Directory not empty")] + DirectoryNotEmpty = 39, + #[error("Too many symbolic links encountered")] + TooManySymbolicLinks = 40, + #[error("No message of desired type")] + NoMessageOfDesiredType = 42, + #[error("Identifier removed")] + IdentifierRemoved = 43, + #[error("Channel number out of range")] + ChannelNumberOutOfRange = 44, + #[error("Level 2 not synchronized")] + Level2NotSynchronized = 45, + #[error("Level 3 halted")] + Level3Halted = 46, + #[error("Level 3 reset")] + Level3Reset = 47, + #[error("Link number out of range")] + LinkNumberOutOfRange = 48, + #[error("Protocol driver not attached")] + ProtocolDriverNotAttached = 49, + #[error("No CSI structure available")] + NoCsiStructureAvailable = 50, + #[error("Level 2 halted")] + Level2Halted = 51, + #[error("Invalid exchange")] + InvalidExchange = 52, + #[error("Invalid request descriptor")] + InvalidRequestDescriptor = 53, + #[error("Exchange full")] + ExchangeFull = 54, + #[error("No anode")] + NoAnode = 55, + #[error("Invalid request code")] + InvalidRequestCode = 56, + #[error("Invalid slot")] + InvalidSlot = 57, + #[error("Bad font file format")] + BadFontFileFormat = 59, + #[error("Device not a stream")] + DeviceNotAStream = 60, + #[error("No data available")] + NoDataAvailable = 61, + #[error("Timer expired")] + TimerExpired = 62, + #[error("Out of streams resources")] + OutOfStreamsResources = 63, + #[error("Machine is not on the network")] + MachineNotOnNetwork = 64, + #[error("Package not installed")] + PackageNotInstalled = 65, + #[error("Object is remote")] + ObjectRemote = 66, + #[error("Link has been severed")] + LinkSevered = 67, + #[error("Advertise error")] + AdvertiseError = 68, + #[error("Srmount error")] + SrmountError = 69, + #[error("Communication error on send")] + CommunicationErrorOnSend = 70, + #[error("Protocol error")] + ProtocolError = 71, + #[error("Multihop attempted")] + MultihopAttempted = 72, + #[error("RFS specific error")] + RfsSpecificError = 73, + #[error("Not a data message")] + NotADataMessage = 74, + #[error("Value too large for defined data type")] + ValueTooLarge = 75, + #[error("Name not unique on network")] + NameNotUniqueOnNetwork = 76, + #[error("File descriptor in bad state")] + FileDescriptorInBadState = 77, + #[error("Remote address changed")] + RemoteAddressChanged = 78, + #[error("Can not access a needed shared library")] + CanNotAccessSharedLibrary = 79, + #[error("Accessing a corrupted shared library")] + CorruptedSharedLibrary = 80, + #[error(".lib section in a.out corrupted")] + LibSectionCorrupted = 81, + #[error("Attempting to link in too many shared libraries")] + TooManySharedLibraries = 82, + #[error("Cannot exec a shared library directly")] + CannotExecASharedLibraryDirectly = 83, + #[error("Illegal byte sequence")] + IllegalByteSequence = 84, + #[error("Interrupted system call should be restarted")] + RestartInterruptedSystemCall = 85, + #[error("Streams pipe error")] + StreamsPipeError = 86, + #[error("Too many users")] + TooManyUsers = 87, + #[error("Socket operation on non-socket")] + SocketOperationOnNonSocket = 88, + #[error("Destination address required")] + DestinationAddressRequired = 89, + #[error("Message too long")] + MessageTooLong = 90, + #[error("Protocol wrong type for socket")] + ProtocolWrongTypeForSocket = 91, + #[error("Protocol not available")] + ProtocolNotAvailable = 92, + #[error("Protocol not supported")] + ProtocolNotSupported = 93, + #[error("Socket type not supported")] + SocketTypeNotSupported = 94, + #[error("Operation not supported on transport endpoint")] + OperationNotSupportedOnTransportEndpoint = 95, + #[error("Protocol family not supported")] + ProtocolFamilyNotSupported = 96, + #[error("Address family not supported by protocol")] + AddressFamilyNotSupportedByProtocol = 97, + #[error("Address already in use")] + AddressAlreadyInUse = 98, + #[error("Cannot assign requested address")] + CannotAssignRequestedAddress = 99, + #[error("Network is down")] + NetworkDown = 100, + #[error("Network is unreachable")] + NetworkUnreachable = 101, + #[error("Network dropped connection because of reset")] + ConnectionReset = 102, + #[error("Software caused connection abort")] + ConnectionAbort = 103, + #[error("Connection reset by peer")] + ConnectionResetByPeer = 104, + #[error("No buffer space available")] + NoBufferSpaceAvailable = 105, + #[error("Transport endpoint is already connected")] + TransportEndpointAlreadyConnected = 106, + #[error("Transport endpoint is not connected")] + TransportEndpointNotConnected = 107, + #[error("Cannot send after transport endpoint shutdown")] + CannotSendAfterTransportEndpointShutdown = 108, + #[error("Too many references: cannot splice")] + TooManyReferences = 109, + #[error("Connection timed out")] + ConnectionTimedOut = 110, + #[error("Connection refused")] + ConnectionRefused = 111, + #[error("Host is down")] + HostDown = 112, + #[error("No route to host")] + NoRouteToHost = 113, + #[error("Operation already in progress")] + OperationAlreadyInProgress = 114, + #[error("Operation now in progress")] + OperationNowInProgress = 115, + #[error("Stale file handle")] + StaleFileHandle = 116, + #[error("Structure needs cleaning")] + StructureNeedsCleaning = 117, + #[error("Not a XENIX named type file")] + NotXenixNamedTypeFile = 118, + #[error("No XENIX semaphores available")] + NoXenixSemaphoresAvailable = 119, + #[error("Is a named type file")] + NamedTypeFile = 120, + #[error("Remote I/O error")] + RemoteIoError = 121, + #[error("Quota exceeded")] + QuotaExceeded = 122, + #[error("No medium found")] + NoMediumFound = 123, + #[error("Wrong medium type")] + WrongMediumType = 124, + #[error("Operation Canceled")] + OperationCanceled = 125, + #[error("Required key not available")] + RequiredKeyNotAvailable = 126, + #[error("Key has expired")] + KeyExpired = 127, + #[error("Key has been revoked")] + KeyRevoked = 128, + #[error("Key was rejected by service")] + KeyRejectedByService = 129, + #[error("Owner died")] + OwnerDied = 130, + #[error("State not recoverable")] + StateNotRecoverable = 131, + #[error("Operation not possible due to RF-kill")] + OperationNotPossibleDueToRfKill = 132, + #[error("Memory page has hardware error")] + MemoryPageHardwareError = 133, +} \ No newline at end of file diff --git a/lib/ffmpeg_api/src/lib.rs b/lib/ffmpeg_api/src/lib.rs index 6efd89a..93636c3 100644 --- a/lib/ffmpeg_api/src/lib.rs +++ b/lib/ffmpeg_api/src/lib.rs @@ -1,5 +1,11 @@ +#[macro_use] +extern crate num_derive; + #[cfg(test)] mod tests; pub mod api; pub mod enums; +pub mod err; +pub mod err_ffi; +pub mod err_av; diff --git a/lib/media_time/Cargo.toml b/lib/media_time/Cargo.toml index 91c4c12..86e54af 100644 --- a/lib/media_time/Cargo.toml +++ b/lib/media_time/Cargo.toml @@ -8,4 +8,5 @@ edition = "2018" [dependencies] fraction = "0.6.2" -time = "0.2" \ No newline at end of file +time = "0.2" +thiserror = "1.0" \ No newline at end of file diff --git a/lib/media_time/src/errors.rs b/lib/media_time/src/errors.rs deleted file mode 100644 index 287ad3d..0000000 --- a/lib/media_time/src/errors.rs +++ /dev/null @@ -1,17 +0,0 @@ -use std::error; -use std::fmt; - -#[derive(Debug, Clone, Eq, PartialEq)] -pub struct TimeBaseError; - -impl fmt::Display for TimeBaseError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "invalid time base") - } -} - -impl error::Error for TimeBaseError { - fn source(&self) -> Option<&(dyn error::Error + 'static)> { - None - } -} diff --git a/lib/media_time/src/lib.rs b/lib/media_time/src/lib.rs index 9ddca6f..da4c561 100644 --- a/lib/media_time/src/lib.rs +++ b/lib/media_time/src/lib.rs @@ -1,8 +1,6 @@ #[cfg(test)] mod tests; -mod errors; mod media_time; -pub use errors::*; -pub use media_time::MediaTime; +pub use media_time::*; diff --git a/lib/media_time/src/media_time.rs b/lib/media_time/src/media_time.rs index 9d20231..e0c1cb0 100644 --- a/lib/media_time/src/media_time.rs +++ b/lib/media_time/src/media_time.rs @@ -1,15 +1,26 @@ -use crate::errors::TimeBaseError; use fraction::Fraction; +use thiserror::Error; -type Result<T> = std::result::Result<T, TimeBaseError>; +#[derive(Error, Debug)] +pub enum MediaTimeError { + #[error("missing numerator in timebase")] + TimebaseNumeratorMissing, + #[error("missing denominator in timebase")] + TimebaseDenominatorMissing, + #[error("invalid denominator in timebase")] + TimebaseDenominatorInvalid, +} #[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] pub struct MediaTime(time::Duration); impl MediaTime { - pub fn from_rational(timestamp: i64, base: Fraction) -> Result<MediaTime> { - let num: u64 = *base.numer().ok_or(TimeBaseError)?; - let den: u64 = *base.denom().ok_or(TimeBaseError)?; + pub fn from_rational(timestamp: i64, base: &Fraction) -> Result<MediaTime, MediaTimeError> { + let num: u64 = *base.numer().ok_or(MediaTimeError::TimebaseNumeratorMissing)?; + let den: u64 = *base.denom().ok_or(MediaTimeError::TimebaseDenominatorMissing)?; + if den == 0 { + return Err(MediaTimeError::TimebaseDenominatorInvalid) + } Ok(MediaTime(time::Duration::milliseconds( (1000 * timestamp as i128 * num as i128 / den as i128) as i64, diff --git a/lib/webvtt/Cargo.toml b/lib/webvtt/Cargo.toml index c665a7e..3c1e4ac 100644 --- a/lib/webvtt/Cargo.toml +++ b/lib/webvtt/Cargo.toml @@ -7,4 +7,5 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -media_time = { path = "../media_time" } \ No newline at end of file +media_time = { path = "../media_time" } +thiserror = "1.0" \ No newline at end of file diff --git a/lib/webvtt/src/webvtt.rs b/lib/webvtt/src/webvtt.rs index a1e8d0c..961ccf5 100644 --- a/lib/webvtt/src/webvtt.rs +++ b/lib/webvtt/src/webvtt.rs @@ -1,12 +1,12 @@ use std::fs::File; use std::io::prelude::*; use std::io::LineWriter; -use std::path::Path; +use std::path::{Path, PathBuf}; use std::string::String; -use media_time::MediaTime; +use thiserror::Error; -type Result<T> = std::result::Result<T, std::io::Error>; +use media_time::MediaTime; pub struct WebVTTFile { cues: Vec<WebVTTCue>, @@ -18,6 +18,12 @@ pub struct WebVTTCue { payload: String, } +#[derive(Error, Debug)] +pub enum WebVTTError { + #[error("Error saving file {0}")] + IoError(PathBuf, #[source] std::io::Error), +} + impl WebVTTFile { pub fn new() -> WebVTTFile { WebVTTFile { cues: Vec::new() } @@ -27,7 +33,7 @@ impl WebVTTFile { self.cues.push(cue); } - pub fn save(&self, path: impl AsRef<Path>) -> Result<()> { + fn save_impl(&self, path: &impl AsRef<Path>) -> Result<(), std::io::Error> { let file = File::create(path)?; let mut file = LineWriter::new(file); file.write_all(b"WEBVTT\n\n")?; @@ -37,6 +43,11 @@ impl WebVTTFile { file.flush()?; Ok(()) } + + pub fn save(&self, path: impl AsRef<Path>) -> Result<(), WebVTTError> { + self.save_impl(&path.as_ref()) + .map_err(|err| WebVTTError::IoError(path.as_ref().to_path_buf(), err)) + } } impl WebVTTCue { @@ -48,7 +59,7 @@ impl WebVTTCue { } } - fn save(&self, writer: &mut LineWriter<File>) -> Result<()> { + fn save(&self, writer: &mut LineWriter<File>) -> Result<(), std::io::Error> { writer.write_all(format!("{} --> {}\n", self.start, self.end).as_bytes())?; writer.write_all(self.payload.as_bytes())?; writer.write_all(b"\n\n")?; diff --git a/src/lib.rs b/src/lib.rs index 9c670f3..f9183fb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,7 +5,7 @@ pub mod stream_metadata; use std::path::Path; -use failure::{format_err, Error}; +use anyhow::format_err; use ffmpeg_api::api::*; use ffmpeg_api::enums::*; use image::ImageOutputFormat; @@ -20,12 +20,9 @@ pub fn extract( format: ImageOutputFormat, scaler: SwsScaler, flags: SwsFlags, -) -> Result<(), Error> { - let mut avformat_context = AVFormatContext::new() - .map_err(|error| format_err!("Could not open video input: {}", error))?; - avformat_context - .open_input(input_file) - .map_err(|error| format_err!("Could not open video input: {}", error))?; +) -> anyhow::Result<()> { + let mut avformat_context = AVFormatContext::new()?; + avformat_context.open_input(input_file)?; let duration = avformat_context.duration()?; let spritesheet_path = output_folder.join("spritesheets"); @@ -100,7 +97,7 @@ pub fn extract( .in_packet(&mut packet) .map_err(|error| format_err!("Could not load packet: {}", error))?; while codec_context.out_frame(&mut frame).is_ok() { - let timestamp = media_time::MediaTime::from_rational(frame.pts(), time_base)?; + let timestamp = media_time::MediaTime::from_rational(frame.pts(), &time_base)?; println!( "Frame {}: {} @ {}", diff --git a/src/main.rs b/src/main.rs index 448acb1..e954272 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,5 @@ use std::path::Path; -use failure::Error; use ffmpeg_api::enums::{SwsFlags, SwsScaler}; use image::ImageOutputFormat; use media_time::MediaTime; @@ -50,7 +49,7 @@ struct Options { fast_scaling: bool, } -fn main() -> Result<(), Error> { +fn main() -> anyhow::Result<()> { let options = Options::from_args(); let mut flags = SwsFlags::empty(); @@ -64,7 +63,7 @@ fn main() -> Result<(), Error> { flags |= SwsFlags::BIT_EXACT_SCALING; } - media_ingestion::extract( + if let Err(err) = media_ingestion::extract( options.max_size, options.num_horizontal, options.num_vertical, @@ -79,7 +78,9 @@ fn main() -> Result<(), Error> { }, options.scaler, flags, - )?; + ) { + eprintln!("Error: {}", err) + } Ok(()) } diff --git a/src/spritesheet.rs b/src/spritesheet.rs index dc69f6d..8ced576 100644 --- a/src/spritesheet.rs +++ b/src/spritesheet.rs @@ -2,7 +2,7 @@ use std::fs::File; use std::io::BufWriter; use std::path::PathBuf; -use failure::{bail, format_err, Error}; +use anyhow::{bail, format_err, Error}; use image::{DynamicImage, ImageOutputFormat, RgbImage}; use media_time::MediaTime; -- GitLab