From 74e8f4f6ac00d56ac3cbc2412fb19fe489ac5218 Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Sun, 10 Nov 2002 16:31:20 +0000 Subject: [PATCH] all: fix a bug in packet parsing and can now play unseekable stream. --- modules/demux/asf/asf.c | 12 ++++++----- modules/demux/asf/libasf.c | 43 +++++++++++++++++++++++++++++++------- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/modules/demux/asf/asf.c b/modules/demux/asf/asf.c index 7f6c53552c..b19fbf2e79 100644 --- a/modules/demux/asf/asf.c +++ b/modules/demux/asf/asf.c @@ -2,7 +2,7 @@ * asf.c : ASFv01 file input module for vlc ***************************************************************************** * Copyright (C) 2001 VideoLAN - * $Id: asf.c,v 1.3 2002/10/28 11:49:57 fenrir Exp $ + * $Id: asf.c,v 1.4 2002/11/10 16:31:20 fenrir Exp $ * Authors: Laurent Aimar * * This program is free software; you can redistribute it and/or modify @@ -432,8 +432,10 @@ static int Demux( input_thread_t *p_input ) i_packet_send_time = GetDWLE( p_peek + i_skip ); i_skip += 4; i_packet_duration = GetWLE( p_peek + i_skip ); i_skip += 2; - i_packet_size_left = i_packet_length; // XXX données reellement lu - +// i_packet_size_left = i_packet_length; // XXX données reellement lu + /* FIXME I have to do that for some file, I don't known why */ + i_packet_size_left = i_data_packet_min; + if( b_packet_multiple_payload ) { i_payload_count = p_peek[i_skip] & 0x3f; @@ -495,6 +497,7 @@ static int Demux( input_thread_t *p_input ) i_media_object_offset = i_tmp; } + i_pts = __MAX( i_pts - p_demux->p_fp->i_preroll * 1000, 0 ); if( b_packet_multiple_payload ) { @@ -632,7 +635,6 @@ loop_error_recovery: ASF_SkipBytes( p_input, i_data_packet_min ); } // loop over packet - p_demux->i_time = 0; for( i = 0; i < 128 ; i++ ) { @@ -643,7 +645,7 @@ loop_error_recovery: } #undef p_stream } - + return( 1 ); } diff --git a/modules/demux/asf/libasf.c b/modules/demux/asf/libasf.c index f0115bed4b..26fd18c430 100644 --- a/modules/demux/asf/libasf.c +++ b/modules/demux/asf/libasf.c @@ -2,7 +2,7 @@ * libasf.c : ***************************************************************************** * Copyright (C) 2001 VideoLAN - * $Id: libasf.c,v 1.4 2002/11/08 10:26:53 gbazin Exp $ + * $Id: libasf.c,v 1.5 2002/11/10 16:31:20 fenrir Exp $ * Authors: Laurent Aimar * * This program is free software; you can redistribute it and/or modify @@ -110,18 +110,45 @@ int ASF_SeekAbsolute( input_thread_t *p_input, { off_t i_filepos; - if( i_pos >= p_input->stream.p_selected_area->i_size ) + i_filepos = ASF_TellAbsolute( p_input ); + if( i_pos == i_filepos ) { - return( 0 ); + return( 1 ); } - - i_filepos = ASF_TellAbsolute( p_input ); - if( i_pos != i_filepos ) + + if( p_input->stream.b_seekable && + p_input->stream.i_method != INPUT_METHOD_NETWORK ) { p_input->pf_seek( p_input, i_pos ); input_AccessReinit( p_input ); + return( 1 ); } - return( 1 ); + else if( i_pos > i_filepos ) + { + u64 i_size = i_pos - i_filepos; + do + { + data_packet_t *p_data; + int i_read; + + i_read = + input_SplitBuffer(p_input, &p_data, __MIN( i_size, 1024 ) ); + if( i_read <= 0 ) + { + return( 0 ); + } + input_DeletePacket( p_input->p_method_data, p_data ); + i_size -= i_read; + + } while( i_size > 0 ); + + return( 1 ); + } + else + { + msg_Err( p_input, "cannot seek" ); + return( 0 ); + } } /* return 1 if success, 0 if fail */ @@ -203,7 +230,7 @@ int ASF_NextObject( input_thread_t *p_input, { return( 0 ); /* failed */ } - if( p_obj->common.p_father ) + if( p_obj->common.p_father && p_obj->common.p_father->common.i_object_size != 0 ) { if( p_obj->common.p_father->common.i_object_pos + p_obj->common.p_father->common.i_object_size < p_obj->common.i_object_pos + p_obj->common.i_object_size + 24 ) -- 2.39.2