* mpeg4audio.c
*****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN
- * $Id: mpeg4audio.c,v 1.1 2003/01/08 10:26:49 fenrir Exp $
+ * $Id: mpeg4audio.c,v 1.7 2003/09/02 20:19:26 gbazin Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
bit_stream_t bit_stream;
/* Output properties */
- sout_input_t *p_sout_input;
- sout_packet_format_t output_format;
+ sout_packetizer_input_t *p_sout_input;
+ sout_format_t output_format;
- mtime_t i_pts_start;
- mtime_t i_pts;
+// mtime_t i_pts_start;
+ mtime_t i_last_pts;
WAVEFORMATEX *p_wf;
*****************************************************************************/
static int Open( vlc_object_t *p_this )
{
- decoder_fifo_t *p_fifo = (decoder_fifo_t*) p_this;
+ decoder_t *p_dec = (decoder_t*)p_this;
- p_fifo->pf_run = Run;
+ p_dec->pf_run = Run;
- if( p_fifo->i_fourcc == VLC_FOURCC( 'm', 'p', '4', 'a') )
+ if( p_dec->p_fifo->i_fourcc == VLC_FOURCC( 'm', 'p', '4', 'a') )
{
return( VLC_SUCCESS );
}
if( p_wf && p_wf->cbSize > 0)
{
uint8_t *p_config = (uint8_t*)&p_wf[1];
- int i_wf = sizeof( WAVEFORMATEX ) + p_wf->cbSize;
- int i_index;
+ int i_index;
-
- p_pack->p_wf = malloc( i_wf );
- memcpy( p_pack->p_wf,
- p_wf,
- i_wf );
- p_pack->output_format.i_cat = AUDIO_ES;
- p_pack->output_format.i_fourcc = VLC_FOURCC( 'm', 'p', '4', 'a' );
- p_pack->output_format.p_format = p_pack->p_wf;
p_pack->b_adts = 0;
i_index = ( ( p_config[0] << 1 ) | ( p_config[1] >> 7 ) )&0x0f;
"aac %dHz %d samples/frame",
p_pack->i_sample_rate,
p_pack->i_frame_size );
+
+ p_pack->output_format.i_cat = AUDIO_ES;
+ p_pack->output_format.i_fourcc = VLC_FOURCC( 'm', 'p', '4', 'a' );
+ p_pack->output_format.i_sample_rate = p_pack->i_sample_rate;
+ p_pack->output_format.i_channels = p_wf->nChannels;
+ p_pack->output_format.i_block_align = 0;
+ p_pack->output_format.i_bitrate = 0;
+
+ p_pack->output_format.i_extra_data = p_wf->cbSize;
+ p_pack->output_format.p_extra_data = malloc( p_wf->cbSize );
+ memcpy( p_pack->output_format.p_extra_data,
+ &p_wf[1],
+ p_wf->cbSize );
}
else
{
- int i_wf = sizeof( WAVEFORMATEX ) + 5;
/* we will try to create a AAC Config from adts */
p_pack->output_format.i_cat = UNKNOWN_ES;
p_pack->output_format.i_fourcc = VLC_FOURCC( 'n', 'u', 'l', 'l' );
}
- p_pack->p_sout_input =
+ p_pack->p_sout_input =
sout_InputNew( p_pack->p_fifo,
&p_pack->output_format );
if( !p_pack->p_sout_input )
{
- msg_Err( p_pack->p_fifo,
+ msg_Err( p_pack->p_fifo,
"cannot add a new stream" );
return( -1 );
}
- p_pack->i_pts_start = -1;
- p_pack->i_pts = 0;
+ p_pack->i_last_pts = 0;
return( 0 );
}
{
sout_buffer_t *p_sout_buffer;
pes_packet_t *p_pes;
- size_t i_size;
+ ssize_t i_size;
+ mtime_t i_pts;
/* **** get samples count **** */
input_ExtractPES( p_pack->p_fifo, &p_pes );
p_pack->i_pts = p_pes->i_pts - p_pack->i_pts_start;
#endif
+ i_pts = p_pes->i_pts;
+
+ if( i_pts <= 0 && p_pack->i_last_pts <= 0 )
+ {
+ msg_Dbg( p_pack->p_fifo, "need a starting pts" );
+ input_DeletePES( p_pack->p_fifo->p_packets_mgt, p_pes );
+ return;
+ }
i_size = p_pes->i_pes_size;
if( i_size > 0 )
{
data_packet_t *p_data;
- size_t i_buffer;
+ ssize_t i_buffer;
p_sout_buffer =
sout_BufferNew( p_pack->p_sout_input->p_sout, i_size );
if( !p_sout_buffer )
{
p_pack->p_fifo->b_error = 1;
+ input_DeletePES( p_pack->p_fifo->p_packets_mgt, p_pes );
return;
}
/* TODO: memcpy of the pes packet */
{
size_t i_copy;
- i_copy = __MIN( p_data->p_payload_end - p_data->p_payload_start,
+ i_copy = __MIN( p_data->p_payload_end - p_data->p_payload_start,
i_size - i_buffer );
if( i_copy > 0 )
{
i_buffer += i_copy;
}
- p_sout_buffer->i_length = (mtime_t)1000000 * (mtime_t)p_pack->i_frame_size / (mtime_t)p_pack->i_sample_rate;
+ if( i_pts <= 0 )
+ {
+ i_pts = p_pack->i_last_pts +
+ (mtime_t)1000000 *
+ (mtime_t)p_pack->i_frame_size /
+ (mtime_t)p_pack->i_sample_rate;
+ }
+ p_pack->i_last_pts = i_pts;
+
+ p_sout_buffer->i_length = (mtime_t)1000000 *
+ (mtime_t)p_pack->i_frame_size /
+ (mtime_t)p_pack->i_sample_rate;
p_sout_buffer->i_bitrate = 0;
- p_sout_buffer->i_dts = p_pack->i_pts;
- p_sout_buffer->i_pts = p_pack->i_pts;
+ p_sout_buffer->i_dts = i_pts;
+ p_sout_buffer->i_pts = i_pts;
sout_InputSendBuffer( p_pack->p_sout_input,
p_sout_buffer );
-
- p_pack->i_pts += (mtime_t)1000000 * (mtime_t)p_pack->i_frame_size / (mtime_t)p_pack->i_sample_rate;
}
input_DeletePES( p_pack->p_fifo->p_packets_mgt, p_pes );
{
free( p_pack->p_wf );
}
+ free( p_pack );
}
-