RidgeRun / gst-interpipe

GStreamer plug-in for interpipeline communication
Other
143 stars 64 forks source link

Invalid DTS when using compensate-ts and the buffer doesn't have DTS #130

Open JassonRM opened 2 years ago

JassonRM commented 2 years ago

This issue only presents itself when running different pipelines, either in gstd or within an application. If using the same pipeline as when using a gst-launch-1.0 command or just one pipeline inside the application it doesn't happen due to both elements having the same time and no compensation being applied.

This issue can be reproduced with the following code:

#include <gst/gst.h>

int
main (int argc, char *argv[])
{
  GstElement *pipeline1;
  GstElement *pipeline2;
  GstBus *bus;
  GstMessage *msg;

  /* Initialize GStreamer */
  gst_init (&argc, &argv);

  /* Build the pipeline */
  pipeline1 =
      gst_parse_launch
      ("videotestsrc ! identity silent=false ! interpipesink name=fullres sync=false async=false",
      NULL);

  pipeline2 =
      gst_parse_launch
      ("interpipesrc listen-to=fullres stream-sync=compensate-ts ! queue ! fakesink sync=true async=false",
      NULL);

  /* Start playing */
  gst_element_set_state (pipeline1, GST_STATE_PLAYING);
  gst_element_set_state (pipeline2, GST_STATE_PLAYING);

  /* Wait until error or EOS */
  bus = gst_element_get_bus (pipeline2);
  msg =
      gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
      GST_MESSAGE_ERROR | GST_MESSAGE_EOS);

  /* See next tutorial for proper error message handling/parsing */
  if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) {
    g_error ("An error occurred! Re-run with the GST_DEBUG=*:WARN environment "
        "variable set for more details.");
  }

  /* Free resources */
  gst_message_unref (msg);
  gst_object_unref (bus);
  gst_element_set_state (pipeline1, GST_STATE_NULL);
  gst_element_set_state (pipeline2, GST_STATE_NULL);
  gst_object_unref (pipeline1);
  gst_object_unref (pipeline2);
  return 0;
}

The interpipesrc logs show the following:

0:00:00.786194804 22475 0x559a9220eca0 LOG             interpipesrc gstinterpipesrc.c:650:gst_inter_pipe_src_push_buffer:<interpipesrc0> Incoming Buffer timestamp (pts): 0:00:33.533333333
0:00:00.786198823 22475 0x559a9220eca0 LOG             interpipesrc gstinterpipesrc.c:652:gst_inter_pipe_src_push_buffer:<interpipesrc0> Incoming Buffer timestamp (dts): 99:99:99.999999999
0:00:00.786202774 22475 0x559a9220eca0 LOG             interpipesrc gstinterpipesrc.c:654:gst_inter_pipe_src_push_buffer:<interpipesrc0> My Base Time: 4:06:32.151336843
0:00:00.786206631 22475 0x559a9220eca0 LOG             interpipesrc gstinterpipesrc.c:656:gst_inter_pipe_src_push_buffer:<interpipesrc0> Node Base Time: 4:06:32.146923878
0:00:00.786210733 22475 0x559a9220eca0 LOG             interpipesrc gstinterpipesrc.c:662:gst_inter_pipe_src_push_buffer:<interpipesrc0> Diff time: 0:00:00.004412965
0:00:00.786214570 22475 0x559a9220eca0 LOG             interpipesrc gstinterpipesrc.c:684:gst_inter_pipe_src_push_buffer:<interpipesrc0> Calculated Buffer Timestamp (PTS): 0:00:33.528920368
0:00:00.786218408 22475 0x559a9220eca0 LOG             interpipesrc gstinterpipesrc.c:687:gst_inter_pipe_src_push_buffer:<interpipesrc0> Calculated Buffer Timestamp (DTS): 5124095:34:33.705138650