X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finput%2Finput_programs.c;h=ddff45529212f1da49f3388715d566a54c82c4db;hb=647cca0ebb2e897a570018ba80483bb81a7d90c6;hp=a6f8dc3793342f78da85b30fd1de2c19c818bc10;hpb=10dda32d99399292d79edaf98b83ee75f0cd5726;p=vlc diff --git a/src/input/input_programs.c b/src/input/input_programs.c index a6f8dc3793..ddff455292 100644 --- a/src/input/input_programs.c +++ b/src/input/input_programs.c @@ -1,9 +1,8 @@ /***************************************************************************** * input_programs.c: es_descriptor_t, pgrm_descriptor_t management - * FIXME : check the return value of realloc() and malloc() ! ***************************************************************************** * Copyright (C) 1999, 2000 VideoLAN - * $Id: input_programs.c,v 1.16 2000/12/22 15:34:24 massiot Exp $ + * $Id: input_programs.c,v 1.26 2001/01/18 05:13:22 sam Exp $ * * Authors: * @@ -41,7 +40,6 @@ #include "input_ext-intf.h" #include "input_ext-dec.h" #include "input.h" -#include "input_dec.h" #include "main.h" /* --noaudio --novideo */ @@ -62,7 +60,12 @@ void input_InitStream( input_thread_t * p_input, size_t i_data_len ) if( i_data_len ) { - p_input->stream.p_demux_data = malloc( i_data_len ); + if ( (p_input->stream.p_demux_data = malloc( i_data_len )) == NULL ) + { + intf_ErrMsg( "Unable to allocate memory in input_InitStream"); + /* FIXME : find a way to tell if failed */ + return; + } memset( p_input->stream.p_demux_data, 0, i_data_len ); } } @@ -72,23 +75,17 @@ void input_InitStream( input_thread_t * p_input, size_t i_data_len ) *****************************************************************************/ void input_EndStream( input_thread_t * p_input ) { - int i; - /* Free all programs and associated ES, and associated decoders. */ - for( i = 0; i < p_input->stream.i_pgrm_number; i++ ) + while( p_input->stream.i_pgrm_number ) { - /* Don't put i instead of 0 !! */ input_DelProgram( p_input, p_input->stream.pp_programs[0] ); } - free( p_input->stream.pp_programs ); /* Free standalone ES */ - for( i = 0; i < p_input->stream.i_es_number; i++ ) + while( p_input->stream.i_es_number ) { input_DelES( p_input, p_input->stream.pp_es[0] ); } - free( p_input->stream.pp_es ); - free( p_input->stream.pp_selected_es ); } /***************************************************************************** @@ -127,11 +124,21 @@ pgrm_descriptor_t * input_AddProgram( input_thread_t * p_input, p_input->stream.pp_programs = realloc( p_input->stream.pp_programs, p_input->stream.i_pgrm_number * sizeof(pgrm_descriptor_t *) ); - + if( p_input->stream.pp_programs == NULL ) + { + intf_ErrMsg( "Unable to realloc memory in input_AddProgram" ); + return( NULL ); + } + /* Allocate the structure to store this description */ p_input->stream.pp_programs[i_pgrm_index] = malloc( sizeof(pgrm_descriptor_t) ); - + if( p_input->stream.pp_programs[i_pgrm_index] == NULL ) + { + intf_ErrMsg( "Unable to allocate memory in input_AddProgram" ); + return( NULL ); + } + /* Init this entry */ p_input->stream.pp_programs[i_pgrm_index]->i_number = i_pgrm_id; p_input->stream.pp_programs[i_pgrm_index]->b_is_ok = 0; @@ -157,6 +164,11 @@ pgrm_descriptor_t * input_AddProgram( input_thread_t * p_input, { p_input->stream.pp_programs[i_pgrm_index]->p_demux_data = malloc( i_data_len ); + if( p_input->stream.pp_programs[i_pgrm_index]->p_demux_data == NULL ) + { + intf_ErrMsg( "Unable to allocate memory in input_AddProgram" ); + return( NULL ); + } memset( p_input->stream.pp_programs[i_pgrm_index]->p_demux_data, 0, i_data_len ); } @@ -171,21 +183,18 @@ pgrm_descriptor_t * input_AddProgram( input_thread_t * p_input, *****************************************************************************/ void input_DelProgram( input_thread_t * p_input, pgrm_descriptor_t * p_pgrm ) { - int i_index, i_pgrm_index; + int i_pgrm_index; ASSERT( p_pgrm ); intf_DbgMsg("Deleting description for pgrm %d", p_pgrm->i_number); /* Free the structures that describe the es that belongs to that program */ - for( i_index = 0; i_index < p_pgrm->i_es_number; i_index++ ) + while( p_pgrm->i_es_number ) { - input_DelES( p_input, p_pgrm->pp_es[i_index] ); + input_DelES( p_input, p_pgrm->pp_es[0] ); } - /* Free the table of es descriptors */ - free( p_pgrm->pp_es ); - /* Free the demux data */ if( p_pgrm->p_demux_data != NULL ) { @@ -202,12 +211,19 @@ void input_DelProgram( input_thread_t * p_input, pgrm_descriptor_t * p_pgrm ) /* Remove this program from the stream's list of programs */ p_input->stream.i_pgrm_number--; + p_input->stream.pp_programs[i_pgrm_index] = p_input->stream.pp_programs[p_input->stream.i_pgrm_number]; p_input->stream.pp_programs = realloc( p_input->stream.pp_programs, p_input->stream.i_pgrm_number * sizeof(pgrm_descriptor_t *) ); + if( p_input->stream.i_pgrm_number && p_input->stream.pp_programs == NULL) + { + intf_ErrMsg( "input error: unable to realloc program list" + " in input_DelProgram" ); + } + /* Free the description of this program */ free( p_pgrm ); } @@ -243,13 +259,23 @@ es_descriptor_t * input_AddES( input_thread_t * p_input, { es_descriptor_t * p_es; - intf_DbgMsg("Adding description for ES %d", i_es_id); + intf_DbgMsg("Adding description for ES 0x%x", i_es_id); p_es = (es_descriptor_t *)malloc( sizeof(es_descriptor_t) ); + if( p_es == NULL ) + { + intf_ErrMsg( "Unable to allocate memory in input_AddES" ); + return( NULL); + } p_input->stream.i_es_number++; p_input->stream.pp_es = realloc( p_input->stream.pp_es, p_input->stream.i_es_number * sizeof(es_descriptor_t *) ); + if( p_input->stream.pp_es == NULL ) + { + intf_ErrMsg( "Unable to realloc memory in input_AddES" ); + return( NULL ); + } p_input->stream.pp_es[p_input->stream.i_es_number - 1] = p_es; p_es->i_id = i_es_id; @@ -261,6 +287,11 @@ es_descriptor_t * input_AddES( input_thread_t * p_input, if( i_data_len ) { p_es->p_demux_data = malloc( i_data_len ); + if( p_es->p_demux_data == NULL ) + { + intf_ErrMsg( "Unable to allocate memory in input_AddES" ); + return( NULL ); + } memset( p_es->p_demux_data, 0, i_data_len ); } else @@ -275,6 +306,11 @@ es_descriptor_t * input_AddES( input_thread_t * p_input, p_pgrm->pp_es = realloc( p_pgrm->pp_es, p_pgrm->i_es_number * sizeof(es_descriptor_t *) ); + if( p_pgrm->pp_es == NULL ) + { + intf_ErrMsg( "Unable to realloc memory in input_AddES" ); + return( NULL ); + } p_pgrm->pp_es[p_pgrm->i_es_number - 1] = p_es; p_es->p_pgrm = p_pgrm; } @@ -300,8 +336,7 @@ void input_DelES( input_thread_t * p_input, es_descriptor_t * p_es ) /* Kill associated decoder, if any. */ if( p_es->p_decoder_fifo != NULL ) { - input_EndDecoder( p_es->p_decoder_fifo, p_es->thread_id ); - free( p_es->p_decoder_fifo ); + input_EndDecoder( p_input, p_es ); } /* Remove this ES from the description of the program if it is associated to @@ -317,6 +352,10 @@ void input_DelES( input_thread_t * p_input, es_descriptor_t * p_es ) p_pgrm->pp_es = realloc( p_pgrm->pp_es, p_pgrm->i_es_number * sizeof(es_descriptor_t *)); + if( p_pgrm->i_es_number && p_pgrm->pp_es == NULL ) + { + intf_ErrMsg( "Unable to realloc memory in input_DelES" ); + } break; } } @@ -344,6 +383,11 @@ void input_DelES( input_thread_t * p_input, es_descriptor_t * p_es ) p_input->stream.pp_es = realloc( p_input->stream.pp_es, p_input->stream.i_es_number * sizeof(es_descriptor_t *)); + if( p_input->stream.i_es_number && p_input->stream.pp_es == NULL ) + { + intf_ErrMsg( "Unable to realloc memory in input_DelES" ); + } + } #ifdef STATS @@ -390,7 +434,7 @@ void input_DumpStream( input_thread_t * p_input ) static int InitDecConfig( input_thread_t * p_input, es_descriptor_t * p_es, decoder_config_t * p_config ) { - p_config->i_stream_id = p_es->i_stream_id; + p_config->i_id = p_es->i_id; p_config->i_type = p_es->i_type; p_config->p_stream_ctrl = &p_input->stream.control; @@ -426,11 +470,16 @@ static vdec_config_t * GetVdecConfig( input_thread_t * p_input, vdec_config_t * p_config; p_config = (vdec_config_t *)malloc( sizeof(vdec_config_t) ); + if( p_config == NULL ) + { + intf_ErrMsg( "Unable to allocate memory in GetVdecConfig" ); + return( NULL ); + } p_config->p_vout = p_input->p_default_vout; if( InitDecConfig( p_input, p_es, &p_config->decoder_config ) == -1 ) { free( p_config ); - return NULL; + return( NULL ); } return( p_config ); @@ -444,12 +493,17 @@ static adec_config_t * GetAdecConfig( input_thread_t * p_input, { adec_config_t * p_config; - p_config = (adec_config_t *)malloc( sizeof(adec_config_t) ); + p_config = (adec_config_t *)malloc( sizeof(adec_config_t)); + if( p_config == NULL ) + { + 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 ); - return NULL; + return( NULL ); } return( p_config ); @@ -470,7 +524,7 @@ int input_SelectES( input_thread_t * p_input, es_descriptor_t * p_es ) decoder_capabilities_t decoder; #ifdef DEBUG_INPUT - intf_DbgMsg( "Selecting ES %d", p_es->i_id ); + intf_DbgMsg( "Selecting ES 0x%x", p_es->i_id ); #endif if( p_es->p_decoder_fifo != NULL ) @@ -525,6 +579,11 @@ int input_SelectES( input_thread_t * p_input, es_descriptor_t * p_es ) break; } + if( p_es->thread_id == 0 ) + { + return( -1 ); + } + if( p_es->p_decoder_fifo != NULL ) { p_input->stream.i_selected_es_number++; @@ -532,6 +591,11 @@ int input_SelectES( 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_SelectES" ); + return(-1); + } p_input->stream.pp_selected_es[p_input->stream.i_selected_es_number - 1] = p_es; }