The SDI Decoder receives an MPEG-TS stream over the network (UDP / RTP / SRT / RIST), decodes it, and plays it out of an SDI card port. This control panel is served by the device itself and talks to the decoder daemon running on the same box.
Signing In
The UI is served over HTTPS (self-signed cert - accept the one-time browser warning) and requires a login. A new device signs in with admin / admin - change the password on first use.
- Change the password in the UI: top bar → Change password (asks for the current password; any other signed-in browser is logged out). Forgotten password? Over SSH:
sudo fc-auth passwd. Preserved across redeploys. - Sessions last 24 hours; Log out (top-right) ends one sooner.
- Locked out? 5 failed attempts locks the account for 15 minutes - clear it with
sudo fc-auth reset-lockout. - Hub access: the central dashboard authenticates with a per-device API key (
sudo fc-auth show-apikey), pasted into the Hub's device settings.
Page Header
The header shows the device name, health status, IP address, and live system metrics (CPU, RAM, disk, temperature, SDI card temperature, network ↑/↓ with a live throughput sparkline, uptime). Five actions are available:
- Multi Preview: opens a grid of live thumbnails for every decoder instance in a new tab.
- Manual: this document.
- TS Streams: runs a short (~3 s) scan and lists the streams the box currently sees on the network - direction (In = received by this box, Out = sent by it), protocol (UDP, RTP, SRT, RIST), source, destination and measured bitrate. SRT and RIST are detected even when encrypted (SRT via its control channel, RIST via its tunnel header); RIST simple profile is plain RTP on the wire and shows as RTP. Useful for confirming the input actually arrives (and at what rate) before configuring a decoder; use Rescan to measure again.
- Diagnostics: downloads a diagnostics bundle from the device for support.
- Settings: device-level settings (auto-start, network, WireGuard). See Device Settings below.
Decoder Status
A summary strip shows counts of instances that are Running, Starting, Stopped, and in Error.
Decoder Instances
Each configured decoder is a row with these sections:
Identity & Status
The instance number, name, and current state.
Renaming: the name defaults to Decoder N. Click it (a pencil appears on hover) and type your own, e.g. Reuters or Camera 3 - Enter or ✓ saves, Esc or ✕ cancels, an empty field restores the default. Up to 40 characters. The name is stored on the decoder itself, not in your browser, so every operator on every browser sees the same name. Renaming is metadata only - a running decoder keeps playing, nothing restarts.
A restart counter (N×) appears when a running instance has restarted since launch. Status colors:
- 🟢 Running: decoding normally.
- 🟡 Unstable: running but has restarted at least once; check stability.
- 🔴 Error: the instance crashed or hit a fatal error.
- 🔵 Starting (pulsing): starting up or restarting.
- 🟡 No Output: the process is up, but no decoded frames are reaching the SDI output right now - a frozen output. Shown instead of a green Running so a stalled output is never presented as healthy. Brief at start-up (before the first frame); if it persists, the decoder is not producing a picture - check the input is arriving and decodable (
View log). A stalled decode is restarted automatically within a few seconds. - ⚪ Stopped: not running.
Input
The configured source. Hover to see the live incoming stream stats when running (format/codec, resolution, framerate, bitrate). On an SRT/RIST input a small live link badge appears next to the source (protocol, round-trip time, quality - e.g. SRT 12 ms · 100%); green is clean, amber/red mean recent loss activity, grey means no recent reports.
Output
The physical SDI port (e.g. SDI Output on a single-port card, or SDI #N). Hover to see the card and the live output signal (resolution / framerate / scan) while playing.
Uptime
How long the instance has been running.
Controls
Icon buttons (hover for the label):
- Start / Stop: both are always available, so a stuck
Startinginstance can still be stopped. - Restart: enabled when running or in error.
- Preview: opens a still thumbnail captured from the decoder's live input (running only). Available for network inputs (UDP/RTP/SRT/RIST); a decoder playing a local file or a test pattern has no live network stream, so it shows a short "no live preview" note instead.
- Link statistics (chart icon, SRT/RIST inputs only): graphs of the transport's link health over time - retransmissions, lost/dropped packets, round-trip time and bitrate, with range tabs 15 min / 24 h / 7 days / 30 days (10-second detail is kept 7 days, 1-minute summaries 30 days; the 15 min view refreshes live). Retransmissions that succeed are not damage - only Lost & dropped reach the output as picture/audio errors (for SRT that damage is reported under Dropped, its TLPKTDROP counter; for RIST, Lost = unrecovered, Dropped = too late / buffer full).
- View log: recent daemon/FFmpeg log lines for this instance.
- Settings: open the configuration dialog (below).
Configuration
ℹ️ Always live. The Settings dialog loads the decoder's current, authoritative config from the box each time it opens, so it never shows a stale snapshot.
Input tab
Pick the Input Type and fill in its fields:
- File Playback: a file path, with optional Loop.
- MPEG-TS (UDP): multicast/unicast IP + UDP port, optional local interface IP for the multicast join, and an Input Profile:
- Low latency: minimal buffering (~150 ms), for short-GOP low-latency sources.
- Normal quality: deep receive buffer (~4 s capacity) for B-frame / long-GOP sources; guarantees a clean start at the cost of up to ~2–3 s latency.
The source format (H.264 / H.265 4:2:0 / H.265 4:2:2) is detected automatically and the matching decode pipeline is selected; on a format change the decoder adapts by itself within ~40 seconds. H.265 4:2:2 gets the dedicated fast pipeline at both bit depths and plays at full rate; that pipeline uses a deep receive buffer, so a 4:2:2 source carries a few seconds of standing latency.
- RTP: multicast/unicast IP + RTP port, optional local interface IP.
- SRT: connection mode (listener/caller/rendezvous), host/port, latency, optional stream ID, and optional AES passphrase + key length.
- RIST: profile, connection mode, host/port, recovery buffer, and (main profile) an optional pre-shared key + cipher.
- Test Pattern: pattern, resolution, frame rate, and an audio tone frequency (0 = silence).
⚠️ Match the profile to the source. If a decoder in
Low latencyjoins a long-GOP / B-frame stream, the start can land mid-GOP and produce a permanently corrupted picture with continuous "Circular buffer overrun" messages. Switch toNormal qualityand restart to fix it deterministically.
SDI Output tab
- SDI Port: the SDI output port (disabled when the card has a single port).
- Video Mode: the SDI playout mode (resolution / frame rate / interlaced or progressive).
- Deinterlace source (i→p): off + an interlaced mode = interlaced passthrough; on + a progressive mode = deinterlace to progressive at field rate.
ℹ️ The SDI output is 8-bit 4:2:2. Whatever the input stream is, the picture leaving the SDI connector is 8-bit
4:2:2(uyvy422). A 10-bit source - includingH.265 4:2:2 10-bit- is decoded at full 10-bit precision and then converted to 8-bit for playout. This matters only where the SDI output feeds something that itself grades or re-encodes; for monitoring and normal distribution it is not visible.ℹ️ A source with no audio plays out as video only. If the incoming stream carries no audio track, the decoder starts anyway and the SDI output simply has no embedded audio - it no longer refuses to start.
Audio tab
The decoder embeds up to 16 audio channels on the SDI output. By default it embeds everything the incoming stream carries, in the order the tracks arrive, up to 16.
⚠️ This is a change. Older software embedded only the first audio track, two channels, and discarded the rest without saying so. After an update a box that has not been reconfigured starts delivering the audio it was always being sent. That is intended - but if something downstream was relying on channels 3-16 being silent, it will now hear them.
Each SDI channel names its source as track : channel, both counted from 0 - 0:0 is the first channel of the first track, 1:1 is the second channel of
the second track. Leave a row blank for a deliberately silent channel.
Why track:channel and not one flat list. The same 16 channels can arrive as eight stereo tracks, two four-channel tracks, or one track of sixteen. With a single flat list of numbers, the moment the far end sent one track fewer every channel above the gap would shift onto the wrong SDI pair - silently, mid-event. Naming the track means the mapping keeps meaning the same thing when the source is reconfigured.
A channel whose source is not in the stream is silent, and the tab says so, with the reason ("input carries 2 audio tracks"). The decoder does not refuse to start and does not quietly fall back to the first track. If you meet unexpected silence, that is the field to read.
Widths are 2, 8 or 16 - the only widths the SDI embedder accepts - so a map of three channels goes out as eight, with five silent.
Two behaviours to know before relying on it:
- The decoder reads the stream before its first start - a probe of one to two seconds - and builds the audio mapping and the decode pipeline from what it finds, so a normal start involves no restart. It restarts only when the stream was not there yet at start (it retries until it is) or when the source changes its format or track layout later.
- If a mapped track disappears while the decoder is running, the decoder restarts to rebuild the mapping - a brief interruption to the picture, not just the audio. A track that was never there is simply silence, with no restart.
Use Save and close to apply, or Discard changes and close to cancel.
Device Settings
The Settings button in the page header opens device-level settings; these apply to the whole box, not a single decoder instance:
- General → Auto-start streaming on boot: when enabled, the configured decoder instances start automatically when the box powers up.
- Network: per-NIC IP configuration written to the device's netplan. Each physical interface can be set to
DHCP (automatic)orStatic IP(address in CIDR form, e.g.10.0.0.5/24, optional gateway, up to 4 DNS servers). - WireGuard: dial-home VPN tunnel for remote support. Device keypair (generate/rotate; the private key never leaves the device), hub peer settings (public key, endpoint, allowed IPs, keepalive) and a live status strip (tunnel up/down, last handshake, transfer).
⚠️ Network changes auto-revert. In the Network tab, Save & Apply writes the netplan and applies it immediately, then arms a 120-second timer: if you don't confirm within that window the box rolls back to the previous network config, so a change that cuts your own connection to the device undoes itself. Confirm to keep it.
Troubleshooting
- No streams under TS Streams: confirm the source is actually multicasting to this box's network and that any multicast join uses the right local interface.
- Instance keeps restarting (Unstable): check
View log; for MPEG-TS sources try theNormal qualityinput profile if the source uses B-frames / a long GOP. - No output / wrong picture on SDI: verify the Video Mode matches the SDI monitor's expected format (the source format itself is detected automatically).
- Nothing updates: the panel refreshes on a timer; reload the page if needed.