webrtc receivebin: Don't unblock pad until sender is unblocked

As ther OpenSSL session is created when the receiver goes into
playing, we have to wait for the ICE session to be connected before we
can start delivering packets to the DTLS element.

Fixes #1599

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2363>
This commit is contained in:
Olivier Crête 2021-06-26 14:25:39 -04:00
parent 0e559fc2f3
commit a07e52528c

View file

@ -112,13 +112,29 @@ void
transport_receive_bin_set_receive_state (TransportReceiveBin * receive,
ReceiveState state)
{
GstWebRTCICEConnectionState icestate;
g_mutex_lock (&receive->pad_block_lock);
if (receive->receive_state != state) {
GST_DEBUG_OBJECT (receive, "changing receive state to %s",
GST_DEBUG_OBJECT (receive, "Requested change of receive state to %s",
_receive_state_to_string (state));
}
receive->receive_state = state;
g_object_get (receive->stream->transport->transport, "state", &icestate,
NULL);
if (state == RECEIVE_STATE_PASS) {
if (icestate == GST_WEBRTC_ICE_CONNECTION_STATE_CONNECTED ||
icestate == GST_WEBRTC_ICE_CONNECTION_STATE_COMPLETED) {
GST_LOG_OBJECT (receive, "Unblocking nicesrc because ICE is connected.");
} else {
GST_LOG_OBJECT (receive, "Can't unblock nicesrc yet because ICE "
"is not connected, it is %d", icestate);
state = RECEIVE_STATE_BLOCK;
}
}
if (state == RECEIVE_STATE_PASS) {
if (receive->rtp_block)
_free_pad_block (receive->rtp_block);
@ -151,10 +167,16 @@ transport_receive_bin_set_receive_state (TransportReceiveBin * receive,
}
}
}
receive->receive_state = state;
g_mutex_unlock (&receive->pad_block_lock);
}
static void
_on_notify_ice_connection_state (GstWebRTCICETransport * transport,
GParamSpec * pspec, TransportReceiveBin * receive)
{
transport_receive_bin_set_receive_state (receive, receive->receive_state);
}
static void
transport_receive_bin_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
@ -331,6 +353,9 @@ transport_receive_bin_constructed (GObject * object)
gst_element_add_pad (GST_ELEMENT (receive), ghost);
gst_object_unref (pad);
g_signal_connect_after (receive->stream->transport->transport,
"notify::state", G_CALLBACK (_on_notify_ice_connection_state), receive);
G_OBJECT_CLASS (parent_class)->constructed (object);
}