Totally remove the internal taglists and fully use tagsetter. Fixes various tag muxin...
authorStefan Kost <ensonic@users.sourceforge.net>
Tue, 16 Dec 2008 16:26:52 +0000 (16:26 +0000)
committerStefan Kost <ensonic@users.sourceforge.net>
Tue, 16 Dec 2008 16:26:52 +0000 (16:26 +0000)
Original commit message from CVS:
* ext/celt/gstceltenc.c:
* ext/celt/gstceltenc.h:
* ext/metadata/gstmetadatamux.c:
* gst/qtmux/gstqtmux.c:
* gst/qtmux/gstqtmux.h:
Totally remove the internal taglists and fully use tagsetter. Fixes
various tag muxing issues.

ChangeLog
ext/celt/gstceltenc.c
ext/celt/gstceltenc.h
ext/metadata/gstmetadatamux.c
gst/qtmux/gstqtmux.c
gst/qtmux/gstqtmux.h

index 812c686..fe71088 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2008-12-16  Stefan Kost  <ensonic@users.sf.net>
+
+       * ext/celt/gstceltenc.c:
+       * ext/celt/gstceltenc.h:
+       * ext/metadata/gstmetadatamux.c:
+       * gst/qtmux/gstqtmux.c:
+       * gst/qtmux/gstqtmux.h:
+         Totally remove the internal taglists and fully use tagsetter. Fixes
+         various tag muxing issues.
+
 2008-12-16  Sebastian Dröge  <sebastian.droege@collabora.co.uk>
 
        * tests/check/elements/mxfdemux.c: (mxfdemux_suite):
index 58b3b29..d76fd88 100644 (file)
@@ -513,30 +513,29 @@ gst_celt_enc_init (GstCeltEnc * enc, GstCeltEncClass * klass)
 static GstBuffer *
 gst_celt_enc_create_metadata_buffer (GstCeltEnc * enc)
 {
-  const GstTagList *user_tags;
-  GstTagList *merged_tags;
+  const GstTagList *tags;
+  GstTagList *empty_tags;
   GstBuffer *comments = NULL;
 
-  user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (enc));
+  tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (enc));
 
-  GST_DEBUG_OBJECT (enc, "upstream tags = %" GST_PTR_FORMAT, enc->tags);
-  GST_DEBUG_OBJECT (enc, "user-set tags = %" GST_PTR_FORMAT, user_tags);
+  GST_DEBUG_OBJECT (enc, "tags = %" GST_PTR_FORMAT, tags);
 
-  /* gst_tag_list_merge() will handle NULL for either or both lists fine */
-  merged_tags = gst_tag_list_merge (user_tags, enc->tags,
-      gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (enc)));
-
-  if (merged_tags == NULL)
-    merged_tags = gst_tag_list_new ();
-
-  GST_DEBUG_OBJECT (enc, "merged   tags = %" GST_PTR_FORMAT, merged_tags);
-  comments = gst_tag_list_to_vorbiscomment_buffer (merged_tags, NULL,
+  if (tags == NULL) {
+    /* FIXME: better fix chain of callers to not write metadata at all,
+     * if there is none */
+    empty_tags = gst_tag_list_new ();
+    tags = empty_tags;
+  }
+  comments = gst_tag_list_to_vorbiscomment_buffer (tags, NULL,
       0, "Encoded with GStreamer Celtenc");
-  gst_tag_list_free (merged_tags);
 
   GST_BUFFER_OFFSET (comments) = enc->bytes_out;
   GST_BUFFER_OFFSET_END (comments) = 0;
 
+  if (empty_tags)
+    gst_tag_list_free (empty_tags);
+
   return comments;
 }
 
@@ -685,12 +684,11 @@ gst_celt_enc_sinkevent (GstPad * pad, GstEvent * event)
     case GST_EVENT_TAG:
     {
       GstTagList *list;
+      GstTagSetter *setter = GST_TAG_SETTER (enc);
+      const GstTagMergeMode mode = gst_tag_setter_get_tag_merge_mode (setter);
 
       gst_event_parse_tag (event, &list);
-      if (enc->tags) {
-        gst_tag_list_insert (enc->tags, list,
-            gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (enc)));
-      }
+      gst_tag_setter_merge_tags (setter, list, mode);
       res = gst_pad_event_default (pad, event);
       break;
     }
@@ -983,7 +981,6 @@ gst_celt_enc_change_state (GstElement * element, GstStateChange transition)
 
   switch (transition) {
     case GST_STATE_CHANGE_NULL_TO_READY:
-      enc->tags = gst_tag_list_new ();
       break;
     case GST_STATE_CHANGE_READY_TO_PAUSED:
       enc->frameno = 0;
@@ -1020,8 +1017,7 @@ gst_celt_enc_change_state (GstElement * element, GstStateChange transition)
       memset (&enc->header, 0, sizeof (enc->header));
       break;
     case GST_STATE_CHANGE_READY_TO_NULL:
-      gst_tag_list_free (enc->tags);
-      enc->tags = NULL;
+      gst_tag_setter_reset_tags (GST_TAG_SETTER (enc));
     default:
       break;
   }
index 6dc7c96..c0c554b 100644 (file)
@@ -73,8 +73,6 @@ struct _GstCeltEnc {
   guint64               samples_in;
   guint64               bytes_out;
 
-  GstTagList            *tags;
-
   guint64               frameno;
   guint64               frameno_out;
 
index d75c686..657774d 100644 (file)
@@ -163,6 +163,10 @@ static void gst_metadata_mux_set_property (GObject * object, guint prop_id,
 static void gst_metadata_mux_get_property (GObject * object, guint prop_id,
     GValue * value, GParamSpec * pspec);
 
+static GstStateChangeReturn gst_metadata_mux_change_state (GstElement * element,
+    GstStateChange transition);
+
+
 /*
  * GstBaseMetadata virtual functions declaration
  */
@@ -274,6 +278,9 @@ gst_metadata_mux_class_init (GstMetadataMuxClass * klass)
   gobject_class->set_property = gst_metadata_mux_set_property;
   gobject_class->get_property = gst_metadata_mux_get_property;
 
+  gstelement_class->change_state =
+      GST_DEBUG_FUNCPTR (gst_metadata_mux_change_state);
+
   gstbasemetadata_class->processing =
       GST_DEBUG_FUNCPTR (gst_metadata_mux_create_chunks_from_tags);
   gstbasemetadata_class->set_caps =
@@ -317,6 +324,39 @@ gst_metadata_mux_get_property (GObject * object, guint prop_id,
   }
 }
 
+static GstStateChangeReturn
+gst_metadata_mux_change_state (GstElement * element, GstStateChange transition)
+{
+  GstStateChangeReturn ret;
+  GstMetadataMux *filter = GST_METADATA_MUX (element);
+
+  switch (transition) {
+    case GST_STATE_CHANGE_NULL_TO_READY:
+      break;
+    case GST_STATE_CHANGE_READY_TO_PAUSED:
+      break;
+    case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+      break;
+    default:
+      break;
+  }
+
+  ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+  switch (transition) {
+    case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+      break;
+    case GST_STATE_CHANGE_PAUSED_TO_READY:
+      gst_tag_setter_reset_tags (GST_TAG_SETTER (filter));
+      break;
+    case GST_STATE_CHANGE_READY_TO_NULL:
+      break;
+    default:
+      break;
+  }
+
+  return ret;
+}
 
 
 static void
@@ -351,7 +391,6 @@ gst_metadata_mux_finalize (GObject * object)
 static void
 gst_metadata_mux_create_chunks_from_tags (GstBaseMetadata * base)
 {
-
   GstMetadataMux *filter = GST_METADATA_MUX (base);
   GstTagSetter *setter = GST_TAG_SETTER (filter);
   const GstTagList *taglist = gst_tag_setter_get_tag_list (setter);
@@ -506,16 +545,14 @@ gst_metadata_mux_sink_event (GstPad * pad, GstEvent * event)
   switch (GST_EVENT_TYPE (event)) {
     case GST_EVENT_TAG:
     {
-      GstTagList *taglist = NULL;
+      GstTagList *taglist;
       GstTagSetter *setter = GST_TAG_SETTER (filter);
       const GstTagMergeMode mode = gst_tag_setter_get_tag_merge_mode (setter);
 
       gst_event_parse_tag (event, &taglist);
       gst_tag_setter_merge_tags (setter, taglist, mode);
-
-
-    }
       break;
+    }
     default:
       break;
   }
index f123250..8e70e99 100644 (file)
@@ -239,14 +239,11 @@ gst_qt_mux_reset (GstQTMux * qtmux, gboolean alloc)
     atom_moov_free (qtmux->moov);
     qtmux->moov = NULL;
   }
-  if (qtmux->tags) {
-    gst_tag_list_free (qtmux->tags);
-    qtmux->tags = NULL;
-  }
   if (qtmux->fast_start_file) {
     fclose (qtmux->fast_start_file);
     qtmux->fast_start_file = NULL;
   }
+  gst_tag_setter_reset_tags (GST_TAG_SETTER (qtmux));
 
   /* reset pad data */
   for (walk = qtmux->collect->data; walk; walk = g_slist_next (walk)) {
@@ -514,32 +511,18 @@ gst_qt_mux_add_metadata_tags (GstQTMux * qtmux, const GstTagList * list)
 static void
 gst_qt_mux_setup_metadata (GstQTMux * qtmux)
 {
-  const GstTagList *user_tags;
-  GstTagList *mixedtags = NULL;
-  GstTagMergeMode merge_mode;
-
-  user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (qtmux));
-  merge_mode = gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (qtmux));
-
-  GST_DEBUG_OBJECT (qtmux, "merging tags, merge mode = %d", merge_mode);
-  GST_LOG_OBJECT (qtmux, "event tags: %" GST_PTR_FORMAT, qtmux->tags);
-  GST_LOG_OBJECT (qtmux, "set   tags: %" GST_PTR_FORMAT, user_tags);
+  const GstTagList *tags;
 
-  mixedtags = gst_tag_list_merge (user_tags, qtmux->tags, merge_mode);
+  tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (qtmux));
 
-  GST_LOG_OBJECT (qtmux, "final tags: %" GST_PTR_FORMAT, mixedtags);
+  GST_LOG_OBJECT (qtmux, "tags: %" GST_PTR_FORMAT, tags);
 
-  if (mixedtags && !gst_tag_list_is_empty (mixedtags)) {
-    GST_DEBUG_OBJECT (qtmux, "Parsing tags");
-    gst_qt_mux_add_metadata_tags (qtmux, mixedtags);
+  if (tags && !gst_tag_list_is_empty (tags)) {
+    GST_DEBUG_OBJECT (qtmux, "Formatting tags");
+    gst_qt_mux_add_metadata_tags (qtmux, tags);
   } else {
-    GST_DEBUG_OBJECT (qtmux, "No tags found");
+    GST_DEBUG_OBJECT (qtmux, "No tags received");
   }
-
-  if (mixedtags)
-    gst_tag_list_free (mixedtags);
-
-  return;
 }
 
 static GstFlowReturn
@@ -1585,20 +1568,19 @@ gst_qt_mux_sink_event (GstPad * pad, GstEvent * event)
 {
   gboolean ret;
   GstQTMux *qtmux;
-  GstTagList *list;
 
   qtmux = GST_QT_MUX_CAST (gst_pad_get_parent (pad));
   switch (GST_EVENT_TYPE (event)) {
-    case GST_EVENT_TAG:
+    case GST_EVENT_TAG:{
+      GstTagList *list;
+      GstTagSetter *setter = GST_TAG_SETTER (qtmux);
+      const GstTagMergeMode mode = gst_tag_setter_get_tag_merge_mode (setter);
+
       GST_DEBUG_OBJECT (qtmux, "received tag event");
       gst_event_parse_tag (event, &list);
-
-      if (qtmux->tags) {
-        gst_tag_list_insert (qtmux->tags, list, GST_TAG_MERGE_PREPEND);
-      } else {
-        qtmux->tags = gst_tag_list_copy (list);
-      }
+      gst_tag_setter_merge_tags (setter, list, mode);
       break;
+    }
     default:
       break;
   }
@@ -1774,6 +1756,7 @@ gst_qt_mux_change_state (GstElement * element, GstStateChange transition)
       break;
     case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
       break;
+      /* FIXME: shouldn't the downwards state-change be done below? */
     case GST_STATE_CHANGE_PAUSED_TO_READY:
       gst_collect_pads_stop (qtmux->collect);
       break;
index 99d129e..539904f 100644 (file)
@@ -97,8 +97,6 @@ struct _GstQTMux
   /* fast start */
   FILE *fast_start_file;
 
-  GstTagList *tags;
-
   /* properties */
   guint32 timescale;
   AtomsTreeFlavor flavor;