From 372709400fa50af653d80d734214fe33c34b2bae Mon Sep 17 00:00:00 2001 From: Jochen Henneberg Date: Tue, 5 Sep 2023 08:39:45 +0200 Subject: [PATCH] rtpbasedepayload: Only aggregate RTP header extensions if in use Right now we split the RTP header from the current buffer into a new buffer and aggregate those buffers for later processing if the depayloader creates an output buffer. This is cumbersome as it happens even if none of the incoming RTP buffers carries RTP header extensions at all just because header aggregation has been enabled in the depayloader class. This commit will start aggregation only in case that there really are RTP header extensions available on an incoming RTP buffer. The check is trivial and cheap. Once activated we keep aggregation active for all buffers. The active state is reset on state change READY_TO_PAUSE. Part-of: --- .../gst-libs/gst/rtp/gstrtpbasedepayload.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/subprojects/gst-plugins-base/gst-libs/gst/rtp/gstrtpbasedepayload.c b/subprojects/gst-plugins-base/gst-libs/gst/rtp/gstrtpbasedepayload.c index c788898ef2..ddec20e184 100644 --- a/subprojects/gst-plugins-base/gst-libs/gst/rtp/gstrtpbasedepayload.c +++ b/subprojects/gst-plugins-base/gst-libs/gst/rtp/gstrtpbasedepayload.c @@ -110,6 +110,7 @@ struct _GstRTPBaseDepayloadPrivate /* maintain buffer list for header extensions read() */ gboolean hdrext_aggregate; + gboolean hdrext_seen; GstBufferList *hdrext_buffers; GstBuffer *hdrext_delayed; GstBuffer *hdrext_outbuf; @@ -449,6 +450,7 @@ gst_rtp_base_depayload_init (GstRTPBaseDepayload * filter, priv->max_reorder = DEFAULT_MAX_REORDER; priv->auto_hdr_ext = DEFAULT_AUTO_HEADER_EXTENSION; priv->hdrext_aggregate = FALSE; + priv->hdrext_seen = FALSE; gst_segment_init (&filter->segment, GST_FORMAT_UNDEFINED); @@ -859,8 +861,14 @@ gst_rtp_base_depayload_handle_buffer (GstRTPBaseDepayload * filter, g_assert_null (priv->hdrext_delayed); } - /* update RTP buffer cache for header extensions */ - if (priv->hdrext_aggregate) { + /* update RTP buffer cache for header extensions if any */ + if (priv->hdrext_aggregate && + !priv->hdrext_seen && gst_rtp_buffer_get_extension (&rtp)) { + GST_INFO_OBJECT (filter, "Activate RTP header ext aggregation"); + priv->hdrext_seen = priv->hdrext_aggregate; + } + + if (priv->hdrext_seen) { GstBuffer *b = gst_buffer_new (); /* make a copy of the buffer that only contains the RTP header with the extensions to not waste too much memory */ @@ -1685,6 +1693,10 @@ gst_rtp_base_depayload_change_state (GstElement * element, priv->negotiated = FALSE; priv->discont = FALSE; priv->segment_seqnum = GST_SEQNUM_INVALID; + priv->hdrext_seen = FALSE; + if (priv->hdrext_delayed) + gst_buffer_unref (priv->hdrext_delayed); + gst_rtp_base_depayload_reset_hdrext_buffers (filter); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break;