summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2016-11-28 19:45:46 +0200
committerSebastian Dröge <sebastian@centricular.com>2016-11-28 19:59:20 +0200
commitedc7802ac5621398c453c57946a01f7dbc15eb67 (patch)
tree4d729af2a564eb0909f117cc2e03479ba0c0e7d9
parent871f8ef229a393475fc567887030088a8a4e05c5 (diff)
downloadgstreamer-plugins-base-edc7802ac5621398c453c57946a01f7dbc15eb67.tar.gz
discoverer: Handle NULL/ANY/EMPTY caps without crashing
-rw-r--r--gst-libs/gst/pbutils/gstdiscoverer.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/gst-libs/gst/pbutils/gstdiscoverer.c b/gst-libs/gst/pbutils/gstdiscoverer.c
index 9dfc50ae7..ad7fadeb0 100644
--- a/gst-libs/gst/pbutils/gstdiscoverer.c
+++ b/gst-libs/gst/pbutils/gstdiscoverer.c
@@ -816,6 +816,14 @@ collect_information (GstDiscoverer * dc, const GstStructure * st,
}
gst_structure_id_get (st, _CAPS_QUARK, GST_TYPE_CAPS, &caps, NULL);
+
+ if (!caps || gst_caps_is_empty (caps) || gst_caps_is_any (caps)) {
+ GST_WARNING ("Couldn't find caps !");
+ if (caps)
+ gst_caps_unref (caps);
+ return make_info (parent, GST_TYPE_DISCOVERER_STREAM_INFO, NULL);
+ }
+
caps_st = gst_caps_get_structure (caps, 0);
name = gst_structure_get_name (caps_st);
@@ -1033,10 +1041,20 @@ find_stream_for_node (GstDiscoverer * dc, const GstStructure * topology)
static gboolean
child_is_same_stream (const GstCaps * _parent, const GstCaps * child)
{
- GstCaps *parent = gst_caps_copy (_parent);
- guint i, size = gst_caps_get_size (parent);
+ GstCaps *parent;
+ guint i, size;
gboolean res;
+ if (_parent == child)
+ return TRUE;
+ if (!_parent)
+ return FALSE;
+ if (!child)
+ return FALSE;
+
+ parent = gst_caps_copy (_parent);
+ size = gst_caps_get_size (parent);
+
for (i = 0; i < size; i++) {
gst_structure_remove_field (gst_caps_get_structure (parent, i), "parsed");
gst_structure_remove_field (gst_caps_get_structure (parent, i), "framed");
@@ -1053,6 +1071,13 @@ child_is_raw_stream (const GstCaps * parent, const GstCaps * child)
const GstStructure *st1, *st2;
const gchar *name1, *name2;
+ if (parent == child)
+ return TRUE;
+ if (!parent)
+ return FALSE;
+ if (!child)
+ return FALSE;
+
st1 = gst_caps_get_structure (parent, 0);
name1 = gst_structure_get_name (st1);
st2 = gst_caps_get_structure (child, 0);
@@ -1130,7 +1155,8 @@ parse_stream_topology (GstDiscoverer * dc, const GstStructure * topology,
res->next = next;
next->previous = res;
}
- gst_caps_unref (caps);
+ if (caps)
+ gst_caps_unref (caps);
}
}