using input-selector in custom pipeline
Rohit Chawla
adroitdude at gmail.com
Tue Feb 14 02:12:37 PST 2012
Hi,
I am trying to use the input-selector element of gstreamer in my
custom pipeline to select the desired media (ogg) file to play.
the pipeline I was using is as below:
filesrc --> queue -
| ----------
-->| |
| I/P |
| Selector|--> oggdemux --> theoradec -->
ffmpegcolorspace --> autovideosink
-->| |
| ----------
filesrc -> queue -
I tried to activate sinkpad1 of the input-selector element, but I am
getting following error:
Erplaybin2ror: Internal data flow error.
Please suugest the resolution.
Best Regards,
Rohit
================================
The source code I wrote is as below:
#include <gst/gst.h>
#include <string.h>
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <ctype.h>
/* Global variables */
GstElement *pipeline,*source,*demuxer,*vid_decoder,*vid_convert,*vid_sink,*vid_queue;
GstElement *selector,*source1,*vid_queue1;
GMainLoop *loop;
GstBus *bus;
/* Call back function for the message signal over the bus */
static gboolean bus_call (GstBus * bus, GstMessage * msg, gpointer data)
{
GMainLoop *loop = (GMainLoop *) data;
switch (GST_MESSAGE_TYPE (msg)) {
case GST_MESSAGE_EOS:{
g_print ("End-of-stream\n");
g_main_loop_quit (loop);
break;
}
case GST_MESSAGE_ERROR:{
gchar *debug;
GError *err;
gst_message_parse_error (msg, &err, &debug);
g_free (debug);
g_print ("Erplaybin2ror: %s\n", err->message);
g_error_free (err);
g_main_loop_quit
(loop);
break;
}
default:
break;
}
return TRUE;
}
/* Callback function for the dynamic pad created */
static void on_pad_added(GstElement *element,GstPad *pad,gpointer a_data)
{
GstPad *SinkPad;
GstStructure *str;
GstCaps *caps;
caps = gst_pad_get_caps(pad);
str = gst_caps_get_structure(caps,0);
/* Audio demuxed pad created */
if(g_strrstr(gst_structure_get_name(str),"audio"))
{
#if 0
g_print("Dynamic pad created,linking the demuxer and
audio decoder \n");
SinkPad = gst_element_get_static_pad(aud_queue,"sink");
if(gst_pad_link(pad,SinkPad))
{
g_print("\n Cannot link the demuxer with the
audio decoder \n");
}
gst_object_unref(SinkPad);
if(!gst_element_link_many(aud_queue,aud_decoder,aud_convert,aud_sink,NULL))
{
g_print("Failed to link one or more element \n");
}
#endif
}
else
{ /* Video Demuxed pad created */
g_print("\n Dynamic pad created,linking the demuxer and
video decoder \n");
//SinkPad = gst_element_get_static_pad(vid_queue,"sink");
SinkPad = gst_element_get_static_pad(vid_decoder,"sink");
if(gst_pad_link(pad,SinkPad))
{
g_print("\n Cannot link the demuxer with the
video decoder \n");
}
gst_object_unref(SinkPad);
if(!gst_element_link_many(/*vid_queue,*/vid_decoder,vid_convert,vid_sink,NULL))
{
g_print("Failed to link one or more element \n");
}
}
}
/* Main */
gint main (gint argc, gchar * argv[])
{
GstPad *sinkpad0, *sinkpad1, *srcpad0, *srcpad1;
gst_init (&argc, &argv);
if (argc < 3)
{
g_print ("usage: %s <media file or uri> <media file or
uri>\n", argv[0]);
return 1;
}
/* Get all the elements */
pipeline = gst_pipeline_new("ogg_player");
source = gst_element_factory_make("filesrc","file-source");
demuxer = gst_element_factory_make("oggdemux","ogg-demux");
vid_decoder = gst_element_factory_make("theoradec","theora-decoder");
vid_convert =
gst_element_factory_make("ffmpegcolorspace","colorspaceconverter");
vid_sink = gst_element_factory_make("autovideosink","video-output");
vid_queue = gst_element_factory_make("queue","video-output-queue");
if (!pipeline || !source || !demuxer || !vid_decoder || !vid_convert
|| !vid_sink || !vid_queue)
{
g_print("\n One or more element is not created \n");
}
g_object_set (G_OBJECT (source), "location", argv[1], NULL);
selector = gst_element_factory_make("input-selector","inputselector");
source1 = gst_element_factory_make("filesrc","file-source-1");
vid_queue1 = gst_element_factory_make("queue","video-output-queue-1");
if (!selector || !source1 || !vid_queue1)
{
g_print("\n One or more element is not created \n");
}
g_object_set (G_OBJECT (source1), "location", argv[2], NULL);
/* create and event loop and feed gstreamer bus mesages to it */
loop = g_main_loop_new (NULL, FALSE);
bus = gst_pipeline_get_bus (GST_PIPELINE(pipeline));
gst_bus_add_watch (bus, bus_call, loop);
g_object_unref (bus);
/* Add the elements into the pipeline */
gst_bin_add_many (GST_BIN(pipeline), source, demuxer, vid_decoder,
vid_convert, vid_sink, vid_queue, NULL);
gst_bin_add_many (GST_BIN(pipeline), source1, selector,
vid_queue1, NULL);
gst_element_link (source, vid_queue);
gst_element_link (source1, vid_queue1);
srcpad0 = gst_element_get_static_pad (vid_queue, "src");
srcpad1 = gst_element_get_static_pad (vid_queue1, "src");
sinkpad0 = gst_element_get_request_pad (selector, "sink0");
sinkpad1 = gst_element_get_request_pad (selector, "sink1");
if (gst_pad_link (srcpad0, sinkpad0))
{
g_print("\n Cannot link the vid_queue with the selector \n");
}
if (gst_pad_link (srcpad1, sinkpad1))
{
g_print("\n Cannot link the vid_queue1 with the selector \n");
}
if (!gst_element_link (selector, demuxer))
{
g_print("\n Cannot link selector with the demuxer \n");
return 0;
}
gst_element_set_state (selector, GST_STATE_PAUSED);
g_object_set (G_OBJECT(selector), "active-pad", sinkpad0, NULL);
g_print ("\n Back to main() outside of
gst_input_selector_set_property()\n");
g_print("\n selector and demuxer are now connected \n");
g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), NULL);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
g_main_loop_run (loop);
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (sinkpad0);
gst_object_unref (sinkpad1);
gst_object_unref (srcpad0);
gst_object_unref (srcpad1);
g_object_unref (pipeline);
//g_object_unref (loop);
return 0;
}
More information about the gstreamer-devel
mailing list