X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finput%2Finput_programs.c;h=12c6efcbdf96911d3e70a30ad11714406c827e0d;hb=a70f8bb371466209770c4c3bcdb7137b94acef66;hp=2f405584271aa486f013439a70094d50d24762d4;hpb=a0c1805bd992c0ae1fa018156358d831fbaf8f93;p=vlc diff --git a/src/input/input_programs.c b/src/input/input_programs.c index 2f40558427..12c6efcbdf 100644 --- a/src/input/input_programs.c +++ b/src/input/input_programs.c @@ -2,7 +2,7 @@ * input_programs.c: es_descriptor_t, pgrm_descriptor_t management ***************************************************************************** * Copyright (C) 1999, 2000 VideoLAN - * $Id: input_programs.c,v 1.41 2001/03/15 01:42:20 sam Exp $ + * $Id: input_programs.c,v 1.54 2001/05/01 04:18:18 sam Exp $ * * Authors: Christophe Massiot * @@ -27,6 +27,8 @@ #include "defs.h" #include +#include /* memcpy(), memset() */ +#include /* off_t */ #include "config.h" #include "common.h" @@ -53,7 +55,13 @@ *****************************************************************************/ int input_InitStream( input_thread_t * p_input, size_t i_data_len ) { + + p_input->stream.i_method = INPUT_METHOD_NONE; p_input->stream.i_stream_id = 0; + + /* initialized to 0 since we don't give the signal to the interface + * before the end of input initialization */ + p_input->stream.b_changed = 0; p_input->stream.pp_es = NULL; p_input->stream.pp_selected_es = NULL; p_input->stream.pp_programs = NULL; @@ -88,6 +96,12 @@ void input_EndStream( input_thread_t * p_input ) input_DelES( p_input, p_input->stream.pp_es[0] ); } + /* Free all areas */ + while( p_input->stream.i_area_nb ) + { + input_DelArea( p_input, p_input->stream.pp_areas[0] ); + } + if( p_input->stream.p_demux_data != NULL ) { free( p_input->stream.p_demux_data ); @@ -160,8 +174,6 @@ pgrm_descriptor_t * input_AddProgram( input_thread_t * p_input, p_input->stream.pp_programs[i_pgrm_index]->p_vout = p_input->p_default_vout; - p_input->stream.pp_programs[i_pgrm_index]->p_aout - = p_input->p_default_aout; if( i_data_len ) { @@ -269,8 +281,10 @@ input_area_t * input_AddArea( input_thread_t * p_input ) p_input->stream.pp_areas[i_area_index]->i_size = 0; p_input->stream.pp_areas[i_area_index]->i_tell = 0; p_input->stream.pp_areas[i_area_index]->i_seek = NO_SEEK; - p_input->stream.pp_areas[i_area_index]->i_part_nb = 0; + p_input->stream.pp_areas[i_area_index]->i_part_nb = 1; p_input->stream.pp_areas[i_area_index]->i_part= 0; + p_input->stream.pp_areas[i_area_index]->i_angle_nb = 1; + p_input->stream.pp_areas[i_area_index]->i_angle = 0; return p_input->stream.pp_areas[i_area_index]; } @@ -368,10 +382,11 @@ es_descriptor_t * input_AddES( input_thread_t * p_input, /* Init its values */ p_es->i_id = i_es_id; + p_es->psz_desc[0] = '\0'; p_es->p_pes = NULL; p_es->p_decoder_fifo = NULL; p_es->b_audio = 0; - p_es->b_spu = 0; + p_es->i_cat = UNKNOWN_ES; if( i_data_len ) { @@ -563,7 +578,7 @@ static adec_config_t * GetAdecConfig( input_thread_t * p_input, intf_ErrMsg( "Unable to allocate memory in GetAdecConfig" ); return( NULL ); } - p_config->p_aout = p_input->p_default_aout; + if( InitDecConfig( p_input, p_es, &p_config->decoder_config ) == -1 ) { free( p_config ); @@ -582,6 +597,8 @@ static adec_config_t * GetAdecConfig( input_thread_t * p_input, /* FIXME */ vlc_thread_t adec_CreateThread( void * ); vlc_thread_t ac3dec_CreateThread( void * ); +vlc_thread_t ac3spdif_CreateThread( void * ); +vlc_thread_t spdif_CreateThread( void * ); vlc_thread_t vpar_CreateThread( void * ); vlc_thread_t spudec_CreateThread( void * ); @@ -591,7 +608,13 @@ int input_SelectES( input_thread_t * p_input, es_descriptor_t * p_es ) decoder_capabilities_t decoder; void * p_config; -#ifdef DEBUG_INPUT + if( p_es == NULL ) + { + intf_ErrMsg( "Nothing to do in input_SelectES" ); + return -1; + } + +#ifdef TRACE_INPUT intf_DbgMsg( "Selecting ES 0x%x", p_es->i_id ); #endif @@ -636,7 +659,15 @@ int input_SelectES( input_thread_t * p_input, es_descriptor_t * p_es ) case AC3_AUDIO_ES: if( p_main->b_audio ) { - decoder.pf_create_thread = ac3dec_CreateThread; + if( main_GetIntVariable( AOUT_SPDIF_VAR, 0 ) ) + { + decoder.pf_create_thread = spdif_CreateThread; + } + else + { + decoder.pf_create_thread = ac3dec_CreateThread; + } + p_config = (void *)GetAdecConfig( p_input, p_es ); /* Release the lock, not to block the input thread during @@ -646,7 +677,30 @@ int input_SelectES( input_thread_t * p_input, es_descriptor_t * p_es ) vlc_mutex_lock( &p_input->stream.stream_lock ); } break; +#if 0 + case LPCM_AUDIO_ES: + if( p_main->b_audio ) + { + if( p_main->b_spdif ) + { + decoder.pf_create_thread = spdif_CreateThread; + } + else + { + intf_ErrMsg( "input error: LPCM audio not handled yet" ); + break; + } + p_config = (void *)GetAdecConfig( p_input, p_es ); + + /* Release the lock, not to block the input thread during + * the creation of the thread. */ + vlc_mutex_unlock( &p_input->stream.stream_lock ); + p_es->thread_id = input_RunDecoder( &decoder, p_config ); + vlc_mutex_lock( &p_input->stream.stream_lock ); + } + break; +#endif case DVD_SPU_ES: if( p_main->b_video ) { @@ -683,7 +737,13 @@ int input_UnselectES( input_thread_t * p_input, es_descriptor_t * p_es ) int i_index = 0; -#ifdef DEBUG_INPUT + if( p_es == NULL ) + { + intf_ErrMsg( "Nothing to do in input_UnselectES" ); + return -1; + } + +#ifdef TRACE_INPUT intf_DbgMsg( "Unselecting ES 0x%x", p_es->i_id ); #endif @@ -693,12 +753,10 @@ int input_UnselectES( input_thread_t * p_input, es_descriptor_t * p_es ) return( -1 ); } - /* Release lock, not to block the input thread. */ - vlc_mutex_unlock( &p_input->stream.stream_lock ); input_EndDecoder( p_input, p_es ); - vlc_mutex_lock( &p_input->stream.stream_lock ); - if( p_es->p_decoder_fifo == NULL ) + if( ( p_es->p_decoder_fifo == NULL ) && + ( p_input->stream.i_selected_es_number > 0 ) ) { p_input->stream.i_selected_es_number--; @@ -715,11 +773,15 @@ int input_UnselectES( input_thread_t * p_input, es_descriptor_t * p_es ) p_input->stream.pp_selected_es, p_input->stream.i_selected_es_number * sizeof(es_descriptor_t *) ); + if( p_input->stream.pp_selected_es == NULL ) { - intf_ErrMsg( "Unable to realloc memory in input_UnSelectES" ); - return(-1); +#ifdef TRACE_INPUT + intf_DbgMsg( "No more selected ES in input_UnselectES" ); +#endif + return( 1 ); } } + return( 0 ); }