fix(macos): prevent indefinite hanging if screen capture is not granted (#3360)
This commit is contained in:
committed by
GitHub
parent
c54664bbe0
commit
a06d4aefa6
@@ -5,6 +5,7 @@
|
|||||||
#include "src/platform/common.h"
|
#include "src/platform/common.h"
|
||||||
#include "src/platform/macos/av_img_t.h"
|
#include "src/platform/macos/av_img_t.h"
|
||||||
#include "src/platform/macos/av_video.h"
|
#include "src/platform/macos/av_video.h"
|
||||||
|
#include "src/platform/macos/misc.h"
|
||||||
#include "src/platform/macos/nv12_zero_device.h"
|
#include "src/platform/macos/nv12_zero_device.h"
|
||||||
|
|
||||||
#include "src/config.h"
|
#include "src/config.h"
|
||||||
@@ -100,6 +101,13 @@ namespace platf {
|
|||||||
|
|
||||||
int
|
int
|
||||||
dummy_img(img_t *img) override {
|
dummy_img(img_t *img) override {
|
||||||
|
if (!platf::is_screen_capture_allowed()) {
|
||||||
|
// If we don't have the screen capture permission, this function will hang
|
||||||
|
// indefinitely without doing anything useful. Exit instead to avoid this.
|
||||||
|
// A non-zero return value indicates failure to the calling function.
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
auto signal = [av_capture capture:^(CMSampleBufferRef sampleBuffer) {
|
auto signal = [av_capture capture:^(CMSampleBufferRef sampleBuffer) {
|
||||||
auto new_sample_buffer = std::make_shared<av_sample_buf_t>(sampleBuffer);
|
auto new_sample_buffer = std::make_shared<av_sample_buf_t>(sampleBuffer);
|
||||||
auto new_pixel_buffer = std::make_shared<av_pixel_buf_t>(new_sample_buffer->buf);
|
auto new_pixel_buffer = std::make_shared<av_pixel_buf_t>(new_sample_buffer->buf);
|
||||||
|
|||||||
@@ -8,6 +8,11 @@
|
|||||||
|
|
||||||
#include <CoreGraphics/CoreGraphics.h>
|
#include <CoreGraphics/CoreGraphics.h>
|
||||||
|
|
||||||
|
namespace platf {
|
||||||
|
bool
|
||||||
|
is_screen_capture_allowed();
|
||||||
|
}
|
||||||
|
|
||||||
namespace dyn {
|
namespace dyn {
|
||||||
typedef void (*apiproc)();
|
typedef void (*apiproc)();
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,16 @@ namespace platf {
|
|||||||
CGRequestScreenCaptureAccess(void) __attribute__((weak_import));
|
CGRequestScreenCaptureAccess(void) __attribute__((weak_import));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
auto screen_capture_allowed = std::atomic<bool> { false };
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
// Return whether screen capture is allowed for this process.
|
||||||
|
bool
|
||||||
|
is_screen_capture_allowed() {
|
||||||
|
return screen_capture_allowed;
|
||||||
|
}
|
||||||
|
|
||||||
std::unique_ptr<deinit_t>
|
std::unique_ptr<deinit_t>
|
||||||
init() {
|
init() {
|
||||||
// This will generate a warning about CGPreflightScreenCaptureAccess and
|
// This will generate a warning about CGPreflightScreenCaptureAccess and
|
||||||
@@ -68,6 +78,8 @@ namespace platf {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
|
// Record that we determined that we have the screen capture permission.
|
||||||
|
screen_capture_allowed = true;
|
||||||
return std::make_unique<deinit_t>();
|
return std::make_unique<deinit_t>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user