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§impl SourceElement for RtspSource
impl SourceElement for RtspSource
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 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 are told to flush for it. Read more