From 5518ccb795a63fa27a4b5943edb1ee2fdc2d4ad0 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Wed, 9 Jan 2019 16:09:41 +1100 Subject: [PATCH] [host] NvFBC: user specified privateData for debug --- host/Capture/NvFBC.cpp | 44 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/host/Capture/NvFBC.cpp b/host/Capture/NvFBC.cpp index 93c96741..3dc28652 100644 --- a/host/Capture/NvFBC.cpp +++ b/host/Capture/NvFBC.cpp @@ -34,6 +34,8 @@ using namespace Capture; #define NVFBC_LIBRARY_NAME "NvFBC.dll" #endif +#define MOPT "privData" + NvFBC::NvFBC() : m_options(NULL), m_optNoCrop(false), @@ -60,10 +62,36 @@ bool NvFBC::Initialize(CaptureOptions * options) m_options = options; m_optNoCrop = false; + + uint8_t * privData = NULL; + NvU32 privDataSize = 0; + for (CaptureOptions::const_iterator it = options->cbegin(); it != options->cend(); ++it) { if (_strcmpi(*it, "nocrop") == 0) { m_optNoCrop = false; continue; } if (_strcmpi(*it, "nowait") == 0) { m_optNoWait = true ; continue; } + + if (_strnicmp(*it, MOPT " ", sizeof(MOPT)) == 0) + { + std::string value(*it); + value.erase(0, sizeof(MOPT)); + + if (value.empty() || value.length() & 1) + continue; + + privDataSize = (NvU32)(value.length() / 2); + privData = new uint8_t[privDataSize]; + uint8_t *p = privData; + for (int i = 0; i < value.length(); i += 2, ++p) + { + char hex[3]; + #pragma warning(disable:4996) + value.copy(hex, 2, i); + #pragma warning(restore:4996) + hex[2] = 0; + *p = (uint8_t)strtoul(hex, NULL, 16); + } + } } std::string nvfbc = Util::GetSystemRoot() + "\\" + NVFBC_LIBRARY_NAME; @@ -142,18 +170,26 @@ bool NvFBC::Initialize(CaptureOptions * options) NvFBCCreateParams params; ZeroMemory(¶ms, sizeof(NvFBCCreateParams)); - params.dwVersion = NVFBC_CREATE_PARAMS_VER; - params.dwInterfaceType = NVFBC_TO_SYS; - params.pDevice = NULL; - params.dwAdapterIdx = 0; + params.dwVersion = NVFBC_CREATE_PARAMS_VER; + params.dwInterfaceType = NVFBC_TO_SYS; + params.pDevice = NULL; + params.dwAdapterIdx = 0; + params.dwPrivateDataSize = privDataSize; + params.pPrivateData = privData; if (m_fnCreateEx(¶ms) != NVFBC_SUCCESS) { + if (privData) + delete [] privData; + DEBUG_ERROR("Failed to create an instance of NvFBC"); DeInitialize(); return false; } + if (privData) + delete[] privData; + m_maxCaptureWidth = params.dwMaxDisplayWidth; m_maxCaptureHeight = params.dwMaxDisplayHeight; m_nvFBC = static_cast(params.pNvFBC);