diff --git a/Cargo.toml b/Cargo.toml index a383030..05cc08d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,7 @@ [package] name = "ffmpeg" version = "0.2.0-alpha.1" +build = "build.rs" authors = ["meh. "] license = "WTFPL" @@ -90,6 +91,6 @@ version = "0.4" optional = true [dependencies.ffmpeg-sys] -version = "2.8.0" +version = "2.8.3" default-features = false diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..23c3d41 --- /dev/null +++ b/build.rs @@ -0,0 +1,136 @@ +use std::env; +use std::fs::File; +use std::io::{self, Write}; +use std::path::PathBuf; +use std::process::Command; + +fn output() -> PathBuf { + PathBuf::from(env::var("OUT_DIR").unwrap()) +} + +fn feature(header: &str, feature: Option<&str>, var: &str) -> io::Result<()> { + if let Some(feature) = feature { + if env::var(format!("CARGO_FEATURE_{}", feature.to_uppercase())).is_err() { + return Ok(()); + } + } + + try!(write!(try!(File::create(output().join("check.c"))), r#" + #include + #include <{}> + + int + main (int argc, char* argv[]) + {{ + printf("%d\n", {}); + return 0; + }} + "#, header, var)); + + if Command::new("cc").current_dir(&output()).arg("-o").arg("check").arg("check.c").status().is_err() { + return Ok(()); + } + + if try!(Command::new("./check").current_dir(&output()).output()).stdout[0] == b'1' { + println!(r#"cargo:rustc-cfg=feature="{}""#, var.to_lowercase()); + } + + Ok(()) +} + +fn main() { + if env::var("CARGO_FEATURE_BUILD").is_ok() { + return; + } + + feature("libavutil/avutil.h", None, "FF_API_OLD_AVOPTIONS").unwrap(); + feature("libavutil/avutil.h", None, "FF_API_PIX_FMT").unwrap(); + feature("libavutil/avutil.h", None, "FF_API_CONTEXT_SIZE").unwrap(); + feature("libavutil/avutil.h", None, "FF_API_PIX_FMT_DESC").unwrap(); + feature("libavutil/avutil.h", None, "FF_API_AV_REVERSE").unwrap(); + feature("libavutil/avutil.h", None, "FF_API_AUDIOCONVERT").unwrap(); + feature("libavutil/avutil.h", None, "FF_API_CPU_FLAG_MMX2").unwrap(); + feature("libavutil/avutil.h", None, "FF_API_LLS_PRIVATE").unwrap(); + feature("libavutil/avutil.h", None, "FF_API_AVFRAME_LAVC").unwrap(); + feature("libavutil/avutil.h", None, "FF_API_VDPAU").unwrap(); + feature("libavutil/avutil.h", None, "FF_API_GET_CHANNEL_LAYOUT_COMPAT").unwrap(); + feature("libavutil/avutil.h", None, "FF_API_XVMC").unwrap(); + feature("libavutil/avutil.h", None, "FF_API_OPT_TYPE_METADATA").unwrap(); + feature("libavutil/avutil.h", None, "FF_API_DLOG").unwrap(); + feature("libavutil/avutil.h", None, "FF_API_HMAC").unwrap(); + feature("libavutil/avutil.h", None, "FF_API_VAAPI").unwrap(); + + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_VIMA_DECODER").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_REQUEST_CHANNELS").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_OLD_DECODE_AUDIO").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_OLD_ENCODE_AUDIO").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_OLD_ENCODE_VIDEO").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_CODEC_ID").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_AUDIO_CONVERT").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_AVCODEC_RESAMPLE").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_DEINTERLACE").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_DESTRUCT_PACKET").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_GET_BUFFER").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_MISSING_SAMPLE").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_LOWRES").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_CAP_VDPAU").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_BUFS_VDPAU").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_VOXWARE").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_SET_DIMENSIONS").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_DEBUG_MV").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_AC_VLC").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_OLD_MSMPEG4").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_ASPECT_EXTENDED").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_THREAD_OPAQUE").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_CODEC_PKT").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_ARCH_ALPHA").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_XVMC").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_ERROR_RATE").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_QSCALE_TYPE").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_MB_TYPE").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_MAX_BFRAMES").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_NEG_LINESIZES").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_EMU_EDGE").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_ARCH_SH4").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_ARCH_SPARC").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_UNUSED_MEMBERS").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_IDCT_XVIDMMX").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_INPUT_PRESERVED").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_NORMALIZE_AQP").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_GMC").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_MV0").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_CODEC_NAME").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_AFD").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_VISMV").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_DV_FRAME_PROFILE").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_AUDIOENC_DELAY").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_VAAPI_CONTEXT").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_AVCTX_TIMEBASE").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_MPV_OPT").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_STREAM_CODEC_TAG").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_QUANT_BIAS").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_RC_STRATEGY").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_CODED_FRAME").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_MOTION_EST").unwrap(); + feature("libavcodec/avcodec.h", Some("avcodec"), "FF_API_WITHOUT_PREFIX").unwrap(); + + feature("libavformat/avformat.h", Some("avformat"), "FF_API_LAVF_BITEXACT").unwrap(); + feature("libavformat/avformat.h", Some("avformat"), "FF_API_LAVF_FRAC").unwrap(); + feature("libavformat/avformat.h", Some("avformat"), "FF_API_URL_FEOF").unwrap(); + feature("libavformat/avformat.h", Some("avformat"), "FF_API_PROBESIZE_32").unwrap(); + + feature("libavfilter/avfilter.h", Some("avfilter"), "FF_API_AVFILTERPAD_PUBLIC").unwrap(); + feature("libavfilter/avfilter.h", Some("avfilter"), "FF_API_FOO_COUNT").unwrap(); + feature("libavfilter/avfilter.h", Some("avfilter"), "FF_API_AVFILTERBUFFER").unwrap(); + feature("libavfilter/avfilter.h", Some("avfilter"), "FF_API_OLD_FILTER_OPTS").unwrap(); + feature("libavfilter/avfilter.h", Some("avfilter"), "FF_API_OLD_FILTER_OPTS_ERROR").unwrap(); + feature("libavfilter/avfilter.h", Some("avfilter"), "FF_API_AVFILTER_OPEN").unwrap(); + feature("libavfilter/avfilter.h", Some("avfilter"), "FF_API_OLD_FILTER_REGISTER").unwrap(); + feature("libavfilter/avfilter.h", Some("avfilter"), "FF_API_OLD_GRAPH_PARSE").unwrap(); + feature("libavfilter/avfilter.h", Some("avfilter"), "FF_API_NOCONST_GET_NAME").unwrap(); + + feature("libavresample/avresample.h", Some("avresample"), "FF_API_RESAMPLE_CLOSE_OPEN").unwrap(); + + feature("libswscale/swscale.h", Some("swscale"), "FF_API_SWS_CPU_CAPS").unwrap(); + feature("libswscale/swscale.h", Some("swscale"), "FF_API_ARCH_BFIN").unwrap(); +} diff --git a/src/codec/id.rs b/src/codec/id.rs index 21a8150..ca64cee 100644 --- a/src/codec/id.rs +++ b/src/codec/id.rs @@ -12,6 +12,7 @@ pub enum Id { // video codecs MPEG1VIDEO, MPEG2VIDEO, + #[cfg(feature = "ff_api_xvmc")] MPEG2VIDEO_XVMC, H261, H263, @@ -354,6 +355,7 @@ pub enum Id { MLP, GSM_MS, ATRAC3, + #[cfg(feature = "voxware")] VOXWARE, APE, NELLYMOSER, @@ -470,6 +472,7 @@ impl From for Id { /* video codecs */ AV_CODEC_ID_MPEG1VIDEO => Id::MPEG1VIDEO, AV_CODEC_ID_MPEG2VIDEO => Id::MPEG2VIDEO, + #[cfg(feature = "ff_api_xvmc")] AV_CODEC_ID_MPEG2VIDEO_XVMC => Id::MPEG2VIDEO_XVMC, AV_CODEC_ID_H261 => Id::H261, AV_CODEC_ID_H263 => Id::H263, @@ -812,6 +815,7 @@ impl From for Id { AV_CODEC_ID_MLP => Id::MLP, AV_CODEC_ID_GSM_MS => Id::GSM_MS, AV_CODEC_ID_ATRAC3 => Id::ATRAC3, + #[cfg(feature = "voxware")] AV_CODEC_ID_VOXWARE => Id::VOXWARE, AV_CODEC_ID_APE => Id::APE, AV_CODEC_ID_NELLYMOSER => Id::NELLYMOSER, @@ -916,6 +920,7 @@ impl Into for Id { /* video codecs */ Id::MPEG1VIDEO => AV_CODEC_ID_MPEG1VIDEO, Id::MPEG2VIDEO => AV_CODEC_ID_MPEG2VIDEO, + #[cfg(feature = "ff_api_xvmc")] Id::MPEG2VIDEO_XVMC => AV_CODEC_ID_MPEG2VIDEO_XVMC, Id::H261 => AV_CODEC_ID_H261, Id::H263 => AV_CODEC_ID_H263, @@ -1258,6 +1263,7 @@ impl Into for Id { Id::MLP => AV_CODEC_ID_MLP, Id::GSM_MS => AV_CODEC_ID_GSM_MS, Id::ATRAC3 => AV_CODEC_ID_ATRAC3, + #[cfg(feature = "voxware")] Id::VOXWARE => AV_CODEC_ID_VOXWARE, Id::APE => AV_CODEC_ID_APE, Id::NELLYMOSER => AV_CODEC_ID_NELLYMOSER, diff --git a/src/util/format/pixel.rs b/src/util/format/pixel.rs index 630f77b..142ff03 100644 --- a/src/util/format/pixel.rs +++ b/src/util/format/pixel.rs @@ -19,7 +19,9 @@ pub enum Pixel { YUVJ420P, YUVJ422P, YUVJ444P, + #[cfg(feature = "ff_api_xvmc")] XVMC_MPEG2_MC, + #[cfg(feature = "ff_api_xvmc")] XVMC_MPEG2_IDCT, UYVY422, UYYVYY411, @@ -42,10 +44,15 @@ pub enum Pixel { YUV440P, YUVJ440P, YUVA420P, + #[cfg(feature = "ff_api_vdpau")] VDPAU_H264, + #[cfg(feature = "ff_api_vdpau")] VDPAU_MPEG1, + #[cfg(feature = "ff_api_vdpau")] VDPAU_MPEG2, + #[cfg(feature = "ff_api_vdpau")] VDPAU_WMV3, + #[cfg(feature = "ff_api_vdpau")] VDPAU_VC1, RGB48BE, RGB48LE, @@ -60,9 +67,13 @@ pub enum Pixel { BGR555BE, BGR555LE, + #[cfg(feature = "ff_api_vaapi")] VAAPI_MOCO, + #[cfg(feature = "ff_api_vaapi")] VAAPI_IDCT, + #[cfg(feature = "ff_api_vaapi")] VAAPI_VLD, + #[cfg(not(feature = "ff_api_vaapi"))] VAAPI, YUV420P16LE, @@ -71,6 +82,7 @@ pub enum Pixel { YUV422P16BE, YUV444P16LE, YUV444P16BE, + #[cfg(feature = "ff_api_vdpau")] VDPAU_MPEG4, DXVA2_VLD, @@ -295,7 +307,9 @@ impl From for Pixel { AV_PIX_FMT_YUVJ420P => Pixel::YUVJ420P, AV_PIX_FMT_YUVJ422P => Pixel::YUVJ422P, AV_PIX_FMT_YUVJ444P => Pixel::YUVJ444P, + #[cfg(feature = "ff_api_xvmc")] AV_PIX_FMT_XVMC_MPEG2_MC => Pixel::XVMC_MPEG2_MC, + #[cfg(feature = "ff_api_xvmc")] AV_PIX_FMT_XVMC_MPEG2_IDCT => Pixel::XVMC_MPEG2_IDCT, AV_PIX_FMT_UYVY422 => Pixel::UYVY422, AV_PIX_FMT_UYYVYY411 => Pixel::UYYVYY411, @@ -318,10 +332,15 @@ impl From for Pixel { AV_PIX_FMT_YUV440P => Pixel::YUV440P, AV_PIX_FMT_YUVJ440P => Pixel::YUVJ440P, AV_PIX_FMT_YUVA420P => Pixel::YUVA420P, + #[cfg(feature = "ff_api_vdpau")] AV_PIX_FMT_VDPAU_H264 => Pixel::VDPAU_H264, + #[cfg(feature = "ff_api_vdpau")] AV_PIX_FMT_VDPAU_MPEG1 => Pixel::VDPAU_MPEG1, + #[cfg(feature = "ff_api_vdpau")] AV_PIX_FMT_VDPAU_MPEG2 => Pixel::VDPAU_MPEG2, + #[cfg(feature = "ff_api_vdpau")] AV_PIX_FMT_VDPAU_WMV3 => Pixel::VDPAU_WMV3, + #[cfg(feature = "ff_api_vdpau")] AV_PIX_FMT_VDPAU_VC1 => Pixel::VDPAU_VC1, AV_PIX_FMT_RGB48BE => Pixel::RGB48BE, AV_PIX_FMT_RGB48LE => Pixel::RGB48LE, @@ -336,16 +355,23 @@ impl From for Pixel { AV_PIX_FMT_BGR555BE => Pixel::BGR555BE, AV_PIX_FMT_BGR555LE => Pixel::BGR555LE, + #[cfg(feature = "ff_api_vaapi")] AV_PIX_FMT_VAAPI_MOCO => Pixel::VAAPI_MOCO, + #[cfg(feature = "ff_api_vaapi")] AV_PIX_FMT_VAAPI_IDCT => Pixel::VAAPI_IDCT, + #[cfg(feature = "ff_api_vaapi")] AV_PIX_FMT_VAAPI_VLD => Pixel::VAAPI_VLD, + #[cfg(not(feature = "ff_api_vaapi"))] + AV_PIX_FMT_VAAPI => Pixel::VAAPI, + AV_PIX_FMT_YUV420P16LE => Pixel::YUV420P16LE, AV_PIX_FMT_YUV420P16BE => Pixel::YUV420P16BE, AV_PIX_FMT_YUV422P16LE => Pixel::YUV422P16LE, AV_PIX_FMT_YUV422P16BE => Pixel::YUV422P16BE, AV_PIX_FMT_YUV444P16LE => Pixel::YUV444P16LE, AV_PIX_FMT_YUV444P16BE => Pixel::YUV444P16BE, + #[cfg(feature = "ff_api_vdpau")] AV_PIX_FMT_VDPAU_MPEG4 => Pixel::VDPAU_MPEG4, AV_PIX_FMT_DXVA2_VLD => Pixel::DXVA2_VLD, @@ -529,10 +555,15 @@ impl Into for Pixel { Pixel::YUV440P => AV_PIX_FMT_YUV440P, Pixel::YUVJ440P => AV_PIX_FMT_YUVJ440P, Pixel::YUVA420P => AV_PIX_FMT_YUVA420P, + #[cfg(feature = "ff_api_vdpau")] Pixel::VDPAU_H264 => AV_PIX_FMT_VDPAU_H264, + #[cfg(feature = "ff_api_vdpau")] Pixel::VDPAU_MPEG1 => AV_PIX_FMT_VDPAU_MPEG1, + #[cfg(feature = "ff_api_vdpau")] Pixel::VDPAU_MPEG2 => AV_PIX_FMT_VDPAU_MPEG2, + #[cfg(feature = "ff_api_vdpau")] Pixel::VDPAU_WMV3 => AV_PIX_FMT_VDPAU_WMV3, + #[cfg(feature = "ff_api_vdpau")] Pixel::VDPAU_VC1 => AV_PIX_FMT_VDPAU_VC1, Pixel::RGB48BE => AV_PIX_FMT_RGB48BE, Pixel::RGB48LE => AV_PIX_FMT_RGB48LE, @@ -547,9 +578,13 @@ impl Into for Pixel { Pixel::BGR555BE => AV_PIX_FMT_BGR555BE, Pixel::BGR555LE => AV_PIX_FMT_BGR555LE, + #[cfg(feature = "ff_api_vaapi")] Pixel::VAAPI_MOCO => AV_PIX_FMT_VAAPI_MOCO, + #[cfg(feature = "ff_api_vaapi")] Pixel::VAAPI_IDCT => AV_PIX_FMT_VAAPI_IDCT, + #[cfg(feature = "ff_api_vaapi")] Pixel::VAAPI_VLD => AV_PIX_FMT_VAAPI_VLD, + #[cfg(not(feature = "ff_api_vaapi"))] Pixel::VAAPI => AV_PIX_FMT_VAAPI_VLD, Pixel::YUV420P16LE => AV_PIX_FMT_YUV420P16LE, @@ -558,6 +593,7 @@ impl Into for Pixel { Pixel::YUV422P16BE => AV_PIX_FMT_YUV422P16BE, Pixel::YUV444P16LE => AV_PIX_FMT_YUV444P16LE, Pixel::YUV444P16BE => AV_PIX_FMT_YUV444P16BE, + #[cfg(feature = "ff_api_vdpau")] Pixel::VDPAU_MPEG4 => AV_PIX_FMT_VDPAU_MPEG4, Pixel::DXVA2_VLD => AV_PIX_FMT_DXVA2_VLD,