From 0bdf865f5cad21b2854e061596360e1f42e7f3a3 Mon Sep 17 00:00:00 2001 From: David Sansome Date: Sat, 15 Jun 2024 04:40:50 +1000 Subject: [PATCH] DDA grabber: Set a 500ms timeout when waiting for a new frame (#1753) * Add a DXDI DDA grabber * Change all names to camel case * Handle cropping and pixel decimation * Try more persistently to restart capture after an error occurred. These can happen when changing resolution, or resuming from sleep. * Set a 500ms timeout when acquiring a frame. The API won't give us a new frame if nothing on the screen has changed, so an INFINITE timeout means we'll wait forever in this case, and eventually the LED connection will timeout. --------- Co-authored-by: LordGrey <48840279+Lord-Grey@users.noreply.github.com> --- libsrc/grabber/dda/DDAGrabber.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libsrc/grabber/dda/DDAGrabber.cpp b/libsrc/grabber/dda/DDAGrabber.cpp index aea460466..6be4d40a5 100644 --- a/libsrc/grabber/dda/DDAGrabber.cpp +++ b/libsrc/grabber/dda/DDAGrabber.cpp @@ -174,7 +174,7 @@ int DDAGrabber::grabFrame(Image &image) // Acquire the next frame. CComPtr desktopResource; DXGI_OUTDUPL_FRAME_INFO frameInfo; - hr = d->desktopDuplication->AcquireNextFrame(INFINITE, &frameInfo, &desktopResource); + hr = d->desktopDuplication->AcquireNextFrame(500, &frameInfo, &desktopResource); if (hr == DXGI_ERROR_ACCESS_LOST || hr == DXGI_ERROR_INVALID_CALL) { if (!restartCapture()) @@ -185,7 +185,7 @@ int DDAGrabber::grabFrame(Image &image) } if (hr == DXGI_ERROR_WAIT_TIMEOUT) { - // This shouldn't happen since we specified an INFINITE timeout. + // Nothing changed on the screen in the 500ms we waited. return 0; } RETURN_IF_ERROR(hr, "Failed to acquire next frame", 0);