use std::task::Poll;
use moq_net::{Timescale, Timestamp};
use crate::container::{Container, Frame};
const DEFAULT_TIMESCALE: Timescale = Timescale::MICRO;
#[derive(Default)]
pub struct Wire;
impl Container for Wire {
type Error = crate::Error;
fn write(&self, group: &mut moq_net::group::Producer, frames: &[Frame]) -> Result<(), Self::Error> {
for frame in frames {
let timestamp = frame.timestamp.convert(DEFAULT_TIMESCALE).map_err(hang::Error::from)?;
let data = moq_loc::encode(timestamp.value(), &frame.payload)?;
let mut chunked = group.create_frame(moq_net::frame::Info {
size: data.len() as u64,
timestamp: frame.timestamp,
})?;
chunked.write(data)?;
chunked.finish()?;
}
Ok(())
}
fn poll_read(
&self,
group: &mut moq_net::group::Consumer,
waiter: &kio::Waiter,
) -> Poll<Result<Option<Vec<Frame>>, Self::Error>> {
use std::task::ready;
let Some(frame) = ready!(group.poll_read_frame(waiter)?) else {
return Poll::Ready(Ok(None));
};
let loc = moq_loc::decode(frame.payload)?;
let scale = loc
.timescale
.and_then(|s| Timescale::new(s).ok())
.unwrap_or(DEFAULT_TIMESCALE);
let timestamp = Timestamp::new(loc.timestamp, scale).map_err(hang::Error::from)?;
Poll::Ready(Ok(Some(vec![Frame {
timestamp,
payload: loc.payload,
keyframe: false,
duration: None,
}])))
}
}