void GraphicsCaptureSource::BeginScene() { if(bCapturing) return; strWindowClass = data->GetString(TEXT("windowClass")); if(strWindowClass.IsEmpty()) return; bStretch = data->GetInt(TEXT("stretchImage")) != 0; bIgnoreAspect = data->GetInt(TEXT("ignoreAspect")) != 0; bCaptureMouse = data->GetInt(TEXT("captureMouse"), 1) != 0; bUseHotkey = data->GetInt(TEXT("useHotkey"), 0) != 0; hotkey = data->GetInt(TEXT("hotkey"), VK_F12); if (bUseHotkey) hotkeyID = OBSCreateHotkey(hotkey, (OBSHOTKEYPROC)GraphicsCaptureSource::CaptureHotkey, (UPARAM)this); gamma = data->GetInt(TEXT("gamma"), 100); if(bCaptureMouse && data->GetInt(TEXT("invertMouse"))) invertShader = CreatePixelShaderFromFile(TEXT("shaders\\InvertTexture.pShader")); drawShader = CreatePixelShaderFromFile(TEXT("shaders\\DrawTexture_ColorAdjust.pShader")); AttemptCapture(); }
void GraphicsCaptureSource::Tick(float fSeconds) { if(bCapturing && !capture) { if(++captureWaitCount >= API->GetMaxFPS()) { bCapturing = false; } } if(!bCapturing && !bErrorAcquiring) { captureCheckInterval += fSeconds; if ((!bUseHotkey && captureCheckInterval >= 3.0f) || (bUseHotkey && hwndNextTarget != NULL)) { AttemptCapture(); captureCheckInterval = 0.0f; } } else { if(!IsWindow(hwndCapture) || (bUseHotkey && hwndNextTarget && hwndNextTarget != hwndTarget)) EndCapture(); else hwndNextTarget = NULL; } }
void GraphicsCaptureSource::Tick(float fSeconds) { if(bCapturing && !capture) { if(++captureWaitCount >= API->GetMaxFPS()) { bCapturing = false; } } if(!bCapturing && !bErrorAcquiring) { captureCheckInterval += fSeconds; if(captureCheckInterval >= 3.0f) { AttemptCapture(); captureCheckInterval = 0.0f; } } else { if(!IsWindow(hwndCapture)) EndCapture(); } }
void GraphicsCaptureSource::BeginScene() { if(bCapturing) return; strWindowClass = data->GetString(TEXT("windowClass")); strExecutable = data->GetString(TEXT("executable")); if (strWindowClass.IsEmpty() && strExecutable.IsEmpty()) { Log(TEXT("GraphicsCaptureSource::BeginScene: No class or executable specified, what's happening?!")); return; } bUseDWMCapture = (scmpi(strWindowClass, TEXT("Dwm")) == 0); bStretch = data->GetInt(TEXT("stretchImage")) != 0; bAlphaBlend = data->GetInt(TEXT("alphaBlend")) != 0; bIgnoreAspect = data->GetInt(TEXT("ignoreAspect")) != 0; bCaptureMouse = data->GetInt(TEXT("captureMouse"), 1) != 0; bool safeHookVal = data->GetInt(TEXT("safeHook")) != 0; if (safeHookVal != useSafeHook && safeHookVal) Log(L"Using anti-cheat hooking for game capture"); useSafeHook = safeHookVal; bUseHotkey = data->GetInt(TEXT("useHotkey"), 0) != 0; hotkey = data->GetInt(TEXT("hotkey"), VK_F12); if(bUseHotkey) { hotkeyID = OBSCreateHotkey(hotkey, (OBSHOTKEYPROC)GraphicsCaptureSource::CaptureHotkey, (UPARAM)this); bUseDWMCapture = false; } gamma = data->GetInt(TEXT("gamma"), 100); if(bCaptureMouse && data->GetInt(TEXT("invertMouse"))) invertShader = CreatePixelShaderFromFile(TEXT("shaders\\InvertTexture.pShader")); drawShader = CreatePixelShaderFromFile(TEXT("shaders\\DrawTexture_ColorAdjust.pShader")); if (!bUseHotkey) AttemptCapture(); }
void GraphicsCaptureSource::BeginScene() { if(bCapturing) return; strWindowClass = data->GetString(TEXT("windowClass")); if(strWindowClass.IsEmpty()) return; bStretch = data->GetInt(TEXT("stretchImage")) != 0; bIgnoreAspect = data->GetInt(TEXT("ignoreAspect")) != 0; bCaptureMouse = data->GetInt(TEXT("captureMouse"), 1) != 0; gamma = data->GetInt(TEXT("gamma"), 100); if(bCaptureMouse && data->GetInt(TEXT("invertMouse"))) invertShader = CreatePixelShaderFromFile(TEXT("shaders\\InvertTexture.pShader")); drawShader = CreatePixelShaderFromFile(TEXT("shaders\\DrawTexture_ColorAdjust.pShader")); AttemptCapture(); }
void GraphicsCaptureSource::Tick(float fSeconds) { if(hSignalExit && WaitForSingleObject(hSignalExit, 0) == WAIT_OBJECT_0) { Log(TEXT("Exit signal received, terminating capture")); EndCapture(); } if(bCapturing && !hSignalReady && targetProcessID) hSignalReady = GetEvent(String() << CAPTURE_READY_EVENT << UINT(targetProcessID)); if (hSignalReady) { DWORD val = WaitForSingleObject(hSignalReady, 0); if (val == WAIT_OBJECT_0) NewCapture(); /*else if (val != WAIT_TIMEOUT) Log(TEXT("what the heck? val is 0x%08lX"), val);*/ } /* static int floong = 0; if (floong++ == 30) { Log(TEXT("valid, bCapturing = %s"), bCapturing ? TEXT("true") : TEXT("false")); floong = 0; } } else { static int floong = 0; if (floong++ == 30) { Log(TEXT("not valid, bCapturing = %s"), bCapturing ? TEXT("true") : TEXT("false")); floong = 0; } }*/ if(bCapturing && !capture) { if(++captureWaitCount >= API->GetMaxFPS()) { bCapturing = false; } } if(!bCapturing && !bErrorAcquiring) { captureCheckInterval += fSeconds; if ((!bUseHotkey && captureCheckInterval >= 3.0f) || (bUseHotkey && hwndNextTarget != NULL)) { AttemptCapture(); captureCheckInterval = 0.0f; } } else { if(!IsWindow(hwndCapture)) { Log(TEXT("Capture window 0x%08lX invalid or changing, terminating capture"), DWORD(hwndCapture)); EndCapture(); } else if (bUseHotkey && hwndNextTarget && hwndNextTarget != hwndTarget) { Log(TEXT("Capture hotkey triggered for new window, terminating capture")); EndCapture(); } else { hwndNextTarget = NULL; } } }
void GraphicsCaptureSource::Tick(float fSeconds) { if(hSignalExit && WaitForSingleObject(hSignalExit, 0) == WAIT_OBJECT_0) { Log(TEXT("Exit signal received, terminating capture")); EndCapture(); } if(bCapturing && !hSignalReady && targetProcessID) hSignalReady = GetEvent(String() << CAPTURE_READY_EVENT << UINT(targetProcessID)); if (injectHelperProcess && WaitForSingleObject(injectHelperProcess, 0) == WAIT_OBJECT_0) { DWORD exitCode; GetExitCodeProcess(injectHelperProcess, (DWORD*)&exitCode); CloseHandle(injectHelperProcess); injectHelperProcess = nullptr; if (exitCode != 0) { AppWarning(TEXT("safe inject Helper: Failed, error code = %d"), exitCode); bErrorAcquiring = true; } } if (hSignalReady) { DWORD val = WaitForSingleObject(hSignalReady, 0); if (val == WAIT_OBJECT_0) NewCapture(); else if (val != WAIT_TIMEOUT) OSDebugOut(TEXT("what the heck? val is 0x%08lX\n"), val); } static int floong = 0; if (hSignalReady) { if (floong++ == 60) { OSDebugOut(TEXT("valid, bCapturing = %s\n"), bCapturing ? TEXT("true") : TEXT("false")); floong = 0; } } else { if (floong++ == 60) { OSDebugOut(TEXT("not valid, bCapturing = %s\n"), bCapturing ? TEXT("true") : TEXT("false")); floong = 0; } } if(bCapturing && !capture) { if(++captureWaitCount >= API->GetMaxFPS()) { bCapturing = false; } } captureCheckInterval += fSeconds; if(!bCapturing && !bErrorAcquiring) { if ((!bUseHotkey && captureCheckInterval >= 3.0f) || (bUseHotkey && hwndNextTarget != NULL)) { if (bUseHotkey && hwndNextTarget) { strWindowClass.SetLength(255); RealGetWindowClassW(hwndNextTarget, strWindowClass.Array(), 255); strWindowClass.SetLength(slen(strWindowClass)); data->SetString(L"windowClass", strWindowClass); } AttemptCapture(); captureCheckInterval = 0.0f; } } else { if(!IsWindow(hwndCapture) && !bUseDWMCapture) { Log(TEXT("Capture window 0x%08lX invalid or changing, terminating capture"), DWORD(hwndCapture)); EndCapture(); } else if (hTargetProcess && WaitForSingleObject(hTargetProcess, 0) == WAIT_OBJECT_0) { Log(TEXT("Capture process %s exited, terminating capture"), strExecutable.Array()); EndCapture(); } else if (bUseHotkey && hwndNextTarget && hwndNextTarget != hwndTarget) { Log(TEXT("Capture hotkey triggered for new window, terminating capture")); EndCapture(); } else if (captureCheckInterval >= 5.0f) { //expensive check, only run it every 5 seconds DWORD processID; if (GetWindowThreadProcessId(hwndCapture, &processID) && processID != targetProcessID) { Log(TEXT("Capture window 0x%08lX changed owner to process %d (trying to capture %d), terminating capture"), DWORD(hwndCapture), processID, targetProcessID); EndCapture(); } captureCheckInterval = 0.0f; } else { hwndNextTarget = NULL; } } }