예제 #1
0
파일: gst_gdb.py 프로젝트: pexip/gstreamer
 def __str__(self):
     try:
         value = self.value()
         tname = self.fundamental_typename()
         gvalue_type = gdb.lookup_type("GValue")
         if tname is None:
             v = "<None>"
         elif tname == "GstFraction":
             v = "%d/%d" % (value[0], value[1])
         elif tname == "GstBitmask":
             v = "0x%016x" % long(value)
         elif tname == "gboolean":
             v = "false" if int(value) == 0 else "true"
         elif tname == "GstFlagSet":
             v = "%x:%x" % (value[0], value[1])
         elif tname == "GstIntRange":
             rmin = int(value[0]["v_uint64"]) >> 32
             rmax = int(value[0]["v_uint64"]) & 0xffffffff
             step = int(value[1]["v_int"])
             if step == 1:
                 v = "[ %d, %d ]" % (rmin, rmax)
             else:
                 v = "[ %d, %d, %d ]" % (rmin * step, rmax * step, step)
         elif tname == "GstFractionRange":
             v = "[ %s, %s ]" % (GdbGValue(value[0]), GdbGValue(value[1]))
         elif tname in ("GstValueList", "GstValueArray"):
             if gvalue_type.fields()[1].type == value.type:
                 gdb_type = gdb.lookup_type("GArray").pointer()
                 value = value[0]["v_pointer"].cast(gdb_type)
             v = "<"
             for l in _g_array_iter(value, gvalue_type):
                 v += " " if v == "<" else ", "
                 v += str(GdbGValue(l))
             v += " >"
         elif tname == "GEnum":
             v = "%s(%s)" % (g_type_to_name(
                 g_type_to_typenode(self.val["g_type"])), value["v_int"])
         else:
             try:
                 v = value.string()
             except RuntimeError:
                 # it is not a string-like type
                 if gvalue_type.fields()[1].type == value.type:
                     # don't print the raw GValue union
                     v = "<unknown type: %s>" % tname
                 else:
                     v = str(value)
     except gdb.MemoryError:
         v = "<inaccessible memory at 0x%x>" % int(self.val)
     return v
예제 #2
0
def g_inherits_type(val, typename):
    if is_gst_type(val, "GstObject"):
        gtype = _g_type_from_instance(val)
        if gtype is None:
            return False
        typenode = g_type_to_typenode(gtype)
    elif is_gst_type(val, "GstMiniObject"):
        mini = val.cast(gdb.lookup_type("GstMiniObject").pointer())
        try:
            typenode = mini["type"].cast(gdb.lookup_type("TypeNode").pointer())
        except gdb.MemoryError:
            return False
    else:
        return False

    for i in range(typenode["n_supers"]):
        if g_type_to_name(typenode["supers"][i]) == typename:
            return True
    return False
예제 #3
0
def _g_value_get_value(val):
    typenode = g_type_to_typenode(val["g_type"])
    if not typenode:
        return None
    tname = g_quark_to_string(typenode["qname"])
    fname = g_type_to_name(typenode["supers"][int(typenode["n_supers"])])
    if fname in ("gchar", "guchar", "gboolean", "gint", "guint", "glong",
                 "gulong", "gint64", "guint64", "gfloat", "gdouble",
                 "gpointer", "GFlags"):
        try:
            t = gdb.lookup_type(tname).pointer()
        except RuntimeError:
            t = gdb.lookup_type(fname).pointer()
    elif fname == "gchararray":
        t = gdb.lookup_type("char").pointer().pointer()
    elif fname == "GstBitmask":
        t = gdb.lookup_type("guint64").pointer()
    elif fname == "GstFlagSet":
        t = gdb.lookup_type("guint").pointer().pointer()
        return val["data"].cast(t)
    elif fname == "GstFraction":
        t = gdb.lookup_type("gint").pointer().pointer()
        return val["data"].cast(t)
    elif fname == "GstFractionRange":
        t = gdb.lookup_type("GValue").pointer().pointer()
    elif fname == "GstValueList":
        t = gdb.lookup_type("GArray").pointer().pointer()
    elif fname in ("GBoxed", "GObject"):
        try:
            t = gdb.lookup_type(tname).pointer().pointer()
        except RuntimeError:
            t = gdb.lookup_type(tname).pointer().pointer()
    else:
        return val["data"]

    return val["data"].cast(t).dereference()
예제 #4
0
 def fundamental_typename(self):
     typenode = g_type_to_typenode(self.val["g_type"])
     if not typenode:
         return None
     return g_type_to_name(typenode["supers"][int(typenode["n_supers"])])