mac-capture: Fix creation of invalid window stream on source creation

When the ScreenCaptureKit-based source is generated, the window ID
read from the settings will be empty and interpreted as window ID "0".

This window ID doesn't represent a valid window, but the capture stream
is nevertheless successfully initialized with that value, but will not
generate any output.

Worse, the activated stream should be destroyed when a new stream is
created, but creation will throw an error.

This commit ensures that a valid window ID is used if no good default
value is available, ensuring a working (and destroyable) stream.

Also removes any remaining usage of the old window-utils.
master
PatTheMav 2022-07-26 17:25:27 +02:00 committed by Patrick Heyer
parent 2bea178fb7
commit 93adc0a88c
1 changed files with 14 additions and 14 deletions

View File

@ -24,8 +24,6 @@ bool is_screen_capture_available(void)
#include <CoreMedia/CMSampleBuffer.h>
#include <CoreVideo/CVPixelBuffer.h>
#include "window-utils.h"
#define MACCAP_LOG(level, msg, ...) \
blog(level, "[ mac-screencapture ]: " msg, ##__VA_ARGS__)
#define MACCAP_ERR(msg, ...) MACCAP_LOG(LOG_ERROR, msg, ##__VA_ARGS__)
@ -69,7 +67,7 @@ struct screen_capture {
unsigned capture_type;
CGDirectDisplayID display;
struct cocoa_window window;
CGWindowID window;
NSString *application_id;
};
@ -150,8 +148,6 @@ static void screen_capture_destroy(void *data)
[sc->capture_delegate release];
}
destroy_window(&sc->window);
pthread_mutex_destroy(&sc->mutex);
bfree(sc);
}
@ -390,13 +386,12 @@ static bool init_screen_stream(struct screen_capture *sc)
} break;
case ScreenCaptureWindowStream: {
__block SCWindow *target_window = nil;
if (sc->window.window_id != 0) {
if (sc->window != 0) {
[sc->shareable_content.windows
indexOfObjectPassingTest:^BOOL(
SCWindow *_Nonnull window,
NSUInteger idx, BOOL *_Nonnull stop) {
if (window.windowID ==
sc->window.window_id) {
if (window.windowID == sc->window) {
target_window =
sc->shareable_content
.windows[idx];
@ -404,6 +399,10 @@ static bool init_screen_stream(struct screen_capture *sc)
}
return *stop;
}];
} else {
target_window =
[sc->shareable_content.windows objectAtIndex:0];
sc->window = target_window.windowID;
}
content_filter = [[SCContentFilter alloc]
initWithDesktopIndependentWindow:target_window];
@ -584,9 +583,7 @@ static void *screen_capture_create(obs_data_t *settings, obs_source_t *source)
sc->show_empty_names = obs_data_get_bool(settings, "show_empty_names");
sc->show_hidden_windows =
obs_data_get_bool(settings, "show_hidden_windows");
init_window(&sc->window, settings);
update_window(&sc->window, settings);
sc->window = obs_data_get_int(settings, "window");
os_sem_init(&sc->shareable_content_available, 1);
screen_capture_build_content_list(sc);
@ -776,8 +773,11 @@ static void screen_capture_update(void *data, obs_data_t *settings)
{
struct screen_capture *sc = data;
CGWindowID old_window_id = sc->window.window_id;
update_window(&sc->window, settings);
CGWindowID old_window_id = sc->window;
CGWindowID new_window_id = obs_data_get_int(settings, "window");
if (new_window_id > 0 && new_window_id != old_window_id)
sc->window = new_window_id;
ScreenCaptureStreamType capture_type =
(ScreenCaptureStreamType)obs_data_get_int(settings, "type");
@ -799,7 +799,7 @@ static void screen_capture_update(void *data, obs_data_t *settings)
return;
} break;
case ScreenCaptureWindowStream: {
if (old_window_id == sc->window.window_id &&
if (old_window_id == sc->window &&
sc->hide_cursor != show_cursor)
return;
} break;