mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
webrtcbin: use the latest self-generated SDP as the basis for renegotiations
Fixes multiple errors when a webrtcbin renegotiation can switch between the offerer and the answerer.
This commit is contained in:
parent
f18fab0eb1
commit
cef839533e
4 changed files with 49 additions and 4 deletions
|
@ -2040,7 +2040,7 @@ sdp_media_from_transceiver (GstWebRTCBin * webrtc, GstSDPMedia * media,
|
||||||
* dtls fingerprints
|
* dtls fingerprints
|
||||||
* multiple dtls fingerprints https://tools.ietf.org/html/draft-ietf-mmusic-4572-update-05
|
* multiple dtls fingerprints https://tools.ietf.org/html/draft-ietf-mmusic-4572-update-05
|
||||||
*/
|
*/
|
||||||
GstSDPMessage *last_offer = _get_latest_offer (webrtc);
|
GstSDPMessage *last_offer = _get_latest_self_generated_sdp (webrtc);
|
||||||
gchar *direction, *sdp_mid, *ufrag, *pwd;
|
gchar *direction, *sdp_mid, *ufrag, *pwd;
|
||||||
gboolean bundle_only;
|
gboolean bundle_only;
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
|
@ -2239,7 +2239,7 @@ _add_data_channel_offer (GstWebRTCBin * webrtc, GstSDPMessage * msg,
|
||||||
GstSDPMedia * media, GString * bundled_mids, guint bundle_idx,
|
GstSDPMedia * media, GString * bundled_mids, guint bundle_idx,
|
||||||
gchar * bundle_ufrag, gchar * bundle_pwd)
|
gchar * bundle_ufrag, gchar * bundle_pwd)
|
||||||
{
|
{
|
||||||
GstSDPMessage *last_offer = _get_latest_offer (webrtc);
|
GstSDPMessage *last_offer = _get_latest_self_generated_sdp (webrtc);
|
||||||
gchar *ufrag, *pwd, *sdp_mid;
|
gchar *ufrag, *pwd, *sdp_mid;
|
||||||
gboolean bundle_only = bundled_mids
|
gboolean bundle_only = bundled_mids
|
||||||
&& webrtc->bundle_policy == GST_WEBRTC_BUNDLE_POLICY_MAX_BUNDLE
|
&& webrtc->bundle_policy == GST_WEBRTC_BUNDLE_POLICY_MAX_BUNDLE
|
||||||
|
@ -2330,7 +2330,7 @@ _create_offer_task (GstWebRTCBin * webrtc, const GstStructure * options)
|
||||||
gchar *bundle_ufrag = NULL;
|
gchar *bundle_ufrag = NULL;
|
||||||
gchar *bundle_pwd = NULL;
|
gchar *bundle_pwd = NULL;
|
||||||
GArray *reserved_pts = NULL;
|
GArray *reserved_pts = NULL;
|
||||||
GstSDPMessage *last_offer = _get_latest_offer (webrtc);
|
GstSDPMessage *last_offer = _get_latest_self_generated_sdp (webrtc);
|
||||||
GList *seen_transceivers = NULL;
|
GList *seen_transceivers = NULL;
|
||||||
guint media_idx = 0;
|
guint media_idx = 0;
|
||||||
int i;
|
int i;
|
||||||
|
@ -2524,6 +2524,18 @@ _create_offer_task (GstWebRTCBin * webrtc, const GstStructure * options)
|
||||||
|
|
||||||
g_list_free (seen_transceivers);
|
g_list_free (seen_transceivers);
|
||||||
|
|
||||||
|
if (webrtc->priv->last_generated_answer)
|
||||||
|
gst_webrtc_session_description_free (webrtc->priv->last_generated_answer);
|
||||||
|
webrtc->priv->last_generated_answer = NULL;
|
||||||
|
if (webrtc->priv->last_generated_offer)
|
||||||
|
gst_webrtc_session_description_free (webrtc->priv->last_generated_offer);
|
||||||
|
{
|
||||||
|
GstSDPMessage *copy;
|
||||||
|
gst_sdp_message_copy (ret, ©);
|
||||||
|
webrtc->priv->last_generated_offer =
|
||||||
|
gst_webrtc_session_description_new (GST_WEBRTC_SDP_TYPE_OFFER, copy);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2650,7 +2662,7 @@ _create_answer_task (GstWebRTCBin * webrtc, const GstStructure * options)
|
||||||
gchar *bundle_ufrag = NULL;
|
gchar *bundle_ufrag = NULL;
|
||||||
gchar *bundle_pwd = NULL;
|
gchar *bundle_pwd = NULL;
|
||||||
GList *seen_transceivers = NULL;
|
GList *seen_transceivers = NULL;
|
||||||
GstSDPMessage *last_answer = _get_latest_answer (webrtc);
|
GstSDPMessage *last_answer = _get_latest_self_generated_sdp (webrtc);
|
||||||
|
|
||||||
if (!webrtc->pending_remote_description) {
|
if (!webrtc->pending_remote_description) {
|
||||||
GST_ERROR_OBJECT (webrtc,
|
GST_ERROR_OBJECT (webrtc,
|
||||||
|
@ -3034,6 +3046,18 @@ out:
|
||||||
|
|
||||||
g_list_free (seen_transceivers);
|
g_list_free (seen_transceivers);
|
||||||
|
|
||||||
|
if (webrtc->priv->last_generated_offer)
|
||||||
|
gst_webrtc_session_description_free (webrtc->priv->last_generated_offer);
|
||||||
|
webrtc->priv->last_generated_offer = NULL;
|
||||||
|
if (webrtc->priv->last_generated_answer)
|
||||||
|
gst_webrtc_session_description_free (webrtc->priv->last_generated_answer);
|
||||||
|
{
|
||||||
|
GstSDPMessage *copy;
|
||||||
|
gst_sdp_message_copy (ret, ©);
|
||||||
|
webrtc->priv->last_generated_answer =
|
||||||
|
gst_webrtc_session_description_new (GST_WEBRTC_SDP_TYPE_ANSWER, copy);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5454,6 +5478,13 @@ gst_webrtc_bin_finalize (GObject * object)
|
||||||
gst_webrtc_session_description_free (webrtc->pending_remote_description);
|
gst_webrtc_session_description_free (webrtc->pending_remote_description);
|
||||||
webrtc->pending_remote_description = NULL;
|
webrtc->pending_remote_description = NULL;
|
||||||
|
|
||||||
|
if (webrtc->priv->last_generated_answer)
|
||||||
|
gst_webrtc_session_description_free (webrtc->priv->last_generated_answer);
|
||||||
|
webrtc->priv->last_generated_answer = NULL;
|
||||||
|
if (webrtc->priv->last_generated_offer)
|
||||||
|
gst_webrtc_session_description_free (webrtc->priv->last_generated_offer);
|
||||||
|
webrtc->priv->last_generated_offer = NULL;
|
||||||
|
|
||||||
if (webrtc->priv->stats)
|
if (webrtc->priv->stats)
|
||||||
gst_structure_free (webrtc->priv->stats);
|
gst_structure_free (webrtc->priv->stats);
|
||||||
webrtc->priv->stats = NULL;
|
webrtc->priv->stats = NULL;
|
||||||
|
|
|
@ -133,6 +133,8 @@ struct _GstWebRTCBinPrivate
|
||||||
guint media_counter;
|
guint media_counter;
|
||||||
/* the number of times create_offer has been called for the version field */
|
/* the number of times create_offer has been called for the version field */
|
||||||
guint offer_count;
|
guint offer_count;
|
||||||
|
GstWebRTCSessionDescription *last_generated_offer;
|
||||||
|
GstWebRTCSessionDescription *last_generated_answer;
|
||||||
|
|
||||||
GstStructure *stats;
|
GstStructure *stats;
|
||||||
};
|
};
|
||||||
|
|
|
@ -97,6 +97,17 @@ _get_latest_sdp (GstWebRTCBin * webrtc)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GstSDPMessage *
|
||||||
|
_get_latest_self_generated_sdp (GstWebRTCBin * webrtc)
|
||||||
|
{
|
||||||
|
if (webrtc->priv->last_generated_answer)
|
||||||
|
return webrtc->priv->last_generated_answer->sdp;
|
||||||
|
if (webrtc->priv->last_generated_offer)
|
||||||
|
return webrtc->priv->last_generated_offer->sdp;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
struct pad_block *
|
struct pad_block *
|
||||||
_create_pad_block (GstElement * element, GstPad * pad, gulong block_id,
|
_create_pad_block (GstElement * element, GstPad * pad, gulong block_id,
|
||||||
gpointer user_data, GDestroyNotify notify)
|
gpointer user_data, GDestroyNotify notify)
|
||||||
|
|
|
@ -49,6 +49,7 @@ GstPadTemplate * _find_pad_template (GstElement * element,
|
||||||
GstSDPMessage * _get_latest_sdp (GstWebRTCBin * webrtc);
|
GstSDPMessage * _get_latest_sdp (GstWebRTCBin * webrtc);
|
||||||
GstSDPMessage * _get_latest_offer (GstWebRTCBin * webrtc);
|
GstSDPMessage * _get_latest_offer (GstWebRTCBin * webrtc);
|
||||||
GstSDPMessage * _get_latest_answer (GstWebRTCBin * webrtc);
|
GstSDPMessage * _get_latest_answer (GstWebRTCBin * webrtc);
|
||||||
|
GstSDPMessage * _get_latest_self_generated_sdp (GstWebRTCBin * webrtc);
|
||||||
|
|
||||||
GstWebRTCICEStream * _find_ice_stream_for_session (GstWebRTCBin * webrtc,
|
GstWebRTCICEStream * _find_ice_stream_for_session (GstWebRTCBin * webrtc,
|
||||||
guint session_id);
|
guint session_id);
|
||||||
|
|
Loading…
Reference in a new issue