use std::task::Poll;
use bytes::Bytes;
mod consumer;
pub(crate) mod jitter;
mod producer;
mod source;
pub mod flv;
pub mod fmp4;
pub mod legacy;
pub mod loc;
pub mod mkv;
pub mod ts;
pub use consumer::Consumer;
pub use producer::Producer;
pub(crate) use source::ExportSource;
pub type Timestamp = moq_net::Timescale<1_000_000>;
#[derive(Clone, Debug)]
pub struct Frame {
pub timestamp: Timestamp,
pub duration: Option<Timestamp>,
pub payload: Bytes,
pub keyframe: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, thiserror::Error)]
#[error("missing keyframe: a group must open on a keyframe")]
pub struct MissingKeyframe;
pub trait Container {
type Error: std::error::Error + Send + Sync + Unpin + From<moq_net::Error> + From<MissingKeyframe>;
fn write(&self, group: &mut moq_net::GroupProducer, frames: &[Frame]) -> Result<(), Self::Error>;
fn poll_read(&self, group: &mut moq_net::GroupConsumer, waiter: &kio::Waiter) -> Poll<Result<Read, Self::Error>>;
fn read(&self, group: &mut moq_net::GroupConsumer) -> impl std::future::Future<Output = Result<Read, Self::Error>>
where
Self: Sync,
{
async { kio::wait(|waiter| self.poll_read(group, waiter)).await }
}
}
#[derive(Debug)]
#[non_exhaustive]
pub enum Read {
Done,
Frame(Frame),
Fragment(Vec<Frame>),
}
impl Read {
pub fn frames(&self) -> &[Frame] {
match self {
Read::Done => &[],
Read::Frame(frame) => std::slice::from_ref(frame),
Read::Fragment(frames) => frames,
}
}
}
impl<'a> IntoIterator for &'a Read {
type Item = &'a Frame;
type IntoIter = std::slice::Iter<'a, Frame>;
fn into_iter(self) -> Self::IntoIter {
self.frames().iter()
}
}