- vlc_mutex_destroy( &p_input->p->counters.counters_lock );
-
- vlc_cond_destroy( &p_input->p->wait_control );
- vlc_mutex_destroy( &p_input->p->lock_control );
- free( p_input->p );
-}
-
-/**
- * Initialize an input thread and run it. You will need to monitor the
- * thread to clean up after it is done
- *
- * \param p_parent a vlc_object
- * \param p_item an input item
- * \return a pointer to the spawned input thread
- */
-input_thread_t *__input_CreateThread( vlc_object_t *p_parent,
- input_item_t *p_item )
-{
- return __input_CreateThreadExtended( p_parent, p_item, NULL, NULL );
-}
-
-/* */
-input_thread_t *__input_CreateThreadExtended( vlc_object_t *p_parent,
- input_item_t *p_item,
- 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_resource );
- if( !p_input )
- return NULL;
-
- /* Create thread and wait for its readiness. */
- if( vlc_thread_create( p_input, "input", Run,
- VLC_THREAD_PRIORITY_INPUT ) )
- {
- input_ChangeState( p_input, ERROR_S );
- msg_Err( p_input, "cannot create input thread" );
- vlc_object_detach( p_input );
- vlc_object_release( p_input );
- return NULL;
- }
-
- return p_input;
-}
-
-/**
- * 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
- * \param p_item an input item
- * \param b_block should we block until read is finished ?
- * \return an error code, VLC_SUCCESS on success
- */
-int __input_Read( vlc_object_t *p_parent, input_item_t *p_item,
- bool b_block )
-{
- input_thread_t *p_input;
-
- p_input = Create( p_parent, p_item, NULL, false, NULL );
- if( !p_input )
- return VLC_EGENERIC;
-
- if( b_block )
- {
- RunAndDestroy( VLC_OBJECT(p_input) );
- return VLC_SUCCESS;
- }
- else
- {
- if( vlc_thread_create( p_input, "input", RunAndDestroy,
- VLC_THREAD_PRIORITY_INPUT ) )
- {
- input_ChangeState( p_input, ERROR_S );
- msg_Err( p_input, "cannot create input thread" );
- vlc_object_release( p_input );
- return VLC_EGENERIC;
- }
- }
- return VLC_SUCCESS;
-}
-
-/**
- * Initialize an input and initialize it to preparse the item
- * This function is blocking. It will only accept parsing regular files.
- *
- * \param p_parent a vlc_object_t
- * \param p_item an input item
- * \return VLC_SUCCESS or an error
- */
-int input_Preparse( vlc_object_t *p_parent, input_item_t *p_item )
-{
- input_thread_t *p_input;
-
- /* Allocate descriptor */
- p_input = Create( p_parent, p_item, NULL, true, NULL );
- if( !p_input )
- return VLC_EGENERIC;
-
- if( !Init( p_input ) )
- End( p_input );
-
- vlc_object_detach( p_input );
- vlc_object_release( p_input );
-
- return VLC_SUCCESS;
-}
-
-/**
- * Request a running input thread to stop and die
- *
- * \param the input thread to stop
- */
-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
- * unlock the control loop */
- ObjectKillChildrens( p_input, VLC_OBJECT(p_input) );
-
- vlc_mutex_lock( &p_input->p->lock_control );
- p_input->p->b_abort |= b_abort;
- vlc_mutex_unlock( &p_input->p->lock_control );
-
- input_ControlPush( p_input, INPUT_CONTROL_SET_DIE, NULL );
-}
-
-input_resource_t *input_DetachResource( input_thread_t *p_input )
-{
- assert( p_input->b_dead );
-
- input_resource_SetInput( p_input->p->p_resource, NULL );
-
- input_resource_t *p_resource = input_resource_Detach( p_input->p->p_resource );
- p_input->p->p_sout = NULL;
-
- return p_resource;
-}
-
-/**
- * Get the item from an input thread
- * FIXME it does not increase ref count of the item.
- * if it is used after p_input is destroyed nothing prevent it from
- * being freed.
- */
-input_item_t *input_GetItem( input_thread_t *p_input )
-{
- assert( p_input && p_input->p );
- return p_input->p->p_item;
-}
-
-/*****************************************************************************
- * ObjectKillChildrens
- *****************************************************************************/
-static void ObjectKillChildrens( input_thread_t *p_input, vlc_object_t *p_obj )
-{
- vlc_list_t *p_list;
- int i;
-
- /* FIXME ObjectKillChildrens seems a very bad idea in fact */
- i = vlc_internals( p_obj )->i_object_type;
- if( i == VLC_OBJECT_VOUT ||i == VLC_OBJECT_AOUT ||
- p_obj == VLC_OBJECT(p_input->p->p_sout) ||
- i == VLC_OBJECT_DECODER || i == VLC_OBJECT_PACKETIZER )
- return;
-
- vlc_object_kill( p_obj );
-
- p_list = vlc_list_children( p_obj );
- for( i = 0; i < p_list->i_count; i++ )
- ObjectKillChildrens( p_input, p_list->p_values[i].p_object );
- vlc_list_release( p_list );
-}
-
-/*****************************************************************************
- * Run: main thread loop
- * This is the "normal" thread that spawns the input processing chain,
- * reads the stream, cleans up and waits
- *****************************************************************************/
-static void *Run( vlc_object_t *p_this )
-{
- input_thread_t *p_input = (input_thread_t *)p_this;
- const int canc = vlc_savecancel();
-
- if( Init( p_input ) )
- goto exit;
-
- MainLoop( p_input );
-
- /* Clean up */
- End( p_input );
-
-exit:
- /* Tell we're dead */
- if( p_input->p->b_abort )
- input_SendEventAbort( p_input );
- input_SendEventDead( p_input );