ignore unparseable SDP media
https://github.com/scottlamb/moonfire-nvr/issues/238
This commit is contained in:
parent
d6c0e84db8
commit
bc03c61ae3
@ -1,3 +1,8 @@
|
|||||||
|
## `v0.4.2` (2022-09-28)
|
||||||
|
|
||||||
|
* ignore unparseable SDP media, improving compatibility with TP-Link cameras,
|
||||||
|
as described in [scottlamb/moonfire-nvr#238](https://github.com/scottlamb/moonfire-nvr/issues/238).
|
||||||
|
|
||||||
## `v0.4.1` (2022-08-09)
|
## `v0.4.1` (2022-08-09)
|
||||||
|
|
||||||
* Send keepalives at every half-session-timeout rather than a fixed 30-second
|
* Send keepalives at every half-session-timeout rather than a fixed 30-second
|
||||||
|
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -1780,7 +1780,7 @@ checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "retina"
|
name = "retina"
|
||||||
version = "0.4.1"
|
version = "0.4.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64",
|
"base64",
|
||||||
"bitreader",
|
"bitreader",
|
||||||
|
@ -4,7 +4,7 @@ default-members = ["."]
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "retina"
|
name = "retina"
|
||||||
version = "0.4.1"
|
version = "0.4.2"
|
||||||
authors = ["Scott Lamb <slamb@slamb.org>"]
|
authors = ["Scott Lamb <slamb@slamb.org>"]
|
||||||
license = "MIT/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
@ -452,19 +452,30 @@ pub(crate) fn parse_describe(
|
|||||||
}
|
}
|
||||||
let control = control.unwrap_or(request_url);
|
let control = control.unwrap_or(request_url);
|
||||||
|
|
||||||
let streams = sdp
|
let streams: Box<[Stream]> = sdp
|
||||||
.medias
|
.medias
|
||||||
.iter()
|
.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(i, m)| {
|
.filter_map(|(i, m)| {
|
||||||
parse_media(&base_url, m).map_err(|e| {
|
parse_media(&base_url, m).map_or_else(
|
||||||
format!(
|
|e| {
|
||||||
"Unable to parse stream {}: {}\nraw SDP: {:#?}",
|
warn!(
|
||||||
i, &e, raw_sdp
|
"Ignoring unparseable stream {}: {}\nraw SDP: {:#?}",
|
||||||
)
|
i, &e, raw_sdp
|
||||||
})
|
);
|
||||||
|
None
|
||||||
|
},
|
||||||
|
Some,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
.collect::<Result<_, String>>()?;
|
.collect();
|
||||||
|
|
||||||
|
if streams.is_empty() {
|
||||||
|
return Err(format!(
|
||||||
|
"No parseable streams (and {} unparseable streams)",
|
||||||
|
sdp.medias.len()
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
Ok(Presentation {
|
Ok(Presentation {
|
||||||
streams,
|
streams,
|
||||||
@ -757,6 +768,23 @@ mod tests {
|
|||||||
super::parse_describe(url, &response).unwrap();
|
super::parse_describe(url, &response).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Parses SDP taken from a TP-LINK TL-IPC44AW-COLOR 4.0 camera running firmware
|
||||||
|
/// FW: 1.0.10 Build 220330 Rel.35741n, which has a stream with a string where an RTP
|
||||||
|
/// payload description is expected.
|
||||||
|
/// https://github.com/scottlamb/moonfire-nvr/issues/238
|
||||||
|
#[test]
|
||||||
|
fn tplink_sdp() {
|
||||||
|
let url = Url::parse("rtsp://127.0.0.1/").unwrap();
|
||||||
|
let response =
|
||||||
|
rtsp_types::Response::builder(rtsp_types::Version::V1_0, rtsp_types::StatusCode::Ok)
|
||||||
|
.header(rtsp_types::headers::CONTENT_TYPE, "application/sdp")
|
||||||
|
.build(Bytes::from_static(include_bytes!(
|
||||||
|
"testdata/tplink_sdp.txt"
|
||||||
|
)));
|
||||||
|
let p = super::parse_describe(url, &response).unwrap();
|
||||||
|
assert_eq!(p.streams.len(), 2);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn dahua_h264_aac_onvif() {
|
fn dahua_h264_aac_onvif() {
|
||||||
// DESCRIBE.
|
// DESCRIBE.
|
||||||
|
17
src/client/testdata/tplink_sdp.txt
vendored
Normal file
17
src/client/testdata/tplink_sdp.txt
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
v=0
|
||||||
|
o=- 14665860 31787219 1 IN IP4 192.168.2.29
|
||||||
|
s=Session streamed by "TP-LINK RTSP Server"
|
||||||
|
t=0 0
|
||||||
|
m=video 0 RTP/AVP 96
|
||||||
|
c=IN IP4 0.0.0.0
|
||||||
|
b=AS:4096
|
||||||
|
a=range:npt=0-
|
||||||
|
a=control:track1
|
||||||
|
a=rtpmap:96 H265/90000
|
||||||
|
a=fmtp:96 profile-space=0;profile-id=1;tier-flag=0;level-id=150;interop-constraints=000000000000;sprop-vps=QAEMAf//AWAAAAMAAAMAAAMAAAMAlqwJ;sprop-sps=QgEBAWAAAAMAAAMAAAMAAAMAlqABQCAFof4qtO6JLuaAgA27oADN/mAE;sprop-pps=RAHAcvAbJA==
|
||||||
|
m=audio 0 RTP/AVP 8
|
||||||
|
a=rtpmap:8 PCMA/8000
|
||||||
|
a=control:track2
|
||||||
|
m=application/TP-LINK 0 RTP/AVP smart/1/90000
|
||||||
|
a=rtpmap:95 TP-LINK/90000
|
||||||
|
a=control:track3
|
Loading…
Reference in New Issue
Block a user