19ddaf2ddee4e73e67a07ed0e01e8733b8215930
MVP Phase 8 feature: headless Chromium snapshot URL → PNG → existing icon
overlay infrastructure. Use case — Grafana dashboard, web chat, любой
HTML widget с transparent background поверх video composite.
Архитектура:
BrowserRenderer launches один shared Chromium instance, per-dashboard
page. Loop:
page.reload (для свежих данных — Grafana auto-refresh не triggers
в headless mode без user interaction)
page.add_style_tag (re-inject transparent CSS — reload teryает styles)
page.wait_for_selector (если selector задан)
page.screenshot(omit_background=True) или locator(selector).screenshot
save PNG к icon_dir
dispatcher._reload_icon → filter re-reads atlas
Config (dynamic_overlays.dashboards в controller.yaml):
id, target_instance, cell, url, x, y, w_px, h_px,
refresh_sec (default 2.0s, min 0.5s — frequent reload bad см. stutter memory),
inject_css (default — transparent background + zero margins),
selector (optional CSS selector — экспортить только конкретный element),
viewport_w/h (override page viewport, default = w_px/h_px;
полезно при selector чтобы page layout не collapsed),
wait_until, page_timeout_ms, opacity, z_order.
Dockerfile:
+ pip install playwright
+ playwright install --with-deps chromium (~170MB Chromium + ~150MB system libs)
Если dashboards не нужны — можно убрать оба install'а (playwright
import lazy, BrowserRenderer.start() graceful no-op без playwright).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
vf-cuda-grid
GPU-native video grid composer — FFmpeg filter + control-plane sidecar для multi-camera mosaic composition с runtime layout switching, rich overlays и интеграцией с Home Assistant / Frigate / любой MQTT-системой.
Статус: дизайн зафиксирован — см. docs/design.md. Имплементация
не начата.
Что это
vf_cuda_grid— FFmpeg video filter (libavfilter/vf_cuda_grid.c), out-of-tree patch для FFmpeg n7.1+. Принимает N CUDA-frames на входе, выдаёт один composed frame с N-cell layout. End-to-end CUDA (без CPU round-trip).cuda-grid-controller— Python sidecar process (FastAPI + asyncio + pyzmq + aiomqtt). Принимает commands через ZeroMQ / MQTT / HTTP REST / HA Discovery, транслирует в FFmpegprocess_commandчерезzmqfilter. Также publishes events наружу — для bidirectional integration с Home Assistant и Node-RED.
Ключевые возможности (planned)
- ✅ Multi-input — N CUDA-frames в filter (
[in0][in1][in2]...cuda_grid=...) - ✅ Multi-output — несколько filter instances (разные TV, public stream, private)
- ✅ Per-cell camera binding — cells привязаны к camera_id, не к input slot
- ✅ Layout DSL — predefined templates + runtime-created custom layouts
- ✅ Runtime layout switching без teardown filter graph
- ✅ Rich overlays — rectangles, text, icons, image overlays, dim/darken, графики, чаты с alpha blending. Всё GPU-side.
- ✅ Control plane — ZeroMQ, MQTT, HTTP REST, HA Discovery
- ✅ Bidirectional events — controller publishes
layout_switched,cell_camera_changed,fps_drop,overlay_addedetc. - ✅ Audio orchestration — controller координирует video grid + audio
(
amix,sidechaincompressчерез стандартные FFmpeg filters) - ✅ Privacy filtering — на public screen overlays можно выборочно отключить
Use cases
- NVR с несколькими TV — каждый TV имеет свой layout (например full-house quad в гостиной + door-focus в холле + private-only mosaic в спальне)
- Public stream + private monitor — на public stream без LPR-text и без privacy-camera; на private — всё
- Domofon scenario — звонок в дверь → controller переключает layout на focus-door + ducked music + door audio focused
- Frigate detection visualization — overlay bounding boxes, LPR numbers, face names с alpha blending поверх video grid
Architecture (high level)
┌────────── Home Assistant / Node-RED / custom apps ──────────┐
│ (MQTT / ZeroMQ / HTTP REST / SSE) │
└─────────────────────────────┬───────────────────────────────┘
│
┌───────────▼────────────┐
│ cuda-grid-controller │ (Python sidecar)
│ (FastAPI + pyzmq + │
│ aiomqtt + pycairo) │
└───────────┬────────────┘
│ process_command
│ via FFmpeg's zmq filter
▼
┌─────────────────── FFmpeg ───────────────────┐
cuframes://cam1 ─┐ │
cuframes://cam2 ─┼─► vf_cuda_grid ──► h264_nvenc ──► output
cuframes://cam3 ─┤ (instance N) │
cuframes://camN ─┘ runtime sendcmd via zmq │
└───────────────────────────────────────────────┘
Полная архитектура, layout DSL, CUDA kernels, overlay system, multi-instance
behaviour, audio orchestration, 6 phase implementation plan и migration path
для cctv-processor — см. docs/design.md.
Связано
gx/cuframes(repo) — zero-copy CUDA IPC frame sharing. Frames из cuframes — основной input source для vf_cuda_grid в нашей экосистеме.gx/ffmpeg-patched— FFmpeg fork сcuframes://demuxer. vf_cuda_grid будет добавлен сюда (или в отдельный patched fork).gx/cctv#22 — performance investigation для текущего custom C++ GridComposer. vf_cuda_grid v1.0 закрывает Phase 4 (end-to-end GPU).gx/cctv#24 — initial MQTT plugin design для cctv-processor. Superseded — controller cuda-grid-controller покрывает 60-70% этого scope, см. design §14.
Status / Phases
См. epic issue #1 для tracking прогресса.
| Phase | Что | Status |
|---|---|---|
| 1 | MVP filter — fixed quad layout, 4 CUDA inputs → 1 output | planned |
| 2 | Dynamic layouts (DSL) + scaling per cell | planned |
| 3 | cuda-grid-controller sidecar (ZMQ + MQTT + HTTP + HA Discovery) |
planned |
| 4 | Overlay primitives (rect/text/icon) — CUDA rendering | planned |
| 5 | Image overlays, dim areas, graphs/charts (Cairo→texture pipeline) | planned |
| 6 | Audio orchestration use cases в controller | planned |
License
LGPL-2.1+ — для совместимости с FFmpeg LGPL builds и cuframes.
Контакты
Issues и discussions — в этом репо. Project maintainer — gx@goldix.org.
Languages
Python
79.9%
HTML
17.3%
Shell
2%
Dockerfile
0.8%