summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_ty.c
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-09-15 11:33:31 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-09-15 11:33:31 +0000
commit6954f5c63452c6eb79582864c38de4bd75b35c45 (patch)
tree16738b56f9eae4ca699ce8b36db176bd538fbd88 /libmpdemux/demux_ty.c
parent0d74d82c742b2e5ba462a7a2cfa2f82ff4d2ddf3 (diff)
downloadmpv-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/demux_ty.c')
-rw-r--r--libmpdemux/demux_ty.c36
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 );