# include "config.h"
#endif
-#include <vlc/vlc.h>
+#include <vlc_common.h>
#include <ctype.h>
#include <limits.h>
#include <vlc_interface.h>
#include <vlc_url.h>
#include <vlc_charset.h>
-#include <vlc_playlist.h>
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
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,
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 );
+
/* Init Common fields */
p_input->b_eof = false;
p_input->b_can_pace_control = true;
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;
/* */
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 );
{
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 );
- priv->p_sout = NULL;
- }
- }
+ if( priv->p_sout )
+ sout_DeleteInstance( priv->p_sout );
#endif
vlc_gc_decref( p_input->p->input.p_item );
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 );
}
/* */
}
/**
- * Initialize an input thread and run it. This thread will clean after himself,
+ * Initialize an input thread and run it. This thread will clean after itself,
* you can forget about it. It can work either in blocking or non-blocking mode
*
* \param p_parent a vlc_object
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 );
- if( !p_input && p_sout )
- {
- SoutKeep( p_sout );
+ p_input = Create( p_parent, p_item, NULL, false, NULL );
+ if( !p_input )
return VLC_EGENERIC;
- }
- p_input->p->b_sout_keep = b_sout_keep;
if( b_block )
{
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;
}
/*****************************************************************************
/* 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 */
/* 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 */
{
/* 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;
}
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 ) return;
-
- msg_Dbg( p_sout, "sout has been kept" );
- vlc_object_attach( p_sout, p_playlist );
-
- vlc_object_release( p_playlist );
-}
-
/*****************************************************************************
* Control
*****************************************************************************/
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( libvlc_priv (p_input->p_libvlc)->p_playlist,
- "item-change", p_input->p->input.p_item->i_id );
p_access->info.i_update &= ~INPUT_UPDATE_META;
}
static void UpdateItemLength( input_thread_t *p_input, int64_t i_length )
{
input_item_SetDuration( p_input->p->input.p_item, (mtime_t) i_length );
-
- if( !p_input->b_preparsing )
- {
- pl_Yield( p_input );
- var_SetInteger( libvlc_priv (p_input->p_libvlc)->p_playlist,
- "item-change", p_input->p->input.p_item->i_id );
- pl_Release( p_input );
- }
}
/*****************************************************************************
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;
+}