Native video, decoded on the GPU.

OA now has a correctness-gated Vulkan Video path from compressed packets through native decode and 8-bit or 10-bit YCbCr resources to an application-ready frame—without CPU pixel readback.

6 sustained decode rowsH.264 · H.265 · AV1 · VP9Measured 2026-08-29

Every measured process cleared source cadence

All six admitted streams decoded, converted, and made 288 frames application-ready. The slowest observed process still delivered 1.86× the 60 fps source cadence at 2160p and 3.73× at 1080p. Hardware counters confirmed the selected YCbCr path in every sample, while the forced-compute samples recorded zero hardware conversions and every row recorded zero CPU pixel readback.

01

Compressed stream

Demux and codec parsing preserve the exact stream profile, cadence, timestamps, and coded picture data.
02

Native decode

The capability-admitted Vulkan Video queue decodes into decoder-owned 4:2:0 resources and publishes exact completion.
03

YCbCr to RGBA

OA selects Vulkan sampler YCbCr reconstruction or the verified manual plane-sampling compute fallback.
04

Application-ready frame

The resulting RGBA image remains on the device for presentation, Vision work, or model input.

These are unpaced saturation measurements: they establish decode-to-RGBA capacity, not compositor presentation deadlines, end-to-end playback pacing, or single-frame latency.

Decode and conversion capacity

Each cell is the complete observed range across both seven-process execution-order campaigns. The final column uses the slowest value from either conversion path.

StreamHardware YCbCr rangeManual compute rangeSlowest / 60 fps
1080p60 · H.264 High · 8-bit 4:2:0265.845–360.132 fps280.137–320.371 fps4.43×
1080p60 · H.265 Main · 8-bit 4:2:0327.547–380.627 fps254.532–361.939 fps4.24×
1080p60 · AV1 Main · 8-bit 4:2:0239.137–305.841 fps223.942–321.144 fps3.73×
1080p60 · VP9 Profile 0 · 8-bit 4:2:0299.512–422.693 fps279.446–394.513 fps4.66×
2160p60 · H.265 Main · 8-bit 4:2:0113.387–145.484 fps115.426–151.296 fps1.89×
2160p60 · AV1 Main · 8-bit 4:2:0113.570–152.079 fps111.512–145.570 fps1.86×

Hardware YCbCr and manual compute are both viable

Each fresh process primed one path with 120 untimed frames, rewound the same decoder, then measured 288 frames on each path. A second seven-process campaign reversed the order. Ratios divide hardware-path throughput by manual-compute throughput, so values above 1.0 favor hardware.

StreamHardware first · median · range · MADCompute first · median · range · MADResult
1080p60 · H.2641.087× · 0.879–1.222 · 0.0281.090× · 0.901–1.189 · 0.090Characterization
1080p60 · H.2651.113× · 0.999–1.269 · 0.0621.152× · 1.036–1.363 · 0.083Characterization
1080p60 · AV11.006× · 0.864–1.318 · 0.1300.937× · 0.788–0.980 · 0.019Characterization
1080p60 · VP91.082× · 0.855–1.202 · 0.1101.032× · 0.882–1.258 · 0.116Characterization
2160p60 · H.2650.935× · 0.852–1.062 · 0.0790.972× · 0.918–1.073 · 0.042Characterization
2160p60 · AV11.014× · 0.865–1.123 · 0.0761.017× · 0.780–1.030 · 0.013Characterization

No row is promoted as a stable speedup or regression. All twelve order-specific campaigns exceed the predeclared 15% full-spread gate. The paired medians place hardware YCbCr between 0.935× and 1.152× of manual compute, but those values remain characterization rather than a device-selection policy.

PathCurrent loweringCPU pixel readback
Hardware YCbCrA compute dispatch samples through a Vulkan YCbCr conversion sampler and writes the presentation RGBA imageNone
Manual computeA compute dispatch samples Y and UV planes and performs matrix/range reconstruction in shader codeNone
AV1 hardware YCbCrA device-local DPB-to-staging copy releases the DPB before sampler conversion; following decode can overlapNone
H.264 / H.265 / VP9 hardware YCbCrDirect coincident-DPB sampling on the measured deviceNone

Codec and profile coverage

Codec names do not bypass capability admission. OA queries the live device and accepts only the profiles, chroma formats, bit depths, levels, and picture features the complete path can support honestly.

Codec8-bit coverage10-bit coverageMeasured status
H.264 / AVCConstrained Baseline, Main, and High · 4:2:0Not admitted on this device1080p60 High sustained
H.265 / HEVCMain · 4:2:0; Range Extensions profile-IDC-4 single-picture subsetMain 10 P010; Range Extensions profile-IDC-4 P010 single-picture subset1080p60 and 2160p60 Main 8 sustained; P010 differential verified
AV1Main · 4:2:0Main 10 P010 subset; loop restoration rejected before submission1080p60 and 2160p60 Main 8 sustained; P010 differential verified
VP9Profile 0 · 4:2:0Profile 2 P010 single-picture1080p60 Profile 0 sustained; P010 differential verified

The sustained matrix is intentionally 8-bit. Native 10-bit paths are verified through P010 code-value differentials against FFmpeg and CPU color oracles; this checkpoint does not claim sustained HDR or 10-bit playback performance.

Measured-device limits remain explicit

BoundaryStatus on the measured Iris Xe
Chroma and depth4:2:2, 4:4:4, and 12-bit remain hardware-gated
ProfilesH.264 High 4:4:4, H.265 SCC, AV1 High/Professional, and VP9 Profiles 1/3 are not admitted
H.265 Main Still PictureFixture-gated: installed x265 maps the selection to profile IDC 4 and the QSV/xe stack cannot initialize an honest profile-IDC-3 encode
UHD60 H.264Rejected: fixture level 5.2 exceeds the driver-reported level-5.1 ceiling
UHD VP9The checked fixture is rejected by this driver

Correctness and safety gates

GateRecorded result
Release41 / 41 TestVideoDecoder cases passed
ASAN + leak detection41 / 41 cases passed with strict string checks
UBSAN41 / 41 cases passed with halt-on-error
Vulkan validationFocused UHD AV1 staged hardware/manual conversion passed core, synchronization, and GPU-assisted validation with zero reported errors
Path proofHardware-dispatch counters in every hardware sample; zero hardware dispatches in every forced-compute sample
Benchmark admissionExact fixture hash, extent, cadence, codec/profile, 288 completed frames, passing test, and zero CPU pixel readback

Measurement provenance

FieldRecorded value
Sourceb6a0dfd3a4086c5f85915c8a040bab95c8f47f53
Executablebin/release/test/vision/codec/benchVideoRealtime
SHA-256 3a96d6b8321b2b9be6ffbec9f21d35901a6a03a86cd17d02056031808332e748
BuildRelease · Clang 22.1.8 · static OA · embedded shaders · Vulkan validation off for timing
GPUIntel Iris Xe Graphics TGL GT2 · PCI 0x9a49 · integrated
Driver and APIMesa 26.1.7-arch1.1 · Vulkan 1.4.354 · conformance 1.4.0.0
HostLinux 7.1.8-arch1-3 · x86_64
PowerAC · intel_pstate powersave governor · balanced platform profile
ProtocolOne excluded fresh-process warmup; seven measured fresh processes; 5 s cooldown; 65 C package start gate; median, MAD, and full range; measured starts 51–64 C

Earlier timing from the session was rejected after concurrent VLC UHD 10-bit playback was disclosed. The published replacement used an uncontended clean detached worktree, primed both paths, retained both execution orders, and reports the remaining spread.

Evidence boundary

This checkpoint qualifies native decode and decode-to-RGBA conversion on one Intel Iris Xe configuration. It is not evidence for remote desktop, compositor scanout, encode, cross-vendor support, universal codec availability, single-frame latency, or universal performance. Runtime capability queries remain authoritative on every device.

Reproduce

Smoke the complete codec matrix before timing. Repeat both pair orders for1080p60-h264, 1080p60-h265, 1080p60-av1,1080p60-vp9, 2160p60-h265, and 2160p60-av1. Require a passing test, a positive hardware-conversion count only on the hardware path, and pixel_readback_bytes=0. A failed 15% spread gate stays characterization.

Video benchmark terminal

cmake --build build/release --target BenchVideoRealtime TestVideoDecoder -j
./bin/release/test/vision/codec/testVideoDecoder
OA_VIDEO_BENCH_VARIANT=2160p60-av1 \
OA_VIDEO_BENCH_PAIR_ORDER=hardware-first \
OA_VIDEO_BENCH_PRIME_FRAMES=120 \
./bin/release/test/vision/codec/benchVideoRealtime \
--gtest_filter=BenchVideoRealtime.DecodePresentYcbcrPair
# Publication: wrap the command with tools/diagnostics/oaBench.py.
# Use one excluded warmup, seven measured fresh processes, 5 s cooldown,
# a 65 C package start gate, and the hardware_over_compute metric.
# Repeat both pair orders for every admitted variant.