diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f266d55..7060795 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -70,7 +70,7 @@ jobs: libopus-dev - run: | - git clone https://github.com/ffmpeg/ffmpeg --depth 1 --single-branch --branch release/6.1 + git clone https://github.com/ffmpeg/ffmpeg --depth 1 --single-branch --branch release/7.0 cd ffmpeg mkdir build cd build @@ -233,8 +233,9 @@ jobs: - name: Clippy check run: cargo clippy --features link_system_ffmpeg -- -D warnings - - name: Run Slice Example - run: cargo run --example slice --features link_system_ffmpeg + # Currently disable until system ffmpeg upgrades to FFmpeg 7.0 + # - name: Run Slice Example + # run: cargo run --example slice --features link_system_ffmpeg - name: Check test result correctness run: | @@ -288,7 +289,7 @@ jobs: # Disable exr,phm to workaround "multiple definition of 'ff_init_half2float_tables'" # Ref: `https://github.com/larksuite/rsmpeg/pull/98#issuecomment-1467511193` - run: | - git clone https://github.com/ffmpeg/ffmpeg --depth 1 --single-branch --branch release/6.1 + git clone https://github.com/ffmpeg/ffmpeg --depth 1 --single-branch --branch release/7.0 cd ffmpeg mkdir build cd build @@ -414,7 +415,7 @@ jobs: - name: Build FFmpeg dylib run: | - git clone https://github.com/ffmpeg/ffmpeg --depth 1 --single-branch --branch release/6.1 + git clone https://github.com/ffmpeg/ffmpeg --depth 1 --single-branch --branch release/7.0 cd ffmpeg mkdir build cd build @@ -496,7 +497,7 @@ jobs: - name: Build FFmpeg dylib run: | - git clone https://github.com/ffmpeg/ffmpeg --depth 1 --single-branch --branch release/6.1 + git clone https://github.com/ffmpeg/ffmpeg --depth 1 --single-branch --branch release/7.0 cd ffmpeg mkdir build cd build @@ -583,7 +584,7 @@ jobs: cd ../.. - name: Build FFmpeg run: | - git clone https://github.com/ffmpeg/ffmpeg --depth 1 --single-branch --branch release/6.1 + git clone https://github.com/ffmpeg/ffmpeg --depth 1 --single-branch --branch release/7.0 cd ffmpeg mkdir build cd build diff --git a/.gitignore b/.gitignore index 96ef6c0..c787fcc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /target Cargo.lock +/.vscode diff --git a/Cargo.toml b/Cargo.toml index f8ed04b..7f0ae92 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,3 +42,5 @@ link_system_ffmpeg = [] ffmpeg5 = [] # FFmpeg 6.* support ffmpeg6 = [] +# FFmpeg 7.* support +ffmpeg7 = [] diff --git a/README.md b/README.md index 305172d..76a5705 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,13 @@ You need to set several environment variables for both linking and binding gener You can enable system-wide FFmpeg linking by enabling feature `link_system_ffmpeg`. +### Use specific FFmpeg version + +- Do nothing when you are using FFmpeg `4.*` +- Enable `ffmpeg5` feature when you are using FFmpeg `5.*` +- Enable `ffmpeg6` feature when you are using FFmpeg `6.*` +- Enable `ffmpeg7` feature when you are using FFmpeg `7.*` + ## Attention FFI is not that easy, especially when you are dealing with a big old C project. Don't feel depressed when there are some problems. The CI check already has some typical ffmpeg compilation and use cases for you to check. File an issue if you still have any problem. diff --git a/examples/slice/main.rs b/examples/slice/main.rs index bf858c0..87f7f25 100644 --- a/examples/slice/main.rs +++ b/examples/slice/main.rs @@ -1,4 +1,5 @@ //! Port from Original code: https://github.com/leandromoreira/ffmpeg-libav-tutorial/blob/master/0_hello_world.c + use rusty_ffmpeg::ffi; use std::{ @@ -8,6 +9,7 @@ use std::{ ptr, slice, }; +// This should only be used with FFmpeg 7 fn main() { let filepath: CString = CString::new("./examples/slice/bear.mp4").unwrap(); @@ -98,7 +100,7 @@ fn main() { ffi::AVMEDIA_TYPE_AUDIO => { println!( "Audio Codec: {} channels, sample rate {}", - local_codec_params.channels, local_codec_params.sample_rate + local_codec_params.ch_layout.nb_channels, local_codec_params.sample_rate ); } _ => {} @@ -174,18 +176,17 @@ fn decode_packet( )); } else { println!( - "Frame {} (type={}, size={} bytes) pts {} key_frame {} [DTS {}]", - codec_context.frame_number, + "Frame {} (type={}, size={} bytes) pts {} key_frame {}", + codec_context.frame_num, unsafe { ffi::av_get_picture_type_char(frame.pict_type) }, frame.pkt_size, frame.pts, frame.key_frame, - frame.coded_picture_number ); let frame_filename = format!( "./examples/slice/output/frame-{}.pgm", - codec_context.frame_number + codec_context.frame_num ); let width = frame.width as usize; let height = frame.height as usize; diff --git a/src/avutil/pixfmt.rs b/src/avutil/pixfmt.rs index 19f6fd4..63736c6 100644 --- a/src/avutil/pixfmt.rs +++ b/src/avutil/pixfmt.rs @@ -60,6 +60,8 @@ AV_PIX_FMT_NE!(AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP14BE, AV_PIX_FMT_GBRP14LE); AV_PIX_FMT_NE!(AV_PIX_FMT_GBRP16, AV_PIX_FMT_GBRP16BE, AV_PIX_FMT_GBRP16LE); AV_PIX_FMT_NE!(AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP10BE, AV_PIX_FMT_GBRAP10LE); AV_PIX_FMT_NE!(AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP12BE, AV_PIX_FMT_GBRAP12LE); +#[cfg(feature = "ffmpeg7")] +AV_PIX_FMT_NE!(AV_PIX_FMT_GBRAP14, AV_PIX_FMT_GBRAP14BE, AV_PIX_FMT_GBRAP14LE); AV_PIX_FMT_NE!(AV_PIX_FMT_GBRAP16, AV_PIX_FMT_GBRAP16BE, AV_PIX_FMT_GBRAP16LE); AV_PIX_FMT_NE!(AV_PIX_FMT_BAYER_BGGR16, AV_PIX_FMT_BAYER_BGGR16BE, AV_PIX_FMT_BAYER_BGGR16LE); @@ -86,36 +88,40 @@ AV_PIX_FMT_NE!(AV_PIX_FMT_XYZ12, AV_PIX_FMT_XYZ12BE, AV_PIX_FMT_XYZ12LE); AV_PIX_FMT_NE!(AV_PIX_FMT_NV20, AV_PIX_FMT_NV20BE, AV_PIX_FMT_NV20LE); AV_PIX_FMT_NE!(AV_PIX_FMT_AYUV64, AV_PIX_FMT_AYUV64BE, AV_PIX_FMT_AYUV64LE); AV_PIX_FMT_NE!(AV_PIX_FMT_P010, AV_PIX_FMT_P010BE, AV_PIX_FMT_P010LE); -#[cfg(feature = "ffmpeg6")] +#[cfg(any(feature = "ffmpeg6", feature = "ffmpeg7"))] AV_PIX_FMT_NE!(AV_PIX_FMT_P012, AV_PIX_FMT_P012BE, AV_PIX_FMT_P012LE); AV_PIX_FMT_NE!(AV_PIX_FMT_P016, AV_PIX_FMT_P016BE, AV_PIX_FMT_P016LE); -#[cfg(any(feature = "ffmpeg5", feature = "ffmpeg6"))] +#[cfg(any(feature = "ffmpeg5", feature = "ffmpeg6", feature = "ffmpeg7"))] AV_PIX_FMT_NE!(AV_PIX_FMT_Y210, AV_PIX_FMT_Y210BE, AV_PIX_FMT_Y210LE); -#[cfg(feature = "ffmpeg6")] +#[cfg(any(feature = "ffmpeg6", feature = "ffmpeg7"))] AV_PIX_FMT_NE!(AV_PIX_FMT_Y212, AV_PIX_FMT_Y212BE, AV_PIX_FMT_Y212LE); -#[cfg(feature = "ffmpeg6")] +#[cfg(any(feature = "ffmpeg6", feature = "ffmpeg7"))] AV_PIX_FMT_NE!(AV_PIX_FMT_XV30, AV_PIX_FMT_XV30BE, AV_PIX_FMT_XV30LE); -#[cfg(feature = "ffmpeg6")] +#[cfg(any(feature = "ffmpeg6", feature = "ffmpeg7"))] AV_PIX_FMT_NE!(AV_PIX_FMT_XV36, AV_PIX_FMT_XV36BE, AV_PIX_FMT_XV36LE); -#[cfg(any(feature = "ffmpeg5", feature = "ffmpeg6"))] +#[cfg(any(feature = "ffmpeg5", feature = "ffmpeg6", feature = "ffmpeg7"))] AV_PIX_FMT_NE!(AV_PIX_FMT_X2RGB10, AV_PIX_FMT_X2RGB10BE, AV_PIX_FMT_X2RGB10LE); -#[cfg(any(feature = "ffmpeg5", feature = "ffmpeg6"))] +#[cfg(any(feature = "ffmpeg5", feature = "ffmpeg6", feature = "ffmpeg7"))] AV_PIX_FMT_NE!(AV_PIX_FMT_X2BGR10, AV_PIX_FMT_X2BGR10BE, AV_PIX_FMT_X2BGR10LE); -#[cfg(any(feature = "ffmpeg5", feature = "ffmpeg6"))] +#[cfg(any(feature = "ffmpeg5", feature = "ffmpeg6", feature = "ffmpeg7"))] AV_PIX_FMT_NE!(AV_PIX_FMT_P210, AV_PIX_FMT_P210BE, AV_PIX_FMT_P210LE); -#[cfg(any(feature = "ffmpeg5", feature = "ffmpeg6"))] +#[cfg(any(feature = "ffmpeg5", feature = "ffmpeg6", feature = "ffmpeg7"))] AV_PIX_FMT_NE!(AV_PIX_FMT_P410, AV_PIX_FMT_P410BE, AV_PIX_FMT_P410LE); -#[cfg(any(feature = "ffmpeg5", feature = "ffmpeg6"))] +#[cfg(feature = "ffmpeg7")] +AV_PIX_FMT_NE!(AV_PIX_FMT_P212, AV_PIX_FMT_P212BE, AV_PIX_FMT_P212LE); +#[cfg(feature = "ffmpeg7")] +AV_PIX_FMT_NE!(AV_PIX_FMT_P412, AV_PIX_FMT_P412BE, AV_PIX_FMT_P412LE); +#[cfg(any(feature = "ffmpeg5", feature = "ffmpeg6", feature = "ffmpeg7"))] AV_PIX_FMT_NE!(AV_PIX_FMT_P216, AV_PIX_FMT_P216BE, AV_PIX_FMT_P216LE); -#[cfg(any(feature = "ffmpeg5", feature = "ffmpeg6"))] +#[cfg(any(feature = "ffmpeg5", feature = "ffmpeg6", feature = "ffmpeg7"))] AV_PIX_FMT_NE!(AV_PIX_FMT_P416, AV_PIX_FMT_P416BE, AV_PIX_FMT_P416LE); -#[cfg(feature = "ffmpeg6")] +#[cfg(any(feature = "ffmpeg6", feature = "ffmpeg7"))] AV_PIX_FMT_NE!(AV_PIX_FMT_RGBAF16, AV_PIX_FMT_RGBAF16BE, AV_PIX_FMT_RGBAF16LE); -#[cfg(feature = "ffmpeg6")] +#[cfg(any(feature = "ffmpeg6", feature = "ffmpeg7"))] AV_PIX_FMT_NE!(AV_PIX_FMT_RGBF32, AV_PIX_FMT_RGBF32BE, AV_PIX_FMT_RGBF32LE); -#[cfg(feature = "ffmpeg6")] +#[cfg(any(feature = "ffmpeg6", feature = "ffmpeg7"))] AV_PIX_FMT_NE!(AV_PIX_FMT_RGBAF32, AV_PIX_FMT_RGBAF32BE, AV_PIX_FMT_RGBAF32LE);