[SCM] libav/experimental: Fix playback with invalid files that don't set the continuation flag for pages that continue packets started in prior pages. Fixes issue1248

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 16:59:37 UTC 2013


The following commit has been merged in the experimental branch:
commit ecc0027bc6d58536b92003173b0e23504e828472
Author: David Conrad <lessen42 at gmail.com>
Date:   Mon Feb 8 10:13:03 2010 +0000

    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

diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
index 26a6af2..3e1bf5d 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 7c677a1..b0a23e2 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;
 };

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list