* input_dec.c: Functions for the management of decoders
*****************************************************************************
* Copyright (C) 1999-2004 VideoLAN
- * $Id: input_dec.c,v 1.88 2004/01/25 17:16:05 zorglub Exp $
+ * $Id: input_dec.c,v 1.94 2004/03/03 20:39:53 gbazin Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Gildas Bazin <gbazin@netcourrier.com>
vout_thread_t *p_vout;
- sout_packetizer_input_t *p_sout;
+ sout_instance_t *p_sout;
+ sout_packetizer_input_t *p_sout_input;
/* Current format in use by the output */
video_format_t video;
vlc_value_t val;
/* If we are in sout mode, search for packetizer module */
- var_Get( p_input, "sout", &val );
- if( !p_es->b_force_decoder && val.psz_string && *val.psz_string )
+ if( !p_es->b_force_decoder && p_input->stream.p_sout )
{
- free( val.psz_string );
- val.b_bool = VLC_TRUE;
-
- if( p_es->i_cat == AUDIO_ES )
- {
- var_Get( p_input, "sout-audio", &val );
- }
- else if( p_es->i_cat == VIDEO_ES )
+ /* Create the decoder configuration structure */
+ p_dec = CreateDecoder( p_input, p_es, VLC_OBJECT_PACKETIZER );
+ if( p_dec == NULL )
{
- var_Get( p_input, "sout-video", &val );
+ msg_Err( p_input, "could not create packetizer" );
+ return NULL;
}
- if( val.b_bool )
- {
- /* Create the decoder configuration structure */
- p_dec = CreateDecoder( p_input, p_es, VLC_OBJECT_PACKETIZER );
- if( p_dec == NULL )
- {
- msg_Err( p_input, "could not create packetizer" );
- return NULL;
- }
-
- p_dec->p_module =
- module_Need( p_dec, "packetizer", "$packetizer" );
- }
+ p_dec->p_module = module_Need( p_dec, "packetizer", "$packetizer", 0 );
}
else
{
}
/* default Get a suitable decoder module */
- p_dec->p_module = module_Need( p_dec, "decoder", "$codec" );
-
- if( val.psz_string ) free( val.psz_string );
+ p_dec->p_module = module_Need( p_dec, "decoder", "$codec", 0 );
}
- if( !p_dec || !p_dec->p_module )
+ if( !p_dec->p_module )
{
msg_Err( p_dec, "no suitable decoder module for fourcc `%4.4s'.\n"
"VLC probably does not support this sound or video format.",
}
p_block->i_pts = p_pes->i_pts;
p_block->i_dts = p_pes->i_dts;
- p_block->b_discontinuity = p_pes->b_discontinuity;
+ if( p_pes->b_discontinuity )
+ p_block->i_flags |= BLOCK_FLAG_DISCONTINUITY;
p_block->i_rate = p_pes->i_rate;
input_DecodeBlock( p_dec, p_block );
if( p_block )
{
memset( p_block->p_buffer, 0, PADDING_PACKET_SIZE );
- p_block->b_discontinuity = 1;
+ p_block->i_flags |= BLOCK_FLAG_DISCONTINUITY;
block_FifoPut( p_es->p_dec->p_owner->p_fifo, p_block );
}
p_dec->p_owner->p_aout = NULL;
p_dec->p_owner->p_aout_input = NULL;
p_dec->p_owner->p_vout = NULL;
- p_dec->p_owner->p_sout = NULL;
+ p_dec->p_owner->p_sout = p_input->stream.p_sout;
+ p_dec->p_owner->p_sout_input = NULL;
p_dec->p_owner->p_es_descriptor = p_es;
/* decoder fifo */
if( ( p_dec->p_owner->p_fifo = block_FifoNew( p_dec ) ) == NULL )
while( (p_sout_block = p_dec->pf_packetize( p_dec, &p_block )) )
{
- if( !p_dec->p_owner->p_sout )
+ if( !p_dec->p_owner->p_sout_input )
{
es_format_Copy( &p_dec->p_owner->sout, &p_dec->fmt_out );
if( p_dec->p_owner->p_es_descriptor->p_pgrm )
p_dec->p_owner->p_es_descriptor->p_pgrm->i_number;
}
p_dec->p_owner->sout.i_id = p_dec->p_owner->p_es_descriptor->i_id - 1;
+ if( p_dec->fmt_in.psz_language )
+ {
+ p_dec->p_owner->sout.psz_language = strdup( p_dec->fmt_in.psz_language );
+ }
- p_dec->p_owner->p_sout =
- sout_InputNew( p_dec, &p_dec->p_owner->sout );
+ p_dec->p_owner->p_sout_input =
+ sout_InputNew( p_dec->p_owner->p_sout, &p_dec->p_owner->sout );
- if( p_dec->p_owner->p_sout == NULL )
+ if( p_dec->p_owner->p_sout_input == NULL )
{
msg_Err( p_dec, "cannot create packetizer output" );
p_dec->b_error = VLC_TRUE;
sout_buffer_t *p_sout_buffer;
p_sout_buffer =
- sout_BufferNew( p_dec->p_owner->p_sout->p_sout,
+ sout_BufferNew( p_dec->p_owner->p_sout_input->p_sout,
p_sout_block->i_buffer );
if( p_sout_buffer == NULL )
{
p_sout_buffer->i_pts = p_sout_block->i_pts;
p_sout_buffer->i_dts = p_sout_block->i_dts;
p_sout_buffer->i_length = p_sout_block->i_length;
+ p_sout_buffer->i_flags =
+ (p_sout_block->i_flags << SOUT_BUFFER_FLAGS_BLOCK_SHIFT)
+ & SOUT_BUFFER_FLAGS_BLOCK_MASK;
block_Release( p_sout_block );
- sout_InputSendBuffer( p_dec->p_owner->p_sout, p_sout_buffer );
+ sout_InputSendBuffer( p_dec->p_owner->p_sout_input, p_sout_buffer );
p_sout_block = p_next;
}
vout_Request( p_dec, p_dec->p_owner->p_vout, 0, 0, 0, 0 );
}
- if( p_dec->p_owner->p_sout )
+ if( p_dec->p_owner->p_sout_input )
{
- sout_InputDelete( p_dec->p_owner->p_sout );
+ sout_InputDelete( p_dec->p_owner->p_sout_input );
if( p_dec->p_owner->sout.i_extra ) free(p_dec->p_owner->sout.p_extra);
}