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>
This commit is contained in:
Clément Bœsch 2011-04-05 00:29:01 +02:00 committed by Luca Barbato
parent cbfa93aca3
commit 47dec30edb
2 changed files with 17 additions and 0 deletions

View File

@ -164,6 +164,7 @@ ogg_new_stream (AVFormatContext * s, uint32_t serial)
os->bufsize = DECODER_BUFFER_SIZE; os->bufsize = DECODER_BUFFER_SIZE;
os->buf = av_malloc(os->bufsize); os->buf = av_malloc(os->bufsize);
os->header = -1; os->header = -1;
os->page_begin = 1;
st = av_new_stream (s, idx); st = av_new_stream (s, idx);
if (!st) if (!st)
@ -241,12 +242,27 @@ ogg_read_page (AVFormatContext * s, int *str)
idx = ogg_find_stream (ogg, serial); idx = ogg_find_stream (ogg, serial);
if (idx < 0){ 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); idx = ogg_new_stream (s, serial);
if (idx < 0) if (idx < 0)
return -1; return -1;
} }
os = ogg->streams + idx; os = ogg->streams + idx;
if (!(flags & OGG_FLAG_BOS))
os->page_begin = 0;
os->page_pos = avio_tell(bc) - 27; os->page_pos = avio_tell(bc) - 27;
if(os->psize > 0) if(os->psize > 0)

View File

@ -75,6 +75,7 @@ struct ogg_stream {
int incomplete; ///< whether we're expecting a continuation in the next page 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 page_end; ///< current packet is the last one completed in the page
int keyframe_seek; int keyframe_seek;
int page_begin; ///< set to 1 if the stream only received a begin-of-stream packet, otherwise 0
void *private; void *private;
}; };