From 91317aacaff67d050b411597bbbc83594a5bf2f8 Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Tue, 13 Feb 2024 18:57:05 +0100 Subject: [PATCH] webrtcbin, rtpbin: check before setting properties on jitterbuffer In rtpbin we already systematically check for all property names except latency, correct that. In webrtcbin we need to check before trying to use the do-retransmission property. This is useful for the case where an element like identity gets passed to rtpbin's request-jitterbuffer property, when the application wants to use webrtcbin in an SFU situation, with no reordering and no added latency Part-of: --- .../gst-plugins-bad/ext/webrtc/gstwebrtcbin.c | 23 ++++++++++++++----- .../gst/rtpmanager/gstrtpbin.c | 4 ++-- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/subprojects/gst-plugins-bad/ext/webrtc/gstwebrtcbin.c b/subprojects/gst-plugins-bad/ext/webrtc/gstwebrtcbin.c index 0d72d581d8..a173b87b5e 100644 --- a/subprojects/gst-plugins-bad/ext/webrtc/gstwebrtcbin.c +++ b/subprojects/gst-plugins-bad/ext/webrtc/gstwebrtcbin.c @@ -7866,6 +7866,7 @@ jitter_buffer_set_retransmission (SsrcMapItem * item, { GstWebRTCRTPTransceiver *trans; gboolean do_nack; + GObjectClass *jb_class; if (item->media_idx == -1) return TRUE; @@ -7876,13 +7877,23 @@ jitter_buffer_set_retransmission (SsrcMapItem * item, return TRUE; } + jb_class = G_OBJECT_GET_CLASS (G_OBJECT (data->jitterbuffer)); do_nack = WEBRTC_TRANSCEIVER (trans)->do_nack; - /* We don't set do-retransmission on rtpbin as we want per-session control */ - GST_LOG_OBJECT (data->webrtc, "setting do-nack=%s for transceiver %" - GST_PTR_FORMAT " with transport %" GST_PTR_FORMAT - " rtp session %u ssrc %u", do_nack ? "true" : "false", trans, - data->stream, data->stream->session_id, data->ssrc); - g_object_set (data->jitterbuffer, "do-retransmission", do_nack, NULL); + if (g_object_class_find_property (jb_class, "do-retransmission")) { + /* We don't set do-retransmission on rtpbin as we want per-session control */ + GST_LOG_OBJECT (data->webrtc, "setting do-nack=%s for transceiver %" + GST_PTR_FORMAT " with transport %" GST_PTR_FORMAT + " rtp session %u ssrc %u", do_nack ? "true" : "false", trans, + data->stream, data->stream->session_id, data->ssrc); + g_object_set (data->jitterbuffer, "do-retransmission", do_nack, NULL); + } else if (do_nack) { + GST_WARNING_OBJECT (data->webrtc, "Not setting do-nack for transceiver %" + GST_PTR_FORMAT " with transport %" GST_PTR_FORMAT + " rtp session %u ssrc %u" + " as its jitterbuffer does not have a do-retransmission property", + trans, data->stream, data->stream->session_id, data->ssrc); + } + g_weak_ref_set (&item->rtpjitterbuffer, data->jitterbuffer); diff --git a/subprojects/gst-plugins-good/gst/rtpmanager/gstrtpbin.c b/subprojects/gst-plugins-good/gst/rtpmanager/gstrtpbin.c index d5adf0f64a..29c6f47250 100644 --- a/subprojects/gst-plugins-good/gst/rtpmanager/gstrtpbin.c +++ b/subprojects/gst-plugins-good/gst/rtpmanager/gstrtpbin.c @@ -1967,8 +1967,8 @@ create_stream (GstRtpBinSession * session, guint32 ssrc) g_object_set_data (G_OBJECT (buffer), "GstRTPBin.stream", stream); /* configure latency and packet lost */ - g_object_set (buffer, "latency", rtpbin->latency_ms, NULL); - + if (g_object_class_find_property (jb_class, "latency")) + g_object_set (buffer, "latency", rtpbin->latency_ms, NULL); if (g_object_class_find_property (jb_class, "drop-on-latency")) g_object_set (buffer, "drop-on-latency", rtpbin->drop_on_latency, NULL); if (g_object_class_find_property (jb_class, "do-lost"))