From 77ed44a88af653a4319d8fe2a1aa21562c1982f2 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 21 Aug 2013 12:10:00 +0200 Subject: [PATCH] rtpgstdepay: only push events when they changed Keep track of the STREAM_START and TAG events and only push them when they changed. --- gst/rtp/gstrtpgstdepay.c | 58 +++++++++++++++++++++++++++++++++++++++- gst/rtp/gstrtpgstdepay.h | 3 +++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/gst/rtp/gstrtpgstdepay.c b/gst/rtp/gstrtpgstdepay.c index f1d0f7b757..5803f982c6 100644 --- a/gst/rtp/gstrtpgstdepay.c +++ b/gst/rtp/gstrtpgstdepay.c @@ -131,6 +131,11 @@ gst_rtp_gst_depay_reset (GstRtpGSTDepay * rtpgstdepay, gboolean full) rtpgstdepay->current_CV = 0; for (i = 0; i < 8; i++) store_cache (rtpgstdepay, i, NULL); + g_free (rtpgstdepay->stream_id); + rtpgstdepay->stream_id = NULL; + if (rtpgstdepay->tags) + gst_tag_list_unref (rtpgstdepay->tags); + rtpgstdepay->tags = NULL; } } @@ -315,6 +320,57 @@ unknown_event: } } +static void +store_event (GstRtpGSTDepay * rtpgstdepay, GstEvent * event) +{ + gboolean do_push = FALSE; + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_TAG: + { + GstTagList *old, *tags; + + gst_event_parse_tag (event, &tags); + + old = rtpgstdepay->tags; + if (!old || !gst_tag_list_is_equal (old, tags)) { + do_push = TRUE; + if (old) + gst_tag_list_unref (old); + rtpgstdepay->tags = gst_tag_list_ref (tags); + } + break; + } + case GST_EVENT_CUSTOM_DOWNSTREAM: + case GST_EVENT_CUSTOM_BOTH: + /* always push custom events */ + do_push = TRUE; + break; + case GST_EVENT_STREAM_START: + { + gchar *old; + const gchar *stream_id = NULL; + + gst_event_parse_stream_start (event, &stream_id); + + old = rtpgstdepay->stream_id; + if (!old || g_strcmp0 (old, stream_id)) { + do_push = TRUE; + g_free (old); + rtpgstdepay->stream_id = g_strdup (stream_id); + } + break; + } + default: + /* unknown event, don't push */ + break; + } + if (do_push) + gst_pad_push_event (GST_RTP_BASE_DEPAYLOAD (rtpgstdepay)->srcpad, event); + else + gst_event_unref (event); +} + static GstBuffer * gst_rtp_gst_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf) { @@ -402,7 +458,7 @@ gst_rtp_gst_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf) GST_DEBUG_OBJECT (rtpgstdepay, "inline event, length %u, %" GST_PTR_FORMAT, size, event); - gst_pad_push_event (depayload->srcpad, event); + store_event (rtpgstdepay, event); /* no buffer after event */ avail = 0; diff --git a/gst/rtp/gstrtpgstdepay.h b/gst/rtp/gstrtpgstdepay.h index 5fbbde8586..4b8f2c62e6 100644 --- a/gst/rtp/gstrtpgstdepay.h +++ b/gst/rtp/gstrtpgstdepay.h @@ -47,6 +47,9 @@ struct _GstRtpGSTDepay GstAdapter *adapter; guint current_CV; GstCaps *CV_cache[8]; + + GstTagList *tags; + gchar *stream_id; }; struct _GstRtpGSTDepayClass