Files
RetroArch/samples/record/videotoolbox_encode
LibretroAdmin a4172fdafd CI: the lanes Ubuntu 26.04 broke, and the formats warnings
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.
2026-11-05 17:36:02 +01:00
..

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.