Skip to content

Commit d1f1035

Browse files
committed
fix: macOS screen capturing with iOSurface and platform thread management
1 parent a11f8a9 commit d1f1035

File tree

3 files changed

+29
-11
lines changed

3 files changed

+29
-11
lines changed

webrtc-jni/src/main/cpp/include/media/video/VideoTrackDesktopSource.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#include "api/video/i420_buffer.h"
2121
#include "media/base/adapted_video_track_source.h"
2222
#include "modules/desktop_capture/desktop_capturer.h"
23-
#include "rtc_base/thread.h"
23+
#include "rtc_base/platform_thread.h"
2424

2525
namespace jni
2626
{
@@ -66,7 +66,7 @@ namespace jni
6666

6767
std::unique_ptr<webrtc::DesktopFrame> lastFrame;
6868

69-
std::unique_ptr<webrtc::Thread> captureThread;
69+
webrtc::PlatformThread captureThread;
7070

7171
webrtc::scoped_refptr<webrtc::I420Buffer> buffer;
7272
};

webrtc-jni/src/main/cpp/src/media/video/VideoTrackDesktopSource.cpp

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,20 +71,23 @@ namespace jni
7171

7272
void VideoTrackDesktopSource::start()
7373
{
74-
isCapturing = true;
75-
76-
captureThread = webrtc::Thread::Create();
77-
captureThread->Start();
78-
captureThread->PostTask([&] { capture(); });
74+
if (captureThread.empty()) {
75+
isCapturing = true;
76+
77+
captureThread = webrtc::PlatformThread::SpawnJoinable(
78+
[&] {
79+
capture();
80+
},
81+
"VideoTrackDesktopThread",
82+
webrtc::ThreadAttributes().SetPriority(webrtc::ThreadPriority::kHigh));
83+
}
7984
}
8085

8186
void VideoTrackDesktopSource::stop()
8287
{
83-
if (isCapturing) {
88+
if (!captureThread.empty()) {
8489
isCapturing = false;
85-
86-
captureThread->Stop();
87-
captureThread.reset();
90+
captureThread.Finalize();
8891
}
8992
}
9093

@@ -239,6 +242,9 @@ namespace jni
239242
// Enable desktop effects.
240243
options.set_disable_effects(false);
241244

245+
#if defined(WEBRTC_MAC)
246+
options.set_allow_iosurface(true);
247+
#endif
242248
#if defined(WEBRTC_WIN)
243249
options.set_allow_directx_capturer(true);
244250
#endif
@@ -272,9 +278,14 @@ namespace jni
272278
int msPerFrame = 1000 / frameRate;
273279

274280
while (isCapturing) {
281+
#if defined(WEBRTC_MAC)
282+
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true);
283+
#endif
275284
capturer->CaptureFrame();
276285

277286
webrtc::Thread::SleepMs(msPerFrame);
278287
}
288+
289+
capturer.reset();
279290
}
280291
}

webrtc-jni/src/main/cpp/src/media/video/desktop/DesktopCapturer.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ namespace jni
2929
// Enable desktop effects.
3030
options.set_disable_effects(false);
3131

32+
#if defined(WEBRTC_MAC)
33+
options.set_allow_iosurface(true);
34+
#endif
3235
#if defined(WEBRTC_WIN)
3336
options.set_allow_directx_capturer(true);
3437
#endif
@@ -69,6 +72,10 @@ namespace jni
6972

7073
void DesktopCapturer::CaptureFrame()
7174
{
75+
#if defined(WEBRTC_MAC)
76+
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true);
77+
#endif
78+
7279
capturer->CaptureFrame();
7380
}
7481

0 commit comments

Comments
 (0)