Commit Graph

181 Commits

Author SHA1 Message Date
Scott Lamb
86b5f449e9 API for waiting out stale sessions 2021-09-28 21:49:12 -07:00
Scott Lamb
49612617a0 treat TEARDOWN 500 response as OK (sigh)
for #34

Details in the new code comment, but this avoids an unnecessary wait
for session expiration with (at least some) Hikvision cameras.
2021-09-28 16:57:55 -07:00
Scott Lamb
6ee24e1c0e minor tweaks to TEARDOWN logging
*   log everything from the retina::client::teardown module so the
    log level can be tweaked separately.
*   log when the session is expired.
2021-09-27 16:03:26 -07:00
Scott Lamb
f682d752a2 keep retrying TEARDOWN, using fresh connections
This is half of #34. I still need to adjust the API for waiting until
there are no more stale sessions.
2021-09-27 14:27:02 -07:00
Scott Lamb
15f6a1ada0 mp4 example: fix out-of-date error message 2021-09-10 13:46:31 -07:00
Scott Lamb
0ddb1423c6 mp4 example: avoid panic with non-aac audio 2021-09-10 13:45:50 -07:00
Scott Lamb
379bf840c1 prepare v0.3.1 2021-09-09 22:01:58 -07:00
Scott Lamb
1a72fce4de refine TEARDOWN logic
*   by default send a TEARDOWN even if we haven't sent a PLAY.
*   make the behavior more customizable. I want the ability to turn
    teardowns off for testing the live555 bug.
*   deprecate the older teardown method
2021-09-09 21:10:58 -07:00
Scott Lamb
33a0186be3 take 2 at fixing 62f6949 2021-09-09 18:31:46 -07:00
Scott Lamb
16f38519c7 typo: runtime->rt 2021-09-09 18:30:47 -07:00
Scott Lamb
24d5eeb701 add tokio runtime feature to Cargo.toml
Needed by 62f6949.

The normal tests didn't catch this because runtime is a dev-dependency.
The fuzz tests caught it by accident on CI:
https://github.com/scottlamb/retina/actions/runs/1219451203
2021-09-09 18:29:24 -07:00
Scott Lamb
62f6949873 new more reliable TEARDOWN mechanism 2021-09-09 17:34:49 -07:00
Scott Lamb
abf10eac16 use sdp-types 0.1.3 with more permissive parsing
Fixes #26
Fixes #33
2021-09-09 06:58:15 -07:00
Scott Lamb
7141b8601b improve mp4 example error handling
* avoid half-written output (fixes #32)
* try to send TEARDOWN even on error while reading the stream.
  This isn't perfect as noted in the TODO. I think I'll want to
  change the API a bit, but not right now.
2021-09-08 13:25:08 -07:00
Scott Lamb
69f12bde8e cargo fmt 2021-09-07 19:37:33 -07:00
Scott Lamb
96023c5a98 cargo update 2021-09-07 19:27:26 -07:00
Scott Lamb
6f88161943 mp4 example: more verbose errors 2021-09-07 19:25:40 -07:00
Scott Lamb
1056dfbfef UDP fixes (#30)
*   out-of-order packets should be ignored (except for logging).

*   after ignored RTP or RTCP packet, don't incorrectly return Pending
    without both underlying sockets actually returning Pending. This
    could lead to not rechecking the sockets until prompted for another
    reason, like an RTSP keepalive.
2021-09-07 18:28:19 -07:00
Scott Lamb
799584c8e3 skip Geovision's strange pt=50 packets
Once #33 is fixed, this should allow Geovision cameras to more or
less work.
2021-09-07 15:37:09 -07:00
Scott Lamb
ffaa831c54 warn about #30 2021-08-31 13:27:13 -07:00
Scott Lamb
3a15ddcab5 take 2: downgrade spammy debug msg to trace 2021-08-31 08:43:23 -07:00
Scott Lamb
fd93d12e4d downgrade spammy debug msg -> trace 2021-08-31 08:39:05 -07:00
Scott Lamb
2407fddf86 version 0.3.0 2021-08-31 06:59:47 -07:00
Scott Lamb
f356a16ba6 remove hack for GW Security cameras' audio channel
This didn't work; I wasn't able to get working audio from them.
I'm not sure they even actually have a microphone! They may just
be sending uninitialized/stale buffer contents on this channel.

Just don't use the audio channel with this camera.
2021-08-31 06:55:25 -07:00
Scott Lamb
60a253073c get rid of ignore_spurious_data
This was an attempt at #17 that didn't work out. Besides additionally
hitting the framing error, my Reolink test camera never timed out
the old session while the new one was in progress. This behavior is
different than the vanilla 2013.04.06 live555 server, so apparently
Reolink sprinkled in their own brokenness on top. In any case,
the other solutions described in that bug are more likely to work.

There's one narrow case I want to keep working: ignoring RTCP messages
immediately prior to the PLAY response. More recent Reolink cameras
do this. I just have this behavior on all the time now.
2021-08-31 06:48:23 -07:00
Scott Lamb
9e9366f115 experimental UDP support (fixes #30)
* support setting transport to UDP
* breaking change: use new PacketContext rather than RtspMessageContext
  in places where an RTP/RTCP packet is expected, as it can now be over
  UDP instead of via RTSP interleaved data
* send teardown, which is important with UDP sessions. (It also will
  help somewhat with Reolink TCP.) Along the way, make Session Unpin
  so that teardown can consume it without tripping over tokio::pin!().
* refactor to shrink the amount of data used by Session and how much
  gets memmoved around on the stack, instead of further growing it.

Because of missing RTCP RR and reorder buffer support, this is only
appropriate for using on a LAN. That's enough for me right now.
2021-08-30 21:40:51 -07:00
Scott Lamb
785b63ff4a minor cleanup in client
* make handle_keepalive_timer, handle_response, and handle_data proper
  methods. (pin-project is still confusing for me, but I think I'm
  starting to get the hang of it.)
* swap a couple fields between Session and RtspConnection to improve
  clarity for #30
2021-08-27 10:03:16 -07:00
Scott Lamb
c9a1ec1912 mp4 --duration=secs (fixes #28)
also briefly document commandline options
2021-08-26 14:39:01 -07:00
Scott Lamb
2911edec70 fix missing 44.1 kHz (#22) 2021-08-23 10:18:27 -07:00
Scott Lamb
4e52e7b19a mp4 example: option to allow packet loss 2021-08-22 08:08:09 -07:00
Scott Lamb
59e513c9be v0.2.0 2021-08-20 16:48:22 -07:00
Scott Lamb
d9b3424f0b
Merge pull request #20 from scottlamb/pr-control-url
change control URL handling
2021-08-20 16:46:02 -07:00
Scott Lamb
7e5ebf1400 join control URLs with base in the "live555 way"
This isn't RFC-compliant, but it seems to be quite common, and it
works with some cameras where the RFC-compliant way does not.
Fixes #9

Based on lucaszanella's PR #12, including his vstarcam test.
2021-08-20 16:42:57 -07:00
Lucas Zanella
dbf4652840 fixed rtp-info missing for some cameras 2021-08-20 16:42:57 -07:00
Lucas Zanella
9a6e418ea3 fixes control URL error 2021-08-20 16:42:57 -07:00
Scott Lamb
915e6b7404 basic client tests with mock server
There's still a lot of untested functionality, but this is a start.
2021-08-20 16:42:19 -07:00
Scott Lamb
76b3a61eb7 mp4 example: fix panic on empty video
```
thread 'main' panicked at 'range start index 1 out of range for slice of length 0', examples/client/mp4.rs:171:44
stack backtrace:
   0: rust_begin_unwind
             at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/std/src/panicking.rs:515:5
   1: core::panicking::panic_fmt
             at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/core/src/panicking.rs:92:14
   2: core::slice::index::slice_start_index_len_fail
             at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/core/src/slice/index.rs:34:5
   3: client::mp4::TrakTracker::write_common_stbl_parts
   4: client::mp4::Mp4Writer<W>::write_audio_trak
   5: client::mp4::run::{{closure}}
   6: <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll
   7: tokio::park:🧵:CachedParkThread::block_on
   8: tokio::runtime::thread_pool::ThreadPool::block_on
   9: tokio::runtime::Runtime::block_on
  10: client::main
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
```
2021-08-20 10:11:53 -07:00
Scott Lamb
6155d4ebcf be more tolerant of incorrect RTP H.264 framing
I'll be optimistic: fixes #13

At least it seems to fix the Reolink case. We'll see about VStarcam.
2021-08-19 15:01:46 -07:00
Scott Lamb
79ca9941bd remove orphaned import 2021-08-19 13:31:24 -07:00
Scott Lamb
3b652bbb65 try to fix CI error
https://github.com/scottlamb/retina/actions/runs/1148367482
2021-08-19 13:19:04 -07:00
Scott Lamb
d29129792e dust off fuzz tests
* make them build again
* reformat
* check those things on CI. probably too expensive to actually run them.
2021-08-19 13:16:16 -07:00
Scott Lamb
782029a1ca log at promised debug, not warn 2021-08-19 13:01:07 -07:00
Scott Lamb
d8aa4c6565 workaround for Reolink spurious data
Fixes #17

I'm accumulating unit testing debt, but I think I'd rather get this
quickly out in the field to test against scenarios I haven't anticipated
than get my unit tests in order for scenarios I have anticiapted.
2021-08-19 13:00:06 -07:00
Scott Lamb
7d2fb0def1 cargo fmt 2021-08-19 11:26:13 -07:00
Scott Lamb
dadbd443a5 add debugging for #13 2021-08-19 11:23:32 -07:00
Scott Lamb
1c468668d8 include seq in rtp packet error description
This is useful (eg for a `rtp.seq == 0x1234` display filter in
Wireshark) and was just omitted by accident.
2021-08-16 13:34:40 -07:00
Scott Lamb
41765007a6 remove rtcp dependency, prep v0.1.0
rtcp recently had an accidental semver break, so this fixes #8.
I also don't like that newer versions depend on several unnecessary
crates including tokio. retina also depends on tokio, but in the future
I want it to be IO library-agnostic.

I'm moving to v0.1.0 so I *can* release versions that claim semver
compatibility. There are still plenty of API changes to make but also
likely upcoming camera compatibility changes that won't break anything.
2021-08-13 11:37:53 -07:00
Scott Lamb
b1db9a9e8b use SET_PARAMETERS for keepalive
This is the method recommended by the ONVIF Streaming Specification
version 21.06 section 5.2.2.2.

I was using GET_PARAMETERS. This matched ffmpeg's behavior if the
OPTIONS shows that GET_PARAMETERS is supported, although I wasn't doing
the initial OPTIONS request.

Apparently the GW Security GW4089IP will simply ignore GET_PARAMETERS,
not even sending a 405 Method Not Allowed response. It supports and
responds to SET_PARAMETERS.
2021-07-11 20:01:59 -07:00
Scott Lamb
0fceb49977 fix test build break on 1.52 2021-07-08 15:42:16 -07:00
Scott Lamb
00359bf540 prepare v0.0.5 2021-07-08 15:20:55 -07:00