- update
base64
dep to 0.22 - update minimum Rust version to 1.70.
- added helpers for building
.mp4
VisualSampleEntry
andAudioSampleEntry
for H.264, MJPEG, and AAC. - shrunk
VideoParameters
from 112 bytes to 88 bytes andAudioParameters
from 80 bytes to 64 bytes (measured on a 64-bit platform).
- support MJPEG codec (contribution from zanshi)
- permit
MP2T/
protocol in media description (contribution from (yujincheng08)[https://github.com/yujincheng08)]). - #102: support Reolink cameras which have extraneous bytes following the SPS.
- support servers that do not set
Content-Type
onDESCRIBE
responses
- add default User-Agent header
- add policy for handling session IDs. Required for some broken cameras which
can change the session ID between
SETUP
calls. - ignore connection refused errors triggered by the firewall punch-through packets.
- improve several vague or misleading log messages.
- fix inverted logic in live555 bug detection, introduced with
v0.3.10
. - ignore
seq=0
andseq=1
inPLAY
response'sRTP-Info
header by default. These values are known to be set erroneously by the Hikvision DS-2CD2032-I and Tapo C320WS, respectively. - customizable behavior for RTCP packets with unknown ssrcs, now defaulting to ignoring them. This also is necessary to interoperate with the Tapo C320WS.
- improve some incorrect, misleading, and/or uninformative logging.
- minimum Rust is now 1.67.
- minimum Rust version is now 1.64.
- upgrade to
rtsp-types
0.0.5, which ignores trailing whitespace in RTSP headers. This fixes errors when communicating with some Longse cameras (#77). - remove obsolete workaround for GW security GW security GW4089IP's bad out-of-band parameters.
Instead, we treat them as unparseable and ignore them as described in the
v0.4.2
notes below.
- improve interop with Ubiquiti cameras by ignoring
fmtp
attributes in SDP which have nothing (no required SP, no data) after the payload type. - fix parsing of RTP packets with extensions, which broke with
v0.4.0
(2e34bf92).
- upgrade version of
h264-reader
crate. Compatibility note: Retina may now be stricter about parsing H.264 parameters (SPS/PPS). In practice, with some cameras this means unparseable "out-of-line" parameters (specified in the SDP) will be ignored in favor of parseable "in-line" parameters (specified within the RTP data stream).
- ignore unparseable SDP media, improving compatibility with TP-Link cameras, as described in scottlamb/moonfire-nvr#238.
- Send keepalives at every half-session-timeout rather than a fixed 30-second interval. This allows persistent connections to servers that have timeouts shorter than 30 seconds.
- Use
OPTIONS
for initial keepalive, and only switch toSET_PARAMETER
if the server advertises its support. This allows persistent connections tortsp-simple-server
v0.19.3, which does not support the latter method and drops the connection on receiving unsupported methods.
- BREAKING: remove deprecated
retina::client::Session<Playing>::teardown
andretina::client::Demuxed::teardown
; made private some items already#[doc(hidden)]
. - BREAKING:
retina::client::Session<Described>::setup
takes a newSetupOptions
argument for future expansion. - BREAKING: the transport to use is configured per-stream as part of
retina::SetupOptions
(rather than the priorretina::SessionOptions
) and takes per-transport options for future expansion. - BREAKING:
retina::StreamContext
has been split out ofretina::PacketContext
. Both must be printed to provide the same information as before. This change reduces how much data needs to be copied with each packet. - BREAKING:
PacketItem
andCodecItem
are now#[non_exhaustive]
for future expansion. - BREAKING:
retina::client::rtp::Packet
is nowretina::rtp::ReceivedPacket
, and field access has been removed in favor of accessors. - BREAKING:
retina::client::PacketItem::RtpPacket
has been renamed toretina::client::PacketItem::Rtp
. - BREAKING:
retina::client::PacketItem::SenderReport
has been replaced withretina::client::PacketItem::Rtcp
, to expose full RTCP compound packets. Likewiseretina::codec::CodecItem
. - BREAKING:
retina::codec::Parameters
is nowretina::codec::ParametersRef
, which references parameters stored within theStream
to reduce copying. - minimum Rust version is now 1.59.
- ignore unparseable
rtptime
values in thePLAY
response'sRTP-Info
header. This improves compatibility with the OMNY M5S2A 2812 camera, as described in scottlamb/moonfire-nvr#224.
- camera interop: eliminate
bad clockrate in rtpmap
errors with cameras that (incorrectly) add trailing spaces to this SDP parameter, as described at scottlamb/moonfire-nvr#213. - camera interop: allow ignoring RTSP interleaved data messages on unassigned channels, also described at scottlamb-moonfire-nvr#213.
- camera interop: when using TCP, default to attempting a
TEARDOWN
before closing the connection, to improve behavior with cameras that have the live555 stale session bug but do not advertise it. - clarify
Session
's expectations for tokio runtimes. - additional diagnostics/logging on certain camera failures.
- fix depacketization of fragmented AAC frames
- #52: allow compatibility with cameras that incorrectly omit the SDP origin line.
- fix panic if RTSP server precedes a data message with a CRLF.
- expose SDP framerate via
retina::client::Stream::framerate
.
- #50: fix a panic on certain
invalid H.264
sprop-parameter-sets
- documentation improvements
- correctly expire stale session entries that track live555 stale file descriptor sessions. See moonfire-nvr#184.
- ignore (rather than error on) spurious RTP data packets between the
PLAY
request and response. These are sent by some versions of v4l2rtspserver.
- #42: support servers that don't send out-of-band H.264 parameters or send invalid parameters; wait for in-band parameters in this case. The in-band parameters must be valid.
- documentation improvements.
- use
rtsp-types
0.0.3, and thusnom
7.0.
- #25: better HTTP
authentication support via the new
http-auth
crate. Before,retina
would only authenticate properly if the first requested challenge wasDigest
. Now, it will pick out aDigest
orBasic
challenge from a list.
- better
TEARDOWN
handling, which often avoids the need to wait for session expiration ((#34).
- warn when connecting via TCP to a known-broken live555 server version.
- improve Geovision compatibility by skipping its strange RTP packets with payload type 50.
- UDP fixes.
- improve compatibility with cameras with non-compliant SDP, including Anpviz (#26 and Geovision ([#33])(#33)).
- new mechanism to more reliably send
TEARDOWN
requests.
- BREAKING CHANGE: #30:
experimental UDP support. Several
RtspMessageContext
fields have been replaced withPacketContext
. - BREAKING CHANGE: remove
retina::client::SessionOptions::ignore_spurious_data
. This was an attempted workaround for old live555 servers (#17) that was ineffective. - #22: fix handling of 44.1 kHz AAC audio.
- BREAKING CHANGE:
retina::client::Session::describe
now takes a newoptions: SessionOptions
. Thecreds
has moved into theoptions
, along with some new options. - BREAKING CHANGE: renamed
PlayPolicy
toPlayOptions
for consistency. - Added options to work around bugs found in Reolink cameras.
- #9. Improve compatibility
with how some cameras handle the
control
andRTP-Info
urls. This adopts a URL joining behavior which isn't RFC-compliant but seems to be more compatible in practice.
- use
SET_PARAMETERS
rather thanGET_PARAMETERS
for keepalives. The latter doesn't work with GW Security GW4089IP cameras. - removed
rtcp
dependency. Fixes #8. Avoids picking up various transitive dependencies needed by later versions of thertcp
crate, includingtokio
. (retina
's owntokio
dependency will likely become optional in a future version.)
- BREAKING CHANGE: New opaque error type with more uniform, richer error
messages. No more
failure
dependency. - BREAKING CHANGE:
retina::client::Stream::parameters
now returns parameters by value. This allows shrinking depacketizer types. - BREAKING CHANGE:
retina::codec::VideoFrame::new_parameters
is now boxed. This allows shrinkingVideoFrame
andCodecItem
by 80 bytes each (on 64-bit platforms). The box is only rarely populated. - in
client mp4
example, handle an initial video parameter change correctly.
- bugfix: Retina stopped receiving packets after receiving a keepalive response.
- BREAKING CHANGE:
Session<Playing>
now directly implementsStream
instead of throughpkts()
. - Performance improvements.
- BREAKING CHANGE: Video frames are now provided as a single, contiguous
Bytes
, and H.264 depacketization is more efficient (#4).
Initial release.