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