[gst-embedded] Problems trying to play 2 streams simultaneously
Rajesh Marathe
rmarathe at i-rode.com
Tue Oct 20 04:21:56 PDT 2009
Hi,
I am new to gstreamer and started working on it very recently. While I
am studying, I wrote a program to play two streams alternately using
gstreamer. Details below:
Development environment:
-------------------------------------
LTIB and iMX27ADS board. Host PC has Redhat EL5.0.
Problem description:
-----------------------------
I have two MP4 files. My intention is to play the first file for a few
seconds and pause the same and play the second file fully. After getting
End-of-Steam message for second file, resume and complete the first
file. My program looks like this:
int
main (int argc,
char *argv[])
{
GMainLoop *loop;
GstStateChangeReturn retval;
/* Initialisation */
gst_init (&argc, &argv);
loop = g_main_loop_new (NULL, FALSE);
/* Create gstreamer elements */
masterpipe = GstCreatePipelineMaster ("master-player", argv[1]);
slavepipe = GstCreatePipelineSlave ("slave-player", argv[2]);
retval = gst_element_set_state (slavepipe, GST_STATE_PAUSED);
retval = gst_element_set_state (masterpipe, GST_STATE_PLAYING);
g_timeout_add (4000, (GSourceFunc) cb_print_position, masterpipe);
g_main_loop_run (loop);
...
...
}
static GstElement * GstCreatePipelineMaster (char *name, char *file)
{
GstElement *pipeline;
/* Create gstreamer elements */
pipeline = gst_pipeline_new (name);
source = gst_element_factory_make ("filesrc","file-source");
demuxer = gst_element_factory_make
("mfw_mp4demuxer","avi-demuxer");
decvd = gst_element_factory_make ("mfw_vpudecoder",
"video-decoder");
decad = gst_element_factory_make ("mad", "mp3-decoder");
vdsink = gst_element_factory_make ("mfw_v4lsink",
"video-sink");
vdqueue = gst_element_factory_make ("queue",
"video-queue");
adqueue = gst_element_factory_make ("queue",
"audio-queue");
adsink = gst_element_factory_make ("fakesink",
"audio-sink");
g_object_set (decvd, "codec-type", "std_mpeg4", NULL);
if (!pipeline || !source || !demuxer || !decvd || !decad || !vdsink
|| !vdqueue || !adqueue || !adsink) {
return NULL;
}
/* Set up the pipeline */
/* we set the input filename to the source element */
g_object_set (G_OBJECT (source), "location", file, NULL);
/* we add all elements into the pipeline */
/* file-source | ogg-demuxer | vorbis-decoder | converter |
alsa-output */
gst_bin_add_many (GST_BIN (pipeline),
source, demuxer, decvd, decad,/* adqueue,
vdqueue,*/ vdsink, adsink, NULL);
/* we link the elements together */
/* file-source -> ogg-demuxer ~> vorbis-decoder -> converter ->
alsa-output */
gst_element_link (source, demuxer);
gst_element_link (decvd, vdsink);
// gst_element_link (vdqueue, vdsink);
// gst_element_link (decad, adqueue);
// gst_element_link (adqueue, adsink);
gst_element_link (decad, adsink);
g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), NULL);
return pipeline;
}
static GstElement * GstCreatePipelineSlave (char *name, char *file)
{
GstElement *pipeline;
/* Create gstreamer elements */
pipeline = gst_pipeline_new (name);
/* Set up the pipeline */
/* we set the input filename to the source element */
g_object_set (G_OBJECT (source), "location", file, NULL);
/* we add all elements into the pipeline */
/* file-source | ogg-demuxer | vorbis-decoder | converter |
alsa-output */
gst_bin_add_many (GST_BIN (pipeline),
source, demuxer, decvd, decad,/* adqueue,
vdqueue,*/ vdsink, adsink, NULL);
return pipeline;
}
Please note above, that I am creating two pipelines Master and slave and
adding same elements to the master adn slave 'bin's. Is this okay to do ?
I do see the master playing and after few seconds the timer function is
called in which I move the master to 'PAUSE' state and slave to
'PLAYING'. But the slave media does not play at all??
Can anybody let me know what is wrong above ?
regards,
Rajesh Marathe.
More information about the Gstreamer-embedded
mailing list