1. 程式人生 > >VLC 模組構造巨集的展開(access_output_http為例)

VLC 模組構造巨集的展開(access_output_http為例)

巨集的定義:

vlc_module_begin ()
    set_description( N_("HTTP stream output") )
    set_capability( "sout access", 0 )
    set_shortname( "HTTP" )
    add_shortcut( "http", "https", "mmsh" )
    set_category( CAT_SOUT )
    set_subcategory( SUBCAT_SOUT_ACO )
    add_string( SOUT_CFG_PREFIX "user", "",
                USER_TEXT, USER_LONGTEXT, true )
    add_password( SOUT_CFG_PREFIX "pwd", "",
                  PASS_TEXT, PASS_LONGTEXT, true )
    add_string( SOUT_CFG_PREFIX "mime", "",
                MIME_TEXT, MIME_LONGTEXT, true )
    add_bool( SOUT_CFG_PREFIX "metacube", false,
              METACUBE_TEXT, METACUBE_LONGTEXT, true )
    set_callbacks( Open, Close )
vlc_module_end ()

巨集展開後:展開方式,VS中屬性-〉C/C++/前處理器:預處理到檔案 選擇 是 編譯後在相應的工程檔案目錄下有*.i檔案,從中可取出以下巨集的展開部分。例子裡是VLC2.2.6

plugins/access_output/access_output_http.c
__declspec(dllexport) int __cdecl vlc_entry__2_2_0b (vs_cb vs, void *op) {
    module_t *module;     module_cf_t *cf = ((void *)0);
    if (vs (op, ((void *)0), VLC_MODULE_CREATE

, &module)) goto error;
    if (vs (op, module, VLC_MODULE_NAME, ("access_output_http"))) goto error;
    if (vs (op, module, VLC_MODULE_DESCRIPTION, (("HTTP stream output")))) goto error;
    if (vs (op, module, VLC_MODULE_CAPABILITY, ("sout access")) || vs (op, module, VLC_MODULE_SCORE, (int)(0))) goto error;
    if (vs (op, module, VLC_MODULE_SHORTNAME,
("HTTP"))) goto error;
    const char *shortcuts[] = { "http", "https", "mmsh" };
    if (vs (op, module, VLC_MODULE_SHORTCUT, sizeof(shortcuts)/sizeof(shortcuts[0]), shortcuts)) goto error;
    vs (op, ((void *)0), VLC_CONFIG_CREATE, (0x06) CONFIG_CATEGORY, &cf);
    vs (op, cf, VLC_CONFIG_VALUE, (int64_t)(5) CAT_SOUT);
    vs (op, ((void *)0), VLC_CONFIG_CREATE, (0x07) CONFIG_SUBCATEGORY, &cf);
    vs (op, cf, VLC_CONFIG_VALUE, (int64_t)(504) SUBCAT_SOUT_ACO);

    vs (op, ((void *)0), VLC_CONFIG_CREATE, (0x80) CONFIG_ITEM_STRING, &cf);
    vs (op, cf, VLC_CONFIG_DESC, (("Username")), (("User name memo.")));if (1) vs (op, cf, VLC_CONFIG_ADVANCED);
    vs (op, cf, VLC_CONFIG_NAME, ("sout-http-user"));vs (op, cf, VLC_CONFIG_VALUE, (""));

    vs (op, ((void *)0), VLC_CONFIG_CREATE, (0x81) CONFIG_ITEM_PASSWORD, &cf);
    vs (op, cf, VLC_CONFIG_DESC, (("Password")), (("Password memo.")));if (1) vs (op, cf, VLC_CONFIG_ADVANCED);
    vs (op, cf, VLC_CONFIG_NAME, ("sout-http-pwd"));vs (op, cf, VLC_CONFIG_VALUE, (""));

    vs (op, ((void *)0), VLC_CONFIG_CREATE, (0x80) CONFIG_ITEM_STRING, &cf);
    vs (op, cf, VLC_CONFIG_DESC, (("Mime")), (("MIME memo.")));if (1) vs (op, cf, VLC_CONFIG_ADVANCED);
    vs (op, cf, VLC_CONFIG_NAME, ("sout-http-mime"));vs (op, cf, VLC_CONFIG_VALUE, (""));

    vs (op, ((void *)0), VLC_CONFIG_CREATE, (0x60) CONFIG_ITEM_BOOL, &cf);
    vs (op, cf, VLC_CONFIG_DESC, (("Metacube")), (("Metacube memo.")));if (1) vs (op, cf, VLC_CONFIG_ADVANCED);
    vs (op, cf, VLC_CONFIG_NAME, ("sout-http-metacube"));if (0) vs (op, cf, VLC_CONFIG_VALUE, (int64_t)1);

    if (vs (op, module, VLC_MODULE_CB_OPEN, Open) || vs (op, module, VLC_MODULE_CB_CLOSE, Close)) goto error;
    return 0;
error: return -1;
}