From: Thiago Santos Date: Sat, 31 Jan 2015 17:32:34 +0000 (-0300) Subject: qtmux: store stream and container tags separately X-Git-Tag: 1.6.0~632 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e52b2cb2cf4ab1b30f3ee5c1de5b746330c47c91;p=platform%2Fupstream%2Fgst-plugins-good.git qtmux: store stream and container tags separately Tags received via events, when marked as stream tags, will be stored on that stream's trak atom instead of being stored in the main tags atom. This allows the resulting file to have global and stream tags stored. https://bugzilla.gnome.org/show_bug.cgi?id=692473 --- diff --git a/gst/isomp4/gstqtmux.c b/gst/isomp4/gstqtmux.c index f79175e..e9e0928 100644 --- a/gst/isomp4/gstqtmux.c +++ b/gst/isomp4/gstqtmux.c @@ -388,6 +388,11 @@ gst_qt_mux_pad_reset (GstQTPad * qtpad) if (qtpad->last_buf) gst_buffer_replace (&qtpad->last_buf, NULL); + if (qtpad->tags) { + gst_tag_list_unref (qtpad->tags); + qtpad->tags = NULL; + } + /* reference owned elsewhere */ qtpad->trak = NULL; @@ -1212,6 +1217,7 @@ static void gst_qt_mux_setup_metadata (GstQTMux * qtmux) { const GstTagList *tags; + GSList *walk; GST_OBJECT_LOCK (qtmux); tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (qtmux)); @@ -1235,6 +1241,20 @@ gst_qt_mux_setup_metadata (GstQTMux * qtmux) GST_DEBUG_OBJECT (qtmux, "No tags received"); } + for (walk = qtmux->sinkpads; walk; walk = g_slist_next (walk)) { + GstCollectData *cdata = (GstCollectData *) walk->data; + GstQTPad *qpad = (GstQTPad *) cdata; + GstPad *pad = qpad->collect.pad; + + if (qpad->tags) { + GST_DEBUG_OBJECT (pad, "Adding tags"); + gst_tag_list_remove_tag (qpad->tags, GST_TAG_CONTAINER_FORMAT); + gst_qt_mux_add_metadata_tags (qtmux, qpad->tags, &qpad->trak->udta); + GST_DEBUG_OBJECT (pad, "Tags added"); + } else { + GST_DEBUG_OBJECT (pad, "No tags received"); + } + } } static inline GstBuffer * @@ -3397,15 +3417,23 @@ gst_qt_mux_sink_event (GstCollectPads * pads, GstCollectData * data, GstTagSetter *setter = GST_TAG_SETTER (qtmux); GstTagMergeMode mode; gchar *code; + GstQTPad *collect_pad; GST_OBJECT_LOCK (qtmux); mode = gst_tag_setter_get_tag_merge_mode (setter); + collect_pad = (GstQTPad *) gst_pad_get_element_private (pad); gst_event_parse_tag (event, &list); GST_DEBUG_OBJECT (qtmux, "received tag event on pad %s:%s : %" GST_PTR_FORMAT, GST_DEBUG_PAD_NAME (pad), list); - gst_tag_setter_merge_tags (setter, list, mode); + if (gst_tag_list_get_scope (list) == GST_TAG_SCOPE_GLOBAL) { + gst_tag_setter_merge_tags (setter, list, mode); + } else { + if (!collect_pad->tags) + collect_pad->tags = gst_tag_list_new_empty (); + gst_tag_list_insert (collect_pad->tags, list, mode); + } GST_OBJECT_UNLOCK (qtmux); if (gst_tag_list_get_uint (list, GST_TAG_BITRATE, &avg_bitrate) | diff --git a/gst/isomp4/gstqtmux.h b/gst/isomp4/gstqtmux.h index 0d7f662..a9ea362 100644 --- a/gst/isomp4/gstqtmux.h +++ b/gst/isomp4/gstqtmux.h @@ -128,6 +128,8 @@ struct _GstQTPad /* optional fragment index book-keeping */ AtomTFRA *tfra; + GstTagList *tags; + /* if nothing is set, it won't be called */ GstQTPadPrepareBufferFunc prepare_buf_func; GstQTPadSetCapsFunc set_caps;