added check to make sure there's a pipeline desc before building
Original commit message from CVS:
added check to make sure there's a pipeline desc before building
diff --git a/tools/gstreamer-launch.c b/tools/gstreamer-launch.c
index 152d0de..e818815 100644
--- a/tools/gstreamer-launch.c
+++ b/tools/gstreamer-launch.c
@@ -4,6 +4,88 @@
#include <string.h>
#include <stdlib.h>
+static int launch_argc;
+static char **launch_argv;
+int xid = 0;
+
+GtkWidget *window;
+GtkWidget *hbox;
+GtkWidget *gtk_socket;
+
+
+typedef void (*found_handler) (GstElement *element, GtkArg *arg, void *priv);
+
+void
+arg_search (GstBin *bin, gchar *argname, found_handler handler, void *priv)
+{
+ GList *children;
+ GstElement *child;
+ GtkType type;
+ GtkArg *args;
+ guint32 *flags;
+ guint num_args,i;
+ gchar *ccargname;
+
+ ccargname = g_strdup_printf("::%s",argname);
+
+ children = gst_bin_get_list(bin);
+
+ while (children) {
+ child = GST_ELEMENT(children->data);
+ children = g_list_next(children);
+// fprintf(stderr,"have child \"%s\"\n",gst_object_get_path_string(GST_OBJECT(child)));
+
+ if (GST_IS_BIN(child)) arg_search(GST_BIN(child),argname,handler,priv);
+ else {
+ type = GTK_OBJECT_TYPE(child);
+ while (type != GTK_TYPE_INVALID) {
+ args = gtk_object_query_args(type,&flags,&num_args);
+ for (i=0;i<num_args;i++) {
+//fprintf(stderr,"arg is \"%s\"\n",args[i].name);
+ if (strstr(args[i].name,ccargname))
+ (handler)(child,&args[i],priv);
+ }
+ type = gtk_type_parent(type);
+ }
+ }
+ }
+
+ g_free(ccargname);
+}
+
+void handle_have_size(GstElement *element,int width,int height) {
+ fprintf(stderr,"have size from xvideosink: %dx%d\n",width,height);
+ gtk_widget_set_usize(gtk_socket,width,height);
+}
+
+void xid_handler(GstElement *element, GtkArg *arg, void *priv) {
+ fprintf(stderr,"have xid\n");
+
+ xid = GTK_VALUE_INT(*arg);
+
+ window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ hbox = gtk_hbox_new(TRUE,10);
+ gtk_socket = gtk_socket_new ();
+ gtk_widget_set_usize(gtk_socket,720,480);
+ gtk_widget_show(gtk_socket);
+ gtk_container_add(GTK_CONTAINER(window),hbox);
+ gtk_box_pack_end(GTK_BOX(hbox),gtk_socket,TRUE,TRUE,0);
+ gtk_widget_realize(gtk_socket);
+ gtk_socket_steal (GTK_SOCKET (gtk_socket), xid);
+ gtk_object_set(GTK_OBJECT(window),"allow_grow",TRUE,NULL);
+ gtk_object_set(GTK_OBJECT(window),"allow_shrink",TRUE,NULL);
+ gtk_widget_show_all(window);
+
+ gtk_signal_connect (GTK_OBJECT (element), "have_size",
+ GTK_SIGNAL_FUNC (handle_have_size), element);
+}
+
+gboolean
+idle_func (gpointer data)
+{
+ return gst_bin_iterate (GST_BIN (data));
+}
+
int
main(int argc, char *argv[])
{
@@ -14,6 +96,9 @@
gst_init (&argc, &argv);
+ launch_argc = argc;
+ launch_argv = argv;
+
pipeline = gst_pipeline_new ("launch");
// make a null-terminated version of argv
@@ -34,14 +119,28 @@
// free the null-terminated argv
g_free (argvn);
+ // fail if there are no pipes in it (needs pipes for a pipeline
+ if (!strchr(cmdline,'!')) {
+ fprintf(stderr,"ERROR: no pipeline description found on commandline\n");
+ exit(1);
+ }
+
gst_parse_launch (cmdline, GST_BIN (pipeline));
- xmlSaveFile("gstreamer-launch.gst",gst_xml_write(pipeline));
+ arg_search(GST_BIN(pipeline),"xid",xid_handler,NULL);
+
+// xmlSaveFile("gstreamer-launch.gst",gst_xml_write(pipeline));
fprintf(stderr,"RUNNING pipeline\n");
gst_element_set_state (pipeline, GST_STATE_PLAYING);
- while (gst_bin_iterate (GST_BIN (pipeline)));
+// if (have_window) {
+ gtk_idle_add(idle_func,pipeline);
+fprintf(stderr,"going into gtk_main()\n");
+ gtk_main();
+// } else {
+// while (gst_bin_iterate (GST_BIN (pipeline)));
+// }
gst_element_set_state (pipeline, GST_STATE_NULL);