X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Foggdec.c;h=edeae2ba83c668c92882b94d831a950868bbe41c;hb=5e4a5726995ccf9f8a934c550bceec31cc1857c1;hp=e1ef21337c820c4fa7164990eae1a3e3685cd886;hpb=dc0ca508ea2521010ac6168e330b0339edfc518c;p=ffmpeg diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c index e1ef21337c8..edeae2ba83c 100644 --- a/libavformat/oggdec.c +++ b/libavformat/oggdec.c @@ -61,7 +61,22 @@ static const struct ogg_codec * const ogg_codecs[] = { static int64_t ogg_calc_pts(AVFormatContext *s, int idx, int64_t *dts); static int ogg_new_stream(AVFormatContext *s, uint32_t serial); -static int ogg_restore(AVFormatContext *s, int discard); +static int ogg_restore(AVFormatContext *s); + +static void free_stream(AVFormatContext *s, int i) +{ + struct ogg *ogg = s->priv_data; + struct ogg_stream *stream = &ogg->streams[i]; + + av_freep(&stream->buf); + if (stream->codec && + stream->codec->cleanup) { + stream->codec->cleanup(s, i); + } + + av_freep(&stream->private); + av_freep(&stream->new_metadata); +} //FIXME We could avoid some structure duplication static int ogg_save(AVFormatContext *s) @@ -95,12 +110,12 @@ static int ogg_save(AVFormatContext *s) ogg->state = ost; if (ret < 0) - ogg_restore(s, 0); + ogg_restore(s); return ret; } -static int ogg_restore(AVFormatContext *s, int discard) +static int ogg_restore(AVFormatContext *s) { struct ogg *ogg = s->priv_data; AVIOContext *bc = s->pb; @@ -112,10 +127,12 @@ static int ogg_restore(AVFormatContext *s, int discard) ogg->state = ost->next; - if (!discard) { - - for (i = 0; i < ogg->nstreams; i++) + for (i = 0; i < ogg->nstreams; i++) { av_freep(&ogg->streams[i].buf); + if (i >= ost->nstreams || !ost->streams[i].private) { + free_stream(s, i); + } + } avio_seek(bc, ost->pos, SEEK_SET); ogg->page_pos = -1; @@ -128,7 +145,6 @@ static int ogg_restore(AVFormatContext *s, int discard) } else memcpy(ogg->streams, ost->streams, ost->nstreams * sizeof(*ogg->streams)); - } av_free(ost); @@ -631,7 +647,7 @@ static int ogg_get_length(AVFormatContext *s) } } - ogg_restore(s, 0); + ogg_restore(s); ret = ogg_save(s); if (ret < 0) @@ -654,7 +670,7 @@ static int ogg_get_length(AVFormatContext *s) streams_left--; } } - ogg_restore (s, 0); + ogg_restore (s); return 0; } @@ -665,13 +681,7 @@ static int ogg_read_close(AVFormatContext *s) int i; for (i = 0; i < ogg->nstreams; i++) { - av_freep(&ogg->streams[i].buf); - if (ogg->streams[i].codec && - ogg->streams[i].codec->cleanup) { - ogg->streams[i].codec->cleanup(s, i); - } - av_freep(&ogg->streams[i].private); - av_freep(&ogg->streams[i].new_metadata); + free_stream(s, i); } ogg->nstreams = 0;