On Tue, Oct 20, 2009 at 9:21 AM, Rajesh Marathe <rmarathe@i-rode.com> wrote:
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 ?
 
The elements can only have a single parent bin, it can't be inside two bins at the same time. 
You would probably notice the problem by checking the result of gst_bin_add*


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.

------------------------------------------------------------------------------
Come build with us! The BlackBerry(R) Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay
ahead of the curve. Join us from November 9 - 12, 2009. Register now!
http://p.sf.net/sfu/devconference
_______________________________________________
Gstreamer-embedded mailing list
Gstreamer-embedded@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gstreamer-embedded



--
Thiago Sousa Santos