summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Kost <ensonic@users.sourceforge.net>2008-12-16 16:26:52 +0000
committerStefan Kost <ensonic@users.sourceforge.net>2008-12-16 16:26:52 +0000
commit1ea02b7a383f461d948eaeba82adb248e01e9127 (patch)
treec925ec2a1f159ee0df72fc77276a95dac5244c36
parentda7ea42f920df07059e5eab0208fcaec535d187a (diff)
downloadgst-plugins-bad-1ea02b7a383f461d948eaeba82adb248e01e9127.tar.gz
gst-plugins-bad-1ea02b7a383f461d948eaeba82adb248e01e9127.tar.bz2
gst-plugins-bad-1ea02b7a383f461d948eaeba82adb248e01e9127.zip
Totally remove the internal taglists and fully use tagsetter. Fixes various tag muxing issues.
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.
-rw-r--r--ChangeLog10
-rw-r--r--ext/celt/gstceltenc.c40
-rw-r--r--ext/celt/gstceltenc.h2
-rw-r--r--ext/metadata/gstmetadatamux.c47
-rw-r--r--gst/qtmux/gstqtmux.c49
-rw-r--r--gst/qtmux/gstqtmux.h2
6 files changed, 86 insertions, 64 deletions
diff --git a/ChangeLog b/ChangeLog
index 812c6865..fe710888 100644
--- 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):
diff --git a/ext/celt/gstceltenc.c b/ext/celt/gstceltenc.c
index 58b3b299..d76fd886 100644
--- a/ext/celt/gstceltenc.c
+++ b/ext/celt/gstceltenc.c
@@ -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;
}
diff --git a/ext/celt/gstceltenc.h b/ext/celt/gstceltenc.h
index 6dc7c96a..c0c554b8 100644
--- a/ext/celt/gstceltenc.h
+++ b/ext/celt/gstceltenc.h
@@ -73,8 +73,6 @@ struct _GstCeltEnc {
guint64 samples_in;
guint64 bytes_out;
- GstTagList *tags;
-
guint64 frameno;
guint64 frameno_out;
diff --git a/ext/metadata/gstmetadatamux.c b/ext/metadata/gstmetadatamux.c
index d75c686d..657774d6 100644
--- a/ext/metadata/gstmetadatamux.c
+++ b/ext/metadata/gstmetadatamux.c
@@ -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;
}
diff --git a/gst/qtmux/gstqtmux.c b/gst/qtmux/gstqtmux.c
index f1232508..8e70e999 100644
--- a/gst/qtmux/gstqtmux.c
+++ b/gst/qtmux/gstqtmux.c
@@ -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;
diff --git a/gst/qtmux/gstqtmux.h b/gst/qtmux/gstqtmux.h
index 99d129ec..539904ff 100644
--- a/gst/qtmux/gstqtmux.h
+++ b/gst/qtmux/gstqtmux.h
@@ -97,8 +97,6 @@ struct _GstQTMux
/* fast start */
FILE *fast_start_file;
- GstTagList *tags;
-
/* properties */
guint32 timescale;
AtomsTreeFlavor flavor;