gst/typefind/gsttypefindfunctions.c: Add typefinder for MXF.
authorSebastian Dröge <slomo@circular-chaos.org>
Sun, 5 Oct 2008 08:10:09 +0000 (08:10 +0000)
committerSebastian Dröge <slomo@circular-chaos.org>
Sun, 5 Oct 2008 08:10:09 +0000 (08:10 +0000)
Original commit message from CVS:
* gst/typefind/gsttypefindfunctions.c: (mxf_type_find),
(plugin_init):
Add typefinder for MXF.

ChangeLog
gst/typefind/gsttypefindfunctions.c

index b3950cc9a54636dfa04c762b553a9ac7ff917d67..bce410c8d17ac0202887685f4bc383df756265c4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-10-05  Sebastian Dröge  <sebastian.droege@collabora.co.uk>
+
+       * gst/typefind/gsttypefindfunctions.c: (mxf_type_find),
+       (plugin_init):
+       Add typefinder for MXF.
+
 2008-10-03  Jan Schmidt  <jan.schmidt@sun.com>
 
        * tests/icles/Makefile.am:
index b6875d34824f4d0ddfc22d55f2995d1d0fe050df..e10547ce2983bf50d71d05cd1417ccf76877c52e 100644 (file)
@@ -2329,6 +2329,39 @@ matroska_type_find (GstTypeFind * tf, gpointer ununsed)
     }
 }
 
+/*** application/mxf ***/
+static GstStaticCaps mxf_caps = GST_STATIC_CAPS ("application/mxf");
+
+#define MXF_MAX_PROBE_LENGTH (1024 * 64)
+#define MXF_CAPS (gst_static_caps_get(&mxf_caps))
+
+/*
+ * Quoting http://www.digitalpreservation.gov/formats/fdd/fdd000013.shtml:
+ * "MXF files start with an optional run-in followed by the SMPTE header partition pack key.
+ *  The run-in is less than 64k bytes and the condition for finding the start of the file is
+ *  to identify the first 11 bytes of the partition pack key . . . scan the initial 64 k bytes
+ *  for these 11 bytes" to identify an MXF file. (From SMPTE EG 41, p. 45) The 11 bytes listed
+ *  are from SMPTE 377M, p.20.
+ */
+static void
+mxf_type_find (GstTypeFind * tf, gpointer ununsed)
+{
+  static const guint8 header_partition_pack_key[] =
+      { 0x06, 0x0e, 0x2b, 0x34, 0x02, 0x05, 0x01, 0x01, 0x0d, 0x01, 0x02 };
+  DataScanCtx c = { 0, NULL, 0 };
+
+  while (c.offset <= MXF_MAX_PROBE_LENGTH) {
+    if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, 11)))
+      break;
+
+    if (memcmp (c.data, header_partition_pack_key, 11) == 0) {
+      gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MXF_CAPS);
+      return;
+    }
+    data_scan_ctx_advance (tf, &c, 1);
+  }
+}
+
 /*** video/x-dv ***/
 
 static GstStaticCaps dv_caps = GST_STATIC_CAPS ("video/x-dv, "
@@ -3016,6 +3049,7 @@ plugin_init (GstPlugin * plugin)
   static gchar *mid_exts[] = { "mid", "midi", NULL };
   static gchar *imelody_exts[] = { "imy", "ime", "imelody", NULL };
   static gchar *pdf_exts[] = { "pdf", NULL };
+  static gchar *mxf_exts[] = { "mxf", NULL };
 
   GST_DEBUG_CATEGORY_INIT (type_find_debug, "typefindfunctions",
       GST_DEBUG_FG_GREEN | GST_DEBUG_BG_RED, "generic type find functions");
@@ -3148,6 +3182,8 @@ plugin_init (GstPlugin * plugin)
       tiff_exts, TIFF_CAPS, NULL, NULL);
   TYPE_FIND_REGISTER (plugin, "video/x-matroska", GST_RANK_PRIMARY,
       matroska_type_find, matroska_exts, MATROSKA_CAPS, NULL, NULL);
+  TYPE_FIND_REGISTER (plugin, "application/mxf", GST_RANK_PRIMARY,
+      mxf_type_find, mxf_exts, MXF_CAPS, NULL, NULL);
   TYPE_FIND_REGISTER_START_WITH (plugin, "video/x-mve", GST_RANK_SECONDARY,
       mve_exts, "Interplay MVE File\032\000\032\000\000\001\063\021", 26,
       GST_TYPE_FIND_MAXIMUM);