aboutsummaryrefslogtreecommitdiffstats
path: root/libav/ffm.c
diff options
context:
space:
mode:
authorPhilip Gladstone <philipjsg@users.sourceforge.net>2002-05-18 21:30:16 +0000
committerPhilip Gladstone <philipjsg@users.sourceforge.net>2002-05-18 21:30:16 +0000
commit5e57424d118c2faa12b0caa0b9f7816942ba5be2 (patch)
treecc1761d3a9de7c731ff9e5a84cf30cd247e45bdb /libav/ffm.c
parent9c80daf193bc147dc7325a41aebb5b774d2e1450 (diff)
downloadffmpeg-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
Diffstat (limited to 'libav/ffm.c')
-rw-r--r--libav/ffm.c12
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;