use super::Config;
use crate::catalog::hang::CatalogExt;
use crate::container::Frame;
pub struct Import<E: CatalogExt = ()> {
track: crate::container::Producer<crate::catalog::hang::Container>,
rendition: crate::catalog::AudioTrack<E>,
}
impl<E: CatalogExt> Import<E> {
pub fn new(
track: moq_net::track::Producer,
reserved: crate::catalog::Reserved<E>,
mut config: hang::catalog::AudioConfig,
) -> crate::Result<Self> {
tracing::debug!(name = ?track.name(), ?config, "starting track");
config.timeline = Some(reserved.producer().timeline(track.name())?.section());
let mut rendition = reserved.audio(track.name());
rendition.set(config);
Ok(Self {
track: reserved
.producer()
.media_producer(track, crate::catalog::hang::Container::Legacy)?,
rendition,
})
}
pub fn name(&self) -> &str {
self.track.track().name()
}
pub fn demand(&self) -> moq_net::track::Demand {
self.track.track().demand()
}
pub fn finish(&mut self) -> crate::Result<()> {
self.rendition.record_group_end(None);
self.track.finish()?;
Ok(())
}
pub fn abort(self, err: moq_net::Error) {
self.track.abort(err);
}
pub fn cut(&mut self, end: Option<moq_net::Timestamp>) -> crate::Result<()> {
self.rendition.record_group_end(end);
self.track.cut(end)?;
Ok(())
}
pub fn seek(&mut self, sequence: u64) -> crate::Result<()> {
self.rendition.record_group_end(None);
self.track.seek(sequence)?;
Ok(())
}
pub fn decode<B: moq_net::IntoBytes>(&mut self, frame: B, pts: Option<moq_net::Timestamp>) -> crate::Result<()> {
let timestamp = self.rendition.timestamp(pts)?;
self.rendition.record_group_end(Some(timestamp));
let bytes = frame.as_ref().len();
self.track.write(Frame {
timestamp,
payload: frame.into_bytes(),
keyframe: true,
duration: None,
})?;
self.track.cut(None)?;
self.rendition.record_frame(timestamp, bytes);
Ok(())
}
}
pub fn config(init: &[u8]) -> crate::Result<hang::catalog::AudioConfig> {
let mut buf = init;
Ok(Config::parse(&mut buf)?.into())
}
impl From<Config> for hang::catalog::AudioConfig {
fn from(config: Config) -> Self {
let mut audio = hang::catalog::AudioConfig::new(
hang::catalog::AudioCodec::Opus,
config.sample_rate,
config.channel_count,
);
audio.container = hang::catalog::Container::Legacy;
audio
}
}