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