[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