On 2014-01-08 03:25:45 +0100, Luca Barbato wrote: > 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;
ok Janne > -- > 1.8.5.1 > > _______________________________________________ > libav-devel mailing list > [email protected] > https://lists.libav.org/mailman/listinfo/libav-devel _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
