summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorEdward Hervey <edward@centricular.com>2021-07-15 10:28:31 +0200
committerEdward Hervey <bilboed@bilboed.com>2021-07-21 14:33:19 +0000
commit40d369005455e0e17fb34043fcad88c414d7cfba (patch)
tree5452f6acbcf18c91b84f609291637597bc93873d /gst
parent3303e0ebd26232f5fc44fb4709369ac97aac787d (diff)
downloadgstreamer-plugins-bad-40d369005455e0e17fb34043fcad88c414d7cfba.tar.gz
mxfdemux: Output the topology of the file in debug logs
This provides a summary of the number/type of tracks in the Material and File Packages Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2371>
Diffstat (limited to 'gst')
-rw-r--r--gst/mxf/mxfdemux.c144
1 files changed, 144 insertions, 0 deletions
diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c
index 52bbb23fc..e96382a6f 100644
--- a/gst/mxf/mxfdemux.c
+++ b/gst/mxf/mxfdemux.c
@@ -980,6 +980,148 @@ gst_mxf_demux_update_essence_tracks (GstMXFDemux * demux)
return GST_FLOW_OK;
}
+static MXFMetadataEssenceContainerData *
+essence_container_for_source_package (MXFMetadataContentStorage * storage,
+ MXFMetadataSourcePackage * package)
+{
+ guint i;
+
+ for (i = 0; i < storage->n_essence_container_data; i++) {
+ MXFMetadataEssenceContainerData *cont = storage->essence_container_data[i];
+ if (cont && cont->linked_package == package)
+ return cont;
+ }
+
+ return NULL;
+}
+
+static void
+gst_mxf_demux_show_topology (GstMXFDemux * demux)
+{
+ GList *material_packages = NULL;
+ GList *file_packages = NULL;
+ GList *tmp;
+ MXFMetadataContentStorage *storage = demux->preface->content_storage;
+ guint i;
+ gchar str[96];
+
+ /* Show the topology starting from the preface */
+ GST_DEBUG_OBJECT (demux, "Topology");
+
+ for (i = 0; i < storage->n_packages; i++) {
+ MXFMetadataGenericPackage *pack = storage->packages[i];
+ if (MXF_IS_METADATA_MATERIAL_PACKAGE (pack))
+ material_packages = g_list_append (material_packages, pack);
+ else if (MXF_IS_METADATA_SOURCE_PACKAGE (pack))
+ file_packages = g_list_append (file_packages, pack);
+ else
+ GST_DEBUG_OBJECT (demux, "Unknown package type");
+ }
+
+ GST_DEBUG_OBJECT (demux, "Number of Material Package (i.e. output) : %d",
+ g_list_length (material_packages));
+ for (tmp = material_packages; tmp; tmp = tmp->next) {
+ MXFMetadataMaterialPackage *pack = (MXFMetadataMaterialPackage *) tmp->data;
+ GST_DEBUG_OBJECT (demux, " Package with %d tracks , UID:%s",
+ pack->n_tracks, mxf_umid_to_string (&pack->package_uid, str));
+ for (i = 0; i < pack->n_tracks; i++) {
+ MXFMetadataTrack *track = pack->tracks[i];
+ if (track == NULL) {
+ GST_DEBUG_OBJECT (demux, " Unknown/Unhandled track UUID %s",
+ mxf_uuid_to_string (&pack->tracks_uids[i], str));
+ } else if (MXF_IS_METADATA_TIMELINE_TRACK (track)) {
+ MXFMetadataTimelineTrack *mtrack = (MXFMetadataTimelineTrack *) track;
+ GST_DEBUG_OBJECT (demux,
+ " Timeline Track id:%d number:0x%08x name:`%s` edit_rate:%d/%d origin:%"
+ G_GINT64_FORMAT, track->track_id, track->track_number,
+ track->track_name, mtrack->edit_rate.n, mtrack->edit_rate.d,
+ mtrack->origin);
+ } else {
+ GST_DEBUG_OBJECT (demux,
+ " Non-Timeline-Track id:%d number:0x%08x name:`%s`",
+ track->track_id, track->track_number, track->track_name);
+ }
+ if (track) {
+ MXFMetadataSequence *sequence = track->sequence;
+ guint si;
+ GST_DEBUG_OBJECT (demux,
+ " Sequence duration:%" G_GINT64_FORMAT
+ " n_structural_components:%d", sequence->duration,
+ sequence->n_structural_components);
+ for (si = 0; si < sequence->n_structural_components; si++) {
+ MXFMetadataStructuralComponent *comp =
+ sequence->structural_components[si];
+ GST_DEBUG_OBJECT (demux,
+ " Component #%d duration:%" G_GINT64_FORMAT, si,
+ comp->duration);
+ if (MXF_IS_METADATA_SOURCE_CLIP (comp)) {
+ MXFMetadataSourceClip *clip = (MXFMetadataSourceClip *) comp;
+ GST_DEBUG_OBJECT (demux,
+ " Clip start_position:%" G_GINT64_FORMAT
+ " source_track_id:%d source_package_id:%s",
+ clip->start_position, clip->source_track_id,
+ mxf_umid_to_string (&clip->source_package_id, str));
+ }
+ }
+
+ }
+ }
+ }
+
+ GST_DEBUG_OBJECT (demux, "Number of File Packages (i.e. input) : %d",
+ g_list_length (file_packages));
+ for (tmp = file_packages; tmp; tmp = tmp->next) {
+ MXFMetadataMaterialPackage *pack = (MXFMetadataMaterialPackage *) tmp->data;
+ MXFMetadataSourcePackage *src = (MXFMetadataSourcePackage *) pack;
+ MXFMetadataEssenceContainerData *econt =
+ essence_container_for_source_package (storage, src);
+ GST_DEBUG_OBJECT (demux,
+ " Package (body_sid:%d index_sid:%d top_level:%d) with %d tracks , UID:%s",
+ econt->body_sid, econt->index_sid, src->top_level, pack->n_tracks,
+ mxf_umid_to_string (&pack->package_uid, str));
+ GST_DEBUG_OBJECT (demux, " Package descriptor : %s",
+ g_type_name (G_OBJECT_TYPE (src->descriptor)));
+ for (i = 0; i < pack->n_tracks; i++) {
+ MXFMetadataTrack *track = pack->tracks[i];
+ MXFMetadataSequence *sequence = track->sequence;
+ guint di, si;
+ if (MXF_IS_METADATA_TIMELINE_TRACK (track)) {
+ MXFMetadataTimelineTrack *mtrack = (MXFMetadataTimelineTrack *) track;
+ GST_DEBUG_OBJECT (demux,
+ " Timeline Track id:%d number:0x%08x name:`%s` edit_rate:%d/%d origin:%"
+ G_GINT64_FORMAT, track->track_id, track->track_number,
+ track->track_name, mtrack->edit_rate.n, mtrack->edit_rate.d,
+ mtrack->origin);
+ } else {
+ GST_DEBUG_OBJECT (demux,
+ " Non-Timeline-Track id:%d number:0x%08x name:`%s` type:0x%x",
+ track->track_id, track->track_number, track->track_name,
+ track->type);
+ }
+ for (di = 0; di < track->n_descriptor; di++) {
+ MXFMetadataFileDescriptor *desc = track->descriptor[di];
+ GST_DEBUG_OBJECT (demux, " Descriptor %s %s",
+ g_type_name (G_OBJECT_TYPE (desc)),
+ mxf_ul_to_string (&desc->essence_container, str));
+ }
+ GST_DEBUG_OBJECT (demux,
+ " Sequence duration:%" G_GINT64_FORMAT
+ " n_structural_components:%d", sequence->duration,
+ sequence->n_structural_components);
+ for (si = 0; si < sequence->n_structural_components; si++) {
+ MXFMetadataStructuralComponent *comp =
+ sequence->structural_components[si];
+ GST_DEBUG_OBJECT (demux,
+ " Component #%d duration:%" G_GINT64_FORMAT, si,
+ comp->duration);
+ }
+ }
+ }
+
+ g_list_free (material_packages);
+ g_list_free (file_packages);
+}
+
static GstFlowReturn
gst_mxf_demux_update_tracks (GstMXFDemux * demux)
{
@@ -994,6 +1136,8 @@ gst_mxf_demux_update_tracks (GstMXFDemux * demux)
g_rw_lock_writer_lock (&demux->metadata_lock);
GST_DEBUG_OBJECT (demux, "Updating tracks");
+ gst_mxf_demux_show_topology (demux);
+
if ((ret = gst_mxf_demux_update_essence_tracks (demux)) != GST_FLOW_OK) {
goto error;
}