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
Cameron Gutman
1b3c14a792
Increase maximum input queue size
2021-05-14 21:07:14 -05:00
Cameron Gutman
132833deeb
Limit RTO to 2x RTT and fix early peer timeout expiration
2021-05-14 20:44:19 -05:00
Cameron Gutman
a1a150c300
Refactor IDR/RFI requests to simplify code and fix race conditions
2021-05-14 20:41:20 -05:00
Cameron Gutman
cd62147cdf
Print a warning when the input queue reaches the maximum size
2021-05-14 20:36:25 -05:00
Cameron Gutman
7743899251
Optimize LBQ to avoid unnecessary syscalls
2021-05-14 18:42:01 -05:00
Cameron Gutman
5d09d43b08
Disable RFI at 4K until the problems are understood
2021-05-06 22:17:04 -05:00
Cameron Gutman
ccaca624f3
Attempt to fix audio latency issues on some PCs
2021-05-04 10:21:41 -05:00
Cameron Gutman
65047ac0e2
Switch to VS2019 build images for CI
...
Requires suppressing warning C5105 caused by Windows SDK headers
2021-04-29 17:59:38 -05:00
Cameron Gutman
b0737b882d
Adjust MSVC warning level
2021-04-29 17:51:20 -05:00
Cameron Gutman
bc1b5a1b2f
Fix Linux build
2021-04-29 17:40:13 -05:00
Cameron Gutman
a000f9f8b8
Validate that claimed length doesn't exceed the actual length
2021-04-29 17:26:59 -05:00
Cameron Gutman
8f371343cd
Consolidate includes
2021-04-29 17:22:15 -05:00
Cameron Gutman
da68e64d9b
Fix various MSVC warnings
2021-04-29 17:21:12 -05:00
Cameron Gutman
77ed77b93b
Pull ENet changes from upstream
2021-04-29 09:44:32 -05:00
Cameron Gutman
252a50bb75
Disable WSAECONNRESET errors for UDP sockets on Windows
2021-04-28 20:37:20 -05:00
Cameron Gutman
7549243f40
Add the correct definition for ECONNREFUSED for Windows
2021-04-28 17:30:00 -05:00
Cameron Gutman
9c92c12fea
Prevent errno.h from including incompatible error codes with Winsock codes
2021-04-28 17:29:33 -05:00
Cameron Gutman
3ae03998a2
Add retry logic for RTSP handshake connection refused error
...
This can happen due to a race condition between GFE completing the launch request and starting to listen on TCP 48010
2021-04-28 17:08:27 -05:00
Cameron Gutman
068f7aa9d9
Allow connection interruption during the RTSP handshake
2021-04-28 17:06:04 -05:00
Cameron Gutman
bce9f82844
Fix strict aliasing violation (and save a byteswap on each packet)
2021-04-28 17:05:41 -05:00
Cameron Gutman
fe205d838d
Don't check for errors from sendto() in the ping threads
2021-04-28 17:04:44 -05:00
Cameron Gutman
83b1b17f87
Add specific logging for frames dropped completely
2021-04-27 17:39:00 -05:00
Cameron Gutman
c1befbe2a8
Improve audio resync logic to use initial receive time rather send time
2021-04-26 22:43:49 -05:00
Cameron Gutman
33c4e98152
Adjust initial audio resync drop time based on connection handshake latency
2021-04-26 21:39:36 -05:00
Cameron Gutman
7174caf5f1
Implement support for multi-FEC frames
2021-04-26 20:36:07 -05:00
Cameron Gutman
9a5dbcf31c
Create a second queue for completed FEC blocks
2021-04-26 20:26:16 -05:00
Cameron Gutman
b33e9fbcde
Fix list corruption on entry removal
2021-04-26 20:24:39 -05:00
Cameron Gutman
ca4019c09f
Refactor FEC queue in preparation for multi-block frame support
2021-04-26 17:09:50 -05:00
Cameron Gutman
8dab1ee300
Use stdint.h types for Video.h
2021-04-26 17:08:44 -05:00
Cameron Gutman
ae92f15b0a
Use SRW locks for our mutex on Windows
...
These avoid a kernel transition for uncontended cases
2021-04-25 15:04:12 -05:00
Cameron Gutman
13041e0323
Further optimization to avoid needless calls to EVP_aes_128_gcm() and EVP_aes_128_cbc()
2021-04-22 17:49:51 -05:00
Cameron Gutman
8354c403f4
Optimize OpenSSL backend to avoid redundant reinitialization
...
It is best to pass as few parameters to EVP_*Init_ex() as possible.
Passing a key, IV, or cipher will cause redundant work to happen behind
the scenes as OpenSSL doesn't check whether they have actually changed.
This avoids a malloc()/free() and redoing AES key expansion for every
message that is encrypted and decrypted.
2021-04-22 17:34:48 -05:00
Cameron Gutman
29d2cc6d5b
Improve MbedTLS implementation of AES-CBC
2021-04-22 17:08:35 -05:00
Cameron Gutman
d7549cd953
Use array initializers compatible with MSVC
2021-04-22 00:32:41 -05:00
Cameron Gutman
db81f1e512
Add support for audio stream encryption
...
Clients must opt-in using the new encryptionFlags field
2021-04-22 00:20:17 -05:00
Cameron Gutman
55cf1f8d30
Remove unnecessary calls to EVP_CIPHER_CTX_reset()
...
EVP_EncryptInit_ex() and EVP_DecryptInit_ex() free the cipher state as required
2021-04-22 00:17:46 -05:00
Cameron Gutman
625ec431eb
Improve AES-CBC code in preparation for audio encryption
2021-04-21 23:59:14 -05:00
Cameron Gutman
3abd3af4b2
Convert 'supportsHevc' and 'enableHdr' fields to bool type
2021-04-21 23:32:43 -05:00
Cameron Gutman
b24a71ab0b
Add explicit IDR frame request packet for GFE 3.22
2021-04-21 17:52:05 -05:00
Cameron Gutman
3adacb876d
Fix incorrect checks for AF_INET6
2021-04-19 23:01:17 -05:00
Cameron Gutman
221af82950
Add workaround for false GCC warning in CI
2021-04-18 00:15:27 -05:00
Cameron Gutman
76bba517b8
AppVeyor build fixes
2021-04-17 23:59:47 -05:00
Cameron Gutman
23a86b0455
Build with OpenSSL and MbedTLS for CI
2021-04-17 23:56:15 -05:00
Cameron Gutman
3979dbd082
Allow compilation on OSes without IPv6 support
2021-04-17 23:40:36 -05:00
Cameron Gutman
bced126fdb
Fix MSVC builds
2021-04-17 22:44:47 -05:00
Cameron Gutman
873fc6f837
Build fixes
2021-04-17 22:00:53 -05:00
Cameron Gutman
4304e597d8
Add byteswapping macros for big-endian systems
2021-04-17 21:43:13 -05:00
Cameron Gutman
efaeade7a6
Small cleanup and bugfix
2021-04-17 20:24:43 -05:00
Cameron Gutman
98d7ceecf7
Add native MbedTLS crypto backend
2021-04-17 19:00:26 -05:00
Cameron Gutman
d62ee951a0
Refactor OpenSSL usage into a platform-specific file to allow other crypto backends
2021-04-17 17:47:53 -05:00
Cameron Gutman
5782246b30
Add hack to prevent video glitching on GFE 3.22 when packets per frame exceed 120
2021-04-09 19:30:38 -05:00
Cameron Gutman
31433fc5ee
Minor cleanup and bugfix
2021-04-09 13:47:24 -05:00
Cameron Gutman
83431e557d
Fix leak on each GFE 3.22 input packet
2021-04-09 13:47:00 -05:00
Cameron Gutman
0a00163f0b
Fix audio stream init error check
2021-04-09 13:00:35 -05:00
Cameron Gutman
cb11b76682
Fix GCC/Clang warning
2021-04-09 12:20:02 -05:00
Cameron Gutman
6dca9c6754
Add special termination error code for protected content
2021-04-09 11:53:03 -05:00
Cameron Gutman
9841a6e34d
Fix parsing of termination message from GFE 3.22
2021-04-09 11:41:59 -05:00
Cameron Gutman
731d52d020
Return a packet length from the decryption process
2021-04-09 10:40:28 -05:00
Cameron Gutman
12f0f3d6d7
Add encrypted control stream support for GFE 3.22
...
Receive-side not yet fully working
2021-04-09 10:25:24 -05:00
Cameron Gutman
f0dbee171b
Consider UDP 48000 as part of RTSP for connection testing
...
GFE 3.22 requires UDP 48000 communication to complete RTSP handshake
2021-04-09 08:39:28 -05:00
Cameron Gutman
d0c3513504
Reorder audio initialization and RTSP handshake to avoid RTSP PLAY failure on GFE 3.22
2021-04-09 08:39:28 -05:00