[FFmpeg-cvslog] oggdec: fix demuxing chained audio streams
Clément Bœsch
ubitux at gmail.com
Mon Apr 11 11:41:16 CEST 2011
On Mon, Apr 11, 2011 at 07:48:48AM +0200, Reimar Döffinger wrote:
>
>
> On 11 Apr 2011, at 04:12, git at videolan.org (Clément Bœsch) wrote:
>
> > ffmpeg | branch: master | Clément Bœsch <ubitux at gmail.com> | Tue Apr 5 00:29:01 2011 +0200| [47dec30edb8565b7e0e8716dc6d0dc36d5b7bc40] | committer: Luca Barbato
> >
> > 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 at gentoo.org>
> >
> >> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=47dec30edb8565b7e0e8716dc6d0dc36d5b7bc40
> > ---
> >
> > libavformat/oggdec.c | 16 ++++++++++++++++
> > libavformat/oggdec.h | 1 +
> > 2 files changed, 17 insertions(+), 0 deletions(-)
> >
> > diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
> > index cd866d4..5cf4faa 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);
>
> Shouldn't this use av_freep?
Should not be necessary, the whole streams array will be reallocated with
ogg_new_stream. Also note there is a pending patch to simplify this code.
Re-attached here in case you're not registered to libav-devel, with its
message:
Thanks for pushing it, but I just realized this code might be
overkill; we can reuse the ogg headers attribute. Patch attached.
Also, I'm still unable to reload the metadata on track change…
--
Clément B.
-------------- next part --------------
>From 417111b8e66986d51f9c08d61aefdf79a01cf348 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20B=C5=93sch?= <ubitux at gmail.com>
Date: Sun, 10 Apr 2011 09:26:43 +0200
Subject: [PATCH] oggdec: simplify audio chained ogg streams support
---
libavformat/oggdec.c | 8 +-------
libavformat/oggdec.h | 1 -
2 files changed, 1 insertions(+), 8 deletions(-)
diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
index 5cf4faa..ce1152d 100644
--- a/libavformat/oggdec.c
+++ b/libavformat/oggdec.c
@@ -164,7 +164,6 @@ 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)
@@ -242,8 +241,7 @@ 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) {
+ if (ogg->headers) {
int n;
for (n = 0; n < ogg->nstreams; n++) {
@@ -252,8 +250,6 @@ ogg_read_page (AVFormatContext * s, int *str)
}
ogg->curidx = -1;
ogg->nstreams = 0;
- break;
- }
}
idx = ogg_new_stream (s, serial);
if (idx < 0)
@@ -261,8 +257,6 @@ ogg_read_page (AVFormatContext * s, int *str)
}
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 785cd81..7d66cd5 100644
--- a/libavformat/oggdec.h
+++ b/libavformat/oggdec.h
@@ -75,7 +75,6 @@ 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;
};
--
1.7.4.4
More information about the ffmpeg-cvslog
mailing list