summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorEdward Hervey <edward@centricular.com>2021-07-05 07:42:39 +0200
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>2021-07-05 07:07:15 +0000
commit49b061241e4653ca8e834c866d104a55d494d561 (patch)
tree10613df775be9f3a33c11dd457f8ef20141d6cd7 /gst
parent65a78effdbe34164186365f3347546b0dbbdc0bb (diff)
downloadgstreamer-plugins-bad-49b061241e4653ca8e834c866d104a55d494d561.tar.gz
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: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2378>
Diffstat (limited to 'gst')
-rw-r--r--gst/mxf/mxfdemux.c29
-rw-r--r--gst/mxf/mxfmetadata.c2
-rw-r--r--gst/mxf/mxfmetadata.h3
3 files changed, 34 insertions, 0 deletions
diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c
index 209887d9e..89aa21b52 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 c8d34060d..ca9ed7567 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 80efa7595..cc8b51c50 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 {