mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 05:06:17 +00:00
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.
This commit is contained in:
parent
da7ea42f92
commit
1ea02b7a38
6 changed files with 86 additions and 64 deletions
10
ChangeLog
10
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>
|
2008-12-16 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
||||||
|
|
||||||
* tests/check/elements/mxfdemux.c: (mxfdemux_suite):
|
* tests/check/elements/mxfdemux.c: (mxfdemux_suite):
|
||||||
|
|
|
@ -513,30 +513,29 @@ gst_celt_enc_init (GstCeltEnc * enc, GstCeltEncClass * klass)
|
||||||
static GstBuffer *
|
static GstBuffer *
|
||||||
gst_celt_enc_create_metadata_buffer (GstCeltEnc * enc)
|
gst_celt_enc_create_metadata_buffer (GstCeltEnc * enc)
|
||||||
{
|
{
|
||||||
const GstTagList *user_tags;
|
const GstTagList *tags;
|
||||||
GstTagList *merged_tags;
|
GstTagList *empty_tags;
|
||||||
GstBuffer *comments = NULL;
|
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, "tags = %" GST_PTR_FORMAT, tags);
|
||||||
GST_DEBUG_OBJECT (enc, "user-set tags = %" GST_PTR_FORMAT, user_tags);
|
|
||||||
|
|
||||||
/* gst_tag_list_merge() will handle NULL for either or both lists fine */
|
if (tags == NULL) {
|
||||||
merged_tags = gst_tag_list_merge (user_tags, enc->tags,
|
/* FIXME: better fix chain of callers to not write metadata at all,
|
||||||
gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (enc)));
|
* if there is none */
|
||||||
|
empty_tags = gst_tag_list_new ();
|
||||||
if (merged_tags == NULL)
|
tags = empty_tags;
|
||||||
merged_tags = gst_tag_list_new ();
|
}
|
||||||
|
comments = gst_tag_list_to_vorbiscomment_buffer (tags, NULL,
|
||||||
GST_DEBUG_OBJECT (enc, "merged tags = %" GST_PTR_FORMAT, merged_tags);
|
|
||||||
comments = gst_tag_list_to_vorbiscomment_buffer (merged_tags, NULL,
|
|
||||||
0, "Encoded with GStreamer Celtenc");
|
0, "Encoded with GStreamer Celtenc");
|
||||||
gst_tag_list_free (merged_tags);
|
|
||||||
|
|
||||||
GST_BUFFER_OFFSET (comments) = enc->bytes_out;
|
GST_BUFFER_OFFSET (comments) = enc->bytes_out;
|
||||||
GST_BUFFER_OFFSET_END (comments) = 0;
|
GST_BUFFER_OFFSET_END (comments) = 0;
|
||||||
|
|
||||||
|
if (empty_tags)
|
||||||
|
gst_tag_list_free (empty_tags);
|
||||||
|
|
||||||
return comments;
|
return comments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -685,12 +684,11 @@ gst_celt_enc_sinkevent (GstPad * pad, GstEvent * event)
|
||||||
case GST_EVENT_TAG:
|
case GST_EVENT_TAG:
|
||||||
{
|
{
|
||||||
GstTagList *list;
|
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);
|
gst_event_parse_tag (event, &list);
|
||||||
if (enc->tags) {
|
gst_tag_setter_merge_tags (setter, list, mode);
|
||||||
gst_tag_list_insert (enc->tags, list,
|
|
||||||
gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (enc)));
|
|
||||||
}
|
|
||||||
res = gst_pad_event_default (pad, event);
|
res = gst_pad_event_default (pad, event);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -983,7 +981,6 @@ gst_celt_enc_change_state (GstElement * element, GstStateChange transition)
|
||||||
|
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_CHANGE_NULL_TO_READY:
|
case GST_STATE_CHANGE_NULL_TO_READY:
|
||||||
enc->tags = gst_tag_list_new ();
|
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
||||||
enc->frameno = 0;
|
enc->frameno = 0;
|
||||||
|
@ -1020,8 +1017,7 @@ gst_celt_enc_change_state (GstElement * element, GstStateChange transition)
|
||||||
memset (&enc->header, 0, sizeof (enc->header));
|
memset (&enc->header, 0, sizeof (enc->header));
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||||
gst_tag_list_free (enc->tags);
|
gst_tag_setter_reset_tags (GST_TAG_SETTER (enc));
|
||||||
enc->tags = NULL;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,8 +73,6 @@ struct _GstCeltEnc {
|
||||||
guint64 samples_in;
|
guint64 samples_in;
|
||||||
guint64 bytes_out;
|
guint64 bytes_out;
|
||||||
|
|
||||||
GstTagList *tags;
|
|
||||||
|
|
||||||
guint64 frameno;
|
guint64 frameno;
|
||||||
guint64 frameno_out;
|
guint64 frameno_out;
|
||||||
|
|
||||||
|
|
|
@ -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,
|
static void gst_metadata_mux_get_property (GObject * object, guint prop_id,
|
||||||
GValue * value, GParamSpec * pspec);
|
GValue * value, GParamSpec * pspec);
|
||||||
|
|
||||||
|
static GstStateChangeReturn gst_metadata_mux_change_state (GstElement * element,
|
||||||
|
GstStateChange transition);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GstBaseMetadata virtual functions declaration
|
* 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->set_property = gst_metadata_mux_set_property;
|
||||||
gobject_class->get_property = gst_metadata_mux_get_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 =
|
gstbasemetadata_class->processing =
|
||||||
GST_DEBUG_FUNCPTR (gst_metadata_mux_create_chunks_from_tags);
|
GST_DEBUG_FUNCPTR (gst_metadata_mux_create_chunks_from_tags);
|
||||||
gstbasemetadata_class->set_caps =
|
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
|
static void
|
||||||
|
@ -351,7 +391,6 @@ gst_metadata_mux_finalize (GObject * object)
|
||||||
static void
|
static void
|
||||||
gst_metadata_mux_create_chunks_from_tags (GstBaseMetadata * base)
|
gst_metadata_mux_create_chunks_from_tags (GstBaseMetadata * base)
|
||||||
{
|
{
|
||||||
|
|
||||||
GstMetadataMux *filter = GST_METADATA_MUX (base);
|
GstMetadataMux *filter = GST_METADATA_MUX (base);
|
||||||
GstTagSetter *setter = GST_TAG_SETTER (filter);
|
GstTagSetter *setter = GST_TAG_SETTER (filter);
|
||||||
const GstTagList *taglist = gst_tag_setter_get_tag_list (setter);
|
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)) {
|
switch (GST_EVENT_TYPE (event)) {
|
||||||
case GST_EVENT_TAG:
|
case GST_EVENT_TAG:
|
||||||
{
|
{
|
||||||
GstTagList *taglist = NULL;
|
GstTagList *taglist;
|
||||||
GstTagSetter *setter = GST_TAG_SETTER (filter);
|
GstTagSetter *setter = GST_TAG_SETTER (filter);
|
||||||
const GstTagMergeMode mode = gst_tag_setter_get_tag_merge_mode (setter);
|
const GstTagMergeMode mode = gst_tag_setter_get_tag_merge_mode (setter);
|
||||||
|
|
||||||
gst_event_parse_tag (event, &taglist);
|
gst_event_parse_tag (event, &taglist);
|
||||||
gst_tag_setter_merge_tags (setter, taglist, mode);
|
gst_tag_setter_merge_tags (setter, taglist, mode);
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,14 +239,11 @@ gst_qt_mux_reset (GstQTMux * qtmux, gboolean alloc)
|
||||||
atom_moov_free (qtmux->moov);
|
atom_moov_free (qtmux->moov);
|
||||||
qtmux->moov = NULL;
|
qtmux->moov = NULL;
|
||||||
}
|
}
|
||||||
if (qtmux->tags) {
|
|
||||||
gst_tag_list_free (qtmux->tags);
|
|
||||||
qtmux->tags = NULL;
|
|
||||||
}
|
|
||||||
if (qtmux->fast_start_file) {
|
if (qtmux->fast_start_file) {
|
||||||
fclose (qtmux->fast_start_file);
|
fclose (qtmux->fast_start_file);
|
||||||
qtmux->fast_start_file = NULL;
|
qtmux->fast_start_file = NULL;
|
||||||
}
|
}
|
||||||
|
gst_tag_setter_reset_tags (GST_TAG_SETTER (qtmux));
|
||||||
|
|
||||||
/* reset pad data */
|
/* reset pad data */
|
||||||
for (walk = qtmux->collect->data; walk; walk = g_slist_next (walk)) {
|
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
|
static void
|
||||||
gst_qt_mux_setup_metadata (GstQTMux * qtmux)
|
gst_qt_mux_setup_metadata (GstQTMux * qtmux)
|
||||||
{
|
{
|
||||||
const GstTagList *user_tags;
|
const GstTagList *tags;
|
||||||
GstTagList *mixedtags = NULL;
|
|
||||||
GstTagMergeMode merge_mode;
|
|
||||||
|
|
||||||
user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (qtmux));
|
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, "tags: %" GST_PTR_FORMAT, tags);
|
||||||
GST_LOG_OBJECT (qtmux, "event tags: %" GST_PTR_FORMAT, qtmux->tags);
|
|
||||||
GST_LOG_OBJECT (qtmux, "set tags: %" GST_PTR_FORMAT, user_tags);
|
|
||||||
|
|
||||||
mixedtags = gst_tag_list_merge (user_tags, qtmux->tags, merge_mode);
|
if (tags && !gst_tag_list_is_empty (tags)) {
|
||||||
|
GST_DEBUG_OBJECT (qtmux, "Formatting tags");
|
||||||
GST_LOG_OBJECT (qtmux, "final tags: %" GST_PTR_FORMAT, mixedtags);
|
gst_qt_mux_add_metadata_tags (qtmux, tags);
|
||||||
|
|
||||||
if (mixedtags && !gst_tag_list_is_empty (mixedtags)) {
|
|
||||||
GST_DEBUG_OBJECT (qtmux, "Parsing tags");
|
|
||||||
gst_qt_mux_add_metadata_tags (qtmux, mixedtags);
|
|
||||||
} else {
|
} 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
|
static GstFlowReturn
|
||||||
|
@ -1585,20 +1568,19 @@ gst_qt_mux_sink_event (GstPad * pad, GstEvent * event)
|
||||||
{
|
{
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
GstQTMux *qtmux;
|
GstQTMux *qtmux;
|
||||||
GstTagList *list;
|
|
||||||
|
|
||||||
qtmux = GST_QT_MUX_CAST (gst_pad_get_parent (pad));
|
qtmux = GST_QT_MUX_CAST (gst_pad_get_parent (pad));
|
||||||
switch (GST_EVENT_TYPE (event)) {
|
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_DEBUG_OBJECT (qtmux, "received tag event");
|
||||||
gst_event_parse_tag (event, &list);
|
gst_event_parse_tag (event, &list);
|
||||||
|
gst_tag_setter_merge_tags (setter, list, mode);
|
||||||
if (qtmux->tags) {
|
|
||||||
gst_tag_list_insert (qtmux->tags, list, GST_TAG_MERGE_PREPEND);
|
|
||||||
} else {
|
|
||||||
qtmux->tags = gst_tag_list_copy (list);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1774,6 +1756,7 @@ gst_qt_mux_change_state (GstElement * element, GstStateChange transition)
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
|
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
|
||||||
break;
|
break;
|
||||||
|
/* FIXME: shouldn't the downwards state-change be done below? */
|
||||||
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||||
gst_collect_pads_stop (qtmux->collect);
|
gst_collect_pads_stop (qtmux->collect);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -97,8 +97,6 @@ struct _GstQTMux
|
||||||
/* fast start */
|
/* fast start */
|
||||||
FILE *fast_start_file;
|
FILE *fast_start_file;
|
||||||
|
|
||||||
GstTagList *tags;
|
|
||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
guint32 timescale;
|
guint32 timescale;
|
||||||
AtomsTreeFlavor flavor;
|
AtomsTreeFlavor flavor;
|
||||||
|
|
Loading…
Reference in a new issue