How to provide data to RTSPClient wihout latency? [appsrc, buffering]

Andrey Sotnikov usaonmonday at gmail.com
Fri Aug 25 21:37:31 UTC 2023


I found out the cause of the delay, and it's very bizarre. The delay is 
caused by appsink0 that was added to the media pipeline by RTSPClient. I 
guess this AppSink sends RTP packets. When the first data buffer arrives 
to appsink0, it has the timestamp equal to 1000 hours. 
GstBaseSink::segment at the same time has a timestamp of seemingly 
random few seconds earlier than 1000 hours. appsink0 blocks the thread 
for this number of seconds. This blocks gst_queue_lock. In turn, this 
blocks gst_base_src_loop, when the latter calls gst_pad_peer_query.

Can somebody explain the logic of what is going on and why?

23.08.2023 23:10, Andrey Sotnikov пишет:
> Hi, dear GStreamer community,
>
> I am tired of parsing GStreamer's source code to understand how 
> everything works and how to solve my problem.
>
> 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?
>
> 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?
>
> 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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20230825/63866be1/attachment.htm>


More information about the gstreamer-devel mailing list