pub struct FileDemuxer { /* private fields */ }Expand description
Demuxes a file, exposing one src pad per container stream (indexed the
same way as StreamInfo::index). Linking a pad “selects” that stream;
leaving it unlinked just drops its packets. Real demuxer I/O is
blocking, so this is meant to be run as the pipeline’s source thread.
Fan-out (e.g. routing video and audio to separate branches) needs no separate “Tee” element here — it’s just a matter of linking more than one of these pads.
Set to loop through FileDemuxer::looping_handle and the end of the
file rewinds to the start instead of ending the stream. Timestamps then
keep climbing across the join rather than restarting: what a lap already
reached is added to every later one, so a Pacer still paces, a muxer
still sees its timestamps advance, and nothing downstream has to know a
join happened. The consequence is that a looping source’s timestamps are
no longer positions in the file — one second into the third lap is at
twice the file’s length plus a second — and FileDemuxer::seek stays
the way to speak in the file’s own timeline.
Implementations§
Source§impl FileDemuxer
impl FileDemuxer
Sourcepub fn open(
name: impl Into<String>,
path: impl AsRef<Path>,
) -> Result<(Self, Vec<StreamInfo>), FileDemuxError>
pub fn open( name: impl Into<String>, path: impl AsRef<Path>, ) -> Result<(Self, Vec<StreamInfo>), FileDemuxError>
Opens the file and returns it alongside every stream it contains,
so the caller can inspect them (count, media type, …) before
deciding which of src_pads() to link.
Sourcepub fn looping_handle(&self) -> FileDemuxerHandle
pub fn looping_handle(&self) -> FileDemuxerHandle
The control endpoint for looping this file, valid for as long as the
demuxer runs — take it here, before moving the demuxer into its
pipeline, and keep it for as long as the loop is meant to be
switchable. See FileDemuxerHandle::set_looping.
Sourcepub fn stream_parameters(&self, index: usize) -> Option<Parameters>
pub fn stream_parameters(&self, index: usize) -> Option<Parameters>
Codec parameters for one of this file’s streams — what you need to
construct a matching crate::elements::SwDecoder for it.
Sourcepub fn stream_time_base(&self, index: usize) -> Option<Rational>
pub fn stream_time_base(&self, index: usize) -> Option<Rational>
The unit decoded frame timestamps for this stream are expressed in —
what you need to construct a matching crate::elements::Pacer for
it.
Trait Implementations§
Source§impl Element for FileDemuxer
impl Element for FileDemuxer
Source§fn name(&self) -> Arc<str> ⓘ
fn name(&self) -> Arc<str> ⓘ
crate::bus::BusEvent stores names as
Arc<str> for exactly this reason: a hot path like
crate::queue::Queue posting BusEvent::Dropped once per
overflowed buffer shouldn’t pay for a fresh heap allocation every
time it wants to report which element it is.Source§fn element_type(&self) -> ElementType
fn element_type(&self) -> ElementType
ElementType.Source§fn pp_log(&self) -> &PpLog
fn pp_log(&self) -> &PpLog
crate::bus::Bus::post — same
id/name as Element::name, just already wrapped as the
crate::pp_log::PpLog its pp_info!/pp_warn!/pp_error! macros need. A
stored private field, not built fresh per call, for the same reason
name() returns a cheap Arc<str> clone instead of a fresh String
— see its own docs.Source§fn pp_log_mut(&mut self) -> &mut PpLog
fn pp_log_mut(&mut self) -> &mut PpLog
Element::pp_log reads — used by
crate::pipeline::ChainBuilder to stamp the owning
crate::pipeline::Pipeline’s id onto every element that
passes through it, via element_pp_log. Not meant to be called
from anywhere else.Source§fn graph_id(&self) -> Option<ElementId>
fn graph_id(&self) -> Option<ElementId>
ChainBuilder and keep the default None implementation.Source§fn attach_context(&mut self, _context: &Arc<Context>)
fn attach_context(&mut self, _context: &Arc<Context>)
Element::pp_log_mut hands it the pipeline’s
identity: the clock, the playback clock and the bus are the
pipeline’s to give, not the caller’s to choose. Read moreSource§impl Source for FileDemuxer
impl Source for FileDemuxer
Source§impl SourceElement for FileDemuxer
impl SourceElement for FileDemuxer
Source§fn is_live(&self) -> bool
fn is_live(&self) -> bool
Source§fn is_seekable(&self) -> bool
fn is_seekable(&self) -> bool
Self::seek. Read moreSource§fn run(&mut self, control: &ControlReceiver, bus: &Bus) -> Result<()>
fn run(&mut self, control: &ControlReceiver, bus: &Bus) -> Result<()>
Eos (normal completion),
crate::pipeline::Pipeline::finish, or Stop (see
ControlMsg::Stop) — call crate::control::drain_control
once per loop iteration to make control responsive between
blocking reads. Read moreSource§fn on_control(&mut self, msg: &ControlMsg)
fn on_control(&mut self, msg: &ControlMsg)
Self::seek gets, and for the same
reason: whatever this source holds must already reflect the message by
the time downstream elements see it. Read moreSource§fn seek(&mut self, target: Duration) -> Result<Duration>
fn seek(&mut self, target: Duration) -> Result<Duration>
target, an absolute position from the
start of the media (e.g. av_seek_frame for
crate::elements::FileDemuxer). Called by
crate::control::drain_control as part of handling
ControlMsg::Seek, before that message is forwarded to the
source’s own pads — so whatever’s read next comes from the new
position by the time downstream elements receive the new timeline
announcement. Buffered and stateful old-timeline data is discarded by
the preceding ControlMsg::Flush. Read more