diff options
author | Olivier CrĂȘte <olivier.crete@collabora.com> | 2021-06-26 14:31:01 -0400 |
---|---|---|
committer | Olivier CrĂȘte <olivier.crete@collabora.com> | 2021-06-29 00:42:20 -0400 |
commit | 543fcb93a45d967cf567cb39f1390f4eb697ed8d (patch) | |
tree | 07e502be110a7eb0d2c6fce7d2a1d17fca74be57 /ext | |
parent | a07e52528c7e56113e980d34f0639dbee86f4dd0 (diff) | |
download | gstreamer-plugins-bad-543fcb93a45d967cf567cb39f1390f4eb697ed8d.tar.gz |
webrtc receivebin: Only set queue to leaky when the pad is blocked
When the pad is no longer blocked, remove the leakyness to make sure
everything gets into the jitterbuffer.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2363>
Diffstat (limited to 'ext')
-rw-r--r-- | ext/webrtc/transportreceivebin.c | 19 | ||||
-rw-r--r-- | ext/webrtc/transportreceivebin.h | 1 |
2 files changed, 13 insertions, 7 deletions
diff --git a/ext/webrtc/transportreceivebin.c b/ext/webrtc/transportreceivebin.c index 6f826030b..b1e3da061 100644 --- a/ext/webrtc/transportreceivebin.c +++ b/ext/webrtc/transportreceivebin.c @@ -136,6 +136,8 @@ transport_receive_bin_set_receive_state (TransportReceiveBin * receive, } if (state == RECEIVE_STATE_PASS) { + g_object_set (receive->queue, "leaky", 0, NULL); + if (receive->rtp_block) _free_pad_block (receive->rtp_block); receive->rtp_block = NULL; @@ -145,6 +147,7 @@ transport_receive_bin_set_receive_state (TransportReceiveBin * receive, receive->rtcp_block = NULL; } else { g_assert (state == RECEIVE_STATE_BLOCK); + g_object_set (receive->queue, "leaky", 2, NULL); if (receive->rtp_block == NULL) { GstWebRTCDTLSTransport *transport; GstElement *dtlssrtpdec; @@ -297,7 +300,7 @@ transport_receive_bin_constructed (GObject * object) TransportReceiveBin *receive = TRANSPORT_RECEIVE_BIN (object); GstWebRTCDTLSTransport *transport; GstPad *ghost, *pad; - GstElement *capsfilter, *queue; + GstElement *capsfilter; GstCaps *caps; g_return_if_fail (receive->stream); @@ -311,18 +314,20 @@ transport_receive_bin_constructed (GObject * object) g_object_set (capsfilter, "caps", caps, NULL); gst_caps_unref (caps); - queue = gst_element_factory_make ("queue", NULL); + receive->queue = gst_element_factory_make ("queue", NULL); /* FIXME: make this configurable? */ - g_object_set (queue, "leaky", 2, "max-size-time", (guint64) 0, + g_object_set (receive->queue, "leaky", 2, "max-size-time", (guint64) 0, "max-size-buffers", 0, "max-size-bytes", 5 * 1024 * 1024, NULL); - g_signal_connect (queue, "overrun", G_CALLBACK (rtp_queue_overrun), receive); + g_signal_connect (receive->queue, "overrun", G_CALLBACK (rtp_queue_overrun), + receive); - gst_bin_add (GST_BIN (receive), GST_ELEMENT (queue)); + gst_bin_add (GST_BIN (receive), GST_ELEMENT (receive->queue)); gst_bin_add (GST_BIN (receive), GST_ELEMENT (capsfilter)); - if (!gst_element_link_pads (capsfilter, "src", queue, "sink")) + if (!gst_element_link_pads (capsfilter, "src", receive->queue, "sink")) g_warn_if_reached (); - if (!gst_element_link_pads (queue, "src", transport->dtlssrtpdec, "sink")) + if (!gst_element_link_pads (receive->queue, "src", transport->dtlssrtpdec, + "sink")) g_warn_if_reached (); gst_bin_add (GST_BIN (receive), GST_ELEMENT (transport->transport->src)); diff --git a/ext/webrtc/transportreceivebin.h b/ext/webrtc/transportreceivebin.h index 50449e327..905628c64 100644 --- a/ext/webrtc/transportreceivebin.h +++ b/ext/webrtc/transportreceivebin.h @@ -52,6 +52,7 @@ struct _TransportReceiveBin struct pad_block *rtcp_block; GMutex pad_block_lock; ReceiveState receive_state; + GstElement *queue; }; struct _TransportReceiveBinClass |