[vlc-commits] stream_extractor: archive: simplify seeking
Filip Roséen
git at videolan.org
Sun Jul 29 16:29:55 CEST 2018
vlc/vlc-3.0 | branch: master | Filip Roséen <filip at atch.se> | Wed Jul 25 04:33:24 2018 +0200| [348b723e3b05c58bf84131e759084d8f7d34622f] | committer: Jean-Baptiste Kempf
stream_extractor: archive: simplify seeking
As a seek should be successful even if the requested position is
outside the bounds of the input, there is no need for us to reset the
state of the libarchive reader immediately after seeking fails,
instead we rely on the fact that future reads will return EOF, and
that the reader will have to seek to a proper position in order to
continue reading (causing a libarchive reset).
Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>
(cherry picked from commit 3ecbbfac7d35b52599d295ac7f71c001e03f57b2)
Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>
> http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=348b723e3b05c58bf84131e759084d8f7d34622f
---
modules/stream_extractor/archive.c | 28 ++++++++++++----------------
1 file changed, 12 insertions(+), 16 deletions(-)
diff --git a/modules/stream_extractor/archive.c b/modules/stream_extractor/archive.c
index 5f82700256..505b444863 100644
--- a/modules/stream_extractor/archive.c
+++ b/modules/stream_extractor/archive.c
@@ -627,26 +627,27 @@ static int archive_skip_decompressed( stream_extractor_t* p_extractor, uint64_t
static int Seek( stream_extractor_t* p_extractor, uint64_t i_req )
{
private_sys_t* p_sys = p_extractor->p_sys;
- uint64_t i_orig_offset = p_sys->i_offset;
if( p_sys->b_dead )
return VLC_EGENERIC;
- if( !p_sys->p_entry )
- return VLC_EGENERIC;
-
- if( !p_sys->b_seekable_source )
+ if( !p_sys->p_entry || !p_sys->b_seekable_source )
return VLC_EGENERIC;
if( archive_entry_size_is_set( p_sys->p_entry ) &&
- (uint64_t)archive_entry_size( p_sys->p_entry ) < i_req )
- return VLC_EGENERIC;
+ (uint64_t)archive_entry_size( p_sys->p_entry ) <= i_req )
+ {
+ p_sys->b_eof = true;
+ return VLC_SUCCESS;
+ }
- if( !p_sys->b_seekable_archive
+ p_sys->b_eof = false;
+
+ if( !p_sys->b_seekable_archive || p_sys->b_dead
|| archive_seek_data( p_sys->p_archive, i_req, SEEK_SET ) < 0 )
{
- msg_Dbg( p_extractor, "libarchive intrinsic seek failed:"
- " '%s' (falling back to dumb seek)",
+ msg_Dbg( p_extractor,
+ "intrinsic seek failed: '%s' (falling back to dumb seek)",
archive_error_string( p_sys->p_archive ) );
uint64_t i_offset = p_sys->i_offset;
@@ -667,12 +668,7 @@ static int Seek( stream_extractor_t* p_extractor, uint64_t i_req )
}
if( archive_skip_decompressed( p_extractor, i_skip ) )
- {
- if( archive_extractor_reset( p_extractor ) ||
- archive_skip_decompressed( p_extractor, i_orig_offset ) )
- msg_Err( p_extractor, "unable to reset original offset" );
- return VLC_EGENERIC;
- }
+ msg_Dbg( p_extractor, "failed to skip to seek position" );
}
p_sys->i_offset = i_req;
More information about the vlc-commits
mailing list