* input_ext-dec.h: structures exported to the VideoLAN decoders
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: input_ext-dec.h,v 1.71 2002/08/30 22:22:24 massiot Exp $
+ * $Id: input_ext-dec.h,v 1.72 2002/10/21 10:46:34 fenrir Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Michel Kaempf <maxx@via.ecp.fr>
VLC_EXPORT( void, CurrentPTS, ( bit_stream_t *, mtime_t *, mtime_t * ) );
VLC_EXPORT( void, NextPTS, ( bit_stream_t *, mtime_t *, mtime_t * ) );
+VLC_EXPORT( int, input_NextPES, ( decoder_fifo_t *, pes_packet_t ** ) );
+
/*****************************************************************************
* AlignWord : fill in the bit buffer so that the byte pointer be aligned
* on a word boundary (XXX: there must be at least sizeof(WORD_TYPE) - 1
* araw.c: Pseudo audio decoder; for raw pcm data
*****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN
- * $Id: araw.c,v 1.2 2002/10/20 17:44:17 fenrir Exp $
+ * $Id: araw.c,v 1.3 2002/10/21 10:46:34 fenrir Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
waveformatex_t format;
/* The bit stream structure handles the PES stream at the bit level */
- bit_stream_t bit_stream;
+// bit_stream_t bit_stream;
/* Input properties */
decoder_fifo_t *p_fifo;
}
}
-/* get the first pes from fifo */
-static pes_packet_t *PESGetFirst( decoder_fifo_t *p_fifo )
-{
- pes_packet_t *p_pes;
-
- vlc_mutex_lock( &p_fifo->data_lock );
-
- /* if fifo is empty wait */
- while( !p_fifo->p_first )
- {
- if( p_fifo->b_die )
- {
- vlc_mutex_unlock( &p_fifo->data_lock );
- return NULL;
- }
- vlc_cond_wait( &p_fifo->data_wait, &p_fifo->data_lock );
- }
- p_pes = p_fifo->p_first;
-
- vlc_mutex_unlock( &p_fifo->data_lock );
-
- return p_pes;
-}
-static int PESGetSize( pes_packet_t *p_pes )
-{
- data_packet_t *p_data;
- int i_size = 0;
-
- if( !p_pes )
- {
- return( 0 );
- }
-
- for( p_data = p_pes->p_first; p_data != NULL; p_data = p_data->p_next )
- {
- i_size += p_data->p_payload_end - p_data->p_payload_start;
- }
-
- return( i_size );
-}
-
-
/*****************************************************************************
* InitThread: initialize data before entering main loop
*****************************************************************************/
return( -1 );
}
p_adec->output_format.i_rate = p_adec->format.i_samplespersec;
- if( p_adec->output_format.i_channels <= 0 ||
- p_adec->output_format.i_channels > 5 )
+
+ if( p_adec->format.i_channels <= 0 ||
+ p_adec->format.i_channels > 5 )
{
msg_Err( p_adec->p_fifo, "bad channels count(1-5)" );
return( -1 );
}
/* Init the BitStream */
- InitBitstream( &p_adec->bit_stream, p_adec->p_fifo,
- NULL, NULL );
+// InitBitstream( &p_adec->bit_stream, p_adec->p_fifo,
+// NULL, NULL );
return( 0 );
}
+static void GetPESData( u8 *p_buf, int i_max, pes_packet_t *p_pes )
+{
+ int i_copy;
+ int i_count;
+
+ data_packet_t *p_data;
+
+ i_count = 0;
+ p_data = p_pes->p_first;
+ while( p_data != NULL && i_count < i_max )
+ {
+
+ i_copy = __MIN( p_data->p_payload_end - p_data->p_payload_start, i_max - i_count );
+
+ if( i_copy > 0 )
+ {
+ memcpy( p_buf,
+ p_data->p_payload_start,
+ i_copy );
+ }
+
+ p_data = p_data->p_next;
+ i_count += i_copy;
+ p_buf += i_copy;
+ }
+
+ if( i_count < i_max )
+ {
+ memset( p_buf, 0, i_max - i_count );
+ }
+}
+
/*****************************************************************************
* DecodeThread: decodes a frame
*****************************************************************************/
aout_buffer_t *p_aout_buffer;
int i_samples; // per channels
int i_size;
+
pes_packet_t *p_pes;
/* **** get samples count **** */
- p_pes = PESGetFirst( p_adec->p_fifo );
-
- i_size = PESGetSize( p_pes );
+ if( input_NextPES( p_adec->p_fifo, &p_pes ) < 0 )
+ {
+ p_adec->p_fifo->b_error = 1;
+ return;
+ }
+ i_size = p_pes->i_pes_size;
+
if( p_adec->format.i_blockalign > 0 )
{
i_size -= i_size % p_adec->format.i_blockalign;
p_aout_buffer->start_date = aout_DateGet( &p_adec->date );
p_aout_buffer->end_date = aout_DateIncrement( &p_adec->date,
i_samples );
- GetChunk( &p_adec->bit_stream,
- p_aout_buffer->p_buffer,
- p_aout_buffer->i_nb_bytes );
+
+ GetPESData( p_aout_buffer->p_buffer, p_aout_buffer->i_nb_bytes, p_pes );
aout_DecPlay( p_adec->p_aout, p_adec->p_aout_input, p_aout_buffer );
+
+
+ input_DeletePES( p_adec->p_fifo->p_packets_mgt, p_pes );
}
* input_ext-dec.c: services to the decoders
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: input_ext-dec.c,v 1.34 2002/08/26 23:00:23 massiot Exp $
+ * $Id: input_ext-dec.c,v 1.35 2002/10/21 10:46:34 fenrir Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
}
}
+/****************************************************************************
+ * input_NextPES : extract a PES from the fifo. If pp_pes is NULL then this
+ * PES is deleted, else pp_pes will be set to this PES
+ ****************************************************************************/
+int input_NextPES( decoder_fifo_t *p_fifo, pes_packet_t **pp_pes )
+{
+ pes_packet_t *p_pes, *p_next;
+
+ vlc_mutex_lock( &p_fifo->data_lock );
+
+ /* if fifo is emty wait */
+ while( !p_fifo->p_first )
+ {
+ if( p_fifo->b_die )
+ {
+ vlc_mutex_unlock( &p_fifo->data_lock );
+ if( pp_pes )
+ {
+ *pp_pes = NULL;
+ }
+ return( -1 );
+ }
+ vlc_cond_signal( &p_fifo->data_wait );
+ vlc_cond_wait( &p_fifo->data_wait, &p_fifo->data_lock );
+ }
+ p_pes = p_fifo->p_first;
+
+ p_next = p_pes->p_next;
+ p_pes->p_next = NULL;
+
+
+ p_fifo->p_first = p_next;
+ p_fifo->i_depth--;
+
+ if( !p_fifo->p_first )
+ {
+ /* No PES in the fifo */
+ /* pp_last no longer valid */
+ p_fifo->pp_last = &p_fifo->p_first;
+ }
+ vlc_mutex_unlock( &p_fifo->data_lock );
+
+ if( pp_pes )
+ {
+ *pp_pes = p_pes;
+ }
+ else
+ {
+ input_DeletePES( p_fifo->p_packets_mgt, p_pes );
+ }
+ return( 0 );
+}
+