- 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).
50 lines
1.5 KiB
C
50 lines
1.5 KiB
C
/**
|
|
* fc_writer.h — Lightweight framecache slot writer for deltacast-bridge.
|
|
*
|
|
* Registers a slot with the framecache HTTP API on signal lock, then writes
|
|
* raw UYVY422 frames directly into the shared memory ring buffer.
|
|
*
|
|
* Compile with -DLEGACY_FIFO to disable shm writes and fall back to the
|
|
* original named-FIFO path (useful during transition / on nodes without the
|
|
* framecache container running).
|
|
*/
|
|
#pragma once
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef struct fc_writer fc_writer_t;
|
|
|
|
/**
|
|
* Register a slot with the framecache service and open the shm region for
|
|
* writing. fc_url is the HTTP base URL, e.g. "http://localhost:7435".
|
|
* slot_id must be unique per port, e.g. "deltacast-0-3" (device-port).
|
|
*
|
|
* Returns writer handle on success, NULL on failure (falls back to FIFO).
|
|
*/
|
|
fc_writer_t *fc_writer_open(const char *fc_url,
|
|
const char *slot_id,
|
|
uint32_t width, uint32_t height,
|
|
uint32_t fps_num, uint32_t fps_den);
|
|
|
|
/**
|
|
* Write one raw UYVY422 frame into the ring buffer.
|
|
* Non-blocking — slow consumers are skipped, not waited on.
|
|
* pts_us: presentation timestamp in microseconds (0 if unknown).
|
|
*/
|
|
void fc_writer_write(fc_writer_t *w,
|
|
const uint8_t *data, uint32_t size,
|
|
uint64_t pts_us);
|
|
|
|
/**
|
|
* Deregister slot from framecache service and unmap shm.
|
|
*/
|
|
void fc_writer_close(fc_writer_t *w);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|