From 5010ee872d390cc371bf38a6327b345be88137d1 Mon Sep 17 00:00:00 2001 From: Chris Bainbridge Date: Thu, 24 Oct 2024 23:29:30 +0100 Subject: [PATCH] webrtc: Fix Python custom signaller receiving SDP offer The GstWebRTC API web interface defaults to receiving an SDP offer and generating an answer, but this can be overridden by entering "offer options" before clicking to open the remote stream. The Python webrtcsink-custom-signaller.py example failed in this mode as it was coded to only generate an offer and receive an answer. Fix this by implementing support for receiving an offer and sending an answer. Part-of: --- net/webrtc/examples/webrtcsink-custom-signaller.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/net/webrtc/examples/webrtcsink-custom-signaller.py b/net/webrtc/examples/webrtcsink-custom-signaller.py index 0dc58f76d..9a576ddc0 100644 --- a/net/webrtc/examples/webrtcsink-custom-signaller.py +++ b/net/webrtc/examples/webrtcsink-custom-signaller.py @@ -104,7 +104,12 @@ class WebRTCClient: elif msg['type'] == 'sessionStarted': pass elif msg['type'] == 'startSession': - self.signaller_emit_session_requested(msg['sessionId'], msg['peerId'], None) + offer = None + if msg['offer']: + _, sdpmsg = GstSdp.SDPMessage.new() + GstSdp.sdp_message_parse_buffer(bytes(msg['offer'].encode()), sdpmsg) + offer = GstWebRTC.WebRTCSessionDescription.new(GstWebRTC.WebRTCSDPType.OFFER, sdpmsg) + self.signaller_emit_session_requested(msg['sessionId'], msg['peerId'], offer) elif msg['type'] == 'endSession': self.signaller_emit_session_ended(msg['sessionId']) elif msg['type'] == 'peer': @@ -147,9 +152,11 @@ class WebRTCClient: return True def signaller_on_send_session_description(self, _, session_id, offer): + typ = 'offer' + if offer.type == GstWebRTC.WebRTCSDPType.ANSWER: + typ = 'answer' sdp = offer.sdp.as_text() - assert offer.type == GstWebRTC.WebRTCSDPType.OFFER - self.send_soon({'type': 'peer', 'sessionId': session_id, 'sdp': { 'type': 'offer', 'sdp': sdp }}) + self.send_soon({'type': 'peer', 'sessionId': session_id, 'sdp': { 'type': typ, 'sdp': sdp }}) return True def signaller_on_send_ice(self, _, session_id, candidate, sdp_m_line_index, sdp_mid):