# -*- Mode: Python -*- # vi:si:et:sw=4:sts=4:ts=4 """ examine all plugins and elements and output xml documentation for them used as part of the plugin documentation build """ import sys import os import pygst pygst.require('0.10') import gst INDENT_SIZE = 2 # all templates PAD_TEMPLATE = """ %(name)s %(direction)s %(presence)s
%(details)s
""" ELEMENT_TEMPLATE = """ %(name)s %(longname)s %(class)s %(description)s %(author)s %(pads)s """ PLUGIN_TEMPLATE = """ %(name)s %(description)s %(filename)s %(basename)s %(version)s %(license)s %(source)s %(package)s %(origin)s %(elements)s """ def xmlencode(line): """ Replace &, <, and > """ line = "&".join(line.split("&")) line = "<".join(line.split("<")) line = ">".join(line.split(">")) return line def get_offset(indent): return " " * INDENT_SIZE * indent def output_pad_template(pt, indent=0): print "PAD TEMPLATE", pt.name_template paddir = ("unknown","source","sink") padpres = ("always","sometimes","request") d = { 'name': xmlencode(pt.name_template), 'direction': xmlencode(paddir[pt.direction]), 'presence': xmlencode(padpres[pt.presence]), 'details': xmlencode(pt.static_caps.string), } block = PAD_TEMPLATE % d offset = get_offset(indent) return offset + ("\n" + offset).join(block.split("\n")) def output_element_factory(elf, indent=0): print "ELEMENT", elf.get_name() padsoutput = [] padtemplates = elf.get_static_pad_templates() for padtemplate in padtemplates: padsoutput.append(output_pad_template(padtemplate, indent)) d = { 'name': xmlencode(elf.get_name()), 'longname': xmlencode(elf.get_longname()), 'class': xmlencode(elf.get_klass()), 'description': xmlencode(elf.get_description()), 'author': xmlencode(elf.get_author()), 'pads': "\n".join(padsoutput), } block = ELEMENT_TEMPLATE % d offset = get_offset(indent) return offset + ("\n" + offset).join(block.split("\n")) def output_plugin(plugin, indent=0): print "PLUGIN", plugin.get_name() version = plugin.get_version() elements = {} gst.debug('getting features for plugin %s' % plugin.get_name()) registry = gst.registry_get_default() features = registry.get_feature_list_by_plugin(plugin.get_name()) gst.debug('plugin %s has %d features' % (plugin.get_name(), len(features))) for feature in features: if isinstance(feature, gst.ElementFactory): elements[feature.get_name()] = feature #gst.debug("got features") elementsoutput = [] keys = elements.keys() keys.sort() for name in keys: feature = elements[name] elementsoutput.append(output_element_factory(feature, indent + 2)) filename = plugin.get_filename() basename = filename if basename: basename = os.path.basename(basename) d = { 'name': xmlencode(plugin.get_name()), 'description': xmlencode(plugin.get_description()), 'filename': filename, 'basename': basename, 'version': version, 'license': xmlencode(plugin.get_license()), 'source': xmlencode(plugin.get_source()), 'package': xmlencode(plugin.get_package()), 'origin': xmlencode(plugin.get_origin()), 'elements': "\n".join(elementsoutput), } block = PLUGIN_TEMPLATE % d offset = get_offset(indent) return offset + ("\n" + offset).join(block.split("\n")) def main(): if len(sys.argv) == 1: sys.stderr.write("Please specify a source module to inspect") sys.exit(1) source = sys.argv[1] if len(sys.argv) > 2: os.chdir(sys.argv[2]) registry = gst.registry_get_default() all = registry.get_plugin_list() for plugin in all: gst.debug("inspecting plugin %s from source %s" % ( plugin.get_name(), plugin.get_source())) # this skips gstcoreelements, with bin and pipeline if plugin.get_filename() is None: continue if plugin.get_source() != source: continue filename = "plugin-%s.xml" % plugin.get_name() handle = open(filename, "w") handle.write(output_plugin(plugin)) handle.close() main()