X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Flibvlc.c;h=07260105058ef0df6833240bb3f23f8629747f2d;hb=f98dfcb34f94efc5a3417b33edecc02e7eef6ca5;hp=71ed33ad936acf572f04f87d37bd0fdcce132042;hpb=c7c72691e1973b9f0f5ecbde849184ee1815759f;p=vlc diff --git a/src/libvlc.c b/src/libvlc.c index 71ed33ad93..0726010505 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -103,7 +103,44 @@ static libvlc_int_t * p_static_vlc = NULL; static unsigned i_instances = 0; +#ifndef WIN32 static bool b_daemon = false; +#endif + +/***************************************************************************** + * vlc_gc_*. + *****************************************************************************/ +void __vlc_gc_incref( gc_object_t * p_gc ) +{ + assert( p_gc->i_gc_refcount > 0 ); + + /* FIXME: atomic version needed! */ + p_gc->i_gc_refcount ++; +} + +void __vlc_gc_decref( gc_object_t *p_gc ) +{ + assert( p_gc ); + assert( p_gc->i_gc_refcount > 0 ); + + /* FIXME: atomic version needed! */ + p_gc->i_gc_refcount -- ; + + if( p_gc->i_gc_refcount == 0 ) + { + p_gc->pf_destructor( p_gc ); + /* Do not use the p_gc pointer from now on ! */ + } +} + +void +__vlc_gc_init( gc_object_t * p_gc, void (*pf_destructor)( gc_object_t * ), + void * arg) +{ + p_gc->i_gc_refcount = 1; + p_gc->pf_destructor = pf_destructor; + p_gc->p_destructor_arg = arg; +} /***************************************************************************** * Local prototypes @@ -158,8 +195,7 @@ libvlc_int_t * libvlc_InternalCreate( void ) } /* Allocate a libvlc instance object */ - p_libvlc = vlc_custom_create( VLC_OBJECT(p_libvlc_global), - sizeof (*p_libvlc) + sizeof (libvlc_priv_t), + p_libvlc = vlc_custom_create( VLC_OBJECT(p_libvlc_global), sizeof (*priv), VLC_OBJECT_LIBVLC, "libvlc" ); if( p_libvlc != NULL ) i_instances++; @@ -190,17 +226,13 @@ libvlc_int_t * libvlc_InternalCreate( void ) #endif /* Announce who we are - Do it only for first instance ? */ - msg_Dbg( p_libvlc, COPYRIGHT_MESSAGE ); + msg_Dbg( p_libvlc, "%s", COPYRIGHT_MESSAGE ); msg_Dbg( p_libvlc, "libvlc was configured with %s", CONFIGURE_LINE ); /* Initialize mutexes */ vlc_mutex_init( &priv->timer_lock ); vlc_mutex_init( &priv->config_lock ); - priv->threads_count = 0; - vlc_mutex_init (&priv->threads_lock); - vlc_cond_init (NULL, &priv->threads_wait); - /* Store data for the non-reentrant API */ p_static_vlc = p_libvlc; @@ -236,6 +268,10 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, #endif #endif +#if defined (WIN32) && !defined (NDEBUG) + ShowConsole (true); +#endif + /* System specific initialization code */ system_Init( p_libvlc, &i_argc, ppsz_argv ); @@ -271,12 +307,6 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, return VLC_EGENERIC; } -#ifdef __APPLE__ - /* vlc_thread_set_priority needs to query the config, - * so this is the earliest moment where we can set this */ - vlc_thread_set_priority( p_libvlc, VLC_THREAD_PRIORITY_LOW ); -#endif - /* Check for short help option */ if( config_GetInt( p_libvlc, "help" ) > 0 ) { @@ -433,6 +463,15 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, b_exit = true; i_ret = VLC_EEXITSUCCESS; } + /* Check for full help option */ + else if( config_GetInt( p_libvlc, "full-help" ) > 0 ) + { + config_PutInt( p_libvlc, "advanced", 1); + config_PutInt( p_libvlc, "help-verbose", 1); + Help( p_libvlc, "full-help" ); + b_exit = true; + i_ret = VLC_EEXITSUCCESS; + } /* Check for long help option */ else if( config_GetInt( p_libvlc, "longhelp" ) > 0 ) { @@ -751,7 +790,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, } free( psz_modules ); -#ifdef ENABLE_SOUT +#ifdef ENABLE_VLM /* Initialize VLM if vlm-conf is specified */ psz_parser = config_GetPsz( p_libvlc, "vlm-conf" ); if( psz_parser && *psz_parser ) @@ -869,8 +908,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if( psz_codecs ) { char *psz_morecodecs; - asprintf(&psz_morecodecs, "%s,dmo,quicktime", psz_codecs); - if( psz_morecodecs ) + if( asprintf(&psz_morecodecs, "%s,dmo,quicktime", psz_codecs) != -1 ) { config_PutPsz( p_libvlc, "codec", psz_morecodecs); free( psz_morecodecs ); @@ -918,7 +956,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, { playlist_t *p_playlist = pl_Yield( p_libvlc ); playlist_AddExt( p_playlist, val.psz_string, NULL, PLAYLIST_INSERT, 0, - -1, NULL, 0, true, false ); + -1, NULL, 0, true, pl_Unlocked ); pl_Release( p_libvlc ); } free( val.psz_string ); @@ -945,7 +983,7 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) vlc_object_release( p_intf ); /* for vlc_object_find() */ } -#ifdef ENABLE_SOUT +#ifdef ENABLE_VLM /* Destroy VLM if created in libvlc_InternalInit */ if( priv->p_vlm ) { @@ -973,11 +1011,9 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) /* Free video outputs */ msg_Dbg( p_libvlc, "removing all video outputs" ); vlc_list_t *list = vlc_list_find (p_libvlc, VLC_OBJECT_VOUT, FIND_CHILD); - for (unsigned i = 0; i < list->i_count; i++) - { - vlc_object_release (list->p_values[i].p_object); + for (int i = 0; i < list->i_count; i++) vlc_object_release (list->p_values[i].p_object); - } + vlc_list_release (list); stats_TimersDumpAll( p_libvlc ); stats_TimersCleanAll( p_libvlc ); @@ -996,17 +1032,6 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) } #endif - /* Make sure all threads are completed before we start looking for - * reference leaks and deinitializing core LibVLC subsytems. */ - vlc_mutex_lock (&priv->threads_lock); - while (priv->threads_count) - { - msg_Dbg (p_libvlc, "waiting for %u remaining threads", - priv->threads_count); - vlc_cond_wait (&priv->threads_wait, &priv->threads_lock); - } - vlc_mutex_unlock (&priv->threads_lock); - bool b_clean = true; FOREACH_ARRAY( input_item_t *p_del, priv->input_items ) msg_Err( p_libvlc, "input item %p has not been deleted properly: refcount %d, name %s", @@ -1086,8 +1111,6 @@ int libvlc_InternalDestroy( libvlc_int_t *p_libvlc ) /* Destroy mutexes */ vlc_mutex_destroy( &priv->config_lock ); vlc_mutex_destroy( &priv->timer_lock ); - vlc_cond_destroy (&priv->threads_wait); - vlc_mutex_destroy (&priv->threads_lock); vlc_object_release( p_libvlc ); p_libvlc = NULL; @@ -1190,8 +1213,8 @@ static inline int LoadMessages (void) static const char psz_path[] = LOCALEDIR; #else char psz_path[1024]; - if (snprintf (psz_path, sizeof (psz_path), "%s/%s", - vlc_global()->psz_vlcpath, "locale") + if (snprintf (psz_path, sizeof (psz_path), "%s" DIR_SEP "%s", + config_GetDataDir(), "locale") >= (int)sizeof (psz_path)) return -1; @@ -1253,7 +1276,7 @@ static int GetFilenames( libvlc_int_t *p_vlc, int i_argc, const char *ppsz_argv[ playlist_t *p_playlist = pl_Yield( p_vlc ); playlist_AddExt( p_playlist, ppsz_argv[i_opt], NULL, PLAYLIST_INSERT, 0, -1, ( i_options ? &ppsz_argv[i_opt + 1] : NULL ), - i_options, true, false ); + i_options, true, pl_Unlocked ); pl_Release( p_vlc ); } @@ -1265,6 +1288,12 @@ static int GetFilenames( libvlc_int_t *p_vlc, int i_argc, const char *ppsz_argv[ ***************************************************************************** * Print a short inline help. Message interface is initialized at this stage. *****************************************************************************/ +static inline void print_help_on_full_help( void ) +{ + utf8_fprintf( stdout, "\n" ); + utf8_fprintf( stdout, "%s\n", _("To get exhaustive help, use '-H'.") ); +} + static void Help( libvlc_int_t *p_this, char const *psz_help_name ) { #ifdef WIN32 @@ -1276,8 +1305,15 @@ static void Help( libvlc_int_t *p_this, char const *psz_help_name ) utf8_fprintf( stdout, vlc_usage, p_this->psz_object_name ); Usage( p_this, "help" ); Usage( p_this, "main" ); + print_help_on_full_help(); } else if( psz_help_name && !strcmp( psz_help_name, "longhelp" ) ) + { + utf8_fprintf( stdout, vlc_usage, p_this->psz_object_name ); + Usage( p_this, NULL ); + print_help_on_full_help(); + } + else if( psz_help_name && !strcmp( psz_help_name, "full-help" ) ) { utf8_fprintf( stdout, vlc_usage, p_this->psz_object_name ); Usage( p_this, NULL ); @@ -1297,6 +1333,34 @@ static void Help( libvlc_int_t *p_this, char const *psz_help_name ) ***************************************************************************** * Print a short inline help. Message interface is initialized at this stage. *****************************************************************************/ +# define COL(x) "\033[" #x ";1m" +# define RED COL(31) +# define GREEN COL(32) +# define YELLOW COL(33) +# define BLUE COL(34) +# define MAGENTA COL(35) +# define CYAN COL(36) +# define WHITE COL(0) +# define GRAY "\033[0m" +static void print_help_section( module_config_t *p_item, bool b_color, bool b_description ) +{ + if( !p_item ) return; + if( b_color ) + { + utf8_fprintf( stdout, RED" %s:\n"GRAY, + p_item->psz_text ); + if( b_description && p_item->psz_longtext ) + utf8_fprintf( stdout, MAGENTA" %s\n"GRAY, + p_item->psz_longtext ); + } + else + { + utf8_fprintf( stdout, " %s:\n", p_item->psz_text ); + if( b_description && p_item->psz_longtext ) + utf8_fprintf( stdout, " %s\n", p_item->psz_longtext ); + } +} + static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) { #define FORMAT_STRING " %s --%s%s%s%s%s%s%s " @@ -1312,15 +1376,6 @@ static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) * The purpose of having bra and ket is that we might i18n them as well. */ -# define COL(x) "\033[" #x ";1m" -# define RED COL(31) -# define GREEN COL(32) -# define YELLOW COL(33) -# define BLUE COL(34) -# define MAGENTA COL(35) -# define CYAN COL(36) -# define WHITE COL(0) -# define GRAY "\033[0m" #define COLOR_FORMAT_STRING (WHITE" %s --%s"YELLOW"%s%s%s%s%s%s "GRAY) #define COLOR_FORMAT_STRING_BOOL (WHITE" %s --%s%s%s%s%s%s%s "GRAY) @@ -1381,12 +1436,13 @@ static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) bool b_help_module; module_t *p_parser = (module_t *)p_list->p_values[i_index].p_object; module_config_t *p_item = NULL; + module_config_t *p_section = NULL; module_config_t *p_end = p_parser->p_config + p_parser->confsize; if( psz_module_name && strcmp( psz_module_name, p_parser->psz_object_name ) ) { - const char *const *pp_shortcut = p_parser->pp_shortcuts; + char *const *pp_shortcut = p_parser->pp_shortcuts; while( *pp_shortcut ) { if( !strcmp( psz_module_name, *pp_shortcut ) ) @@ -1485,22 +1541,9 @@ static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) case CONFIG_HINT_SUBCATEGORY: if( strcmp( "main", p_parser->psz_object_name ) ) - break; + break; case CONFIG_SECTION: - if( b_color ) - { - utf8_fprintf( stdout, RED" %s:\n"GRAY, - p_item->psz_text ); - if( b_description && p_item->psz_longtext ) - utf8_fprintf( stdout, MAGENTA" %s\n"GRAY, - p_item->psz_longtext ); - } - else - { - utf8_fprintf( stdout, " %s:\n", p_item->psz_text ); - if( b_description && p_item->psz_longtext ) - utf8_fprintf( stdout, " %s\n", p_item->psz_longtext ); - } + p_section = p_item; break; case CONFIG_ITEM_STRING: @@ -1512,6 +1555,8 @@ static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) case CONFIG_ITEM_MODULE_LIST_CAT: case CONFIG_ITEM_FONT: case CONFIG_ITEM_PASSWORD: + print_help_section( p_section, b_color, b_description ); + p_section = NULL; psz_bra = OPTION_VALUE_SEP "<"; psz_type = _("string"); psz_ket = ">"; @@ -1531,6 +1576,8 @@ static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) break; case CONFIG_ITEM_INTEGER: case CONFIG_ITEM_KEY: /* FIXME: do something a bit more clever */ + print_help_section( p_section, b_color, b_description ); + p_section = NULL; psz_bra = OPTION_VALUE_SEP "<"; psz_type = _("integer"); psz_ket = ">"; @@ -1558,6 +1605,8 @@ static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) } break; case CONFIG_ITEM_FLOAT: + print_help_section( p_section, b_color, b_description ); + p_section = NULL; psz_bra = OPTION_VALUE_SEP "<"; psz_type = _("float"); psz_ket = ">"; @@ -1569,6 +1618,8 @@ static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) } break; case CONFIG_ITEM_BOOL: + print_help_section( p_section, b_color, b_description ); + p_section = NULL; psz_bra = ""; psz_type = ""; psz_ket = ""; if( !b_help_module ) { @@ -1792,7 +1843,7 @@ static void ListModules( libvlc_int_t *p_this, bool b_verbose ) if( b_verbose ) { - const char *const *pp_shortcut = p_parser->pp_shortcuts; + char *const *pp_shortcut = p_parser->pp_shortcuts; while( *pp_shortcut ) { if( strcmp( *pp_shortcut, p_parser->psz_object_name ) )