use std::task::Poll;
use crate::container::{Container, Frame, Kind};
pub struct Wire(
pub Kind,
);
impl Container for Wire {
type Error = crate::Error;
fn end(&self, frame: &Frame) -> Option<moq_net::Timestamp> {
(self.0 != Kind::Data && frame.payload.is_empty()).then_some(frame.timestamp)
}
fn kind(&self) -> Kind {
self.0
}
fn finish_group(
&self,
group: &mut moq_net::group::Producer,
end: Option<moq_net::Timestamp>,
) -> Result<(), Self::Error> {
if self.0 == Kind::Video
&& let Some(timestamp) = end
{
hang::container::Frame {
timestamp,
payload: bytes::Bytes::new(),
}
.write_to(group)?;
}
Ok(())
}
fn write(&self, group: &mut moq_net::group::Producer, frames: &[Frame]) -> Result<(), Self::Error> {
for frame in frames {
let hang_frame = hang::container::Frame {
timestamp: frame.timestamp,
payload: frame.payload.clone(),
};
hang_frame.write_to(group)?;
}
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(data) = ready!(group.poll_read_frame(waiter).map_err(hang::Error::from)?) else {
return Poll::Ready(Ok(None));
};
let hang_frame = hang::container::Frame::decode(data.payload)?;
Poll::Ready(Ok(Some(vec![Frame {
timestamp: hang_frame.timestamp,
payload: hang_frame.payload,
keyframe: false,
duration: None,
}])))
}
}