From 89e332048ea1be5d4e186bc1ceb0119c32280294 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 13 Jul 2018 20:19:32 -0700 Subject: [PATCH] Ensure the DXVA2 device is actually hardware with YUV2RGB conversion ability before using it --- app/streaming/renderers/dxva2.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/app/streaming/renderers/dxva2.cpp b/app/streaming/renderers/dxva2.cpp index c5e4eb6b..78265731 100644 --- a/app/streaming/renderers/dxva2.cpp +++ b/app/streaming/renderers/dxva2.cpp @@ -285,13 +285,27 @@ bool DXVA2Renderer::initializeRenderer() DXVA2_VideoProcessorCaps caps; hr = m_ProcService->GetVideoProcessorCaps(guids[i], &m_Desc, renderTargetDesc.Format, &caps); if (SUCCEEDED(hr)) { + if (!(caps.DeviceCaps & DXVA2_VPDev_HardwareDevice)) { + SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, + "Device %d is not hardware: %x", + i, + caps.DeviceCaps); + continue; + } + else if (!(caps.VideoProcessorOperations & DXVA2_VideoProcess_YUV2RGB) && + !(caps.VideoProcessorOperations & DXVA2_VideoProcess_YUV2RGBExtended)) { + SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, + "Device %d can't convert YUV2RGB: %x", + i, + caps.DeviceCaps); + continue; + } + m_ProcService->GetProcAmpRange(guids[i], &m_Desc, renderTargetDesc.Format, DXVA2_ProcAmp_Brightness, &m_BrightnessRange); m_ProcService->GetProcAmpRange(guids[i], &m_Desc, renderTargetDesc.Format, DXVA2_ProcAmp_Contrast, &m_ContrastRange); m_ProcService->GetProcAmpRange(guids[i], &m_Desc, renderTargetDesc.Format, DXVA2_ProcAmp_Hue, &m_HueRange); m_ProcService->GetProcAmpRange(guids[i], &m_Desc, renderTargetDesc.Format, DXVA2_ProcAmp_Saturation, &m_SaturationRange); - // TODO: Validate some caps? - hr = m_ProcService->CreateVideoProcessor(guids[i], &m_Desc, renderTargetDesc.Format, 0, &m_Processor); if (FAILED(hr)) { SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,