use async_trait::async_trait;
use oximedia_core::OxiResult;
use crate::{Packet, ProbeResult, SeekFlags, SeekTarget, StreamInfo};
#[async_trait]
pub trait Demuxer: Send {
async fn probe(&mut self) -> OxiResult<ProbeResult>;
async fn read_packet(&mut self) -> OxiResult<Packet>;
fn streams(&self) -> &[StreamInfo];
async fn seek(&mut self, _target: SeekTarget) -> OxiResult<()> {
Err(oximedia_core::OxiError::unsupported(
"Seeking not supported",
))
}
async fn seek_to_time(&mut self, timestamp: f64) -> OxiResult<()> {
self.seek(SeekTarget::time(timestamp)).await
}
async fn seek_to_frame(&mut self, stream_index: usize, frame_index: i64) -> OxiResult<()> {
let streams = self.streams();
if stream_index >= streams.len() {
return Err(oximedia_core::OxiError::InvalidData(format!(
"Stream index {stream_index} out of range"
)));
}
let stream = &streams[stream_index];
#[allow(clippy::cast_precision_loss)]
let timestamp =
(frame_index as f64 * stream.timebase.num as f64) / stream.timebase.den as f64;
let target = SeekTarget::time(timestamp)
.with_stream(stream_index)
.add_flags(SeekFlags::FRAME_ACCURATE);
self.seek(target).await
}
fn is_seekable(&self) -> bool {
false
}
}