summaryrefslogtreecommitdiff
path: root/ext/webrtc/gstwebrtcbin.c
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.com>2021-04-30 17:04:12 -0400
committerOlivier CrĂȘte <olivier.crete@collabora.com>2021-05-13 15:05:00 -0400
commit48f4498801595ea5d2e3fac4fa4e29521461ff0c (patch)
treea370e19df445e5b79759d6290968b0443844839b /ext/webrtc/gstwebrtcbin.c
parent70befc0b21dfd94f76d8d401df4dd6e5595550cf (diff)
downloadgstreamer-plugins-bad-48f4498801595ea5d2e3fac4fa4e29521461ff0c.tar.gz
webrtcbin: Intersect codec preferences with caps from pads
When creating an offer or an answer, also take into account the caps on the pads as well as the codec preferences when both are set. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2183>
Diffstat (limited to 'ext/webrtc/gstwebrtcbin.c')
-rw-r--r--ext/webrtc/gstwebrtcbin.c38
1 files changed, 29 insertions, 9 deletions
diff --git a/ext/webrtc/gstwebrtcbin.c b/ext/webrtc/gstwebrtcbin.c
index 0994d3543..fe65041fe 100644
--- a/ext/webrtc/gstwebrtcbin.c
+++ b/ext/webrtc/gstwebrtcbin.c
@@ -1580,6 +1580,7 @@ _find_codec_preferences (GstWebRTCBin * webrtc,
{
WebRTCTransceiver *trans = (WebRTCTransceiver *) rtp_trans;
GstCaps *ret = NULL;
+ GstCaps *codec_preferences = NULL;
GstWebRTCBinPad *pad = NULL;
GST_LOG_OBJECT (webrtc, "retrieving codec preferences from %" GST_PTR_FORMAT,
trans);
@@ -1589,23 +1590,18 @@ _find_codec_preferences (GstWebRTCBin * webrtc,
if (rtp_trans->codec_preferences) {
GST_LOG_OBJECT (webrtc, "Using codec preferences: %" GST_PTR_FORMAT,
rtp_trans->codec_preferences);
- ret = gst_caps_ref (rtp_trans->codec_preferences);
+ codec_preferences = gst_caps_ref (rtp_trans->codec_preferences);
}
GST_OBJECT_UNLOCK (rtp_trans);
- if (ret)
- return ret;
+ pad = _find_pad_for_transceiver (webrtc, direction, rtp_trans);
}
/* try to find a pad */
- if (!trans
- || !(pad = _find_pad_for_transceiver (webrtc, direction, rtp_trans)))
+ if (!pad)
pad = _find_pad_for_mline (webrtc, direction, media_idx);
- if (!pad) {
- if (trans && trans->last_configured_caps)
- ret = gst_caps_ref (trans->last_configured_caps);
- } else {
+ if (pad) {
GstCaps *caps = NULL;
if (pad->received_caps) {
@@ -1635,6 +1631,22 @@ _find_codec_preferences (GstWebRTCBin * webrtc,
}
gst_caps_unref (filter);
}
+
+ if (caps && codec_preferences) {
+ GstCaps *intersection;
+
+ intersection = gst_caps_intersect_full (codec_preferences, caps,
+ GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (caps);
+
+ if (gst_caps_is_empty (intersection)) {
+ caps = NULL;
+ gst_caps_unref (intersection);
+ } else {
+ caps = intersection;
+ }
+ }
+
if (caps) {
if (trans)
gst_caps_replace (&trans->last_configured_caps, caps);
@@ -1643,8 +1655,16 @@ _find_codec_preferences (GstWebRTCBin * webrtc,
}
gst_object_unref (pad);
+ } else {
+ if (codec_preferences)
+ ret = gst_caps_ref (codec_preferences);
+ else if (trans && trans->last_configured_caps)
+ ret = gst_caps_ref (trans->last_configured_caps);
}
+ if (codec_preferences)
+ gst_caps_unref (codec_preferences);
+
if (!ret)
GST_DEBUG_OBJECT (trans, "Could not find caps for mline %u", media_idx);