queue: Incorrect overrun reported due to cur_level.time calculation bug
We currently have a dynamic pipeline udpsrc -> rtpbin -> queue -> decodebin -> queue -> videoscale -> videoconvert -> capsfilter -> compositor -> ....
When a udpsrc
gets added at runtime, we see an overrun being reported from the queue element before the decodebin
.
On this queue, max-size-time
has been set to 5 seconds and leaky
is set to 2 viz. leak downstream.
When a udpsrc
gets added at runtime, the very first buffer can have a PTS of 19.95s as in the below logs. The queue sink and source time gets updated when apply_buffer
gets called.
As seen in the below logs, when the first buffer arrives in the above scenario, there is an interval of time where the queue sink time is 19.95 and queue source time is 0. This results in overrun being triggered as queue will be considered filled due to cur_level.time being 19.95 in this window. Overrun definitely has not taken place, since we only just got the very first buffer and max-size-time is 5s and the other limits of 200 buffers and 10MB of data have not been crossed either.
Just a note, some debug print lines are from what I had introduced and I use the error levels, to print out only the ones I wanted instead of GST_DEBUG
log levels. A similar issue seems to have been reported earlier in #199 for segments, which can be seen here as well, though the patch attached would not solve this issue.
0:00:20.043099298 90455 0x7f3174005de0 ERROR queue gstqueue.c:587:apply_segment:<video-decoder-input-queue-41004> configured SEGMENT time segment start=0:00:00.000000000, offset=0:00:00.000000000, stop=99:99:99.999999999, rate=1.000000, applied_rate=1.000000, flags=0x00, time=0:00:00.000000000, base=0:00:00.000000000, position 0:00:00.000000000, duration 99:99:99. 999999999
0:00:20.043105821 90455 0x7f3174005de0 ERROR queue gstqueue.c:534:update_time_level:<video-decoder-input-queue-41004> update sink time
0:00:20.043108756 90455 0x7f3174005de0 ERROR queue gstqueue.c:543:update_time_level:<video-decoder-input-queue-41004> update src time
0:00:20.043114547 90455 0x7f3174005de0 ERROR queue gstqueue.c:559:update_time_level:<video-decoder-input-queue-41004> Sink time: 0:00:00.000000000, Src Time: 0:00:00.000000000Current level time: 0:00:00.000000000
0:00:20.043118404 90455 0x7f3174005de0 ERROR queue gstqueue.c:803:gst_queue_locked_enqueue_event:<video-decoder-input-queue-41004> Apply segment on srcpad. In gst_queue_locked_enqueue_event
0:00:20.043123955 90455 0x7f3174005de0 ERROR queue gstqueue.c:587:apply_segment:<video-decoder-input-queue-41004> configured SEGMENT time segment start=0:00:00.000000000, offset=0:00:00.000000000, stop=99:99:99.999999999, rate=1.000000, applied_rate=1.000000, flags=0x00, time=0:00:00.000000000, base=0:00:00.000000000, position 0:00:00.000000000, duration 99:99:99. 999999999
0:00:20.043127451 90455 0x7f3174005de0 ERROR queue gstqueue.c:543:update_time_level:<video-decoder-input-queue-41004> update src time
0:00:20.043134925 90455 0x7f3174005de0 ERROR queue gstqueue.c:559:update_time_level:<video-decoder-input-queue-41004> Sink time: 0:00:00.000000000, Src Time: 0:00:00.000000000Current level time: 0:00:00.000000000
0:00:20.043141087 90455 0x7f3174005de0 ERROR queue gstqueue.c:640:apply_buffer:<video-decoder-input-queue-41004> sink position updated to 0:00:19.469583599
0:00:20.043144093 90455 0x7f3174005de0 ERROR queue gstqueue.c:534:update_time_level:<video-decoder-input-queue-41004> update sink time
0:00:20.043149964 90455 0x7f3174005de0 ERROR queue gstqueue.c:559:update_time_level:<video-decoder-input-queue-41004> Sink time: 0:00:19.469583599, Src Time: 0:00:00.000000000Current level time: 0:00:19.469583599
0:00:20.043155735 90455 0x7f3174005de0 ERROR queue gstqueue.c:1230:gst_queue_chain_buffer_or_list:<video-decoder-input-queue-41004> About to emit OVERRUN signal
0:00:20.043201812 90455 0x7f3174005de0 ERROR queue gstqueue.c:1152:gst_queue_leak_downstream:<video-decoder-input-queue-41004> Calling gst_queue_locked_dequeue from gst_queue_leak_downstream. i: 0
0:00:20.043207152 90455 0x7f3174005de0 ERROR queue gstqueue.c:1152:gst_queue_leak_downstream:<video-decoder-input-queue-41004> Calling gst_queue_locked_dequeue from gst_queue_leak_downstream. i: 1
0:00:20.043210478 90455 0x7f3174005de0 ERROR queue gstqueue.c:848:gst_queue_locked_dequeue:<video-decoder-input-queue-41004> Calling apply buffer on src segment from gst_queue_locked_dequeue
0:00:20.043214525 90455 0x7f3174005de0 ERROR queue gstqueue.c:640:apply_buffer:<video-decoder-input-queue-41004> src position updated to 0:00:19.469583599
0:00:20.043217651 90455 0x7f3174005de0 ERROR queue gstqueue.c:543:update_time_level:<video-decoder-input-queue-41004> update src time
0:00:20.043224234 90455 0x7f3174005de0 ERROR queue gstqueue.c:559:update_time_level:<video-decoder-input-queue-41004> Sink time: 0:00:19.469583599, Src Time: 0:00:19.469583599Current level time: 0:00:00.000000000