forked from videolan/vlc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
vlc_modules.h
254 lines (225 loc) · 8.17 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
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
/*****************************************************************************
* 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);
struct vlc_logger;
/*****************************************************************************
* Exported functions.
*****************************************************************************/
/**
* Finds the candidate modules for given criteria.
*
* All candidates modules having the specified capability and name will be
* sorted in decreasing order of priority and returned in a heap-allocated
* table.
*
* \param capability capability, i.e. class of module
* \param names string of comma-separated requested module shortcut names,
* or NULL for defaults
* \param strict whether to exclude modules with no unmatching shortcut names
* \param modules storage location for the base address of a sorted table
* of candidate modules (NULL on error) [OUT]
* \param strict_matches storage location for the count of strictly matched
* modules [OUT]
* \return number of modules found or a strictly negative value on error
*/
VLC_API
ssize_t vlc_module_match(const char *capability, const char *names,
bool strict, module_t ***restrict modules,
size_t *restrict strict_matches);
/**
* Maps a module in memory.
*
* This function attempts to map a given module in memory, if it is not
* already mapped. If it is already mapped, this function does nothing.
*
* \param log message logger
* \param mod module to map
*
* \return the module activation function on success, NULL on failure
*/
VLC_API
void *vlc_module_map(struct vlc_logger *log, module_t *mod);
/**
* 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 cap 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;
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);
if (unlikely(list == NULL))
return NULL;
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)
/**
* 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;
/**
* 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_USED static inline bool module_exists(const char * name)
{
return module_find(name) != NULL;
}
/**
* 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 a 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);
/**
* Frees a flat list of VLC modules.
*
* \param list list obtained by module_list_get()
*/
VLC_API void module_list_free(module_t **);
/**
* Gets the flat list of VLC modules.
*
* \param n [OUT] pointer to the number of modules
* \return table of module pointers (release with module_list_free()),
* or NULL in case of error (in that case, *n is zeroed).
*/
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_GetShortName( m ) module_get_name( m, false )
#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 help HTML for a module.
*
* \param m the module
* \return the help HTML
*/
VLC_API const char *module_get_help_html(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");
}
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 */