1use crate::{Result, codec};
8
9pub struct Bridge {
11 split: moq_mux::codec::av1::Split,
12 import: moq_mux::codec::av1::Import,
13}
14
15impl Bridge {
16 pub fn new(mut broadcast: moq_net::broadcast::Producer, catalog: moq_mux::catalog::Producer) -> Result<Self> {
18 let track = broadcast.unique_track(".av1", catalog.track_info())?;
19 let import = moq_mux::codec::av1::Import::new(track, catalog.reserve(), Default::default())?;
20 let split = moq_mux::codec::av1::Split::new();
21 Ok(Self { split, import })
22 }
23}
24
25impl codec::Bridge for Bridge {
26 fn push(&mut self, frame: codec::Frame) -> Result<()> {
27 let pts = moq_net::Timestamp::from_micros(frame.timestamp_us)
28 .map_err(|err| crate::Error::Other(anyhow::anyhow!("invalid timestamp: {err}")))?;
29 let mut frames = self.split.decode(&frame.payload, Some(pts))?;
31 frames.extend(self.split.flush(Some(pts))?);
32 self.import.decode(frames)?;
33 Ok(())
34 }
35
36 fn abort(self: Box<Self>, err: moq_net::Error) {
37 self.import.abort(err);
38 }
39}