Wild Dragon Dev
b700902200
feat(framecache): phase 4 — capture-manager reads from framecache
...
- services/framecache/client/fc_pipe.c: new slot→stdout pipe adapter
- Opens framecache slot as consumer (independent cursor per instance)
- Streams raw UYVY422 frames to stdout continuously
- SIGPIPE detection via write() return — exits cleanly on ffmpeg exit
- SIGTERM/SIGINT clean stop from capture-manager
- Periodic stats to stderr (every 300 frames)
- Exit codes: 0=clean, 1=slot not found, 2=EPIPE
- services/framecache/CMakeLists.txt: add fc_pipe target + install
- services/framecache/Dockerfile: copy fc_pipe to runtime image
- services/capture/Dockerfile:
- New fc-pipe-builder stage (builds fc_pipe from framecache sources)
- Copies fc_pipe binary to /usr/local/bin/fc_pipe in runtime image
- services/capture/src/capture-manager.js:
- _buildInputArgs: new framecache path for deltacast + sdi/blackmagic
when FC_SLOT_ID env is set (injected by node-agent from bridge fmt JSON)
- Spawns fc_pipe <slot_id> as child process
- Uses pipe:0 as ffmpeg rawvideo input 0
- Audio FIFO (unchanged) as ffmpeg input 1
- Falls back to legacy FIFO path when FC_SLOT_ID unset
- audioMap: covers blackmagic via framecache (input 1 for audio FIFO)
- isInterlacedSource: covers blackmagic interlaced signals
- hiresStdio: pipe stdin when bridgeProcess set (fc_pipe stdout→ffmpeg)
- Non-growing spawn: pipes fc_pipe.stdout → ffmpeg.stdin
- Growing orchestrator spawn: pipes fc_pipe.stdout → bash.stdin
- sdiHlsDir: covers blackmagic source type
- Session state stores _fcPipeProcess for clean stop
- stop(): sends SIGTERM to fc_pipe after ffmpeg SIGINT
2026-06-03 15:32:40 +00:00
Wild Dragon Dev
b2c63de2fa
feat(framecache): phase 3 — decklink-bridge writes to shm
...
- services/capture/decklink-bridge/main.cpp: new C++ DeckLink bridge
- IDeckLinkInputCallback (VideoInputFrameArrived) writes UYVY422
frames to framecache slot via fc_writer_write()
- VideoInputFormatChanged reopens slot with new resolution/fps
- bmdVideoInputEnableFormatDetection: auto-detects signal format
- bmdFormat8BitYUV (UYVY422) — same pixel format as deltacast-bridge
- Audio written from callback to named FIFO (same pattern as deltacast)
- Silence thread keeps audio FIFO open between sessions
- slot_id: decklink-<NODE_ID>-<device_idx>
- Format JSON emitted on first frame (includes slot_id)
- LEGACY_FIFO compile flag mirrors deltacast-bridge
- --devices csv, --fc-url, --audio-pipe-dir, --signal-timeout args
- services/capture/decklink-bridge/CMakeLists.txt:
- Reuses fc_writer.c from deltacast-bridge (shared writer module)
- Links rt + dl + pthread; DeckLink SDK via dlopen at runtime
- LEGACY_FIFO option
- services/capture/Dockerfile:
- New decklink-bridge-builder stage (g++ + DeckLink SDK headers)
- Copies decklink-bridge binary to /usr/local/bin/decklink-bridge
- services/node-agent/index.js:
- FC_URL + FC_NODE_ID constants (from env vars, passed to all bridges)
- startDecklinkBridge(deviceIndices) / stopDecklinkBridge() functions
mirror deltacast bridge lifecycle management
- deltacast startDeltacastBridge: adds --fc-url arg + NODE_ID env
- sidecar start: injects FC_URL into all sidecar envs; sets IpcMode=host
for deltacast + blackmagic sidecars; starts decklink-bridge for sdi/
blackmagic source types; injects FC_SLOT_ID from fmt JSON
- sidecar stop: stopDecklinkBridge() when last blackmagic sidecar stops
2026-06-03 15:25:25 +00:00
Wild Dragon Dev
0d479d043d
feat(framecache): phase 2 — deltacast-bridge writes to shm ring
...
- fc_writer.h/fc_writer.c: new framecache slot writer module
- Registers slot via POST /slots to framecache HTTP API on signal lock
- Opens shm file returned by API (O_RDWR + mmap MAP_SHARED)
- fc_writer_write(): atomic write_cursor advance + sem_post per frame
- fc_writer_close(): DELETE /slots/:id + munmap + sem_close
- HTTP calls via raw POSIX sockets (no libcurl dependency)
- Parses host:port from FC_URL env var or --fc-url arg
- main.c changes:
- PortState gains slot_id, fc_url, fc_writer fields
- --fc-url CLI arg + FC_URL env var (default http://localhost:7435 )
- On signal lock: fc_writer_open() before thread launch;
falls back to FIFO if framecache unreachable (fc_writer == NULL)
- video_thread: shm path primary (fc_writer != NULL),
FIFO path fallback (fc_writer == NULL or LEGACY_FIFO=1)
- Format JSON now includes slot_id field for node-agent consumption
- Cleanup: fc_writer_close() before VHD_CloseBoardHandle
- CMakeLists.txt:
- Add fc_writer.c to build
- Link rt (shm_open, sem_open)
- LEGACY_FIFO option (OFF by default) for nodes without framecache
Audio thread unchanged — audio stays in FIFO (shm audio is roadmap).
2026-06-03 15:13:20 +00:00
Wild Dragon Dev
1573bf8954
feat(framecache): phase 1 — framecache container + consumer library
...
- services/framecache/: new standalone container
- slot.h/slot.c: shm ring buffer (120 frames, FC_MAGIC header, atomic
write_cursor, POSIX semaphore per slot)
- registry.h/registry.c: in-memory slot registry + /dev/shm/framecache/
registry.json persistence
- framecache.c: HTTP API server (libmicrohttpd, port 7435)
POST /slots, GET /slots, GET /slots/:id, DELETE /slots/:id, GET /health
- fc_client.h/fc_client.c: consumer library — fc_consumer_open/read/close
with per-consumer cursor, timeout via sem_timedwait, automatic skip+count
when consumer falls behind writer by > ring_depth frames
- fc_test_consumer.c: dev utility to attach to any slot and print fps/stats
- CMakeLists.txt: framecache server + fc_client static lib + test consumer
- Dockerfile: builder + slim runtime stages
- docker-compose.worker.yml: add framecache service (profile: capture,
ipc: host, shm_size from FC_SHM_SIZE_GB env var, healthcheck)
- .env.example: document FC_SHM_SIZE_GB with per-node guidance
2026-06-03 14:53:51 +00:00
2f1697b77b
feat(framecache): add implementation plan to docs
2026-06-03 10:48:57 -04:00
c269468014
fix(scheduler): orphan grace window must use recorder.updated_at not asset.updated_at — asset is created at recording START not STOP
2026-06-03 14:03:32 +00:00
108390e823
fix(scheduler): add 90s grace before marking stopped-recorder live assets as error
2026-06-03 12:51:41 +00:00
7704988978
fix(recorders): resolve syntax error caused by double declaration of proto variable
2026-06-03 12:17:06 +00:00
a00e90ecc8
fix(merge): resolve conflict in screens-library.jsx
2026-06-03 10:43:59 +00:00
c21260c9b0
fix(ampp): require auth on AMPP endpoint
2026-06-03 10:42:57 +00:00
d16d19c26d
fix(node-agent): use timingSafeEqual for token comparison
2026-06-03 10:42:57 +00:00
63f05cd652
fix(audit): critical security hardening and ops reliability fixes
2026-06-03 10:42:57 +00:00
OpenCode
dbef15ae0a
fix(library): clicking project in rail now filters assets to that project instead of navigating away
2026-06-03 04:11:32 +00:00
OpenCode
99bd6a8c9c
fix(library): auto-expand all bins on load so nested children visible by default
2026-06-03 04:06:48 +00:00
OpenCode
4e6142f455
fix(web-ui): orange pulse logo (bigger, no canvas), fix library missing expandedBins state
2026-06-03 04:02:17 +00:00
OpenCode
02d502baaf
fix(web-ui): restore full screens-home.jsx with DragonFlame + Home + Dashboard
2026-06-03 03:58:35 +00:00
OpenCode
00a7af7c54
feat(web-ui): nested bins tree + DragonFlame CSS restored (complete)
2026-06-03 03:48:29 +00:00
cb9ef9c14e
fix(web-ui): restore correct styles-fixes.css with DragonFlame logo CSS + upload actual screens-library.jsx nested bins: styles-modal.css
2026-06-02 23:35:12 -04:00
f48a0b73ee
feat(web-ui): nested bins tree in library sidebar + bin filter includes descendants: styles-fixes.css
2026-06-02 23:34:14 -04:00
463cc3694d
feat(web-ui): nested bins tree, DragonFlame logo, recorder modal 2x2 grid, cleanup .bak
...
- Library: nested bins with expand/collapse tree in sidebar
- buildBinTree() + collectDescendantIds() helpers
- BinTreeNodes recursive component with hover sub-bin create (+) button
- Selecting a parent bin shows assets from all descendant bins too
- Home: canvas DragonFlame particle animation behind logo (90 flame + 30 spark), logo 140px
- Recorder modal: source-type-grid 3-col → 2x2 so Deltacast card no longer overflows
- CSS: launcher background radial gradient taller; launcher-logo-wrap 160x200px
- Cleanup: remove capture.js.bak: screens-home.jsx
2026-06-02 23:33:58 -04:00
30328e2871
feat(promotion): configure worker containers with privileged mode + queue settings for manual promotion
2026-06-03 00:46:48 +00:00
bd662f6917
fix(migration): wrap ALTER TYPE ADD VALUE in DO block with IF NOT EXISTS check
2026-06-03 00:41:04 +00:00
a04ef2de3a
feat(promotion): implement manual growing files promotion via BullMQ queue + pending_migration status + right click Move to S3
2026-06-03 00:38:50 +00:00
62b9a90291
fix(recorders): stop capture containers in the background to prevent API TimeoutError on large file uploads
2026-06-03 00:22:36 +00:00
600af4564e
fix: restore screens-library.jsx and visuals.jsx to clean state + add deriveGrowingRaster scanHint fix
2026-06-03 00:19:55 +00:00
d8df8755e2
fix: main.c migrate-to-library + deltacast audit cleanup
2026-06-02 19:01:31 -04:00
5525041901
feat/fix: visuals.jsx — growing migrate flow + deltacast cleanup
2026-06-02 18:40:16 -04:00
29238a339e
feat/fix: screens-library.jsx — growing migrate flow + deltacast cleanup
2026-06-02 18:39:10 -04:00
9ae619357b
feat/fix: proxy.js — growing migrate flow + deltacast cleanup
2026-06-02 18:39:08 -04:00
1f342826bd
feat/fix: promotion.js — growing migrate flow + deltacast cleanup
2026-06-02 18:38:56 -04:00
167d9ad009
feat/fix: filmstrip.js — growing migrate flow + deltacast cleanup
2026-06-02 18:38:24 -04:00
b0f504ca69
feat/fix: thumbnail.js — growing migrate flow + deltacast cleanup
2026-06-02 18:38:21 -04:00
a8b59f087d
fix(recorders): pre-create live asset with .mxf key when growing_enabled (was .mov, broke proxy lookup -> error)
2026-06-02 22:10:30 +00:00
228f68ab6d
fix(audio): use_wallclock_as_timestamps on both raw FIFOs to align A/V by arrival time (no deadlock, replaces barrier)
2026-06-02 22:02:32 +00:00
d0d881c735
Revert "fix(audio): per-port A/V start barrier so video+audio FIFOs begin at the same instant (fixes fixed A/V offset)"
...
This reverts commit bebfe7a43d .
2026-06-02 22:01:51 +00:00
bebfe7a43d
fix(audio): per-port A/V start barrier so video+audio FIFOs begin at the same instant (fixes fixed A/V offset)
2026-06-02 21:59:34 +00:00
20d913fbad
fix(audio): hardware-paced audio (no wall-clock silence mixing) + aresample=async to lock A/V sync
2026-06-02 21:50:11 +00:00
3eacb35c1e
fix(capture): replace continuous idle preview with 1fps JPEG snapshot to stop FIFO contention halving capture fps
2026-06-02 21:40:52 +00:00
de3e09f39e
fix: restore correct capture files after merge
2026-06-02 21:31:46 +00:00
52f039554c
merge: keep correct local capture files, reject placeholder uploads
2026-06-02 21:31:29 +00:00
ec1699907d
fix(deltacast): non-blocking write + 64MB FIFO + GPU runtime for capture container
2026-06-02 21:31:06 +00:00
1cef8c3bb3
fix(deltacast-bridge): non-blocking write_all + larger FIFO (64MB) to prevent frame drops
2026-06-02 17:06:40 -04:00
82697d92de
fix(deltacast-bridge): restore BUFFER_PACKING YUV422_8 fix that was lost during git checkout
2026-06-02 16:59:23 -04:00
87fd3164c6
Fix: restore all deltacast-bridge fixes (buffer packing YUV422_8, SDI interface, F_SETPIPE_SZ, deinterlacing bypass)
2026-06-02 16:43:45 -04:00
0aa010dacc
fix(deltacast-bridge): restore BUFFER_PACKING YUV422_8 + SDI interface + F_SETPIPE_SZ fixes
2026-06-02 16:42:45 -04:00
9ac27ff194
fix(capture): deinterlacing bypass for progressive signals + fps calculation fix
2026-06-02 16:24:45 -04:00
190e608ac2
Remove truncated CCX upload
2026-06-02 16:20:59 -04:00
fd8b2dc3f1
Add dragonflight-mam-2.2.3.ccx — fix fs.promises compatibility for UXP
2026-06-02 16:20:39 -04:00
13feb0a6a2
fix(uxp): promisify fs calls for UXP compatibility (v2.2.3)
...
fs.writeFile/fs.readFile/fs.stat are callback-based and don't return
Promises in the UXP sandbox. await on them resolves immediately, causing
race conditions where files aren't written before import.
Added _writeFile/_readFile/_stat wrappers that use fs.promises when
available and fall back to manual Promise wrapping otherwise.
Also bumped version to 2.2.3 to match web-ui data.jsx.
2026-06-02 20:17:00 +00:00
702187c1dc
revert: restore orange accent + original home layout
...
- Revert accent from Flame Blue #1025A1 to electric amber #E8821C
- Restore all rgba accent values to orange spectrum
- Revert avatar to bg-3 background + accent text (was blue bg + white)
- Revert primary button text to dark #0a0c10 (was white on blue)
- Restore centered hero with logo pulse + 'Let's Create' kicker
- Restore single-grid tile layout (all tiles in one launcher-grid)
- Restore settings as separate centered row below main grid
- Restore centered footer + large wordmark with amber glow
Co-Authored-By: OWL <noreply@anthropic.com>
2026-06-02 19:31:30 +00:00