feat: add test_image module, xorg viewer sink, and feature flag build system

Feature flags (FEATURES= make variable):
  glfw       — GLFW + OpenGL viewer (libglfw3, libglew)
  vulkan     — future Vulkan renderer
  turbojpeg  — MJPEG decode/encode (libturbojpeg)
  xorg       — XRandR geometry + screen grab (libx11, libxrandr)
  vaapi      — VA-API hardware codec (libva)
Each flag injects -DHAVE_<FEATURE> and the relevant pkg-config flags.
Headless build: make (no FEATURES set).

test_image module (src/modules/test_image/):
  Generates test frames in YUV420, YUV422, and BGRA.
  Patterns: SMPTE 75% colour bars, greyscale ramp, white/black grid.
  BT.601 limited-range RGB→YCbCr in write_pixel().

test_image_cli (dev/cli/):
  Generates a frame and writes it as a PPM file for visual verification.
  Usage: test_image_cli [--pattern bars|ramp|grid]
                        [--width N] [--height N]
                        [--format yuv420|yuv422|bgra]
                        --out FILE.ppm

xorg module (src/modules/xorg/):
  xorg.c      — full GLFW+OpenGL implementation (compiled with FEATURES=glfw)
  xorg_stub.c — no-op stub (compiled otherwise; xorg_available() returns false)
  Renderer: full-screen quad via gl_VertexID, three GL_R8 textures for YUV,
  BT.601 matrix in fragment shader, GL_BGRA texture for packed frames.
  MJPEG path: tjDecompressToYUVPlanes → planar YUV → upload (requires turbojpeg).
  push_yuv420/push_bgra/push_mjpeg all usable independently.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-28 20:54:07 +00:00
parent 98c700390d
commit a1b52145d0
12 changed files with 946 additions and 22 deletions

View File

@@ -10,3 +10,51 @@ BUILD = $(ROOT)/build
# -MMD emit a .d file listing header prerequisites alongside each .o
# -MP add phony targets for headers so removed headers don't break make
DEPFLAGS = -MMD -MP
# -----------------------------------------------------------------------
# Feature flags
# Set FEATURES to a space-separated list of optional deps to enable.
# Example: make FEATURES="glfw turbojpeg"
# Headless (no optional deps): make FEATURES=
#
# Available features:
# glfw — GLFW window management + OpenGL renderer (libglfw3, libglew)
# vulkan — GLFW window management + Vulkan renderer (vulkan-loader, libglfw3)
# turbojpeg — MJPEG encode/decode (libturbojpeg)
# xorg — XRandR geometry queries + XShmGetImage screen grab (libx11, libxrandr)
# vaapi — VA-API hardware encode/decode (libva)
# -----------------------------------------------------------------------
FEATURES ?=
export FEATURES
# Inject HAVE_ defines into CFLAGS
CFLAGS += $(if $(filter glfw, $(FEATURES)),-DHAVE_GLFW)
CFLAGS += $(if $(filter vulkan, $(FEATURES)),-DHAVE_VULKAN)
CFLAGS += $(if $(filter turbojpeg, $(FEATURES)),-DHAVE_TURBOJPEG)
CFLAGS += $(if $(filter xorg, $(FEATURES)),-DHAVE_XORG)
CFLAGS += $(if $(filter vaapi, $(FEATURES)),-DHAVE_VAAPI)
# Per-feature pkg-config flags — accumulated into PKG_CFLAGS / PKG_LDFLAGS.
# Modules that need them add $(PKG_CFLAGS) to their compile rules.
# The node and cli link rules append $(PKG_LDFLAGS).
PKG_CFLAGS :=
PKG_LDFLAGS :=
ifneq (,$(filter glfw,$(FEATURES)))
PKG_CFLAGS += $(shell pkg-config --cflags glfw3 glew 2>/dev/null)
PKG_LDFLAGS += $(shell pkg-config --libs glfw3 glew 2>/dev/null) -lGL
endif
ifneq (,$(filter turbojpeg,$(FEATURES)))
PKG_CFLAGS += $(shell pkg-config --cflags libturbojpeg 2>/dev/null)
PKG_LDFLAGS += $(shell pkg-config --libs libturbojpeg 2>/dev/null)
endif
ifneq (,$(filter xorg,$(FEATURES)))
PKG_CFLAGS += $(shell pkg-config --cflags x11 xrandr 2>/dev/null)
PKG_LDFLAGS += $(shell pkg-config --libs x11 xrandr 2>/dev/null)
endif
ifneq (,$(filter vaapi,$(FEATURES)))
PKG_CFLAGS += $(shell pkg-config --cflags libva 2>/dev/null)
PKG_LDFLAGS += $(shell pkg-config --libs libva 2>/dev/null)
endif
CFLAGS += $(PKG_CFLAGS)