X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finput%2Finput.c;h=7f916f262e736566a2977aa311080891ce1f97e2;hb=7df464879acb66d7a0a19905e3d48b7e6b5fcf33;hp=5153b6897dadafd9ea6044afd443e8ea8413734e;hpb=d2cd2e5d3645c0dd9026bfaaaf357bb2921d2258;p=vlc diff --git a/src/input/input.c b/src/input/input.c index 5153b6897d..7f916f262e 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include "input_internal.h" @@ -47,15 +48,12 @@ #include "resource.h" #include -#include "../stream_output/stream_output.h" - #include #include #include #include #include #include -#include // FIXME /***************************************************************************** * Local prototypes @@ -75,9 +73,6 @@ static void ControlRelease( int i_type, vlc_value_t val ); static bool ControlIsSeekRequest( int i_type ); static bool Control( input_thread_t *, int, vlc_value_t ); -static int UpdateTitleSeekpointFromAccess( input_thread_t * ); -static void UpdateGenericFromAccess( input_thread_t * ); - static int UpdateTitleSeekpointFromDemux( input_thread_t * ); static void UpdateGenericFromDemux( input_thread_t * ); static void UpdateTitleListfromDemux( input_thread_t * ); @@ -97,7 +92,7 @@ static void SlaveDemux( input_thread_t *p_input, bool *pb_demux_polled ); 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 void InputUpdateMeta( input_thread_t *p_input, demux_t *p_demux ); static void InputGetExtraFiles( input_thread_t *p_input, int *pi_list, char ***pppsz_list, const char *psz_access, const char *psz_path ); @@ -110,8 +105,9 @@ enum { SUB_FORCED = 0x01, SUB_CANFAIL = 0x02, }; -static void SubtitleAdd( input_thread_t *p_input, char *psz_subtitle, unsigned i_flags ); +static void input_SubtitleAdd( input_thread_t *, const char *, unsigned ); +static void input_SubtitleFileAdd( input_thread_t *, char *, unsigned ); static void input_ChangeState( input_thread_t *p_input, int i_state ); /* TODO fix name */ #undef input_Create @@ -313,7 +309,10 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, p_input->p = calloc( 1, sizeof( input_thread_private_t ) ); if( !p_input->p ) + { + vlc_object_release( p_input ); return NULL; + } /* Parse input options */ vlc_mutex_lock( &p_item->lock ); @@ -349,8 +348,6 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, p_input->p->p_item = p_item; /* Init Input fields */ - p_input->p->input.p_access = NULL; - p_input->p->input.p_stream = NULL; p_input->p->input.p_demux = NULL; p_input->p->input.b_title_demux = false; p_input->p->input.i_title = 0; @@ -433,7 +430,7 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, else if( !strncmp( psz_start, "time=", 5 ) ) { p_seekpoint->i_time_offset = atoll(psz_start + 5) * - 1000000; + CLOCK_FREQ; } psz_start = psz_end + 1; } @@ -576,16 +573,6 @@ static void MainLoopDemux( input_thread_t *p_input, bool *pb_changed, bool *pb_d } UpdateGenericFromDemux( p_input ); } - else if( p_input->p->input.p_access && - p_input->p->input.p_access->info.i_update ) - { - if( !p_input->p->input.b_title_demux ) - { - i_ret = UpdateTitleSeekpointFromAccess( p_input ); - *pb_changed = true; - } - UpdateGenericFromAccess( p_input ); - } } if( i_ret == 0 ) /* EOF */ @@ -645,7 +632,7 @@ static int MainLoopTryRepeat( input_thread_t *p_input, mtime_t *pi_start_mdate ) } else { - val.f_float = 0.0; + val.f_float = 0.f; input_ControlPush( p_input, INPUT_CONTROL_SET_POSITION, &val ); } @@ -683,8 +670,7 @@ static void MainLoopInterface( input_thread_t *p_input ) /* update current bookmark */ vlc_mutex_lock( &p_input->p->p_item->lock ); p_input->p->bookmark.i_time_offset = i_time; - if( p_input->p->input.p_stream ) - p_input->p->bookmark.i_byte_offset = stream_Tell( p_input->p->input.p_stream ); + p_input->p->bookmark.i_byte_offset = -1; vlc_mutex_unlock( &p_input->p->p_item->lock ); } @@ -715,8 +701,7 @@ static void MainLoop( input_thread_t *p_input, bool b_interactive ) { bool b_force_update; vlc_value_t val; - mtime_t i_current; - mtime_t i_wakeup; + mtime_t i_wakeup, i_current; bool b_paused; bool b_demux_polled; @@ -780,9 +765,9 @@ static void MainLoop( input_thread_t *p_input, bool b_interactive ) if( b_buffering ) { /* When postpone is in order, check the ES level every 20ms */ - mtime_t i_current = mdate(); - if( i_last_seek_mdate + INT64_C(125000) >= i_current ) - i_limit = __MIN( i_deadline, i_current + INT64_C(20000) ); + mtime_t now = mdate(); + if( i_last_seek_mdate + INT64_C(125000) >= now ) + i_limit = __MIN( i_deadline, now + INT64_C(20000) ); } int i_type; @@ -816,7 +801,7 @@ static void MainLoop( input_thread_t *p_input, bool b_interactive ) if( i_statistic_update < i_current ) { MainLoopStatistic( p_input ); - i_statistic_update = i_current + INT64_C(1000000); + i_statistic_update = i_current + CLOCK_FREQ; } /* Update the wakeup time */ @@ -937,11 +922,11 @@ static void StartTitle( input_thread_t * p_input ) input_ControlPush( p_input, INPUT_CONTROL_SET_SEEKPOINT, &val ); /* Start/stop/run time */ - p_input->p->i_start = (int64_t)(1000000.0 + p_input->p->i_start = llroundf(1000000.f * var_GetFloat( p_input, "start-time" )); - p_input->p->i_stop = (int64_t)(1000000.0 + p_input->p->i_stop = llroundf(1000000.f * var_GetFloat( p_input, "stop-time" )); - p_input->p->i_run = (int64_t)(1000000.0 + p_input->p->i_run = llroundf(1000000.f * var_GetFloat( p_input, "run-time" )); if( p_input->p->i_run < 0 ) { @@ -954,7 +939,7 @@ static void StartTitle( input_thread_t * p_input ) vlc_value_t s; msg_Dbg( p_input, "starting at time: %ds", - (int)( p_input->p->i_start / INT64_C(1000000) ) ); + (int)( p_input->p->i_start / CLOCK_FREQ ) ); s.i_time = p_input->p->i_start; input_ControlPush( p_input, INPUT_CONTROL_SET_TIME, &s ); @@ -971,15 +956,13 @@ static void LoadSubtitles( input_thread_t *p_input ) { /* Load subtitles */ /* Get fps and set it if not already set */ - const double f_fps = p_input->p->f_fps; - if( f_fps > 1.0 ) + const float f_fps = p_input->p->f_fps; + if( f_fps > 1.f ) { - float f_requested_fps; - var_Create( p_input, "sub-original-fps", VLC_VAR_FLOAT ); var_SetFloat( p_input, "sub-original-fps", f_fps ); - f_requested_fps = var_CreateGetFloat( p_input, "sub-fps" ); + float f_requested_fps = var_CreateGetFloat( p_input, "sub-fps" ); if( f_requested_fps != f_fps ) { var_Create( p_input, "sub-fps", VLC_VAR_FLOAT| @@ -999,7 +982,7 @@ static void LoadSubtitles( input_thread_t *p_input ) if( psz_subtitle != NULL ) { msg_Dbg( p_input, "forced subtitle: %s", psz_subtitle ); - SubtitleAdd( p_input, psz_subtitle, i_flags ); + input_SubtitleFileAdd( p_input, psz_subtitle, i_flags ); i_flags = SUB_NOFLAG; } @@ -1015,7 +998,7 @@ static void LoadSubtitles( input_thread_t *p_input ) if( !psz_subtitle || strcmp( psz_subtitle, ppsz_subs[i] ) ) { i_flags |= SUB_CANFAIL; - SubtitleAdd( p_input, ppsz_subs[i], i_flags ); + input_SubtitleFileAdd( p_input, ppsz_subs[i], i_flags ); i_flags = SUB_NOFLAG; } @@ -1053,7 +1036,7 @@ static void LoadSubtitles( input_thread_t *p_input ) { var_SetString( p_input, "sub-description", a->psz_description ? a->psz_description : ""); - SubtitleAdd( p_input, psz_mrl, i_flags ); + input_SubtitleAdd( p_input, psz_mrl, i_flags ); i_flags = SUB_NOFLAG; free( psz_mrl ); @@ -1143,11 +1126,6 @@ static void InitPrograms( input_thread_t * p_input ) { char *prgms; - if( var_GetBool( p_input, "sout-all" ) ) - { - i_es_out_mode = ES_OUT_MODE_ALL; - } - else if( (prgms = var_GetNonEmptyString( p_input, "programs" )) != NULL ) { char *buf; @@ -1167,6 +1145,10 @@ static void InitPrograms( input_thread_t * p_input ) free( prgms ); } + else if( var_GetBool( p_input, "sout-all" ) ) + { + i_es_out_mode = ES_OUT_MODE_ALL; + } } es_out_SetMode( p_input->p->p_es_out, i_es_out_mode ); @@ -1190,10 +1172,7 @@ static void InitPrograms( input_thread_t * p_input ) static int Init( input_thread_t * p_input ) { - vlc_meta_t *p_meta; - int i; - - for( i = 0; i < p_input->p->p_item->i_options; i++ ) + for( int i = 0; i < p_input->p->p_item->i_options; i++ ) { if( !strncmp( p_input->p->p_item->ppsz_options[i], "meta-file", 9 ) ) { @@ -1271,8 +1250,8 @@ static int Init( input_thread_t * p_input ) p_input->p->b_out_pace_control ? "async" : "sync" ); } - p_meta = vlc_meta_New(); - if( p_meta ) + vlc_meta_t *p_meta = vlc_meta_New(); + if( p_meta != NULL ) { /* Get meta data from users */ InputMetaUser( p_input, p_meta ); @@ -1284,8 +1263,8 @@ static int Init( input_thread_t * p_input ) for( int i = 0; i < p_input->p->i_slave; i++ ) InputSourceMeta( p_input, p_input->p->slave[i], p_meta ); - /* */ - InputUpdateMeta( p_input, p_meta ); + es_out_ControlSetMeta( p_input->p->p_es_out, p_meta ); + vlc_meta_Delete( p_meta ); } msg_Dbg( p_input, "`%s' successfully opened", @@ -1343,8 +1322,6 @@ error: /* Mark them deleted */ p_input->p->input.p_demux = NULL; - p_input->p->input.p_stream = NULL; - p_input->p->input.p_access = NULL; p_input->p->p_es_out = NULL; p_input->p->p_sout = NULL; @@ -1593,12 +1570,12 @@ static void ControlPause( input_thread_t *p_input, mtime_t i_control_date ) if( p_input->p->b_can_pause ) { - if( p_input->p->input.p_stream != NULL ) - i_ret = stream_Control( p_input->p->input.p_stream, - STREAM_SET_PAUSE_STATE, true ); + demux_t *p_demux = p_input->p->input.p_demux; + + if( p_demux->s != NULL ) + i_ret = stream_Control( p_demux->s, STREAM_SET_PAUSE_STATE, true ); else - i_ret = demux_Control( p_input->p->input.p_demux, - DEMUX_SET_PAUSE_STATE, true ); + i_ret = demux_Control( p_demux, DEMUX_SET_PAUSE_STATE, true ); if( i_ret ) { @@ -1627,12 +1604,12 @@ static void ControlUnpause( input_thread_t *p_input, mtime_t i_control_date ) if( p_input->p->b_can_pause ) { - if( p_input->p->input.p_stream ) - i_ret = stream_Control( p_input->p->input.p_stream, - STREAM_SET_PAUSE_STATE, false ); + demux_t *p_demux = p_input->p->input.p_demux; + + if( p_demux->s != NULL ) + i_ret = stream_Control( p_demux->s, STREAM_SET_PAUSE_STATE, false ); else - i_ret = demux_Control( p_input->p->input.p_demux, - DEMUX_SET_PAUSE_STATE, false ); + i_ret = demux_Control( p_demux, DEMUX_SET_PAUSE_STATE, false ); if( i_ret ) { /* FIXME What to do ? */ @@ -1670,27 +1647,26 @@ static bool Control( input_thread_t *p_input, case INPUT_CONTROL_SET_POSITION: { - double f_pos; - if( p_input->p->b_recording ) { msg_Err( p_input, "INPUT_CONTROL_SET_POSITION(_OFFSET) ignored while recording" ); break; } - f_pos = val.f_float; + + float f_pos = val.f_float; if( i_type != INPUT_CONTROL_SET_POSITION ) f_pos += var_GetFloat( p_input, "position" ); - if( f_pos < 0.0 ) - f_pos = 0.0; - else if( f_pos > 1.0 ) - f_pos = 1.0; + if( f_pos < 0.f ) + f_pos = 0.f; + else if( f_pos > 1.f ) + f_pos = 1.f; /* Reset the decoders states and clock sync (before calling the demuxer */ es_out_SetTime( p_input->p->p_es_out, -1 ); if( demux_Control( p_input->p->input.p_demux, DEMUX_SET_POSITION, - f_pos, !p_input->p->b_fast_seek ) ) + (double) f_pos, !p_input->p->b_fast_seek ) ) { msg_Err( p_input, "INPUT_CONTROL_SET_POSITION(_OFFSET) " - "%2.1f%% failed", f_pos * 100 ); + "%2.1f%% failed", (double)(f_pos * 100.f) ); } else { @@ -1825,12 +1801,10 @@ static bool Control( input_thread_t *p_input, if( i_rate != p_input->p->i_rate && !p_input->p->b_can_pace_control && p_input->p->b_can_rate_control ) { - int i_ret; - if( p_input->p->input.p_access ) - { - i_ret = VLC_EGENERIC; - } - else + demux_t *p_demux = p_input->p->input.p_demux; + int i_ret = VLC_EGENERIC; + + if( p_demux->s == NULL ) { if( !p_input->p->input.b_rescale_ts ) es_out_Control( p_input->p->p_es_out, ES_OUT_RESET_PCR ); @@ -1875,6 +1849,8 @@ static bool Control( input_thread_t *p_input, /* No need to force update, es_out does it if needed */ es_out_Control( p_input->p->p_es_out_display, ES_OUT_SET_ES_BY_ID, (int)val.i_int ); + + demux_Control( p_input->p->input.p_demux, DEMUX_SET_ES, (int)val.i_int ); break; case INPUT_CONTROL_RESTART_ES: @@ -1904,9 +1880,7 @@ static bool Control( input_thread_t *p_input, if( p_input->p->input.i_title <= 0 ) break; - int i_title = p_input->p->input.b_title_demux - ? p_input->p->input.p_demux->info.i_title - : p_input->p->input.p_access->info.i_title; + int i_title = p_input->p->input.p_demux->info.i_title; if( i_type == INPUT_CONTROL_SET_TITLE_PREV ) i_title--; else if( i_type == INPUT_CONTROL_SET_TITLE_NEXT ) @@ -1917,12 +1891,8 @@ static bool Control( input_thread_t *p_input, break; es_out_SetTime( p_input->p->p_es_out, -1 ); - if( p_input->p->input.b_title_demux ) - demux_Control( p_input->p->input.p_demux, - DEMUX_SET_TITLE, i_title ); - else - stream_Control( p_input->p->input.p_stream, - STREAM_SET_TITLE, i_title ); + demux_Control( p_input->p->input.p_demux, + DEMUX_SET_TITLE, i_title ); input_SendEventTitle( p_input, i_title ); break; } @@ -1938,21 +1908,10 @@ static bool Control( input_thread_t *p_input, if( p_input->p->input.i_title <= 0 ) break; - int i_title, i_seekpoint; - if( p_input->p->input.b_title_demux ) - { - demux_t *p_demux = p_input->p->input.p_demux; + demux_t *p_demux = p_input->p->input.p_demux; - i_title = p_demux->info.i_title; - i_seekpoint = p_demux->info.i_seekpoint; - } - else - { - access_t *p_access = p_input->p->input.p_access; - - i_title = p_access->info.i_title; - i_seekpoint = p_access->info.i_seekpoint; - } + int i_title = p_demux->info.i_title; + int i_seekpoint = p_demux->info.i_seekpoint; if( i_type == INPUT_CONTROL_SET_SEEKPOINT_PREV ) { @@ -1975,19 +1934,15 @@ static bool Control( input_thread_t *p_input, break; es_out_SetTime( p_input->p->p_es_out, -1 ); - if( p_input->p->input.b_title_demux ) - demux_Control( p_input->p->input.p_demux, - DEMUX_SET_SEEKPOINT, i_seekpoint ); - else - stream_Control( p_input->p->input.p_stream, - STREAM_SET_SEEKPOINT, i_seekpoint ); + demux_Control( p_input->p->input.p_demux, + DEMUX_SET_SEEKPOINT, i_seekpoint ); input_SendEventSeekpoint( p_input, i_title, i_seekpoint ); break; } case INPUT_CONTROL_ADD_SUBTITLE: if( val.psz_string ) - SubtitleAdd( p_input, val.psz_string, true ); + input_SubtitleFileAdd( p_input, val.psz_string, true ); break; case INPUT_CONTROL_ADD_SLAVE: @@ -1998,7 +1953,6 @@ static bool Control( input_thread_t *p_input, if( slave && !InputSourceInit( p_input, slave, uri, NULL, false ) ) { - vlc_meta_t *p_meta; int64_t i_time; /* Add the slave */ @@ -2023,15 +1977,7 @@ static bool Control( input_thread_t *p_input, } /* Get meta (access and demux) */ - p_meta = vlc_meta_New(); - if( p_meta ) - { - if( slave->p_stream != NULL ) - stream_Control( slave->p_stream, - STREAM_GET_META, p_meta ); - demux_Control( slave->p_demux, DEMUX_GET_META, p_meta ); - InputUpdateMeta( p_input, p_meta ); - } + InputUpdateMeta( p_input, slave->p_demux ); TAB_APPEND( p_input->p->i_slave, p_input->p->slave, slave ); } @@ -2083,41 +2029,24 @@ static bool Control( input_thread_t *p_input, case INPUT_CONTROL_SET_BOOKMARK: { - seekpoint_t bookmark; - - bookmark.i_time_offset = -1; - bookmark.i_byte_offset = -1; + mtime_t time_offset = -1; vlc_mutex_lock( &p_input->p->p_item->lock ); if( val.i_int >= 0 && val.i_int < p_input->p->i_bookmark ) { const seekpoint_t *p_bookmark = p_input->p->pp_bookmark[val.i_int]; - bookmark.i_time_offset = p_bookmark->i_time_offset; - bookmark.i_byte_offset = p_bookmark->i_byte_offset; + time_offset = p_bookmark->i_time_offset; } vlc_mutex_unlock( &p_input->p->p_item->lock ); - if( bookmark.i_time_offset < 0 && bookmark.i_byte_offset < 0 ) + if( time_offset < 0 ) { msg_Err( p_input, "invalid bookmark %"PRId64, val.i_int ); break; } - if( bookmark.i_time_offset >= 0 ) - { - val.i_time = bookmark.i_time_offset; - b_force_update = Control( p_input, INPUT_CONTROL_SET_TIME, val ); - } - else if( bookmark.i_byte_offset >= 0 && - p_input->p->input.p_stream ) - { - const uint64_t i_size = stream_Size( p_input->p->input.p_stream ); - if( i_size > 0 && (uint64_t)bookmark.i_byte_offset <= i_size ) - { - val.f_float = (double)bookmark.i_byte_offset / i_size; - b_force_update = Control( p_input, INPUT_CONTROL_SET_POSITION, val ); - } - } + val.i_time = time_offset; + b_force_update = Control( p_input, INPUT_CONTROL_SET_TIME, val ); break; } @@ -2204,12 +2133,7 @@ static void UpdateGenericFromDemux( input_thread_t *p_input ) if( p_demux->info.i_update & INPUT_UPDATE_META ) { - vlc_meta_t *p_meta = vlc_meta_New(); - if( p_meta ) - { - demux_Control( p_input->p->input.p_demux, DEMUX_GET_META, p_meta ); - InputUpdateMeta( p_input, p_meta ); - } + InputUpdateMeta( p_input, p_demux ); p_demux->info.i_update &= ~INPUT_UPDATE_META; } { @@ -2246,53 +2170,6 @@ static void UpdateTitleListfromDemux( input_thread_t *p_input ) } -/***************************************************************************** - * Update*FromAccess: - *****************************************************************************/ -static int UpdateTitleSeekpointFromAccess( input_thread_t *p_input ) -{ - access_t *p_access = p_input->p->input.p_access; - - if( p_access->info.i_update & INPUT_UPDATE_TITLE ) - { - input_SendEventTitle( p_input, p_access->info.i_title ); - - stream_Control( p_input->p->input.p_stream, STREAM_UPDATE_SIZE ); - - p_access->info.i_update &= ~INPUT_UPDATE_TITLE; - } - if( p_access->info.i_update & INPUT_UPDATE_SEEKPOINT ) - { - input_SendEventSeekpoint( p_input, - p_access->info.i_title, p_access->info.i_seekpoint ); - - p_access->info.i_update &= ~INPUT_UPDATE_SEEKPOINT; - } - /* Hmmm only works with master input */ - if( p_input->p->input.p_access == p_access ) - return UpdateTitleSeekpoint( p_input, - p_access->info.i_title, - p_access->info.i_seekpoint ); - return 1; -} -static void UpdateGenericFromAccess( input_thread_t *p_input ) -{ - stream_t *p_stream = p_input->p->input.p_stream; - access_t *p_access = p_input->p->input.p_access; - - if( p_access->info.i_update & INPUT_UPDATE_META ) - { - /* TODO maybe multi - access ? */ - vlc_meta_t *p_meta = vlc_meta_New(); - if( p_meta ) - { - stream_Control( p_stream, STREAM_GET_META, p_meta ); - InputUpdateMeta( p_input, p_meta ); - } - p_access->info.i_update &= ~INPUT_UPDATE_META; - } -} - /***************************************************************************** * InputSourceNew: *****************************************************************************/ @@ -2339,20 +2216,13 @@ static int InputSourceInit( input_thread_t *p_input, /* special hack for forcing a demuxer with --demux=module * (and do nothing with a list) */ psz_var_demux = var_GetNonEmptyString( p_input, "demux" ); - - if( psz_var_demux != NULL && - !strchr(psz_var_demux, ',' ) && - !strchr(psz_var_demux, ':' ) ) - { - psz_demux = psz_var_demux; - - msg_Dbg( p_input, "enforced demux ` %s'", psz_demux ); - } + psz_demux = psz_var_demux; + msg_Dbg( p_input, "specified demux `%s'", psz_demux ); } /* Try access_demux first */ - in->p_demux = demux_New( p_input, p_input, psz_access, psz_demux, psz_path, - NULL, p_input->p->p_es_out, false ); + in->p_demux = demux_New( p_input, p_input, psz_access, psz_demux, + psz_path, NULL, p_input->p->p_es_out, false ); } else { @@ -2425,14 +2295,8 @@ static int InputSourceInit( input_thread_t *p_input, goto error; } - /* Get infos from access */ - if( !p_input->b_preparsing ) - { - access_Control( p_access, ACCESS_GET_PTS_DELAY, &i_pts_delay ); - } - /* Access-forced demuxer (PARENTAL ADVISORY: EXPLICIT HACK) */ - if( !*psz_demux && *p_access->psz_demux ) + if( !psz_demux[0] || !strcasecmp( psz_demux, "any" ) ) psz_demux = p_access->psz_demux; /* */ @@ -2477,7 +2341,7 @@ static int InputSourceInit( input_thread_t *p_input, TAB_APPEND( i_input_list, ppsz_input_list, NULL ); /* Create the stream_t */ - in->p_stream = stream_AccessNew( p_access, ppsz_input_list ); + stream_t *p_stream = stream_AccessNew( p_access, ppsz_input_list ); if( ppsz_input_list ) { for( int i = 0; ppsz_input_list[i] != NULL; i++ ) @@ -2485,7 +2349,7 @@ static int InputSourceInit( input_thread_t *p_input, TAB_CLEAN( i_input_list, ppsz_input_list ); } - if( in->p_stream == NULL ) + if( p_stream == NULL ) { msg_Warn( p_input, "cannot create a stream_t from access" ); goto error; @@ -2494,21 +2358,20 @@ static int InputSourceInit( input_thread_t *p_input, /* Add stream filters */ char *psz_stream_filter = var_GetNonEmptyString( p_input, "stream-filter" ); - in->p_stream = stream_FilterChainNew( in->p_stream, - psz_stream_filter, - var_GetBool( p_input, "input-record-native" ) ); + p_stream = stream_FilterChainNew( p_stream, psz_stream_filter, + var_GetBool( p_input, "input-record-native" ) ); free( psz_stream_filter ); if( !p_input->b_preparsing ) { bool b; - stream_Control( in->p_stream, STREAM_CAN_CONTROL_PACE, + stream_Control( p_stream, STREAM_CAN_CONTROL_PACE, &in->b_can_pace_control ); in->b_can_rate_control = in->b_can_pace_control; in->b_rescale_ts = true; - stream_Control( in->p_stream, STREAM_CAN_PAUSE, &in->b_can_pause ); + stream_Control( p_stream, STREAM_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", @@ -2516,20 +2379,18 @@ static int InputSourceInit( input_thread_t *p_input, var_SetBool( p_input, "can-rewind", !in->b_rescale_ts && !in->b_can_pace_control ); - stream_Control( in->p_stream, STREAM_CAN_SEEK, &b ); + stream_Control( p_stream, STREAM_CAN_SEEK, &b ); var_SetBool( p_input, "can-seek", b ); in->b_title_demux = false; - if( stream_Control( in->p_stream, STREAM_GET_TITLE_INFO, - &in->title, &in->i_title, &in->i_title_offset, - &in->i_seekpoint_offset ) ) - TAB_INIT( in->i_title, in->title ); + + stream_Control( p_stream, STREAM_GET_PTS_DELAY, &i_pts_delay ); } in->p_demux = demux_New( p_input, p_input, psz_access, psz_demux, /* Take access/stream redirections into account: */ - in->p_stream->psz_path ? in->p_stream->psz_path : psz_path, - in->p_stream, p_input->p->p_es_out, + p_stream->psz_path ? p_stream->psz_path : psz_path, + p_stream, p_input->p->p_es_out, p_input->b_preparsing ); if( in->p_demux == NULL ) @@ -2544,6 +2405,7 @@ static int InputSourceInit( input_thread_t *p_input, _("The format of '%s' cannot be detected. " "Have a look at the log for details."), psz_mrl ); } + stream_Delete( p_stream ); goto error; } assert( in->p_demux->pf_demux != NULL ); @@ -2562,7 +2424,6 @@ static int InputSourceInit( input_thread_t *p_input, in->b_title_demux = true; } } - in->p_access = p_access; /* <- TODO: remove this nasty pointer */ } free( psz_var_demux ); @@ -2622,9 +2483,6 @@ error: if( in->p_demux ) demux_Delete( in->p_demux ); - if( in->p_stream ) - stream_Delete( in->p_stream ); - free( psz_var_demux ); free( psz_dup ); @@ -2641,9 +2499,6 @@ static void InputSourceClean( input_source_t *in ) if( in->p_demux ) demux_Delete( in->p_demux ); - if( in->p_stream ) - stream_Delete( in->p_stream ); - if( in->i_title > 0 ) { for( i = 0; i < in->i_title; i++ ) @@ -2658,7 +2513,6 @@ static void InputSourceClean( input_source_t *in ) static void InputSourceMeta( input_thread_t *p_input, input_source_t *p_source, vlc_meta_t *p_meta ) { - stream_t *p_stream = p_source->p_stream; demux_t *p_demux = p_source->p_demux; /* XXX Remember that checking against p_item->p_meta->i_status & ITEM_PREPARSED @@ -2666,11 +2520,6 @@ static void InputSourceMeta( input_thread_t *p_input, bool has_meta = false; - /* Read access meta */ - if( p_stream != NULL - && !stream_Control( p_stream, STREAM_GET_META, p_meta ) ) - has_meta = true; - /* Read demux meta */ if( !demux_Control( p_demux, DEMUX_GET_META, p_meta ) ) has_meta = true; @@ -2855,15 +2704,21 @@ static void AppendAttachment( int *pi_attachment, input_attachment_t ***ppp_atta * InputUpdateMeta: merge p_item meta data with p_meta taking care of * arturl and locking issue. *****************************************************************************/ -static void InputUpdateMeta( input_thread_t *p_input, vlc_meta_t *p_meta ) +static void InputUpdateMeta( input_thread_t *p_input, demux_t *p_demux ) { + vlc_meta_t *p_meta = vlc_meta_New(); + if( unlikely(p_meta == NULL) ) + return; + + demux_Control( p_demux, DEMUX_GET_META, p_meta ); + /* If metadata changed, then the attachments might have changed. We need to update them in case they contain album art. */ - input_source_t *in = &p_input->p->input; - int i_attachment; input_attachment_t **attachment; - if( !demux_Control( in->p_demux, DEMUX_GET_ATTACHMENTS, - &attachment, &i_attachment ) ) + int i_attachment; + + if( !demux_Control( p_demux, DEMUX_GET_ATTACHMENTS, + &attachment, &i_attachment ) ) { vlc_mutex_lock( &p_input->p->p_item->lock ); if( p_input->p->i_attachment > 0 ) @@ -2876,6 +2731,7 @@ static void InputUpdateMeta( input_thread_t *p_input, vlc_meta_t *p_meta ) i_attachment, attachment ); vlc_mutex_unlock( &p_input->p->p_item->lock ); } + es_out_ControlSetMeta( p_input->p->p_es_out, p_meta ); vlc_meta_Delete( p_meta ); } @@ -3113,19 +2969,56 @@ static void MRLSections( const char *p, /***************************************************************************** * input_AddSubtitles: add a subtitle file and enable it *****************************************************************************/ -static void SubtitleAdd( input_thread_t *p_input, char *psz_subtitle, unsigned i_flags ) +static void input_SubtitleAdd( input_thread_t *p_input, + const char *url, unsigned i_flags ) { - input_source_t *sub; + input_source_t *sub = InputSourceNew( p_input ); + if( sub == NULL ) + return; + vlc_value_t count; + + var_Change( p_input, "spu-es", VLC_VAR_CHOICESCOUNT, &count, NULL ); + + if( InputSourceInit( p_input, sub, url, "subtitle", + (i_flags & SUB_CANFAIL) ) ) + { + free( sub ); + return; + } + TAB_APPEND( p_input->p->i_slave, p_input->p->slave, sub ); + + if( !(i_flags & SUB_FORCED) ) + return; + + /* Select the ES */ vlc_value_t list; - char *psz_path, *psz_extension; + if( var_Change( p_input, "spu-es", VLC_VAR_GETLIST, &list, NULL ) ) + return; + if( count.i_int == 0 ) + count.i_int++; + /* if it was first one, there is disable too */ + + if( count.i_int < list.p_list->i_count ) + { + const int i_id = list.p_list->p_values[count.i_int].i_int; + + es_out_Control( p_input->p->p_es_out_display, ES_OUT_SET_ES_DEFAULT_BY_ID, i_id ); + es_out_Control( p_input->p->p_es_out_display, ES_OUT_SET_ES_BY_ID, i_id ); + } + var_FreeList( &list, NULL ); +} + +static void input_SubtitleFileAdd( input_thread_t *p_input, char *psz_subtitle, + unsigned i_flags ) +{ /* if we are provided a subtitle.sub file, * see if we don't have a subtitle.idx and use it instead */ - psz_path = strdup( psz_subtitle ); - if( psz_path ) + char *psz_path = strdup( psz_subtitle ); + if( likely(psz_path != NULL) ) { - psz_extension = strrchr( psz_path, '.'); + char *psz_extension = strrchr( psz_path, '.'); if( psz_extension && strcmp( psz_extension, ".sub" ) == 0 ) { struct stat st; @@ -3136,43 +3029,18 @@ static void SubtitleAdd( input_thread_t *p_input, char *psz_subtitle, unsigned i { msg_Dbg( p_input, "using %s as subtitle file instead of %s", psz_path, psz_subtitle ); - strcpy( psz_subtitle, psz_path ); + strcpy( psz_subtitle, psz_path ); /* <- FIXME! constify */ } } free( psz_path ); } char *url = vlc_path2uri( psz_subtitle, NULL ); - - var_Change( p_input, "spu-es", VLC_VAR_CHOICESCOUNT, &count, NULL ); - - sub = InputSourceNew( p_input ); - if( !sub || !url - || InputSourceInit( p_input, sub, url, "subtitle", (i_flags & SUB_CANFAIL) ) ) - { - free( sub ); - free( url ); + if( url == NULL ) return; - } - free( url ); - TAB_APPEND( p_input->p->i_slave, p_input->p->slave, sub ); - /* Select the ES */ - if( (i_flags & SUB_FORCED) && !var_Change( p_input, "spu-es", VLC_VAR_GETLIST, &list, NULL ) ) - { - if( count.i_int == 0 ) - count.i_int++; - /* if it was first one, there is disable too */ - - if( count.i_int < list.p_list->i_count ) - { - const int i_id = list.p_list->p_values[count.i_int].i_int; - - es_out_Control( p_input->p->p_es_out_display, ES_OUT_SET_ES_DEFAULT_BY_ID, i_id ); - es_out_Control( p_input->p->p_es_out_display, ES_OUT_SET_ES_BY_ID, i_id ); - } - var_FreeList( &list, NULL ); - } + input_SubtitleAdd( p_input, url, i_flags ); + free( url ); } /***************************************************************************** @@ -3217,7 +3085,7 @@ void input_UpdateStatistic( input_thread_t *p_input, /**/ /* TODO FIXME nearly the same logic that snapshot code */ -char *input_CreateFilename( vlc_object_t *p_obj, const char *psz_path, const char *psz_prefix, const char *psz_extension ) +char *input_CreateFilename( input_thread_t *input, const char *psz_path, const char *psz_prefix, const char *psz_extension ) { char *psz_file; DIR *path; @@ -3227,7 +3095,7 @@ char *input_CreateFilename( vlc_object_t *p_obj, const char *psz_path, const cha { closedir( path ); - char *psz_tmp = str_format( pl_Get(p_obj), psz_prefix ); + char *psz_tmp = str_format( input, psz_prefix ); if( !psz_tmp ) return NULL; @@ -3243,9 +3111,8 @@ char *input_CreateFilename( vlc_object_t *p_obj, const char *psz_path, const cha } else { - psz_file = str_format( pl_Get(p_obj), psz_path ); + psz_file = str_format( input, psz_path ); path_sanitize( psz_file ); return psz_file; } } -