gdb: add gst_pipeline() and gst_bin_get() functions
authorMichael Olbrich <m.olbrich@pengutronix.de>
Sat, 11 May 2019 18:59:04 +0000 (20:59 +0200)
committerTim-Philipp Müller <tim@centricular.com>
Fri, 24 May 2019 10:37:50 +0000 (10:37 +0000)
This simplifies navigating in a GStreamer pipeline, e.g.

(gdb) print $gst_bin_get($gst_pipeline(pad), "matroskademux0")
$1 = 0x7fffe81b4050 [GstMatroskaDemux|matroskademux0]

libs/gst/helpers/gst_gdb.py

index 4e483ed..597e9bf 100644 (file)
@@ -1053,6 +1053,58 @@ GstDot()
 GstPrint()
 
 
+class GstPipeline(gdb.Function):
+    """\
+Find the top-level pipeline for the given element"""
+
+    def __init__(self):
+        super(GstPipeline, self).__init__("gst_pipeline")
+
+    def invoke(self, arg):
+        value = gst_object_from_value(arg)
+        return gst_object_pipeline(value)
+
+
+class GstBinGet(gdb.Function):
+    """\
+Find a child element with the given name"""
+
+    def __init__(self):
+        super(GstBinGet, self).__init__("gst_bin_get")
+
+    def find(self, obj, name, recurse):
+        for child in obj.children():
+            if child.name() == name:
+                return child.val
+            if recurse:
+                result = self.find(child, name, recurse)
+                if result is not None:
+                    return result
+
+    def invoke(self, element, arg):
+        value = gst_object_from_value(element)
+        if not g_inherits_type(value, "GstElement"):
+            raise Exception("'%s' is not a GstElement" %
+                            str(value.address))
+
+        try:
+            name = arg.string()
+        except gdb.error:
+            raise Exception("Usage: $gst_bin_get(<gst-object>, \"<name>\")")
+
+        obj = GdbGstElement(value)
+        child = self.find(obj, name, False)
+        if child is None:
+            child = self.find(obj, name, True)
+        if child is None:
+            raise Exception("No child named '%s' found." % name)
+        return child
+
+
+GstPipeline()
+GstBinGet()
+
+
 def register(obj):
     if obj is None:
         obj = gdb