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> <<a href="mailto:madhu@mobisy.com">madhu@mobisy.com</a>>
<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> 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 <gst/gst.h><br>GstElement *pipeline, *video,*audio;
<br>static gboolean my_bus_callback(GstBus *bus,GstMessage *msg,gpointer data)<br>{<br> GMainLoop *loop = data;<br><br> switch (GST_MESSAGE_TYPE(msg)) <br> {<br> case GST_MESSAGE_EOS:<br> g_print ("End-of-stream\n");
<br> g_main_loop_quit (loop);<br> break;<br> case GST_MESSAGE_ERROR: <br> {<br> gchar *debug = NULL;<br> GError *err = NULL;<br><br> gst_message_parse_error (msg, &err, &debug);
<br> g_print ("Error: %s\n", err->message);<br> g_error_free (err);<br> g_main_loop_quit (loop);<br> break;<br> }<br> default:<br> break;
<br> }<br> <br> return(TRUE);<br>}<br><br>void cb_newpad_video(GstElement *decodebin,GstPad *pad,gboolean last,gpointer data)<br> <br>{<br> GstCaps *caps;<br> GstStructure *str;<br> GstPad *videopad;
<br> /* only link once */<br> videopad = gst_element_get_pad (video, "sink");<br> if (GST_PAD_IS_LINKED (videopad)) <br> {<br> g_object_unref (videopad);<br> return;<br> }<br> /* check media type */
<br>
caps = gst_pad_get_caps (pad);<br> str = gst_caps_get_structure (caps, 0);<br> if (!g_strrstr (gst_structure_get_name (str), "video")) <br> {<br> gst_caps_unref (caps);<br> gst_object_unref (videopad);
<br> return;<br> }<br> gst_caps_unref (caps);<br> /* link'n'play */<br> gst_pad_link (pad,videopad);<br>}<br><br>void cb_newpad_audio(GstElement *decodebin,GstPad *pad,gboolean last,gpointer data)<br>
<br>{<br> GstCaps *caps;<br> GstStructure *str;<br> GstPad *audiopad;<br> /* only link once */<br> audiopad = gst_element_get_pad (audio, "sink");<br> if (GST_PAD_IS_LINKED (audiopad)) <br> {<br> g_object_unref (audiopad);
<br> return;<br> }<br> /* check media type */<br> caps = gst_pad_get_caps (pad);<br> str = gst_caps_get_structure (caps, 0);<br> if (!g_strrstr (gst_structure_get_name (str), "audio")) {<br> gst_caps_unref (caps);
<br> gst_object_unref (audiopad);<br> return;<br> }<br> gst_caps_unref (caps);<br> /* link'n'play */<br> gst_pad_link (pad, audiopad);<br>}<br><br><br>gint main (gint argc,gchar *argv[])<br>{<br> GMainLoop *loop;
<br> GstElement *src, *dec, *csp, *sink1,*sink2,*aconv,*vqueue,*avqueue,*aresample;<br> GstPad *videopad,*audiopad;<br> /* init GStreamer */<br> gst_init (&argc, &argv);<br> loop = g_main_loop_new (NULL, FALSE);
<br> /* make sure we have input */<br> if (argc != 2) <br> {<br> g_print ("Usage: %s <filename>\n", argv[0]);<br> return -1;<br> }<br> /* setup */<br> pipeline = gst_pipeline_new ("pipeline");
<br> gst_bus_add_watch (gst_pipeline_get_bus (GST_PIPELINE (pipeline)),my_bus_callback, loop);<br> src = gst_element_factory_make ("filesrc", "source");<br> g_object_set (G_OBJECT (src), "location", argv[1], NULL);
<br> dec = gst_element_factory_make ("decodebin", "decoder");<br> g_signal_connect (dec, "new-decoded-pad", G_CALLBACK (cb_newpad_video), NULL);<br> g_signal_connect (dec, "new-decoded-pad", G_CALLBACK (cb_newpad_audio), NULL);
<br> gst_bin_add_many (GST_BIN (pipeline), src, dec, NULL);<br> gst_element_link (src, dec);<br> /* create video output */<br> video = gst_bin_new ("videobin");<br> vqueue=gst_element_factory_make ("vqueue", "vqueue");
<br> csp = gst_element_factory_make ("ffmpegcolorspace", "csp");<br> videopad = gst_element_get_pad (vqueue, "sink");<br> sink1 = gst_element_factory_make ("xvimagesink", "sink1");
<br> gst_bin_add_many (GST_BIN (video),vqueue,csp, sink1, NULL);<br> gst_element_link_many(vqueue,csp,sink1);<br> gst_element_add_pad (video,gst_ghost_pad_new ("vsink",videopad));<br> gst_object_unref (videopad);
<br> gst_bin_add (GST_BIN (pipeline), video);<br> /*Create Audio Output*/<br> audio = gst_bin_new ("audiobin");<br> aqueue=gst_element_factory_make ("queue", "aqueue");<br> aconv = gst_element_factory_make ("audioconvert","aconv");
<br> audiopad = gst_element_get_pad (aqueue, "sink");<br> aresample = gst_element_factory_make ("audioresample","aresample");<br> sink2 = gst_element_factory_make ("alsasink", "sink2");
<br> gst_bin_add_many (GST_BIN (audio),aqueue,aconv,aresample,sink2, NULL);<br> gst_element_link_many(aqueue,aconv,aresample,sink2);<br> gst_element_add_pad (audio,gst_ghost_pad_new ("asink",audiopad));<br> gst_object_unref (audiopad);
<br> gst_bin_add (GST_BIN (pipeline), audio);<br> /* run */<br> gst_element_set_state (pipeline,GST_STATE_PLAYING);<br> g_print ("Running ...\n");<br> g_main_loop_run (loop);<br> /* cleanup */<br> gst_element_set_state (pipeline, GST_STATE_NULL);
<br> gst_object_unref (GST_OBJECT (pipeline));<br> return 0;<br>}<br><br><br>Looking forward for you help.<br><br>Cheers,<br>Madhu.T.S<br><br><br><br><br>