aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat
diff options
context:
space:
mode:
authorClément Bœsch <ubitux@gmail.com>2011-04-05 00:29:01 +0200
committerLuca Barbato <lu_zero@gentoo.org>2011-04-10 04:33:15 +0200
commit47dec30edb8565b7e0e8716dc6d0dc36d5b7bc40 (patch)
treea7a54e93b13096a4366e29dd42ce0323f79b156a /libavformat
parentcbfa93aca33dda399dd946f1bc4e3097c124fa5d (diff)
downloadffmpeg-47dec30edb8565b7e0e8716dc6d0dc36d5b7bc40.tar.gz
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')
-rw-r--r--libavformat/oggdec.c16
-rw-r--r--libavformat/oggdec.h1
2 files changed, 17 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)
diff --git a/libavformat/oggdec.h b/libavformat/oggdec.h
index 7d66cd5638..785cd812f9 100644
--- a/libavformat/oggdec.h
+++ b/libavformat/oggdec.h
@@ -75,6 +75,7 @@ struct ogg_stream {
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
int keyframe_seek;
+ int page_begin; ///< set to 1 if the stream only received a begin-of-stream packet, otherwise 0
void *private;
};