demux: mp4: only have unsigned pts offsets
[vlc.git] / include / vlc_modules.h
blob6dbb891240c0be4b8c77da63e5f330cc13161b9f
1 /*****************************************************************************
2 * vlc_modules.h : Module descriptor and load functions
3 *****************************************************************************
4 * Copyright (C) 2001-2011 VLC authors and VideoLAN
6 * Authors: Samuel Hocevar <sam@zoy.org>
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU Lesser General Public License as published by
10 * the Free Software Foundation; either version 2.1 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with this program; if not, write to the Free Software Foundation,
20 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21 *****************************************************************************/
23 #ifndef VLC_MODULES_H
24 #define VLC_MODULES_H 1
26 /**
27 * \file
28 * This file defines functions for modules in vlc
31 typedef int (*vlc_activate_t)(void *func, bool forced, va_list args);
32 struct vlc_logger;
34 /*****************************************************************************
35 * Exported functions.
36 *****************************************************************************/
38 /**
39 * Finds the candidate modules for given criteria.
41 * All candidates modules having the specified capability and name will be
42 * sorted in decreasing order of priority and returned in a heap-allocated
43 * table.
45 * \param capability capability, i.e. class of module
46 * \param names string of comma-separated requested module shortcut names,
47 * or NULL for defaults
48 * \param strict whether to exclude modules with no unmatching shortcut names
49 * \param modules storage location for the base address of a sorted table
50 * of candidate modules (NULL on error) [OUT]
51 * \param strict_matches storage location for the count of strictly matched
52 * modules [OUT]
53 * \return number of modules found or a strictly negative value on error
55 VLC_API
56 ssize_t vlc_module_match(const char *capability, const char *names,
57 bool strict, module_t ***restrict modules,
58 size_t *restrict strict_matches);
60 /**
61 * Maps a module in memory.
63 * This function attempts to map a given module in memory, if it is not
64 * already mapped. If it is already mapped, this function does nothing.
66 * \param log message logger
67 * \param mod module to map
69 * \return the module activation function on success, NULL on failure
71 VLC_API
72 void *vlc_module_map(struct vlc_logger *log, module_t *mod);
74 /**
75 * Finds and instantiates the best module of a certain type.
76 * All candidates modules having the specified capability and name will be
77 * sorted in decreasing order of priority. Then the probe callback will be
78 * invoked for each module, until it succeeds (returns 0), or all candidate
79 * module failed to initialize.
81 * The probe callback first parameter is the address of the module entry point.
82 * Further parameters are passed as an argument list; it corresponds to the
83 * variable arguments passed to this function. This scheme is meant to
84 * support arbitrary prototypes for the module entry point.
86 * \param log logger for debugging (or NULL to ignore)
87 * \param capability capability, i.e. class of module
88 * \param name name of the module asked, if any
89 * \param strict if true, do not fallback to plugin with a different name
90 * but the same capability
91 * \param probe module probe callback
92 * \return the module or NULL in case of a failure
94 VLC_API module_t *vlc_module_load(struct vlc_logger *log, const char *cap,
95 const char *name, bool strict,
96 vlc_activate_t probe, ... ) VLC_USED;
97 #ifndef __cplusplus
98 #define vlc_module_load(ctx, cap, name, strict, ...) \
99 _Generic ((ctx), \
100 struct vlc_logger *: \
101 vlc_module_load((void *)(ctx), cap, name, strict, __VA_ARGS__), \
102 void *: \
103 vlc_module_load((void *)(ctx), cap, name, strict, __VA_ARGS__), \
104 default: \
105 vlc_module_load(vlc_object_logger((vlc_object_t *)(ctx)), cap, \
106 name, strict, __VA_ARGS__))
107 #endif
109 VLC_API module_t * module_need( vlc_object_t *, const char *, const char *, bool ) VLC_USED;
110 #define module_need(a,b,c,d) module_need(VLC_OBJECT(a),b,c,d)
112 VLC_USED
113 static inline module_t *module_need_var(vlc_object_t *obj, const char *cap,
114 const char *varname)
116 char *list = var_InheritString(obj, varname);
117 module_t *m = module_need(obj, cap, list, false);
119 free(list);
120 return m;
122 #define module_need_var(a,b,c) module_need_var(VLC_OBJECT(a),b,c)
124 VLC_API void module_unneed( vlc_object_t *, module_t * );
125 #define module_unneed(a,b) module_unneed(VLC_OBJECT(a),b)
128 * Checks if a module exists.
130 * \param name name of the module
131 * \retval true if the module exists
132 * \retval false if the module does not exist (in the running installation)
134 VLC_API bool module_exists(const char *) VLC_USED;
137 * Get a pointer to a module_t given it's name.
139 * \param name the name of the module
140 * \return a pointer to the module or NULL in case of a failure
142 VLC_API module_t *module_find(const char *name) VLC_USED;
145 * Gets the table of module configuration items.
147 * \note Use module_config_free() to release the allocated memory.
149 * \param module the module
150 * \param psize the size of the configuration returned
151 * \return the configuration as an array
153 VLC_API module_config_t *module_config_get(const module_t *module,
154 unsigned *restrict psize) VLC_USED;
157 * Releases the configuration items table.
159 * \param tab base address of a table returned by module_config_get()
161 VLC_API void module_config_free( module_config_t *tab);
163 VLC_API void module_list_free(module_t **);
164 VLC_API module_t ** module_list_get(size_t *n) VLC_USED;
167 * Checks whether a module implements a capability.
169 * \param m the module
170 * \param cap the capability to check
171 * \retval true if the module has the capability
172 * \retval false if the module has another capability
174 VLC_API bool module_provides(const module_t *m, const char *cap);
177 * Gets the internal name of a module.
179 * \param m the module
180 * \return the module name
182 VLC_API const char * module_get_object(const module_t *m) VLC_USED;
185 * Gets the human-friendly name of a module.
187 * \param m the module
188 * \param longname TRUE to have the long name of the module
189 * \return the short or long name of the module
191 VLC_API const char *module_get_name(const module_t *m, bool longname) VLC_USED;
192 #define module_GetLongName( m ) module_get_name( m, true )
195 * Gets the help text for a module.
197 * \param m the module
198 * \return the help
200 VLC_API const char *module_get_help(const module_t *m) VLC_USED;
203 * Gets the capability string of a module.
205 * \param m the module
206 * \return the capability, or "none" if unspecified
208 VLC_API const char *module_get_capability(const module_t *m) VLC_USED;
211 * Gets the precedence of a module.
213 * \param m the module
214 * return the score for the capability
216 VLC_API int module_get_score(const module_t *m) VLC_USED;
219 * Translates a string using the module's text domain
221 * \param m the module
222 * \param s the American English ASCII string to localize
223 * \return the gettext-translated string
225 VLC_API const char *module_gettext(const module_t *m, const char *s) VLC_USED;
227 VLC_USED static inline module_t *module_get_main (void)
229 return module_find ("core");
231 #define module_get_main(a) module_get_main()
233 VLC_USED static inline bool module_is_main( const module_t * p_module )
235 return !strcmp( module_get_object( p_module ), "core" );
238 #endif /* VLC_MODULES_H */