wpesrc: Switch URI handler to web+... protocols
[platform/upstream/gstreamer.git] / scripts / generate_init_static_plugins.py
1 #!/usr/bin/env python3
2
3 import argparse
4 import os
5 from string import Template
6
7 TEMPLATE = Template('''
8 #include <gst/gst.h>
9
10 $elements_declaration
11 $typefind_funcs_declaration
12 $device_providers_declaration
13 $dynamic_types_declaration
14 $plugins_declaration
15
16 void
17 gst_init_static_plugins (void)
18 {
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
25     $plugins_registration
26
27     g_once_init_leave (&initialization_value, 1);
28   }
29 }
30 ''')
31
32
33 # Retrieve the plugin name as it can be a plugin filename
34 def get_plugin_name(name):
35     for p in plugins:
36         if name in p:
37             return p
38     return ''
39
40
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()
50             if len(split) == 2:
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)
59
60
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'
75     else:
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 = []
88
89     if ',' in options.plugins or ':' in options.plugins:
90         print("Only ';' is allowed in the list of plugins.")
91         exit(1)
92
93     if options.plugins is None or options.plugins.isspace():
94         plugins = []
95     else:
96         plugins = options.plugins.split(';')
97
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')
106
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 == '':
112             continue
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)]
118
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),
132         }))