#undef HAVE_LC_MESSAGES
#undef HAVE_STPCPY
-#undef USE_GLIB2
#undef HAVE_LIBXML2
#undef PLUGINS_DIR
-Subproject commit 48638606945e579672f97b09cb797de3e6aee9e7
+Subproject commit c2d7711457d468d527890f2057883c133b50c3b7
AC_SUBST(HTML_DIR)
-AC_CHECK_PROG(HAVE_GTK_DOC, gtkdoc-mkdb, true, false)
+AC_CHECK_PROG(HAVE_GTK_DOC, gtkdoc-scangobj, true, false)
gtk_doc_min_version=0.6
if $HAVE_GTK_DOC ; then
gtk_doc_version=`gtkdoc-mkdb --version`
HAVE_GTK_DOC=false
fi
fi
-GTK_DOC_SCANOBJ=gtkdoc-scanobj
-
+# don't you love undocumented command line options?
+GTK_DOC_SCANOBJ="gtkdoc-scangobj --nogtkinit"
AC_SUBST(HAVE_GTK_DOC)
AC_SUBST(GTK_DOC_SCANOBJ)
dnl ====================================
dnl Check for glib2
-translit(dnm, m, l) AM_CONDITIONAL(USE_GLIB2, true)
-GST_CHECK_FEATURE(GLIB2, [use of glib-2.0 and GObject], , [
- PKG_CHECK_MODULES(GLIB2, glib-2.0 gobject-2.0 gthread-2.0 gmodule-2.0,
- HAVE_GLIB2=yes,HAVE_GLIB2=no)
- GLIB_LIBS=$GLIB2_LIBS
- GLIB_CFLAGS=$GLIB2_CFLAGS
- AC_SUBST(GLIB_LIBS)
- AC_SUBST(GLIB_CFLAGS)
- # glib2 is now the default. so if we don't have it here, then use glib1
- if test "x$HAVE_GLIB2" = "xno"; then
- AC_MSG_WARN([no glib2 found, falling back to glib1])
- fi
-], enabled, [
- AC_DEFINE(USE_GLIB2)
- GST_EXT_CFLAGS="$GST_EXT_CFLAGS -DUSE_GLIB2"
-])
-AC_SUBST(USE_GLIB2)
-
-if test x$USE_GLIB2 = xno; then
- GST_PKG_DEPS="glib >= 1.2.0, gtk+ >= 1.2.0"
-
- dnl Check for glib and gtk
- AM_PATH_GLIB(1.2.0,,
- AC_MSG_ERROR(Cannot find glib: Is glib-config in path?),
- glib gmodule gthread)
- AM_PATH_GTK(1.2.0,,
- AC_MSG_ERROR(Cannot find gtk: Is gtk-config in path?))
- HAVE_GTK=yes
-
- GLIB_LIBS="$GLIB_LIBS $GTK_LIBS"
- GLIB_CFLAGS="$GLIB_CFLAGS $GTK_CFLAGS"
-else
- GST_PKG_DEPS="glib-2.0, gobject-2.0, gmodule-2.0, gthread-2.0"
-
- if $HAVE_GTK_DOC; then
- AC_CHECK_PROG(HAVE_GTK_DOC, gtkdoc-scangobj, true, false)
- if $HAVE_GTK_DOC; then
- # don't you love undocumented command line options?
- GTK_DOC_SCANOBJ="gtkdoc-scangobj --nogtkinit"
- else
- GTK_DOC_SCANOBJ=false
- fi
- fi
+PKG_CHECK_MODULES(GLIB2, glib-2.0 gobject-2.0 gthread-2.0 gmodule-2.0,
+ HAVE_GLIB2=yes,HAVE_GLIB2=no)
+GLIB_LIBS=$GLIB2_LIBS
+GLIB_CFLAGS=$GLIB2_CFLAGS
+AC_SUBST(GLIB_LIBS)
+AC_SUBST(GLIB_CFLAGS)
+
+if test "x$HAVE_GLIB2" = "xno"; then
+ AC_MSG_ERROR([GStreamer requires GLib 2.0 to compile.])
fi
+GST_PKG_DEPS="glib-2.0, gobject-2.0, gmodule-2.0, gthread-2.0"
AC_SUBST(GST_PKG_DEPS)
-
-dnl Check for libxml
-if test x$USE_GLIB2 = xno; then
- LIBXML_PKG=', libxml >= 1.8.1'
- AC_PATH_PROG(XML_CONFIG, xml-config, no)
- if test x$XML_CONFIG = xno; then
- AC_MSG_ERROR(Couldn't find xml-config -- Need version 1.8.1 or better of libxml)
- fi
- XML_LIBS="`xml-config --libs`"
- XML_CFLAGS="`xml-config --cflags`"
- AC_CHECK_LIB(xml, xmlDocGetRootElement, :,
- [ AC_MSG_ERROR(Need version 1.8.1 or better of libxml) ],
- $XML_LIBS)
+
+LIBXML_PKG=', libxml-2.0'
+PKG_CHECK_MODULES(XML, libxml-2.0, HAVE_LIBXML2=yes, HAVE_LIBXML2=no)
+if test "x$HAVE_LIBXML2" = "xyes"; then
+ AC_DEFINE(HAVE_LIBXML2)
else
- LIBXML_PKG=', libxml-2.0'
- PKG_CHECK_MODULES(XML, libxml-2.0, HAVE_LIBXML2=yes, HAVE_LIBXML2=no)
- if test "x$HAVE_LIBXML2" = "xyes"; then
- AC_DEFINE(HAVE_LIBXML2)
- else
- AC_ERROR(Need libxml2 for glib2 builds)
- fi
+ AC_ERROR([Need libxml2 for glib2 builds -- you should be able to do without it -- this needs fixing])
fi
AC_SUBST(LIBXML_PKG)
AC_SUBST(XML_LIBS)
#GST_INSTRUMENT_FLAGS = -finstrument-functions -DGST_ENABLE_FUNC_INSTRUMENTATION
-if USE_GLIB2
-GST_OBJECT_MODEL_SRC = gstmarshal.c
-GST_OBJECT_MODEL_HDR = gstmarshal.h
-else
-GST_OBJECT_MODEL_SRC = gobject2gtk.c
-GST_OBJECT_MODEL_HDR = gobject2gtk.h
-endif
-
if GST_DISABLE_LOADSAVE
GST_LOADSAVE_SRC =
else
GST_TRACE_SRC = gsttrace.c
endif
-EXTRA_libgst_la_SOURCES = gstcpuid_i386.s gstmarshal.list gobject2gtk.c gobject2gtk.h gstxml.c gsttypefind.c gstparse.c gstautoplug.c gsttrace.c
+EXTRA_libgst_la_SOURCES = gstcpuid_i386.s gstmarshal.list gstxml.c gsttypefind.c gstparse.c gstautoplug.c gsttrace.c
SUBDIRS = . types elements $(GST_AUTOPLUG_DIRS) schedulers
DIST_SUBDIRS = types elements autoplug schedulers
libgst_la_SOURCES = \
cothreads.c \
gst.c \
- $(GST_OBJECT_MODEL_SRC) \
+ gstmarshal.c \
gstobject.c \
$(GST_AUTOPLUG_SRC) \
gstbin.c \
$(GST_LOADSAVE_SRC)
-##### Oh this sucks so badly. This isn't funny. #####
-
-# the compiler shoots cothreads.c in the head at -O6
-# FIXME: these manual rules break the dependency generation, so we have a
-# nasty hack here.
-#LTCOMPILE2=$(LTCOMPILE) -O2
-#COMPILE2=$(COMPILE) -O2
-
# FIXME this only lists the x86 arch file, we really should merge them all
cothreads.lo: $(srcdir)/cothreads.c $(srcdir)/cothreads.h $(srcdir)/gst_private.h \
$(top_builddir)/config.h $(srcdir)/gstinfo.c $(srcdir)/gstarch.h
$(top_builddir)/config.h $(srcdir)/gstinfo.c $(srcdir)/gstarch.h
$(COMPILE) -O2 -c $<
-# NOTDEPEND.cothreads.lo: cothreads.c
-# NOTDEPEND $(LTCOMPILE2) -c $<
-# NOTDEPEND.cothreads.o: cothreads.c
-# NOTDEPEND $(COMPILE2) -c $<
-
-#cothreads.lo: cothreads.c
-# @echo '$(LTCOMPILE2) -c $<'; \
-# $(LTCOMPILE2) -Wp,-MD,.deps/$(*F).pp -c $<
-# @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
-# < .deps/$(*F).pp > .deps/$(*F).P; \
-# tr ' ' '\012' < .deps/$(*F).pp \
-# | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
-# >> .deps/$(*F).P; \
-# rm -f .deps/$(*F).pp
-#cothreads.o: cothreads.c
-# @echo '$(COMPILE2) -c $<'; \
-# $(COMPILE2) -Wp,-MD,.deps/$(*F).pp -c $<
-# @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
-# < .deps/$(*F).pp > .deps/$(*F).P; \
-# tr ' ' '\012' < .deps/$(*F).pp \
-# | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
-# >> .deps/$(*F).P; \
-# rm -f .deps/$(*F).pp
-
-##### end immense suckage #####
-
##### Other built sources #####
-if USE_GLIB2
BUILT_SOURCES = gstmarshal.h gstmarshal.c
-else
-BUILT_SOURCES =
-endif
# Generate both marshal files together. Makes dependency work easier.
gstmarshal.h: gstmarshal.list
cothreads.h \
gst.h \
gstconfig.h \
- $(GST_OBJECT_MODEL_HDR) \
+ gstmarshal.h \
gstobject.h \
gsttypes.h \
gstautoplug.h \
$(LIBGST_CFLAGS) \
-D_GNU_SOURCE \
-DG_LOG_DOMAIN=g_log_domain_gstreamer \
- -DGST_CONFIG_DIR=\""$(GST_CONFIG_DIR)"\" \
- -W -Wpointer-arith -Wbad-function-cast \
- -Wcast-align -Wsign-compare \
- -Wmissing-prototypes -Wmissing-declarations \
- -Wnested-externs \
- -Winline -Wno-unused
+ -DGST_CONFIG_DIR=\""$(GST_CONFIG_DIR)"\"
libgst_la_LIBADD = $(LIBGST_LIBS)
if (!g_thread_supported ())
g_thread_init (NULL);
-#ifdef USE_GLIB2
g_type_init();
-#else
- {
- gchar *display;
- /* Only initialise gtk fully if we have an X display.
- * FIXME: this fails if the display is specified differently, eg, by
- * a command line parameter. This is okay though, since this is only
- * a quick hack and should be replaced when we move to gobject.*/
- display = g_getenv("DISPLAY");
- if (display == NULL) {
- gtk_type_init ();
- } else {
- gtk_init (argc,argv);
- }
- }
-#endif
if (!gst_init_check (argc,argv)) {
exit (0); /* FIXME! */
return ret;
}
-#ifdef USE_GLIB2
static GSList *mainloops = NULL;
-#endif
/**
* gst_main:
void
gst_main (void)
{
-#ifdef USE_GLIB2
GMainLoop *loop;
loop = g_main_loop_new (NULL, FALSE);
mainloops = g_slist_prepend (mainloops, loop);
g_main_loop_run (loop);
-#else
- gtk_main ();
-#endif
}
/**
void
gst_main_quit (void)
{
-#ifdef USE_GLIB2
if (!mainloops)
g_warning ("Quit more loops than there are");
else {
mainloops = g_slist_delete_link (mainloops, mainloops);
g_main_loop_quit (loop);
}
-#else
- gtk_main_quit ();
-#endif
}
/**
/* if (element->manager) */
/* xmlNewChild(parent, NULL, "manager", GST_ELEMENT_NAME(element->manager)); */
-#ifdef USE_GLIB2
/* params */
specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (object), &nspecs);
g_value_unset(&value);
}
}
-#endif
pads = GST_ELEMENT_PADS (element);
#include <gst/gstconfig.h>
-#ifdef USE_GLIB2
#include <glib-object.h> /* note that this gets wrapped in __GST_OBJECT_H__ */
#include <gst/gstmarshal.h>
-#else
-#include <gst/gobject2gtk.h>
-#endif
#ifdef HAVE_ATOMIC_H
#include <asm/atomic.h>
void
gst_print_element_args (GString * buf, gint indent, GstElement * element)
{
- gint num_properties;
- gint px;
guint width;
+ GValue value = { 0, }; /* the important thing is that value.type = 0 */
+ gchar *str = 0;
+ GParamSpec *spec, **specs, **walk;
- GParamSpec **property_specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (element),
- &num_properties);
-
+ specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (element), NULL);
+
width = 0;
- for (px = 0; px < num_properties; px++) {
- GParamSpec *param = property_specs[px];
-
- if (width < strlen (param->name))
- width = strlen (param->name);
+ for (walk = specs; *walk; walk++) {
+ spec = *walk;
+ if (width < strlen (spec->name))
+ width = strlen (spec->name);
}
- for (px = 0; px < num_properties; px++) {
- GParamSpec *param = property_specs[px];
- GValue value;
-
- ZERO (value);
-
- g_value_init (&value, param->value_type);
- g_object_get_property (G_OBJECT (element), param->name, &value);
-
- string_append_indent (buf, indent);
- g_string_append (buf, param->name);
- string_append_indent (buf, 2 + width - strlen (param->name));
-
- if (G_IS_PARAM_SPEC_ENUM (param)) {
- GEnumValue *values;
-
-#ifdef USE_GLIB2
- values = G_ENUM_CLASS (g_type_class_ref (param->value_type))->values;
-#else
- values = gtk_type_enum_get_values (param->value_type);
-#endif
-
- g_string_append_printf (buf, "%s (%s)",
- values[g_value_get_enum (&value)].value_nick,
- g_type_name (G_VALUE_TYPE (&value)));
- }
- else {
- switch (G_VALUE_TYPE (&value)) {
- case G_TYPE_STRING:
- g_string_append_printf (buf, "\"%s\"", g_value_get_string (&value));
- break;
- case G_TYPE_BOOLEAN:
- g_string_append (buf, g_value_get_boolean (&value) ? "TRUE" : "FALSE");
- break;
- case G_TYPE_ULONG:{
- gulong val = g_value_get_ulong (&value);
-
- g_string_append_printf (buf, "%lu (0x%lx)", val, val);
- break;
- }
- case G_TYPE_LONG:{
- glong val = g_value_get_long (&value);
-
- g_string_append_printf (buf, "%ld (0x%lx)", val, val);
- break;
- }
- case G_TYPE_UINT:{
- guint val = g_value_get_uint (&value);
-
- g_string_append_printf (buf, "%u (0x%x)", val, val);
- break;
- }
- case G_TYPE_INT:{
- gint val = g_value_get_int (&value);
-
- g_string_append_printf (buf, "%d (0x%x)", val, val);
- break;
- }
- case G_TYPE_FLOAT:
- g_string_append_printf (buf, "%f", g_value_get_float (&value));
- break;
- case G_TYPE_DOUBLE:
- g_string_append_printf (buf, "%f", g_value_get_double (&value));
- break;
- default:
- g_string_append_printf (buf, "unknown value_type %d", G_VALUE_TYPE (&value));
- break;
- }
+ for (walk = specs; *walk; walk++) {
+ spec = *walk;
+
+ if (spec->flags & G_PARAM_READABLE) {
+ g_value_init(&value, G_PARAM_SPEC_VALUE_TYPE (spec));
+ g_object_get_property (G_OBJECT (element), spec->name, &value);
+ str = g_strdup_value_contents (&value);
+ g_value_unset(&value);
+ } else {
+ str = g_strdup ("Parameter not readable.");
}
+ string_append_indent (buf, indent);
+ g_string_append (buf, spec->name);
+ string_append_indent (buf, 2 + width - strlen (spec->name));
+ g_string_append (buf, str);
g_string_append_c (buf, '\n');
-
- if (G_VALUE_TYPE (&value)) {
- g_value_unset (&value);
- }
+
+ g_free (str);
}
- g_free (property_specs);
+
+ g_free (specs);
}
/**
GEnumValue *values;
gint j;
-#ifdef USE_GLIB2
values = G_ENUM_CLASS (g_type_class_ref (param->value_type))->values;
-#else
- values = gtk_type_enum_get_values (param->value_type);
-#endif
for (j=0;values[j].value_name;j++) {
gchar *value = g_strdup_printf("%d",values[j].value);
optionnode = xmlNewChild (argnode, NULL, "option", value);
printf("Enum \"%s\" (default %d)", g_type_name (G_VALUE_TYPE (&value)),
g_value_get_enum (&value));
-#ifdef USE_GLIB2
values = G_ENUM_CLASS (g_type_class_ref (param->value_type))->values;
-#else
- values = gtk_type_enum_get_values (param->value_type);
-#endif
+
while (values[j].value_name) {
printf("\n (%d): \t%s", values[j].value, values[j].value_nick);
j++;
guint *signals;
guint nsignals;
gint i;
-#ifdef USE_GLIB2
GSignalQuery *query;
-#else
- GtkSignalQuery *query;
-#endif
printf("\nElement Signals:\n");
const GType *param_types;
gint j;
-#ifdef USE_GLIB2
query = g_new0(GSignalQuery,1);
g_signal_query (signals[i], query);
n_params = query->n_params;
return_type = query->return_type;
param_types = query->param_types;
-#else
- query = gtk_signal_query (signals[i]);
- n_params = query->nparams;
- return_type = query->return_val;
- param_types = query->params;
-#endif
printf (" \"%s\" :\t %s user_function (%s* object, \n", query->signal_name, g_type_name (return_type),
g_type_name (G_OBJECT_TYPE (element)));
return busy;
}
-/* TODO: write more outputs for ParamSpecs*/
static void
property_change_callback (GObject *object, GstObject *orig, GParamSpec *pspec)
{
-#ifdef USE_GLIB2
- if (G_IS_PARAM_SPEC_STRING (pspec))
- {
- gchar *str;
- g_object_get (orig, pspec->name, &str, NULL);
- g_print ("%s: %s = \"%s\"\n", GST_OBJECT_NAME (orig), pspec->name, str);
+ GValue value = { 0, }; /* the important thing is that value.type = 0 */
+ gchar *str = 0;
+
+ if (pspec->flags & G_PARAM_READABLE) {
+ g_value_init(&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
+ g_object_get_property (G_OBJECT (orig), pspec->name, &value);
+ str = g_strdup_value_contents (&value);
+ g_print ("%s: %s = %s\n", GST_OBJECT_NAME (orig), pspec->name, str);
g_free (str);
- } else if (G_IS_PARAM_SPEC_CHAR (pspec)) {
- gchar str;
- g_object_get (orig, pspec->name, &str, NULL);
- g_print ("%s: %s = \"%c\"\n", GST_OBJECT_NAME (orig), pspec->name, str);
- } else if (G_IS_PARAM_SPEC_INT (pspec)) {
- gint i;
- g_object_get (orig, pspec->name, &i, NULL);
- g_print ("%s: %s = %d\n", GST_OBJECT_NAME (orig), pspec->name, i);
- } else if (G_IS_PARAM_SPEC_INT64 (pspec)) {
- gint64 i;
- g_object_get (orig, pspec->name, &i, NULL);
- g_print ("%s: %s = %lld\n", GST_OBJECT_NAME (orig), pspec->name, i);
- } else if (G_IS_PARAM_SPEC_UINT (pspec)) {
- guint i;
- g_object_get (orig, pspec->name, &i, NULL);
- g_print ("%s: %s = %u\n", GST_OBJECT_NAME (orig), pspec->name, i);
- } else if (G_IS_PARAM_SPEC_UINT (pspec)) {
- guint64 i;
- g_object_get (orig, pspec->name, &i, NULL);
- g_print ("%s: %s = %llu\n", GST_OBJECT_NAME (orig), pspec->name, i);
- } else if (G_IS_PARAM_SPEC_ENUM (pspec)) {
- guint64 i;
- g_object_get (orig, pspec->name, &i, NULL);
- g_print ("%s: %s = \"%llu\"\n", GST_OBJECT_NAME (orig), pspec->name, i);
- } else if (G_IS_PARAM_SPEC_FLOAT (pspec)) {
- gfloat i;
- g_object_get (orig, pspec->name, &i, NULL);
- g_print ("%s: %s = %f\n", GST_OBJECT_NAME (orig), pspec->name, i);
- } else if (G_IS_PARAM_SPEC_DOUBLE (pspec)) {
- gdouble i;
- g_object_get (orig, pspec->name, &i, NULL);
- g_print ("%s: %s = %f\n", GST_OBJECT_NAME (orig), pspec->name, i);
+ g_value_unset(&value);
} else {
- g_print ("%s: changed \"%s\"\n", GST_OBJECT_NAME (orig), pspec->name);
- }
-#endif /* USE_GLIB2 */
-}
-
-static void
-print_props (gpointer data, gpointer user_data)
-{
- GstPropsEntry *entry = (GstPropsEntry *)data;
- GstElement *element = GST_ELEMENT (user_data);
-
- g_print ("deprecated: %s: %s: ", gst_element_get_name (element),
- g_quark_to_string (entry->propid));
- switch (entry->propstype) {
- case GST_PROPS_INT_ID:
- g_print ("%d\n", entry->data.int_data);
- break;
- case GST_PROPS_STRING_ID:
- g_print ("%s\n", entry->data.string_data.string);
- break;
- case GST_PROPS_FLOAT_ID:
- g_print ("%f\n", entry->data.float_data);
- break;
- default:
- g_print ("unknown\n");
- }
-}
-
-static void
-event_func (GstElement *element, GstEvent *event)
-{
- GstProps *props;
-
- if (event == NULL)
- return;
-
- if (GST_EVENT_TYPE (event) == GST_EVENT_INFO) {
- props = GST_EVENT_INFO_PROPS (event);
-
- g_list_foreach (props->properties, print_props, GST_EVENT_SRC (event));
+ g_warning ("Parameter not readable. What's up with that?");
}
}
static GstElement*
-xmllaunch_parse_cmdline (const gchar *argv[])
+xmllaunch_parse_cmdline (const gchar **argv)
{
GstElement *pipeline = NULL, *e;
GstXML *xml;
gint i = 0;
if (!(arg = argv[0])) {
- g_print ("usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n", arg[0]);
+ g_print ("usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n");
exit (1);
}
exit(1);
}
- g_signal_connect (G_OBJECT (pipeline), "event", G_CALLBACK (event_func), NULL);
-
g_signal_connect (pipeline, "deep_notify", G_CALLBACK (property_change_callback), NULL);
#ifndef GST_DISABLE_LOADSAVE