Android VLC - vlc_module_begin

 

 

 

#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()函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值