From 7d57e27a40c74bb7fefcc3adbee033c99a68c3e1 Mon Sep 17 00:00:00 2001 From: Cristina Murillo Date: Sat, 4 Jul 2026 12:01:12 +0200 Subject: [PATCH] encoder: default msbShift for input >8-bit The compute-filter input path only shifts 10/12-bit samples into the most-significant bits when input.msbShift > 0, but the default is -1. So without an explicit --msbShift, high bit-depth input reached the encoder LSB-aligned and encoded to garbage. --- vk_video_encoder/libs/VkVideoEncoder/VkEncoderConfig.cpp | 4 ++++ vk_video_encoder/libs/VkVideoEncoder/VkVideoEncoder.cpp | 9 +++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/vk_video_encoder/libs/VkVideoEncoder/VkEncoderConfig.cpp b/vk_video_encoder/libs/VkVideoEncoder/VkEncoderConfig.cpp index 9b2e0eb0..249fee96 100644 --- a/vk_video_encoder/libs/VkVideoEncoder/VkEncoderConfig.cpp +++ b/vk_video_encoder/libs/VkVideoEncoder/VkEncoderConfig.cpp @@ -663,6 +663,10 @@ int EncoderConfig::ParseArguments(int argc, const char *argv[]) return -1; } + if (input.msbShift < 0 && input.bpp > 8) { + input.msbShift = static_cast(16 - input.bpp); + } + frameCount = inputFileHandler.GetFrameCount(input.width, input.height, input.bpp, input.chromaSubsampling); if (numFrames == 0 || numFrames > frameCount) { diff --git a/vk_video_encoder/libs/VkVideoEncoder/VkVideoEncoder.cpp b/vk_video_encoder/libs/VkVideoEncoder/VkVideoEncoder.cpp index 3b23d0b1..77faabd3 100644 --- a/vk_video_encoder/libs/VkVideoEncoder/VkVideoEncoder.cpp +++ b/vk_video_encoder/libs/VkVideoEncoder/VkVideoEncoder.cpp @@ -217,12 +217,9 @@ VkResult VkVideoEncoder::LoadNextFrame(VkSharedBaseObj& width, height); } } else if (m_encoderConfig->input.bpp == 10 || m_encoderConfig->input.bpp == 12) { - int shiftBits = 0; - if (m_encoderConfig->input.msbShift >= 0) { - shiftBits = m_encoderConfig->input.msbShift; - } else { - shiftBits = 16 - m_encoderConfig->input.bpp; - } + // msbShift is normalized to a non-negative value for bpp > 8 during + // argument parsing + int shiftBits = m_encoderConfig->input.msbShift; if (m_encoderConfig->encodeChromaSubsampling == VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR) { yCbCrConvResult = YCbCrConvUtilsCpu::I444ToP444(