#include <vlc_dialog.h>
#include <vlc_url.h>
#include <vlc_charset.h>
+#include <vlc_fs.h>
#include <vlc_strings.h>
#ifdef HAVE_SYS_STAT_H
/* Do not let a pts_delay from access/demux go beyong 60s */
#define INPUT_PTS_DELAY_MAX INT64_C(60000000)
+#undef input_Create
/**
* Create a new input_thread_t.
*
* \param p_resource an optional input ressource
* \return a pointer to the spawned input thread
*/
-
-input_thread_t *__input_Create( vlc_object_t *p_parent,
- input_item_t *p_item,
- const char *psz_log, input_resource_t *p_resource )
+input_thread_t *input_Create( vlc_object_t *p_parent,
+ input_item_t *p_item,
+ const char *psz_log, input_resource_t *p_resource )
{
-
return Create( p_parent, p_item, psz_log, false, p_resource );
}
+#undef input_CreateAndStart
/**
* Create a new input_thread_t and start it.
*
*
* \see input_Create
*/
-input_thread_t *__input_CreateAndStart( vlc_object_t *p_parent,
- input_item_t *p_item, const char *psz_log )
+input_thread_t *input_CreateAndStart( vlc_object_t *p_parent,
+ input_item_t *p_item, const char *psz_log )
{
- input_thread_t *p_input = __input_Create( p_parent, p_item, psz_log, NULL );
+ input_thread_t *p_input = input_Create( p_parent, p_item, psz_log, NULL );
if( input_Start( p_input ) )
{
return p_input;
}
+#undef input_Read
/**
* Initialize an input thread and run it until it stops by itself.
*
* \param p_item an input item
* \return an error code, VLC_SUCCESS on success
*/
-int __input_Read( vlc_object_t *p_parent, input_item_t *p_item )
+int input_Read( vlc_object_t *p_parent, input_item_t *p_item )
{
input_thread_t *p_input = Create( p_parent, p_item, NULL, false, NULL );
if( !p_input )
if( p_input == NULL )
return NULL;
+ vlc_object_attach( p_input, p_parent );
+
/* Construct a nice name for the input timer */
char psz_timer_name[255];
char * psz_name = input_item_GetName( p_item );
memset( &p_input->p->bookmark, 0, sizeof(p_input->p->bookmark) );
TAB_INIT( p_input->p->i_bookmark, p_input->p->pp_bookmark );
TAB_INIT( p_input->p->i_attachment, p_input->p->attachment );
- p_input->p->p_es_out_display = NULL;
- p_input->p->p_es_out = NULL;
p_input->p->p_sout = NULL;
p_input->p->b_out_pace_control = false;
if( p_input->b_preparsing )
p_input->i_flags |= OBJECT_FLAGS_QUIET | OBJECT_FLAGS_NOINTERACT;
+ /* Make sure the interaction option is honored */
+ if( !var_InheritBool( p_input, "interact" ) )
+ p_input->i_flags |= OBJECT_FLAGS_NOINTERACT;
+
/* */
memset( &p_input->p->counters, 0, sizeof( p_input->p->counters ) );
vlc_mutex_init( &p_input->p->counters.counters_lock );
+ p_input->p->p_es_out_display = input_EsOutNew( p_input, p_input->p->i_rate );
+ p_input->p->p_es_out = NULL;
+
/* Set the destructor when we are sure we are initialized */
vlc_object_set_destructor( p_input, (vlc_destructor_t)Destructor );
- /* Attach only once we are ready */
- vlc_object_attach( p_input, p_parent );
-
return p_input;
}
stats_TimerDump( p_input, STATS_TIMER_INPUT_LAUNCHING );
stats_TimerClean( p_input, STATS_TIMER_INPUT_LAUNCHING );
+ if( p_input->p->p_es_out_display )
+ es_out_Delete( p_input->p->p_es_out_display );
+
if( p_input->p->p_resource )
input_resource_Delete( p_input->p->p_resource );
/* Load subtitles from attachments */
int i_attachment = 0;
- char **ppsz_attachment = NULL;
+ input_attachment_t **pp_attachment = NULL;
vlc_mutex_lock( &p_input->p->p_item->lock );
for( int i = 0; i < p_input->p->i_attachment; i++ )
{
const input_attachment_t *a = p_input->p->attachment[i];
if( !strcmp( a->psz_mime, "application/x-srt" ) )
- TAB_APPEND( i_attachment, ppsz_attachment,
- strdup( a->psz_name ) );
+ TAB_APPEND( i_attachment, pp_attachment,
+ vlc_input_attachment_New( a->psz_name, NULL,
+ a->psz_description, NULL, 0 ) );
}
vlc_mutex_unlock( &p_input->p->p_item->lock );
+ if( i_attachment > 0 )
+ var_Create( p_input, "sub-description", VLC_VAR_STRING );
for( int i = 0; i < i_attachment; i++ )
{
+ input_attachment_t *a = pp_attachment[i];
+ if( !a )
+ continue;
char *psz_mrl;
- if( ppsz_attachment[i] &&
- asprintf( &psz_mrl, "attachment://%s", ppsz_attachment[i] ) >= 0 )
+ if( a->psz_name[i] &&
+ asprintf( &psz_mrl, "attachment://%s", a->psz_name ) >= 0 )
{
+ var_SetString( p_input, "sub-description", a->psz_description ? a->psz_description : "");
+
SubtitleAdd( p_input, psz_mrl, b_forced );
+
b_forced = false;
free( psz_mrl );
}
- free( ppsz_attachment[i] );
+ vlc_input_attachment_Delete( a );
}
- free( ppsz_attachment );
+ free( pp_attachment );
+ if( i_attachment > 0 )
+ var_Destroy( p_input, "sub-description" );
}
static void LoadSlaves( input_thread_t *p_input )
UpdatePtsDelay( p_input );
/* Set up es_out */
- es_out_Control( p_input->p->p_es_out, ES_OUT_SET_ACTIVE, true );
i_es_out_mode = ES_OUT_MODE_AUTO;
if( p_input->p->p_sout )
{
}
}
}
- es_out_Control( p_input->p->p_es_out, ES_OUT_SET_MODE, i_es_out_mode );
+ es_out_SetMode( p_input->p->p_es_out, i_es_out_mode );
/* Inform the demuxer about waited group (needed only for DVB) */
if( i_es_out_mode == ES_OUT_MODE_ALL )
static int Init( input_thread_t * p_input )
{
vlc_meta_t *p_meta;
- int i, ret;
+ int i;
for( i = 0; i < p_input->p->p_item->i_options; i++ )
{
InitStatistics( p_input );
#ifdef ENABLE_SOUT
- ret = InitSout( p_input );
- if( ret != VLC_SUCCESS )
- goto error_stats;
+ if( InitSout( p_input ) )
+ goto error;
#endif
/* Create es out */
- p_input->p->p_es_out_display = input_EsOutNew( p_input, p_input->p->i_rate );
- p_input->p->p_es_out = input_EsOutTimeshiftNew( p_input, p_input->p->p_es_out_display, p_input->p->i_rate );
- es_out_Control( p_input->p->p_es_out, ES_OUT_SET_ACTIVE, false );
- es_out_Control( p_input->p->p_es_out, ES_OUT_SET_MODE, ES_OUT_MODE_NONE );
+ p_input->p->p_es_out = input_EsOutTimeshiftNew( p_input, p_input->p->p_es_out_display, p_input->p->i_rate );
/* */
input_ChangeState( p_input, OPENING_S );
if( p_input->p->p_es_out )
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 );
+ es_out_SetMode( p_input->p->p_es_out_display, ES_OUT_MODE_END );
if( p_input->p->p_resource )
{
if( p_input->p->p_sout )
input_resource_SetInput( p_input->p->p_resource, NULL );
}
-#ifdef ENABLE_SOUT
-error_stats:
-#endif
if( !p_input->b_preparsing && libvlc_stats( p_input ) )
{
#define EXIT_COUNTER( c ) do { if( p_input->p->counters.p_##c ) \
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_es_out_display = NULL;
p_input->p->p_sout = NULL;
return VLC_EGENERIC;
input_ControlVarStop( p_input );
/* Stop es out activity */
- es_out_Control( p_input->p->p_es_out, ES_OUT_SET_ACTIVE, false );
- es_out_Control( p_input->p->p_es_out, ES_OUT_SET_MODE, ES_OUT_MODE_NONE );
+ es_out_SetMode( p_input->p->p_es_out, ES_OUT_MODE_NONE );
/* Clean up master */
InputSourceClean( &p_input->p->input );
/* Unload all modules */
if( p_input->p->p_es_out )
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 );
+ es_out_SetMode( p_input->p->p_es_out_display, ES_OUT_MODE_END );
if( !p_input->b_preparsing )
{
else if( bookmark.i_byte_offset >= 0 &&
p_input->p->input.p_stream )
{
- const int64_t i_size = stream_Size( p_input->p->input.p_stream );
+ const uint64_t i_size = stream_Size( p_input->p->input.p_stream );
if( i_size > 0 && bookmark.i_byte_offset <= i_size )
{
val.f_float = (double)bookmark.i_byte_offset / i_size;
VLC_OBJECT_GENERIC, "demux meta" );
if( !p_demux_meta )
return;
+ vlc_object_attach( p_demux_meta, p_demux );
p_demux_meta->p_demux = p_demux;
p_demux_meta->p_item = p_input->p->p_item;
if( asprintf( &psz_file, psz_format, psz_base, i ) < 0 )
break;
- if( utf8_stat( psz_file, &st ) || !S_ISREG( st.st_mode ) || !st.st_size )
+ if( vlc_stat( psz_file, &st ) || !S_ISREG( st.st_mode ) || !st.st_size )
{
free( psz_file );
break;
{
psz_path = psz_dup;
}
- *ppsz_access = psz_access ? psz_access : (char*)"";
- *ppsz_demux = psz_demux ? psz_demux : (char*)"";
+ *ppsz_access = psz_access ? psz_access : "";
+ *ppsz_demux = psz_demux ? psz_demux : "";
*ppsz_path = psz_path;
}
strcpy( psz_extension, ".idx" );
- if( !utf8_stat( psz_path, &st ) && S_ISREG( st.st_mode ) )
+ if( !vlc_stat( psz_path, &st ) && S_ISREG( st.st_mode ) )
{
msg_Dbg( p_input, "using %s subtitles file instead of %s",
psz_path, psz_subtitle );
char *psz_file;
DIR *path;
- path = utf8_opendir( psz_path );
+ path = vlc_opendir( psz_path );
if( path )
{
closedir( path );