X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finput%2Finput.c;h=77965ac80fdb1240d3d9f90421c827e8be6a3e0e;hb=bc605af3b5b70279d953d00258a75eb77446bac3;hp=49abe70b82c447fa1023cdf65ce48c91fd82b4f8;hpb=f90f0553f7e7d1ac8e6e02a92613abc17206473d;p=vlc diff --git a/src/input/input.c b/src/input/input.c index 49abe70b82..77965ac80f 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -43,12 +43,12 @@ #include "demux.h" #include "stream.h" #include "item.h" -#include "ressource.h" +#include "resource.h" #include #include "../stream_output/stream_output.h" -#include +#include #include #include #include @@ -66,7 +66,7 @@ static void *Run ( vlc_object_t *p_this ); static void *RunAndDestroy ( vlc_object_t *p_this ); static input_thread_t * Create ( vlc_object_t *, input_item_t *, - const char *, bool, input_ressource_t * ); + const char *, bool, input_resource_t * ); static int Init ( input_thread_t *p_input ); static void End ( input_thread_t *p_input ); static void MainLoop( input_thread_t *p_input ); @@ -117,11 +117,10 @@ static void input_ChangeState( input_thread_t *p_input, int i_state ); /* TODO f *****************************************************************************/ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, const char *psz_header, bool b_quick, - input_ressource_t *p_ressource ) + input_resource_t *p_resource ) { static const char input_name[] = "input"; input_thread_t *p_input = NULL; /* thread descriptor */ - vlc_value_t val; int i; /* Allocate descriptor */ @@ -149,17 +148,6 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, if( !p_input->p ) return NULL; - /* 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 *p_private = libvlc_priv( p_input->p_libvlc ); - vlc_mutex_lock( &p_input->p_libvlc->p_stats->lock ); - if( p_private->p_stats_computer == NULL ) - p_private->p_stats_computer = p_input; - vlc_mutex_unlock( &p_input->p_libvlc->p_stats->lock ); - } - p_input->b_preparsing = b_quick; p_input->psz_header = psz_header ? strdup( psz_header ) : NULL; @@ -211,11 +199,11 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, p_input->p->slave = NULL; /* */ - if( p_ressource ) - p_input->p->p_ressource = p_ressource; + if( p_resource ) + p_input->p->p_resource = p_resource; else - p_input->p->p_ressource = input_ressource_New(); - input_ressource_SetInput( p_input->p->p_ressource, p_input ); + p_input->p->p_resource = input_resource_New(); + input_resource_SetInput( p_input->p->p_resource, p_input ); /* Init control buffer */ vlc_mutex_init( &p_input->p->lock_control ); @@ -239,12 +227,12 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, /* */ if( !p_input->b_preparsing ) { - var_Get( p_input, "bookmarks", &val ); - if( val.psz_string ) + char *psz_bookmarks = var_GetNonEmptyString( p_input, "bookmarks" ); + if( psz_bookmarks ) { /* FIXME: have a common cfg parsing routine used by sout and others */ char *psz_parser, *psz_start, *psz_end; - psz_parser = val.psz_string; + psz_parser = psz_bookmarks; while( (psz_start = strchr( psz_parser, '{' ) ) ) { seekpoint_t *p_seekpoint; @@ -283,7 +271,7 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, vlc_seekpoint_Delete( p_seekpoint ); *psz_parser = backup; } - free( val.psz_string ); + free( psz_bookmarks ); } } @@ -322,8 +310,8 @@ static void Destructor( input_thread_t * p_input ) stats_TimerDump( p_input, STATS_TIMER_INPUT_LAUNCHING ); stats_TimerClean( p_input, STATS_TIMER_INPUT_LAUNCHING ); - if( p_input->p->p_ressource ) - input_ressource_Delete( p_input->p->p_ressource ); + if( p_input->p->p_resource ) + input_resource_Delete( p_input->p->p_resource ); vlc_gc_decref( p_input->p->p_item ); @@ -351,11 +339,11 @@ input_thread_t *__input_CreateThread( vlc_object_t *p_parent, /* */ input_thread_t *__input_CreateThreadExtended( vlc_object_t *p_parent, input_item_t *p_item, - const char *psz_log, input_ressource_t *p_ressource ) + const char *psz_log, input_resource_t *p_resource ) { input_thread_t *p_input; - p_input = Create( p_parent, p_item, psz_log, false, p_ressource ); + p_input = Create( p_parent, p_item, psz_log, false, p_resource ); if( !p_input ) return NULL; @@ -441,7 +429,7 @@ int input_Preparse( vlc_object_t *p_parent, input_item_t *p_item ) * * \param the input thread to stop */ -void input_StopThread( input_thread_t *p_input ) +void input_StopThread( input_thread_t *p_input, bool b_abort ) { /* Set die for input and ALL of this childrens (even (grand-)grand-childrens) * It is needed here even if it is done in INPUT_CONTROL_SET_DIE handler to @@ -449,19 +437,20 @@ void input_StopThread( input_thread_t *p_input ) ObjectKillChildrens( p_input, VLC_OBJECT(p_input) ); input_ControlPush( p_input, INPUT_CONTROL_SET_DIE, NULL ); + if( b_abort ) + input_SendEventAbort( p_input ); } -input_ressource_t *input_DetachRessource( input_thread_t *p_input ) +input_resource_t *input_DetachResource( input_thread_t *p_input ) { assert( p_input->b_dead ); - input_ressource_t *p_ressource = p_input->p->p_ressource; - input_ressource_SetInput( p_ressource, NULL ); + input_resource_SetInput( p_input->p->p_resource, NULL ); - p_input->p->p_ressource = NULL; + input_resource_t *p_resource = input_resource_Detach( p_input->p->p_resource ); p_input->p->p_sout = NULL; - return p_ressource; + return p_resource; } /** @@ -594,10 +583,8 @@ static void MainLoopDemux( input_thread_t *p_input, bool *pb_changed, mtime_t *p if( i_ret == 0 ) /* EOF */ { - vlc_value_t repeat; - - var_Get( p_input, "input-repeat", &repeat ); - if( repeat.i_int == 0 ) + int i_repeat = var_GetInteger( p_input, "input-repeat" ); + if( i_repeat == 0 ) { /* End of file - we do not set b_die because only the * playlist is allowed to do so. */ @@ -608,12 +595,11 @@ static void MainLoopDemux( input_thread_t *p_input, bool *pb_changed, mtime_t *p { vlc_value_t val; - msg_Dbg( p_input, "repeating the same input (%d)", - repeat.i_int ); - if( repeat.i_int > 0 ) + msg_Dbg( p_input, "repeating the same input (%d)", i_repeat ); + if( i_repeat > 0 ) { - repeat.i_int--; - var_Set( p_input, "input-repeat", repeat ); + i_repeat--; + var_SetInteger( p_input, "input-repeat", i_repeat ); } /* Seek to start title/seekpoint */ @@ -700,12 +686,6 @@ static void MainLoopInterface( input_thread_t *p_input ) static void MainLoopStatistic( input_thread_t *p_input ) { stats_ComputeInputStats( p_input, p_input->p->p_item->p_stats ); - /* Are we the thread responsible for computing global stats ? */ - if( libvlc_priv( p_input->p_libvlc )->p_stats_computer == p_input ) - { - stats_ComputeGlobalStats( p_input->p_libvlc, - p_input->p_libvlc->p_stats ); - } input_SendEventStatistics( p_input ); } @@ -819,6 +799,8 @@ static void InitStatistics( input_thread_t * p_input ) INIT_COUNTER( demux_read, INTEGER, COUNTER ); INIT_COUNTER( input_bitrate, FLOAT, DERIVATIVE ); INIT_COUNTER( demux_bitrate, FLOAT, DERIVATIVE ); + INIT_COUNTER( demux_corrupted, INTEGER, COUNTER ); + INIT_COUNTER( demux_discontinuity, INTEGER, COUNTER ); INIT_COUNTER( played_abuffers, INTEGER, COUNTER ); INIT_COUNTER( lost_abuffers, INTEGER, COUNTER ); INIT_COUNTER( displayed_pictures, INTEGER, COUNTER ); @@ -846,7 +828,7 @@ static int InitSout( input_thread_t * p_input ) char *psz = var_GetNonEmptyString( p_input, "sout" ); if( psz && strncasecmp( p_input->p->p_item->psz_uri, "vlc:", 4 ) ) { - p_input->p->p_sout = input_ressource_RequestSout( p_input->p->p_ressource, NULL, psz ); + p_input->p->p_sout = input_resource_RequestSout( p_input->p->p_resource, NULL, psz ); if( !p_input->p->p_sout ) { input_ChangeState( p_input, ERROR_S ); @@ -867,7 +849,7 @@ static int InitSout( input_thread_t * p_input ) } else { - input_ressource_RequestSout( p_input->p->p_ressource, NULL, NULL ); + input_resource_RequestSout( p_input->p->p_resource, NULL, NULL ); } free( psz ); @@ -891,7 +873,7 @@ static void InitTitle( input_thread_t * p_input ) { /* Setup variables */ input_ControlVarNavigation( p_input ); - input_ControlVarTitle( p_input, 0 ); + input_SendEventTitle( p_input, 0 ); } /* Global flag */ @@ -1079,8 +1061,7 @@ static void InitPrograms( input_thread_t * p_input ) val.p_list = NULL; if( p_input->p->p_sout ) { - var_Get( p_input, "sout-all", &val ); - if( val.b_bool ) + if( var_GetBool( p_input, "sout-all" ) ) { i_es_out_mode = ES_OUT_MODE_ALL; val.p_list = NULL; @@ -1232,12 +1213,12 @@ error: es_out_Delete( p_input->p->p_es_out ); if( p_input->p->p_es_out_display ) es_out_Delete( p_input->p->p_es_out_display ); - if( p_input->p->p_ressource ) + if( p_input->p->p_resource ) { if( p_input->p->p_sout ) - input_ressource_RequestSout( p_input->p->p_ressource, + input_resource_RequestSout( p_input->p->p_resource, p_input->p->p_sout, NULL ); - input_ressource_SetInput( p_input->p->p_ressource, NULL ); + input_resource_SetInput( p_input->p->p_resource, NULL ); } #ifdef ENABLE_SOUT @@ -1320,17 +1301,8 @@ static void End( input_thread_t * p_input ) #define CL_CO( c ) stats_CounterClean( p_input->p->counters.p_##c ); p_input->p->counters.p_##c = NULL; if( libvlc_stats( p_input ) ) { - libvlc_priv_t *p_private = libvlc_priv( p_input->p_libvlc ); - /* make sure we are up to date */ stats_ComputeInputStats( p_input, p_input->p->p_item->p_stats ); - if( p_private->p_stats_computer == p_input ) - { - stats_ComputeGlobalStats( p_input->p_libvlc, - p_input->p_libvlc->p_stats ); - /* FIXME how can it be thread safe ? */ - p_private->p_stats_computer = NULL; - } CL_CO( read_bytes ); CL_CO( read_packets ); CL_CO( demux_read ); @@ -1363,9 +1335,9 @@ static void End( input_thread_t * p_input ) } /* */ - input_ressource_RequestSout( p_input->p->p_ressource, + input_resource_RequestSout( p_input->p->p_resource, p_input->p->p_sout, NULL ); - input_ressource_SetInput( p_input->p->p_ressource, NULL ); + input_resource_SetInput( p_input->p->p_resource, NULL ); } /***************************************************************************** @@ -1880,7 +1852,7 @@ static bool Control( input_thread_t *p_input, int i_type, es_out_SetTime( p_input->p->p_es_out, -1 ); demux_Control( p_demux, DEMUX_SET_TITLE, i_title ); - input_ControlVarTitle( p_input, i_title ); + input_SendEventTitle( p_input, i_title ); } } else if( p_input->p->input.i_title > 0 ) @@ -1901,6 +1873,7 @@ static bool Control( input_thread_t *p_input, int i_type, stream_Control( p_input->p->input.p_stream, STREAM_CONTROL_ACCESS, ACCESS_SET_TITLE, i_title ); + input_SendEventTitle( p_input, i_title ); } } break; @@ -1946,6 +1919,7 @@ static bool Control( input_thread_t *p_input, int i_type, es_out_SetTime( p_input->p->p_es_out, -1 ); demux_Control( p_demux, DEMUX_SET_SEEKPOINT, i_seekpoint ); + input_SendEventSeekpoint( p_input, p_demux->info.i_title, i_seekpoint ); } } else if( p_input->p->input.i_title > 0 ) @@ -1980,6 +1954,7 @@ static bool Control( input_thread_t *p_input, int i_type, stream_Control( p_input->p->input.p_stream, STREAM_CONTROL_ACCESS, ACCESS_SET_SEEKPOINT, i_seekpoint ); + input_SendEventSeekpoint( p_input, p_access->info.i_title, i_seekpoint ); } } break; @@ -2291,7 +2266,6 @@ static int InputSourceInit( input_thread_t *p_input, const char *psz_access; const char *psz_demux; char *psz_path; - vlc_value_t val; double f_fps; strcpy( psz_dup, psz_mrl ); @@ -2387,11 +2361,10 @@ static int InputSourceInit( input_thread_t *p_input, var_SetBool( p_input, "can-rate", !in->b_can_pace_control || in->b_can_rate_control ); /* XXX temporary because of es_out_timeshift*/ var_SetBool( p_input, "can-rewind", !in->b_rescale_ts && !in->b_can_pace_control ); - int ret = demux_Control( in->p_demux, DEMUX_CAN_SEEK, - &val.b_bool ); - if( ret != VLC_SUCCESS ) - val.b_bool = false; - var_Set( p_input, "can-seek", val ); + bool b_can_seek; + if( demux_Control( in->p_demux, DEMUX_CAN_SEEK, &b_can_seek ) ) + b_can_seek = false; + var_SetBool( p_input, "can-seek", b_can_seek ); } else { @@ -2413,9 +2386,8 @@ static int InputSourceInit( input_thread_t *p_input, { msg_Err( p_input, "open of `%s' failed: %s", psz_mrl, msg_StackMsg() ); - intf_UserFatal( VLC_OBJECT( p_input), false, - _("Your input can't be opened"), - _("VLC is unable to open the MRL '%s'." + dialog_Fatal( p_input, _("Your input can't be opened"), + _("VLC is unable to open the MRL '%s'." " Check the log for details."), psz_mrl ); goto error; } @@ -2423,6 +2395,7 @@ static int InputSourceInit( input_thread_t *p_input, /* Get infos from access */ if( !p_input->b_preparsing ) { + bool b_can_seek; access_Control( in->p_access, ACCESS_GET_PTS_DELAY, &in->i_pts_delay ); @@ -2439,15 +2412,13 @@ static int InputSourceInit( input_thread_t *p_input, in->b_can_rate_control = in->b_can_pace_control; in->b_rescale_ts = true; - access_Control( in->p_access, ACCESS_CAN_PAUSE, - &in->b_can_pause ); + access_Control( in->p_access, ACCESS_CAN_PAUSE, &in->b_can_pause ); var_SetBool( p_input, "can-pause", in->b_can_pause || !in->b_can_pace_control ); /* XXX temporary because of es_out_timeshift*/ var_SetBool( p_input, "can-rate", !in->b_can_pace_control || in->b_can_rate_control ); /* XXX temporary because of es_out_timeshift*/ var_SetBool( p_input, "can-rewind", !in->b_rescale_ts && !in->b_can_pace_control ); - access_Control( in->p_access, ACCESS_CAN_SEEK, - &val.b_bool ); - var_Set( p_input, "can-seek", val ); + access_Control( in->p_access, ACCESS_CAN_SEEK, &b_can_seek ); + var_SetBool( p_input, "can-seek", b_can_seek ); } /* */ @@ -2545,9 +2516,9 @@ static int InputSourceInit( input_thread_t *p_input, { msg_Err( p_input, "no suitable demux module for `%s/%s://%s'", psz_access, psz_demux, psz_path ); - intf_UserFatal( VLC_OBJECT( p_input ), false, - _("VLC can't recognize the input's format"), - _("The format of '%s' cannot be detected. " + dialog_Fatal( VLC_OBJECT( p_input ), + _("VLC can't recognize the input's format"), + _("The format of '%s' cannot be detected. " "Have a look at the log for details."), psz_mrl ); goto error; } @@ -2780,14 +2751,12 @@ static void SlaveSeek( input_thread_t *p_input ) *****************************************************************************/ static void InputMetaUser( input_thread_t *p_input, vlc_meta_t *p_meta ) { - vlc_value_t val; - /* Get meta information from user */ #define GET_META( field, s ) do { \ - var_Get( p_input, (s), &val ); \ - if( val.psz_string && *val.psz_string ) \ - vlc_meta_Set( p_meta, vlc_meta_ ## field, val.psz_string ); \ - free( val.psz_string ); } while(0) + char *psz_string = var_GetNonEmptyString( p_input, (s) ); \ + if( psz_string ) \ + vlc_meta_Set( p_meta, vlc_meta_ ## field, psz_string ); \ + free( psz_string ); } while(0) GET_META( Title, "meta-title" ); GET_META( Artist, "meta-artist" );