From 658066d0856d1f26ba083cbae493dd3a0c411a45 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Sun, 8 Feb 2009 07:30:48 +0100 Subject: [PATCH] mxfdemux: For material packages make sure that tracks resolve to source tracks --- gst/mxf/mxfmetadata.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/gst/mxf/mxfmetadata.c b/gst/mxf/mxfmetadata.c index 07affd4..285a9ac 100644 --- a/gst/mxf/mxfmetadata.c +++ b/gst/mxf/mxfmetadata.c @@ -1114,6 +1114,7 @@ mxf_metadata_material_package_resolve (MXFMetadataBase * m, (mxf_metadata_material_package_parent_class)->resolve (m, metadata); MXFMetadataGenericPackage *self = MXF_METADATA_GENERIC_PACKAGE (m); guint i; + guint ntracks = 0; if (!ret) return ret; @@ -1133,6 +1134,8 @@ mxf_metadata_material_package_resolve (MXFMetadataBase * m, for (j = 0; j < sequence->n_structural_components; j++) { MXFMetadataSourceClip *sc; + MXFMetadataTimelineTrack *st = NULL; + guint k; if (!sequence->structural_components[j] || !MXF_IS_METADATA_SOURCE_CLIP (sequence->structural_components[j])) @@ -1140,9 +1143,48 @@ mxf_metadata_material_package_resolve (MXFMetadataBase * m, sc = MXF_METADATA_SOURCE_CLIP (sequence->structural_components[j]); - if (sc->source_package) - sc->source_package->top_level = TRUE; + if (!sc->source_package) { + GST_ERROR ("Material package track %u without resolved source package", + i); + track = NULL; + break; + } + + sc->source_package->top_level = TRUE; + for (k = 0; k < sc->source_package->parent.n_tracks; k++) { + MXFMetadataTimelineTrack *tmp; + + if (!sc->source_package->parent.tracks[k] || + !MXF_IS_METADATA_TIMELINE_TRACK (sc->source_package-> + parent.tracks[k])) + continue; + + tmp = + MXF_METADATA_TIMELINE_TRACK (sc->source_package->parent.tracks[k]); + if (tmp->parent.track_id == sc->source_track_id) { + st = tmp; + break; + } + } + + if (!st) { + GST_ERROR ("Material package track %u without resolved source track", + i); + track = NULL; + } } + + if (track) + ntracks++; + else + self->tracks[i] = NULL; + } + + if (ntracks == 0) { + GST_ERROR ("No tracks could be resolved"); + return FALSE; + } else if (ntracks != self->n_tracks) { + GST_WARNING ("Not all tracks could be resolved"); } return TRUE; -- 2.7.4