From 365d8e471d59356bc8ebacc29ef00e9d839588f1 Mon Sep 17 00:00:00 2001 From: Aaron Colwell Date: Mon, 29 Nov 2010 19:02:28 +0000 Subject: [PATCH] Ensure that data_offset is set correctly when there are partial data packets before the first complete one. Patch by Aaron Colwell [acolwell chromium org]. Originally committed as revision 25846 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/oggdec.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c index 5e52bb3c97..4fcf8ad58c 100644 --- a/libavformat/oggdec.c +++ b/libavformat/oggdec.c @@ -373,9 +373,27 @@ ogg_packet (AVFormatContext * s, int *str, int *dstart, int *dsize, int64_t *fpo if (!os->header){ os->segp = segp; os->psize = psize; - if (!ogg->headers) - s->data_offset = os->sync_pos; + + // We have reached the first non-header packet. All header + // packets must be complete before the first non-header + // one, so everything that follows must be non-header. ogg->headers = 1; + + // Update the header state for all streams and + // compute the data_offset. + s->data_offset = os->sync_pos; + for (i = 0; i < ogg->nstreams; i++) { + struct ogg_stream *cur_os = ogg->streams + i; + // Set stream header state to 0 if its last packet + // was a header. + if (cur_os->header > 0) + cur_os->header = 0; + + // if we have a partial non-header packet, its start is + // obviously at or after the data start + if (cur_os->incomplete) + s->data_offset = FFMIN(s->data_offset, cur_os->sync_pos); + } }else{ os->pstart += os->psize; os->psize = 0;