5 from string import Template
7 TEMPLATE = Template('''
11 $typefind_funcs_declaration
12 $device_providers_declaration
13 $dynamic_types_declaration
17 gst_init_static_plugins (void)
19 static gsize initialization_value = 0;
20 if (g_once_init_enter (&initialization_value)) {
21 $elements_registration
22 $typefind_funcs_registration
23 $device_providers_registration
24 $dynamic_types_registration
27 g_once_init_leave (&initialization_value, 1);
33 # Retrieve the plugin name as it can be a plugin filename
34 def get_plugin_name(name):
41 def process_features(features_list, plugins, feature_prefix):
42 plugins_list = plugins
43 feature_declaration = []
44 feature_registration = []
45 if features_list is not None:
46 feature_plugins = features_list.split(';')
47 for plugin in feature_plugins:
48 split = plugin.split(':')
49 plugin_name = split[0].strip()
51 if (get_plugin_name(plugin_name)) != '':
52 plugins_list.remove(get_plugin_name(plugin_name))
53 features = split[1].split(',')
54 for feature in features:
55 feature = feature.replace("-", "_")
56 feature_declaration += ['%s_REGISTER_DECLARE(%s);' % (feature_prefix, feature)]
57 feature_registration += ['%s_REGISTER(%s, NULL);' % (feature_prefix, feature)]
58 return (plugins_list, feature_declaration, feature_registration)
61 if __name__ == "__main__":
62 parser = argparse.ArgumentParser()
63 parser.add_argument('-o', dest="output", help="Output file")
64 parser.add_argument('-p', '--plugins', nargs='?', default='', dest="plugins", help="The list of plugins")
65 parser.add_argument('-e', '--elements', nargs='?', default='', dest="elements", help="The list of plugin:elements")
66 parser.add_argument('-t', '--type-finds', nargs='?', default='',
67 dest="typefindfuncs", help="The list of plugin:typefinds")
68 parser.add_argument('-d', '--devide-providers', nargs='?', default='',
69 dest="deviceproviders", help="The list of plugin:deviceproviders")
70 parser.add_argument('-T', '--dynamic-types', nargs='?', default='',
71 dest="dynamictypes", help="The list of plugin:dynamictypes")
72 options = parser.parse_args()
73 if options.output is None:
74 output_file = 'gstinitstaticplugins.c'
76 output_file = options.output
77 enable_staticelements_plugin = 0
78 elements_declaration = []
79 elements_registration = []
80 typefind_funcs_declaration = []
81 typefind_funcs_registration = []
82 device_providers_declaration = []
83 device_providers_registration = []
84 dynamic_types_declaration = []
85 dynamic_types_registration = []
86 plugins_declaration = []
87 plugins_registration = []
89 if ',' in options.plugins or ':' in options.plugins:
90 print("Only ';' is allowed in the list of plugins.")
93 if options.plugins is None or options.plugins.isspace():
96 plugins = options.plugins.split(';')
98 # process the features
99 (plugins, elements_declaration, elements_registration) = process_features(options.elements, plugins, 'GST_ELEMENT')
100 (plugins, typefind_funcs_declaration, typefind_funcs_registration) = process_features(
101 options.typefindfuncs, plugins, 'GST_TYPE_FIND')
102 (plugins, device_providers_declaration, device_providers_registration) = process_features(
103 options.deviceproviders, plugins, 'GST_DEVICE_PROVIDER')
104 (plugins, dynamic_types_declaration, dynamic_types_registration) = process_features(
105 options.dynamictypes, plugins, 'GST_DYNAMIC_TYPE')
107 # Enable plugin or elements according to the ';' separated list.
108 for plugin in plugins:
109 split = plugin.split(':')
110 plugin_name = split[0]
111 if plugin_name == '':
113 filename = os.path.basename(plugin)
114 if filename.startswith('libgst') and filename.endswith('.a'):
115 plugin_name = filename[len('libgst'):-len('.a')]
116 plugins_registration += ['GST_PLUGIN_STATIC_REGISTER(%s);' % (plugin_name)]
117 plugins_declaration += ['GST_PLUGIN_STATIC_DECLARE(%s);' % (plugin_name)]
119 with open(output_file.strip(), "w") as f:
120 static_elements_plugin = ''
121 f.write(TEMPLATE.substitute({
122 'elements_declaration': '\n'.join(elements_declaration),
123 'elements_registration': '\n '.join(elements_registration),
124 'typefind_funcs_declaration': '\n'.join(typefind_funcs_declaration),
125 'typefind_funcs_registration': '\n '.join(typefind_funcs_registration),
126 'device_providers_declaration': '\n'.join(device_providers_declaration),
127 'device_providers_registration': '\n '.join(device_providers_registration),
128 'dynamic_types_declaration': '\n'.join(dynamic_types_declaration),
129 'dynamic_types_registration': '\n '.join(dynamic_types_registration),
130 'plugins_declaration': '\n'.join(plugins_declaration),
131 'plugins_registration': '\n '.join(plugins_registration),