summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.com>2020-07-08 19:13:33 -0400
committerOlivier CrĂȘte <olivier.crete@collabora.com>2020-10-30 16:23:10 -0400
commit7be09a5f2280e2f639c1d6554a7591245feb7344 (patch)
treee8d428461b1858b8154e3753fc26afe50e31a044 /ext
parente172ca5be11d8e8c1b35b218f1018c6c8fe5e769 (diff)
downloadgstreamer-plugins-bad-7be09a5f2280e2f639c1d6554a7591245feb7344.tar.gz
webrtc: Save the media kind in the transceiver
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1707>
Diffstat (limited to 'ext')
-rw-r--r--ext/webrtc/gstwebrtcbin.c69
1 files changed, 68 insertions, 1 deletions
diff --git a/ext/webrtc/gstwebrtcbin.c b/ext/webrtc/gstwebrtcbin.c
index a62c444d3..dbe919e53 100644
--- a/ext/webrtc/gstwebrtcbin.c
+++ b/ext/webrtc/gstwebrtcbin.c
@@ -2858,6 +2858,47 @@ _media_add_rtx (GstSDPMedia * media, WebRTCTransceiver * trans,
}
}
+static GstWebRTCKind
+_kind_from_caps (const GstCaps * caps)
+{
+ GstStructure *s;
+ const gchar *media;
+
+ if (gst_caps_get_size (caps) == 0)
+ return GST_WEBRTC_KIND_UNKNOWN;
+
+ s = gst_caps_get_structure (caps, 0);
+
+ media = gst_structure_get_string (s, "media");
+ if (media == NULL)
+ return GST_WEBRTC_KIND_UNKNOWN;
+
+ if (!g_strcmp0 (media, "audio"))
+ return GST_WEBRTC_KIND_AUDIO;
+
+ if (!g_strcmp0 (media, "video"))
+ return GST_WEBRTC_KIND_VIDEO;
+
+ return GST_WEBRTC_KIND_UNKNOWN;
+}
+
+static gboolean
+_update_transceiver_kind_from_caps (GstWebRTCRTPTransceiver * trans,
+ const GstCaps * caps)
+{
+ GstWebRTCKind kind = _kind_from_caps (caps);
+
+ if (trans->kind == kind)
+ return TRUE;
+
+ if (trans->kind == GST_WEBRTC_KIND_UNKNOWN) {
+ trans->kind = kind;
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
static void
_get_rtx_target_pt_and_ssrc_from_caps (GstCaps * answer_caps, gint * target_pt,
guint * target_ssrc)
@@ -3168,6 +3209,10 @@ _create_answer_task (GstWebRTCBin * webrtc, const GstStructure * options,
} else {
trans = WEBRTC_TRANSCEIVER (rtp_trans);
}
+ if (!_update_transceiver_kind_from_caps (rtp_trans, answer_caps))
+ GST_WARNING_OBJECT (webrtc,
+ "Trying to change transceiver %d kind from %d to %d",
+ rtp_trans->mline, rtp_trans->kind, _kind_from_caps (answer_caps));
if (!trans->do_nack) {
answer_caps = gst_caps_make_writable (answer_caps);
@@ -3787,6 +3832,20 @@ _update_transceiver_from_sdp_media (GstWebRTCBin * webrtc,
rtp_trans->mline = media_idx;
+ if (!g_strcmp0 (gst_sdp_media_get_media (media), "audio")) {
+ if (rtp_trans->kind == GST_WEBRTC_KIND_VIDEO)
+ GST_FIXME_OBJECT (webrtc,
+ "Updating video transceiver to audio, which isn't fully supported.");
+ rtp_trans->kind = GST_WEBRTC_KIND_AUDIO;
+ }
+
+ if (!g_strcmp0 (gst_sdp_media_get_media (media), "video")) {
+ if (rtp_trans->kind == GST_WEBRTC_KIND_AUDIO)
+ GST_FIXME_OBJECT (webrtc,
+ "Updating audio transceiver to video, which isn't fully supported.");
+ rtp_trans->kind = GST_WEBRTC_KIND_VIDEO;
+ }
+
for (i = 0; i < gst_sdp_media_attributes_len (media); i++) {
const GstSDPAttribute *attr = gst_sdp_media_get_attribute (media, i);
@@ -5048,8 +5107,10 @@ gst_webrtc_bin_add_transceiver (GstWebRTCBin * webrtc,
"Created new unassociated transceiver %" GST_PTR_FORMAT, trans);
rtp_trans = GST_WEBRTC_RTP_TRANSCEIVER (trans);
- if (caps)
+ if (caps) {
rtp_trans->codec_preferences = gst_caps_ref (caps);
+ _update_transceiver_kind_from_caps (rtp_trans, caps);
+ }
return gst_object_ref (trans);
}
@@ -5900,6 +5961,12 @@ gst_webrtc_bin_request_new_pad (GstElement * element, GstPadTemplate * templ,
}
pad->trans = gst_object_ref (trans);
+ if (caps && name && !_update_transceiver_kind_from_caps (trans, caps))
+ GST_WARNING_OBJECT (webrtc,
+ "Trying to create pad %s with caps %" GST_PTR_FORMAT
+ " but transceiver %d already exists with a different"
+ " media type", name, caps, serial);
+
pad->block_id = gst_pad_add_probe (GST_PAD (pad), GST_PAD_PROBE_TYPE_BLOCK |
GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_BUFFER_LIST,
(GstPadProbeCallback) sink_pad_block, NULL, NULL);