flvdemux: Only set caps once if they don't change
authorSebastian Dröge <sebastian@centricular.com>
Tue, 24 Mar 2015 15:18:53 +0000 (16:18 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Tue, 24 Mar 2015 15:18:53 +0000 (16:18 +0100)
Previously we were setting new caps with the same content for every H264 or
AAC codec_data we found in the stream, spamming everything and causing
renegotiations.

gst/flv/gstflvdemux.c

index 43ac53d..2ca73f5 100644 (file)
@@ -663,7 +663,7 @@ static gboolean
 gst_flv_demux_audio_negotiate (GstFlvDemux * demux, guint32 codec_tag,
     guint32 rate, guint32 channels, guint32 width)
 {
-  GstCaps *caps = NULL;
+  GstCaps *caps = NULL, *old_caps;
   gchar *codec_name = NULL;
   gboolean ret = FALSE;
   guint adjusted_rate = rate;
@@ -814,17 +814,25 @@ gst_flv_demux_audio_negotiate (GstFlvDemux * demux, guint32 codec_tag,
         demux->audio_codec_data, NULL);
   }
 
-  stream_id =
-      gst_pad_create_stream_id (demux->audio_pad, GST_ELEMENT_CAST (demux),
-      "audio");
+  old_caps = gst_pad_get_current_caps (demux->audio_pad);
+  if (!old_caps) {
+    stream_id =
+        gst_pad_create_stream_id (demux->audio_pad, GST_ELEMENT_CAST (demux),
+        "audio");
 
-  event = gst_event_new_stream_start (stream_id);
-  if (have_group_id (demux))
-    gst_event_set_group_id (event, demux->group_id);
-  gst_pad_push_event (demux->audio_pad, event);
-  g_free (stream_id);
+    event = gst_event_new_stream_start (stream_id);
+    if (have_group_id (demux))
+      gst_event_set_group_id (event, demux->group_id);
+    gst_pad_push_event (demux->audio_pad, event);
+    g_free (stream_id);
+  }
+  if (!old_caps || !gst_caps_is_equal (old_caps, caps))
+    ret = gst_pad_set_caps (demux->audio_pad, caps);
+  else
+    ret = TRUE;
 
-  ret = gst_pad_set_caps (demux->audio_pad, caps);
+  if (old_caps)
+    gst_caps_unref (old_caps);
 
 done:
   if (G_LIKELY (ret)) {
@@ -1234,7 +1242,7 @@ static gboolean
 gst_flv_demux_video_negotiate (GstFlvDemux * demux, guint32 codec_tag)
 {
   gboolean ret = FALSE;
-  GstCaps *caps = NULL;
+  GstCaps *caps = NULL, *old_caps;
   gchar *codec_name = NULL;
   GstEvent *event;
   gchar *stream_id;
@@ -1301,16 +1309,26 @@ gst_flv_demux_video_negotiate (GstFlvDemux * demux, guint32 codec_tag)
         demux->video_codec_data, NULL);
   }
 
-  stream_id =
-      gst_pad_create_stream_id (demux->video_pad, GST_ELEMENT_CAST (demux),
-      "video");
-  event = gst_event_new_stream_start (stream_id);
-  g_free (stream_id);
+  old_caps = gst_pad_get_current_caps (demux->video_pad);
+  if (!old_caps) {
+    stream_id =
+        gst_pad_create_stream_id (demux->video_pad, GST_ELEMENT_CAST (demux),
+        "video");
+    event = gst_event_new_stream_start (stream_id);
+    g_free (stream_id);
+
+    if (have_group_id (demux))
+      gst_event_set_group_id (event, demux->group_id);
+    gst_pad_push_event (demux->video_pad, event);
+  }
+
+  if (!old_caps || !gst_caps_is_equal (old_caps, caps))
+    ret = gst_pad_set_caps (demux->video_pad, caps);
+  else
+    ret = TRUE;
 
-  if (have_group_id (demux))
-    gst_event_set_group_id (event, demux->group_id);
-  gst_pad_push_event (demux->video_pad, event);
-  ret = gst_pad_set_caps (demux->video_pad, caps);
+  if (old_caps)
+    gst_caps_unref (old_caps);
 
 done:
   if (G_LIKELY (ret)) {