FIXED in hydra-wivrn 103efd1d (branch pyrowave). This was the cause of the solid green headset image.
PyroWave is the only encoder that SAMPLES the compositor YCbCr image; x264, vaapi, nvenc and vulkan all read it as storage or copy it out. Master creates that image in server/compositor/compositor.cpp with only eStorage and eTransferSrc usage. Binding its plane views as COMBINED_IMAGE_SAMPLER is then invalid, the encoder read undefined content, and it emitted a wavelet encode of a blank image. The server looked healthy throughout, reporting a 98.7 Mbit/s pyrowave stream.
WHY THE PORT MISSED IT: server/compositor/compositor.cpp did not exist when the 2025 prototype was written; the equivalent code lived in wivrn_comp_target.cpp, which DOES include eSampled. Master moved the image creation into a new file, so the requirement was silently lost in a file the merge never touched.
Found with Vulkan validation on the server:
VUID-VkWriteDescriptorSet-descriptorType-00337 (image lacks VK_IMAGE_USAGE_SAMPLED_BIT)
VUID-VkImageViewCreateInfo-image-08336 (R8G8_UNORM view inheriting VIDEO_ENCODE_SRC usage)
Fix: add eSampled to the YCbCr image when a pyrowave encoder is configured, and restrict pyrowave's plane views to sampled usage via VkImageViewUsageCreateInfo so they do not inherit storage/video-encode usage.
DIAGNOSTIC WORTH REUSING: dump the bitstream with WIVRN_DUMP_VIDEO and check its entropy. The broken stream was 13 MB in which 99.7% of bytes were four values in a repeating pattern, which is what compressing a blank image looks like. That separated encoder from decoder without needing the headset.