qtmux: add xmp support
authorThiago Santos <thiago.sousa.santos@collabora.co.uk>
Mon, 22 Feb 2010 19:45:34 +0000 (16:45 -0300)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Tue, 12 Apr 2011 19:32:16 +0000 (20:32 +0100)
Adds xmp metatags adding to qtmux.

Fixes #609539

gst/quicktime/atoms.c
gst/quicktime/atoms.h
gst/quicktime/fourcc.h
gst/quicktime/gstqtmux.c

index d62077e..99b02ef 100644 (file)
@@ -47,7 +47,7 @@
 
 #include <gst/gst.h>
 #include <gst/base/gstbytewriter.h>
-
+#include <gst/tag/tag.h>
 
 /**
  * Creates a new AtomsContext for the given flavor.
@@ -2772,6 +2772,22 @@ atom_moov_add_3gp_uint_tag (AtomMOOV * moov, guint32 fourcc, guint16 value)
   atom_moov_add_3gp_str_int_tag (moov, fourcc, NULL, value);
 }
 
+void
+atom_moov_add_xmp_tags (AtomMOOV * moov, const GstTagList * tags)
+{
+  GstBuffer *xmpbuffer = gst_tag_list_to_xmp_buffer (tags, TRUE);
+  AtomData *data_atom = NULL;
+
+  data_atom = atom_data_new_from_gst_buffer (FOURCC_XMP_, xmpbuffer);
+  gst_buffer_unref (xmpbuffer);
+
+  atom_moov_init_metatags (moov, &moov->context);
+
+  moov->udta->entries = g_list_append (moov->udta->entries,
+      build_atom_info_wrapper ((Atom *) data_atom, atom_data_copy_data,
+          atom_data_free));
+}
+
 /*
  * Functions for specifying media types
  */
index 9fc8030..ae167ba 100644 (file)
@@ -756,6 +756,8 @@ void atom_moov_add_3gp_str_int_tag   (AtomMOOV * moov, guint32 fourcc, const gch
 void atom_moov_add_3gp_tag           (AtomMOOV * moov, guint32 fourcc, guint8 * data,
                                       guint size);
 
+void atom_moov_add_xmp_tags          (AtomMOOV * moov, const GstTagList * tags);
+
 #define GST_QT_MUX_DEFAULT_TAG_LANGUAGE   "eng"
 guint16  language_code               (const char * lang);
 
index f859e0c..559f45f 100644 (file)
@@ -185,6 +185,7 @@ G_BEGIN_DECLS
 #define FOURCC_soaa     GST_MAKE_FOURCC('s','o','a','a')
 #define FOURCC_soco     GST_MAKE_FOURCC('s','o','c','o')
 #define FOURCC_sosn     GST_MAKE_FOURCC('s','o','s','n')
+#define FOURCC_XMP_     GST_MAKE_FOURCC('X','M','P','_')
 
 
 /* SVQ3 fourcc */
index 085ae92..96f97ab 100644 (file)
@@ -878,6 +878,19 @@ static const GstTagToFourcc tag_matches_3gp[] = {
 #define GST_QT_DEMUX_PRIVATE_TAG "private-qt-tag"
 
 static void
+gst_qt_mux_add_xmp_tags (GstQTMux * qtmux, const GstTagList * list)
+{
+  GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux));
+
+  if (qtmux_klass->format != GST_QT_MUX_FORMAT_QT)
+    return;                     /* adobe spec only specs for qt */
+
+  GST_DEBUG_OBJECT (qtmux, "Adding xmp tags");
+
+  atom_moov_add_xmp_tags (qtmux->moov, list);
+}
+
+static void
 gst_qt_mux_add_metadata_tags (GstQTMux * qtmux, const GstTagList * list)
 {
   GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux));
@@ -969,6 +982,7 @@ gst_qt_mux_setup_metadata (GstQTMux * qtmux)
   if (tags && !gst_tag_list_is_empty (tags)) {
     GST_DEBUG_OBJECT (qtmux, "Formatting tags");
     gst_qt_mux_add_metadata_tags (qtmux, tags);
+    gst_qt_mux_add_xmp_tags (qtmux, tags);
   } else {
     GST_DEBUG_OBJECT (qtmux, "No tags received");
   }