gst_init modeled upon gtk_init code cleanups

Original commit message from CVS:
gst_init modeled upon gtk_init
code cleanups
This commit is contained in:
Thomas Vander Stichele 2002-11-27 21:08:06 +00:00
parent a48bce0ad6
commit 58855aa95b
3 changed files with 103 additions and 37 deletions

View file

@ -1,3 +1,10 @@
2002-11-27 Thomas Vander Stichele <thomas at apestaart dot org>
* ChangeLog: added an entry
* gst/gst.*: add gst_init_check which can return TRUE or FALSE
make gst_init_with_popt_table do the same
only initialize once, like GTK does
2002-04-12 Thomas Vander Stichele <thomas@apestaart.org> 2002-04-12 Thomas Vander Stichele <thomas@apestaart.org>
* gst/gst*.[ch]: commited GUAD3C code review comments (marked CR1) * gst/gst*.[ch]: commited GUAD3C code review comments (marked CR1)

114
gst/gst.c
View file

@ -43,17 +43,21 @@ static GstRegistry *_user_registry;
static gboolean _gst_registry_fixed = FALSE; static gboolean _gst_registry_fixed = FALSE;
static gboolean _gst_use_threads = TRUE; static gboolean _gst_use_threads = TRUE;
static gboolean gst_initialized = FALSE;
/* this will be set in popt callbacks when a problem has been encountered */
static gboolean _gst_initialization_failure = FALSE;
extern gint _gst_trace_on; extern gint _gst_trace_on;
extern GThreadFunctions gst_thread_dummy_functions; extern GThreadFunctions gst_thread_dummy_functions;
static void load_plugin_func (gpointer data, gpointer user_data); static void load_plugin_func (gpointer data, gpointer user_data);
static void init_popt_callback (poptContext context, enum poptCallbackReason reason, static void init_popt_callback (poptContext context,
const struct poptOption *option, const char *arg, void *data); enum poptCallbackReason reason,
static void init_pre (void); const struct poptOption *option,
static void init_post (void); const char *arg, void *data);
static gboolean init_pre (void);
static gboolean init_post (void);
static GSList *preload_plugins = NULL; static GSList *preload_plugins = NULL;
@ -65,8 +69,8 @@ debug_log_handler (const gchar *log_domain,
const gchar *message, const gchar *message,
gpointer user_data) gpointer user_data)
{ {
g_log_default_handler(log_domain, log_level, message, user_data); g_log_default_handler (log_domain, log_level, message, user_data);
g_on_error_query(NULL); g_on_error_query (NULL);
} }
enum { enum {
@ -89,7 +93,7 @@ enum {
#endif #endif
/* default scheduler, 'basicomega', can be changed in /* default scheduler, 'basicomega', can be changed in
* gstscheduler.c in function gst_scheduler_factory_class_init * gstscheduler.c in function gst_scheduler_factory_class_init
*/ */
static const struct poptOption options[] = { static const struct poptOption options[] = {
{NULL, NUL, POPT_ARG_CALLBACK|POPT_CBFLAG_PRE|POPT_CBFLAG_POST, &init_popt_callback, 0, NULL, NULL}, {NULL, NUL, POPT_ARG_CALLBACK|POPT_CBFLAG_PRE|POPT_CBFLAG_POST, &init_popt_callback, 0, NULL, NULL},
@ -116,7 +120,8 @@ static const struct poptOption options[] = {
* actually performed (via a poptGetContext()), the GStreamer libraries will * actually performed (via a poptGetContext()), the GStreamer libraries will
* be initialized. * be initialized.
* *
* Returns: a pointer to the static GStreamer option table. No free is necessary. * Returns: a pointer to the static GStreamer option table.
* No free is necessary.
*/ */
const struct poptOption * const struct poptOption *
gst_init_get_popt_table (void) gst_init_get_popt_table (void)
@ -124,6 +129,25 @@ gst_init_get_popt_table (void)
return options; return options;
} }
/**
* gst_init_check:
* @argc: pointer to application's argc
* @argv: pointer to application's argv
*
* Initializes the GStreamer library, setting up internal path lists,
* registering built-in elements, and loading standard plugins.
*
* This function will return %FALSE if GStreamer could not be initialized
* for some reason. If you want your program to fail fatally,
* use gst_init() instead.
*/
gboolean
gst_init_check (int *argc, char **argv[])
{
return gst_init_with_popt_table (argc, argv, NULL);
}
/** /**
* gst_init: * gst_init:
* @argc: pointer to application's argc * @argc: pointer to application's argc
@ -131,24 +155,31 @@ gst_init_get_popt_table (void)
* *
* Initializes the GStreamer library, setting up internal path lists, * Initializes the GStreamer library, setting up internal path lists,
* registering built-in elements, and loading standard plugins. * registering built-in elements, and loading standard plugins.
*
* This function will terminate your program if it was unable to initialize
* GStreamer for some reason. If you want your program to fall back,
* use gst_init_check() instead.
*/ */
void void
gst_init (int *argc, char **argv[]) gst_init (int *argc, char **argv[])
{ {
gst_init_with_popt_table (argc, argv, NULL); if (!gst_init_with_popt_table (argc, argv, NULL))
g_error ("Could not initialize GStreamer !\n");
} }
/** /**
* gst_init_with_popt_table: * gst_init_with_popt_table:
* @argc: pointer to application's argc * @argc: pointer to application's argc
* @argv: pointer to application's argv * @argv: pointer to application's argv
* @popt_options: pointer to a popt table to append * @popt_options: pointer to a popt table to append
* *
* Initializes the GStreamer library, parsing the options, * Initializes the GStreamer library, parsing the options,
* setting up internal path lists, * setting up internal path lists,
* registering built-in elements, and loading standard plugins. * registering built-in elements, and loading standard plugins.
*/ */
void gboolean
gst_init_with_popt_table (int *argc, char **argv[], const struct poptOption *popt_options) gst_init_with_popt_table (int *argc, char **argv[],
const struct poptOption *popt_options)
{ {
poptContext context; poptContext context;
gint nextopt, i, j, nstrip; gint nextopt, i, j, nstrip;
@ -167,13 +198,20 @@ gst_init_with_popt_table (int *argc, char **argv[], const struct poptOption *pop
POPT_TABLEEND POPT_TABLEEND
}; };
if (gst_initialized)
{
GST_DEBUG (GST_CAT_GST_INIT, "already initialized gst\n");
return TRUE;
}
if (!argc || !argv) { if (!argc || !argv) {
if (argc || argv) if (argc || argv)
g_warning ("gst_init: Only one of argc or argv was NULL"); g_warning ("gst_init: Only one of argc or argv was NULL");
init_pre(); if (!init_pre ()) return FALSE;
init_post(); if (!init_post ()) return FALSE;
return; gst_initialized = TRUE;
return TRUE;
} }
if (popt_options == NULL) { if (popt_options == NULL) {
@ -181,18 +219,24 @@ gst_init_with_popt_table (int *argc, char **argv[], const struct poptOption *pop
} else { } else {
options = options_with; options = options_with;
} }
context = poptGetContext ("GStreamer", *argc, (const char**)*argv, options, 0); context = poptGetContext ("GStreamer", *argc, (const char**)*argv,
options, 0);
while ((nextopt = poptGetNextOpt (context)) > 0); /* do nothing, it's all callbacks */
while ((nextopt = poptGetNextOpt (context)) > 0)
{
/* we only check for failures here, actual work is done in callbacks */
if (_gst_initialization_failure) return FALSE;
}
if (nextopt != -1) { if (nextopt != -1) {
g_print ("Error on option %s: %s.\nRun '%s --help' to see a full list of available command line options.\n", g_print ("Error on option %s: %s.\nRun '%s --help' "
"to see a full list of available command line options.\n",
poptBadOption (context, 0), poptBadOption (context, 0),
poptStrerror (nextopt), poptStrerror (nextopt),
(*argv)[0]); (*argv)[0]);
poptFreeContext (context); poptFreeContext (context);
exit (1); return FALSE;
} }
poptFreeContext (context); poptFreeContext (context);
@ -211,6 +255,7 @@ gst_init_with_popt_table (int *argc, char **argv[], const struct poptOption *pop
nstrip++; nstrip++;
} }
*argc -= nstrip; *argc -= nstrip;
return TRUE;
} }
static void static void
@ -278,7 +323,8 @@ split_and_iterate (const gchar *stringlist, gchar *separator, GFunc iterator, gp
} }
} }
static void /* we have no fail cases yet, but maybe in the future */
static gboolean
init_pre (void) init_pre (void)
{ {
const gchar *homedir; const gchar *homedir;
@ -321,6 +367,8 @@ init_pre (void)
#endif #endif
g_free (user_reg); g_free (user_reg);
return TRUE;
} }
static gboolean static gboolean
@ -359,8 +407,11 @@ static GstPluginDesc plugin_desc = {
* - initial output * - initial output
* - initializes gst_format * - initializes gst_format
* - registers a bunch of types for gst_objects * - registers a bunch of types for gst_objects
*
* - we don't have cases yet where this fails, but in the future
* we might and then it's nice to be able to return that
*/ */
static void static gboolean
init_post (void) init_post (void)
{ {
GLogLevelFlags llf; GLogLevelFlags llf;
@ -447,6 +498,8 @@ init_post (void)
if (_gst_progname == NULL) { if (_gst_progname == NULL) {
_gst_progname = g_strdup ("gstprog"); _gst_progname = g_strdup ("gstprog");
} }
return TRUE;
} }
static void static void
@ -483,9 +536,11 @@ init_popt_callback (poptContext context, enum poptCallbackReason reason,
gint val = 0; gint val = 0;
GLogLevelFlags fatal_mask; GLogLevelFlags fatal_mask;
if (gst_initialized)
return;
switch (reason) { switch (reason) {
case POPT_CALLBACK_REASON_PRE: case POPT_CALLBACK_REASON_PRE:
init_pre(); if (!init_pre ()) _gst_initialization_failure = TRUE;
break; break;
case POPT_CALLBACK_REASON_OPTION: case POPT_CALLBACK_REASON_OPTION:
switch (option->val) { switch (option->val) {
@ -537,7 +592,8 @@ init_popt_callback (poptContext context, enum poptCallbackReason reason,
} }
break; break;
case POPT_CALLBACK_REASON_POST: case POPT_CALLBACK_REASON_POST:
init_post(); if (!init_post ()) _gst_initialization_failure = TRUE;
gst_initialized = TRUE;
break; break;
} }
} }

View file

@ -62,16 +62,19 @@
G_BEGIN_DECLS G_BEGIN_DECLS
/* initialize GST */ /* initialize GST */
void gst_init (int *argc, char **argv[]); void gst_init (int *argc, char **argv[]);
void gst_init_with_popt_table (int *argc, char **argv[], gboolean gst_init_check (int *argc, char **argv[]);
const struct poptOption *popt_options); gboolean gst_init_with_popt_table (int *argc, char **argv[],
const struct poptOption* gst_init_get_popt_table (void); const struct poptOption
*popt_options);
const struct
poptOption* gst_init_get_popt_table (void);
void gst_use_threads (gboolean use_threads); void gst_use_threads (gboolean use_threads);
gboolean gst_has_threads (void); gboolean gst_has_threads (void);
void gst_main (void); void gst_main (void);
void gst_main_quit (void); void gst_main_quit (void);
G_END_DECLS G_END_DECLS