diff --git a/vav2/platforms/windows/vavcore/src/Decoder/MediaCodecSurfaceManager.cpp b/vav2/platforms/windows/vavcore/src/Decoder/MediaCodecSurfaceManager.cpp index 138c41d..bd9672b 100644 --- a/vav2/platforms/windows/vavcore/src/Decoder/MediaCodecSurfaceManager.cpp +++ b/vav2/platforms/windows/vavcore/src/Decoder/MediaCodecSurfaceManager.cpp @@ -388,16 +388,24 @@ bool MediaCodecSurfaceManager::CreateVulkanImage(void* vk_device, void* vk_insta ycbcrConversionCreateInfo.format = vulkan_format; - // Use MediaCodec suggested YCbCr model and range for all devices - ycbcrConversionCreateInfo.ycbcrModel = static_cast(ahb_format_props.suggestedYcbcrModel); - ycbcrConversionCreateInfo.ycbcrRange = static_cast(ahb_format_props.suggestedYcbcrRange); - LogInfo(" Using MediaCodec suggested YCbCr model and range"); + // WORKAROUND: Qualcomm MediaCodec may suggest incorrect YCbCr model for AV1 + // Force BT.709 + Studio range on Qualcomm devices + if (is_qualcomm_gpu) { + ycbcrConversionCreateInfo.ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709; // BT.709 + ycbcrConversionCreateInfo.ycbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_NARROW; // Studio range (16-235) + LogInfo(" FORCED BT.709 + Studio range (Qualcomm workaround)"); + LogInfo(" MediaCodec suggested model: " + std::to_string(ahb_format_props.suggestedYcbcrModel) + " (ignored)"); + LogInfo(" MediaCodec suggested range: " + std::to_string(ahb_format_props.suggestedYcbcrRange) + " (ignored)"); + } else { + ycbcrConversionCreateInfo.ycbcrModel = static_cast(ahb_format_props.suggestedYcbcrModel); + ycbcrConversionCreateInfo.ycbcrRange = static_cast(ahb_format_props.suggestedYcbcrRange); + LogInfo(" Using MediaCodec suggested YCbCr model and range"); + } // Log color space settings LogInfo("YCbCr conversion:"); - LogInfo(" MediaCodec suggested model: " + std::to_string(ahb_format_props.suggestedYcbcrModel)); - LogInfo(" MediaCodec suggested range: " + std::to_string(ahb_format_props.suggestedYcbcrRange)); - LogInfo(" Using MediaCodec suggested color space settings"); + LogInfo(" YcbcrModel: " + std::to_string(ycbcrConversionCreateInfo.ycbcrModel)); + LogInfo(" YcbcrRange: " + std::to_string(ycbcrConversionCreateInfo.ycbcrRange)); // Log component mapping from MediaCodec LogInfo(" MediaCodec suggested components:");