Skip to content

Commit

Permalink
DDA grabber: Set a 500ms timeout when waiting for a new frame (#1753)
Browse files Browse the repository at this point in the history
* 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 <[email protected]>
  • Loading branch information
davidsansome and Lord-Grey authored Jun 14, 2024
1 parent 7f90637 commit 0bdf865
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions libsrc/grabber/dda/DDAGrabber.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ int DDAGrabber::grabFrame(Image<ColorRgb> &image)
// Acquire the next frame.
CComPtr<IDXGIResource> 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())
Expand All @@ -185,7 +185,7 @@ int DDAGrabber::grabFrame(Image<ColorRgb> &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);
Expand Down

0 comments on commit 0bdf865

Please sign in to comment.