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
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())
|
|
}
|
|
}
|