+ /* Clean up master */
+ InputSourceClean( &p_input->p->input );
+
+ /* Delete slave */
+ for( i = 0; i < p_input->p->i_slave; i++ )
+ {
+ InputSourceClean( p_input->p->slave[i] );
+ free( p_input->p->slave[i] );
+ }
+ if( p_input->p->slave ) free( p_input->p->slave );
+
+ /* Unload all modules */
+ if( p_input->p->p_es_out )
+ input_EsOutDelete( p_input->p->p_es_out );
+
+ if( !p_input->b_preparsing )
+ {
+#define CL_CO( c ) stats_CounterClean( p_input->p->counters.p_##c ); p_input->p->counters.p_##c = NULL;
+ if( p_input->p_libvlc->b_stats )
+ {
+ /* make sure we are up to date */
+ stats_ComputeInputStats( p_input, p_input->p->input.p_item->p_stats );
+ if( p_input->p_libvlc->p_playlist->p_stats_computer == p_input )
+ {
+ stats_ComputeGlobalStats( p_input->p_libvlc->p_playlist,
+ p_input->p_libvlc->p_playlist->p_stats );
+ p_input->p_libvlc->p_playlist->p_stats_computer = NULL;
+ }
+ CL_CO( read_bytes );
+ CL_CO( read_packets );
+ CL_CO( demux_read );
+ CL_CO( input_bitrate );
+ CL_CO( demux_bitrate );
+ CL_CO( played_abuffers );
+ CL_CO( lost_abuffers );
+ CL_CO( displayed_pictures );
+ CL_CO( lost_pictures );
+ CL_CO( decoded_audio) ;
+ CL_CO( decoded_video );
+ CL_CO( decoded_sub) ;
+ }
+
+ /* Close optional stream output instance */
+ if( p_input->p->p_sout )
+ {
+ CL_CO( sout_sent_packets );
+ CL_CO( sout_sent_bytes );
+ CL_CO( sout_send_bitrate );
+
+ vlc_object_detach( p_input->p->p_sout );
+ }
+#undef CL_CO
+ }
+
+ if( p_input->p->i_attachment > 0 )
+ {
+ for( i = 0; i < p_input->p->i_attachment; i++ )
+ vlc_input_attachment_Delete( p_input->p->attachment[i] );
+ TAB_CLEAN( p_input->p->i_attachment, p_input->p->attachment );
+ }
+
+ vlc_mutex_destroy( &p_input->p->counters.counters_lock );
+
+ /* Tell we're dead */
+ p_input->b_dead = VLC_TRUE;
+}
+
+static sout_instance_t *SoutFind( vlc_object_t *p_parent, input_item_t *p_item, vlc_bool_t *pb_sout_keep )
+{
+ vlc_bool_t b_keep_sout = var_CreateGetBool( p_parent, "sout-keep" );
+ sout_instance_t *p_sout = NULL;
+ int i;