crate: check headers for ifdefs

This commit is contained in:
meh 2015-12-03 18:10:46 +01:00
parent 0328dc111a
commit b6c92b2805
4 changed files with 180 additions and 1 deletions

View File

@ -1,6 +1,7 @@
[package]
name = "ffmpeg"
version = "0.2.0-alpha.1"
build = "build.rs"
authors = ["meh. <meh@schizofreni.co>"]
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

136
build.rs Normal file
View File

@ -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 <stdio.h>
#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();
}

View File

@ -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<AVCodecID> 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<AVCodecID> 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<AVCodecID> 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<AVCodecID> 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,

View File

@ -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<AVPixelFormat> 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<AVPixelFormat> 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<AVPixelFormat> 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<AVPixelFormat> 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<AVPixelFormat> 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<AVPixelFormat> 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,