summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/ffmpeg-thumbnailer/ffmpeg-thumbnailer.c18
-rw-r--r--plugins/gst-thumbnailer/gst-thumbnailer.c8
-rw-r--r--tumbler/tumbler-util.c41
-rw-r--r--tumbler/tumbler-util.h10
-rw-r--r--tumblerd/tumbler-registry.c82
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@xfce.org>
* Copyright (c) 2018 Ali Abdallah <ali@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));
}