webrtc: Protect the pending ICE candidates array

ICE candidates can be added to the array directly from the application
or from the webrtc main loop. Rename it to make it clear that it's
holding remote ICE candidates from the peer, and protect it with a
new mutex
This commit is contained in:
Jan Schmidt 2020-03-10 04:22:57 +11:00
parent 58a4c33a0e
commit 9410ef56b8
2 changed files with 26 additions and 12 deletions

View file

@ -49,6 +49,10 @@
#define PC_COND_BROADCAST(w) (g_cond_broadcast(PC_GET_COND(w)))
#define PC_COND_SIGNAL(w) (g_cond_signal(PC_GET_COND(w)))
#define ICE_GET_LOCK(w) (&w->priv->ice_lock)
#define ICE_LOCK(w) (g_mutex_lock (ICE_GET_LOCK(w)))
#define ICE_UNLOCK(w) (g_mutex_unlock (ICE_GET_LOCK(w)))
/*
* This webrtcbin implements the majority of the W3's peerconnection API and
* implementation guide where possible. Generating offers, answers and setting
@ -3537,9 +3541,11 @@ _add_ice_candidate (GstWebRTCBin * webrtc, IceCandidateItem * item,
IceCandidateItem *new = g_new0 (IceCandidateItem, 1);
new->mlineindex = item->mlineindex;
new->candidate = g_strdup (item->candidate);
g_array_append_val (webrtc->priv->pending_ice_candidates, new);
GST_INFO_OBJECT (webrtc, "Unknown mline %u, deferring", item->mlineindex);
ICE_LOCK (webrtc);
g_array_append_val (webrtc->priv->pending_remote_ice_candidates, new);
ICE_UNLOCK (webrtc);
}
return;
}
@ -4479,14 +4485,16 @@ _set_description_task (GstWebRTCBin * webrtc, struct set_description *sd)
_add_ice_candidates_from_sdp (webrtc, i, media);
}
for (i = 0; i < webrtc->priv->pending_ice_candidates->len; i++) {
ICE_LOCK (webrtc);
for (i = 0; i < webrtc->priv->pending_remote_ice_candidates->len; i++) {
IceCandidateItem *item =
g_array_index (webrtc->priv->pending_ice_candidates,
g_array_index (webrtc->priv->pending_remote_ice_candidates,
IceCandidateItem *, i);
_add_ice_candidate (webrtc, item, TRUE);
}
g_array_set_size (webrtc->priv->pending_ice_candidates, 0);
g_array_set_size (webrtc->priv->pending_remote_ice_candidates, 0);
ICE_UNLOCK (webrtc);
}
/*
@ -4606,7 +4614,9 @@ _add_ice_candidate_task (GstWebRTCBin * webrtc, IceCandidateItem * item)
new->mlineindex = item->mlineindex;
new->candidate = g_strdup (item->candidate);
g_array_append_val (webrtc->priv->pending_ice_candidates, new);
ICE_LOCK (webrtc);
g_array_append_val (webrtc->priv->pending_remote_ice_candidates, new);
ICE_UNLOCK (webrtc);
} else {
_add_ice_candidate (webrtc, item, FALSE);
}
@ -5765,9 +5775,9 @@ gst_webrtc_bin_finalize (GObject * object)
g_array_free (webrtc->priv->pending_data_channels, TRUE);
webrtc->priv->pending_data_channels = NULL;
if (webrtc->priv->pending_ice_candidates)
g_array_free (webrtc->priv->pending_ice_candidates, TRUE);
webrtc->priv->pending_ice_candidates = NULL;
if (webrtc->priv->pending_remote_ice_candidates)
g_array_free (webrtc->priv->pending_remote_ice_candidates, TRUE);
webrtc->priv->pending_remote_ice_candidates = NULL;
if (webrtc->priv->session_mid_map)
g_array_free (webrtc->priv->session_mid_map, TRUE);
@ -5808,6 +5818,7 @@ gst_webrtc_bin_finalize (GObject * object)
gst_structure_free (webrtc->priv->stats);
webrtc->priv->stats = NULL;
g_mutex_clear (ICE_GET_LOCK (webrtc));
g_mutex_clear (PC_GET_LOCK (webrtc));
g_cond_clear (PC_GET_COND (webrtc));
@ -6249,6 +6260,8 @@ gst_webrtc_bin_init (GstWebRTCBin * webrtc)
g_mutex_init (PC_GET_LOCK (webrtc));
g_cond_init (PC_GET_COND (webrtc));
g_mutex_init (ICE_GET_LOCK (webrtc));
webrtc->rtpbin = _create_rtpbin (webrtc);
gst_bin_add (GST_BIN (webrtc), webrtc->rtpbin);
@ -6279,9 +6292,9 @@ gst_webrtc_bin_init (GstWebRTCBin * webrtc)
G_CALLBACK (_on_ice_candidate), webrtc);
webrtc->priv->ice_stream_map =
g_array_new (FALSE, TRUE, sizeof (IceStreamItem));
webrtc->priv->pending_ice_candidates =
webrtc->priv->pending_remote_ice_candidates =
g_array_new (FALSE, TRUE, sizeof (IceCandidateItem *));
g_array_set_clear_func (webrtc->priv->pending_ice_candidates,
g_array_set_clear_func (webrtc->priv->pending_remote_ice_candidates,
(GDestroyNotify) _clear_ice_candidate_item);
/* we start off closed until we move to READY */

View file

@ -109,7 +109,8 @@ struct _GstWebRTCBinPrivate
GstWebRTCICE *ice;
GArray *ice_stream_map;
GArray *pending_ice_candidates;
GMutex ice_lock;
GArray *pending_remote_ice_candidates;
/* peerconnection variables */
gboolean is_closed;