1
mirror of https://code.videolan.org/videolan/vlc synced 2024-09-04 09:11:33 +02:00

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

Some stream output guru should really review this.
This commit is contained in:
Rémi Denis-Courmont 2007-09-23 18:52:55 +00:00
parent ef4a863507
commit 0faa56acde

View File

@ -76,6 +76,7 @@ static int Send( sout_stream_t *, sout_stream_id_t *, block_t* );
struct sout_stream_sys_t
{
input_thread_t *p_input;
unsigned i_es;
vlc_bool_t b_audio;
vlc_bool_t b_video;
@ -96,14 +97,8 @@ static int Open( vlc_object_t *p_this )
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;
@ -137,7 +132,6 @@ static void Close( vlc_object_t * p_this )
/* 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 );
}
@ -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 ) );
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 )
@ -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'",
(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;
}