<!DOCTYPE html>
<html data-lt-installed="true">
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body style="padding-bottom: 1px;">
    Hi, dear GStreamer community,<br>
    <br>
    I am tired of parsing GStreamer's source code to understand how
    everything works and how to solve my problem.<br>
    <br>
    My company manufactures cameras. I am trying to create an
    application that shares the data from these cameras over RTSP. Here
    is the launch string for GstRTSPMediaFactory: "( appsrc
    name=ourcamera ! queue ! x265enc speed-preset=5 tune=4
    option-string=colormatrix=gbr:lossless=true ! rtph265pay name=pay0
    pt=96 )". When I receive a frame from my camera, I push it to
    appsrc. The problem is, in the beginning, appsrc buffers all the
    data pushed, while the connection is being established. When the
    real data transfer starts, this buffer is not being discarded,
    leading to a latency of dozens of seconds. I would love to push only
    after RTSPClient is ready to pop data, but how?<br>
    <br>
    I was trying to figure what was going on, and here are my
    discoveries. When the pipeline created for an RTSPCLient is in the
    play mode, gst_base_src_loop checks if reconfigure is required. For
    some reason, it finds out it is, and calls
    gst_base_src_negotiate_unlocked. The latter hangs on
    gst_base_src_prepare_allocation. This function hangs on
    gst_pad_query called on queue:sink and query is a new allocation. It
    hangs only because, for some reason, gst_queue_loop is not being
    called. While gst_queue_loop is postponed, my application continues
    pushing data. When finally gst_queue_loop is called, appsrc has a
    buffer of up to a hundred frames accumulated. So what gst_queue_loop
    is waiting for?<br>
    <br>
    I tried removing gst_queue_loop all together, but not only the
    latency problem remains, the pipeline reports it is not configured
    properly and asks to add a queue.<br>
  </body>
  <lt-container></lt-container>
</html>