mirror of https://git.ffmpeg.org/ffmpeg.git
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:
parent
cbfa93aca3
commit
47dec30edb
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue