X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finput%2Finput.c;h=ace3b8264ab97864869a1ba77d5b0616e3647d77;hb=cb02b264b58150bf45d0f68019ac32c02d2b5f1e;hp=0b1e087b8debfe37b1e72a75e98ef8f0b689e3a4;hpb=f2852bcf0d7f6d19df6af364d806a42dfc040677;p=vlc diff --git a/src/input/input.c b/src/input/input.c index 0b1e087b8d..ace3b8264a 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -43,7 +43,6 @@ #include #include #include -#include #ifdef HAVE_SYS_STAT_H # include @@ -87,9 +86,6 @@ static void SlaveSeek( input_thread_t *p_input ); static void InputMetaUser( input_thread_t *p_input, vlc_meta_t *p_meta ); static void InputUpdateMeta( input_thread_t *p_input, vlc_meta_t *p_meta ); -static sout_instance_t *SoutFind( vlc_object_t *p_parent, input_item_t *p_item, bool * ); -static void SoutKeep( sout_instance_t * ); - static void DemuxMeta( input_thread_t *p_input, vlc_meta_t *p_meta, demux_t *p_demux ); static void AccessMeta( input_thread_t * p_input, vlc_meta_t *p_meta ); static void AppendAttachment( int *pi_attachment, input_attachment_t ***ppp_attachment, @@ -135,10 +131,7 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, p_input = vlc_custom_create( p_parent, sizeof( *p_input ), VLC_OBJECT_INPUT, input_name ); if( p_input == NULL ) - { - msg_Err( p_parent, "out of memory" ); return NULL; - } /* Construct a nice name for the input timer */ char psz_timer_name[255]; @@ -169,6 +162,12 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, p_input->b_preparsing = b_quick; p_input->psz_header = psz_header ? strdup( psz_header ) : NULL; + /* Init events */ + vlc_event_manager_t * p_em = &p_input->p->event_manager; + vlc_event_manager_init_with_vlc_object( p_em, p_input ); + vlc_event_manager_register_event_type( p_em, vlc_InputStateChanged ); + vlc_event_manager_register_event_type( p_em, vlc_InputSelectedStreamChanged ); + /* Init Common fields */ p_input->b_eof = false; p_input->b_can_pace_control = true; @@ -185,8 +184,6 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, TAB_INIT( p_input->p->i_attachment, p_input->p->attachment ); p_input->p->p_es_out = NULL; p_input->p->p_sout = NULL; - p_input->p->b_owns_its_sout = true; - p_input->p->b_sout_keep = false; p_input->p->b_out_pace_control = false; p_input->i_pts_delay = 0; @@ -293,10 +290,7 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, /* */ if( p_sout ) - { p_input->p->p_sout = p_sout; - p_input->p->b_owns_its_sout = false; - } memset( &p_input->p->counters, 0, sizeof( p_input->p->counters ) ); vlc_mutex_init( &p_input->p->counters.counters_lock ); @@ -317,16 +311,13 @@ static void Destructor( input_thread_t * p_input ) { input_thread_private_t *priv = p_input->p; + vlc_event_manager_fini( &p_input->p->event_manager ); + stats_TimerDump( p_input, STATS_TIMER_INPUT_LAUNCHING ); stats_TimerClean( p_input, STATS_TIMER_INPUT_LAUNCHING ); #ifdef ENABLE_SOUT - if( priv->b_owns_its_sout && priv->p_sout ) - { - if( priv->b_sout_keep ) - SoutKeep( priv->p_sout ); - else - sout_DeleteInstance( priv->p_sout ); - } + if( priv->p_sout ) + sout_DeleteInstance( priv->p_sout ); #endif vlc_gc_decref( p_input->p->input.p_item ); @@ -347,15 +338,7 @@ static void Destructor( input_thread_t * p_input ) input_thread_t *__input_CreateThread( vlc_object_t *p_parent, input_item_t *p_item ) { - bool b_sout_keep; - sout_instance_t *p_sout = SoutFind( p_parent, p_item, &b_sout_keep ); - input_thread_t *p_input = __input_CreateThreadExtended( p_parent, p_item, NULL, p_sout ); - - if( !p_input && p_sout ) - SoutKeep( p_sout ); - - p_input->p->b_sout_keep = b_sout_keep; - return p_input; + return __input_CreateThreadExtended( p_parent, p_item, NULL, NULL ); } /* */ @@ -395,18 +378,11 @@ input_thread_t *__input_CreateThreadExtended( vlc_object_t *p_parent, int __input_Read( vlc_object_t *p_parent, input_item_t *p_item, bool b_block ) { - bool b_sout_keep; - sout_instance_t *p_sout = SoutFind( p_parent, p_item, &b_sout_keep ); input_thread_t *p_input; - p_input = Create( p_parent, p_item, NULL, false, p_sout ); + p_input = Create( p_parent, p_item, NULL, false, NULL ); if( !p_input ) - { - if( p_sout ) - SoutKeep( p_sout ); return VLC_EGENERIC; - } - p_input->p->b_sout_keep = b_sout_keep; if( b_block ) { @@ -470,28 +446,10 @@ void input_StopThread( input_thread_t *p_input ) /* We cannot touch p_input fields directly (we come from another thread), * so use the vlc_object_find way, it's perfectly safe */ - /* Set die for all access */ - p_list = vlc_list_find( p_input, VLC_OBJECT_ACCESS, FIND_CHILD ); + /* Set die for all access, stream, demux, etc */ + p_list = vlc_list_children( p_input ); for( i = 0; i < p_list->i_count; i++ ) - { vlc_object_kill( p_list->p_values[i].p_object ); - } - vlc_list_release( p_list ); - - /* Set die for all stream */ - p_list = vlc_list_find( p_input, VLC_OBJECT_STREAM, FIND_CHILD ); - for( i = 0; i < p_list->i_count; i++ ) - { - vlc_object_kill( p_list->p_values[i].p_object ); - } - vlc_list_release( p_list ); - - /* Set die for all demux */ - p_list = vlc_list_find( p_input, VLC_OBJECT_DEMUX, FIND_CHILD ); - for( i = 0; i < p_list->i_count; i++ ) - { - vlc_object_kill( p_list->p_values[i].p_object ); - } vlc_list_release( p_list ); input_ControlPush( p_input, INPUT_CONTROL_SET_DIE, NULL ); @@ -499,8 +457,10 @@ void input_StopThread( input_thread_t *p_input ) sout_instance_t * input_DetachSout( input_thread_t *p_input ) { - p_input->p->b_owns_its_sout = false; - return p_input->p->p_sout; + sout_instance_t *p_sout = p_input->p->p_sout; + vlc_object_detach( p_sout ); + p_input->p->p_sout = NULL; + return p_sout; } /***************************************************************************** @@ -518,15 +478,6 @@ static int Run( input_thread_t *p_input ) /* If we failed, wait before we are killed, and exit */ p_input->b_error = true; - /* FIXME: we don't want to depend on the playlist */ - playlist_t * p_playlist = vlc_object_find( p_input, - VLC_OBJECT_PLAYLIST, FIND_PARENT ); - if( p_playlist ) - { - playlist_Signal( p_playlist ); - vlc_object_release( p_playlist ); - } - Error( p_input ); /* Tell we're dead */ @@ -552,7 +503,7 @@ static int Run( input_thread_t *p_input ) /* We have finished */ p_input->b_eof = true; - playlist_Signal( libvlc_priv (p_input->p_libvlc)->p_playlist ); + input_ChangeState( p_input, END_S ); } /* Wait until we are asked to die */ @@ -663,7 +614,6 @@ static void MainLoop( input_thread_t *p_input ) { /* End of file - we do not set b_die because only the * playlist is allowed to do so. */ - input_ChangeState( p_input, END_S ); msg_Dbg( p_input, "EOF reached" ); p_input->p->input.b_eof = true; } @@ -1390,78 +1340,6 @@ static void End( input_thread_t * p_input ) p_input->b_dead = true; } -static sout_instance_t *SoutFind( vlc_object_t *p_parent, input_item_t *p_item, bool *pb_sout_keep ) -{ - bool b_keep_sout = var_CreateGetBool( p_parent, "sout-keep" ); - sout_instance_t *p_sout = NULL; - int i; - - /* Search sout-keep options - * XXX it has to be done here, but it is duplicated work :( */ - vlc_mutex_lock( &p_item->lock ); - for( i = 0; i < p_item->i_options; i++ ) - { - const char *psz_option = p_item->ppsz_options[i]; - if( !psz_option ) - continue; - if( *psz_option == ':' ) - psz_option++; - - if( !strcmp( psz_option, "sout-keep" ) ) - b_keep_sout = true; - else if( !strcmp( psz_option, "no-sout-keep" ) || !strcmp( psz_option, "nosout-keep" ) ) - b_keep_sout = false; - } - vlc_mutex_unlock( &p_item->lock ); - - /* Find a potential sout to reuse - * XXX it might be unusable but this will be checked later */ - if( b_keep_sout ) - { - playlist_t *p_playlist = vlc_object_find( p_parent->p_libvlc, - VLC_OBJECT_PLAYLIST, FIND_CHILD ); - if( p_playlist ) - { - vlc_mutex_lock( &p_playlist->gc_lock ); - p_sout = vlc_object_find( p_playlist, VLC_OBJECT_SOUT, FIND_CHILD ); - if( 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 ); - } - } - - if( pb_sout_keep ) - *pb_sout_keep = b_keep_sout; - - return p_sout; -} - -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 ) - { - msg_Dbg( p_sout, "sout has been kept" ); - vlc_object_attach( p_sout, p_playlist ); - vlc_object_release( p_playlist ); - } - else - sout_DeleteInstance( p_sout ); -} - /***************************************************************************** * Control *****************************************************************************/ @@ -1669,9 +1547,7 @@ static bool Control( input_thread_t *p_input, int i_type, b_force_update = true; /* Switch to play */ - p_input->i_state = PLAYING_S; - val.i_int = PLAYING_S; - var_Change( p_input, "state", VLC_VAR_SETVALUE, &val, NULL ); + input_ChangeStateWithVarCallback( p_input, PLAYING_S, false ); /* */ if( !i_ret ) @@ -1680,7 +1556,7 @@ static bool Control( input_thread_t *p_input, int i_type, else if( val.i_int == PAUSE_S && p_input->i_state == PLAYING_S && p_input->p->b_can_pause ) { - int i_ret; + int i_ret, state; if( p_input->p->input.p_access ) i_ret = access_Control( p_input->p->input.p_access, ACCESS_SET_PAUSE_STATE, true ); @@ -1693,16 +1569,15 @@ static bool Control( input_thread_t *p_input, int i_type, if( i_ret ) { msg_Warn( p_input, "cannot set pause state" ); - val.i_int = p_input->i_state; + state = p_input->i_state; } else { - val.i_int = PAUSE_S; + state = PAUSE_S; } /* Switch to new state */ - p_input->i_state = val.i_int; - var_Change( p_input, "state", VLC_VAR_SETVALUE, &val, NULL ); + input_ChangeStateWithVarCallback( p_input, state, false ); /* */ if( !i_ret ) @@ -1713,8 +1588,7 @@ static bool Control( input_thread_t *p_input, int i_type, b_force_update = true; /* Correct "state" value */ - val.i_int = p_input->i_state; - var_Change( p_input, "state", VLC_VAR_SETVALUE, &val, NULL ); + input_ChangeStateWithVarCallback( p_input, p_input->i_state, false ); } else if( val.i_int != PLAYING_S && val.i_int != PAUSE_S ) { @@ -2955,3 +2829,12 @@ bool input_AddSubtitles( input_thread_t *p_input, char *psz_subtitle, return true; } + +/***************************************************************************** + * input_get_event_manager + *****************************************************************************/ +vlc_event_manager_t * +input_get_event_manager( input_thread_t *p_input ) +{ + return &p_input->p->event_manager; +}