X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fpacketizer%2Fmpeg4video.c;h=3694d097c185c48d091ee82fb00533ca6f52d008;hb=80a06d334ffffacd9e72ef579006c2f339d13139;hp=b62fc3e886f58d57231de6e4a53ec90fd68bb632;hpb=1c332603ed6f326c80ac5ac872aa3000e3985aad;p=vlc diff --git a/modules/packetizer/mpeg4video.c b/modules/packetizer/mpeg4video.c index b62fc3e886..3694d097c1 100644 --- a/modules/packetizer/mpeg4video.c +++ b/modules/packetizer/mpeg4video.c @@ -2,7 +2,7 @@ * 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 * Eric Petit @@ -45,10 +45,10 @@ typedef struct packetizer_thread_s 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; @@ -104,12 +104,14 @@ vlc_module_end(); *****************************************************************************/ 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'): @@ -117,6 +119,9 @@ static int Open( vlc_object_t *p_this ) 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; @@ -191,8 +196,15 @@ static int InitThread( packetizer_thread_t *p_pack ) /* 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 = @@ -205,7 +217,11 @@ static int InitThread( packetizer_thread_t *p_pack ) 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, @@ -217,8 +233,9 @@ static int InitThread( packetizer_thread_t *p_pack ) 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 ) @@ -240,7 +257,8 @@ static void PacketizeThread( packetizer_thread_t *p_pack ) { 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 ); @@ -249,18 +267,25 @@ static void PacketizeThread( packetizer_thread_t *p_pack ) 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 ) { @@ -272,7 +297,7 @@ static void PacketizeThread( packetizer_thread_t *p_pack ) 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 ); @@ -284,9 +309,21 @@ static void PacketizeThread( packetizer_thread_t *p_pack ) } 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 ) @@ -338,8 +375,8 @@ static void PacketizeThread( packetizer_thread_t *p_pack ) 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" ); @@ -350,21 +387,24 @@ static void PacketizeThread( packetizer_thread_t *p_pack ) 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, @@ -384,13 +424,16 @@ static void PacketizeThread( packetizer_thread_t *p_pack ) } } - 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 ); @@ -406,6 +449,7 @@ static void EndThread ( packetizer_thread_t *p_pack) { sout_InputDelete( p_pack->p_sout_input ); } + free( p_pack ); } static void input_ShowPES( decoder_fifo_t *p_fifo, pes_packet_t **pp_pes ) @@ -439,4 +483,3 @@ static void input_ShowPES( decoder_fifo_t *p_fifo, pes_packet_t **pp_pes ) *pp_pes = p_pes; } } -