2000-01-30 10:44:33 +00:00
|
|
|
#include <glib.h>
|
|
|
|
#include <gst/gst.h>
|
2001-01-09 04:39:35 +00:00
|
|
|
#include <gst/gstparse.h>
|
2000-08-28 20:20:55 +00:00
|
|
|
#include <string.h>
|
|
|
|
#include <stdlib.h>
|
2000-01-30 10:44:33 +00:00
|
|
|
|
2001-12-14 18:11:52 +00:00
|
|
|
static int launch_argc;
|
2001-06-02 18:26:25 +00:00
|
|
|
static char **launch_argv;
|
|
|
|
|
2001-07-05 21:53:30 +00:00
|
|
|
#ifndef USE_GLIB2
|
|
|
|
GtkWidget *window;
|
|
|
|
GtkWidget *gtk_socket;
|
|
|
|
#endif
|
2001-06-02 18:26:25 +00:00
|
|
|
|
2001-06-04 21:02:01 +00:00
|
|
|
typedef void (*found_handler) (GstElement *element, gint xid, void *priv);
|
2001-06-02 18:26:25 +00:00
|
|
|
|
|
|
|
void
|
|
|
|
arg_search (GstBin *bin, gchar *argname, found_handler handler, void *priv)
|
|
|
|
{
|
|
|
|
GList *children;
|
|
|
|
gchar *ccargname;
|
|
|
|
|
|
|
|
ccargname = g_strdup_printf("::%s",argname);
|
|
|
|
|
|
|
|
children = gst_bin_get_list(bin);
|
|
|
|
|
2001-07-05 21:53:30 +00:00
|
|
|
#ifndef USE_GLIB2
|
2001-06-02 18:26:25 +00:00
|
|
|
while (children) {
|
2001-06-04 21:02:01 +00:00
|
|
|
GstElement *child;
|
|
|
|
|
|
|
|
child = GST_ELEMENT (children->data);
|
|
|
|
children = g_list_next (children);
|
2001-06-02 18:26:25 +00:00
|
|
|
|
2001-06-04 21:02:01 +00:00
|
|
|
if (GST_IS_BIN (child)) arg_search (GST_BIN (child), argname, handler, priv);
|
2001-06-02 18:26:25 +00:00
|
|
|
else {
|
2001-06-04 21:02:01 +00:00
|
|
|
GtkType type;
|
|
|
|
|
|
|
|
type = GTK_OBJECT_TYPE (child);
|
|
|
|
|
2001-06-02 18:26:25 +00:00
|
|
|
while (type != GTK_TYPE_INVALID) {
|
2001-06-04 21:02:01 +00:00
|
|
|
GtkArg *args;
|
|
|
|
guint32 *flags;
|
|
|
|
guint num_args,i;
|
|
|
|
|
2001-06-02 18:26:25 +00:00
|
|
|
args = gtk_object_query_args(type,&flags,&num_args);
|
2001-06-04 21:02:01 +00:00
|
|
|
|
2001-06-02 18:26:25 +00:00
|
|
|
for (i=0;i<num_args;i++) {
|
2001-06-04 21:02:01 +00:00
|
|
|
if (strstr(args[i].name,ccargname)) {
|
|
|
|
(handler)(child, gst_util_get_int_arg (GTK_OBJECT (child), argname) ,priv);
|
|
|
|
}
|
2001-06-02 18:26:25 +00:00
|
|
|
}
|
|
|
|
type = gtk_type_parent(type);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2001-06-25 01:20:11 +00:00
|
|
|
#endif
|
2001-06-02 18:26:25 +00:00
|
|
|
|
|
|
|
g_free(ccargname);
|
|
|
|
}
|
|
|
|
|
2001-07-23 00:57:06 +00:00
|
|
|
gboolean
|
|
|
|
idle_func (gpointer data)
|
|
|
|
{
|
2001-10-17 10:21:27 +00:00
|
|
|
if (!gst_bin_iterate (GST_BIN (data))) {
|
2001-12-14 18:11:52 +00:00
|
|
|
gst_main_quit ();
|
2001-12-04 22:12:50 +00:00
|
|
|
g_print ("iteration ended\n");
|
2001-10-17 10:21:27 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
return TRUE;
|
2001-07-23 00:57:06 +00:00
|
|
|
}
|
|
|
|
|
2001-06-04 21:02:01 +00:00
|
|
|
void
|
|
|
|
handle_have_size (GstElement *element,int width,int height)
|
|
|
|
{
|
2001-07-05 21:53:30 +00:00
|
|
|
#ifndef USE_GLIB2
|
|
|
|
gtk_widget_set_usize(gtk_socket,width,height);
|
|
|
|
gtk_widget_show_all(window);
|
|
|
|
#endif
|
2001-06-02 18:26:25 +00:00
|
|
|
}
|
|
|
|
|
2001-06-04 21:02:01 +00:00
|
|
|
void
|
|
|
|
xid_handler (GstElement *element, gint xid, void *priv)
|
|
|
|
{
|
2001-07-05 21:53:30 +00:00
|
|
|
#ifndef USE_GLIB2
|
2001-06-02 18:26:25 +00:00
|
|
|
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
2001-06-04 21:02:01 +00:00
|
|
|
|
2001-06-02 18:26:25 +00:00
|
|
|
gtk_socket = gtk_socket_new ();
|
|
|
|
gtk_widget_show(gtk_socket);
|
2001-06-04 21:02:01 +00:00
|
|
|
|
|
|
|
gtk_container_add(GTK_CONTAINER(window),gtk_socket);
|
|
|
|
|
2001-06-02 18:26:25 +00:00
|
|
|
gtk_widget_realize(gtk_socket);
|
|
|
|
gtk_socket_steal (GTK_SOCKET (gtk_socket), xid);
|
2001-06-04 21:02:01 +00:00
|
|
|
|
2001-06-02 18:26:25 +00:00
|
|
|
gtk_object_set(GTK_OBJECT(window),"allow_grow",TRUE,NULL);
|
|
|
|
gtk_object_set(GTK_OBJECT(window),"allow_shrink",TRUE,NULL);
|
|
|
|
|
|
|
|
gtk_signal_connect (GTK_OBJECT (element), "have_size",
|
|
|
|
GTK_SIGNAL_FUNC (handle_have_size), element);
|
2001-06-25 01:20:11 +00:00
|
|
|
#endif
|
2001-06-02 18:26:25 +00:00
|
|
|
}
|
|
|
|
|
2001-01-21 16:06:42 +00:00
|
|
|
int
|
|
|
|
main(int argc, char *argv[])
|
|
|
|
{
|
2001-01-09 04:39:35 +00:00
|
|
|
GstElement *pipeline;
|
2000-12-31 10:46:16 +00:00
|
|
|
char **argvn;
|
|
|
|
gchar *cmdline;
|
2001-05-20 20:06:09 +00:00
|
|
|
int i;
|
2001-06-19 10:34:15 +00:00
|
|
|
gboolean save_pipeline = FALSE;
|
|
|
|
gboolean run_pipeline = TRUE;
|
|
|
|
gchar *savefile = "";
|
2001-01-09 04:39:35 +00:00
|
|
|
|
2001-12-14 14:28:27 +00:00
|
|
|
free (malloc (8)); /* -lefence */
|
|
|
|
|
2001-01-21 16:06:42 +00:00
|
|
|
gst_init (&argc, &argv);
|
|
|
|
|
2001-06-19 10:34:15 +00:00
|
|
|
if (argc >= 3 && !strcmp(argv[1], "-o")) {
|
|
|
|
save_pipeline = TRUE;
|
|
|
|
run_pipeline = FALSE;
|
|
|
|
savefile = argv[2];
|
|
|
|
argv[2] = argv[0];
|
|
|
|
argv+=2;
|
|
|
|
argc-=2;
|
|
|
|
}
|
|
|
|
|
2001-06-02 18:26:25 +00:00
|
|
|
launch_argc = argc;
|
|
|
|
launch_argv = argv;
|
|
|
|
|
2001-01-21 16:06:42 +00:00
|
|
|
pipeline = gst_pipeline_new ("launch");
|
2000-12-31 10:46:16 +00:00
|
|
|
|
2001-12-14 20:56:51 +00:00
|
|
|
/* make a null-terminated version of argv */
|
2001-01-21 16:06:42 +00:00
|
|
|
argvn = g_new0 (char *,argc);
|
|
|
|
memcpy (argvn, argv+1, sizeof (char*) * (argc-1));
|
2001-05-20 20:06:09 +00:00
|
|
|
|
2001-12-14 20:56:51 +00:00
|
|
|
/* escape spaces */
|
2001-05-20 20:06:09 +00:00
|
|
|
for (i=0; i<argc-1; i++) {
|
|
|
|
gchar **split;
|
|
|
|
|
|
|
|
split = g_strsplit (argvn[i], " ", 0);
|
|
|
|
|
|
|
|
argvn[i] = g_strjoinv ("\\ ", split);
|
|
|
|
g_strfreev (split);
|
|
|
|
}
|
2001-12-14 20:56:51 +00:00
|
|
|
/* join the argvs together */
|
2001-01-21 16:06:42 +00:00
|
|
|
cmdline = g_strjoinv (" ", argvn);
|
2001-12-14 20:56:51 +00:00
|
|
|
/* free the null-terminated argv */
|
2001-01-21 16:06:42 +00:00
|
|
|
g_free (argvn);
|
2000-12-31 10:46:16 +00:00
|
|
|
|
2001-12-14 20:56:51 +00:00
|
|
|
/* fail if there are no pipes in it (needs pipes for a pipeline */
|
2001-06-02 18:26:25 +00:00
|
|
|
if (!strchr(cmdline,'!')) {
|
|
|
|
fprintf(stderr,"ERROR: no pipeline description found on commandline\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2001-10-27 13:44:18 +00:00
|
|
|
if (gst_parse_launch (cmdline, GST_BIN (pipeline)) < 0){
|
|
|
|
fprintf(stderr,"ERROR: pipeline description could not be parsed\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
2000-12-31 10:46:16 +00:00
|
|
|
|
2001-10-17 10:21:27 +00:00
|
|
|
#ifndef GST_DISABLE_LOADSAVE
|
2001-06-19 10:34:15 +00:00
|
|
|
if (save_pipeline) {
|
|
|
|
xmlSaveFile (savefile, gst_xml_write (pipeline));
|
|
|
|
}
|
2001-10-17 10:21:27 +00:00
|
|
|
#endif
|
2001-06-19 10:34:15 +00:00
|
|
|
if (run_pipeline) {
|
|
|
|
arg_search(GST_BIN(pipeline),"xid",xid_handler,NULL);
|
2001-04-15 22:54:57 +00:00
|
|
|
|
2001-06-19 10:34:15 +00:00
|
|
|
fprintf(stderr,"RUNNING pipeline\n");
|
2001-12-12 18:31:25 +00:00
|
|
|
if (gst_element_set_state (pipeline, GST_STATE_PLAYING) != GST_STATE_SUCCESS) {
|
|
|
|
fprintf(stderr,"pipeline doesn't want to play\n");
|
|
|
|
exit (-1);
|
|
|
|
}
|
2001-01-21 16:06:42 +00:00
|
|
|
|
2001-12-14 18:11:52 +00:00
|
|
|
g_idle_add (idle_func, pipeline);
|
|
|
|
gst_main ();
|
2001-01-04 10:47:39 +00:00
|
|
|
|
2001-06-19 10:34:15 +00:00
|
|
|
gst_element_set_state (pipeline, GST_STATE_NULL);
|
|
|
|
}
|
2000-08-28 20:20:55 +00:00
|
|
|
|
2000-09-09 16:36:10 +00:00
|
|
|
return 0;
|
2000-01-30 10:44:33 +00:00
|
|
|
}
|