use std::io::{BufWriter, Seek, Write};
use media_codec_types::packet::Packet;
use media_core::{variant::Variant, Result};
use crate::{
format::{Format, FormatBuilder},
stream::StreamCollection,
track::TrackCollection,
};
pub trait Writer: Write + Seek {}
impl<W: Write + Seek> Writer for BufWriter<W> {}
pub struct MuxerState {
pub metadata: Variant,
pub tracks: TrackCollection,
pub streams: StreamCollection,
}
impl MuxerState {
pub fn new() -> Self {
Self {
streams: StreamCollection::new(),
tracks: TrackCollection::new(),
metadata: Variant::new_dict(),
}
}
}
impl Default for MuxerState {
fn default() -> Self {
Self::new()
}
}
pub trait Muxer: Format {
fn write_header(&mut self, writer: &mut dyn Write, state: &MuxerState) -> Result<()>;
fn write_packet(&mut self, writer: &mut dyn Writer, state: &MuxerState, packet: &Packet) -> Result<()>;
fn write_trailer(&mut self, writer: &mut dyn Writer) -> Result<()>;
}
pub trait MuxerBuilder: FormatBuilder {
fn new_muxer(&self) -> Result<Box<dyn Muxer>>;
}