873a04c622
Builds the daemon executable per the locked Phase 8 architecture
(Option γ: dlopen FFmpeg at runtime). Phase 8.3 scope: parse
path validation only — no V4L2 wiring, no decode, no chardev
connection.
Components:
- daemon/CMakeLists.txt — CMake with -Wall -Wextra -Wpedantic
clean. pkg-config for FFmpeg headers; only -ldl + -lpthread
at link time.
- daemon/src/main.c — entry point, signal handlers
(SIGINT/SIGTERM), command dispatcher. Currently `parse <file>`.
- daemon/src/ffmpeg_loader.{c,h} — runtime FFmpeg loader.
dlopens libavformat.so.61, libavcodec.so.61, libavutil.so.59.
Resolves 22 function pointers using POSIX-recommended
*(void**)& dlsym idiom (per POSIX.1-2017 dlsym(3p) Rationale).
- daemon/src/parser.{c,h} — demux loop via avformat_open_input +
av_read_frame. Per-frame logging on -v.
- daemon/src/log.{c,h} — logging facade (stderr Phase 8.3;
syslog/journal planned for 8.5+).
Verification on hertz:
$ ffmpeg -f lavfi -i testsrc=duration=2:size=320x240:rate=30 \
-c:v libvpx-vp9 -y /tmp/testsrc.ivf
$ daedalus_v4l2_daemon parse /tmp/testsrc.ivf
[INFO] FFmpeg loaded: 7.1.3-0+deb13u1+rpt1 (libavformat 61.7.100)
[INFO] video stream #0: codec=vp9 (Google VP9) 320x240, 0/0 fps
[INFO] parse complete: 60 frames (1 key) total 17859 bytes
Error paths verified:
- Missing file → "avformat_open_input(...): code -2", exit 1
- No command → usage message, exit 2
- Bad command → usage message, exit 2
Per correctness-before-speed:
- Real CMake (no Makefile hacks)
- pkg-config for headers
- POSIX-conformant dlsym pattern (no -Wpedantic suppression)
- Real signal handling + proper exit codes
- Real logging with timestamp + level
- Headers included at compile-time for type safety; dlopen
decouples runtime
- All FFmpeg resources freed on every exit path
- Builds clean on -Wall -Wextra -Wpedantic
Phase 8.3 acceptance criteria met:
- ✓ daemon binary builds
- ✓ dlopen FFmpeg at runtime
- ✓ demux a VP9 IVF file end-to-end
- ✓ per-frame metadata logged correctly
- ✓ frame count + keyframe count + byte total accurate
Phase 8.4 next: wire daemon to /dev/daedalus-v4l2 chardev,
add REQ_DECODE / RESP_FRAME handling, drive VP9 decode
end-to-end via daedalus_dispatch_* from daedalus-fourier.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
53 lines
1.2 KiB
CMake
53 lines
1.2 KiB
CMake
# SPDX-License-Identifier: BSD-2-Clause
|
||
#
|
||
# daedalus-v4l2 userspace daemon — CMake build.
|
||
#
|
||
# Notes:
|
||
# - FFmpeg is dlopen'd at runtime (Option γ), so we link only
|
||
# -ldl + -lpthread. Headers from libavformat-dev /
|
||
# libavcodec-dev / libavutil-dev are used at compile time
|
||
# for struct definitions.
|
||
# - Strict warnings enforced.
|
||
|
||
cmake_minimum_required(VERSION 3.20)
|
||
project(daedalus_v4l2_daemon C)
|
||
|
||
set(CMAKE_C_STANDARD 11)
|
||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||
|
||
if (NOT CMAKE_BUILD_TYPE)
|
||
set(CMAKE_BUILD_TYPE Release)
|
||
endif()
|
||
|
||
add_compile_options(-Wall -Wextra -Wpedantic
|
||
-Wno-unused-parameter)
|
||
|
||
# FFmpeg headers (we dlopen the libs but include the headers for
|
||
# struct definitions). pkg-config is the canonical way.
|
||
find_package(PkgConfig REQUIRED)
|
||
pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET
|
||
libavformat libavcodec libavutil)
|
||
|
||
add_executable(daedalus_v4l2_daemon
|
||
src/main.c
|
||
src/ffmpeg_loader.c
|
||
src/log.c
|
||
src/parser.c
|
||
)
|
||
|
||
target_include_directories(daedalus_v4l2_daemon
|
||
PRIVATE
|
||
src
|
||
${FFMPEG_INCLUDE_DIRS}
|
||
)
|
||
|
||
# dl for dlopen, pthread for future threading work.
|
||
target_link_libraries(daedalus_v4l2_daemon
|
||
PRIVATE
|
||
dl
|
||
pthread
|
||
)
|
||
|
||
install(TARGETS daedalus_v4l2_daemon
|
||
RUNTIME DESTINATION /usr/local/bin)
|