diff options
author | Clément Bœsch <ubitux@gmail.com> | 2011-04-05 02:29:01 +0400 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2011-04-10 06:33:15 +0400 |
commit | 47dec30edb8565b7e0e8716dc6d0dc36d5b7bc40 (patch) | |
tree | a7a54e93b13096a4366e29dd42ce0323f79b156a /libavformat/oggdec.c | |
parent | cbfa93aca33dda399dd946f1bc4e3097c124fa5d (diff) |
oggdec: fix demuxing chained audio streams
Chained ogg served by icecast and mpd should demux
properly now.
Fixes issue2337
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Diffstat (limited to 'libavformat/oggdec.c')
-rw-r--r-- | libavformat/oggdec.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c index cd866d4108..5cf4faa686 100644 --- a/libavformat/oggdec.c +++ b/libavformat/oggdec.c @@ -164,6 +164,7 @@ ogg_new_stream (AVFormatContext * s, uint32_t serial) os->bufsize = DECODER_BUFFER_SIZE; os->buf = av_malloc(os->bufsize); os->header = -1; + os->page_begin = 1; st = av_new_stream (s, idx); if (!st) @@ -241,12 +242,27 @@ ogg_read_page (AVFormatContext * s, int *str) idx = ogg_find_stream (ogg, serial); if (idx < 0){ + for (i = 0; i < ogg->nstreams; i++) { + if (!ogg->streams[i].page_begin) { + int n; + + for (n = 0; n < ogg->nstreams; n++) { + av_free(ogg->streams[n].buf); + av_free(ogg->streams[n].private); + } + ogg->curidx = -1; + ogg->nstreams = 0; + break; + } + } idx = ogg_new_stream (s, serial); if (idx < 0) return -1; } os = ogg->streams + idx; + if (!(flags & OGG_FLAG_BOS)) + os->page_begin = 0; os->page_pos = avio_tell(bc) - 27; if(os->psize > 0) |