summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.com>2018-01-28 14:28:33 +0000
committerTim-Philipp Müller <tim@centricular.com>2018-01-28 14:28:33 +0000
commit49d30c901d5ee7db1082432103cdce2fcbf99267 (patch)
tree89be601d867a80e4009e7f95649d5e9b19309d0f /ext
parent297f7e4f04d5e2539612e5d29c8ff8b51af16d6c (diff)
downloadgstreamer-plugins-bad-49d30c901d5ee7db1082432103cdce2fcbf99267.tar.gz
rtmpsink: don't crash if there's streamheader field in the caps
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.
Diffstat (limited to 'ext')
-rw-r--r--ext/rtmp/gstrtmpsink.c38
1 files changed, 25 insertions, 13 deletions
diff --git a/ext/rtmp/gstrtmpsink.c b/ext/rtmp/gstrtmpsink.c
index 4e07cc692..47c3d6088 100644
--- a/ext/rtmp/gstrtmpsink.c
+++ b/ext/rtmp/gstrtmpsink.c
@@ -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;
}