Commit Graph
100 Commits
Author SHA1 Message Date
Cameron Gutman 50603ac16e Fix mishandling of IDR frames with a VUI or AUD NAL 2022-09-11 23:34:38 -05:00
Cameron Gutman e453a4d548 Add 3 byte Annex B start sequence test mode for debugging clients 2022-09-05 17:41:37 -05:00
Cameron Gutman 5a2911ffe4 Rework NALU parsing to be more robust handling 3 byte prefixes 2022-09-05 16:45:14 -05:00
Cameron Gutman ec420615a1 Fix GCC build 2022-08-10 00:18:56 -05:00
Cameron Gutman ef9c5a65cf Return a better error code when the control stream connection fails 2022-08-09 23:26:33 -05:00
Cameron Gutman c72f30da2e Improve logging for control stream connection failure 2022-08-09 23:12:31 -05:00
Cameron Gutman bf22101c7d Add video format mask for 10-bit color 2022-06-26 16:19:44 -05:00
Cameron Gutman d247873ade Add LiSendMouseMoveAsMousePositionEvent() function
This is a useful option for Android and iOS where mouse acceleration
is always enabled and mouse capture is the only feasible way to get
mouse input. It can avoid double-acceleration when being used for
remote desktop mouse mode.
2022-05-28 14:58:34 -05:00
Cameron Gutman e62dc56047 Update notes regarding enableHdr option 2022-02-07 20:16:19 -06:00
Cameron Gutman bc458b8848 Use 15 second timeout for RTSP replies
GFE has an internal 10 second timeout for bringing up the streamer,
so we can end up timing out right as GFE is trying to reply to us.
2022-02-06 20:59:18 -06:00
Cameron Gutman abc7acb5e4 Add HDR mode APIs 2022-01-28 21:29:14 -06:00
Cameron Gutman cfe75eb569 Add workaround for keyboard and UTF-8 events interfering with each other 2022-01-17 21:56:06 -06:00
Cameron Gutman 921b59c467 Add API to wake a waiting thread in LiWaitForNextVideoFrame() 2022-01-17 14:12:11 -06:00
Cameron Gutman 6001ece0b8 Fix uninitialized variable 2021-12-12 16:04:58 -06:00
Cameron Gutman ac1355b922 Fix excessive high-res scroll speed on newer GFE versions 2021-12-12 12:05:20 -06:00
Cameron Gutman 257029f80d Remove redundant packet length field 2021-12-10 02:00:42 -06:00
Cameron Gutman 94d439e5c3 Fix memory corruption with UTF-8 strings over 32 bytes 2021-11-30 19:05:32 +03:00
Cameron Gutman 6a6328a355 Send each Unicode code point individually to avoid straddling packet boundaries 2021-11-30 18:28:09 +03:00
Cameron Gutman 8c55c086d5 Update enet submodule 2021-09-16 01:31:47 -05:00
Cameron Gutman 5b2cf1b8f7 Fix handling of hostname with multiple candidate IP addresses when using alternate ports 2021-08-14 12:30:04 -05:00
Cameron Gutman a290ec032b Fix relative mouse and controller batching after 74377a06 2021-08-05 22:14:35 -05:00
Cameron Gutman 8cac195fcf Fix compilation warnings 2021-07-30 01:32:43 -05:00
Cameron Gutman f3e37944fc Split UTF-8 strings into chunks small enough to fit in an NV_UNICODE_PACKET 2021-07-30 01:23:53 -05:00
Cameron Gutman 74377a061b Rework input packets based on new header knowledge 2021-07-30 01:02:35 -05:00
Cameron Gutman ceafe7897c Refactor input packet sending logic into a separate function 2021-07-29 23:49:58 -05:00
Cameron Gutman 8abc371fb4 Print warning when audio decryption fails 2021-07-17 22:57:50 -05:00
Cameron Gutman b2c39883bf Fix incorrect IV for encrypted control stream packets on big-endian machines 2021-07-17 22:29:30 -05:00
Cameron Gutman d14f62c26a Fix crash when client provides no video decoder callbacks 2021-07-17 21:55:39 -05:00
Cameron Gutman fa892c5334 Remove SEI prefix NAL units before returning data to clients 2021-07-09 17:37:30 -05:00
Cameron Gutman 5820cc2048 Fix double-free if unencrypted packet is received on encrypted stream 2021-07-08 20:50:09 -05:00
Cameron Gutman 3b9d8a3176 Assert that the port numbers are set prior to being used 2021-07-02 01:44:11 -05:00
Cameron Gutman cdda221d64 Log the parsed ports 2021-07-02 01:30:33 -05:00
Cameron Gutman 5ec8ee7cbf Parse the RTSP port out of the RTSP session URL 2021-07-02 01:17:34 -05:00
Cameron Gutman 0cd3fcf1be Fix off-by-one in port number validation 2021-07-02 01:16:20 -05:00
Cameron Gutman 46887c0447 Parse the ports from RTSP SETUP instead of RTSP DESCRIBE
RTSP SETUP is better because it can provide multiple IP+port candidates
2021-07-02 00:28:48 -05:00
Cameron Gutman f05be47ed8 Replace other hardcoded ports 2021-07-02 00:27:35 -05:00
Cameron Gutman 56ccd99cc7 Dynamically determine audio, video, and control ports from RTSP DESCRIBE response 2021-07-01 23:45:33 -05:00
Cameron Gutman 2660a05084 Fix GCC build 2021-07-01 22:28:17 -05:00
Cameron Gutman 1b642fec73 Fix control flow bugs in poll() error paths 2021-07-01 22:20:09 -05:00
Cameron Gutman 52250b4815 Use O_NONBLOCK for platforms without support for FIONBIO 2021-07-01 22:15:26 -05:00
Cameron Gutman c00f4e15ae Use poll() instead of SO_RCVTIMEO for RTSP timeout support
poll() is more portable than SO_RCVTIMEO
2021-07-01 22:10:46 -05:00
Cameron Gutman 7c346c3104 Fix handling of older GFE versions in surround sound mode
7.1 surround sound would usually behave like CBR content, which never
tripped the logic to detect this incompatibility. Now we will both
detect it via hardcoded version number check, but also detect when the
FEC base sequence number constraint is violated too.
2021-06-20 14:55:44 -05:00
Cameron Gutman 5e3aa93479 Add a recording mode for debugging purposes 2021-06-20 11:15:30 -05:00
Cameron Gutman 75999a6e07 Add Video/Audio prefix to ThreadProc names
It's easier to find them in stack traces that way.
2021-06-20 10:36:05 -05:00
Cameron Gutman eff97414bf Perform the initial audio resync even if we hit the polling timeout 2021-06-19 16:44:48 -05:00
Cameron Gutman c680a60710 Disable audio FEC when using old GFE and Sunshine versions 2021-06-19 16:22:44 -05:00
Cameron Gutman fed1a899aa Add defines for RTP audio payload types 2021-06-19 16:08:18 -05:00
Cameron Gutman b58930c687 Don't start the decoder thread in pull-mode 2021-06-13 15:30:37 -05:00
Cameron Gutman 68c784445c Introduce optional pull-based API for video data 2021-06-13 15:14:38 -05:00
Cameron Gutman b2d4b2c61f Fix spurious exit of fast recovery mode when the stream starts 2021-06-12 18:33:20 -05:00
Cameron Gutman 9999156f26 Update ENet to avoid dependency on qwave.dll 2021-06-12 12:16:39 -05:00
Cameron Gutman ac9c4e82ac Introduce a list to cache freed input packet entries for reuse 2021-06-12 10:43:50 -05:00
Cameron Gutman a13eeddacf Fix Win32 release build 2021-06-09 20:38:22 -05:00
Cameron Gutman f01103af23 Add a free FEC block cache to avoid memory allocations 2021-06-09 20:29:05 -05:00
Cameron Gutman fb9aab0e57 Reimplement LBQ on condition variables 2021-06-09 19:59:52 -05:00
Cameron Gutman 71a267fd28 Change PltWaitForEvent to void return type 2021-06-09 19:37:06 -05:00
Cameron Gutman 61b4fc1fe7 Add condition variable support and reimplement PLT_EVENT with it for non-Win32 platforms 2021-06-09 19:29:31 -05:00
Cameron Gutman ccec4e8475 Add thread naming on macOS and iOS 2021-06-09 03:00:25 -05:00
Cameron Gutman b471edbb80 Add a fast path to drop the audio FEC block with in-order packets
If we have not seen any OOS audio data lately, we can assume that
seeing the next FEC block means the previous block has completed
transmission. If we don't have it all by then, just assume it was
lost and move on. This reduces the perception of audio loss by
reducing the change that we cause the audio device to underrun.
2021-06-09 02:31:55 -05:00
Cameron Gutman c64ba99654 Fix build on GCC/Clang 2021-06-09 01:45:44 -05:00
Cameron Gutman 7b838dd692 Improve audio FEC queue timeout logic 2021-06-09 00:46:14 -05:00
Cameron Gutman ca7a6e7bbe Validate block size before writing data 2021-06-08 20:03:49 -05:00
Cameron Gutman 2228e4812d Improve debugging for A/V data loss and recovery 2021-06-08 20:01:58 -05:00
Cameron Gutman 5a71a4c092 Use 10ms packets for slow Opus decoders
With the old 20ms packets, an FEC block was 80ms of audio data.
This is enough data that waiting for the FEC shards can cause
an audio data underflow. The burst of 80ms of audio data after
reassembly fails can then lead clients to drop samples due to
excessive queued data.
2021-06-07 23:20:40 -05:00
Cameron Gutman 4e7b1e3c37 Merge pull request #60 from GaryOderNichts/wiiu-platform
Wii U platform support
2021-06-04 21:53:58 -05:00
Cameron Gutman 509a17dbc3 Perform PLC for each lost packet in the FEC block 2021-06-03 21:03:46 -05:00
Cameron Gutman a8aed6b344 Avoid spurious audio data loss warning on connection start 2021-06-03 21:02:27 -05:00
Cameron Gutman ef33aaa3c8 Fix queued packet leak when audio packet queue overflows 2021-06-02 22:05:45 -05:00
Cameron Gutman e9fd544ff4 Fix FEC queue state assert firing on shutdown 2021-06-02 20:11:20 -05:00
Cameron Gutman e3d4f4e91f Validate the Opus data in debug builds 2021-06-02 20:10:46 -05:00
Cameron Gutman ab51acb712 Only data shards should be eligible for immediate consumption 2021-06-02 19:50:22 -05:00
Cameron Gutman d0adb044cf Fix bugs discovered by FEC state validation logic 2021-06-02 19:36:57 -05:00
Cameron Gutman 565b170e00 Add FEC state validation in debug builds 2021-06-02 19:36:31 -05:00
Cameron Gutman 9361c325bb Rename RtpFecQueue to RtpVideoQueue to match RtpAudioQueue 2021-06-01 22:57:26 -05:00
Cameron Gutman 08e4a47fc2 Add FEC validation mode for audio FEC 2021-06-01 22:43:43 -05:00
Cameron Gutman dd3675db63 Fix mishandling of a completely missing FEC block 2021-06-01 21:31:48 -05:00
Cameron Gutman da7db59414 Fix freeing FEC block after wrapping seqnum with in-order FEC block 2021-06-01 21:16:18 -05:00
Cameron Gutman fde6b05618 Fix incorrect assert on sequence number wrap 2021-06-01 21:14:25 -05:00
Cameron Gutman 683208ddc8 Return all available audio data after FEC block timer expires 2021-06-01 20:01:26 -05:00
Cameron Gutman 3dff15b8c4 Fix memory leak when switching between immediate and queued audio packets 2021-06-01 19:33:56 -05:00
Cameron Gutman 4aa82b0a9f Fix Clang/GCC build 2021-06-01 18:39:19 -05:00
Cameron Gutman 89918324ce Implement audio FEC recovery support 2021-06-01 18:31:56 -05:00
Cameron Gutman 122ce4a568 Enable SO_RCVTIMEO for RTP sockets on Windows 2021-05-25 20:38:30 -05:00
Cameron Gutman d9ea208dea Avoid unlock and immediate relock of mutex 2021-05-25 19:57:06 -05:00
Cameron Gutman 1376c62e5f Remove declaration of old deleted function 2021-05-25 19:54:27 -05:00
Cameron Gutman 59484ea066 Reorder some internal structures to reduce padding 2021-05-25 19:54:03 -05:00
Cameron Gutman 46cea5011d Use GetModuleHandle() for kernel32.dll, since it's guaranteed to be loaded already 2021-05-25 19:40:14 -05:00
Cameron Gutman 4723f8ba7c Update ENet to avoid excessive retransmissions when RTT variance is 0 2021-05-16 15:37:40 -05:00
Cameron Gutman d4e22bb4a6 Update ENet to fix inaccurate RTT values under 8 ms 2021-05-16 14:42:15 -05:00
Cameron Gutman daee5db7bc Use SleepEx() instead of WaitForSingleObjectEx() to implement PltSleepMs()
This was legacy cruft from back when Sleep() was forbidden in Metro apps in Win8.0.
2021-05-16 11:41:38 -05:00
Cameron Gutman c057075eac Set minRequiredFecPackets to better handle lossy links at low bitrates 2021-05-16 09:27:50 -05:00
Cameron Gutman ed9301f3f8 Join the input thread without interrupting first
Otherwise we'll kill it before it finishes draining
2021-05-15 22:56:44 -05:00
Cameron Gutman 431e188b07 Allow the input queue to drain before terminating the thread
This ensures any final input messages (like key ups) make it to the host
2021-05-15 22:01:50 -05:00
Cameron Gutman 71c9ff0d91 Elide the wait if the queue head is already non-null 2021-05-15 21:31:45 -05:00
Cameron Gutman edf1838708 Expose RTT information from ENet 2021-05-15 13:58:54 -05:00
Cameron Gutman 5feb3b6f90 Dynamically adjust wait time to hit the next RTO 2021-05-15 12:47:20 -05:00
Cameron Gutman 50c0648de2 Run a full enet_host_service() rather than just enet_host_flush() on send 2021-05-15 12:26:01 -05:00
Cameron Gutman 97216e1704 Wait for ENet socket readability rather than just sleeping 10 ms 2021-05-15 00:15:16 -05:00
Cameron Gutman 43eb36e17a Simplify and improve graceful disconnect logic 2021-05-14 22:36:13 -05:00
Cameron Gutman 387ff48a65 Perform a graceful disconnection if the termination was locally initiated 2021-05-14 22:06:07 -05:00