* Fixed two typos in the Makefile (sam you owe me at least one beer)

* Moved b_discontinuity to pgrm_descriptor_t, cleaned up CRDecode
(needs some more cleaning for discontinuities)
* Added pf_new_pes in plugins
This commit is contained in:
Christophe Massiot 2000-12-15 13:28:00 +00:00
parent 3c7d6bbc87
commit d2ca341dd7
5 changed files with 63 additions and 59 deletions

View File

@ -251,7 +251,7 @@ C_OBJ = $(INTERFACE) \
$(AC3_DECODER) \
$(LPCM_DECODER) \
$(AUDIO_DECODER) \
$(SPU_DEOCDER) \
$(SPU_DECODER) \
$(GEN_DECODER) \
$(VIDEO_PARSER) \
$(VIDEO_DECODER) \
@ -378,7 +378,7 @@ export
all: vlc @ALIASES@ plugins
clean:
rm -f $(C_OBJ) $(CPP_OBJ) $(ASM_OBJ) $(PLUGIN_OBJ)
rm -f $(C_OBJ) $(CPP_OBJ) $(ASM_OBJ) $(STD_PLUGIN_OBJ)
rm -f vlc @ALIASES@ lib/*.so
distclean: clean

View File

@ -24,7 +24,6 @@ typedef struct es_descriptor_s
void * p_demux_data;
struct pgrm_descriptor_s *
p_pgrm; /* very convenient in the demultiplexer */
boolean_t b_discontinuity;
/* PES parser information */
struct pes_packet_s * p_pes; /* Current PES */
@ -82,6 +81,7 @@ typedef struct pgrm_descriptor_s
count_t c_average_count;
/* counter used to compute dynamic average values */
int i_synchro_state;
boolean_t b_discontinuity;
/* Demultiplexer data */
void * p_demux_data;

View File

@ -29,6 +29,7 @@ typedef struct input_capabilities_s
/* Packet management facilities */
struct data_packet_s *(* pf_new_packet)( void *, size_t );
struct pes_packet_s *(* pf_new_pes)( void * );
void (* pf_delete_packet)( void *,
struct data_packet_s * );
void (* pf_delete_pes)( void *, struct pes_packet_s * );

View File

@ -281,6 +281,27 @@ static struct data_packet_s * NewPacket( void * p_garbage,
return( p_data );
}
/*****************************************************************************
* NewPES: allocates a pes packet
*****************************************************************************/
static pes_packet_t * NewPES( void * p_garbage )
{
pes_packet_t * p_pes;
if( (p_pes = (pes_packet_t *)malloc( sizeof(pes_packet_t) )) == NULL )
{
intf_DbgMsg( "Out of memory" );
return NULL;
}
p_pes->b_messed_up = p_pes->b_data_alignment = p_pes->b_discontinuity =
p_pes->b_has_pts = 0;
p_pes->i_pes_size = 0;
p_pes->p_first = NULL;
return( p_pes );
}
/*****************************************************************************
* DeletePacket: deletes a data packet
*****************************************************************************/
@ -326,6 +347,7 @@ input_capabilities_t * PSKludge( void )
p_plugin->pf_read = PSRead;
p_plugin->pf_demux = input_DemuxPS; /* FIXME: use i_p_config_t ! */
p_plugin->pf_new_packet = NewPacket;
p_plugin->pf_new_pes = NewPES;
p_plugin->pf_delete_packet = DeletePacket;
p_plugin->pf_delete_pes = DeletePES;
p_plugin->pf_rewind = NULL;

View File

@ -439,19 +439,14 @@ void input_GatherPES( input_thread_t * p_input, data_packet_t *p_data,
* packet. This is also here that we can synchronize with the
* stream if we lost packets or if the decoder has just
* started. */
if( (p_pes = (pes_packet_t *)malloc( sizeof(pes_packet_t) )) == NULL )
if( (p_pes = p_input->p_plugin->pf_new_pes( p_input->p_method_data ) ) == NULL )
{
intf_ErrMsg("Out of memory");
p_input->b_error = 1;
return;
}
//intf_DbgMsg("New PES packet %p (first data: %p)\n", p_pes, p_data);
/* Init the PES fields so that the first data packet could be
* correctly added to the PES packet (see below). */
p_pes->p_first = p_data;
p_pes->b_messed_up = p_pes->b_discontinuity = 0;
p_pes->i_pes_size = 0;
/* If the PES header fits in the first data packet, we can
* already set p_gather->i_pes_real_size. */
@ -549,19 +544,9 @@ static void CRReInit( pgrm_descriptor_t * p_pgrm )
/*****************************************************************************
* CRDecode : Decode a clock reference
*****************************************************************************/
static void CRDecode( input_thread_t * p_input, es_descriptor_t * p_es,
static void CRDecode( input_thread_t * p_input, pgrm_descriptor_t * p_pgrm,
mtime_t cr_time )
{
pgrm_descriptor_t * p_pgrm;
if( p_es != NULL )
{
p_pgrm = p_es->p_pgrm;
}
else
{
p_pgrm = p_input->stream.pp_programs[0];
}
if( p_pgrm->i_synchro_state != SYNCHRO_OK )
{
switch( p_pgrm->i_synchro_state )
@ -571,54 +556,54 @@ static void CRDecode( input_thread_t * p_input, es_descriptor_t * p_es,
p_pgrm->i_synchro_state = SYNCHRO_OK;
break;
case SYNCHRO_NOT_STARTED:
p_pgrm->i_synchro_state = SYNCHRO_START;
break;
default:
break;
}
}
else if( p_input->stream.b_pace_control )
{
/* Wait a while before delivering the packets to the decoder. */
mwait( cr_time + p_pgrm->delta_absolute );
}
else
{
mtime_t sys_time, delta_cr;
sys_time = mdate();
delta_cr = sys_time - cr_time;
if( (p_es != NULL && p_es->b_discontinuity) ||
if( p_pgrm->b_discontinuity ||
( p_pgrm->last_cr != 0 &&
( (p_pgrm->last_cr - cr_time) > CR_MAX_GAP
|| (p_pgrm->last_cr - cr_time) < - CR_MAX_GAP ) ) )
{
/* Stream discontinuity. */
intf_WarnMsg( 3, "CR re-initialiazed" );
CRReInit( p_pgrm );
p_pgrm->i_synchro_state = SYNCHRO_REINIT;
if( p_es != NULL )
{
p_es->b_discontinuity = 0;
}
p_pgrm->b_discontinuity = 0;
}
p_pgrm->last_cr = cr_time;
if( p_pgrm->c_average_count == CR_MAX_AVERAGE_COUNTER )
if( p_input->stream.b_pace_control )
{
p_pgrm->delta_cr = ( delta_cr + (p_pgrm->delta_cr
* (CR_MAX_AVERAGE_COUNTER - 1)) )
/ CR_MAX_AVERAGE_COUNTER;
/* Wait a while before delivering the packets to the decoder. */
mwait( cr_time + p_pgrm->delta_absolute );
}
else
{
p_pgrm->delta_cr = ( delta_cr + (p_pgrm->delta_cr
* p_pgrm->c_average_count) )
/ ( p_pgrm->c_average_count + 1 );
p_pgrm->c_average_count++;
}
mtime_t sys_time, delta_cr;
if( p_pgrm->i_synchro_state == SYNCHRO_NOT_STARTED )
{
p_pgrm->i_synchro_state = SYNCHRO_START;
sys_time = mdate();
delta_cr = sys_time - cr_time;
if( p_pgrm->c_average_count == CR_MAX_AVERAGE_COUNTER )
{
p_pgrm->delta_cr = ( delta_cr + (p_pgrm->delta_cr
* (CR_MAX_AVERAGE_COUNTER - 1)) )
/ CR_MAX_AVERAGE_COUNTER;
}
else
{
p_pgrm->delta_cr = ( delta_cr + (p_pgrm->delta_cr
* p_pgrm->c_average_count) )
/ ( p_pgrm->c_average_count + 1 );
p_pgrm->c_average_count++;
}
}
}
}
@ -678,7 +663,6 @@ static void DecodePSM( input_thread_t * p_input, data_packet_t * p_data )
= p_byte[1];
p_input->p_es[i_es].i_type = p_byte[0];
p_input->p_es[i_es].p_pgrm = p_input->stream.pp_programs[0];
p_input->p_es[i_es].b_discontinuity = 0;
p_input->p_es[i_es].p_pes = NULL;
p_byte += 4 + U16_AT(&p_byte[2]);
@ -738,12 +722,10 @@ void input_DemuxPS( input_thread_t * p_input, data_packet_t * p_data )
/* MPEG-2 */
scr_time =
(( ((mtime_t)(p_data->p_buffer[4] & 0x38) << 27) |
((mtime_t)(p_data->p_buffer[4] & 0x3) << 28) |
((mtime_t)(p_data->p_buffer[5]) << 20) |
((mtime_t)(p_data->p_buffer[6] & 0xF8) << 12) |
((mtime_t)(p_data->p_buffer[6] & 0x3) << 13) |
((mtime_t)(p_data->p_buffer[7]) << 5) |
((mtime_t)(p_data->p_buffer[8] & 0xF8) >> 3)
((mtime_t)(U32_AT(p_data->p_buffer + 4) & 0x03FFF800)
<< 4) |
((mtime_t)(U32_AT(p_data->p_buffer + 6) & 0x03FFF800)
>> 11)
) * 300) / 27;
}
else
@ -758,7 +740,8 @@ void input_DemuxPS( input_thread_t * p_input, data_packet_t * p_data )
}
/* Call the pace control. */
//intf_Msg("+%lld\n", scr_time);
CRDecode( p_input, NULL, scr_time - 200000 );
CRDecode( p_input, p_input->stream.pp_programs[0],
scr_time );
b_trash = 1;
}
break;
@ -826,7 +809,6 @@ void input_DemuxPS( input_thread_t * p_input, data_packet_t * p_data )
p_es->i_id = p_es->i_stream_id = i_id;
p_es->i_type = MPEG2_VIDEO_ES;
p_es->p_pgrm = p_input->stream.pp_programs[0];
p_es->b_discontinuity = 0;
p_es->p_pes = NULL;
#ifdef AUTO_SPAWN
@ -870,7 +852,6 @@ void input_DemuxPS( input_thread_t * p_input, data_packet_t * p_data )
p_es->i_id = p_es->i_stream_id = i_id;
p_es->i_type = MPEG2_AUDIO_ES;
p_es->p_pgrm = p_input->stream.pp_programs[0];
p_es->b_discontinuity = 0;
p_es->p_pes = NULL;
#ifdef AUTO_SPAWN
@ -1046,7 +1027,7 @@ void input_DemuxTS( input_thread_t * p_input, data_packet_t * p_data )
/* If the PID carries the PCR, there will be a system
* time-based discontinuity. We let the PCR decoder
* handle that. */
p_es->b_discontinuity = 1;
p_es->p_pgrm->b_discontinuity = 1;
/* There also may be a continuity_counter
* discontinuity: resynchronise our counter with
@ -1071,7 +1052,7 @@ void input_DemuxTS( input_thread_t * p_input, data_packet_t * p_data )
( (( (mtime_t)U32_AT((u32*)&p[6]) << 1 )
| ( p[10] >> 7 )) * 300 ) / 27;
/* Call the pace control. */
CRDecode( p_input, p_es, pcr_time );
CRDecode( p_input, p_es->p_pgrm, pcr_time );
}
} /* PCR ? */
} /* valid TS adaptation field ? */