slomo gst-plugins-bad: gst-plugins-bad/ gst-plugins-bad/gst/mxf/

[email protected] Thu, 11 Dec 2008 06:35:22 -0800 (PST)
Newsgroups gmane.comp.video.gstreamer.cvs
Message-ID <[email protected]>
CVS Root:       /cvs/gstreamer
Module:         gst-plugins-bad
Changes by:     slomo
Date:           Thu Dec 11 2008  14:35:22 UTC

Log message:
* gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_metadata_track),
(gst_mxf_demux_handle_header_metadata_resolve_references),
(gst_mxf_demux_handle_metadata):
* gst/mxf/mxfparse.c: (mxf_metadata_track_parse),
(mxf_metadata_structural_component_parse),
(mxf_metadata_structural_component_reset):
* gst/mxf/mxfparse.h:
* gst/mxf/mxftypes.h:
Implement parsing of Event Tracks, Static Tracks, DM Segments
and DM Source Clips as a preparation for descriptive metadata
support. Next step is to implement SMPTE S380M, "Descriptive
Metadata Scheme-1".

Modified files:
    .               : ChangeLog
    gst/mxf         : mxfdemux.c mxfparse.c mxfparse.h mxftypes.h

Links:
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3803&r2=1.3804
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.33&r2=1.34
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.20&r2=1.21
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h.diff?r1=1.11&r2=1.12
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxftypes.h.diff?r1=1.7&r2=1.8

====Begin Diffs====
Index: ChangeLog
===================================================================
RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v
retrieving revision 1.3803
retrieving revision 1.3804
diff -u -d -r1.3803 -r1.3804
--- ChangeLog	9 Dec 2008 13:44:43 -0000	1.3803
+++ ChangeLog	11 Dec 2008 14:35:06 -0000	1.3804
@@ -1,3 +1,18 @@
+2008-12-11  Sebastian Dröge  <[email protected]>
+
+	* gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_metadata_track),
+	(gst_mxf_demux_handle_header_metadata_resolve_references),
+	(gst_mxf_demux_handle_metadata):
+	* gst/mxf/mxfparse.c: (mxf_metadata_track_parse),
+	(mxf_metadata_structural_component_parse),
+	(mxf_metadata_structural_component_reset):
+	* gst/mxf/mxfparse.h:
+	* gst/mxf/mxftypes.h:
+	Implement parsing of Event Tracks, Static Tracks, DM Segments
+	and DM Source Clips as a preparation for descriptive metadata
+	support. Next step is to implement SMPTE S380M, "Descriptive
+	Metadata Scheme-1".
 2008-12-09  Sebastian Dröge  <[email protected]>
 
 	* gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps):
Index: mxfdemux.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -d -r1.33 -r1.34
--- mxfdemux.c	8 Dec 2008 15:28:58 -0000	1.33
+++ mxfdemux.c	11 Dec 2008 14:35:07 -0000	1.34
@@ -720,17 +720,18 @@
 static GstFlowReturn
 gst_mxf_demux_handle_metadata_track (GstMXFDemux * demux,
-    const MXFUL * key, GstBuffer * buffer)
+    const MXFUL * key, guint16 type, GstBuffer * buffer)
 {
   MXFMetadataTrack track;
   GST_DEBUG_OBJECT (demux,
-      "Handling metadata track of size %u"
-      " at offset %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (buffer), demux->offset);
+      "Handling metadata track with type 0x%04x of size %u"
+      " at offset %" G_GUINT64_FORMAT, type, GST_BUFFER_SIZE (buffer),
+      demux->offset);
   if (!mxf_metadata_track_parse (key, &track, &demux->primer,
-          GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer))) {
-    GST_ERROR_OBJECT (demux, "Parsing metadata track timecode failed");
+          type, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer))) {
+    GST_ERROR_OBJECT (demux, "Parsing metadata track failed");
     return GST_FLOW_ERROR;
   }
@@ -1287,8 +1288,6 @@
   demux->preface.content_storage = &demux->content_storage;
-  /* TODO: dm_schemes */
-
   /* Content storage */
   demux->content_storage.packages =
       g_new0 (MXFMetadataGenericPackage *, demux->content_storage.n_packages);
@@ -1317,8 +1316,9 @@
           MXFMetadataEssenceContainerData, i);
       for (j = 0; j < demux->content_storage.n_essence_container_data; j++) {
-        if (mxf_ul_is_equal (&demux->content_storage.
-                essence_container_data_uids[j], &data->instance_uid)) {
+        if (mxf_ul_is_equal (&demux->
+                content_storage.essence_container_data_uids[j],
+                &data->instance_uid)) {
           demux->content_storage.essence_container_data[j] = data;
           break;
         }
@@ -1500,7 +1500,8 @@
           &g_array_index (demux->structural_component,
           MXFMetadataStructuralComponent, i);
-      if (component->type != MXF_METADATA_SOURCE_CLIP)
+      if (component->type != MXF_METADATA_SOURCE_CLIP
+          && component->type != MXF_METADATA_DM_SOURCE_CLIP)
         continue;
       for (j = 0; j < demux->source_package->len; j++) {
@@ -1508,10 +1509,16 @@
             &g_array_index (demux->source_package, MXFMetadataGenericPackage,
             j);
-        if (mxf_umid_is_equal (&component->source_clip.source_package_id,
+        if (component->type == MXF_METADATA_SOURCE_CLIP &&
+            mxf_umid_is_equal (&component->source_clip.source_package_id,
                 &package->package_uid)) {
           component->source_clip.source_package = package;
+        } else if (component->type == MXF_METADATA_DM_SOURCE_CLIP &&
+            mxf_umid_is_equal (&component->dm_source_clip.source_package_id,
+                &package->package_uid)) {
+          component->dm_source_clip.source_package = package;
+          break;
       }
     }
@@ -1986,7 +1993,7 @@
       "Handling metadata of size %u at offset %"
-      G_GUINT64_FORMAT " of type 0x%04d", GST_BUFFER_SIZE (buffer),
+      G_GUINT64_FORMAT " of type 0x%04x", GST_BUFFER_SIZE (buffer),
       demux->offset, type);
   if (G_UNLIKELY (!demux->partition.valid)) {
@@ -2027,13 +2034,17 @@
       ret = gst_mxf_demux_handle_metadata_source_package (demux, key, buffer);
       break;
     case MXF_METADATA_TRACK:
-      ret = gst_mxf_demux_handle_metadata_track (demux, key, buffer);
+    case MXF_METADATA_EVENT_TRACK:
+    case MXF_METADATA_STATIC_TRACK:
+      ret = gst_mxf_demux_handle_metadata_track (demux, key, type, buffer);
     case MXF_METADATA_SEQUENCE:
       ret = gst_mxf_demux_handle_metadata_sequence (demux, key, buffer);
     case MXF_METADATA_TIMECODE_COMPONENT:
     case MXF_METADATA_SOURCE_CLIP:
+    case MXF_METADATA_DM_SEGMENT:
+    case MXF_METADATA_DM_SOURCE_CLIP:
       ret =
           gst_mxf_demux_handle_metadata_structural_component (demux,
           key, type, buffer);
Index: mxfparse.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -d -r1.20 -r1.21
--- mxfparse.c	8 Dec 2008 15:46:13 -0000	1.20
+++ mxfparse.c	11 Dec 2008 14:35:07 -0000	1.21
@@ -1694,7 +1694,7 @@
 gboolean
 mxf_metadata_track_parse (const MXFUL * key,
     MXFMetadataTrack * track, const MXFPrimerPack * primer,
-    const guint8 * data, guint size)
+    guint16 type, const guint8 * data, guint size)
   guint16 tag, tag_size;
   const guint8 *tag_data;
@@ -1704,7 +1704,15 @@
   memset (track, 0, sizeof (MXFMetadataTrack));
-  GST_DEBUG ("Parsing track:");
+  if (type == MXF_METADATA_TRACK)
+    track->variant = MXF_METADATA_TRACK_VARIANT_TIMELINE;
+  else if (type == MXF_METADATA_EVENT_TRACK)
+    track->variant = MXF_METADATA_TRACK_VARIANT_EVENT;
+  else
+    track->variant = MXF_METADATA_TRACK_VARIANT_STATIC;
+  GST_DEBUG ("Parsing track of type 0x%04x:", type);
   while (mxf_local_tag_parse (data, size, &tag, &tag_size, &tag_data)) {
     if (tag_size == 0 || tag == 0x0000)
@@ -1742,12 +1750,14 @@
         GST_DEBUG ("  track name = %s", GST_STR_NULL (track->track_name));
         break;
       case 0x4b01:
+      case 0x4901:
         if (!mxf_fraction_parse (&track->edit_rate, tag_data, tag_size))
           goto error;
         GST_DEBUG ("  edit rate = %d/%d", track->edit_rate.n,
             track->edit_rate.d);
       case 0x4b02:
+      case 0x4902:
         if (tag_size != 8)
         track->origin = GST_READ_UINT64_BE (tag_data);
@@ -1960,10 +1970,14 @@
   GST_DEBUG ("Parsing structural component:");
   component->type = type;
-  GST_DEBUG ("  type = %s",
-      (component->type ==
-          MXF_METADATA_TIMECODE_COMPONENT) ? "timecode component" :
-      "source clip");
+  if (type == MXF_METADATA_TIMECODE_COMPONENT)
+    GST_DEBUG ("  type = timecode component");
+  else if (type == MXF_METADATA_SOURCE_CLIP)
+    GST_DEBUG ("  type = source clip");
+  else if (type == MXF_METADATA_DM_SEGMENT)
+    GST_DEBUG ("  type = DM segment");
+    GST_DEBUG ("  type = DM source clip");
@@ -2030,33 +2044,164 @@
         /* Source clip specifics */
       case 0x1201:
-        if (type != MXF_METADATA_SOURCE_CLIP)
+        if (type != MXF_METADATA_SOURCE_CLIP
+            && type != MXF_METADATA_DM_SOURCE_CLIP)
           goto DFLT;
-        component->source_clip.start_position = GST_READ_UINT64_BE (tag_data);
-        GST_DEBUG ("  start position = %" G_GINT64_FORMAT,
-            component->source_clip.start_position);
+        if (type == MXF_METADATA_SOURCE_CLIP) {
+          component->source_clip.start_position = GST_READ_UINT64_BE (tag_data);
+          GST_DEBUG ("  start position = %" G_GINT64_FORMAT,
+              component->source_clip.start_position);
+        } else {
+          component->dm_source_clip.start_position =
+              GST_READ_UINT64_BE (tag_data);
+              component->dm_source_clip.start_position);
+        }
       case 0x1101:
         if (tag_size != 32)
-        memcpy (&component->source_clip.source_package_id, tag_data, 32);
-        GST_DEBUG ("  source package id = %s",
-            mxf_umid_to_string (&component->source_clip.source_package_id,
-                str));
+          memcpy (&component->source_clip.source_package_id, tag_data, 32);
+          GST_DEBUG ("  source package id = %s",
+              mxf_umid_to_string (&component->source_clip.source_package_id,
+                  str));
+          memcpy (&component->dm_source_clip.source_package_id, tag_data, 32);
+              mxf_umid_to_string (&component->dm_source_clip.source_package_id,
       case 0x1102:
         if (tag_size != 4)
-        component->source_clip.source_track_id = GST_READ_UINT32_BE (tag_data);
-        GST_DEBUG ("  source track id = %u",
-            component->source_clip.source_track_id);
+          component->source_clip.source_track_id =
+              GST_READ_UINT32_BE (tag_data);
+          GST_DEBUG ("  source track id = %u",
+              component->source_clip.source_track_id);
+          component->dm_source_clip.source_track_id =
+              component->dm_source_clip.source_track_id);
+        break;
+        /* DM Segment specifics */
+      case 0x0601:
+        if (type != MXF_METADATA_DM_SEGMENT)
+          goto DFLT;
+        if (tag_size != 8)
+          goto error;
+        component->dm_segment.event_start_position =
+            GST_READ_UINT64_BE (tag_data);
+        GST_DEBUG ("  event start position = %" G_GINT64_FORMAT,
+            component->dm_segment.event_start_position);
+      case 0x0602:
+        component->dm_segment.event_comment =
+            mxf_utf16_to_utf8 (tag_data, tag_size);
+        GST_DEBUG ("  event comment = %s",
+            GST_STR_NULL (component->dm_segment.event_comment));
+      case 0x6102:
+      {
+        guint32 len;
+        guint i;
+        if (tag_size < 8)
+        len = GST_READ_UINT32_BE (tag_data);
+        GST_DEBUG ("  number of track ids = %u", len);
+        if (len == 0)
+          goto next;
+        if (GST_READ_UINT32_BE (tag_data + 4) != 4)
+        if (len * 4 + 8 < tag_size)
+        component->dm_segment.n_track_ids = len;
+        component->dm_segment.track_ids = g_new0 (guint32, len);
+        tag_data += 8;
+        tag_size -= 8;
+        for (i = 0; i < len; i++) {
+          component->dm_segment.track_ids[i] = GST_READ_UINT32_BE (tag_data);
+          GST_DEBUG ("    track id %u = %u", i,
+              component->dm_segment.track_ids[i]);
+          tag_data += 4;
+          tag_size -= 4;
+      }
+      case 0x6101:
+        if (tag_size != 16)
+        memcpy (&component->dm_segment.dm_framework, tag_data, 16);
+        GST_DEBUG ("  DM framework = %s",
+            mxf_ul_to_string (&component->dm_segment.dm_framework, str));
+        /* DM Source Clip specifics */
+      case 0x6103:
+        if (type != MXF_METADATA_DM_SOURCE_CLIP)
+        if (tag_size < 8 + 4 * len)
+        component->dm_source_clip.n_track_ids = len;
+        component->dm_source_clip.track_ids = g_new0 (guint32, len);
+          component->dm_source_clip.track_ids[i] =
+              component->dm_source_clip.track_ids[i]);
       DFLT:
       default:
         if (!gst_metadata_add_custom_tag (primer, tag, tag_data, tag_size,
@@ -2084,6 +2229,13 @@
   g_return_if_fail (component != NULL);
+  if (component->type == MXF_METADATA_DM_SEGMENT) {
+    g_free (component->dm_segment.event_comment);
+    g_free (component->dm_segment.track_ids);
+  } else if (component->type == MXF_METADATA_DM_SOURCE_CLIP) {
+    g_free (component->dm_source_clip.track_ids);
+  }
   if (component->other_tags)
     g_hash_table_destroy (component->other_tags);
Index: mxfparse.h
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- mxfparse.h	5 Dec 2008 12:26:02 -0000	1.11
+++ mxfparse.h	11 Dec 2008 14:35:07 -0000	1.12
@@ -106,7 +106,7 @@
 gboolean mxf_metadata_generic_package_parse (const MXFUL *key, MXFMetadataGenericPackage *generic_package, const MXFPrimerPack *primer, const guint8 *data, guint size);
 void mxf_metadata_generic_package_reset (MXFMetadataGenericPackage *generic_package);
-gboolean mxf_metadata_track_parse (const MXFUL *key, MXFMetadataTrack *track, const MXFPrimerPack *primer, const guint8 *data, guint size);
+gboolean mxf_metadata_track_parse (const MXFUL *key, MXFMetadataTrack *track, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size);
 void mxf_metadata_track_reset (MXFMetadataTrack *track);
 MXFMetadataTrackType mxf_metadata_track_identifier_parse (const MXFUL *track_identifier);
Index: mxftypes.h
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxftypes.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- mxftypes.h	8 Dec 2008 15:28:58 -0000	1.7
+++ mxftypes.h	11 Dec 2008 14:35:08 -0000	1.8
@@ -327,6 +327,12 @@
   MXF_METADATA_TRACK_PARSED_TEXT           = 0x41
 } MXFMetadataTrackType;
+typedef enum {
+  MXF_METADATA_TRACK_VARIANT_TIMELINE,
+  MXF_METADATA_TRACK_VARIANT_EVENT,
+  MXF_METADATA_TRACK_VARIANT_STATIC
+} MXFMetadataTrackVariant;
 struct _MXFMetadataTrack {
   MXFUL instance_uid;
   MXFUL generation_uid;
@@ -335,6 +341,7 @@
   guint32 track_number;
   MXFMetadataTrackType type;
+  MXFMetadataTrackVariant variant;
   gchar *track_name;
@@ -390,6 +397,27 @@
       guint32 source_track_id;
     } source_clip;
+    struct {
+      gint64 event_start_position;
+      gchar *event_comment;
+      guint32 n_track_ids;
+      guint32 *track_ids;
+      
+      MXFUL dm_framework;
+    } dm_segment;
+      gint64 start_position;
+      MXFUMID source_package_id;
+      MXFMetadataGenericPackage *source_package;
+      guint32 source_track_id;
+    } dm_source_clip;
   };
   GHashTable *other_tags;

------------------------------------------------------------------------------
SF.Net email is Sponsored by MIX09, March 18-20, 2009 in Las Vegas, Nevada.
The future of the web can't happen without you.  Join us at MIX09 to help
pave the way to the Next Web now. Learn more and register at
http://ad.doubleclick.net/clk;208669438;13503038;i?http://2009.visitmix.com/

_______________________________________________
gstreamer-cvs-verbose mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gstreamer-cvs-verbose