From 1571123a5ef5fbdef8d859defea4500e2ff9cd03 Mon Sep 17 00:00:00 2001 From: ened Date: Thu, 20 Nov 2025 08:42:14 +0900 Subject: [PATCH] Qualcom GPU enforce to use BT.709, Studio range (16-235) --- .../src/Decoder/MediaCodecSurfaceManager.cpp | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) 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:");