forked from videolan/vlc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvlc_modules.h
219 lines (194 loc) · 7.37 KB
/
vlc_modules.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
/*****************************************************************************
* vlc_modules.h : Module descriptor and load functions
*****************************************************************************
* Copyright (C) 2001-2011 VLC authors and VideoLAN
*
* Authors: Samuel Hocevar <[email protected]>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifndef VLC_MODULES_H
#define VLC_MODULES_H 1
/**
* \file
* This file defines functions for modules in vlc
*/
typedef int (*vlc_activate_t)(void *func, bool forced, va_list args);
typedef void (*vlc_deactivate_t)(void *func, va_list args);
struct vlc_logger;
/*****************************************************************************
* Exported functions.
*****************************************************************************/
/**
* Finds and instantiates the best module of a certain type.
* All candidates modules having the specified capability and name will be
* sorted in decreasing order of priority. Then the probe callback will be
* invoked for each module, until it succeeds (returns 0), or all candidate
* module failed to initialize.
*
* The probe callback first parameter is the address of the module entry point.
* Further parameters are passed as an argument list; it corresponds to the
* variable arguments passed to this function. This scheme is meant to
* support arbitrary prototypes for the module entry point.
*
* \param log logger for debugging (or NULL to ignore)
* \param capability capability, i.e. class of module
* \param name name of the module asked, if any
* \param strict if true, do not fallback to plugin with a different name
* but the same capability
* \param probe module probe callback
* \return the module or NULL in case of a failure
*/
VLC_API module_t *vlc_module_load(struct vlc_logger *log, const char *cap,
const char *name, bool strict,
vlc_activate_t probe, ... ) VLC_USED;
#ifndef __cplusplus
#define vlc_module_load(ctx, cap, name, strict, ...) \
_Generic ((ctx), \
struct vlc_logger *: \
vlc_module_load((void *)(ctx), cap, name, strict, __VA_ARGS__), \
void *: \
vlc_module_load((void *)(ctx), cap, name, strict, __VA_ARGS__), \
default: \
vlc_module_load(vlc_object_logger((vlc_object_t *)(ctx)), cap, \
name, strict, __VA_ARGS__))
#endif
/**
* Deinstantiates a module.
*
* This is an inconvenience wrapper for deactivating a module if the module
* capability/type expects it. In that fashion, it is paired with
* vlc_module_load(). It is rather inconvenient however, as it requires
* variable arguments for no good reasons, and inhibits type safety.
*
* In practice, it is easier to treat vlc_module_load() as an object "factory",
* and define a type-safe custom callback for object deletion.
*
* \param module the module pointer as returned by vlc_module_load()
* \param deinit deactivation callback
*/
VLC_API void vlc_module_unload(module_t *, vlc_deactivate_t deinit, ... );
VLC_API module_t * module_need( vlc_object_t *, const char *, const char *, bool ) VLC_USED;
#define module_need(a,b,c,d) module_need(VLC_OBJECT(a),b,c,d)
VLC_USED
static inline module_t *module_need_var(vlc_object_t *obj, const char *cap,
const char *varname)
{
char *list = var_InheritString(obj, varname);
module_t *m = module_need(obj, cap, list, false);
free(list);
return m;
}
#define module_need_var(a,b,c) module_need_var(VLC_OBJECT(a),b,c)
VLC_API void module_unneed( vlc_object_t *, module_t * );
#define module_unneed(a,b) module_unneed(VLC_OBJECT(a),b)
/**
* Checks if a module exists.
*
* \param name name of the module
* \retval true if the module exists
* \retval false if the module does not exist (in the running installation)
*/
VLC_API bool module_exists(const char *) VLC_USED;
/**
* Get a pointer to a module_t given it's name.
*
* \param name the name of the module
* \return a pointer to the module or NULL in case of a failure
*/
VLC_API module_t *module_find(const char *name) VLC_USED;
/**
* Gets the table of module configuration items.
*
* \note Use module_config_free() to release the allocated memory.
*
* \param module the module
* \param psize the size of the configuration returned
* \return the configuration as an array
*/
VLC_API module_config_t *module_config_get(const module_t *module,
unsigned *restrict psize) VLC_USED;
/**
* Releases the configuration items table.
*
* \param tab base address of a table returned by module_config_get()
*/
VLC_API void module_config_free( module_config_t *tab);
VLC_API void module_list_free(module_t **);
VLC_API module_t ** module_list_get(size_t *n) VLC_USED;
/**
* Checks whether a module implements a capability.
*
* \param m the module
* \param cap the capability to check
* \retval true if the module has the capability
* \retval false if the module has another capability
*/
VLC_API bool module_provides(const module_t *m, const char *cap);
/**
* Gets the internal name of a module.
*
* \param m the module
* \return the module name
*/
VLC_API const char * module_get_object(const module_t *m) VLC_USED;
/**
* Gets the human-friendly name of a module.
*
* \param m the module
* \param longname TRUE to have the long name of the module
* \return the short or long name of the module
*/
VLC_API const char *module_get_name(const module_t *m, bool longname) VLC_USED;
#define module_GetLongName( m ) module_get_name( m, true )
/**
* Gets the help text for a module.
*
* \param m the module
* \return the help
*/
VLC_API const char *module_get_help(const module_t *m) VLC_USED;
/**
* Gets the capability string of a module.
*
* \param m the module
* \return the capability, or "none" if unspecified
*/
VLC_API const char *module_get_capability(const module_t *m) VLC_USED;
/**
* Gets the precedence of a module.
*
* \param m the module
* return the score for the capability
*/
VLC_API int module_get_score(const module_t *m) VLC_USED;
/**
* Translates a string using the module's text domain
*
* \param m the module
* \param s the American English ASCII string to localize
* \return the gettext-translated string
*/
VLC_API const char *module_gettext(const module_t *m, const char *s) VLC_USED;
VLC_USED static inline module_t *module_get_main (void)
{
return module_find ("core");
}
#define module_get_main(a) module_get_main()
VLC_USED static inline bool module_is_main( const module_t * p_module )
{
return !strcmp( module_get_object( p_module ), "core" );
}
#endif /* VLC_MODULES_H */