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>
36 lines
1006 B
C
36 lines
1006 B
C
#pragma once
|
|
|
|
#include <stdint.h>
|
|
|
|
typedef enum Test_Pattern {
|
|
TEST_PATTERN_BARS, /* SMPTE 75% colour bars */
|
|
TEST_PATTERN_RAMP, /* greyscale ramp, left to right */
|
|
TEST_PATTERN_GRID, /* white grid lines on black */
|
|
} Test_Pattern;
|
|
|
|
typedef enum Test_Fmt {
|
|
TEST_FMT_YUV420, /* planar YUV 4:2:0 */
|
|
TEST_FMT_YUV422, /* planar YUV 4:2:2 */
|
|
TEST_FMT_BGRA, /* packed BGRA 8:8:8:8 */
|
|
} Test_Fmt;
|
|
|
|
typedef struct Test_Frame {
|
|
uint8_t *plane[3]; /* Y/Cb/Cr; only plane[0] used for BGRA */
|
|
int stride[3]; /* bytes per row for each plane */
|
|
int width;
|
|
int height;
|
|
Test_Fmt fmt;
|
|
} Test_Frame;
|
|
|
|
/*
|
|
* Allocate a Test_Frame with correctly-sized plane buffers.
|
|
* Width and height must be >= 2 and even.
|
|
* Returns NULL on allocation failure.
|
|
*/
|
|
Test_Frame *test_image_alloc(int width, int height, Test_Fmt fmt);
|
|
|
|
/* Fill all planes of f with the given pattern. */
|
|
void test_image_generate(Test_Frame *f, Test_Pattern pat);
|
|
|
|
void test_image_free(Test_Frame *f);
|