You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

40 lines
1.0 KiB
Rust

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<FfmpegCodec>,
}
impl EncoderSelector {
pub fn for_codec_id(codec_id: AVCodecID) -> EncoderSelector {
EncoderSelector {
encoders: encoders_for_codec(codec_id),
}
}
pub fn select(
&self,
hwaccel: Option<bool>,
config_fn: impl Fn(&Encoder) -> Result<(), String>,
) -> Result<Encoder, String> {
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<Encoder, String> {
config_fn(&d)?;
Ok(d)
})
{
return Ok(encoder);
}
}
Err("No working encoders found".to_string())
}
}