use crate::catalog::hang::CatalogExt;
use crate::catalog::{Reserved, VideoHint, VideoTrack};
pub(crate) struct Catalog {
hint: VideoHint,
timeline: hang::catalog::Timeline,
last: Option<hang::catalog::VideoConfig>,
}
impl Catalog {
pub(crate) fn new(reserved: &Reserved<impl CatalogExt>, name: &str, hint: VideoHint) -> crate::Result<Self> {
Ok(Self {
timeline: reserved.producer().timeline(name)?.section(),
hint,
last: None,
})
}
pub(crate) fn initial_config(&self) -> Option<hang::catalog::VideoConfig> {
self.hint.to_config()
}
pub(crate) fn configured(&self) -> bool {
self.last.is_some()
}
pub(crate) fn publish(
&mut self,
rendition: &mut VideoTrack<impl CatalogExt>,
mut config: hang::catalog::VideoConfig,
) {
self.hint.apply(&mut config);
config.timeline = Some(self.timeline.clone());
if self.last.as_ref() == Some(&config) {
return;
}
tracing::debug!(name = ?rendition.name(), ?config, "starting track");
rendition.set(config.clone());
self.last = Some(config);
}
}