Prerequisites
What the machine, the cameras and the software environment have to provide. Check this before you install — two of these constraints cannot be worked around later.
- The two things to check first
- Computer hardware
- USB bandwidth and controller topology
- HDMI capture devices
- Cameras
- Displays
- The NVIDIA / NVENC constraint
- Software
- Runtime files that must be present
The two things to check first
Most requirements on this page can be met by buying something or installing something. Two cannot be fixed at the venue, so check them before anything else:
- Three genuinely independent USB 3.0 host controllers. Not three ports — three controllers. A laptop that routes all three ports through one root hub cannot carry three 1080p60 uncompressed feeds, and no setting changes that. See USB bandwidth.
- Cameras that output 1080p60 specifically. Not 1080p30, not 1080i60. The pipeline is hard-wired for 60 progressive frames per second. See Cameras.
Computer hardware
| Component | Minimum | Recommended |
|---|---|---|
| Operating system | Windows 11 64-bit (Pro or Home) | Windows 11 64-bit Pro |
| RAM | 32 GB. The shared-memory ring buffers alone take about 10 GB, plus per-process working sets, plus the OS, antivirus and a browser. Below 32 GB the system thrashes. | 64 GB — headroom for long sessions, viewer ring buffers raised above the default, and diagnostic tools running alongside. |
| Storage | 250 GB free SSD | About 500 GB free NVMe SSD. Tournament-day captures run 30–80 GB of mp4s per round. |
| GPU | NVIDIA GPU with NVENC (GTX 1660 or newer) | RTX 2060 or newer |
| NVIDIA driver | R570 or newer | Latest Studio or Game Ready release |
| USB | At least three USB 3.0 ports on independent root hubs | Three separate USB 3.0 host controllers, one per capture device |
| Display | Laptop display at 1920×1080 or better, plus one external 4K monitor | Laptop display plus two external 4K monitors |
The RAM figure is not padding. Three feeds each hold a 520-frame ring of uncompressed 1080p video across multiple channels, held in named shared-memory regions so that capture, motion and videogen can all reach the same frames without copying. That is the design; it is why the pipeline sustains 60 fps on three feeds with CPU-only motion detection.
USB bandwidth and controller topology
USB bandwidth is the silent killer
Three cameras at 1080p60 in YUY2 push roughly 1.2 GB/s in aggregate. Many laptops advertise
three USB 3.0 ports
but route all three through a single root hub that saturates
somewhere around 2.5 Gbps.
The symptom is deceptive: the feeds appear to start, processes show as Running, and then
Δ[0] in the title bar climbs without bound while frames arrive late or out
of order. Nothing reports an error. If in doubt, use a Thunderbolt-attached USB expansion or a
desktop tower.
How to check
- Plug in all three capture devices.
- Open Device Manager → View → Devices by connection.
- Each capture box should appear under a separate
USB xHCI Compliant Host Controller
entry.
If two of them share a controller, move one to a different physical port and check again. On many laptops the ports on opposite sides of the chassis are on different controllers while adjacent ports are not.
HDMI capture devices
Three USB 3.0 HDMI-to-USB capture devices are required, one per camera. The project has been
tested with USB-A 3.0 capture boxes identifying as USB\VID_345F&PID_2130
(device descriptor USB3. 0 capture
). Any UVC-compatible box delivering
1920×1080@60Hz in YUY2 should work, but that chipset is the one the test path covers.
Purchase checklist:
- USB 3.0 host interface (USB-A or USB-C). USB 2.0 cannot carry 1080p60 YUY2 — that is roughly 1.2 Gbps per stream.
- HDMI 1.4 or 2.0 input.
- Advertises 1920×1080 @ 60 Hz in YUY2. Many cheap units advertise
1080p60
but actually deliver 1080p30 or MJPEG. Verify the YUY2 60 Hz mode is really present using the Windows Camera app orcaptest.exe --listbefore committing to a model. - UVC-compliant, no proprietary driver. VDM goes through Windows Media Foundation, which speaks standard UVC. Vendor SDKs are not used and will not help.
- Buy three identical units. Mixing chipsets introduces per-stream timing
differences that show up as a growing
Δ[0].
Cameras
Three fixed-position cameras with 1080p60 HDMI output. This must be 1080p60 specifically — 1080p30 and 1080i60 will not work, because the pipeline is hard-wired for 60 progressive frames per second.
| Feed | Position | Coverage |
|---|---|---|
| Feed 0 [TOP] | Top of the landing hill | Approach and takeoff zone |
| Feed 1 [MIDDLE] | Middle, the k-point area | Primary view. This is the trigger camera — a jumper passing through the middle frame is what fires the movie commit. |
| Feed 2 [BOTTOM] | Bottom of the landing hill | Landing and outrun |
Position the cameras so coverage overlaps by at least 5 m between adjacent feeds.
Cameras must be locked in place after calibration
Grid-line calibration maps screen pixels to hill metres for one specific camera pose. Any movement invalidates it. The failure mode is not a crash or an error — the viewer keeps producing confident, plausible, wrong distances. Lock the mounts, and re-calibrate after any knock.
Displays
The controller's preview tab, the processes tab and a viewer window are genuinely hard to use crammed onto one screen. The recommended layout is: laptop display for the VDM controller, external monitor 1 for the live viewer doing distance measurement, external monitor 2 for fileviewer reviewing past jumps or for operator notes.
Whatever you use, set big_window_width and big_window_height to
match — they ship at 2880×1620 for a specific machine's panel and will be wrong on
yours. See Configuration § machine-specific
settings.
The NVIDIA / NVENC constraint
An NVIDIA GPU with NVENC support and an R570-or-newer driver is required for hardware H.264
encoding in videogen.exe. Verify the driver with:
nvidia-smi
The Driver Version column must read 570.xx or higher. An older driver fails
at the point videogen tries to load the NVENC interface, with a version error of the form
Required: 13.0 Found: 12.0.
What degrades without NVENC
NVENC is not load-bearing for the whole system. Only the merge-and-encode path uses the GPU — capture and motion detection are entirely CPU-based and are unaffected. When NVENC is unavailable, or when it is deliberately switched off, the encoder falls back to software H.264 (libx264).
| Function | With NVENC | Without NVENC (software fallback) |
|---|---|---|
| Capture of three 1080p60 feeds | Unaffected | Unaffected — no GPU involvement |
| Motion detection and triggering | Unaffected | Unaffected — CPU-only by design |
| Live preview and the viewer | Unaffected | Unaffected |
| Encoding jump clips | Hardware encode, minimal CPU cost | Works, but consumes substantial CPU. On a machine already running three captures and three motion detectors, that CPU is contended. |
| Continuous capfile recording of all three feeds | Hardware encode | Three simultaneous software encodes on top of everything else. verify on target hardware — whether a given machine sustains this without dropping frames has to be measured, not assumed. |
NVENC is switched off in the shipped configuration
The live configuration carries disable_nvenc_encoding=1. This is a workaround
for the behaviour of one specific GPU — an RTX 3070 Ti Laptop GPU — and is not a
general recommendation. On different hardware, try disable_nvenc_encoding=0 and
verify the encode path before concluding anything. If the machine encodes cleanly with NVENC
enabled, leave it enabled; you get the hardware path back and the CPU headroom with it.
The GPU is also selected by name rather than by index. *capfile_nvenc_gpu_name
holds a substring matched against the installed adapters, and
capfile_nvenc_gpu_index is -1 meaning resolve from the name
. On a
new machine the stored name will not match anything and must be re-selected. See
Installation § first run.
Software
| Package | Why | How to install |
|---|---|---|
| Visual C++ 2015–2022 Redistributable (x64) | Every VDM binary links against the MSVC runtime. Without it VDM.exe does not launch — VCRUNTIME140.dll not found, or a silent exit with code 0xc0000135. |
winget install --id Microsoft.VCRedist.2015+.x64, or download vc_redist.x64.exe from aka.ms. |
| NVIDIA Studio or Game Ready driver R570+ | NVENC hardware encoding. | nvidia.com. Verify with nvidia-smi. |
| Windows Media Foundation | The capture path. VDM opens the UVC capture devices through Media Foundation. | Part of Windows — nothing to install. Present on any standard Windows 11 image. |
| Antivirus folder exclusion | Load-bearing, and it goes wrong silently. Not software you install, but it belongs on this list. | Installation § antivirus exclusion. |
Bundled runtime libraries
These ship inside the package and are installed alongside the executables. You do not install them separately, but they must end up in the same directory as the binaries:
| Library | Files | Needed by |
|---|---|---|
| SDL3 | SDL3.dll |
viewer.exe, fileviewer.exe |
| FFmpeg libav 7.x (shared) | avcodec-61.dll, avformat-61.dll, avutil-59.dll, avfilter-10.dll, avdevice-61.dll, swscale-8.dll, swresample-5.dll |
videogen.exe, capfile.exe, practice_player.exe |
| FFmpeg support libraries | zlib1.dll, libbz2-1.dll, libiconv-2.dll, libwinpthread-1.dll |
Loaded indirectly by the libav DLLs |
The version suffixes matter. Mixing generations — an avcodec-61 next to a
leftover avutil-58 — produces missing-export errors that read like corruption
rather than a version mismatch. Verify-Install.ps1 runs a
LoadLibraryEx probe against each DLL, which catches exactly this.
Runtime files that must be present
These are data files, not code, and they must sit in the same directory as the executables:
| File | Purpose | If missing |
|---|---|---|
numbers.txt |
Bitmap font glyph table, used to draw jumper number, name and distance overlays onto video frames. | Overlays cannot render. |
NorgeLogo.png |
Logo bitmap for display. | Logo display unavailable; documented as optional in the replay tooling. |
jumpers.csv |
Tab-separated jumper roster for the event. Drives the jumper list in the controller's Preview tab. | No roster to select an active jumper from. |
settings.txt |
The entire configuration. See Configuration. | The controller searches for it — see config discovery — and falls back to compiled-in defaults, which are not calibrated for any real venue. |
pixel_frames.txt |
Auto-setup output: the pixel-to-frame timing correlation for the venue. Regenerated whenever settings are saved. | Auto-setup-derived timing is unavailable until you run auto-setup at the venue. |
Optional: sample footage
The capture_20180923 companion package is about 5.57 GiB of recorded hill footage.
It is not required to install or run VDM, but it is the only way to exercise the full pipeline
— motion detection, triggering, merge and encode — without cameras attached. Budget
6.5 GB free on the destination volume. See Sample footage.