#define vlc_module_begin() \
EXTERN_SYMBOL DLL_SYMBOL \
int CDECL_SYMBOL __VLC_SYMBOL(vlc_entry) (vlc_set_cb, void *); \
EXTERN_SYMBOL DLL_SYMBOL \
int CDECL_SYMBOL __VLC_SYMBOL(vlc_entry) (vlc_set_cb vlc_set, void *opaque) \
{ \
module_t *module; \
module_config_t *config = NULL; \
if (vlc_plugin_set (VLC_MODULE_CREATE, &module)) \
goto error; \
if (vlc_module_set (VLC_MODULE_NAME, (MODULE_STRING))) \
goto error;
#define vlc_module_end() \
(void) config; \
return 0; \
error: \
return -1; \
} \
VLC_METADATA_EXPORTS
以gles2 模块为例说明
#define vlc_module_begin() 宏展开如下:
extern "C" int vlc_entry__gles2(vlc_set_cb, void*);
extern "C" int vlc_entry__gles2(vlc_set_cb vlc_set, void *opaque)
{
module_t *module;
module_config_t *config = NULL;
if(vlc_set(opaque, NULL, VLC_MODULE_CREATE, &module) goto error;
if(vlc_set(opaque, module, VLC_MODULE_NAME, "gles2") goto error;
#define vlc_module_end() 展开如下:
(void)config;
return 0;
error:
return -1;
}
vlc_module_begin ()
set_shortname (N_("EGL"))
set_description (N_("EGL extension for OpenGL"))
set_category (CAT_VIDEO)
set_subcategory (SUBCAT_VIDEO_VOUT)
set_capability ("opengl", 50)
set_callbacks (OpenGL, Close)
add_shortcut ("egl")
add_submodule ()
set_capability ("opengl es2", 50)
set_callbacks (OpenGLES2, Close)
add_shortcut ("egl")
add_submodule ()
set_capability ("opengl es", 50)
set_callbacks (OpenGLES, Close)
add_shortcut ("egl")
vlc_module_end ()
将展开为:
extern "C" int vlc_entry__gles2(vlc_set_cb, void*);
extern "C" int vlc_entry__gles2(vlc_set_cb vlc_set, void *opaque)
{
module_t *module;
module_config_t *config = NULL;
if(vlc_set(opaque, NULL, VLC_MODULE_CREATE, &module) goto error;
if(vlc_set(opaque, module, VLC_MODULE_NAME, (MODULE_STRING)) goto error;
if(vlc_set(opaque, module, VLC_MODULE_SHORTNAME, "EGL") goto error;
if(vlc_set(opaque, module, VLC_MODULE_DESCRIPTION, "EGL extension for OpenGL") goto error;
if(vlc_set(opaque, NULL, VLC_CONFIG_CREATE, CONFIG_CATEGORY, &config) goto error;
if(vlc_set(opaque, config, VLC_CONFIG_VALUE, CAT_VIDEO) goto error;
if(vlc_set(opaque, NULL, VLC_CONFIG_CREATE, CONFIG_SUBCATEGORY, &config) goto error;
if(vlc_set(opaque, config, VLC_CONFIG_VALUE, SUBCAT_VIDEO_VOUT) goto error;
if((vlc_set(opaque, module, VLC_MODULE_CAPABILITY, "opengl")
|| (vlc_set(opaque, module, VLC_MODULE_SCORE, 50))goto error;
if((vlc_set(opaque, module, VLC_MODULE_CB_OPEN, OpenGL)
|| (vlc_set(opaque, module, VLC_MODULE_CB_CLOSE, Close)) goto error;
{
const char *shortcuts[] = { "egl" };
if(vlc_set(opaque, module, VLC_MODULE_SHORTCUT,
sizeof(shortcuts)/sizeof(shortcuts[0]), shortcuts) goto error;
}
if(vlc_set(opaque, NULL, VLC_MODULE_CREATE, &module) goto error;
if((vlc_set(opaque, module, VLC_MODULE_CAPABILITY, "opengl es2")
|| (vlc_set(opaque, module, VLC_MODULE_SCORE, 50))goto error;
if((vlc_set(opaque, module, VLC_MODULE_CB_OPEN, OpenGLES2)
|| (vlc_set(opaque, module, VLC_MODULE_CB_CLOSE, Close)) goto error;
{
const char *shortcuts[] = { "egl" };
if(vlc_set(opaque, module, VLC_MODULE_SHORTCUT,
sizeof(shortcuts)/sizeof(shortcuts[0]), shortcuts) goto error;
}
if((vlc_set(opaque, module, VLC_MODULE_CAPABILITY, "opengl es")
|| (vlc_set(opaque, module, VLC_MODULE_SCORE, 50))goto error;
if((vlc_set(opaque, module, VLC_MODULE_CB_OPEN, OpenGLES)
|| (vlc_set(opaque, module, VLC_MODULE_CB_CLOSE, Close)) goto error;
{
const char *shortcuts[] = { "egl" };
if(vlc_set(opaque, module, VLC_MODULE_SHORTCUT,
sizeof(shortcuts)/sizeof(shortcuts[0]), shortcuts) goto error;
}
(void)config;
return 0;
error:
return -1;
}
注:下面是 Plugin Load 函数
module_t *vlc_plugin_describe (vlc_plugin_cb entry)
{
module_t *module = NULL;
if (entry (vlc_plugin_setter, &module) != 0)
{
if (module != NULL) /* partially initialized plug-in... */
vlc_module_destroy (module);
module = NULL;
}
return module;
}
上述vlc_plugin_cb entry 是 vlc_entry__gles2之类的函数
因此vlc_set 实际上指向vlc_plugin_setter()函数