mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-26 19:51:11 +00:00
fix up autoplug test a little
Original commit message from CVS: fix up autoplug test a little
This commit is contained in:
parent
5c1230f6d1
commit
ec02fff666
1 changed files with 79 additions and 55 deletions
|
@ -3,7 +3,53 @@
|
|||
|
||||
GstElement *pipeline, *src, *autobin, *cache, *typefind, *decoder, *sink;
|
||||
|
||||
void cache_empty(GstElement *element, gpointer private) {
|
||||
/* callback for when we have the type of the file
|
||||
* we set up a playing pipeline based on the mime type
|
||||
*/
|
||||
void
|
||||
have_type (GstElement *element, GstCaps *caps, GstCaps **private_caps)
|
||||
{
|
||||
gchar *mime = g_strdup_printf (gst_caps_get_mime (caps));
|
||||
fprintf (stderr, "have caps, mime type is %s\n", mime);
|
||||
|
||||
gst_element_set_state (pipeline, GST_STATE_PAUSED);
|
||||
|
||||
/* disconnect the typefind from the pipeline and remove it,
|
||||
* since we now know what the type is */
|
||||
gst_element_disconnect (cache, typefind);
|
||||
gst_bin_remove (GST_BIN (autobin), typefind);
|
||||
|
||||
gst_scheduler_show (GST_ELEMENT_SCHED (pipeline));
|
||||
|
||||
/* now based on the mime type set up the pipeline properly */
|
||||
if (strstr (mime, "mp3")) {
|
||||
decoder = gst_element_factory_make ("mad", "decoder");
|
||||
}
|
||||
else if (strstr (mime, "x-ogg")) {
|
||||
decoder = gst_element_factory_make ("vorbisfile", "decoder");
|
||||
}
|
||||
else {
|
||||
g_print ("mime type %s not handled in this program, exiting.\n", mime);
|
||||
g_free (mime);
|
||||
exit (-1);
|
||||
}
|
||||
g_free (mime);
|
||||
|
||||
/* handle playback */
|
||||
sink = gst_element_factory_make ("osssink", "sink");
|
||||
gst_bin_add (GST_BIN (autobin), decoder);
|
||||
gst_bin_add (GST_BIN (autobin), sink);
|
||||
gst_element_connect (decoder, sink);
|
||||
|
||||
g_object_set (G_OBJECT (cache), "reset", TRUE, NULL);
|
||||
|
||||
gst_element_connect (cache, decoder);
|
||||
|
||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||
fprintf (stderr, "done with have_type signal, playing\n");
|
||||
}
|
||||
|
||||
void cache_empty (GstElement *element, gpointer private) {
|
||||
fprintf(stderr,"have cache empty\n");
|
||||
|
||||
gst_element_set_state (pipeline, GST_STATE_PAUSED);
|
||||
|
@ -23,70 +69,48 @@ void cache_empty(GstElement *element, gpointer private) {
|
|||
fprintf(stderr,"done with cache_empty\n");
|
||||
}
|
||||
|
||||
void have_type(GstElement *element, GstCaps *caps, GstCaps **private_caps) {
|
||||
fprintf(stderr,"have caps, mime type is %s\n",gst_caps_get_mime(caps));
|
||||
|
||||
gst_element_set_state (pipeline, GST_STATE_PAUSED);
|
||||
|
||||
/* disconnect the typefind from the pipeline and remove it */
|
||||
gst_element_disconnect(cache,typefind);
|
||||
gst_bin_remove(GST_BIN(autobin),typefind);
|
||||
|
||||
gst_scheduler_show (GST_ELEMENT_SCHED(pipeline));
|
||||
|
||||
if (strstr(gst_caps_get_mime(caps),"mp3")) {
|
||||
decoder = gst_element_factory_make ("mad","decoder");
|
||||
sink = gst_element_factory_make ("osssink","sink");
|
||||
gst_bin_add(GST_BIN(autobin),decoder);
|
||||
gst_bin_add(GST_BIN(autobin),sink);
|
||||
gst_element_connect_pads(decoder,"src",sink,"sink");
|
||||
|
||||
g_object_set (G_OBJECT(cache), "reset", TRUE, NULL);
|
||||
|
||||
gst_element_connect_pads(cache,"src",decoder,"sink");
|
||||
}
|
||||
else if (strstr(gst_caps_get_mime(caps),"x-ogg")) {
|
||||
decoder = gst_element_factory_make ("vorbisdec","decoder");
|
||||
sink = gst_element_factory_make ("osssink","sink");
|
||||
gst_bin_add(GST_BIN(autobin),decoder);
|
||||
gst_bin_add(GST_BIN(autobin),sink);
|
||||
gst_element_connect_pads(decoder,"src",sink,"sink");
|
||||
|
||||
g_object_set (G_OBJECT(cache), "reset", TRUE, NULL);
|
||||
|
||||
gst_element_connect_pads(cache,"src",decoder,"sink");
|
||||
}
|
||||
|
||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||
fprintf(stderr,"done with have_type signal\n");
|
||||
}
|
||||
|
||||
int main (int argc,char *argv[]) {
|
||||
GstCaps *caps;
|
||||
|
||||
gst_init(&argc,&argv);
|
||||
gst_init (&argc, &argv);
|
||||
|
||||
pipeline = gst_pipeline_new("pipeline");
|
||||
pipeline = gst_pipeline_new ("pipeline");
|
||||
src = gst_element_factory_make ("filesrc","src");
|
||||
g_object_set(G_OBJECT(src),"location",argv[1],NULL);
|
||||
gst_bin_add (GST_BIN(pipeline),src);
|
||||
if (argc < 2) {
|
||||
g_print ("Please give a file to test the autoplugger on.\n");
|
||||
return -1;
|
||||
}
|
||||
g_object_set (G_OBJECT (src), "location", argv[1], NULL);
|
||||
gst_bin_add (GST_BIN (pipeline), src);
|
||||
|
||||
autobin = gst_bin_new("autobin");
|
||||
cache = gst_element_factory_make ("autoplugcache","cache");
|
||||
g_signal_connect (G_OBJECT(cache),"cache_empty",(GCallback)cache_empty,NULL);
|
||||
/* the autobin will be used to do the autoplugging in */
|
||||
autobin = gst_bin_new ("autobin");
|
||||
|
||||
/* a cache is used to make autoplugging quicker */
|
||||
cache = gst_element_factory_make ("autoplugcache", "cache");
|
||||
g_signal_connect (G_OBJECT (cache), "cache_empty",
|
||||
G_CALLBACK (cache_empty), NULL);
|
||||
/* typefind does the type detection */
|
||||
typefind = gst_element_factory_make ("typefind", "typefind");
|
||||
g_signal_connect (G_OBJECT(typefind),"have_type",(GCallback)have_type,&caps);
|
||||
gst_bin_add (GST_BIN(autobin),cache);
|
||||
gst_bin_add (GST_BIN(autobin),typefind);
|
||||
gst_element_connect_pads (cache,"src",typefind,"sink");
|
||||
gst_element_add_ghost_pad(autobin,gst_element_get_pad(cache,"sink"),"sink");
|
||||
|
||||
gst_bin_add (GST_BIN(pipeline), autobin);
|
||||
gst_element_connect_pads (src,"src",autobin,"sink");
|
||||
/* execute the callback when we find the type */
|
||||
g_signal_connect (G_OBJECT (typefind), "have_type",
|
||||
G_CALLBACK (have_type), &caps);
|
||||
gst_bin_add (GST_BIN (autobin), cache);
|
||||
gst_bin_add (GST_BIN (autobin), typefind);
|
||||
gst_element_connect (cache, typefind);
|
||||
gst_element_add_ghost_pad (autobin,
|
||||
gst_element_get_pad (cache, "sink") ,"sink");
|
||||
|
||||
gst_element_set_state(pipeline,GST_STATE_PLAYING);
|
||||
gst_bin_add (GST_BIN (pipeline), autobin);
|
||||
gst_element_connect (src, autobin);
|
||||
|
||||
while (gst_bin_iterate(GST_BIN(pipeline)));
|
||||
/* pipeline is now src ! autobin
|
||||
* with autobin: cache ! typefind
|
||||
*/
|
||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||
|
||||
while (gst_bin_iterate (GST_BIN (pipeline)));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue