[FFmpeg-cvslog] r21688 - in trunk/libavformat: oggdec.c oggdec.h
conrad
subversion
Mon Feb 8 11:13:03 CET 2010
Author: conrad
Date: Mon Feb 8 11:13:03 2010
New Revision: 21688
Log:
Fix playback with invalid files that don't set the continuation flag for
pages that continue packets started in prior pages.
Fixes issue1248
Modified:
trunk/libavformat/oggdec.c
trunk/libavformat/oggdec.h
Modified: trunk/libavformat/oggdec.c
==============================================================================
--- trunk/libavformat/oggdec.c Mon Feb 8 10:04:06 2010 (r21687)
+++ trunk/libavformat/oggdec.c Mon Feb 8 11:13:03 2010 (r21688)
@@ -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
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 *st
if (!complete && os->segp == os->nsegs){
ogg->curidx = -1;
+ os->incomplete = 1;
}
}while (!complete);
@@ -366,6 +368,7 @@ ogg_packet (AVFormatContext * s, int *st
#endif
ogg->curidx = idx;
+ os->incomplete = 0;
if (os->header < 0){
int hdr = os->codec->header (s, idx);
Modified: trunk/libavformat/oggdec.h
==============================================================================
--- trunk/libavformat/oggdec.h Mon Feb 8 10:04:06 2010 (r21687)
+++ trunk/libavformat/oggdec.h Mon Feb 8 11:13:03 2010 (r21688)
@@ -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;
};
More information about the ffmpeg-cvslog
mailing list