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

[email protected] Tue, 16 Dec 2008 04:30:48 -0800 (PST)
Newsgroups gmane.comp.video.gstreamer.cvs
Message-ID <[email protected]>
CVS Root:       /cvs/gstreamer
Module:         gst-plugins-bad
Changes by:     slomo
Date:           Tue Dec 16 2008  12:30:48 UTC

Log message:
* gst/mxf/mxfaes-bwf.c: (mxf_is_aes_bwf_essence_track),
(mxf_bwf_handle_essence_element),
(mxf_aes3_handle_essence_element), (mxf_bwf_create_caps),
(mxf_aes3_create_caps), (mxf_aes_bwf_create_caps),
(mxf_aes_bwf_init):
* gst/mxf/mxfaes-bwf.h:
* gst/mxf/mxfalaw.c: (mxf_is_alaw_essence_track),
(mxf_alaw_handle_essence_element), (mxf_alaw_create_caps),
(mxf_alaw_init):
* gst/mxf/mxfalaw.h:
* gst/mxf/mxfd10.c: (mxf_is_d10_essence_track),
(mxf_d10_picture_handle_essence_element),
(mxf_d10_sound_handle_essence_element), (mxf_d10_create_caps),
(mxf_d10_init):
* gst/mxf/mxfd10.h:
* gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata),
(gst_mxf_demux_handle_header_metadata_update_streams),
(gst_mxf_demux_handle_generic_container_essence_element):
* gst/mxf/mxfdv-dif.c: (mxf_is_dv_dif_essence_track),
(mxf_dv_dif_handle_essence_element), (mxf_dv_dif_create_caps),
(mxf_dv_dif_init):
* gst/mxf/mxfdv-dif.h:
* gst/mxf/mxfjpeg2000.c: (mxf_is_jpeg2000_essence_track),
(mxf_jpeg2000_handle_essence_element), (mxf_jpeg2000_create_caps),
(mxf_jpeg2000_init):
* gst/mxf/mxfjpeg2000.h:
* gst/mxf/mxfmpeg.c: (mxf_is_mpeg_essence_track),
(mxf_mpeg_video_handle_essence_element),
(mxf_mpeg_audio_handle_essence_element), (mxf_mpeg_es_create_caps),
(mxf_mpeg_create_caps), (mxf_mpeg_init):
* gst/mxf/mxfmpeg.h:
* gst/mxf/mxfparse.c: (mxf_essence_element_handler_register),
(mxf_essence_element_handler_find):
* gst/mxf/mxfparse.h:
* gst/mxf/mxfup.c: (mxf_is_up_essence_track),
(mxf_up_handle_essence_element), (mxf_up_rgba_create_caps),
(mxf_up_create_caps), (mxf_up_init):
* gst/mxf/mxfup.h:
Implement an essence element handling registry and use this instead
of an hardcoded, large if-then-else block.

Modified files:
    .               : ChangeLog
    gst/mxf         : mxfaes-bwf.c mxfaes-bwf.h mxfalaw.c mxfalaw.h
                      mxfd10.c mxfd10.h mxfdemux.c mxfdv-dif.c
                      mxfdv-dif.h mxfjpeg2000.c mxfjpeg2000.h
                      mxfmpeg.c mxfmpeg.h mxfparse.c mxfparse.h
                      mxfup.c mxfup.h

Links:
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3816&r2=1.3817
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c.diff?r1=1.11&r2=1.12
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.h.diff?r1=1.5&r2=1.6
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfalaw.c.diff?r1=1.5&r2=1.6
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfalaw.h.diff?r1=1.3&r2=1.4
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfd10.c.diff?r1=1.4&r2=1.5
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfd10.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.39&r2=1.40
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdv-dif.c.diff?r1=1.4&r2=1.5
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdv-dif.h.diff?r1=1.2&r2=1.3
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfjpeg2000.c.diff?r1=1.8&r2=1.9
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfjpeg2000.h.diff?r1=1.3&r2=1.4
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c.diff?r1=1.12&r2=1.13
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.h.diff?r1=1.5&r2=1.6
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.22&r2=1.23
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h.diff?r1=1.13&r2=1.14
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfup.c.diff?r1=1.5&r2=1.6
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfup.h.diff?r1=1.2&r2=1.3

====Begin Diffs====
Index: ChangeLog
===================================================================
RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v
retrieving revision 1.3816
retrieving revision 1.3817
diff -u -d -r1.3816 -r1.3817
--- ChangeLog	16 Dec 2008 10:50:35 -0000	1.3816
+++ ChangeLog	16 Dec 2008 12:30:30 -0000	1.3817
@@ -1,3 +1,46 @@
+2008-12-16  Sebastian Dröge  <[email protected]>
+
+	* gst/mxf/mxfaes-bwf.c: (mxf_is_aes_bwf_essence_track),
+	(mxf_bwf_handle_essence_element),
+	(mxf_aes3_handle_essence_element), (mxf_bwf_create_caps),
+	(mxf_aes3_create_caps), (mxf_aes_bwf_create_caps),
+	(mxf_aes_bwf_init):
+	* gst/mxf/mxfaes-bwf.h:
+	* gst/mxf/mxfalaw.c: (mxf_is_alaw_essence_track),
+	(mxf_alaw_handle_essence_element), (mxf_alaw_create_caps),
+	(mxf_alaw_init):
+	* gst/mxf/mxfalaw.h:
+	* gst/mxf/mxfd10.c: (mxf_is_d10_essence_track),
+	(mxf_d10_picture_handle_essence_element),
+	(mxf_d10_sound_handle_essence_element), (mxf_d10_create_caps),
+	(mxf_d10_init):
+	* gst/mxf/mxfd10.h:
+	* gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata),
+	(gst_mxf_demux_handle_header_metadata_update_streams),
+	(gst_mxf_demux_handle_generic_container_essence_element):
+	* gst/mxf/mxfdv-dif.c: (mxf_is_dv_dif_essence_track),
+	(mxf_dv_dif_handle_essence_element), (mxf_dv_dif_create_caps),
+	(mxf_dv_dif_init):
+	* gst/mxf/mxfdv-dif.h:
+	* gst/mxf/mxfjpeg2000.c: (mxf_is_jpeg2000_essence_track),
+	(mxf_jpeg2000_handle_essence_element), (mxf_jpeg2000_create_caps),
+	(mxf_jpeg2000_init):
+	* gst/mxf/mxfjpeg2000.h:
+	* gst/mxf/mxfmpeg.c: (mxf_is_mpeg_essence_track),
+	(mxf_mpeg_video_handle_essence_element),
+	(mxf_mpeg_audio_handle_essence_element), (mxf_mpeg_es_create_caps),
+	(mxf_mpeg_create_caps), (mxf_mpeg_init):
+	* gst/mxf/mxfmpeg.h:
+	* gst/mxf/mxfparse.c: (mxf_essence_element_handler_register),
+	(mxf_essence_element_handler_find):
+	* gst/mxf/mxfparse.h:
+	* gst/mxf/mxfup.c: (mxf_is_up_essence_track),
+	(mxf_up_handle_essence_element), (mxf_up_rgba_create_caps),
+	(mxf_up_create_caps), (mxf_up_init):
+	* gst/mxf/mxfup.h:
+	Implement an essence element handling registry and use this instead
+	of an hardcoded, large if-then-else block.
 2008-12-16  Edward Hervey  <[email protected]>
 
 	* tests/check/Makefile.am:
Index: mxfaes-bwf.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- mxfaes-bwf.c	15 Dec 2008 18:12:26 -0000	1.11
+++ mxfaes-bwf.c	16 Dec 2008 12:30:32 -0000	1.12
@@ -41,6 +41,78 @@
 #define GST_CAT_DEFAULT mxf_debug
 /* SMPTE 382M Annex 1 */
+#define MXF_TYPE_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR \
+  (mxf_metadata_wave_audio_essence_descriptor_get_type())
+#define MXF_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),MXF_TYPE_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR, MXFMetadataWaveAudioEssenceDescriptor))
+#define MXF_IS_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),MXF_TYPE_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR))
+typedef struct _MXFMetadataWaveAudioEssenceDescriptor
+    MXFMetadataWaveAudioEssenceDescriptor;
+typedef MXFMetadataBaseClass MXFMetadataWaveAudioEssenceDescriptorClass;
+GType mxf_metadata_wave_audio_essence_descriptor_get_type (void);
+struct _MXFMetadataWaveAudioEssenceDescriptor
+{
+  MXFMetadataGenericSoundEssenceDescriptor parent;
+  guint16 block_align;
+  guint8 sequence_offset;
+  guint32 avg_bps;
+  MXFUL channel_assignment;
+  guint32 peak_envelope_version;
+  guint32 peak_envelope_format;
+  guint32 points_per_peak_value;
+  guint32 peak_envelope_block_size;
+  guint32 peak_channels;
+  guint32 peak_frames;
+  gint64 peak_of_peaks_position;
+  MXFTimestamp peak_envelope_timestamp;
+  guint8 *peak_envelope_data;
+  guint16 peak_envelope_data_length;
+};
+/* SMPTE 382M Annex 2 */
+#define MXF_TYPE_METADATA_AES3_AUDIO_ESSENCE_DESCRIPTOR \
+  (mxf_metadata_aes3_audio_essence_descriptor_get_type())
+#define MXF_METADATA_AES3_AUDIO_ESSENCE_DESCRIPTOR(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),MXF_TYPE_METADATA_AES3_AUDIO_ESSENCE_DESCRIPTOR, MXFMetadataAES3AudioEssenceDescriptor))
+#define MXF_IS_METADATA_AES3_AUDIO_ESSENCE_DESCRIPTOR(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),MXF_TYPE_METADATA_AES3_AUDIO_ESSENCE_DESCRIPTOR))
+typedef struct _MXFMetadataAES3AudioEssenceDescriptor
+    MXFMetadataAES3AudioEssenceDescriptor;
+typedef MXFMetadataBaseClass MXFMetadataAES3AudioEssenceDescriptorClass;
+GType mxf_metadata_aes3_audio_essence_descriptor_get_type (void);
+struct _MXFMetadataAES3AudioEssenceDescriptor
+  MXFMetadataWaveAudioEssenceDescriptor parent;
+  guint8 emphasis;
+  guint16 block_start_offset;
+  guint8 auxiliary_bits_mode;
+  guint32 n_channel_status_mode;
+  guint8 *channel_status_mode;
+  guint32 n_fixed_channel_status_data;
+  guint8 **fixed_channel_status_data;
+  guint32 n_user_data_mode;
+  guint8 *user_data_mode;
+  guint32 n_fixed_user_data;
+  guint8 **fixed_user_data;
+  guint32 linked_timecode_track_id;
+  guint8 stream_number;
+/* SMPTE 382M Annex 1 */
 G_DEFINE_TYPE (MXFMetadataWaveAudioEssenceDescriptor,
     mxf_metadata_wave_audio_essence_descriptor,
     MXF_TYPE_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR);
@@ -463,20 +535,20 @@
       mxf_metadata_aes3_audio_essence_descriptor_handle_tag;
 }
-gboolean
-mxf_is_aes_bwf_essence_track (const MXFMetadataTrack * track)
+static gboolean
+mxf_is_aes_bwf_essence_track (const MXFMetadataTimelineTrack * track)
 {
   guint i;
   g_return_val_if_fail (track != NULL, FALSE);
-  if (track->descriptor == NULL) {
+  if (track->parent.descriptor == NULL) {
     GST_ERROR ("No descriptor for this track");
     return FALSE;
   }
-  for (i = 0; i < track->n_descriptor; i++) {
-    MXFMetadataFileDescriptor *d = track->descriptor[i];
+  for (i = 0; i < track->parent.n_descriptor; i++) {
+    MXFMetadataFileDescriptor *d = track->parent.descriptor[i];
     MXFUL *key;
     if (!d)
@@ -500,9 +572,10 @@
 static GstFlowReturn
 mxf_bwf_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
-    GstCaps * caps, MXFMetadataGenericPackage * package,
-    MXFMetadataTrack * track, MXFMetadataStructuralComponent * component,
-    gpointer mapping_data, GstBuffer ** outbuf)
+    GstCaps * caps,
+    MXFMetadataTimelineTrack * track,
+    MXFMetadataStructuralComponent * component, gpointer mapping_data,
+    GstBuffer ** outbuf)
   *outbuf = buffer;
@@ -519,9 +592,9 @@
 mxf_aes3_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
+    GstCaps * caps, MXFMetadataTimelineTrack * track,
@@ -555,10 +628,9 @@
 };
 static GstCaps *
-mxf_bwf_create_caps (MXFMetadataGenericPackage * package,
-    MXFMetadataTrack * track,
+mxf_bwf_create_caps (MXFMetadataTimelineTrack * track,
     MXFMetadataGenericSoundEssenceDescriptor * descriptor, GstTagList ** tags,
-    MXFEssenceElementHandler * handler, gpointer * mapping_data)
+    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
   GstCaps *ret = NULL;
   MXFMetadataWaveAudioEssenceDescriptor *wa_descriptor = NULL;
@@ -653,6 +725,8 @@
         mxf_ul_to_string (&descriptor->sound_essence_compression, str));
+  *handler = mxf_bwf_handle_essence_element;
   if (!*tags)
     *tags = gst_tag_list_new ();
@@ -666,16 +740,13 @@
     gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_BITRATE,
         wa_descriptor->avg_bps * 8, NULL);
-  *handler = mxf_bwf_handle_essence_element;
-
   return ret;
-mxf_aes3_create_caps (MXFMetadataGenericPackage * package,
+mxf_aes3_create_caps (MXFMetadataTimelineTrack * track,
@@ -726,42 +797,43 @@
-GstCaps *
-mxf_aes_bwf_create_caps (MXFMetadataGenericPackage * package,
-    MXFMetadataTrack * track, GstTagList ** tags,
+static GstCaps *
+mxf_aes_bwf_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
   MXFMetadataGenericSoundEssenceDescriptor *s = NULL;
   gboolean bwf = FALSE;
-  g_return_val_if_fail (package != NULL, NULL);
   g_return_val_if_fail (track != NULL, NULL);
     GST_ERROR ("No descriptor found for this track");
     return NULL;
-    if (!track->descriptor[i])
+    if (!track->parent.descriptor[i])
       continue;
-    if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->descriptor[i])
-        && (track->descriptor[i]->essence_container.u[14] == 0x01
-            || track->descriptor[i]->essence_container.u[14] == 0x02
-            || track->descriptor[i]->essence_container.u[14] == 0x08)) {
-      s = (MXFMetadataGenericSoundEssenceDescriptor *) track->descriptor[i];
+    if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->parent.
+            descriptor[i])
+        && (track->parent.descriptor[i]->essence_container.u[14] == 0x01
+            || track->parent.descriptor[i]->essence_container.u[14] == 0x02
+            || track->parent.descriptor[i]->essence_container.u[14] == 0x08)) {
+      s = (MXFMetadataGenericSoundEssenceDescriptor *) track->parent.
+          descriptor[i];
       bwf = TRUE;
       break;
     } else
-        if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->descriptor
-            [i])
-        && (track->descriptor[i]->essence_container.u[14] == 0x03
-            || track->descriptor[i]->essence_container.u[14] == 0x04
-            || track->descriptor[i]->essence_container.u[14] == 0x09)) {
+        if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->parent.
+        && (track->parent.descriptor[i]->essence_container.u[14] == 0x03
+            || track->parent.descriptor[i]->essence_container.u[14] == 0x04
+            || track->parent.descriptor[i]->essence_container.u[14] == 0x09)) {
       bwf = FALSE;
     }
@@ -771,15 +843,19 @@
   } else if (bwf) {
-    return mxf_bwf_create_caps (package, track, s, tags, handler, mapping_data);
+    return mxf_bwf_create_caps (track, s, tags, handler, mapping_data);
   } else {
-    return mxf_aes3_create_caps (package, track, s, tags, handler,
-        mapping_data);
+    return mxf_aes3_create_caps (track, s, tags, handler, mapping_data);
   return NULL;
+static const MXFEssenceElementHandler mxf_aes_bwf_essence_handler = {
+  mxf_is_aes_bwf_essence_track,
+  mxf_aes_bwf_create_caps
 void
 mxf_aes_bwf_init (void)
@@ -787,4 +863,6 @@
       MXF_TYPE_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR);
   mxf_metadata_register (0x0147,
       MXF_TYPE_METADATA_AES3_AUDIO_ESSENCE_DESCRIPTOR);
+  mxf_essence_element_handler_register (&mxf_aes_bwf_essence_handler);
Index: mxfaes-bwf.h
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- mxfaes-bwf.h	15 Dec 2008 17:26:58 -0000	1.5
+++ mxfaes-bwf.h	16 Dec 2008 12:30:32 -0000	1.6
@@ -29,79 +29,6 @@
 #include "mxfparse.h"
 #include "mxfmetadata.h"
-/* SMPTE 382M Annex 1 */
-#define MXF_TYPE_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR \
-  (mxf_metadata_wave_audio_essence_descriptor_get_type())
-#define MXF_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),MXF_TYPE_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR, MXFMetadataWaveAudioEssenceDescriptor))
-#define MXF_IS_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),MXF_TYPE_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR))
-typedef struct _MXFMetadataWaveAudioEssenceDescriptor MXFMetadataWaveAudioEssenceDescriptor;
-typedef MXFMetadataBaseClass MXFMetadataWaveAudioEssenceDescriptorClass;
-GType mxf_metadata_wave_audio_essence_descriptor_get_type (void);
-struct _MXFMetadataWaveAudioEssenceDescriptor {
-  MXFMetadataGenericSoundEssenceDescriptor parent;
-  guint16 block_align;
-  guint8 sequence_offset;
-  guint32 avg_bps;
-  MXFUL channel_assignment;
-  guint32 peak_envelope_version;
-  guint32 peak_envelope_format;
-  guint32 points_per_peak_value;
-  guint32 peak_envelope_block_size;
-  guint32 peak_channels;
-  guint32 peak_frames;
-  gint64 peak_of_peaks_position;
-  MXFTimestamp peak_envelope_timestamp;
-  guint8 *peak_envelope_data;
-  guint16 peak_envelope_data_length;
-};
-/* SMPTE 382M Annex 2 */
-#define MXF_TYPE_METADATA_AES3_AUDIO_ESSENCE_DESCRIPTOR \
-  (mxf_metadata_aes3_audio_essence_descriptor_get_type())
-#define MXF_METADATA_AES3_AUDIO_ESSENCE_DESCRIPTOR(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),MXF_TYPE_METADATA_AES3_AUDIO_ESSENCE_DESCRIPTOR, MXFMetadataAES3AudioEssenceDescriptor))
-#define MXF_IS_METADATA_AES3_AUDIO_ESSENCE_DESCRIPTOR(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),MXF_TYPE_METADATA_AES3_AUDIO_ESSENCE_DESCRIPTOR))
-typedef struct _MXFMetadataAES3AudioEssenceDescriptor MXFMetadataAES3AudioEssenceDescriptor;
-typedef MXFMetadataBaseClass MXFMetadataAES3AudioEssenceDescriptorClass;
-GType mxf_metadata_aes3_audio_essence_descriptor_get_type (void);
-struct _MXFMetadataAES3AudioEssenceDescriptor {
-  MXFMetadataWaveAudioEssenceDescriptor parent;
-  guint8 emphasis;
-  guint16 block_start_offset;
-  guint8 auxiliary_bits_mode;
-  guint32 n_channel_status_mode;
-  guint8 *channel_status_mode;
-  guint32 n_fixed_channel_status_data;
-  guint8 **fixed_channel_status_data;
-  guint32 n_user_data_mode;
-  guint8 *user_data_mode;
-  guint32 n_fixed_user_data;
-  guint8 **fixed_user_data;
-  guint32 linked_timecode_track_id;
-  guint8 stream_number;
-gboolean mxf_is_aes_bwf_essence_track (const MXFMetadataTrack *track);
-mxf_aes_bwf_create_caps (MXFMetadataGenericPackage *package, MXFMetadataTrack *track, GstTagList **tags, MXFEssenceElementHandler *handler, gpointer *mapping_data);
 void mxf_aes_bwf_init (void);
 #endif /* __MXF_AES_BWF_H__ */
Index: mxfalaw.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfalaw.c,v
--- mxfalaw.c	15 Dec 2008 17:26:58 -0000	1.5
+++ mxfalaw.c	16 Dec 2008 12:30:32 -0000	1.6
@@ -33,18 +33,18 @@
 GST_DEBUG_CATEGORY_EXTERN (mxf_debug);
-mxf_is_alaw_essence_track (const MXFMetadataTrack * track)
+mxf_is_alaw_essence_track (const MXFMetadataTimelineTrack * track)
-  if (track->descriptor == NULL)
+  if (track->parent.descriptor == NULL)
@@ -63,9 +63,10 @@
 mxf_alaw_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
@@ -80,29 +81,29 @@
-mxf_alaw_create_caps (MXFMetadataGenericPackage * package,
+mxf_alaw_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
   GstCaps *caps = NULL;
-    if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->descriptor[i])) {
+            descriptor[i])) {
@@ -135,7 +136,13 @@
   return caps;
+static const MXFEssenceElementHandler mxf_alaw_essence_element_handler = {
+  mxf_is_alaw_essence_track,
+  mxf_alaw_create_caps
 mxf_alaw_init (void)
+  mxf_essence_element_handler_register (&mxf_alaw_essence_element_handler);
Index: mxfalaw.h
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfalaw.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- mxfalaw.h	15 Dec 2008 17:26:58 -0000	1.3
+++ mxfalaw.h	16 Dec 2008 12:30:32 -0000	1.4
@@ -28,11 +28,6 @@
-gboolean mxf_is_alaw_essence_track (const MXFMetadataTrack *track);
-mxf_alaw_create_caps (MXFMetadataGenericPackage *package, MXFMetadataTrack *track, GstTagList **tags, MXFEssenceElementHandler *handler, gpointer *mapping_data);
 void mxf_alaw_init (void);
 #endif /* __MXF_ALAW_H__ */
Index: mxfd10.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfd10.c,v
diff -u -d -r1.4 -r1.5
--- mxfd10.c	15 Dec 2008 17:26:58 -0000	1.4
+++ mxfd10.c	16 Dec 2008 12:30:33 -0000	1.5
@@ -40,18 +40,18 @@
   guint width, channels;
 } MXFD10AudioMappingData;
-mxf_is_d10_essence_track (const MXFMetadataTrack * track)
+mxf_is_d10_essence_track (const MXFMetadataTimelineTrack * track)
@@ -71,9 +71,10 @@
 mxf_d10_picture_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
@@ -88,9 +89,10 @@
 mxf_d10_sound_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
   guint i, j, nsamples;
   const guint8 *indata;
@@ -153,35 +155,35 @@
   return GST_FLOW_OK;
-mxf_d10_create_caps (MXFMetadataGenericPackage * package,
+mxf_d10_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
   MXFMetadataGenericPictureEssenceDescriptor *p = NULL;
     if (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (track->
-            descriptor[i])) {
-      p = (MXFMetadataGenericPictureEssenceDescriptor *) track->descriptor[i];
+            parent.descriptor[i])) {
+      p = (MXFMetadataGenericPictureEssenceDescriptor *) track->parent.
     } else if (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (track->
@@ -243,7 +245,13 @@
+static const MXFEssenceElementHandler mxf_d10_essence_element_handler = {
+  mxf_is_d10_essence_track,
+  mxf_d10_create_caps
 mxf_d10_init (void)
+  mxf_essence_element_handler_register (&mxf_d10_essence_element_handler);
Index: mxfd10.h
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfd10.h,v
retrieving revision 1.2
diff -u -d -r1.2 -r1.3
--- mxfd10.h	15 Dec 2008 17:26:58 -0000	1.2
+++ mxfd10.h	16 Dec 2008 12:30:33 -0000	1.3
-gboolean mxf_is_d10_essence_track (const MXFMetadataTrack *track);
-mxf_d10_create_caps (MXFMetadataGenericPackage *package, MXFMetadataTrack *track, GstTagList **tags, MXFEssenceElementHandler *handler, gpointer *mapping_data);
 void mxf_d10_init (void);
 #endif /* __MXF_D10_H__ */
Index: mxfdemux.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -d -r1.39 -r1.40
--- mxfdemux.c	16 Dec 2008 08:35:05 -0000	1.39
+++ mxfdemux.c	16 Dec 2008 12:30:33 -0000	1.40
@@ -43,8 +43,6 @@
  *     timestamp calculation, etc.
  *   - Handle timecode tracks correctly (where is this documented?)
  *   - Handle Generic container system items
- *   - Use an "essence element/track handling" registry instead of the large if-then-else
- *     block when detecting the codec
  *   - Force synchronization of tracks. Packets that have the timestamp are not required
  *     to be stored at the same position in the essence stream, especially if tracks
  *     with different source packages (body sid) are used.
@@ -69,13 +67,6 @@
 #include "mxfdemux.h"
-#include "mxfaes-bwf.h"
-#include "mxfmpeg.h"
-#include "mxfdv-dif.h"
-#include "mxfalaw.h"
-#include "mxfjpeg2000.h"
-#include "mxfd10.h"
-#include "mxfup.h"
 #include <string.h>
@@ -109,8 +100,9 @@
   GstFlowReturn last_flow;
   guint64 essence_element_count;
-  MXFEssenceElementHandler handle_essence_element;
   gpointer mapping_data;
+  const MXFEssenceElementHandler *handler;
+  MXFEssenceElementHandleFunc handle_func;
   GstTagList *tags;
@@ -235,6 +227,9 @@
     for (i = 0; i < demux->src->len; i++) {
       GstMXFDemuxPad *pad = g_ptr_array_index (demux->src, i);
+      pad->handler = NULL;
+      pad->handle_func = NULL;
       pad->material_track = NULL;
       pad->material_package = NULL;
       pad->component = NULL;
@@ -559,11 +554,11 @@
   for (i = 0; i < demux->preface->content_storage->n_packages; i++) {
     if (demux->preface->content_storage->packages[i] &&
-        MXF_IS_METADATA_MATERIAL_PACKAGE (demux->preface->content_storage->
-            packages[i])) {
+        MXF_IS_METADATA_MATERIAL_PACKAGE (demux->preface->
+            content_storage->packages[i])) {
       ret =
-          MXF_METADATA_GENERIC_PACKAGE (demux->preface->content_storage->
-          packages[i]);
+          MXF_METADATA_GENERIC_PACKAGE (demux->preface->
+          content_storage->packages[i]);
@@ -736,90 +731,23 @@
     pad->source_package = source_package;
     pad->source_track = source_track;
-    pad->handle_essence_element = NULL;
+    pad->handler = NULL;
     g_free (pad->mapping_data);
+    pad->handle_func = NULL;
     pad->mapping_data = NULL;
-    switch (track->parent.type) {
-      case MXF_METADATA_TRACK_PICTURE_ESSENCE:
-        if (mxf_is_mpeg_essence_track ((MXFMetadataTrack *) source_track))
-          caps =
-              mxf_mpeg_create_caps (MXF_METADATA_GENERIC_PACKAGE
-              (source_package), (MXFMetadataTrack *) source_track, &pad->tags,
-              &pad->handle_essence_element, &pad->mapping_data);
-        else if (mxf_is_dv_dif_essence_track ((MXFMetadataTrack *)
-                source_track))
-              mxf_dv_dif_create_caps (MXF_METADATA_GENERIC_PACKAGE
-        else if (mxf_is_jpeg2000_essence_track ((MXFMetadataTrack *)
-              mxf_jpeg2000_create_caps (MXF_METADATA_GENERIC_PACKAGE
-        else if (mxf_is_d10_essence_track ((MXFMetadataTrack *) source_track))
-              mxf_d10_create_caps (MXF_METADATA_GENERIC_PACKAGE
-        else if (mxf_is_up_essence_track ((MXFMetadataTrack *) source_track))
-              mxf_up_create_caps (MXF_METADATA_GENERIC_PACKAGE (source_package),
-              (MXFMetadataTrack *) source_track, &pad->tags,
-        break;
-      case MXF_METADATA_TRACK_SOUND_ESSENCE:
-        if (mxf_is_aes_bwf_essence_track ((MXFMetadataTrack *) source_track))
-              mxf_aes_bwf_create_caps (MXF_METADATA_GENERIC_PACKAGE
-        else if (mxf_is_alaw_essence_track ((MXFMetadataTrack *) source_track))
-              mxf_alaw_create_caps (MXF_METADATA_GENERIC_PACKAGE
-        else if (mxf_is_mpeg_essence_track ((MXFMetadataTrack *) source_track))
-      case MXF_METADATA_TRACK_DATA_ESSENCE:
-        if (mxf_is_dv_dif_essence_track ((MXFMetadataTrack *) source_track))
-      default:
-        g_assert_not_reached ();
+    pad->handler = mxf_essence_element_handler_find (source_track);
+    if (!pad->handler) {
+      GST_WARNING_OBJECT (demux, "No essence element handler for track found");
+      gst_object_unref (pad);
+      continue;
+    caps =
+        pad->handler->create_caps (source_track, &pad->tags, &pad->handle_func,
+        &pad->mapping_data);
     if (!caps) {
       GST_WARNING_OBJECT (demux, "No caps created, ignoring stream");
       gst_object_unref (pad);
@@ -1081,13 +1009,11 @@
   GST_BUFFER_OFFSET_END (inbuf) = GST_BUFFER_OFFSET_NONE;
   gst_buffer_set_caps (inbuf, pad->caps);
-  if (pad->handle_essence_element) {
+  if (pad->handle_func) {
     /* Takes ownership of inbuf */
     ret =
-        pad->handle_essence_element (key, inbuf, pad->caps,
-        (MXFMetadataGenericPackage *) pad->source_package,
-        (MXFMetadataTrack *) pad->source_track, pad->component,
-        pad->mapping_data, &outbuf);
+        pad->handle_func (key, inbuf, pad->caps,
+        pad->source_track, pad->component, pad->mapping_data, &outbuf);
     inbuf = NULL;
     outbuf = inbuf;
Index: mxfdv-dif.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdv-dif.c,v
--- mxfdv-dif.c	15 Dec 2008 17:26:58 -0000	1.4
+++ mxfdv-dif.c	16 Dec 2008 12:30:33 -0000	1.5
@@ -39,18 +39,18 @@
-mxf_is_dv_dif_essence_track (const MXFMetadataTrack * track)
+mxf_is_dv_dif_essence_track (const MXFMetadataTimelineTrack * track)
@@ -68,9 +68,10 @@
 mxf_dv_dif_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
@@ -84,30 +85,28 @@
-mxf_dv_dif_create_caps (MXFMetadataGenericPackage * package,
+mxf_dv_dif_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
   MXFMetadataFileDescriptor *f = NULL;
-    if (MXF_IS_METADATA_FILE_DESCRIPTOR (track->descriptor[i]) &&
-        !MXF_IS_METADATA_MULTIPLE_DESCRIPTOR (track->descriptor[i])) {
-      f = track->descriptor[i];
+    if (MXF_IS_METADATA_FILE_DESCRIPTOR (track->parent.descriptor[i]) &&
+        !MXF_IS_METADATA_MULTIPLE_DESCRIPTOR (track->parent.descriptor[i])) {
+      f = track->parent.descriptor[i];
@@ -138,8 +137,13 @@
+static const MXFEssenceElementHandler mxf_dv_dif_essence_element_handler = {
+  mxf_is_dv_dif_essence_track,
+  mxf_dv_dif_create_caps
 mxf_dv_dif_init (void)
+  mxf_essence_element_handler_register (&mxf_dv_dif_essence_element_handler);
Index: mxfdv-dif.h
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdv-dif.h,v
--- mxfdv-dif.h	15 Dec 2008 17:26:58 -0000	1.2
+++ mxfdv-dif.h	16 Dec 2008 12:30:33 -0000	1.3
-gboolean mxf_is_dv_dif_essence_track (const MXFMetadataTrack *track);
-mxf_dv_dif_create_caps (MXFMetadataGenericPackage *package, MXFMetadataTrack *track, GstTagList **tags, MXFEssenceElementHandler *handler, gpointer *mapping_data);
 void mxf_dv_dif_init (void);
 #endif /* __MXF_DV_DIF_H__ */
Index: mxfjpeg2000.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfjpeg2000.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- mxfjpeg2000.c	15 Dec 2008 17:26:58 -0000	1.8
+++ mxfjpeg2000.c	16 Dec 2008 12:30:33 -0000	1.9
@@ -38,18 +38,18 @@
-mxf_is_jpeg2000_essence_track (const MXFMetadataTrack * track)
+mxf_is_jpeg2000_essence_track (const MXFMetadataTimelineTrack * track)
 mxf_jpeg2000_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
@@ -84,10 +85,9 @@
-mxf_jpeg2000_create_caps (MXFMetadataGenericPackage * package,
+mxf_jpeg2000_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
@@ -95,26 +95,26 @@
   guint32 fourcc;
-    } else if (MXF_IS_METADATA_FILE_DESCRIPTOR (track->descriptor[i]) &&
+    } else if (MXF_IS_METADATA_FILE_DESCRIPTOR (track->parent.descriptor[i]) &&
@@ -198,7 +198,13 @@
+static const MXFEssenceElementHandler mxf_jpeg2000_essence_element_handler = {
+  mxf_is_jpeg2000_essence_track,
+  mxf_jpeg2000_create_caps
 mxf_jpeg2000_init (void)
+  mxf_essence_element_handler_register (&mxf_jpeg2000_essence_element_handler);
Index: mxfjpeg2000.h
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfjpeg2000.h,v
--- mxfjpeg2000.h	15 Dec 2008 17:26:59 -0000	1.3
+++ mxfjpeg2000.h	16 Dec 2008 12:30:33 -0000	1.4
-gboolean mxf_is_jpeg2000_essence_track (const MXFMetadataTrack *track);
-mxf_jpeg2000_create_caps (MXFMetadataGenericPackage *package, MXFMetadataTrack *track, GstTagList **tags, MXFEssenceElementHandler *handler, gpointer *mapping_data);
 void mxf_jpeg2000_init (void);
 #endif /* __MXF_JPEG2000_H__ */
Index: mxfmpeg.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c,v
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- mxfmpeg.c	15 Dec 2008 17:26:59 -0000	1.12
+++ mxfmpeg.c	16 Dec 2008 12:30:33 -0000	1.13
@@ -91,6 +91,35 @@
   0x0a, 0x00, 0x00
+/* SMPTE 381M 8.1 */
+#define MXF_TYPE_METADATA_MPEG_VIDEO_DESCRIPTOR \
+  (mxf_metadata_mpeg_video_descriptor_get_type())
+#define MXF_METADATA_MPEG_VIDEO_DESCRIPTOR(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),MXF_TYPE_METADATA_MPEG_VIDEO_DESCRIPTOR, MXFMetadataMPEGVideoDescriptor))
+#define MXF_IS_METADATA_MPEG_VIDEO_DESCRIPTOR(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),MXF_TYPE_METADATA_MPEG_VIDEO_DESCRIPTOR))
+typedef struct _MXFMetadataMPEGVideoDescriptor MXFMetadataMPEGVideoDescriptor;
+typedef MXFMetadataBaseClass MXFMetadataMPEGVideoDescriptorClass;
+GType mxf_metadata_mpeg_video_descriptor_get_type (void);
+struct _MXFMetadataMPEGVideoDescriptor
+  MXFMetadataCDCIPictureEssenceDescriptor parent;
+  gboolean single_sequence;
+  gboolean const_b_frames;
+  guint8 coded_content_type;
+  gboolean low_delay;
+  gboolean closed_gop;
+  gboolean identical_gop;
+  guint16 max_gop;
+  guint16 b_picture_count;
+  guint32 bitrate;
+  guint8 profile_and_level;
 G_DEFINE_TYPE (MXFMetadataMPEGVideoDescriptor,
     mxf_metadata_mpeg_video_descriptor,
     MXF_TYPE_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR);
@@ -195,18 +224,18 @@
       mxf_metadata_mpeg_video_descriptor_handle_tag;
-mxf_is_mpeg_essence_track (const MXFMetadataTrack * track)
+mxf_is_mpeg_essence_track (const MXFMetadataTimelineTrack * track)
@@ -226,9 +255,9 @@
 mxf_mpeg_video_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
@@ -244,9 +273,9 @@
 mxf_mpeg_audio_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
@@ -300,9 +329,8 @@
-mxf_mpeg_es_create_caps (MXFMetadataGenericPackage * package,
-    MXFEssenceElementHandler * handler, gpointer * mapping_data,
+mxf_mpeg_es_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
+    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data,
     MXFMetadataGenericPictureEssenceDescriptor * p,
     MXFMetadataGenericSoundEssenceDescriptor * s)
@@ -430,10 +458,9 @@
-mxf_mpeg_create_caps (MXFMetadataGenericPackage * package,
+mxf_mpeg_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
@@ -441,27 +468,28 @@
@@ -475,9 +503,7 @@
   if (f->essence_container.u[13] == 0x04) {
     GST_DEBUG ("Found MPEG ES stream");
-    caps =
-        mxf_mpeg_es_create_caps (package, track, tags, handler, mapping_data, p,
-        s);
+    caps = mxf_mpeg_es_create_caps (track, tags, handler, mapping_data, p, s);
   } else if (f->essence_container.u[13] == 0x07) {
     GST_ERROR ("MPEG PES streams not supported yet");
@@ -507,8 +533,14 @@
+static const MXFEssenceElementHandler mxf_mpeg_essence_element_handler = {
+  mxf_is_mpeg_essence_track,
+  mxf_mpeg_create_caps
 mxf_mpeg_init (void)
   mxf_metadata_register (0x0151, MXF_TYPE_METADATA_MPEG_VIDEO_DESCRIPTOR);
+  mxf_essence_element_handler_register (&mxf_mpeg_essence_element_handler);
Index: mxfmpeg.h
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.h,v
--- mxfmpeg.h	15 Dec 2008 17:26:59 -0000	1.5
+++ mxfmpeg.h	16 Dec 2008 12:30:33 -0000	1.6
@@ -29,39 +29,6 @@
-/* SMPTE 381M 8.1 */
-#define MXF_TYPE_METADATA_MPEG_VIDEO_DESCRIPTOR \
-  (mxf_metadata_mpeg_video_descriptor_get_type())
-#define MXF_METADATA_MPEG_VIDEO_DESCRIPTOR(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),MXF_TYPE_METADATA_MPEG_VIDEO_DESCRIPTOR, MXFMetadataMPEGVideoDescriptor))
-#define MXF_IS_METADATA_MPEG_VIDEO_DESCRIPTOR(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),MXF_TYPE_METADATA_MPEG_VIDEO_DESCRIPTOR))
-typedef struct _MXFMetadataMPEGVideoDescriptor MXFMetadataMPEGVideoDescriptor;
-typedef MXFMetadataBaseClass MXFMetadataMPEGVideoDescriptorClass;
-GType mxf_metadata_mpeg_video_descriptor_get_type (void);
-struct _MXFMetadataMPEGVideoDescriptor {
-  MXFMetadataCDCIPictureEssenceDescriptor parent;
-  gboolean single_sequence;
-  gboolean const_b_frames;
-  guint8 coded_content_type;
-  gboolean low_delay;
-  gboolean closed_gop;
-  gboolean identical_gop;
-  guint16 max_gop;
-  guint16 b_picture_count;
-  guint32 bitrate;
-  guint8 profile_and_level;
-gboolean mxf_is_mpeg_essence_track (const MXFMetadataTrack *track);
-mxf_mpeg_create_caps (MXFMetadataGenericPackage *package, MXFMetadataTrack *track, GstTagList **tags, MXFEssenceElementHandler *handler, gpointer *mapping_data);
 void mxf_mpeg_init (void);
 #endif /* __MXF_MPEG_H__ */
Index: mxfparse.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- mxfparse.c	15 Dec 2008 17:26:59 -0000	1.22
+++ mxfparse.c	16 Dec 2008 12:30:33 -0000	1.23
@@ -1015,3 +1015,30 @@
   return TRUE;
+static GSList *_mxf_essence_element_handler_registry = NULL;
+void
+mxf_essence_element_handler_register (const MXFEssenceElementHandler * handler)
+  _mxf_essence_element_handler_registry =
+      g_slist_prepend (_mxf_essence_element_handler_registry,
+      (gpointer) handler);
+}
+const MXFEssenceElementHandler *
+mxf_essence_element_handler_find (const MXFMetadataTimelineTrack * track)
+  GSList *l;
+  const MXFEssenceElementHandler *ret = NULL;
+  for (l = _mxf_essence_element_handler_registry; l; l = l->next) {
+    MXFEssenceElementHandler *current = l->data;
+    if (current->handles_track (track)) {
+      ret = current;
+    }
+  }
+  return ret;
Index: mxfparse.h
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h,v
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- mxfparse.h	15 Dec 2008 17:26:59 -0000	1.13
+++ mxfparse.h	16 Dec 2008 12:30:34 -0000	1.14
@@ -27,7 +27,12 @@
 #include "mxftypes.h"
-typedef GstFlowReturn (*MXFEssenceElementHandler) (const MXFUL *key, GstBuffer *buffer, GstCaps *caps, MXFMetadataGenericPackage *package, MXFMetadataTrack *track, MXFMetadataStructuralComponent *component, gpointer mapping_data, GstBuffer **outbuf);
+typedef GstFlowReturn (*MXFEssenceElementHandleFunc) (const MXFUL *key, GstBuffer *buffer, GstCaps *caps, MXFMetadataTimelineTrack *track, MXFMetadataStructuralComponent *component, gpointer mapping_data, GstBuffer **outbuf);
+typedef struct {
+  gboolean (*handles_track) (const MXFMetadataTimelineTrack *track);
+  GstCaps * (*create_caps) (MXFMetadataTimelineTrack *track, GstTagList **tags, MXFEssenceElementHandleFunc *handler, gpointer *mapping_data);
+} MXFEssenceElementHandler;
 gchar * mxf_ul_to_string (const MXFUL *ul, gchar str[48]);
 gboolean mxf_ul_is_equal (const MXFUL *a, const MXFUL *b);
@@ -90,5 +95,8 @@
   guint16 tag, const guint8 *tag_data, guint16 tag_size,
   GHashTable **hash_table);
+void mxf_essence_element_handler_register (const MXFEssenceElementHandler *handler);
+const MXFEssenceElementHandler * mxf_essence_element_handler_find (const MXFMetadataTimelineTrack *track);
 #endif /* __MXF_PARSE_H__ */
Index: mxfup.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfup.c,v
--- mxfup.c	15 Dec 2008 17:27:00 -0000	1.5
+++ mxfup.c	16 Dec 2008 12:30:34 -0000	1.6
@@ -49,18 +49,18 @@
   guint32 image_end_offset;
 } MXFUPMappingData;
-mxf_is_up_essence_track (const MXFMetadataTrack * track)
+mxf_is_up_essence_track (const MXFMetadataTimelineTrack * track)
@@ -78,9 +78,10 @@
 mxf_up_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
   MXFUPMappingData *data = mapping_data;
@@ -111,10 +112,9 @@
-mxf_up_rgba_create_caps (MXFMetadataGenericPackage * package,
-    MXFMetadataTrack * track, MXFMetadataRGBAPictureEssenceDescriptor * d,
-    GstTagList ** tags,
+mxf_up_rgba_create_caps (MXFMetadataTimelineTrack * track,
+    MXFMetadataRGBAPictureEssenceDescriptor * d, GstTagList ** tags,
@@ -201,10 +201,9 @@
-mxf_up_create_caps (MXFMetadataGenericPackage * package,
+mxf_up_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
   MXFMetadataCDCIPictureEssenceDescriptor *c = NULL;
@@ -212,26 +211,30 @@
-    if (MXF_IS_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (track->descriptor[i])) {
-      r = (MXFMetadataRGBAPictureEssenceDescriptor *) track->descriptor[i];
+    if (MXF_IS_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (track->parent.
+      r = (MXFMetadataRGBAPictureEssenceDescriptor *) track->parent.
     } else if (MXF_IS_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR (track->
-      c = (MXFMetadataCDCIPictureEssenceDescriptor *) track->descriptor[i];
+      c = (MXFMetadataCDCIPictureEssenceDescriptor *) track->parent.
@@ -243,9 +246,7 @@
   *handler = mxf_up_handle_essence_element;
   if (r) {
-        mxf_up_rgba_create_caps (package, track, r, tags, handler,
+    caps = mxf_up_rgba_create_caps (track, r, tags, handler, mapping_data);
     GST_ERROR ("CDCI uncompressed picture essence not supported yet");
@@ -258,7 +259,13 @@
+static const MXFEssenceElementHandler mxf_up_essence_element_handler = {
+  mxf_is_up_essence_track,
+  mxf_up_create_caps
 mxf_up_init (void)
+  mxf_essence_element_handler_register (&mxf_up_essence_element_handler);
Index: mxfup.h
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfup.h,v
--- mxfup.h	15 Dec 2008 17:27:00 -0000	1.2
+++ mxfup.h	16 Dec 2008 12:30:34 -0000	1.3
-gboolean mxf_is_up_essence_track (const MXFMetadataTrack *track);
-mxf_up_create_caps (MXFMetadataGenericPackage *package, MXFMetadataTrack *track, GstTagList **tags, MXFEssenceElementHandler *handler, gpointer *mapping_data);
 void mxf_up_init (void);
 #endif /* __MXF_UP_H__ */

------------------------------------------------------------------------------
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