| Index: source/patched-ffmpeg-mt/libavformat/oggdec.c
|
| ===================================================================
|
| --- source/patched-ffmpeg-mt/libavformat/oggdec.c (revision 67543)
|
| +++ source/patched-ffmpeg-mt/libavformat/oggdec.c (working copy)
|
| @@ -383,9 +383,27 @@
|
| if (!os->header){
|
| os->segp = segp;
|
| os->psize = psize;
|
| - if (!ogg->headers)
|
| - s->data_offset = os->sync_pos;
|
| +
|
| + // We've 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;
|
|
|