* mpeg4video.c
*****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN
- * $Id: mpeg4video.c,v 1.7 2003/01/23 15:52:04 sam 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( '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;
- ssize_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 )
+
+ 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 )
data_packet_t *p_data;
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 )
{
}
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 = 24;
- p_bih->biCompression = VLC_FOURCC( 'd', 'i', 'v', 'x' );
- 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 )
{
- mtime_t i_gap;
-
- i_gap = p_pes_next->i_pts - p_pes->i_pts;
-#if 0
- if( i_gap > 1000000 / 4 ) // too littl fps < 4 is no sense
- {
- i_gap = 1000000 / 25;
- p_pack->i_pts_start =
- - ( p_pes->i_pts - p_pack->i_pts_start ) + p_pes_next->i_pts - i_gap;
-
- }
- else if( i_gap < 0 )
- {
- p_pack->i_pts_start =
- ( p_pes->i_pts - p_pack->i_pts_start ) + p_pes_next->i_pts;
- i_gap = 0;
- }
- if( i_gap < 0 )
- {
- msg_Dbg( p_pack->p_fifo, "pts:%lld next_pts:%lld", p_pes->i_pts, p_pes_next->i_pts );
- /* work around for seek */
- p_pack->i_pts_start -= i_gap;
- }
-
-// msg_Dbg( p_pack->p_fifo, "gap %lld date %lld next diff %lld", i_gap, p_pes->i_pts, p_pes_next->i_pts-p_pack->i_pts_start );
-#endif
- p_sout_buffer->i_length = i_gap;
+ 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;
}
}
-