use std::time::Duration;
use serde::{Deserialize, Serialize};
use crate::time::{TimeRange, Timestamp};
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct KeyframeInfo {
pub timestamp: Timestamp,
pub frame_number: u64,
pub picture_type: PictureType,
pub size_bytes: Option<u64>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[non_exhaustive]
pub enum PictureType {
I,
Idr,
P,
B,
Unknown,
}
impl PictureType {
#[must_use]
pub fn from_ffprobe(s: &str) -> Self {
match s.trim() {
"I" => Self::I,
"IDR" | "idr" => Self::Idr,
"P" => Self::P,
"B" => Self::B,
_ => Self::Unknown,
}
}
#[must_use]
pub fn is_keyframe(&self) -> bool {
matches!(self, Self::I | Self::Idr)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct SilenceInterval {
pub start: Timestamp,
pub end: Timestamp,
pub duration: Duration,
}
impl SilenceInterval {
#[must_use]
pub fn midpoint(&self) -> Timestamp {
let mid_us = (self.start.as_micros() + self.end.as_micros()) / 2;
Timestamp::from_micros(mid_us)
}
#[must_use]
pub fn as_range(&self) -> TimeRange {
TimeRange::new(self.start, self.end)
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Chapter {
pub index: usize,
pub range: TimeRange,
pub title: Option<String>,
}
impl Chapter {
#[must_use]
pub fn duration(&self) -> Duration {
self.range.duration()
}
}