From: Tim-Philipp Müller Date: Mon, 23 Jan 2006 18:37:16 +0000 (+0000) Subject: ext/lame/gstlame.*: Contrary to what the const char in the lame API might suggest... X-Git-Tag: 1.19.3~509^2~1916^2~100 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d99d2bc9c217f4780cbe3e271e3c4c7b890bac3b;p=platform%2Fupstream%2Fgstreamer.git ext/lame/gstlame.*: Contrary to what the const char in the lame API might suggest, lame expects us to keep the string... Original commit message from CVS: * ext/lame/gstlame.c: (gst_lame_finalize), (gst_lame_class_init), (gst_lame_init), (add_one_tag), (gst_lame_set_metadata): * ext/lame/gstlame.h: Contrary to what the const char in the lame API might suggest, lame expects us to keep the strings we pass to id3tag_set_foo() around; it doesn't free them either though, so we have to store them somewhere and free them later when we can be sure lame doesn't need them any longer. --- diff --git a/ext/lame/gstlame.c b/ext/lame/gstlame.c index c22f634..e14c912 100644 --- a/ext/lame/gstlame.c +++ b/ext/lame/gstlame.c @@ -276,6 +276,18 @@ gst_lame_get_type (void) } static void +gst_lame_finalize (GObject * obj) +{ + GstLame *lame = GST_LAME (obj); + + g_slist_foreach (lame->tag_strings, (GFunc) g_free, NULL); + g_slist_free (lame->tag_strings); + lame->tag_strings = NULL; + + G_OBJECT_CLASS (parent_class)->finalize (obj); +} + +static void gst_lame_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); @@ -300,6 +312,7 @@ gst_lame_class_init (GstLameClass * klass) gobject_class->set_property = gst_lame_set_property; gobject_class->get_property = gst_lame_get_property; + gobject_class->finalize = gst_lame_finalize; g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BITRATE, g_param_spec_int ("bitrate", "Bitrate (kb/s)", "Bitrate in kbit/sec", @@ -552,6 +565,7 @@ gst_lame_init (GstLame * lame) lame->preset = 0; lame_close (lame->lgf); lame->lgf = NULL; + lame->tag_strings = NULL; GST_DEBUG_OBJECT (lame, "done initializing"); } @@ -638,7 +652,10 @@ add_one_tag (const GstTagList * list, const gchar * tag, gpointer user_data) tag_matches[i].tag_func (lame->lgf, value); } - g_free (value); + /* lame does not copy strings passed to it and expects them + * to be around later, but it does not free them for us either, + * so we just add them to a list and free it later when it's safe */ + lame->tag_strings = g_slist_prepend (lame->tag_strings, value); } static void @@ -650,11 +667,19 @@ gst_lame_set_metadata (GstLame * lame) g_return_if_fail (lame != NULL); user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (lame)); + + GST_DEBUG_OBJECT (lame, "lame->tags = %" GST_PTR_FORMAT, lame->tags); + GST_DEBUG_OBJECT (lame, "user tags = %" GST_PTR_FORMAT, user_tags); + if ((lame->tags == NULL) && (user_tags == NULL)) { return; } + copy = gst_tag_list_merge (user_tags, lame->tags, gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (lame))); + + GST_DEBUG_OBJECT (lame, "merged tags = %" GST_PTR_FORMAT, copy); + gst_tag_list_foreach ((GstTagList *) copy, add_one_tag, lame); gst_tag_list_free (copy); diff --git a/ext/lame/gstlame.h b/ext/lame/gstlame.h index 5e2cec6..8b03205 100644 --- a/ext/lame/gstlame.h +++ b/ext/lame/gstlame.h @@ -98,6 +98,8 @@ struct _GstLame { GstTagList *tags; + GSList *tag_strings; + /* time tracker */ guint64 last_ts, last_offs, last_duration; };