64 Commits

Author SHA1 Message Date
jpark37
93fe82d1ce win-capture: Add DXGI/WGC HDR support
HDR for DXGI/WGC display capture, and WGC window capture.

Also add fast SDR paths for BitBlt to skip color conversions.
2022-04-14 09:36:09 -07:00
wangshaohui
81d70b5d1b win-capture: Should not init module if HWND is invisible 2021-12-16 23:39:55 -08:00
jpark37
3706a21327 win-capture: Use DPI context for window BitBlt
Fixes GetClientRect and cursor position for windows unaware of DPI.

Only works on Windows 10 1607 and above.
2021-10-09 15:45:55 -07:00
jpark37
bf27941f5f libobs-winrt, win-capture: Linear SRGB support
Update window, display, and game capture to always bilinear filter in
linear space, even if the source texture is not SRGB typed. This helps
resolve confusion in situations where we were filtering in nonlinear
space vs. linear space, like when toggling an empty crop filter.
2021-07-11 08:26:30 -07:00
Ryan Foster
85ffdd57f4 win-capture: Return early in property callbacks if param is null
When obs_get_source_properties is called, it calls the property modified
callbacks without a source instantiation. The callbacks set in
.get_properties for display capture and window capture would then result
in exceptions when anything is dereferenced on the source, such as
wgc_supported or update_mutex, because the source itself is null. Let's
make the callbacks return early if the property param is null.
2021-06-30 01:45:42 -07:00
Ryan Foster
1da97fb0d0 win-capture: Check for WGC support on plugin load
We shouldn't have to check WGC support for every display capture or
window capture source. Either the system supports it or it doesn't.
Check when the plugin loads and use that result.
2021-06-30 01:45:42 -07:00
Ryan Foster
2f3c0911fa win-capture: Determine D3D11 usage once per run
The device type (OBS renderer) cannot change without restarting OBS, so
we should only have to check if we're using D3D11 once instead of
checking every time a new display capture or window capture source is
created.
2021-06-30 01:45:42 -07:00
jpark37
366b716f20 libobs-winrt,win-capture: Cursor toggle exceptions
A user has reported that toggling the cursor can cause exceptions.

Propagate that information upward, so we can reset the capture.

Display capture never needed to call the function in the first place.

Shuffle around window capture code to make a common reset function.

Builds on PR #4663.
2021-05-07 23:50:13 -07:00
jpark37
78711fa648 win-capture: Add OBS_SOURCE_SRGB flag 2021-05-03 01:19:56 -07:00
wangshaohui
0069562cca win-capture: Fix window capture stuck last frame
Fixes obsproject/obs-studio#2321
2021-03-30 05:49:43 -07:00
jpark37
db35a022cd libobs-winrt,win-capture: Support desktop capture
Add display capture support via winrt_capture_init_monitor. Almost all
of the existing window capture code is reused.

Rename winrt_capture_init to winrt_capture_init_window for symmetry.
2021-01-26 15:57:20 -08:00
jpark37
a164a75ed6 win-capture: Warning fixes
Add explicit casts to convert data pointers to function pointers.

Add references for unused parameters.

Replace accidental BOOL* return values with BOOL.
2020-11-13 13:21:10 -08:00
jpark37
526c54fbba win-capture: Fix unused variables 2020-11-11 12:02:03 -08:00
jp9000
bdd6562a94 win-capture: Put window capture update data in a mutex
Because the window capture source updates its data whenever certain
properties are modified, this would cause a race condition because
source updates normally happen in the graphics thread.  To solve this
for the time being, put access to that data within a mutex when updating
or updating visibility.
2020-09-03 05:49:58 -07:00
jp9000
bf4a917751 win-capture: Fix excessive window capture logging 2020-08-25 10:18:45 -07:00
Jim
76ea0336ad
Merge pull request #2882 from RytoEX/log-window-capture-method
win-capture: Log window capture method
2020-06-21 07:00:36 -07:00
jpark37
477f90620d win-capture: Reset WGC fail flag for new window
WGC will give up on a window that it fails to capture, but that
shouldn't stop it from attempting to capture new windows.

Fixes #2928.
2020-05-13 07:54:41 -07:00
Ryan Foster
0a89446ba4 win-capture: Log window capture method 2020-05-08 04:16:28 -04:00
jpark37
097ea77488 libobs-winrt: win-capture: Detect GraphicsCaptureItem closure
Make WGC window capture recover from GraphicsCaptureItem closure, which
can occur when following links in fullscreen Chrome for example.
2020-05-06 21:42:26 -07:00
jpark37
e4e96c5cef libobs-winrt: win-capture: Clean up error handling
Use proper check to fix false positive on 1809, and rework error spew to
remove output parameters from winrt_capture_init.
2020-03-18 00:33:12 -07:00
jp9000
327a6f599e win-capture: Fix potential crash due to unhandled exceptions 2020-03-17 12:22:20 -07:00
jp9000
6209bea371 win-capture: Destroy winrt in graphics thread 2020-03-14 10:54:37 -07:00
jpark37
cb4954c279 libobs-winrt: win-capture: HDC cursor capture for WGC
Starting with Windows 10 2004, we can disable WGC cursor capture, and
provide a user toggle. We swap out WGC support for our own though
because ours does not break hardware cursor support.
2020-03-07 20:40:39 -08:00
jp9000
ec247ba982 win-capture: Find correct window even if it's minimized
In window capture, it will search for a window with a specific title,
but will not search minimized windows.  This fixes that by making is
acquire the correct window even if that window is minimized, rather than
potentially risk it capturing the wrong window of the same type.
2020-03-04 22:21:45 -08:00
jp9000
d5974b9e30 win-capture: Disable correct capture method index
When "Automatic" was added, the index for the item that needed to be
disabled became incorrect (to disable WCG).
2020-03-03 21:09:54 -08:00
VodBox
9aedc7e5b7 win-capture: Prevent WGC being selected when unavailable 2020-03-03 23:06:25 +13:00
jp9000
764d5a2d3f win-capture: Preserve current window setting
This re-uses the game capture code for checking whether the original
window still exists or not.  If it doesn't or the name changed, it'll
insert the value at the top of the list so it doesn't automatically
select another when the user opens properties.

Basically, this fixes an issue where opening properties could sometimes
cause it to instantly capture whatever window was at the top of the
list, which is undesirable.

Closes obsproject/obs-studio#2421
2020-02-27 04:45:21 -08:00
jp9000
ffe4c767c3 win-capture: Move window capture method below window 2020-02-27 03:22:04 -08:00
jpark37
2111a3a02f libobs-winrt: win-capture: Support client area toggle for WGC 2020-02-24 21:31:53 -08:00
jpark37
cce9fb7f95 win-capture: Hide settings if Automatic is WGC 2020-02-24 19:42:46 -08:00
jp9000
572ce73115 win-capture: Add 'auto' method to window capture
Adds an "Automatic" method to the capture method property of window
capture.  This allows the ability for window capture to automatically
determine the best capture method to use.  Primarily, it prefers BitBlt
in most cases, but will use WGC when it detects the window is a browser,
microsoft office, or a UWP program.

This was implemented because the new capture method has a number of
undesired effects associated with it -- the issue of the capture border
that we can do nothing about, the fact that we can't control the capture
of the cursor, and the fact that Microsoft designed it to switch the
cursor away from hardware cursor mode when the capture is active (there
was absolutely no reason to do this because even OBS can capture the
hardware cursor with no issue).  Until we get a new version of this API
that doesn't absolutely blow, we're stuck preferring BitBlt instead.

But hey, at least people will be able to capture browser windows now.
2020-02-22 21:02:33 -08:00
jpark37
ffc48dbbab win-capture: Windows Graphics Capture support
Users will now have the option of legacy window capture via BitBlt, or
Windows Graphics Capture, which is new to Windows 10.

There are two annoyances with the new capture method though. One is that
there is a bright, yellow border added to the original window (but not
the OBS view of it). The other is that the mouse cursor is always
captured, and we won't be able to capture without cursor until a later
version of Windows 10 is released.

It should also be noted that DPI scaling is now applied, which may
result in blurrier images caused by Windows rescaling.
2020-02-22 21:02:33 -08:00
Richard Stanway
fb6936a934 win-capture: Faster display / window capture updates
When changing the target for display or window capture, force a
refresh of the source by setting the timer to fire immediately. This
removes 1-3 seconds of "lag" before the new display or window is
visible and makes the UI feel more responsive.

Closes https://github.com/obsproject/obs-studio/issues/2322
2020-02-03 23:22:42 +01:00
Clayton Groeneveld
82ffcdc827 UI: Add source icons 2019-11-24 20:50:42 -08:00
jp9000
f53df7da64 clang-format: Apply formatting
Code submissions have continually suffered from formatting
inconsistencies that constantly have to be addressed.  Using
clang-format simplifies this by making code formatting more consistent,
and allows automation of the code formatting so that maintainers can
focus more on the code itself instead of code formatting.
2019-06-23 23:49:10 -07:00
jp9000
c372d26c02 win-capture: Don't try to find window every frame
When window capture is not capturing a window, don't try to find the
window every frame.  Instead, just check once per frame.  The process of
finding a window has a lot of checks and requires a surprising amount of
processing.
2019-02-11 17:57:24 -08:00
Ryan Foster
1db301f907 win-capture: Log window capture's target
Closes jp9000/obs-studio#983
2017-11-26 18:00:51 -08:00
Richard Stanway
0c167d27a6
win-capture: Hide cursor when in background (window capture) 2017-05-11 00:01:33 +02:00
jp9000
bf166c07f4 win-capture: Blacklist specific executables from game capture
Prevents the common problem of injecting in to certain processes and
getting the hook DLL "stuck":
- windows explorer
- steam
- battle.net
- gog galaxy
- skype
- uplay
- origin
- microsoft visual studio
- task manager
- league of legends lobby window
- windows 10 system settings window
2016-07-30 13:04:53 -07:00
jp9000
b101868e47 Revert "win-capture: Don't draw window if minimized"
This reverts commit 997f05f10ee7eec250c318f4c4e31d00cebcde57.
2016-05-15 06:14:18 -07:00
jp9000
997f05f10e win-capture: Don't draw window if minimized 2016-05-15 04:35:29 -07:00
jp9000
5a5b8b20e3 win-capture: Clear window capture if window no longer exists 2016-05-15 04:35:01 -07:00
jp9000
2707f05c46 Revert "win-capture: Allow window capturing of current process"
This reverts commit 8d520b970d3552417005f6dab4f0892485cd14ce.

This can actually cause a hard lock due to the windows API when
destroying window capture.  When the graphics thread locks the source
list for doing tick or render, and then the UI thread tries to destroy a
source, the UI thread will wait for the graphics thread to complete
rendering/ticking of sources.  The video_tick of window capture would
then check windows in the same process and try to query the window's
name via GetWindowText.  However, GetWindowText is synchronous, and will
not return until the window event has been processed by the UI thread,
so it will perpetually lock because the two threads are waiting for each
other to finish.
2016-05-13 04:21:39 -07:00
jp9000
8d520b970d win-capture: Allow window capturing of current process
Allows window capture to capture windows of the current process, and
adds windows of the current process to the end of the window list.
2016-05-13 02:14:24 -07:00
jp9000
6ad8df8adb (API Change) libobs: Use single func for base effects
API removed:
--------------------
gs_effect_t *obs_get_default_effect(void);
gs_effect_t *obs_get_default_rect_effect(void);
gs_effect_t *obs_get_opaque_effect(void);
gs_effect_t *obs_get_solid_effect(void);
gs_effect_t *obs_get_bicubic_effect(void);
gs_effect_t *obs_get_lanczos_effect(void);
gs_effect_t *obs_get_bilinear_lowres_effect(void);

API added:
--------------------
gs_effect_t *obs_get_base_effect(enum obs_base_effect effect);

Summary:
--------------------
Combines multiple near-identical functions into a single function with
an enum parameter.
2015-10-19 00:52:45 -07:00
jp9000
6285a47726 (API Change) libobs: Pass type data to get_name callbacks
API changed from:
obs_source_info::get_name(void)
obs_output_info::get_name(void)
obs_encoder_info::get_name(void)
obs_service_info::get_name(void)

API changed to:
obs_source_info::get_name(void *type_data)
obs_output_info::get_name(void *type_data)
obs_encoder_info::get_name(void *type_data)
obs_service_info::get_name(void *type_data)

This allows the type data to be used when getting the name of the
object (useful for plugin wrappers primarily).

NOTE: Though a parameter was added, this is backward-compatible with
older plugins due to calling convention.  The new parameter will simply
be ignored by older plugins, and the stack (if used) will be cleaned up
by the caller.
2015-09-16 09:21:12 -07:00
jp9000
5d75d88ccd win-capture: Fix compatibility bug for window cap.
The compatibility mode setting wasn't being set when an update occurred.
2015-05-01 02:07:19 -07:00
jp9000
e20ec366b2 Make capture sources w/o alpha use opaque effect
This fixes an issue primarily with filter rendering: when capturing
windows and displays, their alpha channel is almost always 0, causing
the image to be completely invisible unintentionally.  The original fix
for this for many sources was just to turn off the blending, which would
be fine if you're not rendering any filters, but filters will render to
render targets first, and that lack of alpha will end up carrying over
in to the final image.

This doesn't apply to any mac captures because mac actually seems to set
the alpha channel to 1.
2015-03-22 19:18:05 -07:00
jp9000
b277f2b737 Don't update video of sources if not displaying
This is a bit of an optimization to reduce load a little bit if any of
the video capture sources are not currently being displayed on the
screen.  They will simply not capture or update their texture data if
they are not currently being shown anywhere.

The mac and window game capture sources don't really apply due to the
fact that their textures aren't updated on the source's end (they update
inside of the hooks).
2015-01-05 02:10:32 -08:00
jp9000
9898060223 win-capture: Separate window finding source code
Because other capture methods may end up needing to share this code,
separate the window finding source code to window-helpers.c and
window-helpers.h.

This include a function to fill out a property list with windows, a
function to find a window based upon priority/title/class/exe, and a
function to decode the window title/class/exe strings from a window
setting string.
2014-10-17 04:15:57 -07:00