[Xfce4-commits] [xfce/tumbler] 01/01: Check for sparse video files only on plugin side.

noreply at xfce.org noreply at xfce.org
Mon Oct 29 10:06:07 CET 2018


This is an automated email from the git hooks/post-receive script.

a   l   i       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository xfce/tumbler.

commit da29dad8676b38b3e29396db1442d0ede6f6385d
Author: Ali Abdallah <ali at xfce.org>
Date:   Sun Oct 21 11:14:16 2018 +0200

    Check for sparse video files only on plugin side.
    
    Move the sparse video files check to ffmpeg and gstreamer plugins.
---
 plugins/ffmpeg-thumbnailer/ffmpeg-thumbnailer.c | 18 ++++--
 plugins/gst-thumbnailer/gst-thumbnailer.c       |  8 +++
 tumbler/tumbler-util.c                          | 41 ++++++++++++-
 tumbler/tumbler-util.h                          | 10 ++-
 tumblerd/tumbler-registry.c                     | 82 ++++++++-----------------
 5 files changed, 92 insertions(+), 67 deletions(-)

diff --git a/plugins/ffmpeg-thumbnailer/ffmpeg-thumbnailer.c b/plugins/ffmpeg-thumbnailer/ffmpeg-thumbnailer.c
index 81f2922..6bc9de3 100644
--- a/plugins/ffmpeg-thumbnailer/ffmpeg-thumbnailer.c
+++ b/plugins/ffmpeg-thumbnailer/ffmpeg-thumbnailer.c
@@ -10,11 +10,11 @@
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU Library General Public License for more details.
  *
- * You should have received a copy of the GNU Library General 
- * Public License along with this library; if not, write to the 
+ * You should have received a copy of the GNU Library General
+ * Public License along with this library; if not, write to the
  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  * Boston, MA 02110-1301, USA.
  */
@@ -149,7 +149,7 @@ generate_pixbuf (GdkPixbuf *source,
     dest_height = rint (source_height / wratio);
 
   /* scale the pixbuf down to the desired size */
-  return gdk_pixbuf_scale_simple (source, MAX (dest_width, 1), MAX (dest_height, 1), 
+  return gdk_pixbuf_scale_simple (source, MAX (dest_width, 1), MAX (dest_height, 1),
                                   GDK_INTERP_BILINEAR);
 }
 
@@ -180,9 +180,17 @@ ffmpeg_thumbnailer_create (TumblerAbstractThumbnailer *thumbnailer,
   g_return_if_fail (TUMBLER_IS_FILE_INFO (info));
 
   /* do nothing if cancelled */
-  if (g_cancellable_is_cancelled (cancellable)) 
+  if (g_cancellable_is_cancelled (cancellable))
     return;
 
+  /* Check if is a sparse video file */
+  if (tumbler_util_guess_is_sparse (info))
+  {
+    g_debug ("Video file '%s' is probably sparse, skipping\n",
+             tumbler_file_info_get_uri (info));
+    return;
+  }
+
   /* fetch required info */
   thumbnail = tumbler_file_info_get_thumbnail (info);
   g_assert (thumbnail != NULL);
diff --git a/plugins/gst-thumbnailer/gst-thumbnailer.c b/plugins/gst-thumbnailer/gst-thumbnailer.c
index 284a0b9..73f884b 100644
--- a/plugins/gst-thumbnailer/gst-thumbnailer.c
+++ b/plugins/gst-thumbnailer/gst-thumbnailer.c
@@ -570,6 +570,14 @@ gst_thumbnailer_create (TumblerAbstractThumbnailer *thumbnailer,
   if (g_cancellable_is_cancelled (cancellable))
     return;
 
+  /* Check if is a sparse video file */
+  if (tumbler_util_guess_is_sparse (info))
+  {
+    g_debug ("Video file '%s' is probably sparse, skipping\n",
+             tumbler_file_info_get_uri (info));
+    return;
+  }
+
   /* get size of dest thumb */
   thumbnail = tumbler_file_info_get_thumbnail (info);
   flavor = tumbler_thumbnail_get_flavor (thumbnail);
diff --git a/tumbler/tumbler-util.c b/tumbler/tumbler-util.c
index 9d656d5..a414e26 100644
--- a/tumbler/tumbler-util.c
+++ b/tumbler/tumbler-util.c
@@ -9,11 +9,11 @@
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU Library General Public License for more details.
  *
- * You should have received a copy of the GNU Library General 
- * Public License along with this library; if not, write to the 
+ * You should have received a copy of the GNU Library General
+ * Public License along with this library; if not, write to the
  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  * Boston, MA 02110-1301, USA.
  */
@@ -29,8 +29,12 @@
 #include <glib.h>
 #include <gio/gio.h>
 
+#include <sys/stat.h>
+
 #include <tumbler/tumbler-util.h>
 
+/* Float block size used in the stat struct */
+#define TUMBLER_STAT_BLKSIZE 512.
 
 
 gchar **
@@ -130,3 +134,34 @@ tumbler_util_get_settings (void)
 
   return settings;
 }
+
+
+gboolean  tumbler_util_guess_is_sparse (TumblerFileInfo *info)
+{
+  gchar *filename;
+  struct stat sb;
+  gboolean ret_val = FALSE;
+
+  g_return_val_if_fail (TUMBLER_IS_FILE_INFO (info), FALSE);
+
+  filename = g_filename_from_uri (tumbler_file_info_get_uri (info), NULL, NULL);
+
+  if (G_LIKELY(filename))
+  {
+    stat (filename, &sb);
+
+    g_free (filename);
+
+    /* Test sparse files on regular ones */
+    if (S_ISREG (sb.st_mode))
+    {
+      if (((TUMBLER_STAT_BLKSIZE * sb.st_blocks) / sb.st_size) < 0.8)
+      {
+        ret_val = TRUE;
+      }
+    }
+  }
+
+  return ret_val;
+}
+
diff --git a/tumbler/tumbler-util.h b/tumbler/tumbler-util.h
index b68db0a..809332e 100644
--- a/tumbler/tumbler-util.h
+++ b/tumbler/tumbler-util.h
@@ -9,11 +9,11 @@
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU Library General Public License for more details.
  *
- * You should have received a copy of the GNU Library General 
- * Public License along with this library; if not, write to the 
+ * You should have received a copy of the GNU Library General
+ * Public License along with this library; if not, write to the
  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  * Boston, MA 02110-1301, USA.
  */
@@ -23,12 +23,16 @@
 
 #include <glib.h>
 
+#include <tumbler/tumbler-file-info.h>
+
 G_BEGIN_DECLS
 
 gchar **tumbler_util_get_supported_uri_schemes (void) G_GNUC_MALLOC;
 
 GKeyFile *tumbler_util_get_settings (void) G_GNUC_MALLOC;
 
+gboolean  tumbler_util_guess_is_sparse (TumblerFileInfo *info);
+
 G_END_DECLS
 
 #endif /* !__TUMBLER_UTIL_H__ */
diff --git a/tumblerd/tumbler-registry.c b/tumblerd/tumbler-registry.c
index b87e2c1..317c853 100644
--- a/tumblerd/tumbler-registry.c
+++ b/tumblerd/tumbler-registry.c
@@ -3,18 +3,18 @@
  * Copyright (c) 2009-2011 Jannis Pohlmann <jannis at xfce.org>
  * Copyright (c) 2018      Ali Abdallah    <ali at xfce.org>
  *
- * This program is free software; you can redistribute it and/or 
+ * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of 
+ * published by the Free Software Foundation; either version 2 of
  * the License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public 
- * License along with this program; if not, write to the Free 
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
  * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  * Boston, MA 02110-1301, USA.
  */
@@ -26,7 +26,6 @@
 #include <glib.h>
 #include <glib-object.h>
 
-#include <sys/stat.h>
 
 #include <tumbler/tumbler.h>
 
@@ -34,8 +33,6 @@
 #include <tumblerd/tumbler-specialized-thumbnailer.h>
 #include <tumblerd/tumbler-utils.h>
 
-/* Float block size used in the stat struct */
-#define TUMBLER_STAT_BLKSIZE 512.
 
 static void                tumbler_registry_finalize                  (GObject            *object);
 static void                tumbler_registry_remove_thumbnailer        (const gchar        *key,
@@ -83,11 +80,11 @@ tumbler_registry_class_init (TumblerRegistryClass *klass)
   GObjectClass *gobject_class;
 
   /* pre-allocate the required quarks */
-  tumbler_registry_visited_quark = 
+  tumbler_registry_visited_quark =
     g_quark_from_static_string ("tumbler-registry-visited-quark");
 
   gobject_class = G_OBJECT_CLASS (klass);
-  gobject_class->finalize = tumbler_registry_finalize; 
+  gobject_class->finalize = tumbler_registry_finalize;
 }
 
 
@@ -174,7 +171,7 @@ tumbler_registry_compare (TumblerThumbnailer *a,
   g_return_val_if_fail (TUMBLER_IS_THUMBNAILER (a), 0);
   g_return_val_if_fail (TUMBLER_IS_THUMBNAILER (b), 0);
 
-  /* TODO Rewrite this based on a single get_registered() time function 
+  /* TODO Rewrite this based on a single get_registered() time function
    * for all thumbnailer types */
 
   if (!TUMBLER_IS_SPECIALIZED_THUMBNAILER (a) || !TUMBLER_IS_SPECIALIZED_THUMBNAILER (b))
@@ -367,7 +364,7 @@ tumbler_registry_add (TumblerRegistry    *registry,
 
       if (list != NULL)
         {
-          /* we already have thumbnailers for this combination. insert the new 
+          /* we already have thumbnailers for this combination. insert the new
            * one at the right position in the list */
           *list = g_list_insert_sorted (*list, g_object_ref (thumbnailer),
                                         (GCompareFunc) tumbler_registry_compare);
@@ -386,7 +383,7 @@ tumbler_registry_add (TumblerRegistry    *registry,
     }
 
   /* connect to the unregister signal of the thumbnailer */
-  g_signal_connect_swapped (thumbnailer, "unregister", 
+  g_signal_connect_swapped (thumbnailer, "unregister",
                             G_CALLBACK (tumbler_registry_remove), registry);
 
   g_strfreev (hash_keys);
@@ -409,11 +406,11 @@ tumbler_registry_remove (TumblerRegistry    *registry,
 
   tumbler_mutex_lock (registry->mutex);
 
-  g_signal_handlers_disconnect_matched (thumbnailer, G_SIGNAL_MATCH_DATA, 
+  g_signal_handlers_disconnect_matched (thumbnailer, G_SIGNAL_MATCH_DATA,
                                         0, 0, NULL, NULL, registry);
-                                        
+
   /* remove the thumbnailer from all hash key lists */
-  g_hash_table_foreach (registry->thumbnailers, 
+  g_hash_table_foreach (registry->thumbnailers,
                         (GHFunc) tumbler_registry_remove_thumbnailer, thumbnailer);
 
   tumbler_mutex_unlock (registry->mutex);
@@ -465,42 +462,15 @@ tumbler_registry_get_thumbnailer_array (TumblerRegistry    *registry,
   /* iterate over all URIs */
   for (n = 0; n < length; ++n)
     {
-      gchar *filename;
-      struct stat sb;
-
       g_assert (TUMBLER_IS_FILE_INFO (infos[n]));
 
       /* reset */
       file_size = 0;
 
-      filename = g_filename_from_uri (tumbler_file_info_get_uri (infos[n]), NULL, NULL);
-
-      if (G_LIKELY(filename))
-      {
-        stat (filename, &sb);
-
-        g_free (filename);
-
-        /* Test sparse files on regular ones */
-        if (S_ISREG (sb.st_mode))
-        {
-          if (((TUMBLER_STAT_BLKSIZE * sb.st_blocks) / sb.st_size) < 0.8)
-          {
-            g_debug ("'%s' is probably a sparse file, skipping\n", tumbler_file_info_get_uri (infos[n]));
-            continue;
-          }
-        }
-      }
-      else
-      {
-        g_warning ("Failed to get filename from uri for '%s', skipping\n", tumbler_file_info_get_uri (infos[n]));
-        continue;
-      }
-
       /* determine the URI scheme and generate a hash key */
       gfile = g_file_new_for_uri (tumbler_file_info_get_uri (infos[n]));
       scheme = g_file_get_uri_scheme (gfile);
-      hash_key = g_strdup_printf ("%s-%s", scheme, 
+      hash_key = g_strdup_printf ("%s-%s", scheme,
                                   tumbler_file_info_get_mime_type (infos[n]));
 
       /* get list of thumbnailer that can handle this URI/MIME type pair */
@@ -593,8 +563,8 @@ tumbler_registry_update_supported (TumblerRegistry *registry)
     g_object_set_qdata (lp->data, tumbler_registry_visited_quark, NULL);
 
   /* create a hash table to collect unique URI scheme / MIME type pairs */
-  unique_pairs = g_hash_table_new_full (g_str_hash, g_str_equal, 
-                                        (GDestroyNotify) g_free, 
+  unique_pairs = g_hash_table_new_full (g_str_hash, g_str_equal,
+                                        (GDestroyNotify) g_free,
                                         (GDestroyNotify) free_pair);
 
   /* prepare array */
@@ -611,8 +581,8 @@ tumbler_registry_update_supported (TumblerRegistry *registry)
       uri_schemes = tumbler_thumbnailer_get_uri_schemes (lp->data);
 
       /* insert all MIME types & URI schemes into the hash table */
-      for (n = 0; 
-           mime_types != NULL && uri_schemes != NULL && mime_types[n] != NULL; 
+      for (n = 0;
+           mime_types != NULL && uri_schemes != NULL && mime_types[n] != NULL;
            ++n)
         {
           /* remember the MIME type so that we can later reuse it without copying */
@@ -620,8 +590,8 @@ tumbler_registry_update_supported (TumblerRegistry *registry)
 
           for (u = 0; uri_schemes[u] != NULL; ++u)
             {
-              /* remember the URI scheme for this pair so that we can later reuse it 
-               * without copying. Only remember it once (n==0) to avoid segmentation 
+              /* remember the URI scheme for this pair so that we can later reuse it
+               * without copying. Only remember it once (n==0) to avoid segmentation
                * faults when freeing the list */
               if (n == 0)
                 g_ptr_array_add (used_strings, uri_schemes[u]);
@@ -646,9 +616,9 @@ tumbler_registry_update_supported (TumblerRegistry *registry)
       g_free (mime_types);
       g_free (uri_schemes);
 
-      /* mark the thumbnailer as visited so we don't generate its 
+      /* mark the thumbnailer as visited so we don't generate its
        * MIME type & URI scheme pairs multiple times */
-      g_object_set_qdata (lp->data, tumbler_registry_visited_quark, 
+      g_object_set_qdata (lp->data, tumbler_registry_visited_quark,
                           GUINT_TO_POINTER (1));
     }
 
@@ -667,7 +637,7 @@ tumbler_registry_update_supported (TumblerRegistry *registry)
   /* insert all unique URI scheme / MIME type pairs into string arrays */
   n = 0;
   g_hash_table_iter_init (&iter, unique_pairs);
-  while (g_hash_table_iter_next (&iter, NULL, (gpointer) &pair)) 
+  while (g_hash_table_iter_next (&iter, NULL, (gpointer) &pair))
     {
       /* fill the cache arrays with copied values */
       registry->uri_schemes[n] = g_strdup (pair[0]);
@@ -700,7 +670,7 @@ tumbler_registry_get_supported (TumblerRegistry     *registry,
   g_return_if_fail (TUMBLER_IS_REGISTRY (registry));
 
   tumbler_mutex_lock (registry->mutex);
-  
+
   if (uri_schemes != NULL)
     *uri_schemes = (const gchar *const *)registry->uri_schemes;
 
@@ -740,14 +710,14 @@ tumbler_registry_set_preferred (TumblerRegistry    *registry,
   g_return_if_fail (thumbnailer == NULL || TUMBLER_IS_THUMBNAILER (thumbnailer));
 
   tumbler_mutex_lock (registry->mutex);
-  
+
   if (thumbnailer == NULL)
     {
       g_hash_table_remove (registry->preferred_thumbnailers, hash_key);
     }
   else
     {
-      g_hash_table_insert (registry->preferred_thumbnailers, 
+      g_hash_table_insert (registry->preferred_thumbnailers,
                            g_strdup (hash_key), g_object_ref (thumbnailer));
     }
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list