can anyone help this guy?<br><br>Ronald<br><br>---------- Forwarded message ----------<br><span class="gmail_quote">From: <b class="gmail_sendername">Madhu TS</b> &lt;<a href="mailto:madhu@mobisy.com">madhu@mobisy.com</a>&gt;
<br>Date: Jul 13, 2007 10:59 AM<br>Subject: Hiiii<br>To: <a href="mailto:rbultje@ronald.bitfreak.net">rbultje@ronald.bitfreak.net</a><br><br></span>Hi,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I am not able to use decodebin plugin to playback audio-video in sync. Below is piece of code which I am trying to run...please help me.
<br>#include &lt;gst/gst.h&gt;<br>GstElement *pipeline, *video,*audio;
<br>static gboolean my_bus_callback(GstBus *bus,GstMessage *msg,gpointer data)<br>{<br>&nbsp;&nbsp; GMainLoop *loop = data;<br><br>&nbsp;&nbsp; switch (GST_MESSAGE_TYPE(msg)) <br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case GST_MESSAGE_EOS:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_print (&quot;End-of-stream\n&quot;);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_main_loop_quit (loop);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case GST_MESSAGE_ERROR: <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gchar *debug = NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GError *err = NULL;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gst_message_parse_error (msg, &amp;err, &amp;debug);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_print (&quot;Error: %s\n&quot;, err-&gt;message);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_error_free (err);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; g_main_loop_quit (loop);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; return(TRUE);<br>}<br><br>void cb_newpad_video(GstElement *decodebin,GstPad *pad,gboolean last,gpointer data)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>{<br>&nbsp; GstCaps *caps;<br>&nbsp; GstStructure *str;<br>&nbsp; GstPad *videopad;
<br>&nbsp; /* only link once */<br>&nbsp; videopad = gst_element_get_pad (video, &quot;sink&quot;);<br>&nbsp; if (GST_PAD_IS_LINKED (videopad)) <br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; g_object_unref (videopad);<br>&nbsp;&nbsp;&nbsp; return;<br>&nbsp; }<br>&nbsp; /* check media type */
<br>
&nbsp; caps = gst_pad_get_caps (pad);<br>&nbsp; str = gst_caps_get_structure (caps, 0);<br>&nbsp; if (!g_strrstr (gst_structure_get_name (str), &quot;video&quot;)) <br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; gst_caps_unref (caps);<br>&nbsp;&nbsp;&nbsp; gst_object_unref (videopad);
<br>&nbsp;&nbsp;&nbsp; return;<br>&nbsp; }<br>&nbsp; gst_caps_unref (caps);<br>&nbsp; /* link&#39;n&#39;play */<br>&nbsp; gst_pad_link (pad,videopad);<br>}<br><br>void cb_newpad_audio(GstElement *decodebin,GstPad *pad,gboolean last,gpointer data)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<br>{<br>&nbsp; GstCaps *caps;<br>&nbsp; GstStructure *str;<br>&nbsp; GstPad *audiopad;<br>&nbsp; /* only link once */<br>&nbsp; audiopad = gst_element_get_pad (audio, &quot;sink&quot;);<br>&nbsp; if (GST_PAD_IS_LINKED (audiopad)) <br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; g_object_unref (audiopad);
<br>&nbsp;&nbsp;&nbsp; return;<br>&nbsp; }<br>&nbsp; /* check media type */<br>&nbsp; caps = gst_pad_get_caps (pad);<br>&nbsp; str = gst_caps_get_structure (caps, 0);<br>&nbsp; if (!g_strrstr (gst_structure_get_name (str), &quot;audio&quot;)) {<br>&nbsp;&nbsp;&nbsp; gst_caps_unref (caps);
<br>&nbsp;&nbsp;&nbsp; gst_object_unref (audiopad);<br>&nbsp;&nbsp;&nbsp; return;<br>&nbsp; }<br>&nbsp; gst_caps_unref (caps);<br>&nbsp; /* link&#39;n&#39;play */<br>&nbsp; gst_pad_link (pad, audiopad);<br>}<br><br><br>gint main (gint argc,gchar *argv[])<br>{<br>&nbsp; GMainLoop *loop;
<br>&nbsp; GstElement *src, *dec, *csp, *sink1,*sink2,*aconv,*vqueue,*avqueue,*aresample;<br>&nbsp; GstPad *videopad,*audiopad;<br>&nbsp; /* init GStreamer */<br>&nbsp; gst_init (&amp;argc, &amp;argv);<br>&nbsp; loop = g_main_loop_new (NULL, FALSE);
<br>&nbsp; /* make sure we have input */<br>&nbsp; if (argc != 2) <br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; g_print (&quot;Usage: %s &lt;filename&gt;\n&quot;, argv[0]);<br>&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp; }<br>&nbsp; /* setup */<br>&nbsp; pipeline = gst_pipeline_new (&quot;pipeline&quot;);
<br>&nbsp; gst_bus_add_watch (gst_pipeline_get_bus (GST_PIPELINE (pipeline)),my_bus_callback, loop);<br>&nbsp; src = gst_element_factory_make (&quot;filesrc&quot;, &quot;source&quot;);<br>&nbsp; g_object_set (G_OBJECT (src), &quot;location&quot;, argv[1], NULL);
<br>&nbsp; dec = gst_element_factory_make (&quot;decodebin&quot;, &quot;decoder&quot;);<br>&nbsp; g_signal_connect (dec, &quot;new-decoded-pad&quot;, G_CALLBACK (cb_newpad_video), NULL);<br>&nbsp; g_signal_connect (dec, &quot;new-decoded-pad&quot;, G_CALLBACK (cb_newpad_audio), NULL);
<br>&nbsp; gst_bin_add_many (GST_BIN (pipeline), src, dec, NULL);<br>&nbsp; gst_element_link (src, dec);<br>&nbsp; /* create video output */<br>&nbsp; video = gst_bin_new (&quot;videobin&quot;);<br>&nbsp; vqueue=gst_element_factory_make (&quot;vqueue&quot;, &quot;vqueue&quot;);
<br>&nbsp; csp = gst_element_factory_make (&quot;ffmpegcolorspace&quot;, &quot;csp&quot;);<br>&nbsp; videopad = gst_element_get_pad (vqueue, &quot;sink&quot;);<br>&nbsp; sink1 = gst_element_factory_make (&quot;xvimagesink&quot;, &quot;sink1&quot;);
<br>&nbsp; gst_bin_add_many (GST_BIN (video),vqueue,csp, sink1, NULL);<br>&nbsp; gst_element_link_many(vqueue,csp,sink1);<br>&nbsp; gst_element_add_pad (video,gst_ghost_pad_new (&quot;vsink&quot;,videopad));<br>&nbsp; gst_object_unref (videopad);
<br>&nbsp; gst_bin_add (GST_BIN (pipeline), video);<br>&nbsp; /*Create Audio Output*/<br>&nbsp; audio = gst_bin_new (&quot;audiobin&quot;);<br>&nbsp; aqueue=gst_element_factory_make (&quot;queue&quot;, &quot;aqueue&quot;);<br>&nbsp; aconv = gst_element_factory_make (&quot;audioconvert&quot;,&quot;aconv&quot;);
<br>&nbsp; audiopad = gst_element_get_pad (aqueue, &quot;sink&quot;);<br>&nbsp; aresample = gst_element_factory_make (&quot;audioresample&quot;,&quot;aresample&quot;);<br>&nbsp; sink2 = gst_element_factory_make (&quot;alsasink&quot;, &quot;sink2&quot;);
<br>&nbsp; gst_bin_add_many (GST_BIN (audio),aqueue,aconv,aresample,sink2, NULL);<br>&nbsp; gst_element_link_many(aqueue,aconv,aresample,sink2);<br>&nbsp; gst_element_add_pad (audio,gst_ghost_pad_new (&quot;asink&quot;,audiopad));<br>&nbsp; gst_object_unref (audiopad);
<br>&nbsp; gst_bin_add (GST_BIN (pipeline), audio);<br>&nbsp; /* run */<br>&nbsp; gst_element_set_state (pipeline,GST_STATE_PLAYING);<br>&nbsp; g_print (&quot;Running ...\n&quot;);<br>&nbsp; g_main_loop_run (loop);<br>&nbsp; /* cleanup */<br>&nbsp; gst_element_set_state (pipeline, GST_STATE_NULL);
<br>&nbsp; gst_object_unref (GST_OBJECT (pipeline));<br>&nbsp; return 0;<br>}<br><br><br>Looking forward for you help.<br><br>Cheers,<br>Madhu.T.S<br><br><br><br><br>