diff -Nur gstreamer-0.10.32.4-old//gst/gstplugin.c gstreamer-0.10.32.4/gst/gstplugin.c --- gstreamer-0.10.32.4-old//gst/gstplugin.c 2011-05-03 10:00:04.763000288 +0300 +++ gstreamer-0.10.32.4/gst/gstplugin.c 2011-05-03 10:02:15.244000278 +0300 @@ -68,6 +68,8 @@ #include +#include + #define GST_CAT_DEFAULT GST_CAT_PLUGIN_LOADING static guint _num_static_plugins; /* 0 */ @@ -753,6 +755,74 @@ goto return_error; } + /* Workarounds for all known plugins that might have changed features + * although the plugin timestamp didn't change */ + + /* GnomeVFS */ + if (g_str_has_suffix (filename, "/libgstgnomevfs.so")) { + struct stat tmp_status; + + if (!g_stat (LIBDIR "/gnome-vfs-2.0/modules", &tmp_status)) { + file_status.st_mtime = MAX (file_status.st_mtime, tmp_status.st_mtime); + } + } + + /* LADSPA */ + if (g_str_has_suffix (filename, "/libgstladspa.so")) { + struct stat tmp_status; + + if (!g_stat (LIBDIR "/ladspa", &tmp_status)) { + file_status.st_mtime = MAX (file_status.st_mtime, tmp_status.st_mtime); + } + } + + /* libvisual */ + if (g_str_has_suffix (filename, "/libgstlibvisual.so")) { + struct stat tmp_status; + + if (!g_stat (LIBDIR "/libvisual-0.4", &tmp_status)) { + GDir *dir; + const gchar *file; + + file_status.st_mtime = MAX (file_status.st_mtime, tmp_status.st_mtime); + dir = g_dir_open (LIBDIR "/libvisual-0.4", 0, NULL); + if (dir) { + while ((file = g_dir_read_name (dir))) { + gchar *filename = g_strdup_printf (LIBDIR "/libvisual-0.4/%s", file); + + if (!g_stat (filename, &tmp_status)) { + file_status.st_mtime = + MAX (file_status.st_mtime, tmp_status.st_mtime); + } + g_free (filename); + } + g_dir_close (dir); + } + } + } + + /* FFMPEG */ + if (g_str_has_suffix (filename, "/libgstffmpeg.so") || + g_str_has_suffix (filename, "/libgstpostproc.so")) { + struct stat tmp_status; + glob_t gl = { 0, }; + int i; + + glob (LIBDIR "/libavcodec.so.*.*", GLOB_NOSORT, NULL, &gl); + glob (LIBDIR "/libavutil.so.*.*", GLOB_APPEND | GLOB_NOSORT, NULL, &gl); + glob (LIBDIR "/libavformat.so.*.*", GLOB_APPEND | GLOB_NOSORT, NULL, &gl); + glob (LIBDIR "/libpostproc.so.*.*", GLOB_APPEND | GLOB_NOSORT, NULL, &gl); + glob (LIBDIR "/libswscale.so.*.*", GLOB_APPEND | GLOB_NOSORT, NULL, &gl); + + for (i = 0; i < gl.gl_pathc; i++) { + if (!g_stat (gl.gl_pathv[i], &tmp_status)) { + file_status.st_mtime = MAX (file_status.st_mtime, tmp_status.st_mtime); + } + } + + globfree (&gl); + } + flags = G_MODULE_BIND_LOCAL; /* libgstpython.so is the gst-python plugin loader. It needs to be loaded with * G_MODULE_BIND_LAZY. diff -Nur gstreamer-0.10.32.4-old//gst/gstregistry.c gstreamer-0.10.32.4/gst/gstregistry.c --- gstreamer-0.10.32.4-old//gst/gstregistry.c 2011-05-03 10:00:04.770000288 +0300 +++ gstreamer-0.10.32.4/gst/gstregistry.c 2011-05-03 10:00:25.707000262 +0300 @@ -142,6 +142,8 @@ extern HMODULE _priv_gst_dll_handle; #endif +#include + #define GST_CAT_DEFAULT GST_CAT_REGISTRY struct _GstRegistryPrivate @@ -1203,6 +1205,79 @@ * update the plugin to ensure the registry cache will reflect up * to date information */ + /* Workarounds for all known plugins that might have changed features + * although the plugin timestamp didn't change */ + + /* GnomeVFS */ + if (g_str_has_suffix (filename, "/libgstgnomevfs.so")) { + struct stat tmp_status; + + if (!g_stat (LIBDIR "/gnome-vfs-2.0/modules", &tmp_status)) { + file_status.st_mtime = + MAX (file_status.st_mtime, tmp_status.st_mtime); + } + } + + /* LADSPA */ + if (g_str_has_suffix (filename, "/libgstladspa.so")) { + struct stat tmp_status; + + if (!g_stat (LIBDIR "/ladspa", &tmp_status)) { + file_status.st_mtime = + MAX (file_status.st_mtime, tmp_status.st_mtime); + } + } + + /* libvisual */ + if (g_str_has_suffix (filename, "/libgstlibvisual.so")) { + struct stat tmp_status; + + if (!g_stat (LIBDIR "/libvisual-0.4", &tmp_status)) { + GDir *dir; + const gchar *file; + + file_status.st_mtime = + MAX (file_status.st_mtime, tmp_status.st_mtime); + dir = g_dir_open (LIBDIR "/libvisual-0.4", 0, NULL); + if (dir) { + while ((file = g_dir_read_name (dir))) { + gchar *filename = + g_strdup_printf (LIBDIR "/libvisual-0.4/%s", file); + + if (!g_stat (filename, &tmp_status)) { + file_status.st_mtime = + MAX (file_status.st_mtime, tmp_status.st_mtime); + } + g_free (filename); + } + g_dir_close (dir); + } + } + } + + /* FFMPEG */ + if (g_str_has_suffix (filename, "/libgstffmpeg.so") || + g_str_has_suffix (filename, "/libgstpostproc.so")) { + struct stat tmp_status; + glob_t gl = { 0, }; + int i; + + glob (LIBDIR "/libavcodec.so.*.*", GLOB_NOSORT, NULL, &gl); + glob (LIBDIR "/libavutil.so.*.*", GLOB_APPEND | GLOB_NOSORT, NULL, &gl); + glob (LIBDIR "/libavformat.so.*.*", GLOB_APPEND | GLOB_NOSORT, NULL, &gl); + glob (LIBDIR "/libpostproc.so.*.*", GLOB_APPEND | GLOB_NOSORT, NULL, &gl); + glob (LIBDIR "/libswscale.so.*.*", GLOB_APPEND | GLOB_NOSORT, NULL, &gl); + + for (i = 0; i < gl.gl_pathc; i++) { + if (!g_stat (gl.gl_pathv[i], &tmp_status)) { + file_status.st_mtime = + MAX (file_status.st_mtime, tmp_status.st_mtime); + } + } + + globfree (&gl); + } + if (plugin->file_mtime == file_status.st_mtime && plugin->file_size == file_status.st_size && !env_vars_changed && !(deps_changed = _priv_plugin_deps_files_changed (plugin)) &&