diff --git a/.travis.yml b/.travis.yml index 616ccd0..c59c5a0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,10 +5,31 @@ rust: - beta - nightly +os: + - linux + - osx + +matrix: + allow_failures: + - rust: nightly + addons: apt: packages: + - build-essential - yasm -script: - - travis_wait cargo test --verbose --features build +dist: bionic + +cache: cargo + +before_install: + - rm -rf "$TRAVIS_HOME/.cargo/registry/src" + # Without rustfmt, bindgen puts everything on one line and any warnings dump so many logs they break Travis + # See https://github.com/rust-lang/rust-bindgen/issues/1600 + - rustup component add rustfmt + - if [[ $TRAVIS_OS_NAME == 'osx' ]]; then brew update; fi + - if [[ $TRAVIS_OS_NAME == 'osx' ]]; then brew install yasm; fi + +script: | + travis_wait cargo build --verbose --features "build" diff --git a/Cargo.toml b/Cargo.toml index 57d5f11..06314c4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ repository = "https://github.com/meh/rust-ffmpeg" keywords = ["audio", "video"] [features] -default = ["codec", "device", "filter", "format", "resampling", "software-resampling", "software-scaling"] +default = ["codec", "device", "filter", "format", "resampling", "software-scaling"] static = ["ffmpeg-sys/static"] build = ["static", "ffmpeg-sys/build"] @@ -81,19 +81,19 @@ codec = ["ffmpeg-sys/avcodec"] device = ["ffmpeg-sys/avdevice", "format"] filter = ["ffmpeg-sys/avfilter"] format = ["ffmpeg-sys/avformat", "codec"] -resampling = ["ffmpeg-sys/avresample"] +resampling = ["ffmpeg-sys/swresample"] postprocessing = ["ffmpeg-sys/postproc"] -software-resampling = ["ffmpeg-sys/swresample"] software-scaling = ["ffmpeg-sys/swscale", "codec"] [dependencies] libc = "0.2" -bitflags = "0.9" +bitflags = "1.0" [dependencies.image] -version = "0.12" +version = "0.23" optional = true [dependencies.ffmpeg-sys] -version = "3.3" +version = "4.2" default-features = false +path = "../ffmpeg-sys" diff --git a/examples/transcode-audio.rs b/examples/transcode-audio.rs index 0d416a1..7d5653a 100644 --- a/examples/transcode-audio.rs +++ b/examples/transcode-audio.rs @@ -40,7 +40,7 @@ fn filter( if let Some(codec) = encoder.codec() { if !codec .capabilities() - .contains(ffmpeg::codec::capabilities::VARIABLE_FRAME_SIZE) + .contains(ffmpeg::codec::capabilities::Capabilities::VARIABLE_FRAME_SIZE) { filter .get("out") @@ -66,16 +66,18 @@ fn transcoder>( path: &P, filter_spec: &str, ) -> Result { - let input = ictx.streams() + let input = ictx + .streams() .best(media::Type::Audio) .expect("could not find best audio stream"); let mut decoder = input.codec().decoder().audio()?; let codec = ffmpeg::encoder::find(octx.format().codec(path, media::Type::Audio)) .expect("failed to find encoder") .audio()?; - let global = octx.format() + let global = octx + .format() .flags() - .contains(ffmpeg::format::flag::GLOBAL_HEADER); + .contains(ffmpeg::format::flag::Flags::GLOBAL_HEADER); decoder.set_parameters(input.parameters())?; @@ -85,10 +87,10 @@ fn transcoder>( let channel_layout = codec .channel_layouts() .map(|cls| cls.best(decoder.channel_layout().channels())) - .unwrap_or(ffmpeg::channel_layout::STEREO); + .unwrap_or(ffmpeg::channel_layout::ChannelLayout::STEREO); if global { - encoder.set_flags(ffmpeg::codec::flag::GLOBAL_HEADER); + encoder.set_flags(ffmpeg::codec::flag::Flags::GLOBAL_HEADER); } encoder.set_rate(decoder.rate() as i32); diff --git a/src/codec/audio.rs b/src/codec/audio.rs index f2f5fdd..c323d33 100644 --- a/src/codec/audio.rs +++ b/src/codec/audio.rs @@ -121,7 +121,7 @@ impl ChannelLayoutIter { } pub fn best(self, max: i32) -> ChannelLayout { - self.fold(::channel_layout::MONO, |acc, cur| { + self.fold(::channel_layout::ChannelLayout::MONO, |acc, cur| { if cur.channels() > acc.channels() && cur.channels() <= max { cur } else { diff --git a/src/codec/capabilities.rs b/src/codec/capabilities.rs index 2a752de..82366ae 100644 --- a/src/codec/capabilities.rs +++ b/src/codec/capabilities.rs @@ -8,7 +8,6 @@ bitflags! { const TRUNCATED = AV_CODEC_CAP_TRUNCATED; const DELAY = AV_CODEC_CAP_DELAY; const SMALL_LAST_FRAME = AV_CODEC_CAP_SMALL_LAST_FRAME; - const HWACCEL_VDPAU = AV_CODEC_CAP_HWACCEL_VDPAU; const SUBFRAMES = AV_CODEC_CAP_SUBFRAMES; const EXPERIMENTAL = AV_CODEC_CAP_EXPERIMENTAL; const CHANNEL_CONF = AV_CODEC_CAP_CHANNEL_CONF; diff --git a/src/codec/context.rs b/src/codec/context.rs index d30dd82..6089538 100644 --- a/src/codec/context.rs +++ b/src/codec/context.rs @@ -11,13 +11,13 @@ use {Codec, Error}; pub struct Context { ptr: *mut AVCodecContext, - owner: Option>, + owner: Option>, } unsafe impl Send for Context {} impl Context { - pub unsafe fn wrap(ptr: *mut AVCodecContext, owner: Option>) -> Self { + pub unsafe fn wrap(ptr: *mut AVCodecContext, owner: Option>) -> Self { Context { ptr: ptr, owner: owner, diff --git a/src/codec/debug.rs b/src/codec/debug.rs index 1b45c74..2a9636e 100644 --- a/src/codec/debug.rs +++ b/src/codec/debug.rs @@ -8,16 +8,15 @@ bitflags! { const BITSTREAM = FF_DEBUG_BITSTREAM; const MB_TYPE = FF_DEBUG_MB_TYPE; const QP = FF_DEBUG_QP; - const MV = FF_DEBUG_MV; const DCT_COEFF = FF_DEBUG_DCT_COEFF; const SKIP = FF_DEBUG_SKIP; const STARTCODE = FF_DEBUG_STARTCODE; - const PTS = FF_DEBUG_PTS; const ER = FF_DEBUG_ER; const MMCO = FF_DEBUG_MMCO; const BUGS = FF_DEBUG_BUGS; - const VIS_QP = FF_DEBUG_VIS_QP; - const VIS_MB_TYPE = FF_DEBUG_VIS_MB_TYPE; + // TODO They are under #if in avcodec.h + // const VIS_QP = FF_DEBUG_VIS_QP; + // const VIS_MB_TYPE = FF_DEBUG_VIS_MB_TYPE; const BUFFERS = FF_DEBUG_BUFFERS; const THREADS = FF_DEBUG_THREADS; const NOMC = FF_DEBUG_NOMC; diff --git a/src/codec/encoder/audio.rs b/src/codec/encoder/audio.rs index 8e07a59..215f8b2 100644 --- a/src/codec/encoder/audio.rs +++ b/src/codec/encoder/audio.rs @@ -193,6 +193,12 @@ impl Deref for Encoder { } } +impl DerefMut for Encoder { + fn deref_mut(&mut self) -> &mut ::Target { + &mut self.0 + } +} + impl AsRef for Encoder { fn as_ref(&self) -> &Context { self diff --git a/src/codec/encoder/encoder.rs b/src/codec/encoder/encoder.rs index edcd527..5d1fa8d 100644 --- a/src/codec/encoder/encoder.rs +++ b/src/codec/encoder/encoder.rs @@ -2,7 +2,7 @@ use std::ops::{Deref, DerefMut}; use super::{audio, subtitle, video}; use codec::Context; -use libc::{c_int, int64_t}; +use libc::c_int; use {media, Error, Rational}; pub struct Encoder(pub Context); @@ -58,13 +58,13 @@ impl Encoder { pub fn set_bit_rate(&mut self, value: usize) { unsafe { - (*self.as_mut_ptr()).bit_rate = value as int64_t; + (*self.as_mut_ptr()).bit_rate = value as i64; } } pub fn set_max_bit_rate(&mut self, value: usize) { unsafe { - (*self.as_mut_ptr()).rc_max_rate = value as int64_t; + (*self.as_mut_ptr()).rc_max_rate = value as i64; } } diff --git a/src/codec/id.rs b/src/codec/id.rs index 28e923b..430415a 100644 --- a/src/codec/id.rs +++ b/src/codec/id.rs @@ -95,6 +95,7 @@ pub enum Id { MMVIDEO, ZMBV, AVS, + AVS2, SMACKVIDEO, NUV, KMVC, @@ -231,7 +232,7 @@ pub enum Id { YLC, // various PCM "codecs" - PCM_S16LE, + // PCM_S16LE, PCM_S16BE, PCM_U16LE, PCM_U16BE, @@ -298,7 +299,6 @@ pub enum Id { ADPCM_G722, ADPCM_IMA_APC, ADPCM_VIMA, - VIMA, ADPCM_AFC, ADPCM_IMA_OKI, @@ -397,6 +397,7 @@ pub enum Id { PAF_AUDIO, ON2AVC, DSS_SP, + CODEC2, FFWAVESYNTH, SONIC, @@ -414,7 +415,7 @@ pub enum Id { DST, // subtitle codecs - DVD_SUBTITLE, + // DVD_SUBTITLE, DVB_SUBTITLE, TEXT, XSUB, @@ -441,8 +442,6 @@ pub enum Id { HDMV_TEXT_SUBTITLE, // other specific kind of codecs (generally used for attachments) - TTF, - SCTE_35, BINTEXT, XBIN, @@ -481,6 +480,19 @@ pub enum Id { FITS, GREMLIN_DPCM, DOLBY_E, + APTX, + APTX_HD, + SBC, + + IMM4, + PROSUMER, + MWSC, + WCMV, + RASC, + PCM_VIDC, + ATRAC9, + + TTML, } impl Id { @@ -495,6 +507,7 @@ impl Id { impl From for Id { fn from(value: AVCodecID) -> Self { + #[allow(unreachable_patterns)] match value { AV_CODEC_ID_NONE => Id::None, @@ -583,6 +596,7 @@ impl From for Id { AV_CODEC_ID_MMVIDEO => Id::MMVIDEO, AV_CODEC_ID_ZMBV => Id::ZMBV, AV_CODEC_ID_AVS => Id::AVS, + AV_CODEC_ID_AVS2 => Id::AVS2, AV_CODEC_ID_SMACKVIDEO => Id::SMACKVIDEO, AV_CODEC_ID_NUV => Id::NUV, AV_CODEC_ID_KMVC => Id::KMVC, @@ -717,7 +731,7 @@ impl From for Id { AV_CODEC_ID_YLC => Id::YLC, /* various PCM "codecs" */ - AV_CODEC_ID_PCM_S16LE => Id::PCM_S16LE, + // AV_CODEC_ID_PCM_S16LE => Id::PCM_S16LE, AV_CODEC_ID_PCM_S16BE => Id::PCM_S16BE, AV_CODEC_ID_PCM_U16LE => Id::PCM_U16LE, AV_CODEC_ID_PCM_U16BE => Id::PCM_U16BE, @@ -752,6 +766,9 @@ impl From for Id { AV_CODEC_ID_PCM_S64LE => Id::PCM_S64LE, AV_CODEC_ID_PCM_S64BE => Id::PCM_S64BE, + AV_CODEC_ID_PCM_VIDC => Id::PCM_VIDC, + AV_CODEC_ID_ATRAC9 => Id::ATRAC9, + /* various ADPCM codecs */ AV_CODEC_ID_ADPCM_IMA_QT => Id::ADPCM_IMA_QT, AV_CODEC_ID_ADPCM_IMA_WAV => Id::ADPCM_IMA_WAV, @@ -882,6 +899,7 @@ impl From for Id { AV_CODEC_ID_PAF_AUDIO => Id::PAF_AUDIO, AV_CODEC_ID_ON2AVC => Id::ON2AVC, AV_CODEC_ID_DSS_SP => Id::DSS_SP, + AV_CODEC_ID_CODEC2 => Id::CODEC2, AV_CODEC_ID_FFWAVESYNTH => Id::FFWAVESYNTH, AV_CODEC_ID_SONIC => Id::SONIC, @@ -899,7 +917,7 @@ impl From for Id { AV_CODEC_ID_DST => Id::DST, /* subtitle codecs */ - AV_CODEC_ID_DVD_SUBTITLE => Id::DVD_SUBTITLE, + // AV_CODEC_ID_DVD_SUBTITLE => Id::DVD_SUBTITLE, AV_CODEC_ID_DVB_SUBTITLE => Id::DVB_SUBTITLE, AV_CODEC_ID_TEXT => Id::TEXT, AV_CODEC_ID_XSUB => Id::XSUB, @@ -926,7 +944,6 @@ impl From for Id { AV_CODEC_ID_HDMV_TEXT_SUBTITLE => Id::HDMV_TEXT_SUBTITLE, /* other specific kind of codecs (generally used for attachments) */ - AV_CODEC_ID_TTF => Id::TTF, AV_CODEC_ID_SCTE_35 => Id::SCTE_35, AV_CODEC_ID_BINTEXT => Id::BINTEXT, @@ -965,6 +982,18 @@ impl From for Id { AV_CODEC_ID_FITS => Id::FITS, AV_CODEC_ID_GREMLIN_DPCM => Id::GREMLIN_DPCM, AV_CODEC_ID_DOLBY_E => Id::DOLBY_E, + AV_CODEC_ID_APTX => Id::APTX, + AV_CODEC_ID_APTX_HD => Id::APTX_HD, + AV_CODEC_ID_SBC => Id::SBC, + + AV_CODEC_ID_IMM4 => Id::IMM4, + AV_CODEC_ID_PROSUMER => Id::PROSUMER, + AV_CODEC_ID_MWSC => Id::MWSC, + AV_CODEC_ID_WCMV => Id::WCMV, + AV_CODEC_ID_RASC => Id::RASC, + AV_CODEC_ID_TTML => Id::TTML, + + _ => unimplemented!(), } } } @@ -1059,6 +1088,7 @@ impl Into for Id { Id::MMVIDEO => AV_CODEC_ID_MMVIDEO, Id::ZMBV => AV_CODEC_ID_ZMBV, Id::AVS => AV_CODEC_ID_AVS, + Id::AVS2 => AV_CODEC_ID_AVS2, Id::SMACKVIDEO => AV_CODEC_ID_SMACKVIDEO, Id::NUV => AV_CODEC_ID_NUV, Id::KMVC => AV_CODEC_ID_KMVC, @@ -1195,7 +1225,6 @@ impl Into for Id { Id::YLC => AV_CODEC_ID_YLC, /* various PCM "codecs" */ - Id::PCM_S16LE => AV_CODEC_ID_PCM_S16LE, Id::PCM_S16BE => AV_CODEC_ID_PCM_S16BE, Id::PCM_U16LE => AV_CODEC_ID_PCM_U16LE, Id::PCM_U16BE => AV_CODEC_ID_PCM_U16BE, @@ -1262,7 +1291,6 @@ impl Into for Id { Id::ADPCM_G722 => AV_CODEC_ID_ADPCM_G722, Id::ADPCM_IMA_APC => AV_CODEC_ID_ADPCM_IMA_APC, Id::ADPCM_VIMA => AV_CODEC_ID_ADPCM_VIMA, - Id::VIMA => AV_CODEC_ID_VIMA, Id::ADPCM_AFC => AV_CODEC_ID_ADPCM_AFC, Id::ADPCM_IMA_OKI => AV_CODEC_ID_ADPCM_IMA_OKI, @@ -1361,6 +1389,7 @@ impl Into for Id { Id::PAF_AUDIO => AV_CODEC_ID_PAF_AUDIO, Id::ON2AVC => AV_CODEC_ID_ON2AVC, Id::DSS_SP => AV_CODEC_ID_DSS_SP, + Id::CODEC2 => AV_CODEC_ID_CODEC2, Id::FFWAVESYNTH => AV_CODEC_ID_FFWAVESYNTH, Id::SONIC => AV_CODEC_ID_SONIC, @@ -1378,8 +1407,8 @@ impl Into for Id { Id::DST => AV_CODEC_ID_DST, /* subtitle codecs */ - Id::DVD_SUBTITLE => AV_CODEC_ID_DVD_SUBTITLE, Id::DVB_SUBTITLE => AV_CODEC_ID_DVB_SUBTITLE, + Id::TEXT => AV_CODEC_ID_TEXT, Id::XSUB => AV_CODEC_ID_XSUB, Id::SSA => AV_CODEC_ID_SSA, @@ -1405,8 +1434,6 @@ impl Into for Id { Id::HDMV_TEXT_SUBTITLE => AV_CODEC_ID_HDMV_TEXT_SUBTITLE, /* other specific kind of codecs (generally used for attachments) */ - Id::TTF => AV_CODEC_ID_TTF, - Id::SCTE_35 => AV_CODEC_ID_SCTE_35, Id::BINTEXT => AV_CODEC_ID_BINTEXT, Id::XBIN => AV_CODEC_ID_XBIN, @@ -1445,6 +1472,18 @@ impl Into for Id { Id::FITS => AV_CODEC_ID_FITS, Id::GREMLIN_DPCM => AV_CODEC_ID_GREMLIN_DPCM, Id::DOLBY_E => AV_CODEC_ID_DOLBY_E, + Id::APTX => AV_CODEC_ID_APTX, + Id::APTX_HD => AV_CODEC_ID_APTX_HD, + Id::SBC => AV_CODEC_ID_SBC, + + Id::IMM4 => AV_CODEC_ID_IMM4, + Id::PROSUMER => AV_CODEC_ID_PROSUMER, + Id::MWSC => AV_CODEC_ID_MWSC, + Id::WCMV => AV_CODEC_ID_WCMV, + Id::RASC => AV_CODEC_ID_RASC, + Id::PCM_VIDC => AV_CODEC_ID_PCM_VIDC, + Id::ATRAC9 => AV_CODEC_ID_ATRAC9, + Id::TTML => AV_CODEC_ID_TTML, } } } diff --git a/src/codec/packet/packet.rs b/src/codec/packet/packet.rs index a63bf9c..c2649c5 100644 --- a/src/codec/packet/packet.rs +++ b/src/codec/packet/packet.rs @@ -2,7 +2,7 @@ use std::marker::PhantomData; use std::mem; use std::slice; -use super::{flag, Borrow, Flags, Mut, Ref, SideData}; +use super::{Borrow, Flags, Mut, Ref, SideData}; use ffi::*; use libc::c_int; use {format, Error, Rational}; @@ -99,12 +99,12 @@ impl Packet { #[inline] pub fn is_key(&self) -> bool { - self.flags().contains(flag::KEY) + self.flags().contains(Flags::KEY) } #[inline] pub fn is_corrupt(&self) -> bool { - self.flags().contains(flag::CORRUPT) + self.flags().contains(Flags::CORRUPT) } #[inline] diff --git a/src/codec/packet/side_data.rs b/src/codec/packet/side_data.rs index 6dd5cb5..9d389cd 100644 --- a/src/codec/packet/side_data.rs +++ b/src/codec/packet/side_data.rs @@ -33,10 +33,16 @@ pub enum Type { ContentLightLevel, A53CC, + + EncryptionInitInfo, + EncryptionInfo, + + AFD, } impl From for Type { fn from(value: AVPacketSideDataType) -> Self { + #[allow(unreachable_patterns)] match value { AV_PKT_DATA_PALETTE => Type::Palette, AV_PKT_DATA_NEW_EXTRADATA => Type::NewExtraData, @@ -64,6 +70,11 @@ impl From for Type { AV_PKT_DATA_CONTENT_LIGHT_LEVEL => Type::ContentLightLevel, AV_PKT_DATA_A53_CC => Type::A53CC, + AV_PKT_DATA_ENCRYPTION_INIT_INFO => Type::EncryptionInitInfo, + AV_PKT_DATA_ENCRYPTION_INFO => Type::EncryptionInfo, + AV_PKT_DATA_AFD => Type::AFD, + + _ => unimplemented!(), } } } @@ -97,6 +108,9 @@ impl Into for Type { Type::ContentLightLevel => AV_PKT_DATA_CONTENT_LIGHT_LEVEL, Type::A53CC => AV_PKT_DATA_A53_CC, + Type::EncryptionInitInfo => AV_PKT_DATA_ENCRYPTION_INIT_INFO, + Type::EncryptionInfo => AV_PKT_DATA_ENCRYPTION_INFO, + Type::AFD => AV_PKT_DATA_AFD, } } } diff --git a/src/codec/parameters.rs b/src/codec/parameters.rs index 2ce5b9d..115b33f 100644 --- a/src/codec/parameters.rs +++ b/src/codec/parameters.rs @@ -6,13 +6,13 @@ use media; pub struct Parameters { ptr: *mut AVCodecParameters, - owner: Option>, + owner: Option>, } unsafe impl Send for Parameters {} impl Parameters { - pub unsafe fn wrap(ptr: *mut AVCodecParameters, owner: Option>) -> Self { + pub unsafe fn wrap(ptr: *mut AVCodecParameters, owner: Option>) -> Self { Parameters { ptr: ptr, owner: owner, diff --git a/src/codec/subtitle/mod.rs b/src/codec/subtitle/mod.rs index 7d697c4..d502d25 100644 --- a/src/codec/subtitle/mod.rs +++ b/src/codec/subtitle/mod.rs @@ -12,7 +12,7 @@ use std::mem; use ffi::AVSubtitleType::*; use ffi::*; -use libc::{c_uint, size_t, uint32_t}; +use libc::{c_uint, size_t}; #[derive(Eq, PartialEq, Clone, Copy, Debug)] pub enum Type { @@ -77,7 +77,7 @@ impl Subtitle { } pub fn set_start(&mut self, value: u32) { - self.0.start_display_time = value as uint32_t; + self.0.start_display_time = value as u32; } pub fn end(&self) -> u32 { @@ -85,7 +85,7 @@ impl Subtitle { } pub fn set_end(&mut self, value: u32) { - self.0.end_display_time = value as uint32_t; + self.0.end_display_time = value as u32; } pub fn rects(&self) -> RectIter { @@ -147,9 +147,9 @@ impl<'a> Iterator for RectIter<'a> { None } else { self.cur += 1; - Some(Rect::wrap(*(*self.ptr) - .rects - .offset((self.cur - 1) as isize))) + Some(Rect::wrap( + *(*self.ptr).rects.offset((self.cur - 1) as isize), + )) } } } @@ -191,9 +191,9 @@ impl<'a> Iterator for RectMutIter<'a> { None } else { self.cur += 1; - Some(RectMut::wrap(*(*self.ptr) - .rects - .offset((self.cur - 1) as isize))) + Some(RectMut::wrap( + *(*self.ptr).rects.offset((self.cur - 1) as isize), + )) } } } diff --git a/src/filter/filter.rs b/src/filter/filter.rs index fa0ff92..67f8ec6 100644 --- a/src/filter/filter.rs +++ b/src/filter/filter.rs @@ -6,11 +6,11 @@ use super::{Flags, Pad}; use ffi::*; pub struct Filter { - ptr: *mut AVFilter, + ptr: *const AVFilter, } impl Filter { - pub unsafe fn wrap(ptr: *mut AVFilter) -> Self { + pub unsafe fn wrap(ptr: *const AVFilter) -> Self { Filter { ptr: ptr } } @@ -19,7 +19,7 @@ impl Filter { } pub unsafe fn as_mut_ptr(&mut self) -> *mut AVFilter { - self.ptr + self.ptr as *mut _ } } diff --git a/src/format/format/flag.rs b/src/format/format/flag.rs index 3309d32..c69544f 100644 --- a/src/format/format/flag.rs +++ b/src/format/format/flag.rs @@ -6,7 +6,6 @@ bitflags! { const NO_FILE = AVFMT_NOFILE; const NEED_NUMBER = AVFMT_NEEDNUMBER; const SHOW_IDS = AVFMT_SHOW_IDS; - const RAW_PICTURE = AVFMT_RAWPICTURE; const GLOBAL_HEADER = AVFMT_GLOBALHEADER; const NO_TIMESTAMPS = AVFMT_NOTIMESTAMPS; const GENERIC_INDEX = AVFMT_GENERIC_INDEX; diff --git a/src/software/mod.rs b/src/software/mod.rs index c6c08a8..9de5e96 100644 --- a/src/software/mod.rs +++ b/src/software/mod.rs @@ -28,14 +28,14 @@ pub fn converter( output, width, height, - scaling::flag::FAST_BILINEAR, + scaling::flag::Flags::FAST_BILINEAR, ) } -#[cfg(feature = "software-resampling")] +#[cfg(feature = "resampling")] pub mod resampling; -#[cfg(feature = "software-resampling")] +#[cfg(feature = "resampling")] #[inline] pub fn resampler( (in_format, in_layout, in_rate): (::format::Sample, ::ChannelLayout, u32), diff --git a/src/software/resampling/context.rs b/src/software/resampling/context.rs index edf7d9c..67a7c21 100644 --- a/src/software/resampling/context.rs +++ b/src/software/resampling/context.rs @@ -2,7 +2,7 @@ use std::ptr; use super::Delay; use ffi::*; -use libc::{c_int, int64_t}; +use libc::c_int; use util::format; use {frame, ChannelLayout, Error}; @@ -47,10 +47,10 @@ impl Context { unsafe { let ptr = swr_alloc_set_opts( ptr::null_mut(), - dst_channel_layout.bits() as int64_t, + dst_channel_layout.bits() as i64, dst_format.into(), dst_rate as c_int, - src_channel_layout.bits() as int64_t, + src_channel_layout.bits() as i64, src_format.into(), src_rate as c_int, 0, diff --git a/src/software/scaling/context.rs b/src/software/scaling/context.rs index 4c73280..77cd331 100644 --- a/src/software/scaling/context.rs +++ b/src/software/scaling/context.rs @@ -128,7 +128,8 @@ impl Context { } pub fn run(&mut self, input: &frame::Video, output: &mut frame::Video) -> Result<(), Error> { - if input.format() != self.input.format || input.width() != self.input.width + if input.format() != self.input.format + || input.width() != self.input.width || input.height() != self.input.height { return Err(Error::InputChanged); @@ -140,7 +141,8 @@ impl Context { } } - if output.format() != self.output.format || output.width() != self.output.width + if output.format() != self.output.format + || output.width() != self.output.width || output.height() != self.output.height { return Err(Error::OutputChanged); @@ -153,7 +155,7 @@ impl Context { (*input.as_ptr()).linesize.as_ptr() as *const _, 0, self.output.height as c_int, - (*output.as_mut_ptr()).data.as_ptr() as *const *const _, + (*output.as_mut_ptr()).data.as_ptr() as *const *mut _, (*output.as_mut_ptr()).linesize.as_ptr() as *mut _, ); } diff --git a/src/software/scaling/extensions.rs b/src/software/scaling/extensions.rs index 2079713..94faf33 100644 --- a/src/software/scaling/extensions.rs +++ b/src/software/scaling/extensions.rs @@ -1,4 +1,4 @@ -use super::{flag, Context, Flags}; +use super::{Context, Flags}; use util::format; use {decoder, frame, Error, Picture}; @@ -25,7 +25,7 @@ impl<'a> Picture<'a> { format, self.width(), self.height(), - flag::FAST_BILINEAR, + Flags::FAST_BILINEAR, ) } } @@ -53,7 +53,7 @@ impl frame::Video { format, self.width(), self.height(), - flag::FAST_BILINEAR, + Flags::FAST_BILINEAR, ) } } @@ -81,7 +81,7 @@ impl decoder::Video { format, self.width(), self.height(), - flag::FAST_BILINEAR, + Flags::FAST_BILINEAR, ) } } diff --git a/src/util/color/primaries.rs b/src/util/color/primaries.rs index a9d2655..149d28b 100644 --- a/src/util/color/primaries.rs +++ b/src/util/color/primaries.rs @@ -18,7 +18,7 @@ pub enum Primaries { SMPTE428, SMPTE431, SMPTE432, - JEDEC_P22, + EBU3213, } impl From for Primaries { @@ -40,7 +40,7 @@ impl From for Primaries { AVCOL_PRI_SMPTE428 => Primaries::SMPTE428, AVCOL_PRI_SMPTE431 => Primaries::SMPTE431, AVCOL_PRI_SMPTE432 => Primaries::SMPTE432, - AVCOL_PRI_JEDEC_P22 => Primaries::JEDEC_P22, + AVCOL_PRI_EBU3213 => Primaries::EBU3213, } } } @@ -63,7 +63,7 @@ impl Into for Primaries { Primaries::SMPTE428 => AVCOL_PRI_SMPTE428, Primaries::SMPTE431 => AVCOL_PRI_SMPTE431, Primaries::SMPTE432 => AVCOL_PRI_SMPTE432, - Primaries::JEDEC_P22 => AVCOL_PRI_JEDEC_P22, + Primaries::EBU3213 => AVCOL_PRI_EBU3213, } } } diff --git a/src/util/color/space.rs b/src/util/color/space.rs index 33f80b3..98e6ef7 100644 --- a/src/util/color/space.rs +++ b/src/util/color/space.rs @@ -14,7 +14,6 @@ pub enum Space { BT470BG, SMPTE170M, SMPTE240M, - YCOCG, YCGCO, BT2020NCL, BT2020CL, @@ -35,6 +34,7 @@ impl Space { impl From for Space { fn from(value: AVColorSpace) -> Self { + #[allow(unreachable_patterns)] match value { AVCOL_SPC_RGB => Space::RGB, AVCOL_SPC_BT709 => Space::BT709, @@ -44,7 +44,7 @@ impl From for Space { AVCOL_SPC_BT470BG => Space::BT470BG, AVCOL_SPC_SMPTE170M => Space::SMPTE170M, AVCOL_SPC_SMPTE240M => Space::SMPTE240M, - AVCOL_SPC_YCOCG => Space::YCOCG, + AVCOL_SPC_YCGCO => Space::YCGCO, AVCOL_SPC_BT2020_NCL => Space::BT2020NCL, AVCOL_SPC_BT2020_CL => Space::BT2020CL, AVCOL_SPC_SMPTE2085 => Space::SMPTE2085, @@ -53,6 +53,8 @@ impl From for Space { AVCOL_SPC_CHROMA_DERIVED_NCL => Space::ChromaDerivedNCL, AVCOL_SPC_CHROMA_DERIVED_CL => Space::ChromaDerivedCL, AVCOL_SPC_ICTCP => Space::ICTCP, + + _ => unimplemented!(), } } } @@ -68,7 +70,6 @@ impl Into for Space { Space::BT470BG => AVCOL_SPC_BT470BG, Space::SMPTE170M => AVCOL_SPC_SMPTE170M, Space::SMPTE240M => AVCOL_SPC_SMPTE240M, - Space::YCOCG => AVCOL_SPC_YCOCG, Space::YCGCO => AVCOL_SPC_YCGCO, Space::BT2020NCL => AVCOL_SPC_BT2020_NCL, Space::BT2020CL => AVCOL_SPC_BT2020_CL, diff --git a/src/util/error.rs b/src/util/error.rs index eb86a70..2c41c62 100644 --- a/src/util/error.rs +++ b/src/util/error.rs @@ -2,6 +2,7 @@ use std::error; use std::ffi::CStr; use std::fmt; use std::io; +use std::os::raw::c_char; use std::str::from_utf8_unchecked; use ffi::*; @@ -166,8 +167,8 @@ fn index(error: &Error) -> usize { } // XXX: the length has to be synced with the number of errors -static mut STRINGS: [[i8; AV_ERROR_MAX_STRING_SIZE as usize]; 27] = - [[0i8; AV_ERROR_MAX_STRING_SIZE as usize]; 27]; +static mut STRINGS: [[c_char; AV_ERROR_MAX_STRING_SIZE as usize]; 27] = + [[0; AV_ERROR_MAX_STRING_SIZE as usize]; 27]; pub fn register_all() { unsafe { diff --git a/src/util/format/pixel.rs b/src/util/format/pixel.rs index c415f36..28e6e10 100644 --- a/src/util/format/pixel.rs +++ b/src/util/format/pixel.rs @@ -47,6 +47,10 @@ pub enum Pixel { GRAY16BE, GRAY16LE, + GRAY14BE, + GRAY14LE, + GRAYF32BE, + GRAYF32LE, YUV440P, YUVJ440P, YUVA420P, @@ -113,7 +117,6 @@ pub enum Pixel { YUV444P10LE, YUV422P9BE, YUV422P9LE, - VDA_VLD, GBRP, GBRP9BE, @@ -157,8 +160,6 @@ pub enum Pixel { YVYU422, - VDA, - YA16BE, YA16LE, @@ -220,11 +221,7 @@ pub enum Pixel { VIDEOTOOLBOX, // --- defaults - #[cfg(feature = "ff_api_xvmc")] XVMC, - Y400A, - GRAY8A, - GBR24P, RGB32, RGB32_1, @@ -310,6 +307,7 @@ pub enum Pixel { GBRAPF32BE, GBRAPF32LE, DRM_PRIME, + OPENCL, } #[derive(Clone, Copy, PartialEq, Eq)] @@ -355,6 +353,7 @@ impl Descriptor { impl From for Pixel { #[inline] fn from(value: AVPixelFormat) -> Self { + #[allow(unreachable_patterns)] match value { AV_PIX_FMT_NONE => Pixel::None, @@ -395,6 +394,10 @@ impl From for Pixel { AV_PIX_FMT_GRAY16BE => Pixel::GRAY16BE, AV_PIX_FMT_GRAY16LE => Pixel::GRAY16LE, + AV_PIX_FMT_GRAY14BE => Pixel::GRAY14BE, + AV_PIX_FMT_GRAY14LE => Pixel::GRAY14LE, + AV_PIX_FMT_GRAYF32BE => Pixel::GRAYF32BE, + AV_PIX_FMT_GRAYF32LE => Pixel::GRAYF32LE, AV_PIX_FMT_YUV440P => Pixel::YUV440P, AV_PIX_FMT_YUVJ440P => Pixel::YUVJ440P, AV_PIX_FMT_YUVA420P => Pixel::YUVA420P, @@ -459,7 +462,6 @@ impl From for Pixel { AV_PIX_FMT_YUV444P10LE => Pixel::YUV444P10LE, AV_PIX_FMT_YUV422P9BE => Pixel::YUV422P9BE, AV_PIX_FMT_YUV422P9LE => Pixel::YUV422P9LE, - AV_PIX_FMT_VDA_VLD => Pixel::VDA_VLD, AV_PIX_FMT_GBRP => Pixel::GBRP, AV_PIX_FMT_GBRP9BE => Pixel::GBRP9BE, @@ -503,8 +505,6 @@ impl From for Pixel { AV_PIX_FMT_YVYU422 => Pixel::YVYU422, - AV_PIX_FMT_VDA => Pixel::VDA, - AV_PIX_FMT_YA16BE => Pixel::YA16BE, AV_PIX_FMT_YA16LE => Pixel::YA16LE, @@ -565,6 +565,8 @@ impl From for Pixel { AV_PIX_FMT_VIDEOTOOLBOX => Pixel::VIDEOTOOLBOX, + AV_PIX_FMT_XVMC => Pixel::XVMC, + AV_PIX_FMT_P010LE => Pixel::P010LE, AV_PIX_FMT_P010BE => Pixel::P010BE, AV_PIX_FMT_GBRAP12BE => Pixel::GBRAP12BE, @@ -589,6 +591,9 @@ impl From for Pixel { AV_PIX_FMT_GBRAPF32BE => Pixel::GBRAPF32BE, AV_PIX_FMT_GBRAPF32LE => Pixel::GBRAPF32LE, AV_PIX_FMT_DRM_PRIME => Pixel::DRM_PRIME, + AV_PIX_FMT_OPENCL => Pixel::OPENCL, + + _ => unimplemented!(), } } } @@ -636,6 +641,10 @@ impl Into for Pixel { Pixel::GRAY16BE => AV_PIX_FMT_GRAY16BE, Pixel::GRAY16LE => AV_PIX_FMT_GRAY16LE, + Pixel::GRAY14BE => AV_PIX_FMT_GRAY14BE, + Pixel::GRAY14LE => AV_PIX_FMT_GRAY14LE, + Pixel::GRAYF32BE => AV_PIX_FMT_GRAYF32BE, + Pixel::GRAYF32LE => AV_PIX_FMT_GRAYF32LE, Pixel::YUV440P => AV_PIX_FMT_YUV440P, Pixel::YUVJ440P => AV_PIX_FMT_YUVJ440P, Pixel::YUVA420P => AV_PIX_FMT_YUVA420P, @@ -702,7 +711,6 @@ impl Into for Pixel { Pixel::YUV444P10LE => AV_PIX_FMT_YUV444P10LE, Pixel::YUV422P9BE => AV_PIX_FMT_YUV422P9BE, Pixel::YUV422P9LE => AV_PIX_FMT_YUV422P9LE, - Pixel::VDA_VLD => AV_PIX_FMT_VDA_VLD, Pixel::GBRP => AV_PIX_FMT_GBRP, Pixel::GBRP9BE => AV_PIX_FMT_GBRP9BE, @@ -746,8 +754,6 @@ impl Into for Pixel { Pixel::YVYU422 => AV_PIX_FMT_YVYU422, - Pixel::VDA => AV_PIX_FMT_VDA, - Pixel::YA16BE => AV_PIX_FMT_YA16BE, Pixel::YA16LE => AV_PIX_FMT_YA16LE, @@ -810,9 +816,6 @@ impl Into for Pixel { // --- defaults Pixel::XVMC => AV_PIX_FMT_XVMC, - Pixel::Y400A => AV_PIX_FMT_Y400A, - Pixel::GRAY8A => AV_PIX_FMT_GRAY8A, - Pixel::GBR24P => AV_PIX_FMT_GBR24P, Pixel::RGB32 => AV_PIX_FMT_RGB32, Pixel::RGB32_1 => AV_PIX_FMT_RGB32_1, @@ -898,6 +901,7 @@ impl Into for Pixel { Pixel::GBRAPF32BE => AV_PIX_FMT_GBRAPF32BE, Pixel::GBRAPF32LE => AV_PIX_FMT_GBRAPF32LE, Pixel::DRM_PRIME => AV_PIX_FMT_DRM_PRIME, + Pixel::OPENCL => AV_PIX_FMT_OPENCL, } } } @@ -925,7 +929,7 @@ impl error::Error for ParsePixelError { } } - fn cause(&self) -> Option<&error::Error> { + fn cause(&self) -> Option<&dyn error::Error> { match *self { ParsePixelError::NulError(ref e) => Some(e), ParsePixelError::UnknownFormat => None, diff --git a/src/util/format/sample.rs b/src/util/format/sample.rs index c16bae5..0adae38 100644 --- a/src/util/format/sample.rs +++ b/src/util/format/sample.rs @@ -7,7 +7,7 @@ use std::str::from_utf8_unchecked; use ffi::AVSampleFormat::*; use ffi::*; -use libc::{c_int, uint8_t}; +use libc::c_int; #[derive(Eq, PartialEq, Copy, Clone, Debug)] pub enum Sample { @@ -131,7 +131,7 @@ pub struct Buffer { pub samples: usize, pub align: bool, - buffer: *mut *mut uint8_t, + buffer: *mut *mut u8, size: c_int, } diff --git a/src/util/frame/audio.rs b/src/util/frame/audio.rs index 92a335f..f29c427 100644 --- a/src/util/frame/audio.rs +++ b/src/util/frame/audio.rs @@ -4,7 +4,7 @@ use std::slice; use super::Frame; use ffi::*; -use libc::{c_int, c_ulonglong, int64_t}; +use libc::{c_int, c_ulonglong}; use util::format; use ChannelLayout; @@ -64,14 +64,16 @@ impl Audio { #[inline] pub fn channel_layout(&self) -> ChannelLayout { unsafe { - ChannelLayout::from_bits_truncate(av_frame_get_channel_layout(self.as_ptr()) as c_ulonglong) + ChannelLayout::from_bits_truncate( + av_frame_get_channel_layout(self.as_ptr()) as c_ulonglong + ) } } #[inline] pub fn set_channel_layout(&mut self, value: ChannelLayout) { unsafe { - av_frame_set_channel_layout(self.as_mut_ptr(), value.bits() as int64_t); + av_frame_set_channel_layout(self.as_mut_ptr(), value.bits() as i64); } } diff --git a/src/util/frame/mod.rs b/src/util/frame/mod.rs index 4c3eaca..204ab2a 100644 --- a/src/util/frame/mod.rs +++ b/src/util/frame/mod.rs @@ -75,7 +75,7 @@ impl Frame { #[inline] pub fn is_corrupt(&self) -> bool { - self.flags().contains(flag::CORRUPT) + self.flags().contains(Flags::CORRUPT) } #[inline] diff --git a/src/util/frame/side_data.rs b/src/util/frame/side_data.rs index acc5024..4559e65 100644 --- a/src/util/frame/side_data.rs +++ b/src/util/frame/side_data.rs @@ -27,6 +27,11 @@ pub enum Type { ContentLightLevel, IccProfile, + + QpTableProperties, + QpTableData, + + S12MTimecode, } impl Type { @@ -41,6 +46,7 @@ impl Type { impl From for Type { #[inline(always)] fn from(value: AVFrameSideDataType) -> Self { + #[allow(unreachable_patterns)] match value { AV_FRAME_DATA_PANSCAN => Type::PanScan, AV_FRAME_DATA_A53_CC => Type::A53CC, @@ -59,6 +65,12 @@ impl From for Type { AV_FRAME_DATA_CONTENT_LIGHT_LEVEL => Type::ContentLightLevel, AV_FRAME_DATA_ICC_PROFILE => Type::IccProfile, + // TODO It's undef #if in frame.h + AV_FRAME_DATA_QP_TABLE_PROPERTIES => Type::QpTableProperties, + AV_FRAME_DATA_QP_TABLE_DATA => Type::QpTableData, + AV_FRAME_DATA_S12M_TIMECODE => Type::S12MTimecode, + + _ => unimplemented!(), } } } @@ -84,6 +96,11 @@ impl Into for Type { Type::ContentLightLevel => AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, Type::IccProfile => AV_FRAME_DATA_ICC_PROFILE, + + Type::QpTableProperties => AV_FRAME_DATA_QP_TABLE_PROPERTIES, + Type::QpTableData => AV_FRAME_DATA_QP_TABLE_DATA, + + Type::S12MTimecode => AV_FRAME_DATA_S12M_TIMECODE, } } } diff --git a/src/util/option/traits.rs b/src/util/option/traits.rs index 80c43c2..ee09a97 100644 --- a/src/util/option/traits.rs +++ b/src/util/option/traits.rs @@ -4,7 +4,7 @@ use std::ffi::CString; use std::mem; use ffi::*; -use libc::{c_int, c_void, int64_t}; +use libc::{c_int, c_void}; use util::format; use {ChannelLayout, Error, Rational}; @@ -58,7 +58,7 @@ pub trait Settable: Target { check!(av_opt_set_int( self.as_mut_ptr(), name.as_ptr(), - value as int64_t, + value as i64, AV_OPT_SEARCH_CHILDREN )) } @@ -137,7 +137,7 @@ pub trait Settable: Target { check!(av_opt_set_channel_layout( self.as_mut_ptr(), name.as_ptr(), - layout.bits() as int64_t, + layout.bits() as i64, AV_OPT_SEARCH_CHILDREN )) }