struct sout_stream_sys_t
{
input_thread_t *p_input;
+ unsigned i_es;
vlc_bool_t b_audio;
vlc_bool_t b_video;
p_stream->p_cfg );
p_sys = malloc( sizeof( sout_stream_sys_t ) );
- p_sys->p_input = vlc_object_find( p_stream, VLC_OBJECT_INPUT,
- FIND_PARENT );
- if( !p_sys->p_input )
- {
- msg_Err( p_stream, "cannot find p_input" );
- free( p_sys );
- return VLC_EGENERIC;
- }
+ p_sys->p_input = NULL;
+ p_sys->i_es = 0;
var_Get( p_stream, SOUT_CFG_PREFIX "audio", &val );
p_sys->b_audio = val.b_bool;
/* update p_sout->i_out_pace_nocontrol */
p_stream->p_sout->i_out_pace_nocontrol--;
- vlc_object_release( p_sys->p_input );
free( p_sys );
}
}
id = malloc( sizeof( sout_stream_id_t ) );
+ if( id == NULL )
+ return NULL;
+
+ if( p_sys->i_es == 0 )
+ {
+ p_sys->p_input = vlc_object_find( p_stream, VLC_OBJECT_INPUT,
+ FIND_PARENT );
+ if( p_sys->p_input == NULL )
+ {
+ msg_Err( p_stream, "cannot find input" );
+ free( id );
+ return NULL;
+ }
+ }
id->p_dec = input_DecoderNew( p_sys->p_input, p_fmt, VLC_TRUE );
if( id->p_dec == NULL )
msg_Err( p_stream, "cannot create decoder for fcc=`%4.4s'",
(char*)&p_fmt->i_codec );
free( id );
+ if( p_sys->i_es == 0 )
+ vlc_object_release( p_sys->p_input );
return NULL;
}
+ p_sys->i_es++;
return id;
}
static int Del( sout_stream_t *p_stream, sout_stream_id_t *id )
{
input_DecoderDelete( id->p_dec );
+ if( --p_stream->p_sys->i_es == 0)
+ vlc_object_release( p_stream->p_sys->p_input );
+
free( id );
return VLC_SUCCESS;
}