import os import gobject import gst def gst_dump(bin): dump_element(bin, 0) def dump_bin(bin, indent): # Iterate the children for child in bin.get_list(): dump_element(child, indent + 2) def dump_element(element, indent): states = { 1: 'NULL', 2: 'READY', 4: 'PAUSED', 8: 'PLAYING' } state = 'UNKNOWN' try: state = states[element.get_state()] except KeyError: state = 'UNKNOWN (%d)' % element.get_state() c = element.get_clock() if c is None: clock_str = "clock - None" else: clock_str = "clock - %s" % (c.get_name()) out = "%s (%s): state %s, %s" % (element.get_name(), gobject.type_name(element.__gtype__), state, clock_str) print out.rjust(len(out) + indent) tmp = { True: 'active', False: 'inactive' } for curpad in element.get_pad_list(): if curpad.get_direction() == gst.PAD_SRC: if curpad.is_linked(): peer = curpad.get_peer() out = " - %s:%s (%s) => %s:%s (%s)" % ( curpad.get_parent().get_name(), curpad.get_name(), tmp[curpad.is_active()], peer.get_parent().get_name(), peer.get_name(), tmp[peer.is_active()]) print out.rjust(len(out) + indent) if isinstance(element, gst.Bin): dump_bin(element, indent + 2) elif isinstance(element, gst.Queue): out = " - time_level: %ld" % ( element.get_property('current-level-time')) print out.rjust(len(out) + indent) out = " - bytes_level: %ld" % ( element.get_property('current-level-bytes')) print out.rjust(len(out) + indent) def gc_collect(reason=None): """ Garbage-collect if GST_GC env var is set. This helps in debugging object refcounting. Sprinkle liberally around checkpoints. """ env = os.environ.get('GST_GC', None) if not env: return import gc if env == 'DEBUG_LEAK': gc.set_debug(gc.DEBUG_LEAK) gst.debug('collecting garbage') if reason: gst.debug('because of %s' % reason) count = gc.collect() gst.debug('collected garbage, %d objects collected, %d left' % ( count, len(gc.get_objects())))