* mpeg4video.c
*****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN
- * $Id: mpeg4video.c,v 1.3 2003/01/08 10:26:49 fenrir Exp $
+ * $Id: mpeg4video.c,v 1.14 2003/09/24 14:59:21 fenrir Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
* Eric Petit <titer@videolan.org>
decoder_fifo_t *p_fifo;
/* 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_last_pts;
int i_vol;
uint8_t *p_vol;
*****************************************************************************/
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;
-
- switch( p_fifo->i_fourcc )
+ switch( p_dec->p_fifo->i_fourcc )
{
+ case VLC_FOURCC( 'm', '4', 's', '2'):
+ case VLC_FOURCC( 'M', '4', 'S', '2'):
+ case VLC_FOURCC( 'm', 'p', '4', 's'):
+ case VLC_FOURCC( 'M', 'P', '4', 'S'):
case VLC_FOURCC( 'm', 'p', '4', 'v'):
case VLC_FOURCC( 'D', 'I', 'V', 'X'):
case VLC_FOURCC( 'd', 'i', 'v', 'x'):
case VLC_FOURCC( 'X', 'v', 'i', 'D'):
case VLC_FOURCC( 'x', 'v', 'i', 'd'):
case VLC_FOURCC( 'D', 'X', '5', '0'):
+ case VLC_FOURCC( 0x04, 0, 0, 0):
+ case VLC_FOURCC( '3', 'I', 'V', '2'):
+ p_dec->pf_run = Run;
return VLC_SUCCESS;
default:
return VLC_EGENERIC;
/* create stream input output */
p_pack->output_format.i_cat = VIDEO_ES;
p_pack->output_format.i_fourcc = VLC_FOURCC( 'm', 'p', '4', 'v' );
- p_pack->output_format.p_format = malloc( p_bih->biSize );
- memcpy( p_pack->output_format.p_format, p_bih, p_bih->biSize );
+ p_pack->output_format.i_width = p_bih->biWidth;
+ p_pack->output_format.i_height = p_bih->biHeight;
+ p_pack->output_format.i_bitrate= 0;
+
+ p_pack->output_format.i_extra_data = p_pack->i_vol;
+ p_pack->output_format.p_extra_data = malloc( p_pack->i_vol );
+ memcpy( p_pack->output_format.p_extra_data,
+ p_pack->p_vol,
+ p_pack->i_vol );
msg_Warn( p_pack->p_fifo, "opening with vol size:%d", p_pack->i_vol );
p_pack->p_sout_input =
p_pack->p_vol = 0;
p_pack->output_format.i_cat = UNKNOWN_ES;
p_pack->output_format.i_fourcc = VLC_FOURCC( 'n', 'u', 'l', 'l' );
- p_pack->output_format.p_format = NULL;
+ p_pack->output_format.i_width = 0;
+ p_pack->output_format.i_height = 0;
+ p_pack->output_format.i_bitrate= 0;
+ p_pack->output_format.i_extra_data = 0;
+ p_pack->output_format.p_extra_data = NULL;
p_pack->p_sout_input =
sout_InputNew( p_pack->p_fifo,
msg_Err( p_pack->p_fifo, "cannot add a new stream" );
return( -1 );
}
- p_pack->i_pts_start = -1;
- return( 0 );
+ p_pack->i_last_pts = 0;
+
+ return VLC_SUCCESS;
}
static int m4v_FindStartCode( uint8_t **pp_data, uint8_t *p_end )
{
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->p_fifo->b_error = 1;
return;
}
- if( p_pack->i_pts_start < 0 && p_pes->i_pts > 0 )
+
+ i_pts = p_pes->i_pts;
+#if 0
+ if( i_pts <= 0 && p_pack->i_last_pts <= 0 )
{
- p_pack->i_pts_start = p_pes->i_pts;
+ msg_Dbg( p_pack->p_fifo, "need a starting pts" );
+ input_DeletePES( p_pack->p_fifo->p_packets_mgt, p_pes );
+ return;
}
+#endif
+
i_size = p_pes->i_pes_size;
if( i_size > 0 )
{
pes_packet_t *p_pes_next;
data_packet_t *p_data;
- size_t i_buffer;
+ ssize_t i_buffer;
- p_sout_buffer =
+ p_sout_buffer =
sout_BufferNew( p_pack->p_sout_input->p_sout, i_size );
if( !p_sout_buffer )
{
p_data != NULL && i_buffer < i_size;
p_data = p_data->p_next)
{
- size_t i_copy;
+ ssize_t i_copy;
i_copy = __MIN( p_data->p_payload_end - p_data->p_payload_start,
i_size - i_buffer );
}
i_buffer += i_copy;
}
- p_sout_buffer->i_length = 0;
- p_sout_buffer->i_dts = p_pes->i_pts - p_pack->i_pts_start;
- p_sout_buffer->i_pts = p_pes->i_pts - p_pack->i_pts_start;
+
+ input_ShowPES( p_pack->p_fifo, &p_pes_next );
+ if( p_pes_next && p_pes_next->i_pts > 0 )
+ {
+ mtime_t i_gap;
+
+ i_gap = p_pes_next->i_pts - p_pes->i_pts;
+ p_sout_buffer->i_length = i_gap;
+ }
+ else
+ {
+ p_sout_buffer->i_length = 0;
+ }
+ p_sout_buffer->i_dts = i_pts;
+ p_sout_buffer->i_pts = i_pts;
p_sout_buffer->i_bitrate = 0;
if( p_pack->p_vol == NULL )
if( p_vol_end != NULL && p_vol_begin < p_vol_end )
{
- BITMAPINFOHEADER *p_bih;
-
+ BITMAPINFOHEADER *p_bih =
+ (BITMAPINFOHEADER*)p_pack->p_fifo->p_bitmapinfoheader;
p_pack->i_vol = p_vol_end - p_vol_begin;
msg_Dbg( p_pack->p_fifo, "Reopening output" );
p_pack->output_format.i_cat = VIDEO_ES;
p_pack->output_format.i_fourcc = VLC_FOURCC( 'm', 'p', '4', 'v' );
- p_pack->output_format.p_format =
- (void*)p_bih = malloc( sizeof( BITMAPINFOHEADER ) + p_pack->i_vol);
-
- p_bih->biSize = sizeof( BITMAPINFOHEADER ) + p_pack->i_vol;
- p_bih->biWidth = 0;
- p_bih->biHeight = 0;
- p_bih->biPlanes = 1;
- p_bih->biBitCount = 0;
- p_bih->biCompression = 0; /* FIXME */
- p_bih->biSizeImage = 0;
- p_bih->biXPelsPerMeter = 0;
- p_bih->biYPelsPerMeter = 0;
- p_bih->biClrUsed = 0;
- p_bih->biClrImportant = 0;
- memcpy( &p_bih[1], p_pack->p_vol, p_pack->i_vol );
+
+ if( p_bih )
+ {
+ p_pack->output_format.i_width = p_bih->biWidth;
+ p_pack->output_format.i_height = p_bih->biHeight;
+ }
+ else
+ {
+ p_pack->output_format.i_width = 0;
+ p_pack->output_format.i_height = 0;
+ }
+ p_pack->output_format.i_bitrate= 0;
+
+ p_pack->output_format.i_extra_data = p_pack->i_vol;
+ p_pack->output_format.p_extra_data = malloc( p_pack->i_vol );
+ memcpy( p_pack->output_format.p_extra_data,
+ p_pack->p_vol,
+ p_pack->i_vol );
p_pack->p_sout_input =
sout_InputNew( p_pack->p_fifo,
}
}
- input_ShowPES( p_pack->p_fifo, &p_pes_next );
- if( p_pes_next )
+ if( i_pts > 0 )
{
- p_sout_buffer->i_length = p_pes_next->i_pts - p_pes->i_pts;
+ sout_InputSendBuffer( p_pack->p_sout_input,
+ p_sout_buffer );
}
- sout_InputSendBuffer( p_pack->p_sout_input,
+ else
+ {
+ sout_BufferDelete( p_pack->p_sout_input->p_sout,
p_sout_buffer );
+ }
}
input_DeletePES( p_pack->p_fifo->p_packets_mgt, p_pes );
{
sout_InputDelete( p_pack->p_sout_input );
}
+ free( p_pack );
}
static void input_ShowPES( decoder_fifo_t *p_fifo, pes_packet_t **pp_pes )
*pp_pes = p_pes;
}
}
-