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

[email protected]
Newsgroups gmane.comp.video.gstreamer.cvs
Message-ID <[email protected]>
CVS Root:       /cvs/gstreamer
Module:         gst-plugins-bad
Changes by:     slomo
Date:           Tue Nov 25 2008  09:38:41 UTC

Log message:
* gst/mxf/mxfaes-bwf.c:
(mxf_metadata_wave_audio_essence_descriptor_handle_tag):
* gst/mxf/mxfaes-bwf.h:
* gst/mxf/mxfdemux.c:
(gst_mxf_demux_handle_metadata_generic_descriptor),
(gst_mxf_demux_handle_metadata_file_descriptor),
(gst_mxf_demux_handle_metadata_multiple_descriptor),
(gst_mxf_demux_handle_metadata_generic_picture_essence_descriptor),
(gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor),
(gst_mxf_demux_handle_metadata_mpeg_video_descriptor),
(gst_mxf_demux_handle_metadata_generic_sound_essence_descriptor),
(gst_mxf_demux_handle_metadata_wave_audio_essence_descriptor),
(gst_mxf_demux_handle_header_metadata_resolve_references),
(gst_mxf_demux_handle_metadata):
* gst/mxf/mxfmpeg.c:
(mxf_metadata_mpeg_video_descriptor_handle_tag):
* gst/mxf/mxfmpeg.h:
* gst/mxf/mxfparse.c: (mxf_partition_pack_parse),
(mxf_primer_pack_parse), (mxf_metadata_preface_parse),
(mxf_metadata_identification_parse),
(mxf_metadata_content_storage_parse),
(mxf_metadata_essence_container_data_parse),
(mxf_metadata_generic_package_parse), (mxf_metadata_track_parse),
(mxf_metadata_sequence_parse),
(mxf_metadata_structural_component_parse),
(mxf_metadata_descriptor_parse),
(mxf_metadata_generic_descriptor_handle_tag),
(mxf_metadata_generic_descriptor_reset),
(mxf_metadata_file_descriptor_handle_tag),
(mxf_metadata_generic_sound_essence_descriptor_handle_tag),
(mxf_metadata_generic_picture_essence_descriptor_handle_tag),
(mxf_metadata_cdci_picture_essence_descriptor_handle_tag),
(mxf_metadata_multiple_descriptor_handle_tag),
(mxf_metadata_locator_parse):
* gst/mxf/mxfparse.h:
Rewrite parsing of descriptors to go top-down instead of bottom-up
which makes it possible to have the buffer data non-writable.
Improve debugging a bit.

Modified files:
    .               : ChangeLog
    gst/mxf         : mxfaes-bwf.c mxfaes-bwf.h mxfdemux.c mxfmpeg.c
                      mxfmpeg.h mxfparse.c mxfparse.h

Links:
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3738&r2=1.3739
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c.diff?r1=1.2&r2=1.3
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.h.diff?r1=1.2&r2=1.3
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.6&r2=1.7
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c.diff?r1=1.2&r2=1.3
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.h.diff?r1=1.2&r2=1.3
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.4&r2=1.5
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h.diff?r1=1.2&r2=1.3

====Begin Diffs====
Index: ChangeLog
===================================================================
RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v
retrieving revision 1.3738
retrieving revision 1.3739
diff -u -d -r1.3738 -r1.3739
--- ChangeLog	25 Nov 2008 00:20:20 -0000	1.3738
+++ ChangeLog	25 Nov 2008 09:38:23 -0000	1.3739
@@ -1,3 +1,45 @@
+2008-11-25  Sebastian Dröge  <[email protected]>
+
+	* gst/mxf/mxfaes-bwf.c:
+	(mxf_metadata_wave_audio_essence_descriptor_handle_tag):
+	* gst/mxf/mxfaes-bwf.h:
+	* gst/mxf/mxfdemux.c:
+	(gst_mxf_demux_handle_metadata_generic_descriptor),
+	(gst_mxf_demux_handle_metadata_file_descriptor),
+	(gst_mxf_demux_handle_metadata_multiple_descriptor),
+	(gst_mxf_demux_handle_metadata_generic_picture_essence_descriptor),
+	(gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor),
+	(gst_mxf_demux_handle_metadata_mpeg_video_descriptor),
+	(gst_mxf_demux_handle_metadata_generic_sound_essence_descriptor),
+	(gst_mxf_demux_handle_metadata_wave_audio_essence_descriptor),
+	(gst_mxf_demux_handle_header_metadata_resolve_references),
+	(gst_mxf_demux_handle_metadata):
+	* gst/mxf/mxfmpeg.c:
+	(mxf_metadata_mpeg_video_descriptor_handle_tag):
+	* gst/mxf/mxfmpeg.h:
+	* gst/mxf/mxfparse.c: (mxf_partition_pack_parse),
+	(mxf_primer_pack_parse), (mxf_metadata_preface_parse),
+	(mxf_metadata_identification_parse),
+	(mxf_metadata_content_storage_parse),
+	(mxf_metadata_essence_container_data_parse),
+	(mxf_metadata_generic_package_parse), (mxf_metadata_track_parse),
+	(mxf_metadata_sequence_parse),
+	(mxf_metadata_structural_component_parse),
+	(mxf_metadata_descriptor_parse),
+	(mxf_metadata_generic_descriptor_handle_tag),
+	(mxf_metadata_generic_descriptor_reset),
+	(mxf_metadata_file_descriptor_handle_tag),
+	(mxf_metadata_generic_sound_essence_descriptor_handle_tag),
+	(mxf_metadata_generic_picture_essence_descriptor_handle_tag),
+	(mxf_metadata_cdci_picture_essence_descriptor_handle_tag),
+	(mxf_metadata_multiple_descriptor_handle_tag),
+	(mxf_metadata_locator_parse):
+	* gst/mxf/mxfparse.h:
+	Rewrite parsing of descriptors to go top-down instead of bottom-up
+	which makes it possible to have the buffer data non-writable.
+	Improve debugging a bit.
 2008-11-24  Michael Smith <[email protected]>
 
 	* configure.ac:
Index: mxfaes-bwf.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- mxfaes-bwf.c	22 Nov 2008 14:42:07 -0000	1.2
+++ mxfaes-bwf.c	25 Nov 2008 09:38:26 -0000	1.3
@@ -41,154 +41,134 @@
 /* SMPTE 382M Annex 1 */
 gboolean
-mxf_metadata_wave_audio_essence_descriptor_parse (const MXFUL * key,
-    MXFMetadataWaveAudioEssenceDescriptor * descriptor,
-    const MXFPrimerPack * primer, guint16 type, const guint8 * data, guint size)
+    mxf_metadata_wave_audio_essence_descriptor_handle_tag
+    (MXFMetadataGenericDescriptor * d, const MXFPrimerPack * primer,
+    guint16 tag, const guint8 * tag_data, guint16 tag_size)
 {
-  guint16 tag, tag_size;
-  const guint8 *tag_data;
+  MXFMetadataWaveAudioEssenceDescriptor *descriptor =
+      (MXFMetadataWaveAudioEssenceDescriptor *) d;
+  gboolean ret = FALSE;
   gchar str[48];
-  g_return_val_if_fail (data != NULL, FALSE);
-
-  memset (descriptor, 0, sizeof (MXFMetadataWaveAudioEssenceDescriptor));
-  if (!mxf_metadata_generic_sound_essence_descriptor_parse (key,
-          (MXFMetadataGenericSoundEssenceDescriptor *) descriptor, primer, type,
-          data, size))
-    goto error;
-  while (mxf_local_tag_parse (data, size, &tag, &tag_size, &tag_data)) {
-    if (tag_size == 0 || tag == 0x0000)
-      goto next;
-    switch (tag) {
-      case 0x3d0a:
-        GST_WRITE_UINT16_BE (data, 0x0000);
-        if (tag_size != 2)
-          goto error;
-        descriptor->block_align = GST_READ_UINT16_BE (tag_data);
-        break;
-      case 0x3d0b:
-        if (tag_size != 1)
-        descriptor->sequence_offset = GST_READ_UINT8 (tag_data);
-      case 0x3d09:
-        if (tag_size != 4)
-        descriptor->avg_bps = GST_READ_UINT32_BE (tag_data);
-      case 0x3d32:
-        if (tag_size != 16)
-        memcpy (&descriptor->channel_assignment, tag_data, 16);
-      case 0x3d29:
-        descriptor->peak_envelope_version = GST_READ_UINT32_BE (tag_data);
-      case 0x3d2a:
-        descriptor->peak_envelope_format = GST_READ_UINT32_BE (tag_data);
-      case 0x3d2b:
-        descriptor->points_per_peak_value = GST_READ_UINT32_BE (tag_data);
-      case 0x3d2c:
-        descriptor->peak_envelope_block_size = GST_READ_UINT32_BE (tag_data);
-      case 0x3d2d:
-        descriptor->peak_channels = GST_READ_UINT32_BE (tag_data);
-      case 0x3d2e:
-        descriptor->peak_frames = GST_READ_UINT32_BE (tag_data);
-      case 0x3d2f:
-        if (tag_size != 8)
-        descriptor->peak_of_peaks_position = GST_READ_UINT64_BE (tag_data);
-      case 0x3d30:
-        if (!mxf_timestamp_parse (&descriptor->peak_envelope_timestamp,
-                tag_data, tag_size))
-      case 0x3d31:
-        descriptor->peak_envelope_data = g_memdup (tag_data, tag_size);
-        descriptor->peak_envelope_data_length = tag_size;
-      default:
-        if (type != MXF_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR)
-          goto next;
-        if (!gst_metadata_add_custom_tag (primer, tag, tag_data, tag_size,
-                &((MXFMetadataGenericDescriptor *) descriptor)->other_tags))
-    }
-  next:
-    data += 4 + tag_size;
-    size -= 4 + tag_size;
+  switch (tag) {
+    case 0x3d0a:
+      if (tag_size != 2)
+        goto error;
+      descriptor->block_align = GST_READ_UINT16_BE (tag_data);
+      GST_DEBUG ("  block align = %u", descriptor->block_align);
+      ret = TRUE;
+      break;
+    case 0x3d0b:
+      if (tag_size != 1)
+      descriptor->sequence_offset = GST_READ_UINT8 (tag_data);
+      GST_DEBUG ("  sequence offset = %u", descriptor->sequence_offset);
+    case 0x3d09:
+      if (tag_size != 4)
+      descriptor->avg_bps = GST_READ_UINT32_BE (tag_data);
+      GST_DEBUG ("  average bps = %u", descriptor->avg_bps);
+    case 0x3d32:
+      if (tag_size != 16)
+      memcpy (&descriptor->channel_assignment, tag_data, 16);
+      GST_DEBUG ("  channel assignment = %s",
+          mxf_ul_to_string (&descriptor->channel_assignment, str));
+    case 0x3d29:
+      descriptor->peak_envelope_version = GST_READ_UINT32_BE (tag_data);
+      GST_DEBUG ("  peak envelope version = %u",
+          descriptor->peak_envelope_version);
+    case 0x3d2a:
+      descriptor->peak_envelope_format = GST_READ_UINT32_BE (tag_data);
+      GST_DEBUG ("  peak envelope format = %u",
+          descriptor->peak_envelope_format);
+    case 0x3d2b:
+      descriptor->points_per_peak_value = GST_READ_UINT32_BE (tag_data);
+      GST_DEBUG ("  points per peak value = %u",
+          descriptor->points_per_peak_value);
+    case 0x3d2c:
+      descriptor->peak_envelope_block_size = GST_READ_UINT32_BE (tag_data);
+      GST_DEBUG ("  peak envelope block size = %u",
+          descriptor->peak_envelope_block_size);
+    case 0x3d2d:
+      descriptor->peak_channels = GST_READ_UINT32_BE (tag_data);
+      GST_DEBUG ("  peak channels = %u", descriptor->peak_channels);
+    case 0x3d2e:
+      descriptor->peak_frames = GST_READ_UINT32_BE (tag_data);
+      GST_DEBUG ("  peak frames = %u", descriptor->peak_frames);
+    case 0x3d2f:
+      if (tag_size != 8)
+      descriptor->peak_of_peaks_position = GST_READ_UINT64_BE (tag_data);
+      GST_DEBUG ("  peak of peaks position = %" G_GINT64_FORMAT,
+          descriptor->peak_of_peaks_position);
+    case 0x3d30:
+      if (!mxf_timestamp_parse (&descriptor->peak_envelope_timestamp,
+              tag_data, tag_size))
+      GST_DEBUG ("  peak envelope timestamp = %d/%u/%u %u:%u:%u.%u",
+          descriptor->peak_envelope_timestamp.year,
+          descriptor->peak_envelope_timestamp.month,
+          descriptor->peak_envelope_timestamp.day,
+          descriptor->peak_envelope_timestamp.hour,
+          descriptor->peak_envelope_timestamp.minute,
+          descriptor->peak_envelope_timestamp.second,
+          (descriptor->peak_envelope_timestamp.quarter_msecond * 1000) / 256);
+    case 0x3d31:
+      descriptor->peak_envelope_data = g_memdup (tag_data, tag_size);
+      descriptor->peak_envelope_data_length = tag_size;
+      GST_DEBUG ("  peak evelope data size = %u",
+          descriptor->peak_envelope_data_length);
+    default:
+      ret =
+          mxf_metadata_generic_sound_essence_descriptor_handle_tag (d, primer,
+          tag, tag_data, tag_size);
   }
-  GST_DEBUG ("Parsed wave audio essence descriptor:");
-  GST_DEBUG ("  block align = %u", descriptor->block_align);
-  GST_DEBUG ("  sequence offset = %u", descriptor->sequence_offset);
-  GST_DEBUG ("  average bps = %u", descriptor->avg_bps);
-  GST_DEBUG ("  channel assignment = %s",
-      mxf_ul_to_string (&descriptor->channel_assignment, str));
-  GST_DEBUG ("  peak envelope version = %u", descriptor->peak_envelope_version);
-  GST_DEBUG ("  peak envelope format = %u", descriptor->peak_envelope_format);
-  GST_DEBUG ("  points per peak value = %u", descriptor->points_per_peak_value);
-  GST_DEBUG ("  peak envelope block size = %u",
-      descriptor->peak_envelope_block_size);
-  GST_DEBUG ("  peak channels = %u", descriptor->peak_channels);
-  GST_DEBUG ("  peak frames = %u", descriptor->peak_frames);
-  GST_DEBUG ("  peak of peaks position = %" G_GINT64_FORMAT,
-      descriptor->peak_of_peaks_position);
-  GST_DEBUG ("  peak envelope timestamp = %d/%u/%u %u:%u:%u.%u",
-      descriptor->peak_envelope_timestamp.year,
-      descriptor->peak_envelope_timestamp.month,
-      descriptor->peak_envelope_timestamp.day,
-      descriptor->peak_envelope_timestamp.hour,
-      descriptor->peak_envelope_timestamp.minute,
-      descriptor->peak_envelope_timestamp.second,
-      (descriptor->peak_envelope_timestamp.quarter_msecond * 1000) / 256);
-  GST_DEBUG ("  peak evelope data size = %u",
-      descriptor->peak_envelope_data_length);
-  return TRUE;
+  return ret;
 error:
-  GST_ERROR ("Invalid wave audio essence descriptor");
-  mxf_metadata_wave_audio_essence_descriptor_reset (descriptor);
+  GST_ERROR ("Invalid wave audio essence descriptor tag 0x%04x of size %u", tag,
+      tag_size);
-  return FALSE;
+  return TRUE;
 }
 void mxf_metadata_wave_audio_essence_descriptor_reset
Index: mxfaes-bwf.h
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.h,v
--- mxfaes-bwf.h	22 Nov 2008 14:42:07 -0000	1.2
+++ mxfaes-bwf.h	25 Nov 2008 09:38:26 -0000	1.3
@@ -55,7 +55,8 @@
   guint16 peak_envelope_data_length;
 } MXFMetadataWaveAudioEssenceDescriptor;
-gboolean mxf_metadata_wave_audio_essence_descriptor_parse (const MXFUL *key, MXFMetadataWaveAudioEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size);
+gboolean mxf_metadata_wave_audio_essence_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor,
+    const MXFPrimerPack *primer, guint16 tag, const guint8 *tag_data, guint16 tag_size);
 void mxf_metadata_wave_audio_essence_descriptor_reset (MXFMetadataWaveAudioEssenceDescriptor *descriptor);
 gboolean mxf_is_aes_bwf_essence_track (const MXFMetadataTrack *track);
Index: mxfdemux.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- mxfdemux.c	24 Nov 2008 11:31:27 -0000	1.6
+++ mxfdemux.c	25 Nov 2008 09:38:26 -0000	1.7
@@ -703,21 +703,26 @@
   MXFMetadataGenericDescriptor descriptor;
+  memset (&descriptor, 0, sizeof (descriptor));
   GST_DEBUG_OBJECT (demux,
       "Handling metadata generic descriptor of size %u"
       " at offset %" G_GUINT64_FORMAT " with type 0x%04d",
       GST_BUFFER_SIZE (buffer), demux->offset, type);
-  if (!mxf_metadata_generic_descriptor_parse (key, &descriptor,
-          &demux->primer, type, GST_BUFFER_DATA (buffer),
-          GST_BUFFER_SIZE (buffer))) {
+  if (!mxf_metadata_descriptor_parse (key,
+          (MXFMetadataGenericDescriptor *) & descriptor, &demux->primer,
+          type, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer),
+          (MXFMetadataDescriptorHandleTag)
+          mxf_metadata_generic_descriptor_handle_tag,
+          (MXFMetadataDescriptorReset) mxf_metadata_generic_descriptor_reset)) {
     GST_ERROR_OBJECT (demux, "Parsing metadata generic descriptor failed");
     return GST_FLOW_ERROR;
   if (!demux->generic_descriptor)
     demux->generic_descriptor =
-        g_array_new (FALSE, FALSE, sizeof (MXFMetadataGenericDescriptor));
+        g_array_new (FALSE, TRUE, sizeof (MXFMetadataGenericDescriptor));
   g_array_append_val (demux->generic_descriptor, descriptor);
@@ -730,21 +735,26 @@
   MXFMetadataFileDescriptor descriptor;
       "Handling metadata file descriptor of size %u"
-  if (!mxf_metadata_file_descriptor_parse (key, &descriptor,
+          mxf_metadata_file_descriptor_handle_tag,
+          (MXFMetadataDescriptorReset) mxf_metadata_file_descriptor_reset)) {
     GST_ERROR_OBJECT (demux, "Parsing metadata file descriptor failed");
   if (!demux->file_descriptor)
     demux->file_descriptor =
-        g_array_new (FALSE, FALSE, sizeof (MXFMetadataFileDescriptor));
+        g_array_new (FALSE, TRUE, sizeof (MXFMetadataFileDescriptor));
   g_array_append_val (demux->file_descriptor, descriptor);
@@ -757,21 +767,27 @@
   MXFMetadataMultipleDescriptor descriptor;
       "Handling metadata multiple descriptor of size %u"
-  if (!mxf_metadata_multiple_descriptor_parse (key, &descriptor,
+          mxf_metadata_multiple_descriptor_handle_tag,
+          (MXFMetadataDescriptorReset) mxf_metadata_multiple_descriptor_reset))
+  {
     GST_ERROR_OBJECT (demux, "Parsing metadata multiple descriptor failed");
   if (!demux->multiple_descriptor)
     demux->multiple_descriptor =
-        g_array_new (FALSE, FALSE, sizeof (MXFMetadataMultipleDescriptor));
+        g_array_new (FALSE, TRUE, sizeof (MXFMetadataMultipleDescriptor));
   g_array_append_val (demux->multiple_descriptor, descriptor);
@@ -784,14 +800,20 @@
   MXFMetadataGenericPictureEssenceDescriptor descriptor;
       "Handling metadata generic picture essence descriptor of size %u"
-  if (!mxf_metadata_generic_picture_essence_descriptor_parse (key, &descriptor,
+          mxf_metadata_generic_picture_essence_descriptor_handle_tag,
+          (MXFMetadataDescriptorReset)
+          mxf_metadata_generic_picture_essence_descriptor_reset)) {
     GST_ERROR_OBJECT (demux,
         "Parsing metadata generic picture essence descriptor failed");
@@ -799,7 +821,7 @@
   if (!demux->generic_picture_essence_descriptor)
     demux->generic_picture_essence_descriptor =
-        g_array_new (FALSE, FALSE,
+        g_array_new (FALSE, TRUE,
         sizeof (MXFMetadataGenericPictureEssenceDescriptor));
   g_array_append_val (demux->generic_picture_essence_descriptor, descriptor);
@@ -813,14 +835,20 @@
   MXFMetadataCDCIPictureEssenceDescriptor descriptor;
       "Handling metadata CDCI picture essence descriptor of size %u"
-  if (!mxf_metadata_cdci_picture_essence_descriptor_parse (key, &descriptor,
+          mxf_metadata_cdci_picture_essence_descriptor_handle_tag,
+          mxf_metadata_cdci_picture_essence_descriptor_reset)) {
         "Parsing metadata CDCI picture essence descriptor failed");
@@ -828,7 +856,7 @@
   if (!demux->cdci_picture_essence_descriptor)
     demux->cdci_picture_essence_descriptor =
         sizeof (MXFMetadataCDCIPictureEssenceDescriptor));
   g_array_append_val (demux->cdci_picture_essence_descriptor, descriptor);
@@ -842,21 +870,27 @@
   MXFMetadataMPEGVideoDescriptor descriptor;
       "Handling metadata MPEG video descriptor of size %u"
-  if (!mxf_metadata_mpeg_video_descriptor_parse (key, &descriptor,
+          mxf_metadata_mpeg_video_descriptor_handle_tag,
+          mxf_metadata_mpeg_video_descriptor_reset)) {
     GST_ERROR_OBJECT (demux, "Parsing metadata MPEG video descriptor failed");
   if (!demux->mpeg_video_descriptor)
     demux->mpeg_video_descriptor =
-        g_array_new (FALSE, FALSE, sizeof (MXFMetadataMPEGVideoDescriptor));
+        g_array_new (FALSE, TRUE, sizeof (MXFMetadataMPEGVideoDescriptor));
   g_array_append_val (demux->mpeg_video_descriptor, descriptor);
@@ -869,14 +903,20 @@
   MXFMetadataGenericSoundEssenceDescriptor descriptor;
       "Handling metadata generic sound essence descriptor of size %u"
-  if (!mxf_metadata_generic_sound_essence_descriptor_parse (key, &descriptor,
+          mxf_metadata_generic_sound_essence_descriptor_handle_tag,
+          mxf_metadata_generic_sound_essence_descriptor_reset)) {
         "Parsing metadata generic sound essence descriptor failed");
@@ -884,7 +924,7 @@
   if (!demux->generic_sound_essence_descriptor)
     demux->generic_sound_essence_descriptor =
         sizeof (MXFMetadataGenericSoundEssenceDescriptor));
   g_array_append_val (demux->generic_sound_essence_descriptor, descriptor);
@@ -898,14 +938,20 @@
   MXFMetadataWaveAudioEssenceDescriptor descriptor;
       "Handling metadata wave sound essence descriptor of size %u"
-  if (!mxf_metadata_wave_audio_essence_descriptor_parse (key, &descriptor,
+          mxf_metadata_wave_audio_essence_descriptor_handle_tag,
+          mxf_metadata_wave_audio_essence_descriptor_reset)) {
         "Parsing metadata wave sound essence descriptor failed");
@@ -913,7 +959,7 @@
   if (!demux->wave_audio_essence_descriptor)
     demux->wave_audio_essence_descriptor =
         sizeof (MXFMetadataWaveAudioEssenceDescriptor));
   g_array_append_val (demux->wave_audio_essence_descriptor, descriptor);
@@ -1748,12 +1794,6 @@
     return GST_FLOW_OK;
-  /* Make writable as the parsing of descriptors sets already read local tags to 0x0000 */
-  if (!gst_buffer_is_writable (buffer))
-    buffer = gst_buffer_copy (buffer);
-  else
-    buffer = gst_buffer_ref (buffer);
   switch (type) {
     case MXF_METADATA_PREFACE:
       ret = gst_mxf_demux_handle_metadata_preface (demux, key, buffer);
@@ -1838,8 +1878,6 @@
       break;
-  gst_buffer_unref (buffer);
   return ret;
Index: mxfmpeg.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c,v
--- mxfmpeg.c	22 Nov 2008 14:42:07 -0000	1.2
+++ mxfmpeg.c	25 Nov 2008 09:38:26 -0000	1.3
@@ -89,116 +89,94 @@
 };
-mxf_metadata_mpeg_video_descriptor_parse (const MXFUL * key,
-    MXFMetadataMPEGVideoDescriptor * descriptor,
+mxf_metadata_mpeg_video_descriptor_handle_tag (MXFMetadataGenericDescriptor * d,
+    const MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
+    guint16 tag_size)
-  memset (descriptor, 0, sizeof (MXFMetadataMPEGVideoDescriptor));
-  if (!mxf_metadata_cdci_picture_essence_descriptor_parse (key,
-          (MXFMetadataCDCIPictureEssenceDescriptor *) descriptor, primer, type,
-    MXFUL *tag_ul = NULL;
+  MXFMetadataMPEGVideoDescriptor *descriptor =
+      (MXFMetadataMPEGVideoDescriptor *) d;
+  MXFUL *tag_ul = NULL;
-    if (!(tag_ul =
-            (MXFUL *) g_hash_table_lookup (primer->mappings,
-                GUINT_TO_POINTER (((guint) tag)))))
+  if (!(tag_ul =
+          (MXFUL *) g_hash_table_lookup (primer->mappings,
+              GUINT_TO_POINTER (((guint) tag)))))
+    return FALSE;
-    if (memcmp (tag_ul, &_single_sequence_ul, 16) == 0) {
-      GST_WRITE_UINT16_BE (data, 0x0000);
-      if (tag_size != 1)
-        goto error;
-      descriptor->single_sequence = GST_READ_UINT8 (tag_data);
-    } else if (memcmp (tag_ul, &_constant_b_frames_ul, 16) == 0) {
-      descriptor->const_b_frames = GST_READ_UINT8 (tag_data);
-    } else if (memcmp (tag_ul, &_coded_content_type_ul, 16) == 0) {
-      descriptor->coded_content_type = GST_READ_UINT8 (tag_data);
-    } else if (memcmp (tag_ul, &_low_delay_ul, 16) == 0) {
-      descriptor->low_delay = GST_READ_UINT8 (tag_data);
-    } else if (memcmp (tag_ul, &_closed_gop_ul, 16) == 0) {
-      descriptor->closed_gop = GST_READ_UINT8 (tag_data);
-    } else if (memcmp (tag_ul, &_identical_gop_ul, 16) == 0) {
-      descriptor->identical_gop = GST_READ_UINT8 (tag_data);
-    } else if (memcmp (tag_ul, &_max_gop_ul, 16) == 0) {
-      if (tag_size != 2)
-      descriptor->max_gop = GST_READ_UINT16_BE (tag_data);
-    } else if (memcmp (tag_ul, &_b_picture_count_ul, 16) == 0) {
-      descriptor->b_picture_count = GST_READ_UINT16_BE (tag_data);
-    } else if (memcmp (tag_ul, &_bitrate_ul, 16) == 0) {
-      if (tag_size != 4)
-      descriptor->bitrate = GST_READ_UINT32_BE (tag_data);
-    } else if (memcmp (tag_ul, &_profile_and_level_ul, 16) == 0) {
-      descriptor->profile_and_level = GST_READ_UINT8 (tag_data);
-    } else {
-      if (type != MXF_METADATA_MPEG_VIDEO_DESCRIPTOR)
-        goto next;
-      if (!gst_metadata_add_custom_tag (primer, tag, tag_data, tag_size,
-              &((MXFMetadataGenericDescriptor *) descriptor)->other_tags))
+  if (memcmp (tag_ul, &_single_sequence_ul, 16) == 0) {
+    if (tag_size != 1)
+      goto error;
+    descriptor->single_sequence = GST_READ_UINT8 (tag_data);
+    GST_DEBUG ("  single sequence = %s",
+        (descriptor->single_sequence) ? "yes" : "no");
+    ret = TRUE;
+  } else if (memcmp (tag_ul, &_constant_b_frames_ul, 16) == 0) {
+    descriptor->const_b_frames = GST_READ_UINT8 (tag_data);
+    GST_DEBUG ("  constant b frames = %s",
+  } else if (memcmp (tag_ul, &_coded_content_type_ul, 16) == 0) {
+    descriptor->coded_content_type = GST_READ_UINT8 (tag_data);
+    GST_DEBUG ("  coded content type = %u", descriptor->coded_content_type);
+  } else if (memcmp (tag_ul, &_low_delay_ul, 16) == 0) {
+    descriptor->low_delay = GST_READ_UINT8 (tag_data);
+    GST_DEBUG ("  low delay = %s", (descriptor->low_delay) ? "yes" : "no");
+  } else if (memcmp (tag_ul, &_closed_gop_ul, 16) == 0) {
+    descriptor->closed_gop = GST_READ_UINT8 (tag_data);
+    GST_DEBUG ("  closed gop = %s", (descriptor->closed_gop) ? "yes" : "no");
+  } else if (memcmp (tag_ul, &_identical_gop_ul, 16) == 0) {
+    descriptor->identical_gop = GST_READ_UINT8 (tag_data);
+    GST_DEBUG ("  identical gop = %s",
+        (descriptor->identical_gop) ? "yes" : "no");
+  } else if (memcmp (tag_ul, &_max_gop_ul, 16) == 0) {
+    if (tag_size != 2)
+    descriptor->max_gop = GST_READ_UINT16_BE (tag_data);
+    GST_DEBUG ("  max gop = %u", descriptor->max_gop);
+  } else if (memcmp (tag_ul, &_b_picture_count_ul, 16) == 0) {
+    descriptor->b_picture_count = GST_READ_UINT16_BE (tag_data);
+    GST_DEBUG ("  b picture count = %u", descriptor->b_picture_count);
+  } else if (memcmp (tag_ul, &_bitrate_ul, 16) == 0) {
+    if (tag_size != 4)
+    descriptor->bitrate = GST_READ_UINT32_BE (tag_data);
+    GST_DEBUG ("  bitrate = %u", descriptor->bitrate);
+  } else if (memcmp (tag_ul, &_profile_and_level_ul, 16) == 0) {
+    descriptor->profile_and_level = GST_READ_UINT8 (tag_data);
+    GST_DEBUG ("  profile & level = %u", descriptor->profile_and_level);
+  } else {
+    ret =
+        mxf_metadata_cdci_picture_essence_descriptor_handle_tag (d, primer, tag,
+        tag_data, tag_size);
-  GST_DEBUG ("Parsed mpeg video descriptors:");
-  GST_DEBUG ("  single sequence = %s",
-      (descriptor->single_sequence) ? "yes" : "no");
-  GST_DEBUG ("  constant b frames = %s",
-  GST_DEBUG ("  coded content type = %u", descriptor->coded_content_type);
-  GST_DEBUG ("  low delay = %s", (descriptor->low_delay) ? "yes" : "no");
-  GST_DEBUG ("  closed gop = %s", (descriptor->closed_gop) ? "yes" : "no");
-  GST_DEBUG ("  identical gop = %s",
-      (descriptor->identical_gop) ? "yes" : "no");
-  GST_DEBUG ("  max gop = %u", descriptor->max_gop);
-  GST_DEBUG ("  b picture count = %u", descriptor->b_picture_count);
-  GST_DEBUG ("  bitrate = %u", descriptor->bitrate);
-  GST_DEBUG ("  profile & level = %u", descriptor->profile_and_level);
-  GST_ERROR ("Invalid mpeg video descriptor");
-  mxf_metadata_mpeg_video_descriptor_reset (descriptor);
+  GST_ERROR ("Invalid mpeg video descriptor tag 0x%04x of size %u", tag,
   return FALSE;
Index: mxfmpeg.h
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.h,v
--- mxfmpeg.h	22 Nov 2008 14:42:07 -0000	1.2
+++ mxfmpeg.h	25 Nov 2008 09:38:26 -0000	1.3
@@ -49,7 +49,7 @@
   guint8 profile_and_level;
 } MXFMetadataMPEGVideoDescriptor;
-gboolean mxf_metadata_mpeg_video_descriptor_parse (const MXFUL *key, MXFMetadataMPEGVideoDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size);
+gboolean mxf_metadata_mpeg_video_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor, const MXFPrimerPack *primer, guint16 tag, const guint8 *tag_data, guint16 tag_size);
 void mxf_metadata_mpeg_video_descriptor_reset (MXFMetadataMPEGVideoDescriptor *descriptor);
 gboolean mxf_is_mpeg_video_essence_track (const MXFMetadataTrack *track);
Index: mxfparse.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- mxfparse.c	24 Nov 2008 10:41:13 -0000	1.4
+++ mxfparse.c	25 Nov 2008 09:38:26 -0000	1.5
@@ -406,6 +406,8 @@
   memset (pack, 0, sizeof (MXFPartitionPack));
+  GST_DEBUG ("Parsing partition pack:");
   if (key->u[13] == 0x02)
     pack->type = MXF_PARTITION_PACK_HEADER;
   else if (key->u[13] == 0x03)
@@ -413,9 +415,16 @@
   else if (key->u[13] == 0x04)
     pack->type = MXF_PARTITION_PACK_FOOTER;
[...2492 lines suppressed...]
       DFLT:
       default:
         if (!gst_metadata_add_custom_tag (primer, tag, tag_data, tag_size,
                 &locator->other_tags))
           goto error;
@@ -2660,13 +2509,6 @@
     size -= 4 + tag_size;
-  GST_DEBUG ("Parsed locator:");
-  GST_DEBUG ("  instance uid = %s", mxf_ul_to_string (&locator->instance_uid,
-          str));
-  GST_DEBUG ("  generation uid = %s",
-      mxf_ul_to_string (&locator->generation_uid, str));
-  GST_DEBUG ("  location = %s", GST_STR_NULL (locator->location));
   return TRUE;
Index: mxfparse.h
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h,v
--- mxfparse.h	22 Nov 2008 14:42:08 -0000	1.2
+++ mxfparse.h	25 Nov 2008 09:38:26 -0000	1.3
@@ -24,6 +24,10 @@
 typedef GstFlowReturn (*MXFEssenceElementHandler) (const MXFUL *key, GstBuffer *buffer, GstCaps *caps, MXFMetadataGenericPackage *package, MXFMetadataTrack *track, MXFMetadataStructuralComponent *component, gpointer mapping_data, GstBuffer **outbuf);
+typedef gboolean (*MXFMetadataDescriptorHandleTag) (MXFMetadataGenericDescriptor *descriptor,
+typedef void (*MXFMetadataDescriptorReset) (MXFMetadataGenericDescriptor *descriptor);
 gchar * mxf_ul_to_string (const MXFUL *ul, gchar str[48]);
 gboolean mxf_ul_is_equal (const MXFUL *a, const MXFUL *b);
 gboolean mxf_ul_is_zero (const MXFUL *ul);
@@ -104,22 +108,31 @@
 gboolean mxf_metadata_structural_component_parse (const MXFUL *key, MXFMetadataStructuralComponent *component, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size);
 void mxf_metadata_structural_component_reset (MXFMetadataStructuralComponent *component);
-gboolean mxf_metadata_generic_descriptor_parse (const MXFUL *key, MXFMetadataGenericDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size);
+gboolean
+mxf_metadata_descriptor_parse (const MXFUL * key, MXFMetadataGenericDescriptor * descriptor, const MXFPrimerPack * primer, guint16 type, const guint8 * data, guint size, MXFMetadataDescriptorHandleTag handle_tag, MXFMetadataDescriptorReset reset);
+gboolean mxf_metadata_generic_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor,
 void mxf_metadata_generic_descriptor_reset (MXFMetadataGenericDescriptor *descriptor);
-gboolean mxf_metadata_file_descriptor_parse (const MXFUL *key, MXFMetadataFileDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size);
+gboolean mxf_metadata_file_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor,
 void mxf_metadata_file_descriptor_reset (MXFMetadataFileDescriptor *descriptor);
-gboolean mxf_metadata_generic_sound_essence_descriptor_parse (const MXFUL *key, MXFMetadataGenericSoundEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size);
+gboolean mxf_metadata_generic_sound_essence_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor,
 void mxf_metadata_generic_sound_essence_descriptor_reset (MXFMetadataGenericSoundEssenceDescriptor *descriptor);
-gboolean mxf_metadata_generic_picture_essence_descriptor_parse (const MXFUL *key, MXFMetadataGenericPictureEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size);
+gboolean mxf_metadata_generic_picture_essence_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor,
 void mxf_metadata_generic_picture_essence_descriptor_reset (MXFMetadataGenericPictureEssenceDescriptor *descriptor);
-gboolean mxf_metadata_cdci_picture_essence_descriptor_parse (const MXFUL *key, MXFMetadataCDCIPictureEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size);
+gboolean mxf_metadata_cdci_picture_essence_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor,
 void mxf_metadata_cdci_picture_essence_descriptor_reset (MXFMetadataCDCIPictureEssenceDescriptor *descriptor);
-gboolean mxf_metadata_multiple_descriptor_parse (const MXFUL *key, MXFMetadataMultipleDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size);
+gboolean mxf_metadata_multiple_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor,
 void mxf_metadata_multiple_descriptor_reset (MXFMetadataMultipleDescriptor *descriptor);
 gboolean mxf_metadata_locator_parse (const MXFUL *key, MXFMetadataLocator *locator, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size);

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/

_______________________________________________
gstreamer-cvs-verbose mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gstreamer-cvs-verbose
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.