#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum DurationKind {
Duration,
StopAt,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct DurationBound {
pub(crate) kind: DurationKind,
pub(crate) us: i64,
pub(crate) token_index: usize,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct Noop {
pub(crate) flag: String,
pub(crate) value: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub(crate) struct InputIr {
pub(crate) url: String,
pub(crate) format: Option<String>,
pub(crate) start_time_us: Option<i64>,
pub(crate) duration: Option<DurationBound>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub(crate) struct OutputIr {
pub(crate) url: String,
pub(crate) format: Option<String>,
pub(crate) start_time_us: Option<i64>,
pub(crate) duration: Option<DurationBound>,
pub(crate) video_disabled: bool,
pub(crate) audio_disabled: bool,
pub(crate) video_codec: Option<String>,
pub(crate) audio_codec: Option<String>,
pub(crate) video_copy: bool,
pub(crate) audio_copy: bool,
pub(crate) video_bitrate: Option<String>,
pub(crate) audio_bitrate: Option<String>,
pub(crate) crf: Option<String>,
pub(crate) preset: Option<String>,
pub(crate) pix_fmt: Option<String>,
pub(crate) audio_sample_rate: Option<i32>,
pub(crate) audio_channels: Option<i32>,
pub(crate) frames_v: Option<i64>,
pub(crate) video_filter: Option<String>,
pub(crate) maps: Vec<String>,
pub(crate) map_indexes: Vec<usize>,
pub(crate) movflags_faststart: bool,
pub(crate) hls_time: Option<String>,
pub(crate) hls_playlist_type: Option<String>,
pub(crate) hls_list_size: Option<String>,
pub(crate) hls_segment_filename: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub(crate) struct GlobalsIr {
pub(crate) overwrite: bool,
pub(crate) noops: Vec<Noop>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct CliIr {
pub(crate) globals: GlobalsIr,
pub(crate) input: InputIr,
pub(crate) output: OutputIr,
pub(crate) spans: Vec<(String, usize)>,
}
impl CliIr {
pub(crate) fn span(&self, key: &str) -> Option<usize> {
self.spans
.iter()
.find(|(recorded, _)| recorded == key)
.map(|(_, index)| *index)
}
}
impl CliIr {
pub(crate) fn fingerprint(&self) -> Vec<&'static str> {
let mut keys: Vec<&'static str> = Vec::new();
let input = &self.input;
let output = &self.output;
if input.format.is_some() {
keys.push("in:-f");
}
if input.start_time_us.is_some() {
keys.push("in:-ss");
}
match input.duration.map(|d| d.kind) {
Some(DurationKind::Duration) => keys.push("in:-t"),
Some(DurationKind::StopAt) => keys.push("in:-to"),
None => {}
}
if output.format.is_some() {
keys.push("out:-f");
}
if output.start_time_us.is_some() {
keys.push("out:-ss");
}
match output.duration.map(|d| d.kind) {
Some(DurationKind::Duration) => keys.push("out:-t"),
Some(DurationKind::StopAt) => keys.push("out:-to"),
None => {}
}
if output.video_disabled {
keys.push("out:-vn");
}
if output.audio_disabled {
keys.push("out:-an");
}
if output.video_codec.is_some() {
keys.push("out:-c:v");
}
if output.audio_codec.is_some() {
keys.push("out:-c:a");
}
if output.video_copy {
keys.push("out:-c:v copy");
}
if output.audio_copy {
keys.push("out:-c:a copy");
}
if output.video_bitrate.is_some() {
keys.push("out:-b:v");
}
if output.audio_bitrate.is_some() {
keys.push("out:-b:a");
}
if output.crf.is_some() {
keys.push("out:-crf");
}
if output.preset.is_some() {
keys.push("out:-preset");
}
if output.pix_fmt.is_some() {
keys.push("out:-pix_fmt");
}
if output.audio_sample_rate.is_some() {
keys.push("out:-ar");
}
if output.audio_channels.is_some() {
keys.push("out:-ac");
}
if output.frames_v.is_some() {
keys.push("out:-frames:v");
}
if output.video_filter.is_some() {
keys.push("out:-vf");
}
if !output.maps.is_empty() {
keys.push("out:-map");
}
if output.movflags_faststart {
keys.push("out:-movflags");
}
if output.hls_time.is_some() {
keys.push("out:-hls_time");
}
if output.hls_playlist_type.is_some() {
keys.push("out:-hls_playlist_type");
}
if output.hls_list_size.is_some() {
keys.push("out:-hls_list_size");
}
if output.hls_segment_filename.is_some() {
keys.push("out:-hls_segment_filename");
}
keys.sort_unstable();
keys
}
}