Commit aa0acfb9 authored by Laurent Aimar's avatar Laurent Aimar

* wav: proper seek handling. (wav file readable over http).

parent be878a26
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* wav.c : wav file input module for vlc * wav.c : wav file input module for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: wav.c,v 1.10 2003/01/25 16:58:35 fenrir Exp $ * $Id: wav.c,v 1.11 2003/02/24 09:18:07 fenrir Exp $
* Authors: Laurent Aimar <fenrir@via.ecp.fr> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -84,68 +84,93 @@ static off_t TellAbsolute( input_thread_t *p_input ) ...@@ -84,68 +84,93 @@ static off_t TellAbsolute( input_thread_t *p_input )
vlc_mutex_lock( &p_input->stream.stream_lock ); vlc_mutex_lock( &p_input->stream.stream_lock );
i_pos= p_input->stream.p_selected_area->i_tell; i_pos= p_input->stream.p_selected_area->i_tell;
// - ( p_input->p_last_data - p_input->p_current_data );
vlc_mutex_unlock( &p_input->stream.stream_lock ); vlc_mutex_unlock( &p_input->stream.stream_lock );
return( i_pos ); return( i_pos );
} }
static int SeekAbsolute( input_thread_t *p_input,
off_t i_pos)
{
off_t i_filepos;
if( i_pos >= p_input->stream.p_selected_area->i_size )
{
// return( 0 );
}
i_filepos = TellAbsolute( p_input );
if( i_pos != i_filepos )
{
p_input->pf_seek( p_input, i_pos );
input_AccessReinit( p_input );
}
return( 1 );
}
static int SkipBytes( input_thread_t *p_input, int i_skip )
{
return( SeekAbsolute( p_input, TellAbsolute( p_input ) + i_skip ) );
}
/* return 1 if success, 0 if fail */ /* return 1 if success, 0 if fail */
static int ReadData( input_thread_t *p_input, uint8_t *p_buff, int i_size ) static int ReadData( input_thread_t *p_input, uint8_t *p_buff, int i_size )
{ {
data_packet_t *p_data; data_packet_t *p_data;
int i_read; int i_count = 0;
if( !i_size ) if( !i_size )
{ {
return( 1 ); return( 0 );
} }
do do
{ {
int i_read;
i_read = input_SplitBuffer(p_input, &p_data, __MIN( i_size, 1024 ) ); i_read = input_SplitBuffer(p_input, &p_data, __MIN( i_size, 1024 ) );
if( i_read <= 0 ) if( i_read <= 0 )
{ {
return( 0 ); return( i_count );
} }
memcpy( p_buff, p_data->p_payload_start, i_read ); memcpy( p_buff, p_data->p_payload_start, i_read );
input_DeletePacket( p_input->p_method_data, p_data ); input_DeletePacket( p_input->p_method_data, p_data );
p_buff += i_read; p_buff += i_read;
i_size -= i_read; i_size -= i_read;
i_count += i_read;
} while( i_size ); } while( i_size );
return( 1 ); return( i_count );
}
static int SeekAbsolute( input_thread_t *p_input,
off_t i_pos)
{
int i_skip;
#if 0
if( i_pos >= p_input->stream.p_selected_area->i_size )
{
return( 0 );
}
#endif
i_skip = i_pos - TellAbsolute( p_input );
if( i_skip == 0 )
{
return( VLC_SUCCESS );
}
if( i_skip < 0 && !p_input->stream.b_seekable )
{
return( VLC_EGENERIC );
}
else if( !p_input->stream.b_seekable ||
( i_skip > 0 && i_skip < 1024 && p_input->stream.i_method != INPUT_METHOD_FILE ) )
{
while( i_skip > 0 )
{
uint8_t dummy[1024];
int i_read;
i_read = ReadData( p_input, dummy, __MIN( i_skip, 1024 ) );
if( i_read <= 0 )
{
return( VLC_EGENERIC );
}
i_skip -= i_read;
}
return( VLC_SUCCESS );
}
else
{
input_AccessReinit( p_input );
p_input->pf_seek( p_input, i_pos );
}
} }
static int SkipBytes( input_thread_t *p_input, int i_skip )
{
return( SeekAbsolute( p_input, TellAbsolute( p_input ) + i_skip ) );
}
static int ReadPES( input_thread_t *p_input, static int ReadPES( input_thread_t *p_input,
pes_packet_t **pp_pes, pes_packet_t **pp_pes,
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* wav.h : wav file input module for vlc * wav.h : wav file input module for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: wav.h,v 1.2 2002/11/28 16:32:29 fenrir Exp $ * $Id: wav.h,v 1.3 2003/02/24 09:18:07 fenrir Exp $
* Authors: Laurent Aimar <fenrir@via.ecp.fr> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -38,7 +38,7 @@ struct demux_sys_t ...@@ -38,7 +38,7 @@ struct demux_sys_t
WAVEFORMATEX *p_wf; WAVEFORMATEX *p_wf;
off_t i_data_pos; off_t i_data_pos;
u64 i_data_size; uint64_t i_data_size;
/* Two case: /* Two case:
- we have an internal demux(pcm) - we have an internal demux(pcm)
...@@ -56,7 +56,6 @@ struct demux_sys_t ...@@ -56,7 +56,6 @@ struct demux_sys_t
WAVEFORMATEX *p_wf, WAVEFORMATEX *p_wf,
pes_packet_t **pp_pes, pes_packet_t **pp_pes,
mtime_t *pi_length ); mtime_t *pi_length );
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment