diff options
author | Philip Gladstone <philipjsg@users.sourceforge.net> | 2002-05-18 21:30:16 +0000 |
---|---|---|
committer | Philip Gladstone <philipjsg@users.sourceforge.net> | 2002-05-18 21:30:16 +0000 |
commit | 5e57424d118c2faa12b0caa0b9f7816942ba5be2 (patch) | |
tree | cc1761d3a9de7c731ff9e5a84cf30cd247e45bdb | |
parent | 9c80daf193bc147dc7325a41aebb5b774d2e1450 (diff) | |
download | ffmpeg-5e57424d118c2faa12b0caa0b9f7816942ba5be2.tar.gz |
Fix the WAIT_FEED problem. It turns out that when you open up an FFM
file and seek to an FFM packet, then it is important that the packet
found has a frame header within it. If not, then terrible things happen.
This fixes the problem.
Originally committed as revision 513 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libav/ffm.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/libav/ffm.c b/libav/ffm.c index 26572cf555..98fde8345a 100644 --- a/libav/ffm.c +++ b/libav/ffm.c @@ -301,6 +301,7 @@ static int ffm_read_data(AVFormatContext *s, if (len == 0) { if (url_ftell(pb) == ffm->file_size) url_fseek(pb, ffm->packet_size, SEEK_SET); + retry_read: get_be16(pb); /* PACKET_ID */ fill_size = get_be16(pb); ffm->pts = get_be64(pb); @@ -310,7 +311,18 @@ static int ffm_read_data(AVFormatContext *s, /* if first packet or resynchronization packet, we must handle it specifically */ if (ffm->first_packet || (frame_offset & 0x8000)) { + if (!frame_offset) { + /* This packet has no frame headers in it */ + if (url_ftell(pb) >= ffm->packet_size * 3) { + url_fseek(pb, -ffm->packet_size * 2, SEEK_CUR); + goto retry_read; + } + /* This is bad, we cannot find a valid frame header */ + return 0; + } ffm->first_packet = 0; + if ((frame_offset & 0x7ffff) < FFM_HEADER_SIZE) + abort(); ffm->packet_ptr = ffm->packet + (frame_offset & 0x7fff) - FFM_HEADER_SIZE; if (!first) break; |