X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finput%2Finput_dec.c;h=71675b8a20bb09496aec32f91f2d0a1851d92ec6;hb=a6bccb1c2976437ddb918dfc934ec0ca73a07933;hp=3ccfeb712b1e295fd593b56d2fd3def78c1e4e96;hpb=248eb0b5b90523c8929c33dae781ca5b500c906d;p=vlc diff --git a/src/input/input_dec.c b/src/input/input_dec.c index 3ccfeb712b..71675b8a20 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-2001 VideoLAN - * $Id: input_dec.c,v 1.17 2001/11/28 15:08:06 massiot Exp $ + * $Id: input_dec.c,v 1.32 2002/04/23 14:16:20 sam Exp $ * * Authors: Christophe Massiot * @@ -24,25 +24,17 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include "defs.h" - #include #include /* memcpy(), memset() */ #include /* off_t */ -#include "config.h" -#include "common.h" -#include "intf_msg.h" -#include "threads.h" -#include "mtime.h" +#include #include "stream_control.h" #include "input_ext-dec.h" #include "input_ext-intf.h" #include "input_ext-plugins.h" -#include "modules.h" - static decoder_config_t * CreateDecoderConfig( input_thread_t * p_input, es_descriptor_t * p_es ); static void DeleteDecoderConfig( decoder_config_t * p_config ); @@ -53,13 +45,22 @@ static void DeleteDecoderConfig( decoder_config_t * p_config ); vlc_thread_t input_RunDecoder( input_thread_t * p_input, es_descriptor_t * p_es ) { - probedata_t probedata; vlc_thread_t thread_id; + char * psz_plugin = NULL; - /* Get a suitable module */ - probedata.i_type = p_es->i_type; + if( p_es->i_type == MPEG1_AUDIO_ES || p_es->i_type == MPEG2_AUDIO_ES ) + { + psz_plugin = config_GetPszVariable( "mpeg-adec" ); + } + if( p_es->i_type == AC3_AUDIO_ES ) + { + psz_plugin = config_GetPszVariable( "ac3-adec" ); + } - p_es->p_module = module_Need( MODULE_CAPABILITY_DEC, &probedata ); + /* Get a suitable module */ + p_es->p_module = module_Need( MODULE_CAPABILITY_DECODER, psz_plugin, + (void *)&p_es->i_type ); + if( psz_plugin ) free( psz_plugin ); if( p_es->p_module == NULL ) { intf_ErrMsg( "input error: no suitable decoder module for type 0x%x", @@ -80,7 +81,7 @@ vlc_thread_t input_RunDecoder( input_thread_t * p_input, /* Spawn the decoder thread */ if ( vlc_thread_create( &thread_id, "decoder", (vlc_thread_func_t)p_es->p_module-> - p_functions->dec.functions.dec.pf_RunThread, + p_functions->dec.functions.dec.pf_run, (void *)p_es->p_config) ) { intf_ErrMsg( "input error: can't spawn decoder thread \"%s\"", @@ -90,9 +91,6 @@ vlc_thread_t input_RunDecoder( input_thread_t * p_input, return( 0 ); } - intf_DbgMsg( "input debug: decoder \"%s\"thread created", - p_es->p_module->psz_name ); - return thread_id; } @@ -144,21 +142,13 @@ void input_DecodePES( decoder_fifo_t * p_decoder_fifo, pes_packet_t * p_pes ) { vlc_mutex_lock( &p_decoder_fifo->data_lock ); - if( !DECODER_FIFO_ISFULL( *p_decoder_fifo ) ) - { - p_decoder_fifo->buffer[p_decoder_fifo->i_end] = p_pes; - DECODER_FIFO_INCEND( *p_decoder_fifo ); + p_pes->p_next = NULL; + *p_decoder_fifo->pp_last = p_pes; + p_decoder_fifo->pp_last = &p_pes->p_next; + p_decoder_fifo->i_depth++; - /* Warn the decoder that it's got work to do. */ - vlc_cond_signal( &p_decoder_fifo->data_wait ); - } - else - { - /* The FIFO is full !!! This should not happen. */ - p_decoder_fifo->pf_delete_pes( p_decoder_fifo->p_packets_mgt, - p_pes ); - intf_ErrMsg( "PES trashed - decoder fifo full !" ); - } + /* Warn the decoder that it's got work to do. */ + vlc_cond_signal( &p_decoder_fifo->data_wait ); vlc_mutex_unlock( &p_decoder_fifo->data_lock ); } @@ -255,16 +245,17 @@ static decoder_config_t * CreateDecoderConfig( input_thread_t * p_input, vlc_cond_init(&p_config->p_decoder_fifo->data_wait); p_es->p_decoder_fifo = p_config->p_decoder_fifo; - p_config->pf_init_bit_stream = p_input->pf_init_bit_stream; - p_config->i_id = p_es->i_id; p_config->i_type = p_es->i_type; + p_config->p_demux_data = p_es->p_demux_data; + p_config->p_stream_ctrl = &p_input->stream.control; - p_config->p_decoder_fifo->i_start = p_config->p_decoder_fifo->i_end = 0; + p_config->p_decoder_fifo->p_first = NULL; + p_config->p_decoder_fifo->pp_last = &p_config->p_decoder_fifo->p_first; + p_config->p_decoder_fifo->i_depth = 0; p_config->p_decoder_fifo->b_die = p_config->p_decoder_fifo->b_error = 0; p_config->p_decoder_fifo->p_packets_mgt = p_input->p_method_data; - p_config->p_decoder_fifo->pf_delete_pes = p_input->pf_delete_pes; return p_config; } @@ -274,16 +265,12 @@ static decoder_config_t * CreateDecoderConfig( input_thread_t * p_input, *****************************************************************************/ static void DeleteDecoderConfig( decoder_config_t * p_config ) { + intf_StatMsg( "input stats: killing decoder for 0x%x, type 0x%x, %d PES in FIFO", + p_config->i_id, p_config->i_type, + p_config->p_decoder_fifo->i_depth ); /* Free all packets still in the decoder fifo. */ -#if 0 - while( !DECODER_FIFO_ISEMPTY( *p_config->p_decoder_fifo ) ) - { - p_config->p_decoder_fifo->pf_delete_pes( - p_config->p_decoder_fifo->p_packets_mgt, - DECODER_FIFO_START( *p_config->p_decoder_fifo ) ); - DECODER_FIFO_INCSTART( *p_config->p_decoder_fifo ); - } -#endif + input_DeletePES( p_config->p_decoder_fifo->p_packets_mgt, + p_config->p_decoder_fifo->p_first ); /* Destroy the lock and cond */ vlc_cond_destroy( &p_config->p_decoder_fifo->data_wait );