summaryrefslogtreecommitdiff
path: root/ext/webrtc
diff options
context:
space:
mode:
Diffstat (limited to 'ext/webrtc')
-rw-r--r--ext/webrtc/transportreceivebin.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/ext/webrtc/transportreceivebin.c b/ext/webrtc/transportreceivebin.c
index 786b0c2ba..6f826030b 100644
--- a/ext/webrtc/transportreceivebin.c
+++ b/ext/webrtc/transportreceivebin.c
@@ -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,11 +167,17 @@ 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);
}