From ecc0027bc6d58536b92003173b0e23504e828472 Mon Sep 17 00:00:00 2001
From: David Conrad <lessen42@gmail.com>
Date: Mon, 8 Feb 2010 10:13:03 +0000
Subject: [PATCH] Fix playback with invalid files that don't set the
 continuation flag for pages that continue packets started in prior pages.
 Fixes issue1248

Originally committed as revision 21688 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 libavformat/oggdec.c | 5 ++++-
 libavformat/oggdec.h | 1 +
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
index 26a6af20cb7..3e1bf5d4dec 100644
--- a/libavformat/oggdec.c
+++ b/libavformat/oggdec.c
@@ -122,6 +122,7 @@ ogg_reset (struct ogg * ogg)
         os->lastdts = AV_NOPTS_VALUE;
         os->nsegs = 0;
         os->segp = 0;
+        os->incomplete = 0;
     }
 
     ogg->curidx = -1;
@@ -268,7 +269,7 @@ ogg_read_page (AVFormatContext * s, int *str)
     for (i = 0; i < nsegs; i++)
         size += os->segments[i];
 
-    if (flags & OGG_FLAG_CONT){
+    if (flags & OGG_FLAG_CONT || os->incomplete){
         if (!os->psize){
             while (os->segp < os->nsegs){
                 int seg = os->segments[os->segp++];
@@ -356,6 +357,7 @@ ogg_packet (AVFormatContext * s, int *str, int *dstart, int *dsize)
 
         if (!complete && os->segp == os->nsegs){
             ogg->curidx = -1;
+            os->incomplete = 1;
         }
     }while (!complete);
 
@@ -366,6 +368,7 @@ ogg_packet (AVFormatContext * s, int *str, int *dstart, int *dsize)
 #endif
 
     ogg->curidx = idx;
+    os->incomplete = 0;
 
     if (os->header < 0){
         int hdr = os->codec->header (s, idx);
diff --git a/libavformat/oggdec.h b/libavformat/oggdec.h
index 7c677a1de49..b0a23e25160 100644
--- a/libavformat/oggdec.h
+++ b/libavformat/oggdec.h
@@ -71,6 +71,7 @@ struct ogg_stream {
     int header;
     int nsegs, segp;
     uint8_t segments[255];
+    int incomplete; ///< whether we're expecting a continuation in the next page
     int page_end;   ///< current packet is the last one completed in the page
     void *private;
 };
-- 
GitLab