pub struct AppSource { /* private fields */ }Expand description
A source whose data comes from application code pushing buffers in,
rather than this element reading them itself — GStreamer’s appsrc
equivalent, the reverse of crate::elements::AppSink. Push encoded
MediaBuffer::Packets (straight into a decoder) or already-decoded
MediaBuffer::Video/MediaBuffer::Audio (e.g. frames from a
camera SDK, or synthetic test data) via AppSourceHandle, from any
thread — a live capture callback, a network receive loop, a test.
Unlike crate::elements::FileDemuxer, whose blocking read can only
be checked against ControlMsg once per
loop iteration (see drain_control’s docs), AppSource::run selects
on its control channel and its data channel together — a Stop (or
any other control message) is handled the moment it arrives, even if
AppSourceHandle::push never gets called again.
Push MediaBuffer::Eos when done, or just drop every
AppSourceHandle clone — either ends run the same way, pushing
exactly one Eos of its own to src_pads().
Has no timeline of its own, so SourceElement::seek is a no-op that
reports back whatever was requested as where it “landed” — nothing to
reposition when the app, not a file offset, decides what comes next.
Implementations§
Source§impl AppSource
impl AppSource
Sourcepub fn new(name: impl Into<String>, capacity: usize) -> (Self, AppSourceHandle)
pub fn new(name: impl Into<String>, capacity: usize) -> (Self, AppSourceHandle)
capacity bounds how many pushed buffers may sit unconsumed before
AppSourceHandle::push blocks — same trade-off as
crate::queue::Queue’s own capacity.
Trait Implementations§
Source§impl Element for AppSource
impl Element for AppSource
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 SourceElement for AppSource
impl SourceElement for AppSource
Source§fn seek(&mut self, target: Duration) -> Result<Duration>
fn seek(&mut self, target: Duration) -> Result<Duration>
No-op: AppSource has nothing of its own to reposition — whatever
comes next is whatever the app pushes next, not a position in a
file. Reports target back as where it “landed” so downstream
(e.g. a crate::elements::Pacer resetting its clock offset)
still sees a consistent crate::bus::BusEvent::Seeked.
Source§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 more