From fc35c6becd98c4577b6f95af3f3f7b17cb022280 Mon Sep 17 00:00:00 2001 From: ened Date: Thu, 20 Nov 2025 20:57:33 +0900 Subject: [PATCH] Failed combinations (FAILED) * forceExplicitReconstruction = VK_TRUE * BT.709 + Full range --- .../vav2player/app/src/main/cpp/vulkan_renderer.cpp | 7 ++++++- .../vav2player/app/src/main/cpp/vulkan_renderer.h | 1 + .../vavcore/src/Decoder/MediaCodecSurfaceManager.cpp | 9 ++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/vav2/platforms/android/applications/vav2player/app/src/main/cpp/vulkan_renderer.cpp b/vav2/platforms/android/applications/vav2player/app/src/main/cpp/vulkan_renderer.cpp index bb8cc58..8ea3018 100644 --- a/vav2/platforms/android/applications/vav2player/app/src/main/cpp/vulkan_renderer.cpp +++ b/vav2/platforms/android/applications/vav2player/app/src/main/cpp/vulkan_renderer.cpp @@ -1324,8 +1324,11 @@ bool VulkanVideoRenderer::CreateDescriptorSets() { bool VulkanVideoRenderer::CreateTextureSampler() { LOGI("Creating texture sampler..."); + // CRITICAL: For NV12/YCbCr textures, we need to attach VkSamplerYcbcrConversionInfo + // This will be set later when we get the YCbCr conversion from VavCore VkSamplerCreateInfo samplerInfo = {}; samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; + samplerInfo.pNext = nullptr; // YCbCr conversion will be added here when frame is decoded samplerInfo.magFilter = VK_FILTER_LINEAR; samplerInfo.minFilter = VK_FILTER_LINEAR; samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; @@ -1342,13 +1345,15 @@ bool VulkanVideoRenderer::CreateTextureSampler() { samplerInfo.minLod = 0.0f; samplerInfo.maxLod = 0.0f; + // NOTE: This creates a basic sampler without YCbCr conversion + // We'll need to recreate it with YCbCr conversion after first frame decode VkResult result = vkCreateSampler(m_device, &samplerInfo, nullptr, &m_textureSampler); if (result != VK_SUCCESS) { LOGE("Failed to create texture sampler: %d", result); return false; } - LOGI("Texture sampler created successfully"); + LOGI("Texture sampler created successfully (will be recreated with YCbCr conversion)"); return true; } diff --git a/vav2/platforms/android/applications/vav2player/app/src/main/cpp/vulkan_renderer.h b/vav2/platforms/android/applications/vav2player/app/src/main/cpp/vulkan_renderer.h index 4fe46a4..75d9fc9 100644 --- a/vav2/platforms/android/applications/vav2player/app/src/main/cpp/vulkan_renderer.h +++ b/vav2/platforms/android/applications/vav2player/app/src/main/cpp/vulkan_renderer.h @@ -146,6 +146,7 @@ private: // Samplers and texture resources VkSampler m_textureSampler = VK_NULL_HANDLE; + // NOTE: YCbCr conversion is passed per-frame from VavCore, not stored here // YUV texture resources VkImage m_yTexture = VK_NULL_HANDLE; diff --git a/vav2/platforms/windows/vavcore/src/Decoder/MediaCodecSurfaceManager.cpp b/vav2/platforms/windows/vavcore/src/Decoder/MediaCodecSurfaceManager.cpp index df7bd2c..b9d9924 100644 --- a/vav2/platforms/windows/vavcore/src/Decoder/MediaCodecSurfaceManager.cpp +++ b/vav2/platforms/windows/vavcore/src/Decoder/MediaCodecSurfaceManager.cpp @@ -434,7 +434,14 @@ bool MediaCodecSurfaceManager::CreateVulkanImage(void* vk_device, void* vk_insta LogInfo(" MediaCodec suggested yChromaOffset: " + std::to_string(ahb_format_props.suggestedYChromaOffset)); LogInfo(" Using MediaCodec suggested chroma offset"); ycbcrConversionCreateInfo.chromaFilter = VK_FILTER_LINEAR; - ycbcrConversionCreateInfo.forceExplicitReconstruction = VK_FALSE; + + // Option 7: Force explicit reconstruction for Qualcomm (disable implicit chroma reconstruction) + if (is_qualcomm_gpu) { + ycbcrConversionCreateInfo.forceExplicitReconstruction = VK_TRUE; + LogInfo(" FORCED explicit reconstruction (Qualcomm workaround - Option 7)"); + } else { + ycbcrConversionCreateInfo.forceExplicitReconstruction = VK_FALSE; + } result = vkCreateSamplerYcbcrConversion(device, &ycbcrConversionCreateInfo, nullptr, &m_ycbcr_conversion); if (result != VK_SUCCESS) {