mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-06-03 05:59:44 +00:00
7ccc2cf90b
Original commit message from CVS: Externalized the plugin information in /etc/gstreamer/reg.xml - no need to do a plugin_load_all() - plugins are loaded when needed - typedetect functions are loaded when needed (still buggy) - no need to check for the existance of the plugin in the codecs - added gstreamer-register to create the reg.xml file - renamed launch to gstreamer-launch - plugins need to register the typefactory they provide modified the plugins to meet the new design modified the plugins to correctly set their pad types autoplugging can be done without loading the plugins now
120 lines
3.4 KiB
C
120 lines
3.4 KiB
C
#include <glib.h>
|
|
#include <gst/gst.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
typedef struct _launch_delayed_pad launch_delayed_pad;
|
|
struct _launch_delayed_pad {
|
|
gchar *name;
|
|
GstPad *peer;
|
|
};
|
|
|
|
void launch_newpad(GstElement *element,GstPad *pad,launch_delayed_pad *peer) {
|
|
gst_info("have NEW_PAD signal\n");
|
|
// if it matches, connect it
|
|
if (!strcmp(gst_pad_get_name(pad),peer->name)) {
|
|
gst_pad_connect(pad,peer->peer);
|
|
gst_info("delayed connect of '%s' to '%s'\n",
|
|
gst_pad_get_name(pad),gst_pad_get_name(peer->peer));
|
|
}
|
|
}
|
|
|
|
void parse(int argc,char *argv[],GstElement *parent,gint offset,gchar endchar) {
|
|
gint i = offset;
|
|
gchar *plugin;
|
|
GstElement *element = NULL, *prevelement;
|
|
GstPad *prevpad = NULL,*nextpad;
|
|
gchar *prevpadname = NULL,*nextpadname = NULL;
|
|
gchar *ptr;
|
|
gint len;
|
|
launch_delayed_pad *delayed;
|
|
|
|
gst_info("at offset %d, argc is %d\n",i,argc);
|
|
|
|
// loop through all the arguments
|
|
while (i < argc) {
|
|
// first is the plugin name
|
|
plugin = argv[i++];
|
|
gst_info("plugin is \"%s\"\n",plugin);
|
|
// record previous element
|
|
prevelement = element;
|
|
// create the element and add it to the parent
|
|
element = gst_elementfactory_make(plugin,plugin);
|
|
gst_bin_add(GST_BIN(parent),element);
|
|
// connect it to the previous if there is one
|
|
if (nextpadname != NULL) {
|
|
// grab the pad of this element
|
|
nextpad = gst_element_get_pad(element,nextpadname);
|
|
g_return_if_fail(nextpad != NULL);
|
|
// check to see if the pad exists yet, connect it if it does
|
|
if (prevpad != NULL) {
|
|
gst_pad_connect(prevpad,nextpad);
|
|
gst_info("wired '%s' to '%s'\n",
|
|
gst_pad_get_name(prevpad),gst_pad_get_name(nextpad));
|
|
}
|
|
// otherwise we have to attach and wait for it to show
|
|
else {
|
|
delayed = g_new0(launch_delayed_pad,1);
|
|
delayed->name = prevpadname;
|
|
delayed->peer = nextpad;
|
|
gtk_signal_connect(GTK_OBJECT(prevelement),"new_pad",
|
|
launch_newpad,delayed);
|
|
}
|
|
}
|
|
// then come all the other things
|
|
while (i < argc) {
|
|
// snag the length in advance;
|
|
len = strlen(argv[i]);
|
|
// if it's just a connection, pick the 'src' pad and move on
|
|
if ((ptr = strchr(argv[i],'|')) != 0) {
|
|
// if there's a previous pad name
|
|
if (ptr != argv[i]) {
|
|
ptr[0] = '\0';
|
|
prevpadname = argv[i];
|
|
prevpad = gst_element_get_pad(element,prevpadname);
|
|
} else
|
|
prevpad = gst_element_get_pad(element,"src");
|
|
// if there's a next pad name
|
|
if (((ptr - argv[i]) + 1) < len) {
|
|
nextpadname = ptr + 1;
|
|
} else
|
|
nextpadname = "sink";
|
|
i++;
|
|
break;
|
|
} else {
|
|
gst_info("have unknown argument '%s'\n",argv[i]);
|
|
gtk_object_set(GTK_OBJECT(element),"location",argv[i],NULL);
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int main(int argc,char *argv[]) {
|
|
int t;
|
|
GstElement *pipeline;
|
|
|
|
gst_init(&argc,&argv);
|
|
gst_plugin_load_all();
|
|
|
|
gst_info("\n\n");
|
|
|
|
pipeline = gst_elementfactory_make("thread","launch");
|
|
if ((t = atoi(argv[1])))
|
|
parse(argc,argv,pipeline,2,0);
|
|
else
|
|
parse(argc,argv,pipeline,1,0);
|
|
|
|
xmlSaveFile("launch.xml",gst_xml_write(pipeline));
|
|
|
|
gst_element_set_state(pipeline,GST_STATE_READY);
|
|
gst_element_set_state(pipeline,GST_STATE_PLAYING);
|
|
|
|
if (t)
|
|
sleep(t);
|
|
else
|
|
sleep(5);
|
|
|
|
return 1;
|
|
}
|