pub struct Pacer { /* private fields */ }Expand description
Delays each buffer until its presentation time, so downstream sees
frames (or, upstream of a decoder, compressed packets) at real playback
speed instead of as fast as demux/decode can produce them. A Filter:
receives via Sink, waits in short interruptible sleeps inside
consume, then pushes the same buffer through its own (single) src pad.
A pending pause/seek/stop interrupts that wait so the owning worker can
process control: pause retains the in-flight buffer for resume, while
seek and stop discard it.
Normally place a crate::queue::Queue upstream so the paced waits do
not stall the demux/decoder feeding it and those stages can run ahead
into the queue. The type does not enforce that placement; without the
queue, pacing simply blocks the upstream caller on the same thread.
clock is shared across every Pacer in the pipeline (one per stream
— video, audio, …) so they all agree on the same t=0 instead of each
anchoring to its own first frame.
Implementations§
Trait Implementations§
Source§impl Element for Pacer
impl Element for Pacer
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§impl Sink for Pacer
impl Sink for Pacer
fn consume(&mut self, buf: MediaBuffer) -> Result<()>
Source§fn control(&mut self, msg: ControlMsg) -> Result<()>
fn control(&mut self, msg: ControlMsg) -> Result<()>
ControlMsg (pause/resume/stop) and, for anything
with a downstream of its own, forwards it on — same shape as
consume, just a separate channel from MediaBuffer so it can
reach every element (not just ones that already know how to
interpret a data buffer) and, at a crate::queue::Queue, jump
ahead of whatever data is backed up instead of waiting behind it.
No default: every Sink has to consciously decide what this means
for it, rather than silently dropping it.