[gnac] Fixed a memory leak



commit 391bba210d539a3c70ef249da45ccead55a11246
Author: BenoÃt Dupasquier <bdupasqu src gnome org>
Date:   Tue Jan 31 20:39:41 2012 +0000

    Fixed a memory leak

 libgnac/libgnac-metadata.c |   62 ++++++++++++++++++++++++--------------------
 1 files changed, 34 insertions(+), 28 deletions(-)
---
diff --git a/libgnac/libgnac-metadata.c b/libgnac/libgnac-metadata.c
index b063d4d..8e251cc 100644
--- a/libgnac/libgnac-metadata.c
+++ b/libgnac/libgnac-metadata.c
@@ -60,7 +60,6 @@ libgnac_metadata_reset(LibgnacMetadata *md)
   if (md->priv->metadata) {
     md->priv->metadata = NULL;
   }
-  md->priv->info = NULL;
 }
 
 
@@ -266,7 +265,7 @@ libgnac_metadata_process_tag_image(const GstTagList *taglist,
       GdkPixbuf *pixbuf = gdk_pixbuf_loader_get_pixbuf(loader);
       libgnac_metadata_add_object_value(md, GST_TAG_IMAGE, G_OBJECT(pixbuf));
 
-      g_object_unref(G_OBJECT(loader));
+      g_object_unref(loader);
     }
   }
 }
@@ -309,7 +308,8 @@ libgnac_metadata_process_tag(const GstTagList *taglist,
     g_value_take_string(newval, str);
   }
 
-  if (g_str_equal(tag_name, GST_TAG_DATE)) {
+  if (g_str_equal(tag_name, GST_TAG_DATE))
+  {
     g_return_if_fail(GST_VALUE_HOLDS_DATE(newval));
     const GDate *date = gst_value_get_date(newval);
     if (!date) return;
@@ -318,6 +318,12 @@ libgnac_metadata_process_tag(const GstTagList *taglist,
     g_value_init(newval, G_TYPE_UINT);
     g_value_set_uint(newval, year);
   }
+  else if (g_str_equal(tag_name, GST_TAG_DURATION))
+  {
+    guint64 duration = g_value_get_uint64(newval);
+    /* convert the duration from ns to seconds */
+    g_value_set_uint64(newval, duration / GST_SECOND);
+  }
 
   g_hash_table_insert(md->priv->metadata, tag_name, newval);
 }
@@ -356,13 +362,11 @@ libgnac_metadata_get_file_info(GFile *uri, LibgnacMetadata *md)
   libgnac_metadata_add_string_value(md, GNAC_TAG_FILENAME, filename);
 
   /* image */
-  if (!libgnac_metadata_tag_exists(md->priv->metadata, GST_TAG_IMAGE)) {
-    const gchar *thumbnail_path = g_file_info_get_attribute_byte_string(info,
-        G_FILE_ATTRIBUTE_THUMBNAIL_PATH);
-    if (thumbnail_path) {
-      GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(thumbnail_path, NULL);
-      libgnac_metadata_add_object_value(md, GST_TAG_IMAGE, G_OBJECT(pixbuf));
-    }
+  const gchar *thumbnail_path = g_file_info_get_attribute_byte_string(info,
+      G_FILE_ATTRIBUTE_THUMBNAIL_PATH);
+  if (thumbnail_path) {
+    GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(thumbnail_path, NULL);
+    libgnac_metadata_add_object_value(md, GST_TAG_IMAGE, G_OBJECT(pixbuf));
   }
 
   g_object_unref(info);
@@ -390,8 +394,7 @@ libgnac_metadata_process_audio_info(LibgnacMetadata *md)
   libgnac_metadata_add_uint_value(md, GNAC_TAG_AUDIO_DEPTH, depth);
 
   //guint bitrate = gst_discoverer_audio_info_get_bitrate(audio);
-  //if (gst_discoverer_audio_info_is_vbr(audio)) {
-  //if (audio->is_vbr) {  // XXX not implemented yet
+  //if (gst_discoverer_audio_info_is_vbr(audio)) { // XXX not implemented yet
   //  libgnac_metadata_add_uint_value(md, GNAC_TAG_VBR, bitrate);
   //}
 
@@ -458,8 +461,8 @@ libgnac_metadata_extract(LibgnacMetadata  *md,
     libgnac_metadata_get_file_info(uri, md);
 
     GError *err = NULL;
-    GstDiscoverer *discoverer = gst_discoverer_new(GST_SECOND, &err);
-    if (!discoverer) {
+    GstDiscoverer *discoverer = gst_discoverer_new(5 * GST_SECOND, &err);
+    if (G_UNLIKELY(!discoverer)) {
       libgnac_debug("Failed to create discoverer: %s", err->message);
       g_propagate_error(error, err);
       return NULL;
@@ -467,19 +470,15 @@ libgnac_metadata_extract(LibgnacMetadata  *md,
 
     GstDiscovererInfo *info = gst_discoverer_discover_uri(discoverer,
         string_uri, &err);
-    if (!info) {
+    if (G_UNLIKELY(!info)) {
       libgnac_debug("Failed to discover: %s", err->message);
       g_propagate_error(error, err);
       return NULL;
     }
 
-    md->priv->info = info;
+    gst_object_unref(discoverer);
 
-    const GstTagList *taglist = gst_discoverer_info_get_tags(info);
-    if (taglist) {
-      gst_tag_list_foreach(taglist,
-          (GstTagForeachFunc) libgnac_metadata_process_tag, md);
-    }
+    md->priv->info = info;
 
     GstClockTime duration = gst_discoverer_info_get_duration(info);
     GValue *val = g_new0(GValue, 1);
@@ -488,9 +487,17 @@ libgnac_metadata_extract(LibgnacMetadata  *md,
     g_value_set_uint64(val, duration / GST_SECOND);
     g_hash_table_insert(md->priv->metadata, GST_TAG_DURATION, val);
 
+    const GstTagList *taglist = gst_discoverer_info_get_tags(info);
+    if (taglist) {
+      gst_tag_list_foreach(taglist,
+          (GstTagForeachFunc) libgnac_metadata_process_tag, md);
+    }
+
     libgnac_metadata_process_audio_info(md);
     libgnac_metadata_process_video_info(md);
 
+    gst_object_unref(md->priv->info);
+
     g_hash_table_insert(md->priv->tags_table, g_strdup(string_uri),
         md->priv->metadata);
     tags = md->priv->metadata;
@@ -550,19 +557,18 @@ libgnac_metadata_get_dummy_tags(void)
         (GDestroyNotify) libgnac_metadata_tags_free);
 
     gchar *string_tags[][2] = {
-      { GST_TAG_ALBUM    , "Today!"               },
-      { GST_TAG_ARTIST   , "The Beach Boys"       },
+      { GST_TAG_ALBUM    , "Today!"                },
+      { GST_TAG_ARTIST   , "The Beach Boys"        },
       /* Translators: example filename used in the preview label (do not remove the extension) */
-      { GST_TAG_COMMENT  , _("Converted by Gnac") },
-      { GNAC_TAG_FILENAME, _("filename.oga")      },
-      { GST_TAG_GENRE    , "Rock"                 },
-      { GST_TAG_TITLE    , "Do You Wanna Dance?"  },
+      { GST_TAG_COMMENT  , N_("Converted by Gnac") },
+      { GNAC_TAG_FILENAME, N_("filename.oga")      },
+      { GST_TAG_GENRE    , "Rock"                  },
+      { GST_TAG_TITLE    , "Do You Wanna Dance?"   },
       { NULL, NULL }
     };
 
     gint i;
     for (i = 0; string_tags[i][0]; i++) {
-        g_print("%d\n", i);
       GValue *value = g_new0(GValue, 1);
       g_value_init(value, G_TYPE_STRING);
       g_value_set_static_string(value, string_tags[i][1]);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]