use std::io::{BufRead, Seek};
use bitflags::bitflags;
use media_codec_types::packet::Packet;
use media_core::{variant::Variant, Result};
use crate::{
format::{Format, FormatBuilder},
stream::StreamCollection,
track::TrackCollection,
};
pub trait Reader: BufRead + Seek {}
impl<T: BufRead + Seek> Reader for T {}
bitflags! {
#[repr(transparent)]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct SeekFlags: u32 {
const BACKWARD = 1;
const ANY = 2;
}
}
pub struct DemuxerState {
pub start_time: Option<i64>,
pub duration: Option<i64>,
pub metadata: Option<Variant>,
pub tracks: TrackCollection,
pub streams: StreamCollection,
}
impl DemuxerState {
pub fn new() -> Self {
Self {
streams: StreamCollection::new(),
tracks: TrackCollection::new(),
start_time: None,
duration: None,
metadata: None,
}
}
}
impl Default for DemuxerState {
fn default() -> Self {
Self::new()
}
}
pub trait Demuxer: Format {
fn read_header(&mut self, reader: &mut dyn Reader, state: &mut DemuxerState) -> Result<()>;
fn read_packet(&mut self, reader: &mut dyn Reader, state: &DemuxerState) -> Result<Packet<'static>>;
fn seek(&mut self, reader: &mut dyn Reader, state: &DemuxerState, track_index: Option<usize>, timestamp_us: i64, flags: SeekFlags) -> Result<()>;
}
pub trait DemuxerBuilder: FormatBuilder {
fn new_demuxer(&self) -> Result<Box<dyn Demuxer>>;
fn probe(&self, reader: &mut dyn Reader) -> bool;
}