mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-28 19:20:35 +00:00
webrtc: Fix a couple of renegotiation races
When negotiating the SDP we should only connect the streams that are actually mentioned in the SDP. All other streams are not relevant at this time and would likely be part of a future SDP update. Fixes a couple of the renegotiation webrtc unit tests. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1240>
This commit is contained in:
parent
7aa58954c1
commit
46176fbcc7
1 changed files with 58 additions and 9 deletions
|
@ -3811,7 +3811,22 @@ _update_transceiver_from_sdp_media (GstWebRTCBin * webrtc,
|
|||
}
|
||||
|
||||
if (new_dir != prev_dir) {
|
||||
GST_DEBUG_OBJECT (webrtc, "transceiver direction change");
|
||||
gchar *prev_dir_s, *new_dir_s;
|
||||
|
||||
prev_dir_s =
|
||||
_enum_value_to_string (GST_TYPE_WEBRTC_RTP_TRANSCEIVER_DIRECTION,
|
||||
prev_dir);
|
||||
new_dir_s =
|
||||
_enum_value_to_string (GST_TYPE_WEBRTC_RTP_TRANSCEIVER_DIRECTION,
|
||||
new_dir);
|
||||
|
||||
GST_DEBUG_OBJECT (webrtc, "transceiver %" GST_PTR_FORMAT
|
||||
" direction change from %s to %s", rtp_trans, prev_dir_s, new_dir_s);
|
||||
|
||||
g_free (prev_dir_s);
|
||||
prev_dir_s = NULL;
|
||||
g_free (new_dir_s);
|
||||
new_dir_s = NULL;
|
||||
|
||||
if (new_dir == GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_INACTIVE) {
|
||||
GstWebRTCBinPad *pad;
|
||||
|
@ -3940,7 +3955,7 @@ _generate_data_channel_id (GstWebRTCBin * webrtc)
|
|||
}
|
||||
|
||||
/* client must generate even ids, server must generate odd ids */
|
||||
if (new_id % 2 == ! !is_client)
|
||||
if (new_id % 2 == !!is_client)
|
||||
continue;
|
||||
|
||||
channel = _find_data_channel_for_id (webrtc, new_id);
|
||||
|
@ -4395,24 +4410,55 @@ _set_description_task (GstWebRTCBin * webrtc, struct set_description *sd)
|
|||
/* media modifications */
|
||||
_update_transceivers_from_sdp (webrtc, sd->source, sd->sdp);
|
||||
|
||||
for (tmp = webrtc->priv->pending_sink_transceivers; tmp; tmp = tmp->next) {
|
||||
for (tmp = webrtc->priv->pending_sink_transceivers; tmp;) {
|
||||
GstWebRTCBinPad *pad = GST_WEBRTC_BIN_PAD (tmp->data);
|
||||
GstWebRTCRTPTransceiverDirection new_dir;
|
||||
GList *old = tmp;
|
||||
const GstSDPMedia *media;
|
||||
|
||||
if (!pad->received_caps) {
|
||||
GST_LOG_OBJECT (pad, "has not received any caps yet. Skipping.");
|
||||
tmp = tmp->next;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (pad->mlineindex >= gst_sdp_message_medias_len (sd->sdp->sdp)) {
|
||||
GST_DEBUG_OBJECT (pad, "not mentioned in this description. Skipping");
|
||||
tmp = tmp->next;
|
||||
continue;
|
||||
}
|
||||
|
||||
media = gst_sdp_message_get_media (sd->sdp->sdp, pad->mlineindex);
|
||||
/* skip rejected media */
|
||||
/* FIXME: arrange for an appropriate flow return */
|
||||
if (gst_sdp_media_get_port (media) == 0)
|
||||
if (gst_sdp_media_get_port (media) == 0) {
|
||||
/* FIXME: arrange for an appropriate flow return */
|
||||
GST_FIXME_OBJECT (pad, "Media has been rejected. Need to arrange for "
|
||||
"a more correct flow return.");
|
||||
tmp = tmp->next;
|
||||
continue;
|
||||
}
|
||||
|
||||
new_dir = pad->trans->direction;
|
||||
if (new_dir != GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_SENDONLY &&
|
||||
new_dir != GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_SENDRECV) {
|
||||
GST_LOG_OBJECT (pad, "transceiver %" GST_PTR_FORMAT " is not sending "
|
||||
"data at the moment. Not connecting input stream yet", pad->trans);
|
||||
tmp = tmp->next;
|
||||
continue;
|
||||
}
|
||||
|
||||
GST_LOG_OBJECT (pad, "Connecting input stream to rtpbin with "
|
||||
"transceiver %" GST_PTR_FORMAT " and caps %" GST_PTR_FORMAT,
|
||||
pad->trans, pad->received_caps);
|
||||
_connect_input_stream (webrtc, pad);
|
||||
gst_pad_remove_probe (GST_PAD (pad), pad->block_id);
|
||||
pad->block_id = 0;
|
||||
}
|
||||
|
||||
g_list_free_full (webrtc->priv->pending_sink_transceivers,
|
||||
(GDestroyNotify) gst_object_unref);
|
||||
webrtc->priv->pending_sink_transceivers = NULL;
|
||||
tmp = tmp->next;
|
||||
gst_object_unref (old->data);
|
||||
webrtc->priv->pending_sink_transceivers =
|
||||
g_list_delete_link (webrtc->priv->pending_sink_transceivers, old);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < gst_sdp_message_medias_len (sd->sdp->sdp); i++) {
|
||||
|
@ -5641,6 +5687,9 @@ gst_webrtc_bin_request_new_pad (GstElement * element, GstPadTemplate * templ,
|
|||
GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_SENDRECV, serial));
|
||||
GST_LOG_OBJECT (webrtc, "Created new transceiver %" GST_PTR_FORMAT
|
||||
" for mline %u", trans, serial);
|
||||
} else {
|
||||
GST_LOG_OBJECT (webrtc, "Using existing transceiver %" GST_PTR_FORMAT
|
||||
" for mline %u", trans, serial);
|
||||
}
|
||||
pad->trans = gst_object_ref (trans);
|
||||
|
||||
|
|
Loading…
Reference in a new issue