<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    Hi,<br>
    <br>
    <div class="moz-cite-prefix">On 11/11/21 04:16, Ranti Endeley via
      gstreamer-devel wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:DBBPR09MB3064986AD8EC28DE963A3216D7939@DBBPR09MB3064.eurprd09.prod.outlook.com">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <style type="text/css" style="display:none;">P {margin-top:0;margin-bottom:0;}</style>
      <div style="font-family: Calibri, Helvetica, sans-serif;
        font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255,
        255, 255);">
        Hi,</div>
      <div style="font-family: Calibri, Helvetica, sans-serif;
        font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255,
        255, 255);">
        <br>
      </div>
      <div style="font-family: Calibri, Helvetica, sans-serif;
        font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255,
        255, 255);">
        I am quite new to gstreamer. I am trying to develop a couple of
        plugins.</div>
      <div style="font-family: Calibri, Helvetica, sans-serif;
        font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255,
        255, 255);">
        <ul>
          <li><span>one which examines video frames in a buffer
              alongside inference metadata (object detection and
              classification) - this plugin then emits a custom out of
              bounds event downstream which is acted upon by the second
              plugin</span></li>
          <li><span>the second plugin is separated from the 1st by a
              queue (the idea being to block the queue until the custom
              event notifies it to start capturing the frames in the
              buffer)</span></li>
        </ul>
        <div>My idea is to use the queue (leaky=downstream) between the
          two plugins to store the buffers until an event is detected by
          the 1st plugin. I would like the queue to fill up with buffers
          and drop the oldest buffers until the downstream plugin is
          prepared to accept them. This should in theory then allow the
          2nd plugin to capture the video frames emitted prior to the
          event occurring so that I can have a record of some seconds of
          video prior to the event which triggered the capture (by
          increasing the max-size-time property of the queue to match
          the amount of time I want to store before an event).</div>
        <div><br>
        </div>
      </div>
    </blockquote>
    <br>
    Yes, this is possible and doable as you describe.<br>
    <br>
    <blockquote type="cite"
cite="mid:DBBPR09MB3064986AD8EC28DE963A3216D7939@DBBPR09MB3064.eurprd09.prod.outlook.com">
      <div style="font-family: Calibri, Helvetica, sans-serif;
        font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255,
        255, 255);">
        <div>
        </div>
        <div>My pipeline is like this:</div>
        <div>video/x-raw + inference metadata -> videoconvert !
          trigger plugin ! queue max-size-buffers=G_MAXUINT,
          "max-size-bytes=G_MAXUINT,
          max-size-time=60000000000,leaky=downstream ! capture plugin !
          videoconvert ! videoscale ! videorate ! theoraenc ! oggmux !
          filesink [hoping to store up to 60 seconds of videoframes]<br>
        </div>
        <div><br>
        </div>
        <div>Testing the above pipeline using videotestsrc (no metadata
          yet, just passing through all frames) has brought up some
          issues that are a little hard for me to understand.</div>
        <div>
          <ul>
            <li><span>The output video runs for much longer than
                expected (for example 2 seconds of runtime results in
                about 30 seconds of video)</span></li>
            <li><span>When the leaky=downstream option is set on the
                queue frames are dropped much earlier than I would
                expect (leading to a very choppy output video - which
                incidentally is still longer than expected).</span></li>
          </ul>
          <div>My questions:</div>
          <div>
            <ul>
              <li><span>Is what I am trying to do possible with the
                  pipeline I have described above? If not, why and what
                  am I missing?</span></li>
              <li><span>Why is the video length being output
                  disproportionate to the run time of the pipeline?</span></li>
            </ul>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
    If you are running a source that just outputs data as fast as
    possible (videotestsrc) with a sink element that doesn't not
    synchronise on the clock (filesink), then you don't have anything
    'realtime' here blocking the execution based on the buffer
    timestamps.  The amount of resulting data depends on how fast it can
    be generated.  Whether or not the queue drops data depends on
    whether downstream processes data faster or slower than upstream.<br>
    <br>
    You can either use videotestsrc is-live=true or insert a clocksync
    element at an approprate place before the leaky queue.<br>
    <br>
    Cheers<br>
    -Matt<br>
    <br>
    <blockquote type="cite"
cite="mid:DBBPR09MB3064986AD8EC28DE963A3216D7939@DBBPR09MB3064.eurprd09.prod.outlook.com">
      <div style="font-family: Calibri, Helvetica, sans-serif;
        font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255,
        255, 255);">
        <div>
          <div>
            <div>Thanks in advance for your assistance.</div>
            <div><br>
            </div>
            <div><br>
            </div>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
  </body>
</html>