From: Stefan Kost Date: Tue, 16 Dec 2008 16:26:52 +0000 (+0000) Subject: Totally remove the internal taglists and fully use tagsetter. Fixes various tag muxin... X-Git-Tag: 1.19.3~507^2~19729 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1ea02b7a383f461d948eaeba82adb248e01e9127;p=platform%2Fupstream%2Fgstreamer.git 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. --- diff --git a/ChangeLog b/ChangeLog index 812c686..fe71088 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-12-16 Stefan Kost + + * 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 * tests/check/elements/mxfdemux.c: (mxfdemux_suite): diff --git a/ext/celt/gstceltenc.c b/ext/celt/gstceltenc.c index 58b3b29..d76fd88 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 6dc7c96..c0c554b 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 d75c686..657774d 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 f123250..8e70e99 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 99d129e..539904f 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;