summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2020-10-09 13:59:38 +0200
committerBastien Nocera <hadess@hadess.net>2020-10-13 16:20:22 +0200
commitcea088e09fb0071cbb54660dc386b8271fed896f (patch)
treeb548c6d1c6f0a9fac171cd1337140ff3cfb690d7
parent34ff6b9445a464dde8d3d73d481cbfb56d767aa3 (diff)
downloadgnome-desktop-wip/hadess/cache-gst-plugin-registry.tar.gz
thumbnailer: Cache GStreamer's plugin registrywip/hadess/cache-gst-plugin-registry
This will speed up thumbnailers that need it.
-rw-r--r--libgnome-desktop/gnome-desktop-thumbnail-script.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/libgnome-desktop/gnome-desktop-thumbnail-script.c b/libgnome-desktop/gnome-desktop-thumbnail-script.c
index 720943a1..c46d2132 100644
--- a/libgnome-desktop/gnome-desktop-thumbnail-script.c
+++ b/libgnome-desktop/gnome-desktop-thumbnail-script.c
@@ -49,6 +49,8 @@ typedef enum {
SANDBOX_TYPE_FLATPAK
} SandboxType;
+#define GST_REGISTRY_FILENAME "gstreamer-1.0.registry"
+
typedef struct {
SandboxType sandbox;
char *thumbnailer_name;
@@ -61,6 +63,8 @@ typedef struct {
/* I/O file paths inside the sandbox */
char *s_infile;
char *s_outfile;
+ /* Whether a GStreamer cache dir was setup */
+ gboolean has_gst_registry;
} ScriptExec;
static char *
@@ -137,6 +141,20 @@ add_args (GPtrArray *argv_array, ...)
va_end (args);
}
+static char *
+create_gst_cache_dir (void)
+{
+ char *out;
+
+ out = g_build_filename (g_get_user_cache_dir (),
+ "gnome-desktop-thumbnailer",
+ "gstreamer-1.0",
+ NULL);
+ if (g_mkdir_with_parents (out, 0700) < 0)
+ g_clear_pointer (&out, g_free);
+ return out;
+}
+
#ifdef ENABLE_SECCOMP
static gboolean
flatpak_fail (GError **error,
@@ -531,6 +549,7 @@ add_bwrap (GPtrArray *array,
{
const char * const usrmerged_dirs[] = { "bin", "lib64", "lib", "sbin" };
int i;
+ g_autofree char *gst_cache_dir = NULL;
g_return_val_if_fail (script->outdir != NULL, FALSE);
g_return_val_if_fail (script->s_infile != NULL, FALSE);
@@ -569,6 +588,19 @@ add_bwrap (GPtrArray *array,
if (!g_str_has_prefix (FONTCONFIG_CACHE_PATH, "/usr/"))
add_args (array, "--ro-bind-try", FONTCONFIG_CACHE_PATH, FONTCONFIG_CACHE_PATH, NULL);
+ /* GStreamer plugin cache if possible */
+ gst_cache_dir = create_gst_cache_dir ();
+ if (gst_cache_dir)
+ {
+ g_autofree char *registry = NULL;
+ script->has_gst_registry = TRUE;
+ registry = g_build_filename (gst_cache_dir, GST_REGISTRY_FILENAME, NULL);
+ add_args (array,
+ "--setenv", "GST_REGISTRY_1_0", registry,
+ "--bind", gst_cache_dir, gst_cache_dir,
+ NULL);
+ }
+
/*
* Used in various distributions. On those distributions, /usr is not
* complete without it: some files in /usr might be a symbolic link
@@ -640,6 +672,7 @@ add_flatpak (GPtrArray *array,
{
g_autofree char *inpath = NULL;
g_autofree char *outpath = NULL;
+ g_autofree char *gst_cache_dir = NULL;
g_return_val_if_fail (script->outdir != NULL, FALSE);
g_return_val_if_fail (script->infile != NULL, FALSE);
@@ -654,6 +687,21 @@ add_flatpak (GPtrArray *array,
add_flatpak_env (array, "G_MESSAGES_PREFIXED");
add_flatpak_env (array, "GST_DEBUG");
+ /* GStreamer plugin cache if possible */
+ gst_cache_dir = create_gst_cache_dir ();
+ if (gst_cache_dir)
+ {
+ g_autofree char *registry_path = NULL;
+ g_autofree char *env_option = NULL;
+ g_autofree char *expose_path_option = NULL;
+
+ script->has_gst_registry = TRUE;
+ registry_path = g_build_filename (gst_cache_dir, GST_REGISTRY_FILENAME, NULL);
+ expose_path_option = g_strdup_printf ("--sandbox-expose-path=%s", gst_cache_dir);
+ env_option = g_strdup_printf ("--env=GST_REGISTRY_1_0=%s", registry_path);
+ add_args (array, expose_path_option, env_option, NULL);
+ }
+
outpath = g_strdup_printf ("--sandbox-expose-path=%s", script->outdir);
inpath = g_strdup_printf ("--sandbox-expose-path-ro=%s", script->infile);
@@ -977,6 +1025,44 @@ bail:
}
static void
+clean_gst_registry_dir (ScriptExec *exec)
+{
+ g_autoptr(GDir) dir = NULL;
+ g_autofree char *gst_cache_dir = NULL;
+ g_autoptr(GError) error = NULL;
+ const char *name = NULL;
+
+ if (!exec->has_gst_registry)
+ return;
+
+ gst_cache_dir = create_gst_cache_dir ();
+ dir = g_dir_open (gst_cache_dir, 0, &error);
+ if (!dir) {
+ g_debug ("Failed to open GStreamer registry dir %s: %s",
+ gst_cache_dir,
+ error->message);
+ return;
+ }
+
+ while ((name = g_dir_read_name (dir)) != NULL)
+ {
+ g_autofree char *fullpath = NULL;
+
+ if (g_strcmp0 (name, ".") == 0 ||
+ g_strcmp0 (name, "..") == 0 ||
+ g_strcmp0 (name, GST_REGISTRY_FILENAME) == 0)
+ continue;
+
+ fullpath = g_build_filename (gst_cache_dir, name, NULL);
+ if (g_remove (fullpath) < 0)
+ g_warning ("Failed to delete left-over thumbnailing '%s'", fullpath);
+ else
+ g_warning ("Left-over file '%s' in '%s', deleting",
+ name, gst_cache_dir);
+ }
+}
+
+static void
print_script_debug (GStrv expanded_script)
{
GString *out;
@@ -1032,6 +1118,8 @@ gnome_desktop_thumbnail_script_exec (const char *cmd,
g_debug ("Failed to launch script: %s", !ret ? (*error)->message : error_out);
}
+ clean_gst_registry_dir (exec);
+
out:
script_exec_free (exec);
return image;