use std::sync::{Arc, LazyLock, RwLock};
use media_codec_types::packet::Packet;
use media_core::Result;
pub use media_format_types::muxer::*;
use crate::format::{find_format_by_extension, register_format, FormatList, LazyFormatList};
static MUXER_LIST: LazyFormatList<dyn MuxerBuilder> = LazyLock::new(|| RwLock::new(FormatList::new()));
pub fn register_muxer(builder: Arc<dyn MuxerBuilder>) -> Result<()> {
register_format(&MUXER_LIST, builder)
}
pub fn find_muxer_by_extension(ext: &str) -> Result<Arc<dyn MuxerBuilder>> {
find_format_by_extension(&MUXER_LIST, ext)
}
pub struct MuxerContext<M: Muxer, W: Writer> {
muxer: M,
writer: W,
pub state: MuxerState,
}
impl<M: Muxer, W: Writer> MuxerContext<M, W> {
pub fn new(muxer: M, writer: W) -> Self {
Self {
muxer,
writer,
state: MuxerState::new(),
}
}
pub fn write_header(&mut self) -> Result<()> {
self.muxer.write_header(&mut self.writer, &self.state)
}
pub fn write_packet(&mut self, packet: &Packet) -> Result<()> {
self.muxer.write_packet(&mut self.writer, &self.state, packet)
}
pub fn write_trailer(&mut self) -> Result<()> {
self.muxer.write_trailer(&mut self.writer)
}
}