[gst-devel] Fwd: Query on streaming multiple streams with gstreamer ...imx27ADS + latest LTIB from CVS

Rajesh Marathe rmarathe at i-rode.com
Wed Oct 21 12:07:21 CEST 2009



Hi,

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 media 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-devel mailing list