Thank you very much. It works now. :)<br>Here is what I did:<br><br>static void<br>cb_newpad (GstElement *decodebin,<br>       GstPad     *pad,<br>       gboolean    last,<br>       gpointer    data)<br>{<br>  GstCaps *caps;<br>
  GstStructure *str;<br>  GstPad *audiopad,*videopad;<br>  gchar *tex;<br><br>  /* check media type */<br>  caps = gst_pad_get_caps (pad);<br>  str = gst_caps_get_structure (caps, 0);<br>  tex = gst_structure_get_name(str);<br>
<br>  if(g_strrstr(tex,&quot;audio&quot;))<br>  {<br>      audiopad = gst_element_get_static_pad (audio, &quot;sink&quot;);<br>      if(GST_PAD_IS_LINKED(audiopad))<br>      {<br>          g_object_unref(audiopad);<br>          return;<br>
      }<br>      else<br>      {<br>        gst_pad_link(pad,audiopad);<br>        g_object_unref(audiopad);<br>      }<br>      return;<br>  }<br><br>Fariq.<br><br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

<br>
Message: 6<br>
Date: Thu, 22 Apr 2010 10:22:39 +0300<br>
From: Stefan Kost &lt;<a href="mailto:ensonic@hora-obscura.de">ensonic@hora-obscura.de</a>&gt;<br>
Subject: Re: [gst-devel] Need help on using decodebin as media decoder<br>
To: Discussion of the development of GStreamer<br>
        &lt;<a href="mailto:gstreamer-devel@lists.sourceforge.net">gstreamer-devel@lists.sourceforge.net</a>&gt;<br>
Message-ID: &lt;<a href="mailto:4BCFF93F.3020109@hora-obscura.de">4BCFF93F.3020109@hora-obscura.de</a>&gt;<br>
Content-Type: text/plain; charset=ISO-8859-1<br>
<br>
Fariq Izwan wrote:<br>
&gt; Hi good people,<br>
&gt;<br>
&gt; I&#39;m new to gstreamer and I have a problem of using decodebin as a<br>
&gt; decoder to play video file. Below is my sample code that I use. The<br>
&gt; code below runs fine for one stream of media. But if I want to play<br>
&gt; both streams(audio and video), it doesn&#39;t work.<br>
&gt; Can anyone tell me what I did wrong here? (Please don&#39;t suggest to use<br>
&gt; playbin) :)<br>
&gt;<br>
&gt; Thank you.<br>
&gt;<br>
&gt; Fariq.<br>
&gt;<br>
&gt; ####Sample code####<br>
&gt;<br>
&gt; #include &lt;gst/gst.h&gt;<br>
&gt; #include &lt;glib-2.0/glib/gprintf.h&gt;<br>
&gt; #include &lt;gstreamer-0.10/gst/gstelement.h&gt;<br>
&gt; #include &lt;glib-2.0/glib/gmessages.h&gt;<br>
&gt;<br>
&gt; GstElement *pipeline, *audio,*video,*audioqueue,*videoqueue;<br>
&gt;<br>
&gt; static void<br>
&gt; cb_newpad (GstElement *decodebin,<br>
&gt;        GstPad     *pad,<br>
&gt;        gboolean    last,<br>
&gt;        gpointer    data)<br>
&gt; {<br>
&gt;   GstPad *audiopad,*videopad;<br>
&gt;<br>
&gt;   /* link audiopad */<br>
&gt;   audiopad = gst_element_get_static_pad (audio, &quot;sink&quot;);<br>
&gt;   if (!GST_PAD_IS_LINKED (audiopad)) {<br>
&gt;       gst_pad_link (pad, audiopad);<br>
&gt;       g_print(&quot;audiopad has been linked&quot;);<br>
&gt;     g_object_unref (audiopad);<br>
&gt;     return;<br>
&gt;   }<br>
this is not correct. You would need to check the media-type of the caps<br>
on the provided pad. (Get the caps from the pad, the structure from the<br>
caps and check the name of the structure (audio/video/something-else).<br>
Depending on that you link the audio- or videobin.<br>
Also in the above code, you leak the audiopad, if it is linked already.<br>
The above code might work, if you check the result of gst_pad_link() and<br>
only return if that worked, otherwise you continie and try the next pad.<br>
<br>
Stefan<br>
<br>
&gt; /* link videopad */<br>
&gt;   videopad = gst_element_get_static_pad(video,&quot;sink&quot;);<br>
&gt;   if (!GST_PAD_IS_LINKED (videopad)) {<br>
&gt;       gst_pad_link(pad,videopad);<br>
&gt;       gst_element_link(videoqueue,video);<br>
&gt;     g_object_unref (videopad);<br>
&gt;     return;<br>
&gt;   }<br>
&gt; }<br>
&gt;<br>
&gt; gint<br>
&gt; main (gint   argc,<br>
&gt;       gchar *argv[])<br>
&gt; {<br>
&gt;   GMainLoop *loop;<br>
&gt;   GstElement *src, *dec, *conv, *sink, *typefind,*typefind2;//*myplugin;<br>
&gt;   GstElement *convVid,*videosink;<br>
&gt;   GstPad *audiopad,*videopad;<br>
&gt;   GstBus *bus;<br>
&gt;<br>
&gt;   /* init GStreamer */<br>
&gt;   gst_init (&amp;argc, &amp;argv);<br>
&gt;   loop = g_main_loop_new (NULL, FALSE);<br>
&gt;<br>
&gt;   /* make sure we have input */<br>
&gt;   if (argc != 2) {<br>
&gt;     g_print (&quot;Usage: %s &lt;filename&gt;\n&quot;, argv[0]);<br>
&gt;     return -1;<br>
&gt;   }<br>
&gt;<br>
&gt;   g_print(&quot;Playing %s \n&quot;,argv[1]);<br>
&gt;<br>
&gt;   /* setup */<br>
&gt;   pipeline = gst_pipeline_new (&quot;pipeline&quot;);<br>
&gt;<br>
&gt;   bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));<br>
&gt;   gst_bus_add_watch (bus, my_bus_callback, loop);<br>
&gt;   gst_object_unref (bus);<br>
&gt;<br>
&gt;   src = gst_element_factory_make (&quot;filesrc&quot;, &quot;source&quot;);<br>
&gt;   g_object_set (G_OBJECT (src), &quot;location&quot;, argv[1], NULL);<br>
&gt;   typefind = gst_element_factory_make(&quot;typefind&quot;,&quot;typefinder&quot;);<br>
&gt;   g_signal_connect(typefind,&quot;have-type&quot;,G_CALLBACK(typefound_cb),loop);<br>
&gt;   dec = gst_element_factory_make (&quot;decodebin&quot;, &quot;decoder&quot;);<br>
&gt;   g_signal_connect (dec, &quot;new-decoded-pad&quot;, G_CALLBACK (cb_newpad), NULL);<br>
&gt;   //myplugin = gst_element_factory_make(&quot;myplugin&quot;,&quot;MyPlugin&quot;);<br>
&gt;   audioqueue = gst_element_factory_make(&quot;queue&quot;,&quot;audioqueue&quot;);<br>
&gt;   videoqueue = gst_element_factory_make(&quot;queue&quot;,&quot;videoqueue&quot;);<br>
&gt;   gst_bin_add_many (GST_BIN (pipeline), src,typefind,dec,NULL);<br>
&gt;   gst_element_link_many (src,typefind,dec,NULL);<br>
&gt;<br>
&gt;   /* create audio output */<br>
&gt;   audio = gst_bin_new (&quot;audiobin&quot;);<br>
&gt;   conv = gst_element_factory_make (&quot;audioconvert&quot;, &quot;aconv&quot;);<br>
&gt;   typefind2 = gst_element_factory_make(&quot;typefind&quot;,&quot;typefinder2&quot;);<br>
&gt;   //g_signal_connect(typefind2,&quot;have-type&quot;,G_CALLBACK(typefound_cb),loop);<br>
&gt;   audiopad = gst_element_get_static_pad (audioqueue, &quot;sink&quot;);<br>
&gt;   sink = gst_element_factory_make (&quot;osssink&quot;, &quot;sink&quot;);<br>
&gt;   gst_bin_add_many (GST_BIN (audio),audioqueue,conv,typefind2, sink,<br>
&gt; NULL);<br>
&gt;   gst_element_link_many (audioqueue,conv,typefind2, sink,NULL);<br>
&gt;   gst_element_add_pad (audio,<br>
&gt;       gst_ghost_pad_new (&quot;sink&quot;, audiopad));<br>
&gt;   gst_object_unref (audiopad);<br>
&gt;   gst_bin_add (GST_BIN (pipeline), audio);<br>
&gt;<br>
&gt;   /* create video output */<br>
&gt;   video = gst_bin_new(&quot;videobin&quot;);<br>
&gt;   convVid = gst_element_factory_make(&quot;ffmpegcolorspace&quot;,&quot;converter&quot;);<br>
&gt;   videopad = gst_element_get_static_pad(videoqueue,&quot;sink&quot;);<br>
&gt;   videosink = gst_element_factory_make(&quot;xvimagesink&quot;,&quot;videosink&quot;);<br>
&gt;   gst_bin_add_many(GST_BIN(video),videoqueue,convVid,videosink,NULL);<br>
&gt;   gst_element_link_many(videoqueue,convVid,videosink,NULL);<br>
&gt;   gst_element_add_pad(video,gst_ghost_pad_new(&quot;sink&quot;,videopad));<br>
&gt;   gst_object_unref(videopad);<br>
&gt;   gst_bin_add(GST_BIN(pipeline),video);<br>
&gt;<br>
&gt;   /* run */<br>
&gt;   gst_element_set_state (pipeline, GST_STATE_PLAYING);<br>
&gt;   g_timeout_add (200, (GSourceFunc) cb_print_position, pipeline);<br>
&gt;   g_main_loop_run (loop);<br>
&gt;<br>
&gt;   /* cleanup */<br>
&gt;   gst_element_set_state (pipeline, GST_STATE_NULL);<br>
&gt;   gst_object_unref (GST_OBJECT (pipeline));<br>
&gt;<br>
&gt;   return 0;<br>
&gt; }<br>
&gt; ------------------------------------------------------------------------<br>
&gt;<br>
&gt; ------------------------------------------------------------------------------<br>
&gt;<br>
&gt; ------------------------------------------------------------------------<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; gstreamer-devel mailing list<br>
&gt; <a href="mailto:gstreamer-devel@lists.sourceforge.net">gstreamer-devel@lists.sourceforge.net</a><br>
&gt; <a href="https://lists.sourceforge.net/lists/listinfo/gstreamer-devel" target="_blank">https://lists.sourceforge.net/lists/listinfo/gstreamer-devel</a><br>
&gt;<br>
<br>
<br>
<br>
<br>
------------------------------<br>
<br>
------------------------------------------------------------------------------<br>
<br>
<br>
------------------------------<br>
<br>
_______________________________________________<br>
gstreamer-devel mailing list<br>
<a href="mailto:gstreamer-devel@lists.sourceforge.net">gstreamer-devel@lists.sourceforge.net</a><br>
<a href="https://lists.sourceforge.net/lists/listinfo/gstreamer-devel" target="_blank">https://lists.sourceforge.net/lists/listinfo/gstreamer-devel</a><br>
<br>
<br>
End of gstreamer-devel Digest, Vol 47, Issue 59<br>
***********************************************<br>
</blockquote><br></div><br>