Skip to content
ULAP ONE
Research preview
AI-RAN WG3 · WI#6 · edge video

Video analytics

HLS over this origin

Does the picture survive the link degrading? Four streams, four probed geometries, and one sharpness measurement that is explicitly not a reference metric.

Mode · not reported UL (sim) not measured SR · not reported SR-HQ · not reported
Waiting Not a snapshot Updated nothing has answered yet Sources 0 of 8 sources answering · 8 waiting
Mode controller no answer yet SR worker · SPAN display no answer yet SR worker · RealESRGAN archive no answer yet Uplink series no answer yet Video ingest no answer yet MediaMTX paths no answer yet
Data provenance

What this page reads, and what it is allowed to conclude

Waiting

Identity

Read by
Your browser, over this origin. No server-side cache sits in between.
Mode
Live poll. This is not a snapshot and it is not a recording.
Last read
not yet
Sources
8

Measurements

Mode controller
Waiting · never
GET /api/mode/status · every 1 s · operating mode, hysteresis thresholds and dwell progress
SR worker · SPAN display
Waiting · never
GET /api/sr/stats · GET /api/sr/config · every 1 s · worker state, delivered frame rate, drop rate, probed input geometry and the sharpness measurement
SR worker · RealESRGAN archive
Waiting · never
GET /api/srq/stats · GET /api/srq/config · every 1 s · archive worker state and the geometry it publishes to the sr-hq path
Uplink series
Waiting · never
GET /api/prom/api/v1/query?query=ran_ul_throughput_mbps{job="metrics-sim"} · every 1 s · the simulated uplink trace, pinned to one producer so the tile cannot silently read the adapter instead
Video ingest
Waiting · never
GET /api/ingest/status · every 5 s · the encode settings ffmpeg is running right now for the native and degraded paths
MediaMTX paths
Waiting · never
GET /api/mediamtx/v3/paths/list · every 10 s · per-path readiness, codec tracks and reader count — codecs only, never resolution
Source list
Waiting · never
GET /api/ingest/videos · every 30 s · the selectable video files; the active one comes from GET /api/ingest/health
5G UE video path
Waiting · never
GET /api/ran/ue/video/status · every 5 s · whether the degraded stream is being sent through a real 5G UE rather than from a file

Thresholds, and where they come from

Stale after 2.5 poll cadences (floor 4 s, cap 90 s)
Source: ui/src/lib/domain/liveness.svelte.ts — derived from wall clock, not set by the poll, so a loop that DIED is still detected
Not answering after 3 consecutive misses
Source: ui/src/lib/domain/liveness.svelte.ts — one miss is a blip, three is a fault
Static after 20 poll cadences with no change in the reported value (floor 60 s, cap 5 min)
Source: ui/src/lib/domain/liveness.svelte.ts — an ORTHOGONAL axis. A static source is still live: it answered. The two facts are separate because on 2026-08-03 a tile read 0.0 Mbps for fifteen minutes beside a chip that said "Live · just now". Only sources that report their value to feed.ok(id, value) are judged; the rest claim nothing.

What this proves

  • Each source above answered your browser at the stated time, over this origin.
  • Every stream geometry on this page came from one of those answers.

What this does NOT prove

  • A path that MediaMTX calls ready is a path something is publishing. It is not a statement that the picture is correct, in focus, or the one you think you are watching.
  • The uplink number is the SIMULATED trace. It is pinned to job="metrics-sim" so it cannot silently become the adapter series, but it is still not a measured radio number.
  • A declared frame rate is not a delivered one. Both are shown where the worker reports both.

Environment

Transport
HLS, segmented, over this origin. Latency is seconds by construction.
GPU
One GB10 shared by both SR workers and, in the co-tenancy demo, by the RAN.
Uplink series
metrics-sim replaying a CSV trace, unless real UPF metrics have been started.

Provenance

Mode controller
GET /api/mode/status · every 1 s
SR worker · SPAN display
GET /api/sr/stats · GET /api/sr/config · every 1 s
SR worker · RealESRGAN archive
GET /api/srq/stats · GET /api/srq/config · every 1 s
Uplink series
GET /api/prom/api/v1/query?query=ran_ul_throughput_mbps{job="metrics-sim"} · every 1 s
Video ingest
GET /api/ingest/status · every 5 s
MediaMTX paths
GET /api/mediamtx/v3/paths/list · every 10 s
Source list
GET /api/ingest/videos · every 30 s
5G UE video path
GET /api/ran/ue/video/status · every 5 s
Caveat, verbatim

Research preview. The uplink series driving the mode switch is a simulated trace, and the sharpness gain is a no-reference metric that does not claim PSNR against the native stream.

Raw source

  • ui/src/lib/domain/gateway.ts — METRIC_GAPS the two gaps this route is subject to

Native stream

not probed not probed MediaMTX not probed

The uplink as video-ingest encodes it before any impairment is applied. The badge is the encode setting video-ingest reports, not a measurement of the picture that reached you.

Degraded stream

not probed not probed MediaMTX not probed
QUALITY: no preset reported yet

The same source re-encoded to the selected impairment preset. This is what the link is assumed to deliver in a disaster. Encode in force: not probed. That line and the badge above come from the same answer, so they cannot disagree.

SR enhanced stream

not probed not probed MediaMTX not probed

The degraded picture put back up through SPAN on the GPU. The display path. Model not reported (--) · input probed as not probed · device not reported. The badge above the picture is the delivered rate where the worker reports one; the declared encoder rate is named in the drawer. The gain badge is a no-reference Laplacian-variance gain over a bicubic upscale of the same input and does not claim PSNR against the native stream, because there is no synchronised ground truth at this worker.

SR-HQ archive

not probed not probed MediaMTX not probed

The same input through RealESRGAN for recordings. Not a real-time path and never was. Model not reported · input probed as not probed. Measured on this box at 0.7 fps against a declared target of 5, so the archive path is not and has never been real time.

Mode switching and performance

hysteresis
UL throughput (sim) not measured Pinned to job=metrics-sim. The unpinned series has two producers.
Degrade threshold not reported
Recover threshold not reported
Dwell timer --
Mode transitions --
SR frames processed --
SR frames dropped --
SR delivered rate not measured
SR end-to-end latency --
SR-HQ delivered rate not measured
SR MODEL:

The controller did not report whether it is force-locked, so whether hysteresis or a manual force is deciding the mode above is not known. Hysteresis prevents flapping: the condition must persist for the full dwell time before the mode switches, and both thresholds are read from the controller rather than assumed here. A threshold that has not been reported reads not reported rather than the compose default. The uplink series driving all of this is the simulated trace unless real UPF metrics have been started, and it is pinned to a single producer so the tile cannot quietly become the adapter's number.

Video source

video-ingest
No sources reported by video-ingest

The 5G UE path is opt-in and the operator starts it; compose never brings it up. When ran-manager is not running the strip above reads not deployed for it rather than a red, and the buttons here stay enabled because nothing is streaming through a UE.

Stream health

mediamtx
MediaMTX path health — readiness, codec tracks and reader count for the four HLS paths
PATHSTATETRACKSREADERS
MediaMTX did not answer, so nothing is asserted about path readiness.

MediaMTX reports readiness, codec tracks and reader count. It does not report resolution or frame rate, so no badge on this page is derived from it — the geometries come from video-ingest and from the two SR workers, and the drawer names which is which.

On transport: the gateway proxies WHEP signalling only. WebRTC media is ICE over UDP straight from your browser to whatever address MediaMTX advertises as a candidate, which this proxy neither sees nor rewrites, so the frames above use HLS instead. HLS is segmented and its latency is seconds; that is a deliberate trade, not a fault.

Stream geometry

Where each badge comes from, and what kind of claim it is

native · not probed degraded · not probed sr · not probed sr-hq · not probed

Identity

native
video-ingest ffmpeg — the configured native encode
degraded
video-ingest ffmpeg — the active impairment preset
sr
sr-worker, SPAN on the GPU, display path
sr-hq
sr-worker-quality, RealESRGAN x4plus, archive path

Measurements

native
not probed · not probed
video-ingest has not answered, so nothing is claimed about the native geometry.
degraded
not probed · not probed
video-ingest has not answered, so nothing is claimed about the degraded geometry.
sr
not probed · not probed
The SPAN worker has not answered, so nothing is claimed about the SR geometry.
sr-hq
not probed · not probed
The archive worker has not answered, so nothing is claimed about the SR-HQ geometry.
SR input, as the worker probed it
not probed
ffprobed per connection and renegotiated when the operator switches the degraded preset. It was a string literal until 2026-08-03, which is why both SR panels rendered as diagonal shear on any preset but heavy.
SR-HQ input, as the worker probed it
not probed
Same mechanism, on the archive worker.

Thresholds, and where they come from

A badge is drawn only from an answer otherwise it reads "not probed"
Source: ui/src/routes/video/+page.svelte — there is no hardcoded resolution and no fallback resolution left in this route
A rate is the DELIVERED rate where the worker reports one achieved_fps over the last 60 s
Source: services/sr-worker/main.py — target_fps is what the encoder is told; achieved_fps is what the pipeline sustains, and on the GB10 they differ by a factor of three

What this proves

  • Each geometry above was reported by the named service to this browser at the time the strip states.
  • Nothing on this page invents a resolution or a frame rate when a service does not answer.

What this does NOT prove

  • A geometry reported by video-ingest is the encode SETTING, not a measurement of the picture that reached a viewer.
  • A declared frame rate is not a delivered one. Measured on this box, SPAN delivers 4.6 fps against a target of 15 and RealESRGAN 0.7 fps against a target of 5; the shortfall is dropped, not queued.
  • MediaMTX reports codec tracks, not resolution, so no badge here is derived from it — its list only proves a path is being published.
  • Nothing here says the SR picture is more USEFUL than the degraded one. Sharpness is not utility.

Environment

Box
GB10, aarch64, dev class. Not an NVIDIA-qualified RAN platform.
Transport
HLS over this origin. Segmented, so latency is seconds, not the sub-second WebRTC promises.
Both SR workers
Share one GPU. The measured rates above were taken with both running.

Provenance

native / degraded
GET /api/ingest/status
sr
GET /api/sr/config · GET /api/sr/stats
sr-hq
GET /api/srq/config · GET /api/srq/stats
readiness and codecs
GET /api/mediamtx/v3/paths/list
Caveat, verbatim

Until 2026-08-04 three of these four badges were string literals in this file. Only the degraded card reprobed, and with the backend blocked even that fell back to a hardcoded 480P at 15FPS. The SR card carried "1080P @ 30FPS (AI)" while its own model line, directly beneath it, read 640x360 at 10fps to 1920x1080 at 15fps. Every badge is probed now, and an unanswered probe reads "not probed" rather than a resolution.

Raw source

  • services/video-ingest/main.py — get_status()
  • services/sr-worker/main.py — get_config() and get_stats()
  • services/sr-worker/README.md the capture-geometry probe and its renegotiation
Super-resolution

How the sharpness gain is measured, and what it is not

No gain measured Never PSNR

Identity

Display model
not reported
Upscale
not reported
Device
not reported
Archive model
not reported
Method
laplacian-variance (no-reference, EMA)

Measurements

Sharpness gain over bicubic
not measured
Laplacian variance of the SR output against the Laplacian variance of a bicubic upscale of the SAME input frame.
Bicubic baseline (lapvar)
not measured
The denominator. A zero baseline means the gain is undefined, and the badge is withheld rather than shown as a large number.
SR output (lapvar)
not measured
The numerator.
Delivered frame rate
not measured
Against a declared target of -- fps. The gap is paid in dropped frames by design.
Drop rate
not measured
Frames the bounded queue discarded. Latency is held by dropping, never by queueing.
Frames re-sent to hold the publisher open
not measured
A held frame keeps the RTSP publisher alive when the model could not produce one in time. It is how "the picture is still" differs from "the picture is live".
End-to-end latency
not measured
Inside the worker. It does not include the HLS segment delay, which is seconds.

Thresholds, and where they come from

The gain badge is drawn only when all three hold worker active · mode degraded · bicubic baseline above zero
Source: ui/src/routes/video/+page.svelte — showGain

What this proves

  • The SR output is measurably sharper than a bicubic upscale of the same degraded input, by Laplacian variance, at the moment stated.
  • The pipeline from the degraded path through the model to a published 1920x1080 stream is end to end and real.

What this does NOT prove

  • It does NOT claim PSNR, SSIM or any reference metric against the native stream. There is no synchronised ground truth at this worker, and the metric-gap register records that as a gap rather than filling it.
  • It does NOT mean detail was recovered. A no-reference sharpness metric rises for edge enhancement and for hallucinated texture alike.
  • It does NOT mean the SR path keeps up. It delivers a fraction of its declared rate on this box, and the shortfall is dropped frames.
  • A sharper picture is not a more useful picture for a responder. Nothing here measures task performance.

Environment

Box
GB10, aarch64, sm_121. Both SR workers share the one GPU.
Display path
SPAN, NTIRE 2024. The 100+ fps figure is SPAN’s published GPU capability, never a GB10 pipeline result.
Archive path
RealESRGAN x4plus. Measured 0.7 fps from 640x360 against a target of 5.
Frame interpolation
RiFE is disabled in the released demonstrator — no weights are shipped, so output stays at the input rate.

Provenance

Sharpness, rates, drops
GET /api/sr/stats
Model, device, geometry
GET /api/sr/config
Archive worker
GET /api/srq/stats · GET /api/srq/config
Uplink driving the mode
GET /api/prom/api/v1/query?query=ran_ul_throughput_mbps{job="metrics-sim"}
Caveat, verbatim

The gain badge is a no-reference Laplacian-variance sharpness gain of the SR output over a bicubic upscale of the same input. It is not PSNR against the native stream and does not claim to be: there is no synchronised ground truth at this worker, and that absence is recorded in the metric-producer gap register rather than papered over.

Raw source

  • ui/src/lib/domain/gateway.ts — METRIC_GAPS the PSNR gap and the SR-HQ readiness gap
  • services/sr-worker/main.py — sharpness EMA
Amini Amini Infratech for the Global South

Every link and every data fetch on this console is origin-relative. One origin fans out by path: / gateway, /video/, /grafana/, /prom/, /api/. An absolute http://localhost:NNNN URL works on exactly one machine, the one it was written on, and is blocked as mixed content the moment the page is served over https, which is how every operator actually reaches this stack.