From 320a4cba4ba9ea607cf4c9a623d08aad64151aa9 Mon Sep 17 00:00:00 2001 From: Michael Olbrich Date: Sat, 11 May 2019 20:53:54 +0200 Subject: [PATCH] gdb: refactor finding top-level pipeline No functional changes. Just refactoring to make it possible to reuse this later. --- libs/gst/helpers/gst_gdb.py | 56 +++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/libs/gst/helpers/gst_gdb.py b/libs/gst/helpers/gst_gdb.py index cd07360f1c..443c3cb54b 100644 --- a/libs/gst/helpers/gst_gdb.py +++ b/libs/gst/helpers/gst_gdb.py @@ -251,6 +251,36 @@ def _g_value_get_value(val): return val["data"].cast(t).dereference() +def gst_object_from_value(value): + if value.type.code != gdb.TYPE_CODE_PTR: + value = value.address + + if not is_gst_type(value, "GstObject"): + raise Exception("'%s' is not a GstObject" % args[0]) + + return value.cast(gdb.lookup_type("GstObject").pointer()) + + +def gst_object_pipeline(obj): + try: + while obj["parent"] != 0: + tmp = obj["parent"] + # sanity checks to handle memory corruption + if g_inherits_type(obj, "GstElement") and \ + GdbGstElement(obj) not in GdbGstElement(tmp).children(): + break + if g_inherits_type(obj, "GstPad") and \ + GdbGstPad(obj) not in GdbGstElement(tmp).pads(): + break + obj = tmp + except gdb.MemoryError: + pass + + if not g_inherits_type(obj, "GstElement"): + raise Exception("Toplevel parent is not a GstElement") + return obj.cast(gdb.lookup_type("GstElement").pointer()) + + def element_state_to_name(state): names = [ "VOID_PENDING", @@ -967,30 +997,8 @@ Usage: gst-dot """ if not value: raise Exception("'%s' is not a valid object" % args[0]) - if value.type.code != gdb.TYPE_CODE_PTR: - value = value.address - - if not is_gst_type(value, "GstObject"): - raise Exception("'%s' is not a GstObject" % args[0]) - - value = value.cast(gdb.lookup_type("GstObject").pointer()) - try: - while value["parent"] != 0: - tmp = value["parent"] - # sanity checks to handle memory corruption - if g_inherits_type(value, "GstElement") and \ - GdbGstElement(value) not in GdbGstElement(tmp).children(): - break - if g_inherits_type(value, "GstPad") and \ - GdbGstPad(value) not in GdbGstElement(tmp).pads(): - break - value = tmp - except gdb.MemoryError: - pass - - if not g_inherits_type(value, "GstElement"): - raise Exception("Toplevel parent is not a GstElement") - value = value.cast(gdb.lookup_type("GstElement").pointer()) + value = gst_object_from_value(value) + value = gst_object_pipeline(value) dot = GdbGstElement(value).pipeline_dot() file = open(args[1], "w")