vlc_plugin.h 18.9 KB
Newer Older
1
/*****************************************************************************
2
 * vlc_plugin.h : Macros used from within a module.
3
 *****************************************************************************
Jean-Baptiste Kempf's avatar
LGPL  
Jean-Baptiste Kempf committed
4
 * Copyright (C) 2001-2006 VLC authors and VideoLAN
5
 * Copyright © 2007-2009 Rémi Denis-Courmont
6 7
 *
 * Authors: Samuel Hocevar <sam@zoy.org>
8
 *
Jean-Baptiste Kempf's avatar
LGPL  
Jean-Baptiste Kempf committed
9 10 11
 * 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
12 13 14 15
 * (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
Jean-Baptiste Kempf's avatar
LGPL  
Jean-Baptiste Kempf committed
16 17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
18
 *
Jean-Baptiste Kempf's avatar
LGPL  
Jean-Baptiste Kempf committed
19 20 21
 * 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.
22 23
 *****************************************************************************/

24 25 26
#ifndef LIBVLC_MODULES_MACROS_H
# define LIBVLC_MODULES_MACROS_H 1

27 28 29 30 31
/**
 * \file
 * This file implements plugin (module) macros used to define a vlc module.
 */

32 33
enum vlc_module_properties
{
34
    VLC_MODULE_CREATE,
35 36
    VLC_CONFIG_CREATE,

37 38
    /* DO NOT EVER REMOVE, INSERT OR REPLACE ANY ITEM! It would break the ABI!
     * Append new items at the end ONLY. */
39
    VLC_MODULE_CPU_REQUIREMENT=0x100,
40 41 42 43 44 45 46 47 48 49
    VLC_MODULE_SHORTCUT,
    VLC_MODULE_CAPABILITY,
    VLC_MODULE_SCORE,
    VLC_MODULE_CB_OPEN,
    VLC_MODULE_CB_CLOSE,
    VLC_MODULE_NO_UNLOAD,
    VLC_MODULE_NAME,
    VLC_MODULE_SHORTNAME,
    VLC_MODULE_DESCRIPTION,
    VLC_MODULE_HELP,
50
    VLC_MODULE_TEXTDOMAIN,
51
    /* Insert new VLC_MODULE_* here */
52 53 54

    /* DO NOT EVER REMOVE, INSERT OR REPLACE ANY ITEM! It would break the ABI!
     * Append new items at the end ONLY. */
55
    VLC_CONFIG_NAME=0x1000,
56
    /* command line name (args=const char *) */
57 58 59 60 61 62 63 64 65 66 67 68 69

    VLC_CONFIG_VALUE,
    /* actual value (args=int/double/const char *) */

    VLC_CONFIG_RANGE,
    /* minimum value (args=int/double/const char * twice) */

    VLC_CONFIG_ADVANCED,
    /* enable advanced flag (args=none) */

    VLC_CONFIG_VOLATILE,
    /* don't write variable to storage (args=none) */

70 71
    VLC_CONFIG_PERSISTENT_OBSOLETE,
    /* unused (ignored) */
72 73 74 75 76 77 78 79 80 81 82 83 84

    VLC_CONFIG_PRIVATE,
    /* hide from user (args=none) */

    VLC_CONFIG_REMOVED,
    /* tag as no longer supported (args=none) */

    VLC_CONFIG_CAPABILITY,
    /* capability for a module or list thereof (args=const char*) */

    VLC_CONFIG_SHORTCUT,
    /* one-character (short) command line option name (args=char) */

85 86
    VLC_CONFIG_OLDNAME_OBSOLETE,
    /* unused (ignored) */
87 88 89 90 91 92 93

    VLC_CONFIG_SAFE,
    /* tag as modifiable by untrusted input item "sources" (args=none) */

    VLC_CONFIG_DESC,
    /* description (args=const char *, const char *, const char *) */

94 95
    VLC_CONFIG_LIST_OBSOLETE,
    /* unused (ignored) */
96

97 98
    VLC_CONFIG_ADD_ACTION_OBSOLETE,
    /* unused (ignored) */
99

100 101 102 103 104 105 106
    VLC_CONFIG_LIST,
    /* list of suggested values
     * (args=size_t, const <type> *, const char *const *) */

    VLC_CONFIG_LIST_CB,
    /* callback for suggested values (args=size_t (*)(<type> **, char ***)) */

107
    /* Insert new VLC_CONFIG_* here */
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
/* Configuration hint types */
#define CONFIG_HINT_CATEGORY                0x02  /* Start of new category */
#define CONFIG_HINT_SUBCATEGORY             0x03  /* Start of sub-category */
#define CONFIG_HINT_SUBCATEGORY_END         0x04  /* End of sub-category */
#define CONFIG_HINT_USAGE                   0x05  /* Usage information */

#define CONFIG_CATEGORY                     0x06 /* Set category */
#define CONFIG_SUBCATEGORY                  0x07 /* Set subcategory */
#define CONFIG_SECTION                      0x08 /* Start of new section */

/* Configuration item types */
#define CONFIG_ITEM_FLOAT                   0x20  /* Float option */
#define CONFIG_ITEM_INTEGER                 0x40  /* Integer option */
#define CONFIG_ITEM_RGB                     0x41  /* RGB color option */
#define CONFIG_ITEM_BOOL                    0x60  /* Bool option */
#define CONFIG_ITEM_STRING                  0x80  /* String option */
#define CONFIG_ITEM_PASSWORD                0x81  /* Password option (*) */
#define CONFIG_ITEM_KEY                     0x82  /* Hot key option */
#define CONFIG_ITEM_MODULE                  0x84  /* Module option */
#define CONFIG_ITEM_MODULE_CAT              0x85  /* Module option */
#define CONFIG_ITEM_MODULE_LIST             0x86  /* Module option */
#define CONFIG_ITEM_MODULE_LIST_CAT         0x87  /* Module option */
#define CONFIG_ITEM_LOADFILE                0x8C  /* Read file option */
#define CONFIG_ITEM_SAVEFILE                0x8D  /* Written file option */
#define CONFIG_ITEM_DIRECTORY               0x8E  /* Directory option */
#define CONFIG_ITEM_FONT                    0x8F  /* Font option */

#define CONFIG_ITEM(x) (((x) & ~0xF) != 0)

/* Categories and subcategories */
#define CAT_INTERFACE 1
#define SUBCAT_INTERFACE_GENERAL 101
#define SUBCAT_INTERFACE_MAIN 102
#define SUBCAT_INTERFACE_CONTROL 103
#define SUBCAT_INTERFACE_HOTKEYS 104

#define CAT_AUDIO 2
#define SUBCAT_AUDIO_GENERAL 201
#define SUBCAT_AUDIO_AOUT 202
#define SUBCAT_AUDIO_AFILTER 203
#define SUBCAT_AUDIO_VISUAL 204
#define SUBCAT_AUDIO_MISC 205

#define CAT_VIDEO 3
#define SUBCAT_VIDEO_GENERAL 301
#define SUBCAT_VIDEO_VOUT 302
#define SUBCAT_VIDEO_VFILTER 303
#define SUBCAT_VIDEO_TEXT 304
#define SUBCAT_VIDEO_SUBPIC 305
#define SUBCAT_VIDEO_VFILTER2 306

#define CAT_INPUT 4
#define SUBCAT_INPUT_GENERAL 401
#define SUBCAT_INPUT_ACCESS 402
#define SUBCAT_INPUT_DEMUX 403
#define SUBCAT_INPUT_VCODEC 404
#define SUBCAT_INPUT_ACODEC 405
#define SUBCAT_INPUT_SCODEC 406
#define SUBCAT_INPUT_STREAM_FILTER 407

#define CAT_SOUT 5
#define SUBCAT_SOUT_GENERAL 501
#define SUBCAT_SOUT_STREAM 502
#define SUBCAT_SOUT_MUX 503
#define SUBCAT_SOUT_ACO 504
#define SUBCAT_SOUT_PACKETIZER 505
#define SUBCAT_SOUT_SAP 506
#define SUBCAT_SOUT_VOD 507

#define CAT_ADVANCED 6
#define SUBCAT_ADVANCED_CPU 601
#define SUBCAT_ADVANCED_MISC 602
#define SUBCAT_ADVANCED_NETWORK 603
#define SUBCAT_ADVANCED_XML 604

#define CAT_PLAYLIST 7
#define SUBCAT_PLAYLIST_GENERAL 701
#define SUBCAT_PLAYLIST_SD 702
#define SUBCAT_PLAYLIST_EXPORT 703

#define CAT_OSD 8
#define SUBCAT_OSD_IMPORT 801


194 195 196
/**
 * Current plugin ABI version
 */
197 198
# define MODULE_SYMBOL 2_1_0a
# define MODULE_SUFFIX "__2_1_0a"
199 200 201 202 203 204 205

/*****************************************************************************
 * Add a few defines. You do not want to read this section. Really.
 *****************************************************************************/

/* Explanation:
 *
206
 * if linking a module statically, we will need:
207 208 209 210 211
 * #define MODULE_FUNC( zog ) module_foo_zog
 *
 * this can't easily be done with the C preprocessor, thus a few ugly hacks.
 */

212
/* I need to do _this_ to change « foo bar » to « module_foo_bar » ! */
213 214 215 216 217 218 219 220 221 222 223
#define CONCATENATE( y, z ) CRUDE_HACK( y, z )
#define CRUDE_HACK( y, z )  y##__##z

/* If the module is built-in, then we need to define foo_InitModule instead
 * of InitModule. Same for Activate- and DeactivateModule. */
#ifdef __PLUGIN__
#   define __VLC_SYMBOL( symbol  ) CONCATENATE( symbol, MODULE_SYMBOL )
#else
#   define __VLC_SYMBOL( symbol )  CONCATENATE( symbol, MODULE_NAME )
#endif

224 225 226
#define CDECL_SYMBOL
#if defined (__PLUGIN__)
# if defined (WIN32)
227
#   define DLL_SYMBOL              __declspec(dllexport)
228
#   undef CDECL_SYMBOL
229
#   define CDECL_SYMBOL            __cdecl
230
# elif VLC_GCC_VERSION(4,0)
231 232 233 234
#   define DLL_SYMBOL              __attribute__((visibility("default")))
# else
#  define DLL_SYMBOL
# endif
235
#else
236
# define DLL_SYMBOL
237 238 239 240 241 242 243 244
#endif

#if defined( __cplusplus )
#   define EXTERN_SYMBOL           extern "C"
#else
#   define EXTERN_SYMBOL
#endif

245 246 247 248 249 250
typedef int (*vlc_set_cb) (void *, void *, int, ...);

#define vlc_plugin_set(...) vlc_set (opaque,   NULL, __VA_ARGS__)
#define vlc_module_set(...) vlc_set (opaque, module, __VA_ARGS__)
#define vlc_config_set(...) vlc_set (opaque, config, __VA_ARGS__)

251 252 253 254 255 256
/*
 * InitModule: this function is called once and only once, when the module
 * is looked at for the first time. We get the useful data from it, for
 * instance the module name, its shortcuts, its capabilities... we also create
 * a copy of its config because the module can be unloaded at any time.
 */
257 258
#define vlc_module_begin() \
EXTERN_SYMBOL DLL_SYMBOL \
259
int CDECL_SYMBOL __VLC_SYMBOL(vlc_entry) (vlc_set_cb, void *); \
260
EXTERN_SYMBOL DLL_SYMBOL \
261
int CDECL_SYMBOL __VLC_SYMBOL(vlc_entry) (vlc_set_cb vlc_set, void *opaque) \
262
{ \
263 264 265
    module_t *module; \
    module_config_t *config = NULL; \
    if (vlc_plugin_set (VLC_MODULE_CREATE, &module)) \
266
        goto error; \
267 268
    if (vlc_module_set (VLC_MODULE_NAME, (MODULE_STRING))) \
        goto error;
269 270

#define vlc_module_end() \
271 272
    (void) config; \
    return 0; \
273
error: \
274
    return -1; \
275 276
} \
VLC_METADATA_EXPORTS
277 278

#define add_submodule( ) \
279
    if (vlc_plugin_set (VLC_MODULE_CREATE, &module)) \
280
        goto error;
281

282
#define add_shortcut( ... ) \
283 284
{ \
    const char *shortcuts[] = { __VA_ARGS__ }; \
285
    if (vlc_module_set (VLC_MODULE_SHORTCUT, \
286 287 288
                        sizeof(shortcuts)/sizeof(shortcuts[0]), shortcuts)) \
        goto error; \
}
289 290

#define set_shortname( shortname ) \
291
    if (vlc_module_set (VLC_MODULE_SHORTNAME, (const char *)(shortname))) \
292
        goto error;
293 294

#define set_description( desc ) \
295
    if (vlc_module_set (VLC_MODULE_DESCRIPTION, (const char *)(desc))) \
296
        goto error;
297 298

#define set_help( help ) \
299
    if (vlc_module_set (VLC_MODULE_HELP, (const char *)(help))) \
300
        goto error;
301 302

#define set_capability( cap, score ) \
303 304
    if (vlc_module_set (VLC_MODULE_CAPABILITY, (const char *)(cap)) \
     || vlc_module_set (VLC_MODULE_SCORE, (int)(score))) \
305
        goto error;
306 307

#define set_callbacks( activate, deactivate ) \
308 309
    if (vlc_module_set (VLC_MODULE_CB_OPEN, activate) \
     || vlc_module_set (VLC_MODULE_CB_CLOSE, deactivate)) \
310
        goto error;
311

312
#define cannot_unload_broken_library( ) \
313
    if (vlc_module_set (VLC_MODULE_NO_UNLOAD)) \
314
        goto error;
315

316
#define set_text_domain( dom ) \
317
    if (vlc_plugin_set (VLC_MODULE_TEXTDOMAIN, (dom))) \
318
        goto error;
319

320 321 322 323 324 325 326 327 328 329 330 331 332 333
/*****************************************************************************
 * Macros used to build the configuration structure.
 *
 * Note that internally we support only 3 types of config data: int, float
 *   and string.
 *   The other types declared here just map to one of these 3 basic types but
 *   have the advantage of also providing very good hints to a configuration
 *   interface so as to make it more user friendly.
 * The configuration structure also includes category hints. These hints can
 *   provide a configuration interface with some very useful data and again
 *   allow for a more user friendly interface.
 *****************************************************************************/

#define add_type_inner( type ) \
334
    vlc_plugin_set (VLC_CONFIG_CREATE, (type), &config);
335 336

#define add_typedesc_inner( type, text, longtext ) \
337
    add_type_inner( type ) \
338
    vlc_config_set (VLC_CONFIG_DESC, \
339
                    (const char *)(text), (const char *)(longtext));
340 341

#define add_typeadv_inner( type, text, longtext, advc ) \
342
    add_typedesc_inner( type, text, longtext ) \
343
    if (advc) vlc_config_set (VLC_CONFIG_ADVANCED);
344

345
#define add_typename_inner( type, name, text, longtext, advc ) \
346
    add_typeadv_inner( type, text, longtext, advc ) \
347
    vlc_config_set (VLC_CONFIG_NAME, (const char *)(name));
348

349 350
#define add_string_inner( type, name, text, longtext, advc, v ) \
    add_typename_inner( type, name, text, longtext, advc ) \
351
    vlc_config_set (VLC_CONFIG_VALUE, (const char *)(v));
352

353 354
#define add_int_inner( type, name, text, longtext, advc, v ) \
    add_typename_inner( type, name, text, longtext, advc ) \
355
    vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(v));
356 357 358


#define set_category( i_id ) \
359
    add_type_inner( CONFIG_CATEGORY ) \
360
    vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(i_id));
361 362

#define set_subcategory( i_id ) \
363
    add_type_inner( CONFIG_SUBCATEGORY ) \
364
    vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(i_id));
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380

#define set_section( text, longtext ) \
    add_typedesc_inner( CONFIG_SECTION, text, longtext )

#define add_category_hint( text, longtext, advc ) \
    add_typeadv_inner( CONFIG_HINT_CATEGORY, text, longtext, advc )

#define add_subcategory_hint( text, longtext ) \
    add_typedesc_inner( CONFIG_HINT_SUBCATEGORY, text, longtext )

#define end_subcategory_hint \
    add_type_inner( CONFIG_HINT_SUBCATEGORY_END )

#define add_usage_hint( text ) \
    add_typedesc_inner( CONFIG_HINT_USAGE, text, NULL )

381
#define add_string( name, value, text, longtext, advc ) \
382
    add_string_inner( CONFIG_ITEM_STRING, name, text, longtext, advc, \
383
                      value )
384

385
#define add_password( name, value, text, longtext, advc ) \
386
    add_string_inner( CONFIG_ITEM_PASSWORD, name, text, longtext, advc, \
387
                      value )
388

389
#define add_loadfile( name, value, text, longtext, advc ) \
390
    add_string_inner( CONFIG_ITEM_LOADFILE, name, text, longtext, advc, \
391
                      value )
392

393
#define add_savefile( name, value, text, longtext, advc ) \
394
    add_string_inner( CONFIG_ITEM_SAVEFILE, name, text, longtext, advc, \
395
                      value )
396

397
#define add_directory( name, value, text, longtext, advc ) \
398
    add_string_inner( CONFIG_ITEM_DIRECTORY, name, text, longtext, advc, \
399
                      value )
400

401
#define add_font( name, value, text, longtext, advc )\
402
    add_string_inner( CONFIG_ITEM_FONT, name, text, longtext, advc, \
403
                      value )
404

405
#define add_module( name, psz_caps, value, text, longtext, advc ) \
406
    add_string_inner( CONFIG_ITEM_MODULE, name, text, longtext, advc, \
407
                      value ) \
408
    vlc_config_set (VLC_CONFIG_CAPABILITY, (const char *)(psz_caps));
409

410
#define add_module_list( name, psz_caps, value, text, longtext, advc ) \
411
    add_string_inner( CONFIG_ITEM_MODULE_LIST, name, text, longtext, advc, \
412
                      value ) \
413
    vlc_config_set (VLC_CONFIG_CAPABILITY, (const char *)(psz_caps));
414 415

#ifndef __PLUGIN__
416
#define add_module_cat( name, i_subcategory, value, text, longtext, advc ) \
417
    add_string_inner( CONFIG_ITEM_MODULE_CAT, name, text, longtext, advc, \
418
                      value ) \
419
    change_integer_range (i_subcategory /* gruik */, 0);
420

421
#define add_module_list_cat( name, i_subcategory, value, text, longtext, advc ) \
422
    add_string_inner( CONFIG_ITEM_MODULE_LIST_CAT, name, text, longtext, \
423
                      advc, value ) \
424
    change_integer_range (i_subcategory /* gruik */, 0);
425 426
#endif

427
#define add_integer( name, value, text, longtext, advc ) \
428
    add_int_inner( CONFIG_ITEM_INTEGER, name, text, longtext, advc, value )
429

430 431 432 433
#define add_rgb( name, value, text, longtext, advc ) \
    add_int_inner( CONFIG_ITEM_RGB, name, text, longtext, advc, value ) \
    change_integer_range( 0, 0xFFFFFF )

434
#define add_key( name, value, text, longtext, advc ) \
435
    add_string_inner( CONFIG_ITEM_KEY, "global-" name, text, longtext, advc, \
436
                   KEY_UNSET ) \
437
    add_string_inner( CONFIG_ITEM_KEY, name, text, longtext, advc, value )
438

439
#define add_integer_with_range( name, value, i_min, i_max, text, longtext, advc ) \
440
    add_integer( name, value, text, longtext, advc ) \
441 442
    change_integer_range( i_min, i_max )

443
#define add_float( name, v, text, longtext, advc ) \
444
    add_typename_inner( CONFIG_ITEM_FLOAT, name, text, longtext, advc ) \
445
    vlc_config_set (VLC_CONFIG_VALUE, (double)(v));
446

447
#define add_float_with_range( name, value, f_min, f_max, text, longtext, advc ) \
448
    add_float( name, value, text, longtext, advc ) \
449 450
    change_float_range( f_min, f_max )

451
#define add_bool( name, v, text, longtext, advc ) \
452
    add_typename_inner( CONFIG_ITEM_BOOL, name, text, longtext, advc ) \
453
    if (v) vlc_config_set (VLC_CONFIG_VALUE, (int64_t)true);
454 455 456

/* For removed option */
#define add_obsolete_inner( name, type ) \
457
    add_type_inner( type ) \
458 459
    vlc_config_set (VLC_CONFIG_NAME, (const char *)(name)); \
    vlc_config_set (VLC_CONFIG_REMOVED);
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475

#define add_obsolete_bool( name ) \
        add_obsolete_inner( name, CONFIG_ITEM_BOOL )

#define add_obsolete_integer( name ) \
        add_obsolete_inner( name, CONFIG_ITEM_INTEGER )

#define add_obsolete_float( name ) \
        add_obsolete_inner( name, CONFIG_ITEM_FLOAT )

#define add_obsolete_string( name ) \
        add_obsolete_inner( name, CONFIG_ITEM_STRING )

/* Modifier macros for the config options (used for fine tuning) */

#define change_short( ch ) \
476
    vlc_config_set (VLC_CONFIG_SHORTCUT, (int)(ch));
477

478
#define change_string_list( list, list_text ) \
479
    vlc_config_set (VLC_CONFIG_LIST, \
480 481
                    (size_t)(sizeof (list) / sizeof (char *)), \
                    (const char *const *)(list), \
482
                    (const char *const *)(list_text));
483 484

#define change_string_cb( cb ) \
485
    vlc_config_set (VLC_CONFIG_LIST_CB, (cb));
486

487
#define change_integer_list( list, list_text ) \
488
    vlc_config_set (VLC_CONFIG_LIST, \
489 490
                    (size_t)(sizeof (list) / sizeof (int)), \
                    (const int *)(list), \
491
                    (const char *const *)(list_text));
492 493

#define change_integer_range( minv, maxv ) \
494
    vlc_config_set (VLC_CONFIG_RANGE, (int64_t)(minv), (int64_t)(maxv));
495 496

#define change_float_range( minv, maxv ) \
497
    vlc_config_set (VLC_CONFIG_RANGE, (double)(minv), (double)(maxv));
498 499

#define change_action_add( pf_action, text ) \
500
    (void)(pf_action, text);
501

502 503
/* For options that are saved but hidden from the preferences panel */
#define change_private() \
504
    vlc_config_set (VLC_CONFIG_PRIVATE);
505 506 507 508

/* For options that cannot be saved in the configuration */
#define change_volatile() \
    change_private() \
509
    vlc_config_set (VLC_CONFIG_VOLATILE);
510 511

#define change_safe() \
512
    vlc_config_set (VLC_CONFIG_SAFE);
513

514 515
/* Meta data plugin exports */
#define VLC_META_EXPORT( name, value ) \
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
516
    EXTERN_SYMBOL DLL_SYMBOL const char * CDECL_SYMBOL \
517
    __VLC_SYMBOL(vlc_entry_ ## name) (void); \
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
518
    EXTERN_SYMBOL DLL_SYMBOL const char * CDECL_SYMBOL \
519 520 521 522 523 524
    __VLC_SYMBOL(vlc_entry_ ## name) (void) \
    { \
         return value; \
    }

#if defined (__LIBVLC__)
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
525 526 527
# define VLC_COPYRIGHT_EXPORT VLC_META_EXPORT (copyright, \
    "\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\x74\x68" \
    "\x65\x20\x56\x69\x64\x65\x6f\x4c\x41\x4e\x20\x56\x4c\x43\x20\x6d" \
Rémi Denis-Courmont's avatar
Typo  
Rémi Denis-Courmont committed
528
    "\x65\x64\x69\x61\x20\x70\x6c\x61\x79\x65\x72\x20\x64\x65\x76\x65" \
529
    "\x6c\x6f\x70\x65\x72\x73" )
530 531 532 533
#elif !defined (VLC_COPYRIGHT_EXPORT)
# define VLC_COPYRIGHT_EXPORT
#endif
#define VLC_LICENSE_EXPORT VLC_META_EXPORT (license, \
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
534 535 536 537 538
    "\x4c\x69\x63\x65\x6e\x73\x65\x64\x20\x75\x6e\x64\x65\x72\x20\x74" \
    "\x68\x65\x20\x74\x65\x72\x6d\x73\x20\x6f\x66\x20\x74\x68\x65\x20" \
    "\x47\x4e\x55\x20\x47\x65\x6e\x65\x72\x61\x6c\x20\x50\x75\x62\x6c" \
    "\x69\x63\x20\x4c\x69\x63\x65\x6e\x73\x65\x2c\x20\x76\x65\x72\x73" \
    "\x69\x6f\x6e\x20\x32\x20\x6f\x72\x20\x6c\x61\x74\x65\x72\x2e" )
539 540 541 542 543

#define VLC_METADATA_EXPORTS \
    VLC_COPYRIGHT_EXPORT \
    VLC_LICENSE_EXPORT

544
#endif