diff options
author | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2007-09-15 11:33:31 +0000 |
---|---|---|
committer | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2007-09-15 11:33:31 +0000 |
commit | 6954f5c63452c6eb79582864c38de4bd75b35c45 (patch) | |
tree | 16738b56f9eae4ca699ce8b36db176bd538fbd88 /libmpdemux | |
parent | 0d74d82c742b2e5ba462a7a2cfa2f82ff4d2ddf3 (diff) | |
download | mpv-6954f5c63452c6eb79582864c38de4bd75b35c45.tar.bz2 mpv-6954f5c63452c6eb79582864c38de4bd75b35c45.tar.xz |
Simpler and more robust tar parsing
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@24521 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/demux_ty.c | 36 |
1 files changed, 10 insertions, 26 deletions
diff --git a/libmpdemux/demux_ty.c b/libmpdemux/demux_ty.c index fe4663b1c5..82440e64e6 100644 --- a/libmpdemux/demux_ty.c +++ b/libmpdemux/demux_ty.c @@ -112,15 +112,12 @@ void ty_ClearOSD( int start ); // =========================================================================== static int ty_tmf_filetoparts( demuxer_t *demux, TiVoInfo *tivo ) { - off_t offset; - off_t totalsize; int parts = 0; - offset = 0; - totalsize = demux->stream->end_pos; + stream_seek(demux->stream, 0); mp_msg( MSGT_DEMUX, MSGL_DBG3, "Dumping tar contents\n" ); - while (1) + while (!demux->stream->eof) { char header[ 512 ]; char *name; @@ -128,12 +125,6 @@ static int ty_tmf_filetoparts( demuxer_t *demux, TiVoInfo *tivo ) char *sizestr; int size; off_t skip; - int isty; - if (!stream_seek(demux->stream, offset)) - { - mp_msg( MSGT_DEMUX, MSGL_DBG3, "Seek bad %"PRId64"\n", (int64_t)offset ); - break; - } if (stream_read(demux->stream, header, 512) < 512) { mp_msg( MSGT_DEMUX, MSGL_DBG3, "Read bad\n" ); @@ -145,26 +136,18 @@ static int ty_tmf_filetoparts( demuxer_t *demux, TiVoInfo *tivo ) sizestr[11] = 0; size = strtol(sizestr, NULL, 8); - // size rounded up to blocks + header size - skip = 512 + ((size + 511) & ~511); - - if ( offset + skip > totalsize ) - size = totalsize - offset; + mp_msg( MSGT_DEMUX, MSGL_DBG3, "name %-20.20s size %-12.12s %d\n", + name, sizestr, size ); extension = strrchr(name, '.'); - isty = extension && strcmp(extension, ".ty") == 0; - - mp_msg( MSGT_DEMUX, MSGL_DBG3, "name %-20.20s size %-12.12s %d %d\n", - name, sizestr, size, isty ); - - if ( isty ) + if (extension && strcmp(extension, ".ty") == 0) { if ( parts >= MAX_TMF_PARTS ) { mp_msg( MSGT_DEMUX, MSGL_ERR, "ty:tmf too big\n" ); break; } tivo->tmfparts[ parts ].fileSize = size; - tivo->tmfparts[ parts ].startOffset = offset + 512; + tivo->tmfparts[ parts ].startOffset = stream_tell(demux->stream); tivo->tmfparts[ parts ].chunks = size / CHUNKSIZE; mp_msg ( @@ -188,10 +171,11 @@ static int ty_tmf_filetoparts( demuxer_t *demux, TiVoInfo *tivo ) parts++; } - offset += skip; - if (offset >= totalsize) - break; + // size rounded up to blocks + skip = (size + 511) & ~511; + stream_skip(demux->stream, skip); } + stream_reset(demux->stream); tivo->tmf_totalparts = parts; mp_msg( MSGT_DEMUX, MSGL_DBG3, "tmf_filetoparts(): No More Part Files %d\n", parts ); |