diff options
author | Matthew Waters <matthew@centricular.com> | 2021-03-01 20:53:53 +1100 |
---|---|---|
committer | GStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2021-03-09 02:22:35 +0000 |
commit | 2bed22077194d48b7bc5f284c5d97a7ea1236274 (patch) | |
tree | 0fbb0554f62ebfe906577832ca6ab871868e3566 /ext/webrtc | |
parent | 4ccad5336fc7e10dc4a634940b98a4cbe3c8242d (diff) | |
download | gstreamer-plugins-bad-2bed22077194d48b7bc5f284c5d97a7ea1236274.tar.gz |
webrtc: don't generate duplicate rtx payloads when bundle-policy is set
It was possible to generate a SDP that had an RTX payload type
that matched one of the media payload types when providing caps via
codec_preferences without any sink pads.
Fixes
m=video 9 UDP/TLS/RTP/SAVPF 96
...
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 nack pli
a=fmtp:96 apt=96
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2046>
Diffstat (limited to 'ext/webrtc')
-rw-r--r-- | ext/webrtc/gstwebrtcbin.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/ext/webrtc/gstwebrtcbin.c b/ext/webrtc/gstwebrtcbin.c index cf992719e..aecdbfa9c 100644 --- a/ext/webrtc/gstwebrtcbin.c +++ b/ext/webrtc/gstwebrtcbin.c @@ -2641,6 +2641,7 @@ gather_pad_pt (GstWebRTCBinPad * pad, GArray * reserved_pts) gint pt; if (gst_structure_get_int (s, "payload", &pt)) { + GST_TRACE_OBJECT (pad, "have reserved pt %u from received caps", pt); g_array_append_val (reserved_pts, pt); } } @@ -2651,11 +2652,32 @@ gather_reserved_pts (GstWebRTCBin * webrtc) { GstElement *element = GST_ELEMENT (webrtc); GArray *reserved_pts = g_array_new (FALSE, FALSE, sizeof (guint)); + guint i; GST_OBJECT_LOCK (webrtc); g_list_foreach (element->sinkpads, (GFunc) gather_pad_pt, reserved_pts); g_list_foreach (webrtc->priv->pending_pads, (GFunc) gather_pad_pt, reserved_pts); + + for (i = 0; i < webrtc->priv->transceivers->len; i++) { + GstWebRTCRTPTransceiver *trans; + + trans = g_ptr_array_index (webrtc->priv->transceivers, i); + if (trans->codec_preferences) { + guint j, n; + gint pt; + + n = gst_caps_get_size (trans->codec_preferences); + for (j = 0; j < n; j++) { + GstStructure *s = gst_caps_get_structure (trans->codec_preferences, j); + if (gst_structure_get_int (s, "payload", &pt)) { + GST_TRACE_OBJECT (trans, "have reserved pt %u from codec preferences", + pt); + g_array_append_val (reserved_pts, pt); + } + } + } + } GST_OBJECT_UNLOCK (webrtc); return reserved_pts; |