rtmpsink: don't crash if there's streamheader field in the caps
authorTim-Philipp Müller <tim@centricular.com>
Sun, 28 Jan 2018 14:28:33 +0000 (14:28 +0000)
committerTim-Philipp Müller <tim@centricular.com>
Sun, 28 Jan 2018 14:28:33 +0000 (14:28 +0000)
Fix regression when used in combination with new flvmux which was
ported to GstAggregator, and which sends plain video/x-flv caps
before sending full caps that include streamheaders.

ext/rtmp/gstrtmpsink.c

index 4e07cc6..47c3d60 100644 (file)
@@ -398,8 +398,6 @@ gst_rtmp_sink_setcaps (GstBaseSink * sink, GstCaps * caps)
   GstRTMPSink *rtmpsink = GST_RTMP_SINK (sink);
   GstStructure *s;
   const GValue *sh;
-  GArray *buffers;
-  gint i;
 
   GST_DEBUG_OBJECT (sink, "caps set to %" GST_PTR_FORMAT, caps);
 
@@ -409,29 +407,43 @@ gst_rtmp_sink_setcaps (GstBaseSink * sink, GstCaps * caps)
     rtmpsink->header = NULL;
   }
 
-  rtmpsink->header = gst_buffer_new ();
-
   s = gst_caps_get_structure (caps, 0);
 
   sh = gst_structure_get_value (s, "streamheader");
-  buffers = g_value_peek_pointer (sh);
+  if (sh == NULL)
+    goto out;
+
+  if (GST_VALUE_HOLDS_BUFFER (sh)) {
+    rtmpsink->header = gst_buffer_ref (gst_value_get_buffer (sh));
+  } else if (GST_VALUE_HOLDS_ARRAY (sh)) {
+    GArray *buffers;
+    gint i;
+
+    buffers = g_value_peek_pointer (sh);
 
-  /* Concatenate all buffers in streamheader into one */
-  for (i = 0; i < buffers->len; ++i) {
-    GValue *val;
-    GstBuffer *buf;
+    /* Concatenate all buffers in streamheader into one */
+    rtmpsink->header = gst_buffer_new ();
+    for (i = 0; i < buffers->len; ++i) {
+      GValue *val;
+      GstBuffer *buf;
 
-    val = &g_array_index (buffers, GValue, i);
-    buf = g_value_peek_pointer (val);
+      val = &g_array_index (buffers, GValue, i);
+      buf = g_value_peek_pointer (val);
 
-    gst_buffer_ref (buf);
+      gst_buffer_ref (buf);
 
-    rtmpsink->header = gst_buffer_append (rtmpsink->header, buf);
+      rtmpsink->header = gst_buffer_append (rtmpsink->header, buf);
+    }
+  } else {
+    GST_ERROR_OBJECT (rtmpsink, "streamheader field has unexpected type %s",
+        G_VALUE_TYPE_NAME (sh));
   }
 
   GST_DEBUG_OBJECT (rtmpsink, "have %" G_GSIZE_FORMAT " bytes of header data",
       gst_buffer_get_size (rtmpsink->header));
 
+out:
+
   return TRUE;
 }