pub struct RtspSource { /* private fields */ }Expand description
Demuxes a live RTSP stream — the client/receive counterpart to
crate::elements::RtspSink (which publishes). One src pad per
stream the server advertises, same shape as
crate::elements::FileDemuxer.
Deliberately does not retry or reconnect internally: a read failure
(dropped connection, camera reboot, …) ends this source’s thread with
Err, the same way any other fatal SourceElement::run failure
does, instead of looping forever inside run(). Reconnecting means
building a fresh RtspSource/crate::pipeline::Pipeline — mirrors
Pipeline itself not being reusable once it ends: watch
crate::pipeline::Pipeline::bus, and on error, call
RtspSource::open again.
Uses Packet::read directly instead of Input::packets() — the
latter silently retries forever inside its own next() on any non-EOF
error (network timeout, connection reset, …), which would make a
stuck connection un-Stop-able (drain_control never gets a turn)
and this element’s “fail fast, don’t retry” contract impossible to
keep.
Implementations§
Source§impl RtspSource
impl RtspSource
Sourcepub fn open(
name: impl Into<String>,
url: impl AsRef<str>,
options: RtspOptions,
) -> Result<(Self, Vec<StreamInfo>), RtspSourceError>
pub fn open( name: impl Into<String>, url: impl AsRef<str>, options: RtspOptions, ) -> Result<(Self, Vec<StreamInfo>), RtspSourceError>
Connects to url (e.g. rtsp://host:port/path) and returns the
element alongside every stream the server advertised, so the
caller can inspect them before deciding which of src_pads() to
link — same pattern as FileDemuxer::open.
Sourcepub fn stream_parameters(&self, index: usize) -> Option<Parameters>
pub fn stream_parameters(&self, index: usize) -> Option<Parameters>
Codec parameters for one of this stream’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 RtspSource
impl Element for RtspSource
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 RtspSource
impl Source for RtspSource
Source§impl SourceElement for RtspSource
impl SourceElement for RtspSource
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 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 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 more