mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-18 20:25:25 +00:00
registry: Support installed/uninstalled plugin-scanner helper
Add a simple version check when starting the plugin-scanner so we can verify we're talking to one that talks the same language. First try a plugin-scanner in the installed path, then try one via the GST_PLUGIN_SCANNER env var if that doesn't work. Update the uninstalled script. Install the plugin-scanner to the libexec dir
This commit is contained in:
parent
6eee943b36
commit
8bf3d8cec2
4 changed files with 96 additions and 28 deletions
|
@ -654,6 +654,11 @@ dnl LDFLAGS for plugins; includes GST_ALL_LDFLAGS
|
||||||
GST_PLUGIN_LDFLAGS="-module -avoid-version -export-symbols-regex '^[_]*gst_plugin_desc\$\$' $GST_ALL_LDFLAGS"
|
GST_PLUGIN_LDFLAGS="-module -avoid-version -export-symbols-regex '^[_]*gst_plugin_desc\$\$' $GST_ALL_LDFLAGS"
|
||||||
AC_SUBST(GST_PLUGIN_LDFLAGS, "$GST_PLUGIN_LDFLAGS")
|
AC_SUBST(GST_PLUGIN_LDFLAGS, "$GST_PLUGIN_LDFLAGS")
|
||||||
|
|
||||||
|
dnl plugin scanner locations
|
||||||
|
AS_AC_EXPAND(GST_PLUGIN_SCANNER_INSTALLED,${libexecdir}/plugin-scanner)
|
||||||
|
AC_DEFINE_UNQUOTED(GST_PLUGIN_SCANNER_INSTALLED,
|
||||||
|
"$GST_PLUGIN_SCANNER_INSTALLED", [location of the installed plugin-scanner])
|
||||||
|
|
||||||
SHAVE_INIT([common],[enable])
|
SHAVE_INIT([common],[enable])
|
||||||
|
|
||||||
dnl things for our internal libcheck
|
dnl things for our internal libcheck
|
||||||
|
|
|
@ -123,6 +123,8 @@ export GST_PLUGIN_SYSTEM_PATH=
|
||||||
# by an installed copy
|
# by an installed copy
|
||||||
rm -f $GST/gstreamer/registry.xml 2>/dev/null
|
rm -f $GST/gstreamer/registry.xml 2>/dev/null
|
||||||
export GST_REGISTRY=$GST/gstreamer/registry.dat
|
export GST_REGISTRY=$GST/gstreamer/registry.dat
|
||||||
|
# Point at the uninstalled plugin scanner
|
||||||
|
export GST_PLUGIN_SCANNER=$GST/gstreamer/libs/gst/helpers/plugin-scanner
|
||||||
|
|
||||||
# once MANPATH is set, it needs at least an "empty"component to keep pulling
|
# once MANPATH is set, it needs at least an "empty"component to keep pulling
|
||||||
# in the system-configured man paths from man.config
|
# in the system-configured man paths from man.config
|
||||||
|
|
|
@ -40,6 +40,9 @@
|
||||||
#include <gst/gstpluginloader.h>
|
#include <gst/gstpluginloader.h>
|
||||||
#include <gst/gstregistrychunks.h>
|
#include <gst/gstregistrychunks.h>
|
||||||
|
|
||||||
|
/* IMPORTANT: Bump the version number if the plugin loader protocol changes */
|
||||||
|
static const guint32 loader_protocol_version = 1;
|
||||||
|
|
||||||
#define GST_CAT_DEFAULT GST_CAT_PLUGIN_LOADING
|
#define GST_CAT_DEFAULT GST_CAT_PLUGIN_LOADING
|
||||||
|
|
||||||
static GstPluginLoader *plugin_loader_new (GstRegistry * registry);
|
static GstPluginLoader *plugin_loader_new (GstRegistry * registry);
|
||||||
|
@ -85,6 +88,8 @@ struct _GstPluginLoader
|
||||||
gboolean rx_done;
|
gboolean rx_done;
|
||||||
gboolean rx_got_sync;
|
gboolean rx_got_sync;
|
||||||
|
|
||||||
|
guint32 got_version;
|
||||||
|
|
||||||
/* Head and tail of the pending plugins list. List of
|
/* Head and tail of the pending plugins list. List of
|
||||||
PendingPluginEntry structs */
|
PendingPluginEntry structs */
|
||||||
GList *pending_plugins;
|
GList *pending_plugins;
|
||||||
|
@ -95,13 +100,13 @@ struct _GstPluginLoader
|
||||||
#define PACKET_LOAD_PLUGIN 2
|
#define PACKET_LOAD_PLUGIN 2
|
||||||
#define PACKET_SYNC 3
|
#define PACKET_SYNC 3
|
||||||
#define PACKET_PLUGIN_DETAILS 4
|
#define PACKET_PLUGIN_DETAILS 4
|
||||||
|
#define PACKET_VERSION 5
|
||||||
|
|
||||||
#define BUF_INIT_SIZE 512
|
#define BUF_INIT_SIZE 512
|
||||||
#define BUF_GROW_EXTRA 512
|
#define BUF_GROW_EXTRA 512
|
||||||
#define HEADER_SIZE 8
|
#define HEADER_SIZE 8
|
||||||
#define ALIGNMENT (sizeof (void *))
|
#define ALIGNMENT (sizeof (void *))
|
||||||
|
|
||||||
|
|
||||||
static gboolean gst_plugin_loader_spawn (GstPluginLoader * loader);
|
static gboolean gst_plugin_loader_spawn (GstPluginLoader * loader);
|
||||||
static void put_packet (GstPluginLoader * loader, guint type, guint32 tag,
|
static void put_packet (GstPluginLoader * loader, guint type, guint32 tag,
|
||||||
const guint8 * payload, guint32 payload_len);
|
const guint8 * payload, guint32 payload_len);
|
||||||
|
@ -112,6 +117,7 @@ static gboolean plugin_loader_load_and_sync (GstPluginLoader * l,
|
||||||
static void plugin_loader_create_blacklist_plugin (GstPluginLoader * l,
|
static void plugin_loader_create_blacklist_plugin (GstPluginLoader * l,
|
||||||
PendingPluginEntry * entry);
|
PendingPluginEntry * entry);
|
||||||
static void plugin_loader_cleanup_child (GstPluginLoader * loader);
|
static void plugin_loader_cleanup_child (GstPluginLoader * loader);
|
||||||
|
static gboolean plugin_loader_sync_with_child (GstPluginLoader * l);
|
||||||
|
|
||||||
static GstPluginLoader *
|
static GstPluginLoader *
|
||||||
plugin_loader_new (GstRegistry * registry)
|
plugin_loader_new (GstRegistry * registry)
|
||||||
|
@ -273,6 +279,19 @@ restart:
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
plugin_loader_sync_with_child (GstPluginLoader * l)
|
||||||
|
{
|
||||||
|
put_packet (l, PACKET_SYNC, 0, NULL, 0);
|
||||||
|
|
||||||
|
l->rx_got_sync = FALSE;
|
||||||
|
while (!l->rx_got_sync) {
|
||||||
|
if (!exchange_packets (l))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
plugin_loader_load_and_sync (GstPluginLoader * l, PendingPluginEntry * entry)
|
plugin_loader_load_and_sync (GstPluginLoader * l, PendingPluginEntry * entry)
|
||||||
{
|
{
|
||||||
|
@ -284,15 +303,8 @@ plugin_loader_load_and_sync (GstPluginLoader * l, PendingPluginEntry * entry)
|
||||||
len = strlen (entry->filename);
|
len = strlen (entry->filename);
|
||||||
put_packet (l, PACKET_LOAD_PLUGIN, entry->tag,
|
put_packet (l, PACKET_LOAD_PLUGIN, entry->tag,
|
||||||
(guint8 *) entry->filename, len + 1);
|
(guint8 *) entry->filename, len + 1);
|
||||||
put_packet (l, PACKET_SYNC, 0, NULL, 0);
|
|
||||||
|
|
||||||
l->rx_got_sync = FALSE;
|
return plugin_loader_sync_with_child (l);
|
||||||
while (!l->rx_got_sync) {
|
|
||||||
if (!exchange_packets (l))
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -320,23 +332,16 @@ plugin_loader_create_blacklist_plugin (GstPluginLoader * l,
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_plugin_loader_spawn (GstPluginLoader * loader)
|
gst_plugin_loader_try_helper (GstPluginLoader * loader, gchar * location)
|
||||||
{
|
{
|
||||||
if (loader->child_running)
|
char *argv[] = { location, "-l", NULL };
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
{
|
GST_LOG ("Trying to spawn plugin-scanner helper at %s", location);
|
||||||
/* FIXME: Find the plugin-scanner! */
|
if (!g_spawn_async_with_pipes (NULL, argv, NULL,
|
||||||
char *helper_bin =
|
G_SPAWN_DO_NOT_REAP_CHILD /* | G_SPAWN_STDERR_TO_DEV_NULL */ ,
|
||||||
"/home/jan/devel/gstreamer/head/gstreamer/libs/gst/helpers/plugin-scanner";
|
NULL, NULL, &loader->child_pid, &loader->fd_w.fd, &loader->fd_r.fd,
|
||||||
char *argv[] = { helper_bin, "-l", NULL };
|
NULL, NULL))
|
||||||
|
return FALSE;
|
||||||
if (!g_spawn_async_with_pipes (NULL, argv, NULL,
|
|
||||||
G_SPAWN_DO_NOT_REAP_CHILD /* | G_SPAWN_STDERR_TO_DEV_NULL */ ,
|
|
||||||
NULL, NULL, &loader->child_pid, &loader->fd_w.fd, &loader->fd_r.fd,
|
|
||||||
NULL, NULL))
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_poll_add_fd (loader->fdset, &loader->fd_w);
|
gst_poll_add_fd (loader->fdset, &loader->fd_w);
|
||||||
gst_poll_add_fd (loader->fdset, &loader->fd_r);
|
gst_poll_add_fd (loader->fdset, &loader->fd_r);
|
||||||
|
@ -345,11 +350,53 @@ gst_plugin_loader_spawn (GstPluginLoader * loader)
|
||||||
|
|
||||||
loader->tx_buf_write = loader->tx_buf_read = 0;
|
loader->tx_buf_write = loader->tx_buf_read = 0;
|
||||||
|
|
||||||
|
loader->got_version = (guint32) (-1);
|
||||||
|
put_packet (loader, PACKET_VERSION, 0, NULL, 0);
|
||||||
|
if (!plugin_loader_sync_with_child (loader))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
GST_LOG ("Got VERSION %u from child. Ours is %u", loader->got_version,
|
||||||
|
loader_protocol_version);
|
||||||
|
if (loader->got_version != loader_protocol_version)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
loader->child_running = TRUE;
|
loader->child_running = TRUE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_plugin_loader_spawn (GstPluginLoader * loader)
|
||||||
|
{
|
||||||
|
char *helper_bin;
|
||||||
|
gboolean res;
|
||||||
|
|
||||||
|
if (loader->child_running)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* Find the plugin-scanner, first try installed then by env-var */
|
||||||
|
helper_bin = g_strdup (GST_PLUGIN_SCANNER_INSTALLED);
|
||||||
|
res = gst_plugin_loader_try_helper (loader, helper_bin);
|
||||||
|
g_free (helper_bin);
|
||||||
|
|
||||||
|
if (!res) {
|
||||||
|
/* Try the GST_PLUGIN_SCANNER env var */
|
||||||
|
const gchar *env = g_getenv ("GST_PLUGIN_SCANNER");
|
||||||
|
if (env != NULL) {
|
||||||
|
GST_LOG ("Installed plugin scanner failed. "
|
||||||
|
"Trying GST_PLUGIN_SCANNER env var: %s", env);
|
||||||
|
helper_bin = g_strdup (env);
|
||||||
|
res = gst_plugin_loader_try_helper (loader, helper_bin);
|
||||||
|
g_free (helper_bin);
|
||||||
|
} else {
|
||||||
|
GST_LOG ("Installed plugin scanner failed and "
|
||||||
|
"GST_PLUGIN_SCANNER env var not set. No plugin-scanner available");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return loader->child_running;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
plugin_loader_cleanup_child (GstPluginLoader * l)
|
plugin_loader_cleanup_child (GstPluginLoader * l)
|
||||||
{
|
{
|
||||||
|
@ -645,11 +692,26 @@ handle_rx_packet (GstPluginLoader * l,
|
||||||
case PACKET_SYNC:
|
case PACKET_SYNC:
|
||||||
if (l->is_child) {
|
if (l->is_child) {
|
||||||
/* Respond with our reply - also a sync */
|
/* Respond with our reply - also a sync */
|
||||||
put_packet (l, PACKET_SYNC, 0, NULL, 0);
|
put_packet (l, PACKET_SYNC, tag, NULL, 0);
|
||||||
GST_LOG ("Got SYNC in child - replying");
|
GST_LOG ("Got SYNC in child - replying");
|
||||||
} else
|
} else
|
||||||
l->rx_got_sync = TRUE;
|
l->rx_got_sync = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case PACKET_VERSION:
|
||||||
|
if (l->is_child) {
|
||||||
|
/* Respond with our reply - a version packet, with the version */
|
||||||
|
guint32 val;
|
||||||
|
GST_WRITE_UINT32_BE (&val, loader_protocol_version);
|
||||||
|
put_packet (l, PACKET_VERSION, tag, (guint8 *) & val, sizeof (guint32));
|
||||||
|
GST_LOG ("Got VERSION in child - replying %u", loader_protocol_version);
|
||||||
|
} else {
|
||||||
|
if (payload_len == sizeof (loader_protocol_version)) {
|
||||||
|
l->got_version = GST_READ_UINT32_BE (payload);
|
||||||
|
} else {
|
||||||
|
res = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return FALSE; /* Invalid packet -> something is wrong */
|
return FALSE; /* Invalid packet -> something is wrong */
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
# helpers_PROGRAMS = plugin-scanner
|
helpers_PROGRAMS = plugin-scanner
|
||||||
# FIXME: Subst helpersdir in configure.ac
|
helpersdir=$(libexecdir)
|
||||||
noinst_PROGRAMS = plugin-scanner
|
|
||||||
|
|
||||||
plugin_scanner_SOURCES = plugin-scanner.c
|
plugin_scanner_SOURCES = plugin-scanner.c
|
||||||
plugin_scanner_CFLAGS = $(GST_OBJ_CFLAGS)
|
plugin_scanner_CFLAGS = $(GST_OBJ_CFLAGS)
|
||||||
|
|
Loading…
Reference in a new issue