From fc192c001664bc6fa18508992c3d512ed884a377 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Thu, 2 Nov 2017 17:45:25 +1100 Subject: [PATCH] [host] removed namespace sillyness --- host/Capture/NvFBC.cpp | 459 ++++++++++++++++++++--------------------- 1 file changed, 227 insertions(+), 232 deletions(-) diff --git a/host/Capture/NvFBC.cpp b/host/Capture/NvFBC.cpp index e4df403c..0e0c7e16 100644 --- a/host/Capture/NvFBC.cpp +++ b/host/Capture/NvFBC.cpp @@ -17,6 +17,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA */ #include "NvFBC.h" +using namespace Capture; #include @@ -29,241 +30,235 @@ Place, Suite 330, Boston, MA 02111-1307 USA #define NVFBC_LIBRARY_NAME "NvFBC.dll" #endif -namespace Capture +NvFBC::NvFBC() : + m_initialized(false), + m_hDLL(NULL), + m_nvFBC(NULL) { +} - NvFBC::NvFBC() : - m_initialized(false), - m_hDLL(NULL), - m_nvFBC(NULL) +NvFBC::~NvFBC() +{ +} + +bool NvFBC::Initialize() +{ + if (m_initialized) + DeInitialize(); + + std::string nvfbc = Util::GetSystemRoot() + "\\" + NVFBC_LIBRARY_NAME; + m_hDLL = LoadLibraryA(nvfbc.c_str()); + if (!m_hDLL) { - } - - NvFBC::~NvFBC() - { - } - - bool NvFBC::Initialize() - { - if (m_initialized) - DeInitialize(); - - std::string nvfbc = Util::GetSystemRoot() + "\\" + NVFBC_LIBRARY_NAME; - m_hDLL = LoadLibraryA(nvfbc.c_str()); - if (!m_hDLL) - { - DEBUG_ERROR("Failed to load the NvFBC library: %d - %s", GetLastError(), nvfbc.c_str()); - return false; - } - - m_fnCreateEx = (NvFBC_CreateFunctionExType )GetProcAddress(m_hDLL, "NvFBC_CreateEx" ); - m_fnSetGlobalFlags = (NvFBC_SetGlobalFlagsType )GetProcAddress(m_hDLL, "NvFBC_SetGlobalFlags"); - m_fnGetStatusEx = (NvFBC_GetStatusExFunctionType)GetProcAddress(m_hDLL, "NvFBC_GetStatusEx" ); - m_fnEnable = (NvFBC_EnableFunctionType )GetProcAddress(m_hDLL, "NvFBC_Enable" ); - - if (!m_fnCreateEx || !m_fnSetGlobalFlags || !m_fnGetStatusEx || !m_fnEnable) - { - DEBUG_ERROR("Unable to locate required entry points in %s", nvfbc.c_str()); - DeInitialize(); - return false; - } - - NvFBCStatusEx status; - ZeroMemory(&status, sizeof(NvFBCStatusEx)); - status.dwVersion = NVFBC_STATUS_VER; - status.dwAdapterIdx = 0; - - NVFBCRESULT ret = m_fnGetStatusEx(&status); - if (ret != NVFBC_SUCCESS) - { - DEBUG_INFO("Attempting to enable NvFBC"); - if (m_fnEnable(NVFBC_STATE_ENABLE) == NVFBC_SUCCESS) - { - DEBUG_INFO("Success, attempting to get status again"); - ret = m_fnGetStatusEx(&status); - } - - if (ret != NVFBC_SUCCESS) - { - DEBUG_ERROR("Failed to get NvFBC status"); - DeInitialize(); - return false; - } - } - - - if (!status.bIsCapturePossible) - { - DEBUG_ERROR("Capture is not possible, unsupported device or driver"); - DeInitialize(); - return false; - } - - if (!status.bCanCreateNow) - { - DEBUG_ERROR("Can not create an instance of NvFBC at this time"); - DeInitialize(); - return false; - } - - NvFBCCreateParams params; - ZeroMemory(¶ms, sizeof(NvFBCCreateParams)); - params.dwVersion = NVFBC_CREATE_PARAMS_VER; - params.dwInterfaceType = NVFBC_TO_SYS; - params.pDevice = NULL; - params.dwAdapterIdx = 0; - - - if (m_fnCreateEx(¶ms) != NVFBC_SUCCESS) - { - DEBUG_ERROR("Failed to create an instance of NvFBC"); - DeInitialize(); - return false; - } - - m_maxCaptureWidth = params.dwMaxDisplayWidth; - m_maxCaptureHeight = params.dwMaxDisplayHeight; - m_nvFBC = static_cast(params.pNvFBC); - - NVFBC_TOSYS_SETUP_PARAMS setupParams; - ZeroMemory(&setupParams, sizeof(NVFBC_TOSYS_SETUP_PARAMS)); - setupParams.dwVersion = NVFBC_TOSYS_SETUP_PARAMS_VER; - setupParams.eMode = NVFBC_TOSYS_RGB; - setupParams.bWithHWCursor = TRUE; - setupParams.bDiffMap = FALSE; - setupParams.ppBuffer = (void **)&m_frameBuffer; - setupParams.ppDiffMap = NULL; - - if (m_nvFBC->NvFBCToSysSetUp(&setupParams) != NVFBC_SUCCESS) - { - DEBUG_ERROR("NvFBCToSysSetUp Failed"); - DeInitialize(); - return false; - } - - // this is required according to NVidia sample code - Sleep(100); - - ZeroMemory(&m_grabFrameParams, sizeof(NVFBC_TOSYS_GRAB_FRAME_PARAMS)); - ZeroMemory(&m_grabInfo, sizeof(NvFBCFrameGrabInfo)); - m_grabFrameParams.dwVersion = NVFBC_TOSYS_GRAB_FRAME_PARAMS_VER; - m_grabFrameParams.dwFlags = NVFBC_TOSYS_NOFLAGS; - m_grabFrameParams.dwStartX = 0; - m_grabFrameParams.dwStartY = 0; - m_grabFrameParams.eGMode = NVFBC_TOSYS_SOURCEMODE_SCALE; - m_grabFrameParams.pNvFBCFrameGrabInfo = &m_grabInfo; - - if (!m_memcpy.Initialize()) - { - DEBUG_ERROR("Failed to initialize MTMemcpy"); - DeInitialize(); - return false; - } - - m_initialized = true; - return true; - } - - void NvFBC::DeInitialize() - { - m_memcpy.DeInitialize(); - - m_frameBuffer = NULL; - - if (m_nvFBC) - { - m_nvFBC->NvFBCToSysRelease(); - m_nvFBC = NULL; - } - - m_maxCaptureWidth = 0; - m_maxCaptureHeight = 0; - m_fnCreateEx = NULL; - m_fnSetGlobalFlags = NULL; - m_fnGetStatusEx = NULL; - m_fnEnable = NULL; - - if (m_hDLL) - { - FreeLibrary(m_hDLL); - m_hDLL = NULL; - } - - m_initialized = false; - } - - FrameType NvFBC::GetFrameType() - { - if (!m_initialized) - return FRAME_TYPE_INVALID; - - return FRAME_TYPE_RGB; - } - - FrameComp NvFBC::GetFrameCompression() - { - if (!m_initialized) - return FRAME_COMP_NONE; - - return FRAME_COMP_NONE; - } - - size_t NvFBC::GetMaxFrameSize() - { - if (!m_initialized) - return false; - - return m_maxCaptureWidth * m_maxCaptureHeight * 3; - } - - bool NvFBC::GrabFrame(struct FrameInfo & frame) - { - if (!m_initialized) - return false; - - const HWND hDesktop = GetDesktopWindow(); - RECT desktop; - GetWindowRect(hDesktop, &desktop); - - m_grabFrameParams.dwTargetWidth = desktop.right; - m_grabFrameParams.dwTargetHeight = desktop.bottom; - for(int i = 0; i < 2; ++i) - { - NVFBCRESULT status = m_nvFBC->NvFBCToSysGrabFrame(&m_grabFrameParams); - if (status == NVFBC_SUCCESS) - { - frame.width = m_grabInfo.dwWidth; - frame.height = m_grabInfo.dwHeight; - frame.stride = m_grabInfo.dwBufferWidth; - frame.outSize = m_grabInfo.dwBufferWidth * m_grabInfo.dwHeight * 3; - if (!m_memcpy.Copy(frame.buffer, m_frameBuffer, frame.outSize)) - { - DEBUG_ERROR("Memory copy failed"); - return false; - } - return true; - } - - if (status == NVFBC_ERROR_DYNAMIC_DISABLE) - { - DEBUG_ERROR("NvFBC was disabled by someone else"); - return false; - } - - if (status == NVFBC_ERROR_INVALIDATED_SESSION) - { - DEBUG_WARN("Session was invalidated, attempting to restart"); - DeInitialize(); - if (!Initialize()) - { - DEBUG_ERROR("Failed to re-iniaialize"); - return false; - } - } - } - - DEBUG_ERROR("Failed to grab frame"); + DEBUG_ERROR("Failed to load the NvFBC library: %d - %s", GetLastError(), nvfbc.c_str()); return false; } -}; \ No newline at end of file + m_fnCreateEx = (NvFBC_CreateFunctionExType )GetProcAddress(m_hDLL, "NvFBC_CreateEx" ); + m_fnSetGlobalFlags = (NvFBC_SetGlobalFlagsType )GetProcAddress(m_hDLL, "NvFBC_SetGlobalFlags"); + m_fnGetStatusEx = (NvFBC_GetStatusExFunctionType)GetProcAddress(m_hDLL, "NvFBC_GetStatusEx" ); + m_fnEnable = (NvFBC_EnableFunctionType )GetProcAddress(m_hDLL, "NvFBC_Enable" ); + + if (!m_fnCreateEx || !m_fnSetGlobalFlags || !m_fnGetStatusEx || !m_fnEnable) + { + DEBUG_ERROR("Unable to locate required entry points in %s", nvfbc.c_str()); + DeInitialize(); + return false; + } + + NvFBCStatusEx status; + ZeroMemory(&status, sizeof(NvFBCStatusEx)); + status.dwVersion = NVFBC_STATUS_VER; + status.dwAdapterIdx = 0; + + NVFBCRESULT ret = m_fnGetStatusEx(&status); + if (ret != NVFBC_SUCCESS) + { + DEBUG_INFO("Attempting to enable NvFBC"); + if (m_fnEnable(NVFBC_STATE_ENABLE) == NVFBC_SUCCESS) + { + DEBUG_INFO("Success, attempting to get status again"); + ret = m_fnGetStatusEx(&status); + } + + if (ret != NVFBC_SUCCESS) + { + DEBUG_ERROR("Failed to get NvFBC status"); + DeInitialize(); + return false; + } + } + + + if (!status.bIsCapturePossible) + { + DEBUG_ERROR("Capture is not possible, unsupported device or driver"); + DeInitialize(); + return false; + } + + if (!status.bCanCreateNow) + { + DEBUG_ERROR("Can not create an instance of NvFBC at this time"); + DeInitialize(); + return false; + } + + NvFBCCreateParams params; + ZeroMemory(¶ms, sizeof(NvFBCCreateParams)); + params.dwVersion = NVFBC_CREATE_PARAMS_VER; + params.dwInterfaceType = NVFBC_TO_SYS; + params.pDevice = NULL; + params.dwAdapterIdx = 0; + + if (m_fnCreateEx(¶ms) != NVFBC_SUCCESS) + { + DEBUG_ERROR("Failed to create an instance of NvFBC"); + DeInitialize(); + return false; + } + + m_maxCaptureWidth = params.dwMaxDisplayWidth; + m_maxCaptureHeight = params.dwMaxDisplayHeight; + m_nvFBC = static_cast(params.pNvFBC); + + NVFBC_TOSYS_SETUP_PARAMS setupParams; + ZeroMemory(&setupParams, sizeof(NVFBC_TOSYS_SETUP_PARAMS)); + setupParams.dwVersion = NVFBC_TOSYS_SETUP_PARAMS_VER; + setupParams.eMode = NVFBC_TOSYS_RGB; + setupParams.bWithHWCursor = TRUE; + setupParams.bDiffMap = FALSE; + setupParams.ppBuffer = (void **)&m_frameBuffer; + setupParams.ppDiffMap = NULL; + + if (m_nvFBC->NvFBCToSysSetUp(&setupParams) != NVFBC_SUCCESS) + { + DEBUG_ERROR("NvFBCToSysSetUp Failed"); + DeInitialize(); + return false; + } + + // this is required according to NVidia sample code + Sleep(100); + + ZeroMemory(&m_grabFrameParams, sizeof(NVFBC_TOSYS_GRAB_FRAME_PARAMS)); + ZeroMemory(&m_grabInfo, sizeof(NvFBCFrameGrabInfo)); + m_grabFrameParams.dwVersion = NVFBC_TOSYS_GRAB_FRAME_PARAMS_VER; + m_grabFrameParams.dwFlags = NVFBC_TOSYS_NOFLAGS; + m_grabFrameParams.dwStartX = 0; + m_grabFrameParams.dwStartY = 0; + m_grabFrameParams.eGMode = NVFBC_TOSYS_SOURCEMODE_SCALE; + m_grabFrameParams.pNvFBCFrameGrabInfo = &m_grabInfo; + + if (!m_memcpy.Initialize()) + { + DEBUG_ERROR("Failed to initialize MTMemcpy"); + DeInitialize(); + return false; + } + + m_initialized = true; + return true; +} + +void NvFBC::DeInitialize() +{ + m_memcpy.DeInitialize(); + + m_frameBuffer = NULL; + + if (m_nvFBC) + { + m_nvFBC->NvFBCToSysRelease(); + m_nvFBC = NULL; + } + + m_maxCaptureWidth = 0; + m_maxCaptureHeight = 0; + m_fnCreateEx = NULL; + m_fnSetGlobalFlags = NULL; + m_fnGetStatusEx = NULL; + m_fnEnable = NULL; + + if (m_hDLL) + { + FreeLibrary(m_hDLL); + m_hDLL = NULL; + } + + m_initialized = false; +} + +FrameType NvFBC::GetFrameType() +{ + if (!m_initialized) + return FRAME_TYPE_INVALID; + + return FRAME_TYPE_RGB; +} + +FrameComp NvFBC::GetFrameCompression() +{ + if (!m_initialized) + return FRAME_COMP_NONE; + + return FRAME_COMP_NONE; +} + +size_t NvFBC::GetMaxFrameSize() +{ + if (!m_initialized) + return false; + + return m_maxCaptureWidth * m_maxCaptureHeight * 3; +} + +bool NvFBC::GrabFrame(struct FrameInfo & frame) +{ + if (!m_initialized) + return false; + + const HWND hDesktop = GetDesktopWindow(); + RECT desktop; + GetWindowRect(hDesktop, &desktop); + + m_grabFrameParams.dwTargetWidth = desktop.right; + m_grabFrameParams.dwTargetHeight = desktop.bottom; + for(int i = 0; i < 2; ++i) + { + NVFBCRESULT status = m_nvFBC->NvFBCToSysGrabFrame(&m_grabFrameParams); + if (status == NVFBC_SUCCESS) + { + frame.width = m_grabInfo.dwWidth; + frame.height = m_grabInfo.dwHeight; + frame.stride = m_grabInfo.dwBufferWidth; + frame.outSize = m_grabInfo.dwBufferWidth * m_grabInfo.dwHeight * 3; + if (!m_memcpy.Copy(frame.buffer, m_frameBuffer, frame.outSize)) + { + DEBUG_ERROR("Memory copy failed"); + return false; + } + return true; + } + + if (status == NVFBC_ERROR_DYNAMIC_DISABLE) + { + DEBUG_ERROR("NvFBC was disabled by someone else"); + return false; + } + + if (status == NVFBC_ERROR_INVALIDATED_SESSION) + { + DEBUG_WARN("Session was invalidated, attempting to restart"); + DeInitialize(); + if (!Initialize()) + { + DEBUG_ERROR("Failed to re-iniaialize"); + return false; + } + } + } + + DEBUG_ERROR("Failed to grab frame"); + return false; +}