diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index eca99084..d1675891 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,6 +6,8 @@ on: - 'README.md' pull_request: branches: [ "master" ] + paths-ignore: + - 'README.md' env: CARGO_INCREMENTAL: 0 @@ -82,7 +84,7 @@ jobs: - name: Check format run: cargo fmt --all -- --check - name: Lint - run: cargo clippy --all-targets $CARGO_FEATURES + run: cargo clippy --all-targets $CARGO_FEATURES -- -D warnings - name: Build run: cargo build --all-targets $CARGO_FEATURES - name: Test bindings @@ -120,7 +122,7 @@ jobs: - name: Check format run: cargo fmt --all -- --check - name: Lint - run: cargo clippy --all-targets $CARGO_FEATURES + run: cargo clippy --all-targets $CARGO_FEATURES -- -D warnings - name: Build run: cargo build --all-targets $CARGO_FEATURES - name: Test bindings @@ -174,7 +176,7 @@ jobs: - name: Check format run: cargo fmt --all -- --check - name: Lint - run: cargo clippy --all-targets $CARGO_FEATURES + run: cargo clippy --all-targets $CARGO_FEATURES -- -D warnings - name: Build run: cargo build --all-targets $CARGO_FEATURES - name: Test bindings diff --git a/examples/dump-frames.rs b/examples/dump-frames.rs index c76f2220..ac8386d6 100644 --- a/examples/dump-frames.rs +++ b/examples/dump-frames.rs @@ -1,6 +1,6 @@ extern crate ffmpeg_the_third as ffmpeg; -use crate::ffmpeg::format::{input, Pixel}; +use crate::ffmpeg::format::{self, Pixel}; use crate::ffmpeg::media::Type; use crate::ffmpeg::software::scaling::{context::Context, flag::Flags}; use crate::ffmpeg::util::frame::video::Video; @@ -11,7 +11,7 @@ use std::io::prelude::*; fn main() -> Result<(), ffmpeg::Error> { ffmpeg::init().unwrap(); - if let Ok(mut ictx) = input(env::args().nth(1).expect("Cannot open file.")) { + if let Ok(mut ictx) = format::input(env::args().nth(1).expect("Cannot open file.")) { let input = ictx .streams() .best(Type::Video) diff --git a/examples/remux.rs b/examples/remux.rs index 23ca64c6..da0a3451 100644 --- a/examples/remux.rs +++ b/examples/remux.rs @@ -2,7 +2,7 @@ extern crate ffmpeg_the_third as ffmpeg; use std::env; -use crate::ffmpeg::{codec, encoder, format, log, media, Rational}; +use ffmpeg::{codec, encoder, format, log, media, Rational}; fn main() { let input_file = env::args().nth(1).expect("missing input file"); diff --git a/examples/transcode-audio.rs b/examples/transcode-audio.rs index ed31842a..78c94475 100644 --- a/examples/transcode-audio.rs +++ b/examples/transcode-audio.rs @@ -3,8 +3,8 @@ extern crate ffmpeg_the_third as ffmpeg; use std::env; use std::path::Path; -use crate::ffmpeg::{codec, filter, format, frame, media}; -use crate::ffmpeg::{rescale, Rescale}; +use ffmpeg::{codec, filter, format, frame, media}; +use ffmpeg::{rescale, Rescale}; fn filter( spec: &str, @@ -69,10 +69,10 @@ struct Transcoder { out_time_base: ffmpeg::Rational, } -fn transcoder>( +fn transcoder + ?Sized>( ictx: &mut format::context::Input, octx: &mut format::context::Output, - path: P, + path: &P, filter_spec: &str, ) -> Result { let input = ictx @@ -135,7 +135,7 @@ fn transcoder>( output.set_time_base((1, decoder.rate() as i32)); let encoder = encoder.open_as(codec)?; - output.copy_parameters_from_context(&encoder); + output.set_parameters_into(&encoder); let filter = filter(filter_spec, &decoder, &encoder)?; diff --git a/examples/transcode-x264.rs b/examples/transcode-x264.rs index 39855d1c..4895337f 100644 --- a/examples/transcode-x264.rs +++ b/examples/transcode-x264.rs @@ -21,7 +21,7 @@ use std::collections::HashMap; use std::env; use std::time::Instant; -use crate::ffmpeg::{ +use ffmpeg::{ codec, decoder, encoder, format, frame, log, media, picture, Dictionary, Packet, Rational, }; @@ -30,7 +30,8 @@ const DEFAULT_X264_OPTS: &str = "preset=medium"; struct Transcoder { ost_index: usize, decoder: decoder::Video, - encoder: encoder::video::Video, + input_time_base: Rational, + encoder: encoder::Video, logging_enabled: bool, frame_count: usize, last_log_frame_count: usize, @@ -50,33 +51,32 @@ impl Transcoder { let decoder = ffmpeg::codec::context::Context::from_parameters(ist.parameters())? .decoder() .video()?; - let mut ost = octx.add_stream(encoder::find(codec::Id::H264))?; - let mut encoder = codec::context::Context::from_parameters(ost.parameters())? - .encoder() - .video()?; + + let codec = encoder::find(codec::Id::H264); + let mut ost = octx.add_stream(codec)?; + + let mut encoder = codec::context::Context::new(codec).encoder().video()?; + ost.set_parameters_into(&encoder); encoder.set_height(decoder.height()); encoder.set_width(decoder.width()); encoder.set_aspect_ratio(decoder.aspect_ratio()); encoder.set_format(decoder.format()); encoder.set_frame_rate(decoder.frame_rate()); - encoder.set_time_base(decoder.frame_rate().unwrap().invert()); + encoder.set_time_base(ist.time_base()); + if global_header { encoder.set_flags(codec::Flags::GLOBAL_HEADER); } - encoder + let opened_encoder = encoder .open_with(x264_opts) - .expect("error opening libx264 encoder with supplied settings"); - encoder = codec::context::Context::from_parameters(ost.parameters())? - .encoder() - .video()?; - ost.copy_parameters_from_context(&encoder); + .expect("error opening x264 with supplied settings"); + ost.set_parameters_into(&opened_encoder); Ok(Self { ost_index, decoder, - encoder: codec::context::Context::from_parameters(ost.parameters())? - .encoder() - .video()?, + input_time_base: ist.time_base(), + encoder: opened_encoder, logging_enabled: enable_logging, frame_count: 0, last_log_frame_count: 0, @@ -103,7 +103,7 @@ impl Transcoder { self.frame_count += 1; let timestamp = frame.timestamp(); self.log_progress(f64::from( - Rational(timestamp.unwrap_or(0) as i32, 1) * self.decoder.time_base(), + Rational(timestamp.unwrap_or(0) as i32, 1) * self.input_time_base, )); frame.set_pts(timestamp); frame.set_kind(picture::Type::None); @@ -128,7 +128,7 @@ impl Transcoder { let mut encoded = Packet::empty(); while self.encoder.receive_packet(&mut encoded).is_ok() { encoded.set_stream(self.ost_index); - encoded.rescale_ts(self.decoder.time_base(), ost_time_base); + encoded.rescale_ts(self.input_time_base, ost_time_base); encoded.write_interleaved(octx).unwrap(); } } @@ -173,7 +173,7 @@ fn main() { ) .expect("invalid x264 options string"); - eprintln!("x264 options: {x264_opts:?}"); + eprintln!("x264 options: {:?}", x264_opts); ffmpeg::init().unwrap(); log::set_level(log::Level::Info); @@ -247,7 +247,11 @@ fn main() { let ost_time_base = ost_time_bases[ost_index as usize]; match transcoders.get_mut(&ist_index) { Some(transcoder) => { - packet.rescale_ts(stream.time_base(), transcoder.decoder.time_base()); + // FIXME: why? + // Timestamps are unset in a packet for stream 0. + // This is deprecated and will stop working in the future. + // Fix your code to set the timestamps properly + // packet.rescale_ts(stream.time_base(), transcoder.decoder.time_base()); transcoder.send_packet_to_decoder(&packet); transcoder.receive_and_process_decoded_frames(&mut octx, ost_time_base); } diff --git a/src/codec/codec.rs b/src/codec/codec.rs index 4279663f..07c341ad 100644 --- a/src/codec/codec.rs +++ b/src/codec/codec.rs @@ -17,9 +17,6 @@ pub fn list_descriptors() -> CodecDescriptorIter { CodecDescriptorIter::new() } -pub type Audio = Codec; -pub type Video = Codec; - #[derive(PartialEq, Eq, Copy, Clone)] pub struct Codec { ptr: NonNull, @@ -50,7 +47,7 @@ impl Codec { impl Codec { pub fn as_ptr(&self) -> *const AVCodec { - self.ptr.as_ptr() + self.ptr.as_ptr() as *const _ } pub fn is_encoder(&self) -> bool { @@ -81,7 +78,7 @@ impl Codec { self.medium() == media::Type::Video } - pub fn video(self) -> Option