pub mod registry;
use oxideav_core::{CodecResolver, Packet, Result, StreamInfo};
use std::io::{Read, Seek, Write};
pub trait Demuxer: Send {
fn format_name(&self) -> &str;
fn streams(&self) -> &[StreamInfo];
fn next_packet(&mut self) -> Result<Packet>;
fn set_active_streams(&mut self, _indices: &[u32]) {}
fn seek_to(&mut self, _stream_index: u32, _pts: i64) -> Result<i64> {
Err(oxideav_core::Error::unsupported(
"this demuxer does not support seeking",
))
}
fn metadata(&self) -> &[(String, String)] {
&[]
}
fn duration_micros(&self) -> Option<i64> {
None
}
fn attached_pictures(&self) -> &[oxideav_core::AttachedPicture] {
&[]
}
}
pub trait Muxer: Send {
fn format_name(&self) -> &str;
fn write_header(&mut self) -> Result<()>;
fn write_packet(&mut self, packet: &Packet) -> Result<()>;
fn write_trailer(&mut self) -> Result<()>;
}
pub type OpenDemuxerFn =
fn(input: Box<dyn ReadSeek>, codecs: &dyn CodecResolver) -> Result<Box<dyn Demuxer>>;
pub type OpenMuxerFn =
fn(output: Box<dyn WriteSeek>, streams: &[StreamInfo]) -> Result<Box<dyn Muxer>>;
pub struct ProbeData<'a> {
pub buf: &'a [u8],
pub ext: Option<&'a str>,
}
pub type ProbeScore = u8;
pub const MAX_PROBE_SCORE: ProbeScore = 100;
pub const PROBE_SCORE_EXTENSION: ProbeScore = 25;
pub type ProbeFn = fn(probe: &ProbeData) -> ProbeScore;
pub trait ReadSeek: Read + Seek + Send {}
impl<T: Read + Seek + Send> ReadSeek for T {}
pub trait WriteSeek: Write + Seek + Send {}
impl<T: Write + Seek + Send> WriteSeek for T {}
pub use registry::ContainerRegistry;
#[cfg(test)]
mod tests {
use super::*;
use oxideav_core::Error;
struct DummyDemuxer;
impl Demuxer for DummyDemuxer {
fn format_name(&self) -> &str {
"dummy"
}
fn streams(&self) -> &[StreamInfo] {
&[]
}
fn next_packet(&mut self) -> Result<Packet> {
Err(Error::Eof)
}
}
#[test]
fn default_seek_to_is_unsupported() {
let mut d = DummyDemuxer;
match d.seek_to(0, 0) {
Err(Error::Unsupported(_)) => {}
other => panic!(
"expected default seek_to to return Unsupported, got {:?}",
other
),
}
}
}