* - seekable (if you can seek, it doesn't say if 'bar display' has be shown
* or not, for that check position != 0.0)
* - can-pause
+ * - teletext-es to get the index of spu track that is teletext --1 if no teletext)
* * For intf callback upon changes
* - intf-change
* - rate-change for when playback rate changes
char * psz_name = input_item_GetName( p_item );
snprintf( psz_timer_name, sizeof(psz_timer_name),
"input launching for '%s'", psz_name );
+
+ msg_Dbg( p_input, "Creating an input for '%s'", psz_name);
+
free( psz_name );
/* Start a timer to mesure how long it takes
memset( &p_input->p->counters, 0, sizeof( p_input->p->counters ) );
vlc_mutex_init( &p_input->p->counters.counters_lock );
- /* Attach only once we are ready */
- vlc_object_attach( p_input, p_parent );
-
/* 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;
}
{
input_thread_private_t *priv = p_input->p;
+#ifndef NDEBUG
+ char * psz_name = input_item_GetName( p_input->p->input.p_item );
+ msg_Dbg( p_input, "Destroying the input for '%s'", psz_name);
+ free( psz_name );
+#endif
+
vlc_event_manager_fini( &p_input->p->event_manager );
stats_TimerDump( p_input, STATS_TIMER_INPUT_LAUNCHING );
*
* \param the input thread to stop
*/
-void input_StopThread( input_thread_t *p_input )
+static void ObjectKillChildrens( input_thread_t *p_input, vlc_object_t *p_obj )
{
vlc_list_t *p_list;
int i;
- /* Set die for input */
- vlc_object_kill( p_input );
- /* FIXME: seems to be duplicated in ControlPush(INPUT_CONTROL_SET_DIE) */
+ if( p_obj->i_object_type == VLC_OBJECT_VOUT ||
+ p_obj->i_object_type == VLC_OBJECT_AOUT ||
+ p_obj == VLC_OBJECT(p_input->p->p_sout) )
+ return;
- /* We cannot touch p_input fields directly (we come from another thread),
- * so use the vlc_object_find way, it's perfectly safe */
+ vlc_object_kill( p_obj );
- /* Set die for all access, stream, demux, etc */
- p_list = vlc_list_children( p_input );
+ p_list = vlc_list_children( p_obj );
for( i = 0; i < p_list->i_count; i++ )
- vlc_object_kill( p_list->p_values[i].p_object );
+ ObjectKillChildrens( p_input, p_list->p_values[i].p_object );
vlc_list_release( p_list );
+}
+void input_StopThread( input_thread_t *p_input )
+{
+ /* 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) );
input_ControlPush( p_input, INPUT_CONTROL_SET_DIE, NULL );
}
{
case INPUT_CONTROL_SET_DIE:
msg_Dbg( p_input, "control: stopping input" );
- /* Mark all submodules to die */
- if( p_input->p->input.p_access )
- vlc_object_kill( p_input->p->input.p_access );
- if( p_input->p->input.p_stream )
- vlc_object_kill( p_input->p->input.p_stream );
- vlc_object_kill( p_input->p->input.p_demux );
- vlc_object_kill( p_input );
+ /* Mark all submodules to die */
+ ObjectKillChildrens( p_input, VLC_OBJECT(p_input) );
break;
case INPUT_CONTROL_SET_POSITION: