use crate::av::encoder::Encoder; use crate::av::xcoder::XCoder; use crate::av::{encoders_for_codec, FfmpegCodec}; use ffmpeg_sys_next::AVCodecID; pub struct EncoderSelector { encoders: Vec, } impl EncoderSelector { pub fn for_codec_id(codec_id: AVCodecID) -> EncoderSelector { EncoderSelector { encoders: encoders_for_codec(codec_id), } } pub fn select( &self, hwaccel: Option, config_fn: impl Fn(&Encoder) -> Result<(), String>, ) -> Result { for encoder in &self.encoders { if !hwaccel.is_none() && hwaccel != Some(encoder.hwaccel) { continue; } if let Some(Ok(encoder)) = Encoder::from_name(&encoder.name).map(|d| -> Result { config_fn(&d)?; Ok(d) }) { return Ok(encoder); } } Err("No working encoders found".to_string()) } }