Commit 0faa56ac authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Only reference the input when we have at least one codec - fixes #1287.

Some stream output guru should really review this.
parent ef4a8635
...@@ -76,6 +76,7 @@ static int Send( sout_stream_t *, sout_stream_id_t *, block_t* ); ...@@ -76,6 +76,7 @@ static int Send( sout_stream_t *, sout_stream_id_t *, block_t* );
struct sout_stream_sys_t struct sout_stream_sys_t
{ {
input_thread_t *p_input; input_thread_t *p_input;
unsigned i_es;
vlc_bool_t b_audio; vlc_bool_t b_audio;
vlc_bool_t b_video; vlc_bool_t b_video;
...@@ -96,14 +97,8 @@ static int Open( vlc_object_t *p_this ) ...@@ -96,14 +97,8 @@ static int Open( vlc_object_t *p_this )
p_stream->p_cfg ); p_stream->p_cfg );
p_sys = malloc( sizeof( sout_stream_sys_t ) ); p_sys = malloc( sizeof( sout_stream_sys_t ) );
p_sys->p_input = vlc_object_find( p_stream, VLC_OBJECT_INPUT, p_sys->p_input = NULL;
FIND_PARENT ); p_sys->i_es = 0;
if( !p_sys->p_input )
{
msg_Err( p_stream, "cannot find p_input" );
free( p_sys );
return VLC_EGENERIC;
}
var_Get( p_stream, SOUT_CFG_PREFIX "audio", &val ); var_Get( p_stream, SOUT_CFG_PREFIX "audio", &val );
p_sys->b_audio = val.b_bool; p_sys->b_audio = val.b_bool;
...@@ -137,7 +132,6 @@ static void Close( vlc_object_t * p_this ) ...@@ -137,7 +132,6 @@ static void Close( vlc_object_t * p_this )
/* update p_sout->i_out_pace_nocontrol */ /* update p_sout->i_out_pace_nocontrol */
p_stream->p_sout->i_out_pace_nocontrol--; p_stream->p_sout->i_out_pace_nocontrol--;
vlc_object_release( p_sys->p_input );
free( p_sys ); free( p_sys );
} }
...@@ -158,6 +152,20 @@ static sout_stream_id_t * Add( sout_stream_t *p_stream, es_format_t *p_fmt ) ...@@ -158,6 +152,20 @@ static sout_stream_id_t * Add( sout_stream_t *p_stream, es_format_t *p_fmt )
} }
id = malloc( sizeof( sout_stream_id_t ) ); 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 ); id->p_dec = input_DecoderNew( p_sys->p_input, p_fmt, VLC_TRUE );
if( id->p_dec == NULL ) if( id->p_dec == NULL )
...@@ -165,15 +173,21 @@ static sout_stream_id_t * Add( sout_stream_t *p_stream, es_format_t *p_fmt ) ...@@ -165,15 +173,21 @@ static sout_stream_id_t * Add( sout_stream_t *p_stream, es_format_t *p_fmt )
msg_Err( p_stream, "cannot create decoder for fcc=`%4.4s'", msg_Err( p_stream, "cannot create decoder for fcc=`%4.4s'",
(char*)&p_fmt->i_codec ); (char*)&p_fmt->i_codec );
free( id ); free( id );
if( p_sys->i_es == 0 )
vlc_object_release( p_sys->p_input );
return NULL; return NULL;
} }
p_sys->i_es++;
return id; return id;
} }
static int Del( sout_stream_t *p_stream, sout_stream_id_t *id ) static int Del( sout_stream_t *p_stream, sout_stream_id_t *id )
{ {
input_DecoderDelete( id->p_dec ); input_DecoderDelete( id->p_dec );
if( --p_stream->p_sys->i_es == 0)
vlc_object_release( p_stream->p_sys->p_input );
free( id ); free( id );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment