rtpgstdepay: only push events when they changed
authorWim Taymans <wim.taymans@collabora.co.uk>
Wed, 21 Aug 2013 10:10:00 +0000 (12:10 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Wed, 21 Aug 2013 10:10:00 +0000 (12:10 +0200)
Keep track of the STREAM_START and TAG events and only push them
when they changed.

gst/rtp/gstrtpgstdepay.c
gst/rtp/gstrtpgstdepay.h

index f1d0f7b757bfc23e1b9c92d8b3f235ccce4eca8f..5803f982c6e6b437c89ebf2bc78f93af8becf522 100644 (file)
@@ -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;
index 5fbbde85860550cfb35af02d180ed4fb6625c952..4b8f2c62e60c576f8142196cc398389b19d2fc20 100644 (file)
@@ -47,6 +47,9 @@ struct _GstRtpGSTDepay
   GstAdapter *adapter;
   guint current_CV;
   GstCaps *CV_cache[8];
+
+  GstTagList *tags;
+  gchar *stream_id;
 };
 
 struct _GstRtpGSTDepayClass