#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum VideoCodec {
H264,
H265,
}
impl VideoCodec {
pub fn encoder(self) -> &'static str {
match self {
VideoCodec::H264 => "libx264",
VideoCodec::H265 => "libx265",
}
}
pub fn mp4_tag(self) -> Option<&'static str> {
match self {
VideoCodec::H264 => None,
VideoCodec::H265 => Some("hvc1"),
}
}
pub fn label(self) -> &'static str {
match self {
VideoCodec::H264 => "H.264",
VideoCodec::H265 => "H.265",
}
}
pub fn crf_search_bounds(self) -> (u8, u8) {
match self {
VideoCodec::H264 => (18, 32),
VideoCodec::H265 => (22, 36),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AudioCodec {
Aac,
Opus,
Mp3,
}
impl AudioCodec {
pub fn encoder(self) -> &'static str {
match self {
AudioCodec::Aac => "aac",
AudioCodec::Opus => "libopus",
AudioCodec::Mp3 => "libmp3lame",
}
}
pub fn extension(self) -> &'static str {
match self {
AudioCodec::Aac => "m4a",
AudioCodec::Opus => "opus",
AudioCodec::Mp3 => "mp3",
}
}
pub fn label(self) -> &'static str {
match self {
AudioCodec::Aac => "AAC",
AudioCodec::Opus => "Opus",
AudioCodec::Mp3 => "MP3",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AudioChoice {
Keep,
Bitrate(u64),
Drop,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ResolutionOpt {
Auto,
Height(u32),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FpsOpt {
Auto,
Cap(u32),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum QualityPreset {
Fast,
Balanced,
Max,
}
impl QualityPreset {
pub fn encoder_preset(self) -> &'static str {
match self {
QualityPreset::Fast => "veryfast",
QualityPreset::Balanced => "medium",
QualityPreset::Max => "slow",
}
}
pub fn default_crf(self, codec: VideoCodec) -> u8 {
match codec {
VideoCodec::H264 => match self {
QualityPreset::Fast => 25,
QualityPreset::Balanced => 23,
QualityPreset::Max => 20,
},
VideoCodec::H265 => match self {
QualityPreset::Fast => 30,
QualityPreset::Balanced => 28,
QualityPreset::Max => 24,
},
}
}
}