mxfdemux: Check validity of interleaved File Package
authorEdward Hervey <edward@centricular.com>
Mon, 5 Jul 2021 05:42:39 +0000 (07:42 +0200)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Mon, 5 Jul 2021 07:07:15 +0000 (07:07 +0000)
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: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2378>

gst/mxf/mxfdemux.c
gst/mxf/mxfmetadata.c
gst/mxf/mxfmetadata.h

index 209887d..89aa21b 100644 (file)
@@ -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,
index c8d3406..ca9ed75 100644 (file)
@@ -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;
index 80efa75..cc8b51c 100644 (file)
@@ -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 {