1
mirror of https://code.videolan.org/videolan/vlc synced 2024-09-12 13:44:56 +02:00

* Removed all arbitrary limits on the number of elementary streams.

This commit is contained in:
Christophe Massiot 2000-12-21 13:54:15 +00:00
parent cc50abf770
commit c570d9bc89
5 changed files with 71 additions and 100 deletions

View File

@ -168,12 +168,6 @@
* interface, and is in fact an interface limitation */
#define INPUT_MAX_THREADS 10
/* Maximum number of ES definitions in a TS stream */
#define INPUT_MAX_ES 42
/* Maximum number of selected ES in an input thread */
#define INPUT_MAX_SELECTED_ES 42
/* Maximum size of a data packet (128 kB) */
#define INPUT_MAX_PACKET_SIZE 131072

View File

@ -4,7 +4,7 @@
* control the pace of reading.
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
* $Id: input_ext-intf.h,v 1.5 2000/12/20 17:49:40 massiot Exp $
* $Id: input_ext-intf.h,v 1.6 2000/12/21 13:54:15 massiot Exp $
*
* Authors:
*
@ -210,11 +210,12 @@ typedef struct input_thread_s
/* General stream description */
stream_descriptor_t stream; /* PAT tables */
es_descriptor_t p_es[INPUT_MAX_ES];
/* carried elementary streams */
es_descriptor_t ** pp_es; /* carried elementary streams */
int i_es_number;
/* List of streams to demux */
es_descriptor_t * pp_selected_es[INPUT_MAX_SELECTED_ES];
es_descriptor_t ** pp_selected_es;
int i_selected_es_number;
/* For auto-launch of decoders */
struct aout_thread_s * p_default_aout;

View File

@ -4,7 +4,7 @@
* decoders.
*****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN
* $Id: input.c,v 1.60 2000/12/20 16:04:31 massiot Exp $
* $Id: input.c,v 1.61 2000/12/21 13:54:15 massiot Exp $
*
* Authors:
*
@ -75,7 +75,6 @@ input_thread_t *input_CreateThread ( input_config_t * p_config, int *pi_status )
{
input_thread_t * p_input; /* thread descriptor */
int i_status; /* thread status */
int i;
/* Allocate descriptor */
intf_DbgMsg("\n");
@ -96,14 +95,10 @@ input_thread_t *input_CreateThread ( input_config_t * p_config, int *pi_status )
p_input->p_config = p_config;
/* Initialize stream description */
for( i = 0; i < INPUT_MAX_SELECTED_ES; i++ )
{
p_input->pp_selected_es[i] = NULL;
}
for( i= 0; i < INPUT_MAX_ES; i++ )
{
p_input->p_es[i].i_id = EMPTY_ID;
}
p_input->pp_es = NULL;
p_input->pp_selected_es = NULL;
p_input->i_es_number = 0;
p_input->i_selected_es_number = 0;
p_input->stream.i_pgrm_number = 0;
/* Initialize stream control properties. */
@ -318,9 +313,7 @@ static void EndThread( input_thread_t * p_input )
#endif
/* Destroy all decoder threads */
for( i_es_loop = 0;
(i_es_loop < INPUT_MAX_ES)
&& (p_input->pp_selected_es[i_es_loop] != NULL) ;
for( i_es_loop = 0; i_es_loop < p_input->i_selected_es_number;
i_es_loop++ )
{
p_input->pp_selected_es[i_es_loop]->p_decoder_fifo->b_die = 1;

View File

@ -1,8 +1,9 @@
/*****************************************************************************
* 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.10 2000/12/21 13:25:51 massiot Exp $
* $Id: input_programs.c,v 1.11 2000/12/21 13:54:15 massiot Exp $
*
* Authors:
*
@ -184,53 +185,41 @@ es_descriptor_t * input_AddES( input_thread_t * p_input,
pgrm_descriptor_t * p_pgrm, u16 i_es_id,
size_t i_data_len )
{
int i_index;
es_descriptor_t * p_es = NULL;
es_descriptor_t * p_es;
intf_DbgMsg("Adding description for ES %d", i_es_id);
/* Find an empty slot to store the description of that es */
for( i_index = 0; i_index < INPUT_MAX_ES &&
p_input->p_es[i_index].i_id != EMPTY_ID; i_index++ );
p_es = (es_descriptor_t *)malloc( sizeof(es_descriptor_t) );
p_input->i_es_number++;
p_input->pp_es = realloc( p_input->pp_es, p_input->i_es_number
* sizeof(es_descriptor_t *) );
p_input->pp_es[p_input->i_es_number - 1] = p_es;
p_es->i_id = i_es_id;
if( i_index >= INPUT_MAX_ES )
/* Init its values */
p_es->b_discontinuity = 0;
p_es->p_pes = NULL;
p_es->p_decoder_fifo = NULL;
if( i_data_len )
{
/* No slot is empty */
intf_ErrMsg("Stream carries too many ES for our decoder");
p_es->p_demux_data = malloc( i_data_len );
memset( p_es->p_demux_data, 0, i_data_len );
}
/* Add this ES to the program definition if one is given */
if( p_pgrm )
{
p_pgrm->i_es_number++;
p_pgrm->pp_es = realloc( p_pgrm->pp_es,
p_pgrm->i_es_number
* sizeof(es_descriptor_t *) );
p_pgrm->pp_es[p_pgrm->i_es_number - 1] = p_es;
p_es->p_pgrm = p_pgrm;
}
else
{
/* Reserve the slot for that ES */
p_es = &p_input->p_es[i_index];
p_es->i_id = i_es_id;
intf_DbgMsg("Slot %d in p_es table assigned to ES %d",
i_index, i_es_id);
/* Init its values */
p_es->b_discontinuity = 0;
p_es->p_pes = NULL;
p_es->p_decoder_fifo = NULL;
if( i_data_len )
{
p_es->p_demux_data = malloc( i_data_len );
memset( p_es->p_demux_data, 0, i_data_len );
}
/* Add this ES to the program definition if one is given */
if( p_pgrm )
{
p_pgrm->i_es_number++;
p_pgrm->pp_es = realloc( p_pgrm->pp_es,
p_pgrm->i_es_number
* sizeof(es_descriptor_t *) );
p_pgrm->pp_es[p_pgrm->i_es_number - 1] = p_es;
p_es->p_pgrm = p_pgrm;
}
else
{
p_es->p_pgrm = NULL;
}
p_es->p_pgrm = NULL;
}
return p_es;
@ -241,17 +230,17 @@ es_descriptor_t * input_AddES( input_thread_t * p_input,
*****************************************************************************/
void input_DelES( input_thread_t * p_input, u16 i_id )
{
int i_index;
int i_index, i_es;
pgrm_descriptor_t * p_pgrm = NULL;
es_descriptor_t * p_es = NULL;
/* Look for the description of the ES */
for( i_index = 0; i_index < INPUT_MAX_ES; i_index++ )
for( i_es = 0; i_es < p_input->i_es_number; i_es++ )
{
if( p_input->p_es[i_index].i_id == i_id )
if( p_input->pp_es[i_es]->i_id == i_id )
{
p_es = &p_input->p_es[i_index];
p_pgrm = p_input->p_es[i_index].p_pgrm;
p_es = p_input->pp_es[i_es];
p_pgrm = p_input->pp_es[i_es]->p_pgrm;
break;
}
}
@ -276,15 +265,18 @@ void input_DelES( input_thread_t * p_input, u16 i_id )
}
}
/* The table of stream descriptors is static, so don't free memory
* but just mark the slot as unused */
p_es->i_id = EMPTY_ID;
/* Free the demux data */
if( p_es->p_demux_data != NULL )
{
free( p_es->p_demux_data );
}
/* Free the ES */
free( p_es );
p_input->i_es_number--;
p_input->pp_es[i_es] = p_input->pp_es[p_input->i_es_number];
p_input->pp_es = realloc( p_input->pp_es, p_input->i_es_number
* sizeof(es_descriptor_t *));
}
#ifdef STATS
@ -402,7 +394,6 @@ static adec_config_t * GetAdecConfig( input_thread_t * p_input,
int input_SelectES( input_thread_t * p_input, es_descriptor_t * p_es )
{
int i;
es_descriptor_t ** p_spot = NULL;
#ifdef DEBUG_INPUT
intf_DbgMsg( "Selecting ES %d", p_es->i_id );
@ -414,22 +405,6 @@ int input_SelectES( input_thread_t * p_input, es_descriptor_t * p_es )
return( -1 );
}
/* Find a free spot in pp_selected_es. */
for( i = 0; i < INPUT_MAX_SELECTED_ES; i++ )
{
if( p_input->pp_selected_es[i] == NULL )
{
p_spot = &p_input->pp_selected_es[i];
break;
}
}
if( p_spot == NULL )
{
intf_ErrMsg( "Too many ES selected" );
return( -1 );
}
switch( p_es->i_type )
{
case MPEG1_AUDIO_ES:
@ -474,7 +449,11 @@ int input_SelectES( input_thread_t * p_input, es_descriptor_t * p_es )
if( p_es->p_decoder_fifo != NULL )
{
*p_spot = p_es;
p_input->i_selected_es_number++;
p_input->pp_selected_es = realloc( p_input->pp_selected_es,
p_input->i_selected_es_number
* sizeof(es_descriptor_t *) );
p_input->pp_selected_es[p_input->i_selected_es_number - 1] = p_es;
}
return( 0 );
}

View File

@ -2,7 +2,7 @@
* mpeg_system.c: TS, PS and PES management
*****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN
* $Id: mpeg_system.c,v 1.12 2000/12/20 20:09:19 sam Exp $
* $Id: mpeg_system.c,v 1.13 2000/12/21 13:54:15 massiot Exp $
*
* Authors:
*
@ -667,6 +667,7 @@ static u16 GetID( data_packet_t * p_data )
/*****************************************************************************
* DecodePSM: Decode the Program Stream Map information
*****************************************************************************/
/* FIXME : deprecated code ! */
static void DecodePSM( input_thread_t * p_input, data_packet_t * p_data )
{
stream_ps_data_t * p_demux =
@ -709,6 +710,7 @@ static void DecodePSM( input_thread_t * p_input, data_packet_t * p_data )
/* 4 == minimum useful size of a section */
while( p_byte + 4 <= p_end )
{
#if 0
p_input->p_es[i_es].i_id
= p_input->p_es[i_es].i_stream_id
= p_byte[1];
@ -735,6 +737,7 @@ static void DecodePSM( input_thread_t * p_input, data_packet_t * p_data )
#endif
i_es++;
#endif
}
vlc_mutex_unlock( &p_input->stream.stream_lock );
@ -771,7 +774,8 @@ es_descriptor_t * input_ParsePS( input_thread_t * p_input,
if( p_input->stream.pp_programs[0]->b_is_ok )
{
/* Look only at the selected ES. */
for( i_dummy = 0; i_dummy < INPUT_MAX_SELECTED_ES; i_dummy++ )
for( i_dummy = 0; i_dummy < p_input->i_selected_es_number;
i_dummy++ )
{
if( p_input->pp_selected_es[i_dummy] != NULL
&& p_input->pp_selected_es[i_dummy]->i_id == i_id )
@ -784,12 +788,12 @@ es_descriptor_t * input_ParsePS( input_thread_t * p_input,
else
{
/* Search all ES ; if not found -> AddES */
for( i_dummy = 0; i_dummy < INPUT_MAX_ES; i_dummy++ )
for( i_dummy = 0; i_dummy < p_input->i_es_number; i_dummy++ )
{
if( p_input->p_es[i_dummy].i_id != EMPTY_ID
&& p_input->p_es[i_dummy].i_id == i_id )
if( p_input->pp_es[i_dummy] != NULL
&& p_input->pp_es[i_dummy]->i_id == i_id )
{
p_es = &p_input->p_es[i_dummy];
p_es = p_input->pp_es[i_dummy];
break;
}
}
@ -995,13 +999,13 @@ void input_DemuxTS( input_thread_t * p_input, data_packet_t * p_data )
/* Find out the elementary stream. */
vlc_mutex_lock( &p_input->stream.stream_lock );
for( i_dummy = 0; i_dummy < INPUT_MAX_ES; i_dummy++ )
for( i_dummy = 0; i_dummy < p_input->i_es_number; i_dummy++ )
{
if( p_input->p_es[i_dummy].i_id != EMPTY_ID )
if( p_input->pp_es[i_dummy] != NULL )
{
if( p_input->p_es[i_dummy].i_id == i_pid )
if( p_input->pp_es[i_dummy]->i_id == i_pid )
{
p_es = &p_input->p_es[i_dummy];
p_es = p_input->pp_es[i_dummy];
p_es_demux = (es_ts_data_t *)p_es->p_demux_data;
p_pgrm_demux = (pgrm_ts_data_t *)p_es->p_pgrm->p_demux_data;
break;