Initial commit

This commit is contained in:
2024-06-24 11:55:56 +03:00
commit 9c622e0ff4
8 changed files with 535 additions and 0 deletions

81
README.md Normal file
View File

@@ -0,0 +1,81 @@
# GStreamer Microsecond Timestamp Overlay
This is an adaptation of the `clockoverlay` and `timeoverlay` plugins from gstreamer-base. Stripped bare and just overlaying the Linux epoch time, with a microsecond resolution.
## Use-case Examples
A single stream solution can be tested like this:
```bash
gst-launch-1.0 \
videotestsrc is-live=true do-timestamp=true \
! msoverlay halignment=left valignment=top \
! video/x-raw,format=RGB,framerate=30/1,width=640,height=480 \
! videoconvert \
! video/x-raw,format=NV12 \
! nvautogpuh264enc tune=3 \
! rtph264pay config-interval=0 pt=96 \
! rtph264depay \
! h264parse \
! nvh264dec \
! msoverlay halignment=left valignment=bottom \
! autovideosink
```
Take a screenshot of the output above and subtract the top-left number from the bottom-left to see the total pipeline latency.
For a more comprehensive solution we can also make the stream traverse the network stack:
Server:
```bash
gst-launch-1.0 videotestsrc is-live=true do-timestamp=true ! msoverlay halignment=left valignment=top ! video/x-raw,format=RGB,framerate=60/1,width=1920,height=1080 ! videoconvert ! video/x-raw,format=NV12 ! nvautogpuh264enc tune=3 ! rtph264pay config-interval=1 pt=96 ! rtpsink uri=rtp://127.0.0.1:5000
```
Live client:
```bash
gst-launch-1.0 rtpsrc uri=rtp://127.0.0.1:5000?encoding-name=H264 ! rtph264depay ! h264parse ! nvh264dec ! msoverlay halignment=left valignment=bottom ! autovideosink
```
PNG sampling client outputting 5 frames, one per second:
```bash
gst-launch-1.0 rtpsrc uri=rtp://127.0.0.1:5000?encoding-name=H264 ! rtph264depay ! h264parse ! nvh264dec ! msoverlay halignment=left valignment=bottom ! videorate drop-only=true ! video/x-raw,framerate=1/1 ! pngenc ! multifilesink num-buffers=10 location="latency_%02d.png"
```
It is essential both the client and server run on the same machine, unless you _really_ trust your system clock accuracy.
## Dependencies
TODO. Basically the same dependencies as for building the gstreamer-plugins-base packages.
## Building
```bash
# Assuming you're in the project root
# Option A is to use the submodule to fetch the GStreamer sources:
git submodule update --init --recursive
# Older versions require deleting the builddir and omitting the '--reconfigure' option
meson setup --reconfigure builddir
# Option B is to use an existing GStreamer source by specifying the 'gst_root' (the GStreamer mono-repo root)
# meson setup --reconfigure builddir -Dgst_root=${WHERE_I_CLONED_GSTREAMER}/gstreamer
meson compile -C builddir
# This will install the built plugin file
meson install -C builddir
# Confirm installation
gst-inspect-1.0 | grep msoverlay
```
## Verification
This should show you a fairly extensive list of options and details:
```bash
gst-inspect-1.0 msoverlay
```