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;
}
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:
The interpipesrc logs show the following: