X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finput%2Finput_dec.c;h=4c80c32ec39ab566ec0f1cb8008394dc14d236b9;hb=a17b39049c43d7a7677d52d24a798a4b8fc122d4;hp=f83006634a7c03150daaed5e227fbf735c84e7b6;hpb=1e67ea66dcb1f5aa9add966a3563b98b9cd3ccca;p=vlc diff --git a/src/input/input_dec.c b/src/input/input_dec.c index f83006634a..4c80c32ec3 100644 --- a/src/input/input_dec.c +++ b/src/input/input_dec.c @@ -2,7 +2,7 @@ * 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 * Gildas Bazin @@ -66,7 +66,8 @@ struct decoder_owner_sys_t 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; @@ -95,34 +96,17 @@ decoder_t * input_RunDecoder( input_thread_t * p_input, es_descriptor_t * p_es ) 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 { @@ -135,12 +119,10 @@ decoder_t * input_RunDecoder( input_thread_t * p_input, es_descriptor_t * p_es ) } /* 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.", @@ -275,7 +257,8 @@ void input_DecodePES( decoder_t * p_dec, pes_packet_t * p_pes ) } 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 ); @@ -324,7 +307,7 @@ static void input_NullPacket( input_thread_t * p_input, 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 ); } @@ -482,7 +465,8 @@ static decoder_t * CreateDecoder( input_thread_t * p_input, 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 ) @@ -573,7 +557,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block ) 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 ) @@ -582,11 +566,15 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block ) 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; @@ -607,7 +595,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block ) 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 ) { @@ -621,10 +609,13 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block ) 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; } @@ -706,9 +697,9 @@ static void DeleteDecoder( decoder_t * p_dec ) 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); }