AnsweredAssumed Answered

Can not play double-image screen

Question asked by Tico Chen on Mar 25, 2014
Latest reply on Apr 11, 2014 by Joan Xie

gst-launch filesrc location=/path/test.ts ! tee name=t t. ! mpegtsdemux ! queue ! vpudec ! \

mfw_isink disp-width=640 disp-height=480 axis-left=0 t. ! mpegtsdemux ! queue ! ccdecoder ! colorspace \

! mfw_isink disp-width=640 disp-height=480 axis-left=660


The following command is what I play a video, recorded by the DVB-T signal.

There are several channels in this movie, I think the two channels while playing content.


Here is my code, but has not performed well, could you please help me check to see which side is out of the question.


#include <gst/gst.h>


int main(int argc, char *argv[]) {

  GstElement *pipeline, *file_source, *tee, demuxer_1, *vqueue1, *vdecoder_1, *vsink1;

  GstElement *demuxer_2, *vqueue2, *vdecoder_2, *vsink2;

  GstBus *bus;

  GstMessage *msg;

  GstPadTemplate *tee_src_pad_template;

  GstPad *tee_v_pad, *tee_video_pad;

  GstPad *queue_v_pad, *queue_video_pad;


  /* Initialize GStreamer */

  gst_init (&argc, &argv);


  /* Create the elements */

  file_source = gst_element_factory_make ("filesrc", "file_source");

  tee = gst_element_factory_make ("tee", "tee");

  demuxer_1 = gst_element_factory_make ("mpegtsdemux", "demux1");

  vqueue1 = gst_element_factory_make ("queue", "vqueue1");

  vdecoder_1 = gst_element_factory_make ("vpudec", "vdec1");

  vsink1 = gst_element_factory_make ("mfw_isink", "vsink1");

  demuxer_2 = gst_element_factory_make ("mpegtsdemux", "demux2");

  vqueue2 = gst_element_factory_make ("queue", "vqueue2");

  vdecoder_2 = gst_element_factory_make ("vpudec", "vdec2");

  visual = gst_element_factory_make ("wavescope", "visual");

  video_convert = gst_element_factory_make ("ffmpegcolorspace", "csp");

  vsink2 = gst_element_factory_make ("mfw_isink", "vsink2");


  /* Create the empty pipeline */

  pipeline = gst_pipeline_new ("test-pipeline");


  if (!pipeline || !file_source || !tee || !demuxer_1 || !vqueue1 || !vdecoder_1 || !vsink1 ||

      !demuxer_2 ||!vqueue2 || !vdecoder_2 || !vsink2) {

    g_printerr ("Not all elements could be created.\n");

    return -1;



  /* Configure elements */

  g_object_set (file_source, "location", "/path/test.ts", NULL);



  g_object_set (demuxer_1, "pid", "1001:1002:100", NULL);

  g_object_set (demuxer_2, "pid", "1011:1012:101", NULL);


  /* Link all elements that can be automatically linked because they have "Always" pads */

  gst_bin_add_many (GST_BIN (pipeline), file_source, tee, demuxer_1, vqueue1, vdecoder_1, vsink1,

      demuxer_2, vqueue2, vdecoder_2, vsink2, NULL);

  if (gst_element_link_many (file_source, tee, NULL) != TRUE ||

      gst_element_link_many (demuxer_1, vqueue1, vdecoder_1, vsink1, NULL) != TRUE ||

      gst_element_link_many (demuxer_2, vqueue2, vdecoder_2, vsink2, NULL) != TRUE) {

    g_printerr ("Elements could not be linked.\n");

    gst_object_unref (pipeline);

    return -1;



  /* Manually link the Tee, which has "Request" pads */

  tee_src_pad_template = gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (tee), "src%d");

  tee_v_pad = gst_element_request_pad (tee, tee_src_pad_template, NULL, NULL);

  g_print ("Obtained request pad %s for audio branch.\n", gst_pad_get_name (tee_v_pad));

  queue_v_pad = gst_element_get_static_pad (demuxer_1, "sink");

  tee_video_pad = gst_element_request_pad (tee, tee_src_pad_template, NULL, NULL);

  g_print ("Obtained request pad %s for video branch.\n", gst_pad_get_name (tee_video_pad));

  queue_video_pad = gst_element_get_static_pad (demuxer_2, "sink");

  if (gst_pad_link (tee_v_pad, queue_v_pad) != GST_PAD_LINK_OK ||

      gst_pad_link (tee_video_pad, queue_video_pad) != GST_PAD_LINK_OK) {

    g_printerr ("Tee could not be linked.\n");

    gst_object_unref (pipeline);

    return -1;


  gst_object_unref (queue_v_pad);

  gst_object_unref (queue_video_pad);


  /* Start playing the pipeline */

  gst_element_set_state (pipeline, GST_STATE_PLAYING);


  /* Wait until error or EOS */

  bus = gst_element_get_bus (pipeline);

  msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);


  /* Release the request pads from the Tee, and unref them */

  gst_element_release_request_pad (tee, tee_v_pad);

  gst_element_release_request_pad (tee, tee_video_pad);

  gst_object_unref (tee_v_pad);

  gst_object_unref (tee_video_pad);


  /* Free resources */

  if (msg != NULL)

    gst_message_unref (msg);

  gst_object_unref (bus);

  gst_element_set_state (pipeline, GST_STATE_NULL);


  gst_object_unref (pipeline);

  return 0;