From: Michael Niedermayer <[email protected]>
Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
Signed-off-by: Luca Barbato <[email protected]>
---
libavformat/mxfdec.c | 110 ++++++++++++++++++++++++++-------------------------
1 file changed, 57 insertions(+), 53 deletions(-)
diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c
index d5fcf06..10b85f9 100644
--- a/libavformat/mxfdec.c
+++ b/libavformat/mxfdec.c
@@ -2033,6 +2033,55 @@ end:
avio_seek(s->pb, mxf->run_in, SEEK_SET);
}
+static int mxf_read_close(AVFormatContext *s)
+{
+ MXFContext *mxf = s->priv_data;
+ MXFIndexTableSegment *seg;
+ int i;
+
+ av_freep(&mxf->packages_refs);
+
+ for (i = 0; i < s->nb_streams; i++)
+ s->streams[i]->priv_data = NULL;
+
+ for (i = 0; i < mxf->metadata_sets_count; i++) {
+ switch (mxf->metadata_sets[i]->type) {
+ case MultipleDescriptor:
+ av_freep(&((MXFDescriptor
*)mxf->metadata_sets[i])->sub_descriptors_refs);
+ break;
+ case Sequence:
+ av_freep(&((MXFSequence
*)mxf->metadata_sets[i])->structural_components_refs);
+ break;
+ case SourcePackage:
+ case MaterialPackage:
+ av_freep(&((MXFPackage *)mxf->metadata_sets[i])->tracks_refs);
+ break;
+ case IndexTableSegment:
+ seg = (MXFIndexTableSegment *)mxf->metadata_sets[i];
+ av_freep(&seg->temporal_offset_entries);
+ av_freep(&seg->flag_entries);
+ av_freep(&seg->stream_offset_entries);
+ break;
+ default:
+ break;
+ }
+ av_freep(&mxf->metadata_sets[i]);
+ }
+ av_freep(&mxf->partitions);
+ av_freep(&mxf->metadata_sets);
+ av_freep(&mxf->aesc);
+ av_freep(&mxf->local_tags);
+
+ for (i = 0; i < mxf->nb_index_tables; i++) {
+ av_freep(&mxf->index_tables[i].segments);
+ av_freep(&mxf->index_tables[i].ptses);
+ av_freep(&mxf->index_tables[i].fake_index);
+ }
+ av_freep(&mxf->index_tables);
+
+ return 0;
+}
+
static int mxf_read_header(AVFormatContext *s)
{
MXFContext *mxf = s->priv_data;
@@ -2139,10 +2188,10 @@ static int mxf_read_header(AVFormatContext *s)
/* we need to do this before computing the index tables
* to be able to fill in zero IndexDurations with st->duration */
if ((ret = mxf_parse_structural_metadata(mxf)) < 0)
- return ret;
+ goto fail;
if ((ret = mxf_compute_index_tables(mxf)) < 0)
- return ret;
+ goto fail;
if (mxf->nb_index_tables > 1) {
/* TODO: look up which IndexSID to use via EssenceContainerData */
@@ -2150,12 +2199,17 @@ static int mxf_read_header(AVFormatContext *s)
mxf->nb_index_tables, mxf->index_tables[0].index_sid);
} else if (mxf->nb_index_tables == 0 && mxf->op == OPAtom) {
av_log(mxf->fc, AV_LOG_ERROR, "cannot demux OPAtom without an
index\n");
- return AVERROR_INVALIDDATA;
+ ret = AVERROR_INVALIDDATA;
+ goto fail;
}
mxf_handle_small_eubc(s);
return 0;
+fail:
+ mxf_read_close(s);
+
+ return ret;
}
/**
@@ -2420,56 +2474,6 @@ static int mxf_read_packet(AVFormatContext *s, AVPacket
*pkt)
return 0;
}
-
-static int mxf_read_close(AVFormatContext *s)
-{
- MXFContext *mxf = s->priv_data;
- MXFIndexTableSegment *seg;
- int i;
-
- av_freep(&mxf->packages_refs);
-
- for (i = 0; i < s->nb_streams; i++)
- s->streams[i]->priv_data = NULL;
-
- for (i = 0; i < mxf->metadata_sets_count; i++) {
- switch (mxf->metadata_sets[i]->type) {
- case MultipleDescriptor:
- av_freep(&((MXFDescriptor
*)mxf->metadata_sets[i])->sub_descriptors_refs);
- break;
- case Sequence:
- av_freep(&((MXFSequence
*)mxf->metadata_sets[i])->structural_components_refs);
- break;
- case SourcePackage:
- case MaterialPackage:
- av_freep(&((MXFPackage *)mxf->metadata_sets[i])->tracks_refs);
- break;
- case IndexTableSegment:
- seg = (MXFIndexTableSegment *)mxf->metadata_sets[i];
- av_freep(&seg->temporal_offset_entries);
- av_freep(&seg->flag_entries);
- av_freep(&seg->stream_offset_entries);
- break;
- default:
- break;
- }
- av_freep(&mxf->metadata_sets[i]);
- }
- av_freep(&mxf->partitions);
- av_freep(&mxf->metadata_sets);
- av_freep(&mxf->aesc);
- av_freep(&mxf->local_tags);
-
- for (i = 0; i < mxf->nb_index_tables; i++) {
- av_freep(&mxf->index_tables[i].segments);
- av_freep(&mxf->index_tables[i].ptses);
- av_freep(&mxf->index_tables[i].fake_index);
- }
- av_freep(&mxf->index_tables);
-
- return 0;
-}
-
static int mxf_probe(AVProbeData *p) {
uint8_t *bufp = p->buf;
uint8_t *end = p->buf + p->buf_size;
--
1.8.5.1
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel