Skip to main content

moq_rtc/codec/
opus.rs

1//! Opus bridge.
2//!
3//! str0m hands us one Opus packet per frame, which is exactly the
4//! raw shape that [`moq_mux::codec::opus::Import`] consumes.
5
6use crate::{Result, codec};
7
8pub struct Bridge {
9	import: moq_mux::codec::opus::Import,
10}
11
12impl Bridge {
13	pub fn new(
14		mut broadcast: moq_net::BroadcastProducer,
15		catalog: moq_mux::catalog::Producer,
16		sample_rate: u32,
17		channel_count: u32,
18	) -> Result<Self> {
19		let config = moq_mux::codec::opus::Config {
20			sample_rate,
21			channel_count,
22		};
23		let track = moq_mux::import::unique_track(&mut broadcast, ".opus")?;
24		let import = moq_mux::codec::opus::Import::new(track, catalog, config)?;
25		Ok(Self { import })
26	}
27}
28
29impl codec::Bridge for Bridge {
30	fn push(&mut self, frame: codec::Frame) -> Result<()> {
31		let pts = moq_mux::container::Timestamp::from_micros(frame.timestamp_us)
32			.map_err(|err| crate::Error::Other(anyhow::anyhow!("invalid timestamp: {err}")))?;
33		self.import.decode(&frame.payload, Some(pts))?;
34		Ok(())
35	}
36}