From aa1227aadc977bf1e97af9772770e282cd7eeda8 Mon Sep 17 00:00:00 2001 From: Aloncvt Date: Sun, 5 Oct 2025 00:18:18 +0300 Subject: [PATCH 1/2] added abillity to use custom encoder. --- src/encode.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/encode.rs b/src/encode.rs index f302985..a040956 100644 --- a/src/encode.rs +++ b/src/encode.rs @@ -243,10 +243,11 @@ impl Encoder { .flags() .contains(AvFormatFlags::GLOBAL_HEADER); - let mut writer_stream = writer.output.add_stream(settings.codec())?; + + let mut writer_stream = writer.output.add_stream(settings.encoder)?; let writer_stream_index = writer_stream.index(); - let mut encoder_context = match settings.codec() { + let mut encoder_context = match settings.encoder { Some(codec) => ffi::codec_context_as(&codec)?, None => AvContext::new(), }; @@ -389,6 +390,7 @@ pub struct Settings { pixel_format: AvPixel, keyframe_interval: u64, options: Options, + encoder: Option } impl Settings { @@ -415,6 +417,7 @@ impl Settings { pixel_format: AvPixel::YUV420P, keyframe_interval: Self::KEY_FRAME_INTERVAL, options, + encoder: Self::codec(&self) } } @@ -444,6 +447,7 @@ impl Settings { pixel_format, keyframe_interval: Self::KEY_FRAME_INTERVAL, options, + encoder: Self::codec(&self) } } @@ -484,6 +488,13 @@ impl Settings { ) } + pub fn resolve_encoder(&self, encoder_name: &str) -> Option { + self.encoder = Some( + ffmpeg::encoder::find_by_name(encoder_name) + .unwrap_or(ffmpeg::encoder::find(AvCodecId::H264)?), + ) + } + /// Get encoder options. fn options(&self) -> &Options { &self.options From 9aa85b7d552779fcbfe8b991e46a4428fc1d6ee0 Mon Sep 17 00:00:00 2001 From: Aloncvt Date: Sun, 5 Oct 2025 00:25:16 +0300 Subject: [PATCH 2/2] cleaner code and bug fix. --- src/encode.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/encode.rs b/src/encode.rs index a040956..0c82061 100644 --- a/src/encode.rs +++ b/src/encode.rs @@ -488,13 +488,16 @@ impl Settings { ) } - pub fn resolve_encoder(&self, encoder_name: &str) -> Option { - self.encoder = Some( - ffmpeg::encoder::find_by_name(encoder_name) - .unwrap_or(ffmpeg::encoder::find(AvCodecId::H264)?), - ) + pub fn with_encoder(mut self, encoder_name: &str) -> Result { + let encoder = ffmpeg::encoder::find_by_name(encoder_name) + .or_else(|| ffmpeg::encoder::find(AvCodecId::H264)) + .ok_or_else(|| Error::EncoderNotFound(encoder_name.to_string()))?; + + self.encoder = Some(encoder); + Ok(self) } + /// Get encoder options. fn options(&self) -> &Options { &self.options