From 5e57424d118c2faa12b0caa0b9f7816942ba5be2 Mon Sep 17 00:00:00 2001
From: Philip Gladstone <philipjsg@users.sourceforge.net>
Date: Sat, 18 May 2002 21:30:16 +0000
Subject: [PATCH] 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
---
 libav/ffm.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/libav/ffm.c b/libav/ffm.c
index 26572cf5552..98fde8345ac 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;
-- 
GitLab