Built with ffmpeg 8, libaom 3.13, x265 4.1, glibc 2.43 and clang 21, five lanes failed on the 26.04 runners: - AV1 fixtures: a monochrome sequence comes out full range with no matrix whatever is asked for; the oracle takes the colour ffprobe reads instead of assuming it. - Preview audio oracle: ffmpeg 8 leaves a timestamp gap at every seam of a -stream_loop copy, which the mixer honours and ffmpeg's raw decode does not. trailing_large loops its picture and encodes its sound as one track. - rh265 multi-slice oracle: x265 4.1 writes unreadable slice headers when two slices are encoded on several threads; those cases encode on one worker. - vkms: the kernel follows the runner's own release, its modules may sit under /usr/lib/modules, and modules-extra is fetched only where it exists. - clang -std=c89 -pedantic: glibc's const-generic strchr/strstr under _GNU_SOURCE are _Generic; -Wno-c11-extensions goes wherever -Wno-c99-extensions already does. ci_paths filters a file at the top of a samples tree by its own path. rh264 and rh265 lose the parameters no instantiation reads, the 8-bit H.264 kernels mark the depth they ignore, and the AV1 WebM fixtures leave out the MP4 box writer they never use.
VideoToolbox recording adapter validation
The compression adapter is under implementation. The current callback storage is not registered as a recording driver and does not establish native hardware encoding or Metal capture support.
make check exercises the production callback storage with counted stand-ins
for Core Video/Core Media objects. Tickets are reserved before calling an encoder,
including one that completes synchronously. Pending and borrowed slots cannot be
reused; input and output references survive callback completion until worker
acknowledgement. Errors and null/dropped samples remain explicit results. Owner
retirement leaves accepted tickets valid. Quiescence is permitted only after the
native session cannot invoke or run callbacks.
make thread_test SANITIZER=thread && ./thread_test exercises asynchronous
publication and acknowledgement. The busy loop is test-only. Both tests compile
as C89 with warnings as errors and a 2048-byte stack-frame limit.
session_test compiles the shipping session adapter against a fault-injected
API stand-in. It checks hardware-required startup and hardware-use verification,
SDR/Main10/PQ settings, allocation/property failures, FIFO output, synchronous
completion, backpressure, dropped frames and failed drain cleanup.
On Apple, python3 run.py --native compiles the actual adapter and requires
hardware encoding for H.264 8-bit and HEVC 8/10-bit SDR/PQ fixtures. Test-only
FFmpeg/ffprobe independently check decoded YUV, codec, range and colour tags.
The native executable also checks source timestamps and durations. Return 77
means at least one hardware case was unavailable; it is not a complete pass.
CPU plane fills belong only to this fixture, not the intended capture path.
python3 capture_run.py independently compiles Metal capture under ARC and
manual reference counting, without requiring an encoder or FFmpeg. The fixed
CoreVideo buffer/view pool and compute shader are not selected by a renderer
yet. The oracle checks all cropped luma/chroma codes against double-precision
RGB/PQ/scRGB references, both packed channel orders, left chroma filtering,
P010 packing, pending-slot refusal and explicit encoder/output ownership.
Test-only command-buffer waits and CPU plane reads do not enter capture code.
Native compilation/GPU execution must pass before any acceptance claim.
Next validate the hardware-required VTCompressionSession on Apple, then integrate fixed Metal-compatible pixel-buffer capture and compressed AVFoundation mux/audio input. Reuse record_gpu_queue for producer/worker ownership. Encoder calls, final draining and file work must stay off the render thread. Native Apple codec, pixel, A/V and lifecycle oracles remain required; mock tests are not native acceptance.
The queue worker now has fault-injected and 5,000-frame two-thread tests using the real SPSC queue. GPU-pending input, encoder BUSY and borrowed output retain their slots. Partial release invalidates a consumed sample borrow and can be retried; cancellation holds GPU work until completion. A one-frame maximum encoder delay with at least two slots prevents unbounded native buffering from exhausting the fixed pool. Unsupported delay settings refuse startup.
python3 pipeline_run.py is the native ARC/MRC capture-to-encode gate. It
cycles 24 frames through two fixed buffers and the shipping capture, queue,
worker and compression adapters. Independent decoding checks YUV and colour
tags; the native fixture checks borrowed output and PTS/duration. This still
does not establish AVFoundation mux/audio or renderer/controller integration.