So, I wrote a simple Python code to measure a pipeline like this:
import gi
import time
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GObject, GLib
class TimeMeasure:
render_name = "eglglessink0"
def __init__(self):
self.start_time = time.time()
self.full_frame_start = time.time()
self.name = "none"
def make(self, element_name):
now = time.time()
diff = now - self.start_time
if self.name == TimeMeasure.render_name:
diff2 = now - self.full_frame_start
print(f"{self.name} time: {diff*1000:.3f} ms, full time: {diff2*1000:.3f}\n")
self.full_frame_start = now
else:
print(f"{self.name} time: {diff * 1000:.3f} ms")
self.start_time = now
self.name = element_name
def probe_time(pad, info, user_data):
measure, name = user_data
measure.make(name)
return Gst.PadProbeReturn.OK
def main():
Gst.init(None)
loop = GLib.MainLoop()
time_measure = TimeMeasure()
pipeline_string = "udpsrc port=5600 ! application/x-rtp ! rtph264depay ! h264parse ! nvv4l2decoder low-latency-mode=true ! nveglglessink sync=false max-lateness=10000"
# pipeline_string = "udpsrc port=5600 ! application/x-rtp ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink"
pipeline = Gst.parse_launch(pipeline_string)
for element in pipeline.children:
element_name = element.get_name()
pad = element.get_static_pad("sink")
if pad is None:
pad = element.get_static_pad("src")
pad.add_probe(Gst.PadProbeType.BUFFER, probe_time, [time_measure, element_name])
pipeline.set_state(Gst.State.PLAYING)
try:
loop.run()
except KeyboardInterrupt:
pass
finally:
pipeline.set_state(Gst.State.NULL)
if __name__ == "__main__":
main()
And receive timing:
udpsrc port=5600 ! application/x-rtp ! rtph264depay ! h264parse ! nvv4l2decoder low-latency-mode=true ! nveglglessink sync=false max-lateness=10000
udpsrc0 time: 0.030 ms
capsfilter0 time: 0.017 ms
rtph264depay0 time: 0.756 ms
udpsrc0 time: 0.017 ms
capsfilter0 time: 0.012 ms
rtph264depay0 time: 0.593 ms
udpsrc0 time: 0.009 ms
capsfilter0 time: 0.007 ms
rtph264depay0 time: 0.019 ms
h264parse0 time: 0.030 ms
nvv4l2decoder0 time: 1.021 ms
eglglessink0 time: 17.537 ms, full time: 20.048
udpsrc0 time: 0.069 ms
capsfilter0 time: 0.045 ms
rtph264depay0 time: 0.628 ms
udpsrc0 time: 0.031 ms
capsfilter0 time: 0.020 ms
rtph264depay0 time: 0.538 ms
udpsrc0 time: 0.014 ms
capsfilter0 time: 0.012 ms
rtph264depay0 time: 0.032 ms
h264parse0 time: 0.035 ms
nvv4l2decoder0 time: 1.789 ms
eglglessink0 time: 16.677 ms, full time: 19.891
udpsrc0 time: 0.038 ms
capsfilter0 time: 0.018 ms
rtph264depay0 time: 0.754 ms
udpsrc0 time: 0.018 ms
capsfilter0 time: 0.011 ms
rtph264depay0 time: 0.513 ms
udpsrc0 time: 0.010 ms
capsfilter0 time: 0.007 ms
rtph264depay0 time: 0.020 ms
h264parse0 time: 0.031 ms
nvv4l2decoder0 time: 1.022 ms
eglglessink0 time: 19.916 ms, full time: 22.358
udpsrc0 time: 0.031 ms
capsfilter0 time: 0.017 ms
rtph264depay0 time: 0.753 ms
udpsrc0 time: 0.012 ms
capsfilter0 time: 0.009 ms
rtph264depay0 time: 0.594 ms
udpsrc0 time: 0.009 ms
capsfilter0 time: 0.007 ms
rtph264depay0 time: 0.020 ms
h264parse0 time: 0.031 ms
nvv4l2decoder0 time: 1.869 ms
eglglessink0 time: 14.774 ms, full time: 18.128
udpsrc0 time: 0.037 ms
capsfilter0 time: 0.018 ms
rtph264depay0 time: 0.744 ms
udpsrc0 time: 0.017 ms
capsfilter0 time: 0.012 ms
rtph264depay0 time: 0.602 ms
udpsrc0 time: 0.010 ms
capsfilter0 time: 0.008 ms
rtph264depay0 time: 0.020 ms
h264parse0 time: 0.031 ms
nvv4l2decoder0 time: 0.966 ms
eglglessink0 time: 17.170 ms, full time: 19.635
udpsrc0 time: 0.029 ms
capsfilter0 time: 0.017 ms
rtph264depay0 time: 0.750 ms
udpsrc0 time: 0.014 ms
capsfilter0 time: 0.010 ms
rtph264depay0 time: 0.618 ms
udpsrc0 time: 0.011 ms
capsfilter0 time: 0.009 ms
rtph264depay0 time: 0.030 ms
h264parse0 time: 0.034 ms
nvv4l2decoder0 time: 0.993 ms
eglglessink0 time: 18.898 ms, full time: 21.415
udpsrc port=5600 ! application/x-rtp ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink
udpsrc0 time: 0.027 ms
capsfilter0 time: 0.013 ms
rtph264depay0 time: 0.766 ms
udpsrc0 time: 0.014 ms
capsfilter0 time: 0.008 ms
rtph264depay0 time: 0.670 ms
udpsrc0 time: 0.012 ms
capsfilter0 time: 0.008 ms
rtph264depay0 time: 0.021 ms
h264parse0 time: 0.023 ms
avdec_h264-0 time: 19.234 ms
udpsrc0 time: 0.036 ms
capsfilter0 time: 0.015 ms
rtph264depay0 time: 0.744 ms
udpsrc0 time: 0.013 ms
capsfilter0 time: 0.008 ms
rtph264depay0 time: 0.600 ms
udpsrc0 time: 0.013 ms
capsfilter0 time: 0.008 ms
rtph264depay0 time: 0.021 ms
h264parse0 time: 0.024 ms
avdec_h264-0 time: 4.805 ms
videoconvert0 time: 0.032 ms
autovideosink0 time: 12.437 ms, full time: 39.550
udpsrc0 time: 0.039 ms
capsfilter0 time: 0.025 ms
rtph264depay0 time: 0.721 ms
udpsrc0 time: 0.018 ms
capsfilter0 time: 0.012 ms
rtph264depay0 time: 0.611 ms
udpsrc0 time: 0.017 ms
capsfilter0 time: 0.009 ms
rtph264depay0 time: 0.021 ms
h264parse0 time: 0.024 ms
avdec_h264-0 time: 18.365 ms
udpsrc0 time: 0.042 ms
capsfilter0 time: 0.019 ms
rtph264depay0 time: 0.722 ms
udpsrc0 time: 0.013 ms
capsfilter0 time: 0.009 ms
rtph264depay0 time: 0.448 ms
udpsrc0 time: 0.010 ms
capsfilter0 time: 0.008 ms
rtph264depay0 time: 0.021 ms
h264parse0 time: 0.025 ms
avdec_h264-0 time: 5.935 ms
videoconvert0 time: 0.041 ms
autovideosink0 time: 13.408 ms, full time: 40.562
udpsrc0 time: 0.036 ms
capsfilter0 time: 0.020 ms
rtph264depay0 time: 0.734 ms
udpsrc0 time: 0.016 ms
capsfilter0 time: 0.010 ms
rtph264depay0 time: 0.641 ms
udpsrc0 time: 0.010 ms
capsfilter0 time: 0.008 ms
rtph264depay0 time: 0.021 ms
h264parse0 time: 0.023 ms
avdec_h264-0 time: 17.155 ms
udpsrc0 time: 0.040 ms
capsfilter0 time: 0.017 ms
rtph264depay0 time: 0.721 ms
udpsrc0 time: 0.012 ms
capsfilter0 time: 0.009 ms
rtph264depay0 time: 0.735 ms
udpsrc0 time: 0.023 ms
capsfilter0 time: 0.014 ms
rtph264depay0 time: 0.034 ms
h264parse0 time: 0.036 ms
avdec_h264-0 time: 6.248 ms
videoconvert0 time: 0.039 ms
autovideosink0 time: 11.642 ms, full time: 38.244
udpsrc0 time: 0.033 ms
capsfilter0 time: 0.016 ms
rtph264depay0 time: 0.770 ms
udpsrc0 time: 0.029 ms
capsfilter0 time: 0.017 ms
rtph264depay0 time: 0.347 ms
udpsrc0 time: 0.016 ms
capsfilter0 time: 0.013 ms
rtph264depay0 time: 0.031 ms
h264parse0 time: 0.038 ms
avdec_h264-0 time: 19.574 ms
udpsrc0 time: 0.038 ms
capsfilter0 time: 0.024 ms
rtph264depay0 time: 0.723 ms
udpsrc0 time: 0.013 ms
capsfilter0 time: 0.008 ms
rtph264depay0 time: 0.383 ms
udpsrc0 time: 0.012 ms
capsfilter0 time: 0.008 ms
rtph264depay0 time: 0.021 ms
h264parse0 time: 0.023 ms
avdec_h264-0 time: 4.833 ms
videoconvert0 time: 0.032 ms
autovideosink0 time: 12.463 ms, full time: 39.467
udpsrc0 time: 0.033 ms
capsfilter0 time: 0.014 ms
rtph264depay0 time: 0.745 ms
udpsrc0 time: 0.012 ms
capsfilter0 time: 0.010 ms
rtph264depay0 time: 0.352 ms
udpsrc0 time: 0.013 ms
capsfilter0 time: 0.008 ms
rtph264depay0 time: 0.022 ms
h264parse0 time: 0.022 ms
avdec_h264-0 time: 18.559 ms
udpsrc0 time: 0.034 ms
capsfilter0 time: 0.013 ms
rtph264depay0 time: 0.753 ms
udpsrc0 time: 0.013 ms
capsfilter0 time: 0.008 ms
rtph264depay0 time: 0.418 ms
udpsrc0 time: 0.014 ms
capsfilter0 time: 0.008 ms
rtph264depay0 time: 0.021 ms
h264parse0 time: 0.023 ms
avdec_h264-0 time: 4.812 ms
videoconvert0 time: 0.027 ms
autovideosink0 time: 14.682 ms, full time: 40.616
Also, I measured network latency:
ping -s 20000 -c 8 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 20000(20028) bytes of data.
20008 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=3.52 ms
20008 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=3.51 ms
20008 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=3.54 ms
20008 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=3.51 ms
20008 bytes from 192.168.1.2: icmp_seq=5 ttl=64 time=3.49 ms
20008 bytes from 192.168.1.2: icmp_seq=6 ttl=64 time=3.50 ms
20008 bytes from 192.168.1.2: icmp_seq=7 ttl=64 time=3.50 ms
20008 bytes from 192.168.1.2: icmp_seq=8 ttl=64 time=3.49 ms
And the results are unclear to me. My IP camera source has 60fps, while the monitor has a 60Hz refresh rate. So, why is the full interval between frames around 20ms and 40ms, rather than around 1/60s? Additionally, why is the full (IP camera encode + desktop decode and display) pipeline latency for both variants the same, at around 90-120ms?
I strongly desire to achieve a full latency of not more than 60ms on a device that can decode a frame in 1ms :)