TensorWorks / Unreal-PixelStreaming-RTP-Bridge

Forward Unreal Engine pixel streaming to a WebRTC peer that then forwards the RTP streams to the desired address.
MIT License
36 stars 15 forks source link

RTP bridge and Chrome payload mismatch #7

Open TravisBowers opened 1 year ago

TravisBowers commented 1 year ago

This issue seems like it may be related to #5. The RTP bridge does not appear to be using RTP video payload types passed at the command line. This will result in a type mismatch between the rtp bridge and Google Chrome pixelstreaming clients. This appears to cause the associated UE application to segfault. Even though --RTPVideoPayloadType=106 was specified upon intialization of the rtp-bridge, it looks like payload types 102, 108, 127, 125, and 123 were sent in the RTP bridge's offer and the signalling server answers with payload type 125. Later, as seen in the signalling server's log, a chrome client joins as player 102 and the signalling server appears to answer it's offer with payload type 106 (a=rtpmap:106 H264/90000). This seems to trigger a segfault in the NVENC encoder within the UE container.

RTP bridge log:

$ ./main --RTPVideoPayloadType=106
Sending offer...
{"type":"offer","sdp":"v=0\r\no=- 3667797613908183374 1675899858 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\na=fingerprint:sha-256 09:E3:A9:4D:C8:12:0C:13:BC:27:6A:4B:9F:B2:B6:00:46:66:26:E9:D3:E5:C0:2F:14:7A:A1:2F:D8:59:C2:F8\r\na=group:BUNDLE 0 1\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 9 0 8\r\nc=IN IP4 0.0.0.0\r\na=setup:actpass\r\na=mid:0\r\na=ice-ufrag:KvtBYtMlfUfxkwMM\r\na=ice-pwd:sugHTMwbBxLtuMzDtarjYexRchepMqbx\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:111 opus/48000/2\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:2 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=recvonly\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 127 120 123 118 116\r\nc=IN IP4 0.0.0.0\r\na=setup:actpass\r\na=mid:1\r\na=ice-ufrag:KvtBYtMlfUfxkwMM\r\na=ice-pwd:sugHTMwbBxLtuMzDtarjYexRchepMqbx\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 vp8/90000\r\na=rtcp-fb:96 goog-remb \r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack \r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 vp9/90000\r\na=fmtp:98 profile-id=0\r\na=rtcp-fb:98 goog-remb \r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack \r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 vp9/90000\r\na=fmtp:100 profile-id=1\r\na=rtcp-fb:100 goog-remb \r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack \r\na=rtcp-fb:100 nack pli\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:102 h264/90000\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtcp-fb:102 goog-remb \r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack \r\na=rtcp-fb:102 nack pli\r\na=rtpmap:121 rtx/90000\r\na=fmtp:121 apt=102\r\na=rtpmap:127 h264/90000\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtcp-fb:127 goog-remb \r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack \r\na=rtcp-fb:127 nack pli\r\na=rtpmap:120 rtx/90000\r\na=fmtp:120 apt=127\r\na=rtpmap:125 h264/90000\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtcp-fb:125 goog-remb \r\na=rtcp-fb:125 ccm fir\r\na=rtcp-fb:125 nack \r\na=rtcp-fb:125 nack pli\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:108 h264/90000\r\na=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtcp-fb:108 goog-remb \r\na=rtcp-fb:108 ccm fir\r\na=rtcp-fb:108 nack \r\na=rtcp-fb:108 nack pli\r\na=rtpmap:109 rtx/90000\r\na=fmtp:109 apt=108\r\na=rtpmap:127 h264/90000\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtcp-fb:127 goog-remb \r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack \r\na=rtcp-fb:127 nack pli\r\na=rtpmap:120 rtx/90000\r\na=fmtp:120 apt=127\r\na=rtpmap:123 h264/90000\r\na=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032\r\na=rtcp-fb:123 goog-remb \r\na=rtcp-fb:123 ccm fir\r\na=rtcp-fb:123 nack \r\na=rtcp-fb:123 nack pli\r\na=rtpmap:118 rtx/90000\r\na=fmtp:118 apt=123\r\na=rtpmap:116 ulpfec/90000\r\na=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:2 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=recvonly\r\n"}
2023/02/08 18:44:18 Websocket read message error: websocket: close 1013: Streamer is not connected
2023/02/08 18:44:18 Closing Pion websocket control loop.
[tcb@fedora unreal-pixelstreaming-rtp-bridge]$ ./main --RTPVideoPayloadType=106
Sending offer...
{"type":"offer","sdp":"v=0\r\no=- 8714867956761071595 1675899863 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\na=fingerprint:sha-256 99:47:12:10:19:A7:6B:EE:2C:D1:24:2E:D1:CE:44:04:41:03:F5:C4:0C:49:8B:CF:92:58:80:16:78:D0:A4:B7\r\na=group:BUNDLE 0 1\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 9 0 8\r\nc=IN IP4 0.0.0.0\r\na=setup:actpass\r\na=mid:0\r\na=ice-ufrag:EcKapLhVaGQZOQbg\r\na=ice-pwd:XffxpTzwfawjHoJXwRltxRPpDoWPmwNe\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:111 opus/48000/2\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:2 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=recvonly\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 127 120 123 118 116\r\nc=IN IP4 0.0.0.0\r\na=setup:actpass\r\na=mid:1\r\na=ice-ufrag:EcKapLhVaGQZOQbg\r\na=ice-pwd:XffxpTzwfawjHoJXwRltxRPpDoWPmwNe\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 vp8/90000\r\na=rtcp-fb:96 goog-remb \r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack \r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 vp9/90000\r\na=fmtp:98 profile-id=0\r\na=rtcp-fb:98 goog-remb \r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack \r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 vp9/90000\r\na=fmtp:100 profile-id=1\r\na=rtcp-fb:100 goog-remb \r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack \r\na=rtcp-fb:100 nack pli\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:102 h264/90000\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtcp-fb:102 goog-remb \r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack \r\na=rtcp-fb:102 nack pli\r\na=rtpmap:121 rtx/90000\r\na=fmtp:121 apt=102\r\na=rtpmap:127 h264/90000\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtcp-fb:127 goog-remb \r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack \r\na=rtcp-fb:127 nack pli\r\na=rtpmap:120 rtx/90000\r\na=fmtp:120 apt=127\r\na=rtpmap:125 h264/90000\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtcp-fb:125 goog-remb \r\na=rtcp-fb:125 ccm fir\r\na=rtcp-fb:125 nack \r\na=rtcp-fb:125 nack pli\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:108 h264/90000\r\na=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtcp-fb:108 goog-remb \r\na=rtcp-fb:108 ccm fir\r\na=rtcp-fb:108 nack \r\na=rtcp-fb:108 nack pli\r\na=rtpmap:109 rtx/90000\r\na=fmtp:109 apt=108\r\na=rtpmap:127 h264/90000\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtcp-fb:127 goog-remb \r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack \r\na=rtcp-fb:127 nack pli\r\na=rtpmap:120 rtx/90000\r\na=fmtp:120 apt=127\r\na=rtpmap:123 h264/90000\r\na=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032\r\na=rtcp-fb:123 goog-remb \r\na=rtcp-fb:123 ccm fir\r\na=rtcp-fb:123 nack \r\na=rtcp-fb:123 nack pli\r\na=rtpmap:118 rtx/90000\r\na=fmtp:118 apt=123\r\na=rtpmap:116 ulpfec/90000\r\na=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:2 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=recvonly\r\n"}
 Received message, (type=1): {"type":"config","peerConnectionOptions":{}}
Got config message, ToDO: react based on config that was passed.
 Received message, (type=1): {"type":"playerCount","count":1}
Player count is: 1
Added local ICE candidate that we will send off later...
Added local ICE candidate that we will send off later...
 Received message, (type=1): {"type":"answer","sdp":"v=0\r\no=- 567708638756800453 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=msid-semantic: WMS pixelstreaming_audio_stream_id pixelstreaming_video_stream_id\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:EHuE\r\na=ice-pwd:m9bUARnbOrG79uOEK91MY49y\r\na=ice-options:trickle\r\na=fingerprint:sha-256 5D:18:50:A0:05:8B:90:F0:7A:6B:DB:4C:B3:7D:51:6D:68:CA:B6:0F:DA:C3:9E:8F:46:5C:DF:01:BB:B8:2A:6C\r\na=setup:active\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:2 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:pixelstreaming_audio_stream_id pixelstreaming_audio_track_label\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=ssrc:361898813 cname:QFpMOe8Cbd0Pzzah\r\na=ssrc:361898813 msid:pixelstreaming_audio_stream_id pixelstreaming_audio_track_label\r\na=ssrc:361898813 mslabel:pixelstreaming_audio_stream_id\r\na=ssrc:361898813 label:pixelstreaming_audio_track_label\r\nm=video 9 UDP/TLS/RTP/SAVPF 125 107 116\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:EHuE\r\na=ice-pwd:m9bUARnbOrG79uOEK91MY49y\r\na=ice-options:trickle\r\na=fingerprint:sha-256 5D:18:50:A0:05:8B:90:F0:7A:6B:DB:4C:B3:7D:51:6D:68:CA:B6:0F:DA:C3:9E:8F:46:5C:DF:01:BB:B8:2A:6C\r\na=setup:active\r\na=mid:1\r\na=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:2 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:pixelstreaming_video_stream_id pixelstreaming_video_track_label\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:125 h264/90000\r\na=rtcp-fb:125 goog-remb\r\na=rtcp-fb:125 ccm fir\r\na=rtcp-fb:125 nack\r\na=rtcp-fb:125 nack pli\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:116 ulpfec/90000\r\na=ssrc-group:FID 477503108 688816078\r\na=ssrc:477503108 cname:QFpMOe8Cbd0Pzzah\r\na=ssrc:477503108 msid:pixelstreaming_video_stream_id pixelstreaming_video_track_label\r\na=ssrc:477503108 mslabel:pixelstreaming_video_stream_id\r\na=ssrc:477503108 label:pixelstreaming_video_track_label\r\na=ssrc:688816078 cname:QFpMOe8Cbd0Pzzah\r\na=ssrc:688816078 msid:pixelstreaming_video_stream_id pixelstreaming_video_track_label\r\na=ssrc:688816078 mslabel:pixelstreaming_video_stream_id\r\na=ssrc:688816078 label:pixelstreaming_video_track_label\r\n"}
Added session description from UE to Pion.
Connection State has changed checking
Sending our local ice candidate to UE...{"type":"iceCandidate","candidate":{"candidate":"candidate:1919723406 1 udp 2130706431 172.16.0.107 48256 typ host","sdpMid":"","sdpMLineIndex":0,"usernameFragment":null}}
Sending our local ice candidate to UE...{"type":"iceCandidate","candidate":{"candidate":"candidate:233762139 1 udp 2130706431 172.17.0.1 49483 typ host","sdpMid":"","sdpMLineIndex":0,"usernameFragment":null}}
 Received message, (type=1): {"type":"iceCandidate","candidate":{"sdpMid":"0","sdpMLineIndex":0,"candidate":"candidate:1306246890 1 udp 2122260223 172.16.0.107 59892 typ host generation 0 ufrag EHuE network-id 1 network-cost 50"}}
Added remote ice candidate from UE - candidate:1306246890 1 udp 2122260223 172.16.0.107 59892 typ host generation 0 ufrag EHuE network-id 1 network-cost 50
Connection State has changed connected
 Connected to UE Pixel Streaming!
Got audio track from Unreal Engine Pixel Streaming WebRTC.
Got video track from Unreal Engine Pixel Streaming WebRTC.
 Received message, (type=1): {"type":"playerCount","count":2}
Player count is: 2
Connection State has changed disconnected
 Disconnected from UE Pixel Streaming.
2023/02/08 18:47:20 Websocket read message error: websocket: close 1005 (no status)
2023/02/08 18:47:20 Closing Pion websocket control loop.

Signalling server log:

$ docker logs --follow signalling_server
23:44:18.085 configFile /opt/SignallingWebServer/config.json
23:44:18.089 Config: {
    "UseFrontend": false,
    "UseMatchmaker": false,
    "UseHTTPS": false,
    "UseAuthentication": false,
    "LogToFile": true,
    "HomepageFile": "/public/player.html",
    "AdditionalRoutes": {},
    "EnableWebserver": true,
    "MatchmakerAddress": "",
    "MatchmakerPort": "9999",
    "PublicIp": "localhost",
    "HttpPort": 80,
    "HttpsPort": 443,
    "StreamerPort": 8883
}
23:44:18.115 No peerConnectionConfig
23:44:18.118 Running Cirrus - The Pixel Streaming reference implementation signalling server for Unreal Engine 4.27.
23:44:18.129 WebSocket listening to Streamer connections on :8883
23:44:18.129 WebSocket listening to Players connections on :80
23:44:18.129 Http listening on *: 80
23:44:21.480 Streamer connected: ::ffff:127.0.0.1
23:44:23.839 player 101 (::1) connected
23:44:23.843 <- player 101: {"type":"offer","sdp":"v=0\r\no=- 8714867956761071595 1675899863 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\na=fingerprint:sha-256 99:47:12:10:19:A7:6B:EE:2C:D1:24:2E:D1:CE:44:04:41:03:F5:C4:0C:49:8B:CF:92:58:80:16:78:D0:A4:B7\r\na=group:BUNDLE 0 1\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 9 0 8\r\nc=IN IP4 0.0.0.0\r\na=setup:actpass\r\na=mid:0\r\na=ice-ufrag:EcKapLhVaGQZOQbg\r\na=ice-pwd:XffxpTzwfawjHoJXwRltxRPpDoWPmwNe\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:111 opus/48000/2\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:2 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=recvonly\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 127 120 123 118 116\r\nc=IN IP4 0.0.0.0\r\na=setup:actpass\r\na=mid:1\r\na=ice-ufrag:EcKapLhVaGQZOQbg\r\na=ice-pwd:XffxpTzwfawjHoJXwRltxRPpDoWPmwNe\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 vp8/90000\r\na=rtcp-fb:96 goog-remb \r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack \r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 vp9/90000\r\na=fmtp:98 profile-id=0\r\na=rtcp-fb:98 goog-remb \r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack \r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 vp9/90000\r\na=fmtp:100 profile-id=1\r\na=rtcp-fb:100 goog-remb \r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack \r\na=rtcp-fb:100 nack pli\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:102 h264/90000\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtcp-fb:102 goog-remb \r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack \r\na=rtcp-fb:102 nack pli\r\na=rtpmap:121 rtx/90000\r\na=fmtp:121 apt=102\r\na=rtpmap:127 h264/90000\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtcp-fb:127 goog-remb \r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack \r\na=rtcp-fb:127 nack pli\r\na=rtpmap:120 rtx/90000\r\na=fmtp:120 apt=127\r\na=rtpmap:125 h264/90000\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtcp-fb:125 goog-remb \r\na=rtcp-fb:125 ccm fir\r\na=rtcp-fb:125 nack \r\na=rtcp-fb:125 nack pli\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:108 h264/90000\r\na=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtcp-fb:108 goog-remb \r\na=rtcp-fb:108 ccm fir\r\na=rtcp-fb:108 nack \r\na=rtcp-fb:108 nack pli\r\na=rtpmap:109 rtx/90000\r\na=fmtp:109 apt=108\r\na=rtpmap:127 h264/90000\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtcp-fb:127 goog-remb \r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack \r\na=rtcp-fb:127 nack pli\r\na=rtpmap:120 rtx/90000\r\na=fmtp:120 apt=127\r\na=rtpmap:123 h264/90000\r\na=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032\r\na=rtcp-fb:123 goog-remb \r\na=rtcp-fb:123 ccm fir\r\na=rtcp-fb:123 nack \r\na=rtcp-fb:123 nack pli\r\na=rtpmap:118 rtx/90000\r\na=fmtp:118 apt=123\r\na=rtpmap:116 ulpfec/90000\r\na=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:2 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=recvonly\r\n"}
23:44:23.844 <- player 101: offer
23:44:23.887 <- Streamer: {"type":"answer","playerId":101,"sdp":"v=0\r\no=- 567708638756800453 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=msid-semantic: WMS pixelstreaming_audio_stream_id pixelstreaming_video_stream_id\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:EHuE\r\na=ice-pwd:m9bUARnbOrG79uOEK91MY49y\r\na=ice-options:trickle\r\na=fingerprint:sha-256 5D:18:50:A0:05:8B:90:F0:7A:6B:DB:4C:B3:7D:51:6D:68:CA:B6:0F:DA:C3:9E:8F:46:5C:DF:01:BB:B8:2A:6C\r\na=setup:active\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:2 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:pixelstreaming_audio_stream_id pixelstreaming_audio_track_label\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=ssrc:361898813 cname:QFpMOe8Cbd0Pzzah\r\na=ssrc:361898813 msid:pixelstreaming_audio_stream_id pixelstreaming_audio_track_label\r\na=ssrc:361898813 mslabel:pixelstreaming_audio_stream_id\r\na=ssrc:361898813 label:pixelstreaming_audio_track_label\r\nm=video 9 UDP/TLS/RTP/SAVPF 125 107 116\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:EHuE\r\na=ice-pwd:m9bUARnbOrG79uOEK91MY49y\r\na=ice-options:trickle\r\na=fingerprint:sha-256 5D:18:50:A0:05:8B:90:F0:7A:6B:DB:4C:B3:7D:51:6D:68:CA:B6:0F:DA:C3:9E:8F:46:5C:DF:01:BB:B8:2A:6C\r\na=setup:active\r\na=mid:1\r\na=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:2 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:pixelstreaming_video_stream_id pixelstreaming_video_track_label\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:125 h264/90000\r\na=rtcp-fb:125 goog-remb\r\na=rtcp-fb:125 ccm fir\r\na=rtcp-fb:125 nack\r\na=rtcp-fb:125 nack pli\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:116 ulpfec/90000\r\na=ssrc-group:FID 477503108 688816078\r\na=ssrc:477503108 cname:QFpMOe8Cbd0Pzzah\r\na=ssrc:477503108 msid:pixelstreaming_video_stream_id pixelstreaming_video_track_label\r\na=ssrc:477503108 mslabel:pixelstreaming_video_stream_id\r\na=ssrc:477503108 label:pixelstreaming_video_track_label\r\na=ssrc:688816078 cname:QFpMOe8Cbd0Pzzah\r\na=ssrc:688816078 msid:pixelstreaming_video_stream_id pixelstreaming_video_track_label\r\na=ssrc:688816078 mslabel:pixelstreaming_video_stream_id\r\na=ssrc:688816078 label:pixelstreaming_video_track_label\r\n"}
23:44:23.889 <- player 101: {"type":"iceCandidate","candidate":{"candidate":"candidate:1919723406 1 udp 2130706431 172.16.0.107 48256 typ host","sdpMid":"","sdpMLineIndex":0,"usernameFragment":null}}
23:44:23.889 <- player 101: iceCandidate
23:44:23.890 <- player 101: {"type":"iceCandidate","candidate":{"candidate":"candidate:233762139 1 udp 2130706431 172.17.0.1 49483 typ host","sdpMid":"","sdpMLineIndex":0,"usernameFragment":null}}
23:44:23.890 <- player 101: iceCandidate
23:44:23.919 <- Streamer: {"type":"iceCandidate","playerId":101,"candidate":{"sdpMid":"0","sdpMLineIndex":0,"candidate":"candidate:1306246890 1 udp 2122260223 172.16.0.107 59892 typ host generation 0 ufrag EHuE network-id 1 network-cost 50"}}
23:45:41.124 <- Streamer: {"type":"ping","time":1675899941}
23:46:30.918 player 102 (::ffff:172.16.0.162) connected
23:46:30.944 <- player 102: {"type":"offer","sdp":"v=0\r\no=- 9103071203189854722 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1 2\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 35 36 37 38 102 103 104 105 106 107 108 109 127 125 39 40 41 42 43 44 45 46 47 48 112 113 114 49\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:UrPy\r\na=ice-pwd:l69Hh871Sbi2AzqDzi/DmZ5f\r\na=ice-options:trickle\r\na=fingerprint:sha-256 4C:BB:E1:37:43:A1:22:E2:1B:BF:23:E4:6F:C6:9B:CF:2E:E7:30:A9:5A:CB:5A:66:12:A4:BF:AF:26:4D:D6:1F\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=recvonly\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=fmtp:98 profile-id=0\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 VP9/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 profile-id=2\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:35 VP9/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=fmtp:35 profile-id=1\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:37 VP9/90000\r\na=rtcp-fb:37 goog-remb\r\na=rtcp-fb:37 transport-cc\r\na=rtcp-fb:37 ccm fir\r\na=rtcp-fb:37 nack\r\na=rtcp-fb:37 nack pli\r\na=fmtp:37 profile-id=3\r\na=rtpmap:38 rtx/90000\r\na=fmtp:38 apt=37\r\na=rtpmap:102 H264/90000\r\na=rtcp-fb:102 goog-remb\r\na=rtcp-fb:102 transport-cc\r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack\r\na=rtcp-fb:102 nack pli\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:103 rtx/90000\r\na=fmtp:103 apt=102\r\na=rtpmap:104 H264/90000\r\na=rtcp-fb:104 goog-remb\r\na=rtcp-fb:104 transport-cc\r\na=rtcp-fb:104 ccm fir\r\na=rtcp-fb:104 nack\r\na=rtcp-fb:104 nack pli\r\na=fmtp:104 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtpmap:105 rtx/90000\r\na=fmtp:105 apt=104\r\na=rtpmap:106 H264/90000\r\na=rtcp-fb:106 goog-remb\r\na=rtcp-fb:106 transport-cc\r\na=rtcp-fb:106 ccm fir\r\na=rtcp-fb:106 nack\r\na=rtcp-fb:106 nack pli\r\na=fmtp:106 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=106\r\na=rtpmap:108 H264/90000\r\na=rtcp-fb:108 goog-remb\r\na=rtcp-fb:108 transport-cc\r\na=rtcp-fb:108 ccm fir\r\na=rtcp-fb:108 nack\r\na=rtcp-fb:108 nack pli\r\na=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtpmap:109 rtx/90000\r\na=fmtp:109 apt=108\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f\r\na=rtpmap:125 rtx/90000\r\na=fmtp:125 apt=127\r\na=rtpmap:39 H264/90000\r\na=rtcp-fb:39 goog-remb\r\na=rtcp-fb:39 transport-cc\r\na=rtcp-fb:39 ccm fir\r\na=rtcp-fb:39 nack\r\na=rtcp-fb:39 nack pli\r\na=fmtp:39 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=4d001f\r\na=rtpmap:40 rtx/90000\r\na=fmtp:40 apt=39\r\na=rtpmap:41 H264/90000\r\na=rtcp-fb:41 goog-remb\r\na=rtcp-fb:41 transport-cc\r\na=rtcp-fb:41 ccm fir\r\na=rtcp-fb:41 nack\r\na=rtcp-fb:41 nack pli\r\na=fmtp:41 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=f4001f\r\na=rtpmap:42 rtx/90000\r\na=fmtp:42 apt=41\r\na=rtpmap:43 H264/90000\r\na=rtcp-fb:43 goog-remb\r\na=rtcp-fb:43 transport-cc\r\na=rtcp-fb:43 ccm fir\r\na=rtcp-fb:43 nack\r\na=rtcp-fb:43 nack pli\r\na=fmtp:43 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=f4001f\r\na=rtpmap:44 rtx/90000\r\na=fmtp:44 apt=43\r\na=rtpmap:45 AV1/90000\r\na=rtcp-fb:45 goog-remb\r\na=rtcp-fb:45 transport-cc\r\na=rtcp-fb:45 ccm fir\r\na=rtcp-fb:45 nack\r\na=rtcp-fb:45 nack pli\r\na=rtpmap:46 rtx/90000\r\na=fmtp:46 apt=45\r\na=rtpmap:47 AV1/90000\r\na=rtcp-fb:47 goog-remb\r\na=rtcp-fb:47 transport-cc\r\na=rtcp-fb:47 ccm fir\r\na=rtcp-fb:47 nack\r\na=rtcp-fb:47 nack pli\r\na=fmtp:47 profile=1\r\na=rtpmap:48 rtx/90000\r\na=fmtp:48 apt=47\r\na=rtpmap:112 red/90000\r\na=rtpmap:113 rtx/90000\r\na=fmtp:113 apt=112\r\na=rtpmap:114 ulpfec/90000\r\na=rtpmap:49 flexfec-03/90000\r\na=rtcp-fb:49 goog-remb\r\na=rtcp-fb:49 transport-cc\r\na=fmtp:49 repair-window=10000000\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 110 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:UrPy\r\na=ice-pwd:l69Hh871Sbi2AzqDzi/DmZ5f\r\na=ice-options:trickle\r\na=fingerprint:sha-256 4C:BB:E1:37:43:A1:22:E2:1B:BF:23:E4:6F:C6:9B:CF:2E:E7:30:A9:5A:CB:5A:66:12:A4:BF:AF:26:4D:D6:1F\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=recvonly\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1;stereo=1;sprop-maxcapturerate=48000\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:126 telephone-event/8000\r\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:UrPy\r\na=ice-pwd:l69Hh871Sbi2AzqDzi/DmZ5f\r\na=ice-options:trickle\r\na=fingerprint:sha-256 4C:BB:E1:37:43:A1:22:E2:1B:BF:23:E4:6F:C6:9B:CF:2E:E7:30:A9:5A:CB:5A:66:12:A4:BF:AF:26:4D:D6:1F\r\na=setup:actpass\r\na=mid:2\r\na=sctp-port:5000\r\na=max-message-size:262144\r\n"}
23:46:30.945 <- player 102: offer
23:46:30.947 <- player 102: {"type":"iceCandidate","candidate":{"candidate":"candidate:1306114253 1 udp 2113937151 1f975b22-6037-42fa-ac31-e28d0c5a53c8.local 48035 typ host generation 0 ufrag UrPy network-cost 999","sdpMid":"0","sdpMLineIndex":0,"usernameFragment":"UrPy"}}
23:46:30.947 <- player 102: iceCandidate
23:46:30.947 <- player 102: {"type":"iceCandidate","candidate":{"candidate":"candidate:1306114253 1 udp 2113937151 1f975b22-6037-42fa-ac31-e28d0c5a53c8.local 54212 typ host generation 0 ufrag UrPy network-cost 999","sdpMid":"1","sdpMLineIndex":1,"usernameFragment":"UrPy"}}
23:46:30.948 <- player 102: iceCandidate
23:46:30.948 <- player 102: {"type":"iceCandidate","candidate":{"candidate":"candidate:1306114253 1 udp 2113937151 1f975b22-6037-42fa-ac31-e28d0c5a53c8.local 57971 typ host generation 0 ufrag UrPy network-cost 999","sdpMid":"2","sdpMLineIndex":2,"usernameFragment":"UrPy"}}
23:46:30.949 <- player 102: iceCandidate
23:46:41.633 <- Streamer: {"type":"answer","playerId":102,"sdp":"v=0\r\no=- 5697048734645495409 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1 2\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS pixelstreaming_audio_stream_id pixelstreaming_video_stream_id\r\nm=video 9 UDP/TLS/RTP/SAVPF 106 107 112 113 114\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:MC8H\r\na=ice-pwd:rj6TGW/LgmfSykj/S1+dpqi9\r\na=ice-options:trickle\r\na=fingerprint:sha-256 65:A6:16:AD:CB:4B:0B:2E:E1:2C:1E:12:13:64:03:E9:C5:49:98:C8:BF:9E:6E:B1:BA:A4:1A:A0:53:91:44:9B\r\na=setup:active\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:pixelstreaming_video_stream_id pixelstreaming_video_track_label\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:106 H264/90000\r\na=rtcp-fb:106 goog-remb\r\na=rtcp-fb:106 transport-cc\r\na=rtcp-fb:106 ccm fir\r\na=rtcp-fb:106 nack\r\na=rtcp-fb:106 nack pli\r\na=fmtp:106 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=106\r\na=rtpmap:112 red/90000\r\na=rtpmap:113 rtx/90000\r\na=fmtp:113 apt=112\r\na=rtpmap:114 ulpfec/90000\r\na=ssrc-group:FID 489776238 765470402\r\na=ssrc:489776238 cname:/Q8ddNGVAizy+wxo\r\na=ssrc:489776238 msid:pixelstreaming_video_stream_id pixelstreaming_video_track_label\r\na=ssrc:489776238 mslabel:pixelstreaming_video_stream_id\r\na=ssrc:489776238 label:pixelstreaming_video_track_label\r\na=ssrc:765470402 cname:/Q8ddNGVAizy+wxo\r\na=ssrc:765470402 msid:pixelstreaming_video_stream_id pixelstreaming_video_track_label\r\na=ssrc:765470402 mslabel:pixelstreaming_video_stream_id\r\na=ssrc:765470402 label:pixelstreaming_video_track_label\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 110\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:MC8H\r\na=ice-pwd:rj6TGW/LgmfSykj/S1+dpqi9\r\na=ice-options:trickle\r\na=fingerprint:sha-256 65:A6:16:AD:CB:4B:0B:2E:E1:2C:1E:12:13:64:03:E9:C5:49:98:C8:BF:9E:6E:B1:BA:A4:1A:A0:53:91:44:9B\r\na=setup:active\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendonly\r\na=msid:pixelstreaming_audio_stream_id pixelstreaming_audio_track_label\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:110 telephone-event/48000\r\na=ssrc:762239685 cname:/Q8ddNGVAizy+wxo\r\na=ssrc:762239685 msid:pixelstreaming_audio_stream_id pixelstreaming_audio_track_label\r\na=ssrc:762239685 mslabel:pixelstreaming_audio_stream_id\r\na=ssrc:762239685 label:pixelstreaming_audio_track_label\r\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\r\nc=IN IP4 0.0.0.0\r\nb=AS:30\r\na=ice-ufrag:MC8H\r\na=ice-pwd:rj6TGW/LgmfSykj/S1+dpqi9\r\na=ice-options:trickle\r\na=fingerprint:sha-256 65:A6:16:AD:CB:4B:0B:2E:E1:2C:1E:12:13:64:03:E9:C5:49:98:C8:BF:9E:6E:B1:BA:A4:1A:A0:53:91:44:9B\r\na=setup:active\r\na=mid:2\r\na=sctp-port:5000\r\na=max-message-size:262144\r\n"}
23:46:41.666 <- Streamer: {"type":"iceCandidate","playerId":102,"candidate":{"sdpMid":"0","sdpMLineIndex":0,"candidate":"candidate:1306246890 1 udp 2122260223 172.16.0.107 58506 typ host generation 0 ufrag MC8H network-id 1 network-cost 50"}}
streamer disconnected: 1006 -
23:47:20.970 player 101 connection closed: 1005 -
23:47:20.977 player 102 connection closed: 1005 -

Unreal Engine version: 4.27.0 UE error:

0x0000000004eb993e PixelstreamingApp!FGenericPlatformMisc::RaiseException(unsigned int)()
0x000000000508008b PixelstreamingApp!FOutputDevice::LogfImpl(char16_t const*, ...)()
0x0000000004f21720 PixelstreamingApp!FMallocBinned2::Private::FreeBundles(FMallocBinned2&, FMallocBinned2::FBundleNode*, unsigned int, unsigned int)()
0x0000000004f214db PixelstreamingApp!FMallocBinned2::FreeExternal(void*)()
0x0000000004f8eb4f PixelstreamingApp!FMallocPoisonProxy::Free(void*)()
0x00000000039d7b90 PixelstreamingApp!AVEncoder::FVideoEncoderNVENC_H264::FNVENCLayer::GetOrCreateBuffer(AVEncoder::FVideoEncoderInputFrameImpl const*)()
0x00000000039d6c43 PixelstreamingApp!AVEncoder::FVideoEncoderNVENC_H264::FNVENCLayer::Encode(AVEncoder::FVideoEncoderInputFrame const*, AVEncoder::FVideoEncoder::FEncodeOptions const&)()
0x00000000039d6be7 PixelstreamingApp!AVEncoder::FVideoEncoderNVENC_H264::Encode(AVEncoder::FVideoEncoderInputFrame const*, AVEncoder::FVideoEncoder::FEncodeOptions const&)()
0x000000000399bae0 PixelstreamingApp!FPixelStreamingVideoEncoder::Encode(webrtc::VideoFrame const&, std::__1::vector<webrtc::VideoFrameType, std::__1::allocator<webrtc::VideoFrameType> > const*)()
0x0000000009d3e1c4 PixelstreamingApp!webrtc::VideoStreamEncoder::EncodeVideoFrame(webrtc::VideoFrame const&, long)()
0x0000000009d3d475 PixelstreamingApp!webrtc::VideoStreamEncoder::MaybeEncodeVideoFrame(webrtc::VideoFrame const&, long)()
0x0000000009d40d6e PixelstreamingApp!webrtc::webrtc_new_closure_impl::ClosureTask<webrtc::VideoStreamEncoder::OnFrame(webrtc::VideoFrame const&)::$_15>::Run()()
0x0000000009dcb62b PixelstreamingApp!webrtc::(anonymous namespace)::TaskQueueLibevent::OnWakeup(int, short, void*)()
0x0000000009dcd3be PixelstreamingApp!event_base_loop()
0x0000000009dcb4db PixelstreamingApp!webrtc::(anonymous namespace)::TaskQueueLibevent::ThreadMain(void*)()
0x0000000009b6531b PixelstreamingApp!rtc::PlatformThread::StartThread(void*)()
0x00007f60cab886db libpthread.so.0!UnknownFunction(0x76da)
0x00007f60c98ac71f libc.so.6!clone(+0x3e)
[2023.02.08-23.47.05:424][468]LogExit: Executing StaticShutdownAfterError
Engine crash handling finished; re-raising signal 11 for the default handler. Good bye.
Segmentation fault (core dumped)
lukehb commented 1 year ago

I think the bridge needs more elaborate handling of video payload type instead of hardcoding to particular value (this will continue to break with different browser or as Chrome changes payloads supported),

The code should like be a smarter version of what was done here: https://github.com/TensorWorks/Unreal-PixelStreaming-RTP-Bridge/commit/40eef6daf7991e425c956d064c97ee188818f7ef

I unfortunately don't have time to to fix this myself

jmpolom commented 1 year ago

Even though --RTPVideoPayloadType=106 was specified upon intialization of the rtp-bridge, it looks like payload types 102, 108, 127, 125, and 123 were sent in the RTP bridge's offer and the signalling server answers with payload type 125.

After reviewing past changes and the current code in main, this honestly sounds like expected behavior. At line 104 the function RegisterDefaultCodecs is called from the upstream pion/webrtc module. This function sets up a number of codecs and PayloadTypes but importantly, 106 is not one of them as of what's in their v3.1.54 branch.

Starting from commit bb7048fa030c1578f91bbb970ae377e8f85eef46 the custom logic that previously setup the codecs and PayloadTypes specified from CLI options was removed and replaced with RegisterDefaultCodecs from the webrtc module. This means the RTPVideoPayloadType CLI flag is not really being honored anymore when it comes to configuring the proper codecs and PayloadTypes via the webrtc module.

However it appears the CLI flag value is still used subsequently when setting up the UDP connection: see these three areas for context. It seems like the stream isn't going to be configured for PayloadType 106 (not sure what that is exactly) but that value will make it into an RTP packet at some point. I can only surmise this is causing some confusion on the receiving end of things perhaps causing the reported crash.

Please feel free to critique or correct this analysis but I believe a previous commit actually led to this behavior and the behavior that occurs (not being offered the requested stream type) is in line with what the current code should do. A fix may be improved input validation on the RTPVideoPayloadType CLI flag to ensure compatibility between requested options and the upstream library defaults. It could also mean a change is needed in the upstream webrtc library if PayloadType 106 is needed.

Further, it is possible this is a bug in UE. I feel like requesting a stream type that isn't available shouldn't lead to a crash. To me that is a condition that should be handled more gracefully than a segfault.

lukehb commented 1 year ago

Further, it is possible this is a bug in UE.

Oh, it certainly is.

I feel like requesting a stream type that isn't available shouldn't lead to a crash. To me that is a condition that should be handled more gracefully than a segfault.

You guys are on 4.27 based on the log, this has been fixed in subsequent versions - the crash - but requesting payload type that is not mismatched is still going to result in no streaming most likely.

Based on your digging @jmpolom - it sounds like locking Pion version could also be a solution?

To be clear, we don't use this code at TW, but I am happy to accept a PR if you would like to make a code change.

jmpolom commented 1 year ago

You guys are on 4.27 based on the log, this has been fixed in subsequent versions - the crash - but requesting payload type that is not mismatched is still going to result in no streaming most likely.

This is good information. I would definitely expect if the payload type is specified more than once in an RTP packet or exchange that a mismatch would cause something to not work. Makes sense. However it sounds like there is an additional known bug in 4.27 that causes the crash which was an aspect of particular concern for @TravisBowers.

it sounds like locking Pion version could also be a solution?

I did not review past versions/commits of the pion webrtc package. I only rather quickly glanced at the current default branch which appeared to be a release version.

I did, however, examine the logic they're using to setup codec types and initially to me it seems like there would be no problem calling RegisterDefaultCodecs first and also calling RegisterCodec. It seems like the way the codecs are added is idempotent to some degree and this would allow a passed --RTPVideoPayloadType= to be fully honored thus setting an arbitrary payload type.

However I actually do not really have deep knowledge of the RTP protocol. I'm not sure if allowing a user to set arbitrary payload types is perhaps dangerous or simply ill advised. We could probably just as easily pin to a pion version and only allow the specific codec types that it configures as default. I do not fully understand why payload type 106 was used for the test or what codecs it corresponds with.

lukehb commented 1 year ago

So very high level, when doing webrtc, both sides negotiate video payload types:

so in the sdp you might end up with one side saying I can do the following video payloads:

h.264 - constrained baseline h.264 - baseline vp8 vp9 and so on

Each of these then gets assigned an RTP payload number to unique identify it, so like

h.264 - constrained baseline might end up being 106

These numbers are not spec defined, but rather just what the browser comes up with by convention.

Then the other side will read these and respond with which payload types it supports.

Setting the payload type via command line was a hack from memory and proper solution would likely be to examine the full offer/answer, identify the h.264 media we want then use that as the payload. I think 106 was selected at the time because it just happened to be what Chrome and Firefox were both using - but that may have changed for a number of reasons with browser updates.

edit: actually reading my own readme.md for this repo, 125 was selected as the default, so not sure how 106 came into this, but largely irrelevant, as per my explanation above.

jmpolom commented 1 year ago

Is the assignment of payload type number specific to the client (example: chrome does it one way but safari may use different values) and primarily controlled by the client? Is there any decent set of documentation you might recommend to better understand this aspect of the rtp connection process?

I did very quickly glance through RFC 3551 (rtp for audio video conferences) and RFC 6184 (h.264 payload format) and both state that the mechanism by which session participants determine dynamic payload types is beyond the scope of the RFC.

I see you mentioned sdp which is something I haven't really even glanced at yet (RFC 2327?). I obviously see you have included an sdp file in this repo...is there also a network based form of sdp that is initially employed to negotiate a profile between the rtp participants?

My one thought reading through the code was can we just not have to deal with manually setting payload types. I would agree with your description of it as a hack...definitely seemed like an activity that is bound to cause an issue at some point. Obviously Chrome does not require the user to manually specify a payload type so if we are to continue relying on this in our kit we should probably make real improvements along these lines.

Still might be nice to keep a "manual override" for payload type present for debugging purposes but the payload should be determined dynamically.

it sounds like locking Pion version could also be a solution?

Further comment on this...it looks like this tool already pins to v3.0.4 based on the go.mod. My comments above were in reference to a later version but it looks like they're still valid against the pinned version.

lukehb commented 1 year ago

Is the assignment of payload type number specific to the client (example: chrome does it one way but safari may use different values) and primarily controlled by the client?

Yeah, it is dependent on the WebRTC implementation, and ofc, FF, Chrome, Safari all have slightly different flavours. And yes, afaik, your reading of the spec is correct, the determination of payload types (numbers) is not formally defined in the spec and is instead negotiated by the peers (browsers in this case). In theory I believe payload numbers could basically be anything.

.is there also a network based form of sdp that is initially employed to negotiate a profile between the rtp participants

No, the thing that is employed to negotiate the profile between participants is the SDP. The SDP is the thing that is sent over the network by both peers. The general process is an "offer" SDP is sent from one peer, then that is inspected by the other side and an "answer" SDP is sent in return. The intersection of supported formats in both offer and answer is what ends up being used for the actual media.

if we are to continue relying on this in our kit we should probably make real improvements along these lines

Agreed.