use std::task::Poll;
use crate::container::Timestamp;
use crate::container::{Container, Frame, Read};
const DEFAULT_TIMESCALE: u64 = 1_000_000;
#[derive(Default)]
pub struct Wire;
impl Container for Wire {
type Error = crate::Error;
fn write(&self, group: &mut moq_net::GroupProducer, frames: &[Frame]) -> Result<(), Self::Error> {
for frame in frames {
let timestamp = frame.timestamp.convert::<1_000_000>().map_err(hang::Error::from)?;
let data = moq_loc::encode(timestamp.as_micros() as u64, &frame.payload)?;
let mut chunked = group.create_frame(moq_net::Frame {
size: data.len() as u64,
})?;
chunked.write(data)?;
chunked.finish()?;
}
Ok(())
}
fn poll_read(&self, group: &mut moq_net::GroupConsumer, waiter: &kio::Waiter) -> Poll<Result<Read, Self::Error>> {
use std::task::ready;
let Some(data) = ready!(group.poll_read_frame(waiter)?) else {
return Poll::Ready(Ok(Read::Done));
};
let loc = moq_loc::decode(data)?;
let scale = loc.timescale.unwrap_or(DEFAULT_TIMESCALE);
let timestamp = Timestamp::from_scale(loc.timestamp, scale).map_err(hang::Error::from)?;
Poll::Ready(Ok(Read::Frame(Frame {
timestamp,
payload: loc.payload,
keyframe: false,
duration: None,
})))
}
}