From 206ed12368bad40e3a57177924f99b714733c3d4 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Mon, 6 Feb 2023 15:59:56 +0100 Subject: [PATCH] mxfdemux: Handle sub-descriptor in generic descriptors Specificied in S377-1 (2019) B.2 Generic Descriptor This is one of the ways to store more "sub descriptors" for a single track Part-of: --- .../gst-plugins-bad/gst/mxf/mxfdemux.c | 12 ++++ .../gst-plugins-bad/gst/mxf/mxfmetadata.c | 56 +++++++++++++++++-- .../gst-plugins-bad/gst/mxf/mxfmetadata.h | 4 ++ subprojects/gst-plugins-bad/gst/mxf/mxful.c | 3 + subprojects/gst-plugins-bad/gst/mxf/mxful.h | 1 + 5 files changed, 72 insertions(+), 4 deletions(-) diff --git a/subprojects/gst-plugins-bad/gst/mxf/mxfdemux.c b/subprojects/gst-plugins-bad/gst/mxf/mxfdemux.c index d9eb9a5844..4b91e5e5ca 100644 --- a/subprojects/gst-plugins-bad/gst/mxf/mxfdemux.c +++ b/subprojects/gst-plugins-bad/gst/mxf/mxfdemux.c @@ -1201,9 +1201,21 @@ gst_mxf_demux_show_topology (GstMXFDemux * demux) } for (di = 0; di < track->n_descriptor; di++) { MXFMetadataFileDescriptor *desc = track->descriptor[di]; + MXFMetadataGenericDescriptor *generic = + (MXFMetadataGenericDescriptor *) desc; + guint subdi; + GST_DEBUG_OBJECT (demux, " Descriptor %s %s", g_type_name (G_OBJECT_TYPE (desc)), mxf_ul_to_string (&desc->essence_container, str)); + for (subdi = 0; subdi < generic->n_sub_descriptors; subdi++) { + MXFMetadataGenericDescriptor *subdesc = + generic->sub_descriptors[subdi]; + if (subdesc) { + GST_DEBUG_OBJECT (demux, " Sub-Descriptor %s", + g_type_name (G_OBJECT_TYPE (subdesc))); + } + } } GST_DEBUG_OBJECT (demux, " Sequence duration:%" G_GINT64_FORMAT diff --git a/subprojects/gst-plugins-bad/gst/mxf/mxfmetadata.c b/subprojects/gst-plugins-bad/gst/mxf/mxfmetadata.c index 6c88aec7e7..560b8a9e31 100644 --- a/subprojects/gst-plugins-bad/gst/mxf/mxfmetadata.c +++ b/subprojects/gst-plugins-bad/gst/mxf/mxfmetadata.c @@ -3912,6 +3912,11 @@ mxf_metadata_generic_descriptor_finalize (GObject * object) g_free (self->locators); self->locators = NULL; + g_free (self->sub_descriptors_uids); + self->sub_descriptors_uids = NULL; + g_free (self->sub_descriptors); + self->sub_descriptors = NULL; + G_OBJECT_CLASS (mxf_metadata_generic_descriptor_parent_class)->finalize (object); } @@ -3946,11 +3951,31 @@ mxf_metadata_generic_descriptor_handle_tag (MXFMetadataBase * metadata, #endif break; default: - ret = - MXF_METADATA_BASE_CLASS - (mxf_metadata_generic_descriptor_parent_class)->handle_tag (metadata, - primer, tag, tag_data, tag_size); + { + MXFUL *tag_ul = mxf_primer_tag_to_ul (primer, tag); + if (tag_ul && mxf_ul_is_equal (tag_ul, MXF_UL (SUB_DESCRIPTORS_ARRAY))) { + if (!mxf_uuid_array_parse (&self->sub_descriptors_uids, + &self->n_sub_descriptors, tag_data, tag_size)) + goto error; + + GST_DEBUG (" number of sub_descriptors = %u", self->n_sub_descriptors); +#ifndef GST_DISABLE_GST_DEBUG + { + guint i; + for (i = 0; i < self->n_sub_descriptors; i++) { + GST_DEBUG (" sub descriptor %u = %s", i, + mxf_uuid_to_string (&self->sub_descriptors_uids[i], str)); + } + } +#endif + } else { + ret = + MXF_METADATA_BASE_CLASS + (mxf_metadata_generic_descriptor_parent_class)->handle_tag + (metadata, primer, tag, tag_data, tag_size); + } break; + } } return ret; @@ -4000,6 +4025,29 @@ mxf_metadata_generic_descriptor_resolve (MXFMetadataBase * m, return FALSE; } + /* this memory reuse is done in the same way as for locators, but the reason + * isn't 100% clear. This might not be needed anymore */ + if (self->sub_descriptors) + memset (self->sub_descriptors, 0, + sizeof (gpointer) * self->n_sub_descriptors); + else + self->sub_descriptors = + g_new0 (MXFMetadataGenericDescriptor *, self->n_sub_descriptors); + for (i = 0; i < self->n_sub_descriptors; i++) { + current = g_hash_table_lookup (metadata, &self->sub_descriptors_uids[i]); + if (current && MXF_IS_METADATA_GENERIC_DESCRIPTOR (current)) { + if (mxf_metadata_base_resolve (current, metadata)) { + self->sub_descriptors[i] = MXF_METADATA_GENERIC_DESCRIPTOR (current); + } else { + GST_WARNING ("Couldn't resolve sub_descriptor %s", + mxf_uuid_to_string (&self->sub_descriptors_uids[i], str)); + } + } else { + GST_WARNING ("Sub_Descriptor %s not found", + mxf_uuid_to_string (&self->sub_descriptors_uids[i], str)); + } + } + return MXF_METADATA_BASE_CLASS (mxf_metadata_generic_descriptor_parent_class)->resolve (m, metadata); diff --git a/subprojects/gst-plugins-bad/gst/mxf/mxfmetadata.h b/subprojects/gst-plugins-bad/gst/mxf/mxfmetadata.h index cc8b51c50e..0424a92ac9 100644 --- a/subprojects/gst-plugins-bad/gst/mxf/mxfmetadata.h +++ b/subprojects/gst-plugins-bad/gst/mxf/mxfmetadata.h @@ -625,6 +625,10 @@ struct _MXFMetadataGenericDescriptor { guint32 n_locators; MXFUUID *locators_uids; MXFMetadataLocator **locators; + + MXFUUID *sub_descriptors_uids; + guint32 n_sub_descriptors; + MXFMetadataGenericDescriptor **sub_descriptors; }; struct _MXFMetadataFileDescriptor { diff --git a/subprojects/gst-plugins-bad/gst/mxf/mxful.c b/subprojects/gst-plugins-bad/gst/mxf/mxful.c index 75829c688c..21da5bebbd 100644 --- a/subprojects/gst-plugins-bad/gst/mxf/mxful.c +++ b/subprojects/gst-plugins-bad/gst/mxf/mxful.c @@ -275,6 +275,9 @@ const MXFUL _mxf_ul_table[] = { /* LOCATORS */ {{0x06, 0x0E, 0x2B, 0x34, 0x01, 0x01, 0x01, 0x02, 0x06, 0x01, 0x01, 0x04, 0x06, 0x03, 0x00, 0x00}}, + /* SUB_DESCRIPTORS_ARRAY */ + {{0x06, 0x0E, 0x2B, 0x34, 0x01, 0x01, 0x01, 0x09, + 0x06, 0x01, 0x01, 0x04, 0x06, 0x10, 0x00, 0x00}}, /* File descriptor */ /* LINKED_TRACK_ID */ {{0x06, 0x0E, 0x2B, 0x34, 0x01, 0x01, 0x01, 0x05, diff --git a/subprojects/gst-plugins-bad/gst/mxf/mxful.h b/subprojects/gst-plugins-bad/gst/mxf/mxful.h index 76e3ba67ab..b976393f3d 100644 --- a/subprojects/gst-plugins-bad/gst/mxf/mxful.h +++ b/subprojects/gst-plugins-bad/gst/mxf/mxful.h @@ -106,6 +106,7 @@ typedef enum { MXF_UL_DM_SEGMENT_TRACK_IDS, MXF_UL_DM_FRAMEWORK, MXF_UL_LOCATORS, + MXF_UL_SUB_DESCRIPTORS_ARRAY, MXF_UL_LINKED_TRACK_ID, MXF_UL_SAMPLE_RATE, MXF_UL_CONTAINER_DURATION,