<div dir="ltr"><span style="font-family:monospace">I'd like to build a pipeline with 1 source and 3 sinks, where the sinks can be added and removed on the fly. I've seen examples using tees and valves, so my basic pipeline has 2 tees, 3 queues, 3 valves and 0-3 sinks. The pipeline mostly works, but it fails the 2nd time I create a sink for a particular valve, and only when sink.sync=true.</span><div><font face="monospace"><br></font></div><div><font face="monospace">The problem persists with a single src -> queue -> valve -> sink, as shown below. The pipeline starts fine, but when valve.drop is set to true a second time, the packets still do not flow. I've tried with live streams where sink.sync=false, and it works well. It's only when sink.sync=true that it fails.</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">Any ideas?<br></font><div><br></div><div><font face="monospace">$ gst-launch-1.0 --version<br>gst-launch-1.0 version 1.16.2<br>GStreamer 1.16.2<br><a href="https://launchpad.net/distros/ubuntu/+source/gstreamer1.0" target="_blank">https://launchpad.net/distros/ubuntu/+source/gstreamer1.0</a><br><br><br>#include <thread><br><br>extern "C" {<br>#include "gst/gst.h"<br>#include "gst/base/gstbasesink.h"<br>}<br><br>class ValveTest<br>{<br>  GstElement *pipeline_;<br>  GstElement *src_;<br><br>  GstElement *queue_;<br>  GstElement *valve_;<br>  GstElement *sink_;<br><br>  bool valve_drop_{false};<br><br>public:<br>  ValveTest()<br>  {<br>    if (!gst_is_initialized()) {<br>      gst_init(nullptr, nullptr);<br>    }<br><br>    pipeline_ = gst_pipeline_new(nullptr);<br>    src_ = gst_element_factory_make("videotestsrc", "src");<br>    queue_ = gst_element_factory_make("queue", "queue");<br>    valve_ = gst_element_factory_make("valve", "valve");<br>    sink_ = gst_element_factory_make("xvimagesink", "sink");<br><br>    if (!pipeline_ || !src_ || !queue_ || !valve_ || !sink_) {<br>      g_critical("create failed");<br>      return;<br>    }<br><br>    gst_bin_add_many(GST_BIN(pipeline_), src_, queue_, valve_, sink_, nullptr);<br><br>    if (!gst_element_link_many(src_, queue_, valve_, sink_, nullptr)) {<br>      g_critical("link src ... sink failed");<br>      return;<br>    }<br><br>    g_object_set(valve_, "drop", valve_drop_, nullptr);<br><br>    gst_base_sink_set_sync(GST_BASE_SINK(sink_), true);<br><br>    gst_element_set_state(pipeline_, GST_STATE_PLAYING);<br>  }<br><br>  void toggle_valve()<br>  {<br>    valve_drop_ = !valve_drop_;<br>    if (valve_drop_) {<br>      g_print("Drop\n");<br>      g_object_set(valve_, "drop", true, nullptr);<br>      gst_element_set_state(sink_, GST_STATE_NULL);<br>      gst_bin_remove(GST_BIN(pipeline_), sink_);<br>      gst_object_unref(GST_OBJECT(sink_));<br>      sink_ = nullptr;<br>    } else {<br>      g_print("The buffers must flow\n");<br>      sink_ = gst_element_factory_make("xvimagesink", "sink");<br>      gst_base_sink_set_sync(GST_BASE_SINK(sink_), true);<br>      gst_bin_add(GST_BIN(pipeline_), sink_);<br>      gst_element_link(valve_, sink_);<br>      gst_element_set_state(sink_, GST_STATE_PLAYING);<br>      g_object_set(valve_, "drop", false, nullptr);<br>    }<br>  }<br>};<br><br>int main()<br>{</font>element<font face="monospace"><br>  ValveTest test;<br><br>  while (true) {<br>    using namespace std::chrono_literals;<br>    std::this_thread::sleep_for(2s);<br>    test.toggle_valve();<br>  }<br><br>  return 0;<br>}<br><br>Thanks for any help!<font color="#888888"><br>/Clyde</font></font><div class="gmail-yj6qo"></div><div class="gmail-adL"><br></div></div></div></div>