diff options
author | Tim-Philipp Müller <tim@centricular.com> | 2018-01-28 14:28:33 +0000 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2018-01-28 14:28:33 +0000 |
commit | 49d30c901d5ee7db1082432103cdce2fcbf99267 (patch) | |
tree | 89be601d867a80e4009e7f95649d5e9b19309d0f /ext | |
parent | 297f7e4f04d5e2539612e5d29c8ff8b51af16d6c (diff) | |
download | gstreamer-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.c | 38 |
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; } |