From 49b061241e4653ca8e834c866d104a55d494d561 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Mon, 5 Jul 2021 07:42:39 +0200 Subject: [PATCH] mxfdemux: Check validity of interleaved File Package As specified by the S377 MXF core specification, if a file package has interleaved content, then all tracks must be using the same Edit Rate Part-of: --- gst/mxf/mxfdemux.c | 29 +++++++++++++++++++++++++++++ gst/mxf/mxfmetadata.c | 2 ++ gst/mxf/mxfmetadata.h | 3 +++ 3 files changed, 34 insertions(+) diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index 209887d..89aa21b 100644 --- a/gst/mxf/mxfdemux.c +++ b/gst/mxf/mxfdemux.c @@ -677,6 +677,7 @@ gst_mxf_demux_update_essence_tracks (GstMXFDemux * demux) i++) { MXFMetadataEssenceContainerData *edata; MXFMetadataSourcePackage *package; + MXFFraction common_rate = { 0, 0 }; if (demux->preface->content_storage->essence_container_data[i] == NULL) continue; @@ -714,6 +715,34 @@ gst_mxf_demux_update_essence_tracks (GstMXFDemux * demux) continue; } + if (package->is_interleaved) { + /* + * S377-1:2019 "9.4.2 The MXF timing model" + * + * The value of Edit Rate shall be identical for every timeline Essence + * Track of the Top-Level File Package. + * + * The value of Edit Rate of the timeline Essence Tracks of one + * Top-Level File Package need not match the Edit Rate of the Essence + * Tracks of the other Top-Level File Packages. + * + * S377-1:2019 "9.5.5 Top-Level File Packages" + * + *12. All Essence Tracks of a Top-Level File Package **shall** have the + * same value of Edit Rate. All other Tracks of a Top-Level File + * Package **should** have the same value of Edit Rate as the + * Essence Tracks. + */ + if (common_rate.n == 0 && common_rate.d == 0) { + common_rate = track->edit_rate; + } else if (common_rate.n * track->edit_rate.d != + common_rate.d * track->edit_rate.n) { + GST_ELEMENT_ERROR (demux, STREAM, WRONG_TYPE, (NULL), + ("Interleaved File Package doesn't have identical edit rate on all tracks.")); + return GST_FLOW_ERROR; + } + } + for (k = 0; k < demux->essence_tracks->len; k++) { GstMXFDemuxEssenceTrack *tmp = &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, diff --git a/gst/mxf/mxfmetadata.c b/gst/mxf/mxfmetadata.c index c8d3406..ca9ed75 100644 --- a/gst/mxf/mxfmetadata.c +++ b/gst/mxf/mxfmetadata.c @@ -2247,6 +2247,8 @@ mxf_metadata_source_package_resolve (MXFMetadataBase * m, GHashTable * metadata) d = MXF_METADATA_FILE_DESCRIPTOR (current); + self->is_interleaved = MXF_IS_METADATA_MULTIPLE_DESCRIPTOR (self->descriptor); + for (i = 0; i < package->n_tracks; i++) { if (!package->tracks[i]) continue; diff --git a/gst/mxf/mxfmetadata.h b/gst/mxf/mxfmetadata.h index 80efa75..cc8b51c 100644 --- a/gst/mxf/mxfmetadata.h +++ b/gst/mxf/mxfmetadata.h @@ -509,6 +509,9 @@ struct _MXFMetadataSourcePackage MXFMetadataGenericDescriptor *descriptor; gboolean top_level; + + /* TRUE if descriptor is multi-descriptor, i.e. content is interleaved */ + gboolean is_interleaved; }; typedef enum { -- 2.7.4