use crate::Result;
enum ContainerImpl<E: crate::catalog::hang::CatalogExt = ()> {
Fmp4(Box<crate::container::fmp4::Import<E>>),
Mkv(Box<crate::container::mkv::Import<E>>),
Ts(Box<crate::container::ts::Import<E>>),
Flv(Box<crate::container::flv::Import<E>>),
}
impl<E: crate::catalog::hang::CatalogExt> ContainerImpl<E> {
fn fmp4(broadcast: moq_net::BroadcastProducer, catalog: crate::catalog::Producer<E>) -> Self {
ContainerImpl::Fmp4(Box::new(crate::container::fmp4::Import::new(broadcast, catalog)))
}
fn mkv(broadcast: moq_net::BroadcastProducer, catalog: crate::catalog::Producer<E>) -> Self {
ContainerImpl::Mkv(Box::new(crate::container::mkv::Import::new(broadcast, catalog)))
}
fn ts(broadcast: moq_net::BroadcastProducer, catalog: crate::catalog::Producer<E>) -> Self {
ContainerImpl::Ts(Box::new(crate::container::ts::Import::new(broadcast, catalog)))
}
fn flv(broadcast: moq_net::BroadcastProducer, catalog: crate::catalog::Producer<E>) -> Self {
ContainerImpl::Flv(Box::new(crate::container::flv::Import::new(broadcast, catalog)))
}
fn decode(&mut self, data: &[u8]) -> Result<()> {
match self {
ContainerImpl::Fmp4(decoder) => decoder.decode(data),
ContainerImpl::Mkv(decoder) => decoder.decode(data),
ContainerImpl::Ts(decoder) => decoder.decode(data).map_err(Into::into),
ContainerImpl::Flv(decoder) => decoder.decode(data).map_err(Into::into),
}
}
fn finish(&mut self) -> Result<()> {
match self {
ContainerImpl::Fmp4(decoder) => decoder.finish(),
ContainerImpl::Mkv(decoder) => decoder.finish(),
ContainerImpl::Ts(decoder) => decoder.finish().map_err(Into::into),
ContainerImpl::Flv(decoder) => decoder.finish().map_err(Into::into),
}
}
fn seek(&mut self, sequence: u64) -> Result<()> {
match self {
ContainerImpl::Fmp4(decoder) => decoder.seek(sequence),
ContainerImpl::Mkv(decoder) => decoder.seek(sequence),
ContainerImpl::Ts(decoder) => decoder.seek(sequence).map_err(Into::into),
ContainerImpl::Flv(decoder) => decoder.seek(sequence).map_err(Into::into),
}
}
}
pub struct Container<E: crate::catalog::hang::CatalogExt = ()> {
inner: ContainerImpl<E>,
}
impl<E: crate::catalog::hang::CatalogExt> Container<E> {
pub fn new(
broadcast: moq_net::BroadcastProducer,
catalog: crate::catalog::Producer<E>,
format: &str,
init: &[u8],
) -> Result<Self> {
let mut inner = match format {
"fmp4" | "cmaf" => ContainerImpl::fmp4(broadcast, catalog),
"mkv" | "webm" | "matroska" => ContainerImpl::mkv(broadcast, catalog),
"ts" | "mpegts" | "mpeg2ts" | "m2ts" => ContainerImpl::ts(broadcast, catalog),
"flv" => ContainerImpl::flv(broadcast, catalog),
_ => return Err(crate::Error::UnknownFormat(format.to_string())),
};
inner.decode(init)?;
Ok(Self { inner })
}
pub fn decode(&mut self, data: &[u8]) -> Result<()> {
self.inner.decode(data)
}
pub fn finish(&mut self) -> Result<()> {
self.inner.finish()
}
pub fn seek(&mut self, sequence: u64) -> Result<()> {
self.inner.seek(sequence)
}
}
pub struct ContainerStream<E: crate::catalog::hang::CatalogExt = ()> {
inner: ContainerImpl<E>,
}
impl<E: crate::catalog::hang::CatalogExt> ContainerStream<E> {
pub fn new(
broadcast: moq_net::BroadcastProducer,
catalog: crate::catalog::Producer<E>,
format: &str,
) -> Result<Self> {
let inner = match format {
"fmp4" | "cmaf" => ContainerImpl::fmp4(broadcast, catalog),
"mkv" | "webm" | "matroska" => ContainerImpl::mkv(broadcast, catalog),
"ts" | "mpegts" | "mpeg2ts" | "m2ts" => ContainerImpl::ts(broadcast, catalog),
"flv" => ContainerImpl::flv(broadcast, catalog),
_ => return Err(crate::Error::UnknownFormat(format.to_string())),
};
Ok(Self { inner })
}
pub fn decode(&mut self, data: &[u8]) -> Result<()> {
self.inner.decode(data)
}
pub fn finish(&mut self) -> Result<()> {
self.inner.finish()
}
pub fn seek(&mut self, sequence: u64) -> Result<()> {
self.inner.seek(sequence)
}
}