summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorMatthew Waters <matthew@centricular.com>2021-03-01 20:53:53 +1100
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>2021-03-09 02:22:35 +0000
commit2bed22077194d48b7bc5f284c5d97a7ea1236274 (patch)
tree0fbb0554f62ebfe906577832ca6ab871868e3566 /ext
parent4ccad5336fc7e10dc4a634940b98a4cbe3c8242d (diff)
downloadgstreamer-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')
-rw-r--r--ext/webrtc/gstwebrtcbin.c22
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;