summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2012-02-04 15:27:34 +0100
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>2012-02-04 19:13:29 +0100
commitd7b542ae294aaf818f2a00c5606e009cf931e77c (patch)
tree871f873b3b349a9bcaf19fa6fa88a290ee74b40c /libavformat
parent7f8027b76f1bdce7452d02513fc179cca20d8867 (diff)
Fix potential infinite discard loop.
Fixes trac issue #438. Seeking in that sample would cause ogg_read_timestamp to fail because ogg_packet would go into a state where all packets of stream 1 would be discarded until the end of the stream. Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/oggdec.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
index 3a1abc085f..4280f8f842 100644
--- a/libavformat/oggdec.c
+++ b/libavformat/oggdec.c
@@ -282,6 +282,9 @@ static int ogg_read_page(AVFormatContext *s, int *str)
if (flags & OGG_FLAG_CONT || os->incomplete){
if (!os->psize){
+ // If this is the very first segment we started
+ // playback in the middle of a continuation packet.
+ // Discard it since we missed the start of it.
while (os->segp < os->nsegs){
int seg = os->segments[os->segp++];
os->pstart += seg;
@@ -368,7 +371,11 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize,
if (!complete && os->segp == os->nsegs){
ogg->curidx = -1;
- os->incomplete = 1;
+ // Do not set incomplete for empty packets.
+ // Together with the code in ogg_read_page
+ // that discards all continuation of empty packets
+ // we would get an infinite loop.
+ os->incomplete = !!os->psize;
}
}while (!complete);