X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finput%2Finput.c;h=4ab5b55225e9298ef35c528a8f5c7fb60f03a2d8;hb=9ff2a688923e778b1526dba269c836afa1c5a1e1;hp=687ec79fef3df1b0b67be3bdb1badfb843e288df;hpb=d1d3dc1d109110bf68cb048c429f6f05a3839200;p=vlc diff --git a/src/input/input.c b/src/input/input.c index 687ec79fef..4ab5b55225 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -29,7 +29,7 @@ # include "config.h" #endif -#include +#include #include #include @@ -153,16 +153,16 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, STATS_TIMER_INPUT_LAUNCHING ); MALLOC_NULL( p_input->p, input_thread_private_t ); + memset( p_input->p, 0, sizeof( input_thread_private_t ) ); /* One "randomly" selected input thread is responsible for computing * the global stats. Check if there is already someone doing this */ if( p_input->p_libvlc->p_stats && !b_quick ) { + libvlc_priv_t *priv = libvlc_priv (p_input->p_libvlc); vlc_mutex_lock( &p_input->p_libvlc->p_stats->lock ); - if( p_input->p_libvlc->p_stats_computer == NULL ) - { - p_input->p_libvlc->p_stats_computer = p_input; - } + if( priv->p_stats_computer == NULL ) + priv->p_stats_computer = p_input; vlc_mutex_unlock( &p_input->p_libvlc->p_stats->lock ); } @@ -217,7 +217,7 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, p_input->p->slave = NULL; /* Init control buffer */ - vlc_mutex_init( p_input, &p_input->p->lock_control ); + vlc_mutex_init( &p_input->p->lock_control ); p_input->p->i_control = 0; /* Parse input options */ @@ -299,7 +299,7 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, } memset( &p_input->p->counters, 0, sizeof( p_input->p->counters ) ); - vlc_mutex_init( p_input, &p_input->p->counters.counters_lock ); + vlc_mutex_init( &p_input->p->counters.counters_lock ); /* Attach only once we are ready */ vlc_object_attach( p_input, p_parent ); @@ -554,7 +554,7 @@ static int Run( input_thread_t *p_input ) /* We have finished */ p_input->b_eof = true; - playlist_Signal( pl_Get( p_input ) ); + playlist_Signal( libvlc_priv (p_input->p_libvlc)->p_playlist ); } /* Wait until we are asked to die */ @@ -779,10 +779,10 @@ static void MainLoop( input_thread_t *p_input ) { stats_ComputeInputStats( p_input, p_input->p->input.p_item->p_stats ); /* Are we the thread responsible for computing global stats ? */ - if( p_input->p_libvlc->p_stats_computer == p_input ) + if( libvlc_priv (p_input->p_libvlc)->p_stats_computer == p_input ) { stats_ComputeGlobalStats( p_input->p_libvlc, - p_input->p_libvlc->p_stats ); + p_input->p_libvlc->p_stats ); } } } @@ -795,7 +795,7 @@ static void InitStatistics( input_thread_t * p_input ) /* Prepare statistics */ #define INIT_COUNTER( c, type, compute ) p_input->p->counters.p_##c = \ stats_CounterCreate( p_input, VLC_VAR_##type, STATS_##compute); - if( p_input->p_libvlc->b_stats ) + if( libvlc_stats (p_input) ) { INIT_COUNTER( read_bytes, INTEGER, COUNTER ); INIT_COUNTER( read_packets, INTEGER, COUNTER ); @@ -863,7 +863,7 @@ static int InitSout( input_thread_t * p_input ) return VLC_EGENERIC; } } - if( p_input->p_libvlc->b_stats ) + if( libvlc_stats (p_input) ) { INIT_COUNTER( sout_sent_packets, INTEGER, COUNTER ); INIT_COUNTER (sout_sent_bytes, INTEGER, COUNTER ); @@ -1260,7 +1260,7 @@ error: } #endif - if( !p_input->b_preparsing && p_input->p_libvlc->b_stats ) + if( !p_input->b_preparsing && libvlc_stats (p_input) ) { #define EXIT_COUNTER( c ) do { if( p_input->p->counters.p_##c ) \ stats_CounterClean( p_input->p->counters.p_##c );\ @@ -1343,15 +1343,17 @@ static void End( input_thread_t * p_input ) if( !p_input->b_preparsing ) { #define CL_CO( c ) stats_CounterClean( p_input->p->counters.p_##c ); p_input->p->counters.p_##c = NULL; - if( p_input->p_libvlc->b_stats ) + if( libvlc_stats (p_input) ) { + libvlc_priv_t *priv = libvlc_priv (p_input->p_libvlc); + /* make sure we are up to date */ stats_ComputeInputStats( p_input, p_input->p->input.p_item->p_stats ); - if( p_input->p_libvlc->p_stats_computer == p_input ) + if( priv->p_stats_computer == p_input ) { stats_ComputeGlobalStats( p_input->p_libvlc, p_input->p_libvlc->p_stats ); - p_input->p_libvlc->p_stats_computer = NULL; + priv->p_stats_computer = NULL; } CL_CO( read_bytes ); CL_CO( read_packets ); @@ -1418,20 +1420,27 @@ static sout_instance_t *SoutFind( vlc_object_t *p_parent, input_item_t *p_item, * XXX it might be unusable but this will be checked later */ if( b_keep_sout ) { - p_sout = vlc_object_find( p_parent->p_libvlc, VLC_OBJECT_SOUT, - FIND_CHILD ); - if( p_sout ) + playlist_t *p_playlist = vlc_object_find( p_parent->p_libvlc, + VLC_OBJECT_PLAYLIST, FIND_CHILD ); + if( p_playlist ) { - if( p_sout->p_parent != VLC_OBJECT( p_sout->p_libvlc ) ) - { - vlc_object_release( p_sout ); - p_sout = NULL; - } - else + vlc_mutex_lock( &p_playlist->gc_lock ); + p_sout = vlc_object_find( p_playlist, VLC_OBJECT_SOUT, FIND_CHILD ); + if( p_sout ) { - vlc_object_detach( p_sout ); /* Remove it from the GC */ - vlc_object_release( p_sout ); + if( p_sout->p_parent != VLC_OBJECT( p_playlist ) ) + { + vlc_object_release( p_sout ); + p_sout = NULL; + } + else + { + vlc_object_detach( p_sout ); /* Remove it from the GC */ + vlc_object_release( p_sout ); + } } + vlc_mutex_unlock( &p_playlist->gc_lock ); + vlc_object_release( p_playlist ); } } @@ -1443,8 +1452,14 @@ static sout_instance_t *SoutFind( vlc_object_t *p_parent, input_item_t *p_item, static void SoutKeep( sout_instance_t *p_sout ) { + playlist_t * p_playlist = vlc_object_find( p_sout, VLC_OBJECT_PLAYLIST, + FIND_PARENT ); + if( !p_playlist ) return; + msg_Dbg( p_sout, "sout has been kept" ); - vlc_object_attach( p_sout, p_sout->p_libvlc ); + vlc_object_attach( p_sout, p_playlist ); + + vlc_object_release( p_playlist ); } /***************************************************************************** @@ -2109,7 +2124,6 @@ static int UpdateFromAccess( input_thread_t *p_input ) vlc_meta_t *p_meta = vlc_meta_New(); access_Control( p_input->p->input.p_access,ACCESS_GET_META, p_meta ); InputUpdateMeta( p_input, p_meta ); - var_SetInteger( pl_Get( p_input ), "item-change", p_input->p->input.p_item->i_id ); p_access->info.i_update &= ~INPUT_UPDATE_META; } @@ -2152,8 +2166,8 @@ static void UpdateItemLength( input_thread_t *p_input, int64_t i_length ) if( !p_input->b_preparsing ) { pl_Yield( p_input ); - var_SetInteger( pl_Get( p_input ), "item-change", - p_input->p->input.p_item->i_id ); + var_SetInteger( libvlc_priv (p_input->p_libvlc)->p_playlist, + "item-change", p_input->p->input.p_item->i_id ); pl_Release( p_input ); } } @@ -2164,27 +2178,8 @@ static void UpdateItemLength( input_thread_t *p_input, int64_t i_length ) static input_source_t *InputSourceNew( input_thread_t *p_input ) { input_source_t *in = (input_source_t*) malloc( sizeof( input_source_t ) ); - - if( !in ) - { - msg_Err( p_input, "out of memory for new input source" ); - return NULL; - } - - in->p_item = NULL; - in->p_access = NULL; - in->p_stream = NULL; - in->p_demux = NULL; - in->b_title_demux = false; - TAB_INIT( in->i_title, in->title ); - in->b_can_pause = true; - in->b_can_pace_control = true; - in->b_can_rate_control = true; - in->b_rescale_ts = true; - in->b_eof = false; - in->f_fps = 0.0; - in->i_cr_average = 0; - + if( in ) + memset( in, 0, sizeof( input_source_t ) ); return in; } @@ -2819,6 +2814,12 @@ void MRLSplit( char *psz_dup, const char **ppsz_access, const char **ppsz_demux, psz_demux = strchr( psz_access, '/' ); if( psz_demux ) *psz_demux++ = '\0'; + + /* We really don't want module name substitution here! */ + if( psz_access[0] == '$' ) + psz_access++; + if( psz_demux && psz_demux[0] == '$' ) + psz_demux++; } else {