<div dir="ltr"><div>Hello.</div><div><br></div><div>You don't need to use "tee".<br></div><div>There will be 2 pads (one for audio and the other for video) from "uridecodebin" and,</div><div>each pad should be linked to each proper converter.</div><div>Below is my modified source code with video ouput.</div><div><br></div><div><br></div><div>#include <gst/gst.h></div><div><br></div><div>/* Structure to contain all our information, so we can pass it to<br>callbacks */<br>typedef struct _CustomData {<br> GstElement *pipeline;<br> GstElement *source;<br> GstElement *vconvert;<br> GstElement *vsink;<br> GstElement *convert;<br> GstElement *sink;<br>} CustomData;</div><div><br></div><div>/* Handler for the pad-added signal */<br>static void pad_added_handler(GstElement *src, GstPad *pad, CustomData<br> *data);</div><div><br></div><div>int main(int argc, char *argv[]) {<br> CustomData data;<br> GstBus *bus;<br> GstMessage *msg;<br> GstStateChangeReturn ret;<br> gboolean terminate = FALSE;</div><div><br></div><div> /* Initialize GStreamer */<br> gst_init(NULL, NULL);</div><div><br></div><div> /* Create the elements */<br> data.source = gst_element_factory_make("uridecodebin", "source");<br> data.vconvert = gst_element_factory_make("videoconvert", "vconvert");<br> data.vsink = gst_element_factory_make("autovideosink", "vsink");<br> data.convert = gst_element_factory_make("audioconvert", "convert");<br> data.sink = gst_element_factory_make("autoaudiosink", "sink");</div><div><br></div><div> /* Create the empty pipeline */<br> data.pipeline = gst_pipeline_new("test-pipeline");</div><div><br></div><div> if (!data.pipeline || !data.source || !data.vconvert || !data.vsink<br>  || !data.convert || !data.sink) {<br>  g_printerr("Not all elements could be created.\n");<br>  return -1;<br> }</div><div><br></div><div> /* Build the pipeline. Note that we are NOT linking the source at this<br> * point. We will do it later. */<br> gst_bin_add_many(GST_BIN(data.pipeline), data.source, data.vconvert,<br>  data.vsink, data.convert, data.sink, NULL);<br> if (!gst_element_link(data.vconvert, data.vsink)) {<br>  g_printerr("Elements could not be linked.\n");<br>  gst_object_unref(data.pipeline);<br>  return -1;<br> }</div><div><br></div><div> if (!gst_element_link(data.convert, data.sink)) {<br>  g_printerr("Elements could not be linked.\n");<br>  gst_object_unref(data.pipeline);<br>  return -1;<br> }</div><div><br></div><div> /* Set the URI to play */<br> g_object_set(data.source, "uri",<br>  "<a href="http://docs.gstreamer.com/media/sintel_trailer-480p.webm">http://docs.gstreamer.com/media/sintel_trailer-480p.webm</a>", NULL);</div><div><br></div><div> /* Connect to the pad-added signal */<br> g_signal_connect(data.source, "pad-added", G_CALLBACK<br>  (pad_added_handler), &data);</div><div><br></div><div> /* Start playing */<br> ret = gst_element_set_state(data.pipeline, GST_STATE_PLAYING);<br> if (ret == GST_STATE_CHANGE_FAILURE) {<br>  g_printerr("Unable to set the pipeline to the playing state.\n");<br>  gst_object_unref(data.pipeline);<br>  return -1;<br> }</div><div><br></div><div> /* Listen to the bus */<br> bus = gst_element_get_bus(data.pipeline);<br> do {<br>  msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE,<br>   (GstMessageType)(GST_MESSAGE_STATE_CHANGED | GST_MESSAGE_ERROR | GST_MESSAGE_EOS));</div><div><br></div><div>  /* Parse message */<br>  if (msg != NULL) {<br>   GError *err;<br>   gchar *debug_info;</div><div><br></div><div>   switch (GST_MESSAGE_TYPE(msg)) {<br>   case GST_MESSAGE_ERROR:<br>    gst_message_parse_error(msg, &err, &debug_info);<br>    g_printerr("Error received from element %s: %s\n",<br>     GST_OBJECT_NAME(msg->src), err->message);<br>    g_printerr("Debugging information: %s\n", debug_info ?<br>    debug_info : "none");<br>    g_clear_error(&err);<br>    g_free(debug_info);<br>    terminate = TRUE;<br>    break;<br>   case GST_MESSAGE_EOS:<br>    g_print("End-Of-Stream reached.\n");<br>    terminate = TRUE;<br>    break;<br>   case GST_MESSAGE_STATE_CHANGED:<br>    /* We are only interested in state-changed messages from the<br>    pipeline */<br>    if (GST_MESSAGE_SRC(msg) == GST_OBJECT(data.pipeline)) {<br>     GstState old_state, new_state, pending_state;<br>     gst_message_parse_state_changed(msg, &old_state,<br>      &new_state, &pending_state);<br>     g_print("Pipeline state changed from %s to %s:\n",<br>      gst_element_state_get_name(old_state),<br>      gst_element_state_get_name(new_state));<br>    }<br>    break;<br>   default:<br>    /* We should not reach here */<br>    g_printerr("Unexpected message received.\n");<br>    break;<br>   }<br>   gst_message_unref(msg);<br>  }<br> } while (!terminate);</div><div><br></div><div> /* Free resources */<br> gst_object_unref(bus);<br> gst_element_set_state(data.pipeline, GST_STATE_NULL);<br> gst_object_unref(data.pipeline);<br> return 0;<br>}</div><div><br></div><div>/* This function will be called by the pad-added signal */<br>static void pad_added_handler(GstElement *src, GstPad *new_pad,<br> CustomData *data) {<br> GstPad *sink_pad = NULL;<br> GstPadLinkReturn ret;<br> GstCaps *new_pad_caps = NULL;<br> GstStructure *new_pad_struct = NULL;<br> const gchar *new_pad_type = NULL;</div><div><br></div><div> g_print("Received new pad '%s' from '%s':\n", GST_PAD_NAME<br>  (new_pad), GST_ELEMENT_NAME(src));</div><div><br></div><div> /* If our converter is already linked, we have nothing to do here */<br> if (gst_pad_is_linked(sink_pad)) {<br>  g_print("  We are already linked. Ignoring.\n");<br>  goto exit;<br> }</div><div><br></div><div> /* Check the new pad's type */<br> new_pad_caps = gst_pad_get_current_caps(new_pad);<br> new_pad_struct = gst_caps_get_structure(new_pad_caps, 0);<br> new_pad_type = gst_structure_get_name(new_pad_struct);<br> if (g_str_has_prefix(new_pad_type, "audio/x-raw")) {<br>  sink_pad = gst_element_get_static_pad(data->convert, "sink");<br> }<br> else if (g_str_has_prefix(new_pad_type, "video/x-raw")) {<br>  sink_pad = gst_element_get_static_pad(data->vconvert, "sink");<br> }</div><div><br></div><div> /* Attempt the link */<br> ret = gst_pad_link(new_pad, sink_pad);<br> if (GST_PAD_LINK_FAILED(ret)) {<br>  g_print("  Type is '%s' but link failed.\n", new_pad_type);<br> }<br> else {<br>  g_print("  Link succeeded (type '%s').\n", new_pad_type);<br> }</div><div><br></div><div>exit:<br> /* Unreference the new pad's caps, if we got them */<br> if (new_pad_caps != NULL)<br>  gst_caps_unref(new_pad_caps);</div><div><br></div><div> /* Unreference the sink pad */<br> gst_object_unref(sink_pad);<br>}<br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div>