use codec::encode::tuning::{QualityTarget, SpeedTier};
use codec::encode::{AUTO_FROM_TARGET, EncoderConfig};
#[derive(Debug, Clone)]
pub struct Quality {
pub crf: Option<u8>,
pub speed_preset: Option<u8>,
pub target: QualityTarget,
pub tier: SpeedTier,
pub keyframe_interval: Option<u32>,
}
impl Default for Quality {
fn default() -> Self {
Self {
crf: None,
speed_preset: None,
target: QualityTarget::Standard,
tier: SpeedTier::Standard,
keyframe_interval: None,
}
}
}
impl Quality {
pub fn crf(crf: u8) -> Self {
Self {
crf: Some(crf),
..Default::default()
}
}
pub fn target(target: QualityTarget) -> Self {
Self {
target,
..Default::default()
}
}
pub(crate) fn apply(&self, cfg: &mut EncoderConfig, frame_rate: f64) {
cfg.target = self.target;
cfg.tier = self.tier;
cfg.quality = self.crf.unwrap_or(AUTO_FROM_TARGET);
cfg.speed_preset = self.speed_preset.unwrap_or(AUTO_FROM_TARGET);
cfg.keyframe_interval = self
.keyframe_interval
.unwrap_or_else(|| (frame_rate * 2.0).round().max(1.0) as u32);
}
}
#[derive(Debug, Clone)]
pub struct Rung {
pub width: u32,
pub height: u32,
pub label: String,
pub quality: Quality,
}
impl Rung {
pub fn new(width: u32, height: u32) -> Self {
Self {
width,
height,
label: format!("{}p", width.min(height)),
quality: Quality::default(),
}
}
pub fn with_quality(mut self, quality: Quality) -> Self {
self.quality = quality;
self
}
pub fn with_label(mut self, label: impl Into<String>) -> Self {
self.label = label.into();
self
}
pub fn short_side(&self) -> u32 {
self.width.min(self.height)
}
}