From 26a5cbddbb70b60a4a66bfd1eea6a87add0160a8 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Tue, 18 Dec 2018 13:32:02 +1100 Subject: [PATCH] webrtcbin: only change the receive state after setting the dtls-client Doing so before will cause SSL errors with fast-start implementations like Chrome or if media data arrives before an answer. --- ext/webrtc/gstwebrtcbin.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/ext/webrtc/gstwebrtcbin.c b/ext/webrtc/gstwebrtcbin.c index 0a967abe55..9f8ac670ca 100644 --- a/ext/webrtc/gstwebrtcbin.c +++ b/ext/webrtc/gstwebrtcbin.c @@ -3107,6 +3107,8 @@ _update_transceiver_from_sdp_media (GstWebRTCBin * webrtc, } if (new_dir != prev_dir) { + ReceiveState receive_state = 0; + GST_TRACE_OBJECT (webrtc, "transceiver direction change"); if (new_dir == GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_SENDONLY || @@ -3163,17 +3165,22 @@ _update_transceiver_from_sdp_media (GstWebRTCBin * webrtc, _add_pad_to_list (webrtc, pad); } - transport_receive_bin_set_receive_state (stream->receive_bin, - RECEIVE_STATE_PASS); + receive_state = RECEIVE_STATE_PASS; } else if (!bundled) { - transport_receive_bin_set_receive_state (stream->receive_bin, - RECEIVE_STATE_DROP); + receive_state = RECEIVE_STATE_DROP; } if (!bundled || bundle_idx == media_idx) g_object_set (stream, "dtls-client", new_setup == GST_WEBRTC_DTLS_SETUP_ACTIVE, NULL); + /* Must be after setting the "dtls-client" so that data is not pushed into + * the dtlssrtp elements before the ssl direction has been set which will + * throw SSL errors */ + if (receive_state > 0) + transport_receive_bin_set_receive_state (stream->receive_bin, + receive_state); + rtp_trans->mline = media_idx; rtp_trans->current_direction = new_dir; }