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