Diff
Modified: trunk/LayoutTests/ChangeLog (281879 => 281880)
--- trunk/LayoutTests/ChangeLog 2021-09-01 21:34:59 UTC (rev 281879)
+++ trunk/LayoutTests/ChangeLog 2021-09-01 21:49:04 UTC (rev 281880)
@@ -1,3 +1,14 @@
+2021-09-01 Eric Carlson <[email protected]>
+
+ [macOS] getDisplayMedia should capture at the constrained size if possible
+ https://bugs.webkit.org/show_bug.cgi?id=229357
+ <rdar://problem/82191109>
+
+ Reviewed by Youenn Fablet.
+
+ * fast/mediastream/get-display-media-capabilities-expected.txt: Added.
+ * fast/mediastream/get-display-media-capabilities.html: Added.
+
2021-09-01 Ayumi Kojima <[email protected]>
[ BigSur arm64 Debug EWS ] ASSERTION FAILED: m_uncommittedState.state == State::Provisional.
Added: trunk/LayoutTests/fast/mediastream/get-display-media-capabilities-expected.txt (0 => 281880)
--- trunk/LayoutTests/fast/mediastream/get-display-media-capabilities-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/mediastream/get-display-media-capabilities-expected.txt 2021-09-01 21:49:04 UTC (rev 281880)
@@ -0,0 +1,3 @@
+
+PASS check capabilities
+
Added: trunk/LayoutTests/fast/mediastream/get-display-media-capabilities.html (0 => 281880)
--- trunk/LayoutTests/fast/mediastream/get-display-media-capabilities.html (rev 0)
+++ trunk/LayoutTests/fast/mediastream/get-display-media-capabilities.html 2021-09-01 21:49:04 UTC (rev 281880)
@@ -0,0 +1,28 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>video track created with getDisplayMedia should return correct capabilities</title>
+ <script src=""
+ <script src=""
+ <script src=""
+ </head>
+ <body>
+
+ <script>
+ promise_test(async () => {
+ stream = await callGetDisplayMedia({ video: true });
+ let capabilities = stream.getVideoTracks()[0].getCapabilities();
+
+ let height = capabilities.height;
+ assert_equals(height.max, 1080);
+ assert_equals(height.min, 1);
+
+ let width = capabilities.width;
+ assert_equals(width.max, 1920);
+ assert_equals(width.min, 1);
+ }, "check capabilities");
+
+ </script>
+ </body>
+</html>
Modified: trunk/Source/WebCore/ChangeLog (281879 => 281880)
--- trunk/Source/WebCore/ChangeLog 2021-09-01 21:34:59 UTC (rev 281879)
+++ trunk/Source/WebCore/ChangeLog 2021-09-01 21:49:04 UTC (rev 281880)
@@ -1,3 +1,50 @@
+2021-09-01 Eric Carlson <[email protected]>
+
+ [macOS] getDisplayMedia should capture at the constrained size if possible
+ https://bugs.webkit.org/show_bug.cgi?id=229357
+ <rdar://problem/82191109>
+
+ Reviewed by Youenn Fablet.
+
+ Create display stream with preferred width, height, and frame rate.
+
+ Test: fast/mediastream/get-display-media-capabilities.html
+
+ * platform/mediastream/mac/CGDisplayStreamCaptureSource.cpp:
+ (WebCore::CGDisplayStreamCaptureSource::start): Remove frame rate parameter.
+ (WebCore::CGDisplayStreamCaptureSource::startDisplayStream): Ditto.
+ (WebCore::CGDisplayStreamCaptureSource::commitConfiguration): Pass source settings
+ instead of frame rate. Release and recreate the display stream if width, height,
+ or frame rate has changed.
+ * platform/mediastream/mac/CGDisplayStreamCaptureSource.h:
+ (WebCore::CGDisplayStreamCaptureSource::width const):
+ (WebCore::CGDisplayStreamCaptureSource::height const):
+ (WebCore::CGDisplayStreamCaptureSource::frameRate const):
+
+ * platform/mediastream/mac/CGDisplayStreamScreenCaptureSource.h:
+ * platform/mediastream/mac/CGDisplayStreamScreenCaptureSource.mm:
+ (WebCore::CGDisplayStreamScreenCaptureSource::createDisplayStream): Remove
+ frame rate parameter. Create display stream with the configured width and height,
+ not the size of the screen.
+ (WebCore::CGDisplayStreamScreenCaptureSource::intrinsicSize const): Return screen
+ size so track capabilities are accurate.
+
+ * platform/mediastream/mac/CGWindowCaptureSource.h:
+ * platform/mediastream/mac/CGWindowCaptureSource.mm:
+ (WebCore::CGWindowCaptureSource::create): Remove frame rate parameter.
+ (WebCore::CGWindowCaptureSource::intrinsicSize const): Return window size.
+
+ * platform/mediastream/mac/DisplayCaptureSourceMac.cpp:
+ (WebCore::DisplayCaptureSourceMac::capabilities): Use capturer intrinsic size for
+ width and height capabilities.
+
+ * platform/mediastream/mac/DisplayCaptureSourceMac.h:
+ * platform/mock/MockRealtimeMediaSourceCenter.cpp: Change the mock screen sizes to
+ make the first one is different than the old hard-coded sizes so we're able to detect
+ that it is used in a test.
+ (WebCore::MockDisplayCapturer::start): Remove frame rate parameter.
+ (WebCore::MockDisplayCapturer::intrinsicSize const):
+
2021-09-01 Chris Dumez <[email protected]>
Improve time precision when cross-origin isolated via COOP+COEP
Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp (281879 => 281880)
--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp 2021-09-01 21:34:59 UTC (rev 281879)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp 2021-09-01 21:49:04 UTC (rev 281880)
@@ -997,7 +997,7 @@
}
}
-const IntSize RealtimeMediaSource::intrinsicSize() const
+IntSize RealtimeMediaSource::intrinsicSize() const
{
return m_intrinsicSize;
}
Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h (281879 => 281880)
--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h 2021-09-01 21:34:59 UTC (rev 281879)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h 2021-09-01 21:49:04 UTC (rev 281880)
@@ -149,7 +149,7 @@
const IntSize size() const;
void setSize(const IntSize&);
- const IntSize intrinsicSize() const;
+ IntSize intrinsicSize() const;
void setIntrinsicSize(const IntSize&, bool notifyObservers = true);
double frameRate() const { return m_frameRate; }
Modified: trunk/Source/WebCore/platform/mediastream/mac/CGDisplayStreamCaptureSource.cpp (281879 => 281880)
--- trunk/Source/WebCore/platform/mediastream/mac/CGDisplayStreamCaptureSource.cpp 2021-09-01 21:34:59 UTC (rev 281879)
+++ trunk/Source/WebCore/platform/mediastream/mac/CGDisplayStreamCaptureSource.cpp 2021-09-01 21:49:04 UTC (rev 281880)
@@ -48,7 +48,7 @@
m_currentFrame = nullptr;
}
-bool CGDisplayStreamCaptureSource::start(float frameRate)
+bool CGDisplayStreamCaptureSource::start()
{
ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER);
@@ -55,7 +55,7 @@
if (m_isRunning)
return true;
- return startDisplayStream(frameRate);
+ return startDisplayStream();
}
void CGDisplayStreamCaptureSource::stop()
@@ -76,7 +76,7 @@
return DisplayCaptureSourceMac::DisplayFrameType { RetainPtr<IOSurfaceRef> { m_currentFrame.ioSurface() } };
}
-bool CGDisplayStreamCaptureSource::startDisplayStream(float frameRate)
+bool CGDisplayStreamCaptureSource::startDisplayStream()
{
if (!checkDisplayStream())
return false;
@@ -85,7 +85,7 @@
m_captureQueue = adoptOSObject(dispatch_queue_create("CGDisplayStreamCaptureSource Capture Queue", DISPATCH_QUEUE_SERIAL));
if (!m_displayStream) {
- m_displayStream = createDisplayStream(frameRate, frameAvailableHandler(), m_captureQueue.get());
+ m_displayStream = createDisplayStream(frameAvailableHandler(), m_captureQueue.get());
if (!m_displayStream)
return false;
@@ -105,10 +105,22 @@
return true;
}
-void CGDisplayStreamCaptureSource::commitConfiguration(float frameRate)
+void CGDisplayStreamCaptureSource::commitConfiguration(const RealtimeMediaSourceSettings& settings)
{
- if (m_isRunning && !m_displayStream)
- startDisplayStream(frameRate);
+ if (m_width == settings.width() && m_height == settings.height() && m_frameRate == settings.frameRate())
+ return;
+
+ m_width = settings.width();
+ m_height = settings.height();
+ m_frameRate = settings.frameRate();
+
+ if (m_displayStream) {
+ CGDisplayStreamStop(m_displayStream.get());
+ m_displayStream = nullptr;
+ }
+
+ if (m_isRunning)
+ startDisplayStream();
}
void CGDisplayStreamCaptureSource::displayWasReconfigured(CGDirectDisplayID, CGDisplayChangeSummaryFlags)
Modified: trunk/Source/WebCore/platform/mediastream/mac/CGDisplayStreamCaptureSource.h (281879 => 281880)
--- trunk/Source/WebCore/platform/mediastream/mac/CGDisplayStreamCaptureSource.h 2021-09-01 21:34:59 UTC (rev 281879)
+++ trunk/Source/WebCore/platform/mediastream/mac/CGDisplayStreamCaptureSource.h 2021-09-01 21:49:04 UTC (rev 281880)
@@ -47,23 +47,27 @@
protected:
using FrameAvailableCallback = void (^)(CGDisplayStreamFrameStatus, uint64_t, IOSurfaceRef, CGDisplayStreamUpdateRef);
- virtual RetainPtr<CGDisplayStreamRef> createDisplayStream(float, FrameAvailableCallback, dispatch_queue_t) = 0;
+ virtual RetainPtr<CGDisplayStreamRef> createDisplayStream(FrameAvailableCallback, dispatch_queue_t) = 0;
virtual bool checkDisplayStream() { return true; }
CGDisplayStreamRef displayStream() const { return m_displayStream.get(); }
void invalidateDisplayStream() { m_displayStream = nullptr; }
+ uint32_t width() const { return m_width; }
+ uint32_t height() const { return m_height; }
+ float frameRate() const { return m_frameRate; }
+
private:
static void displayReconfigurationCallBack(CGDirectDisplayID, CGDisplayChangeSummaryFlags, void*);
// DisplayCaptureSourceMac::Capturer
- bool start(float frameRate) final;
+ bool start() final;
void stop() final;
DisplayCaptureSourceMac::DisplayFrameType generateFrame() final;
- void commitConfiguration(float frameRate) final;
+ void commitConfiguration(const RealtimeMediaSourceSettings&) final;
void displayWasReconfigured(CGDirectDisplayID, CGDisplayChangeSummaryFlags);
- bool startDisplayStream(float frameRate);
+ bool startDisplayStream();
FrameAvailableCallback frameAvailableHandler();
class DisplaySurface {
@@ -105,6 +109,10 @@
OSObjectPtr<dispatch_queue_t> m_captureQueue;
BlockPtr<void(CGDisplayStreamFrameStatus, uint64_t, IOSurfaceRef, CGDisplayStreamUpdateRef)> m_frameAvailableHandler;
+ uint32_t m_width { 0 };
+ uint32_t m_height { 0 };
+ float m_frameRate { 0 };
+
bool m_isRunning { false };
bool m_observingDisplayChanges { false };
};
Modified: trunk/Source/WebCore/platform/mediastream/mac/CGDisplayStreamScreenCaptureSource.h (281879 => 281880)
--- trunk/Source/WebCore/platform/mediastream/mac/CGDisplayStreamScreenCaptureSource.h 2021-09-01 21:34:59 UTC (rev 281879)
+++ trunk/Source/WebCore/platform/mediastream/mac/CGDisplayStreamScreenCaptureSource.h 2021-09-01 21:49:04 UTC (rev 281880)
@@ -54,12 +54,13 @@
// DisplayCaptureSourceMac::Capturer
CaptureDevice::DeviceType deviceType() const final { return CaptureDevice::DeviceType::Screen; }
RealtimeMediaSourceSettings::DisplaySurfaceType surfaceType() const final { return RealtimeMediaSourceSettings::DisplaySurfaceType::Monitor; }
+ IntSize intrinsicSize() const final;
#if !RELEASE_LOG_DISABLED
const char* logClassName() const final { return "CGDisplayStreamScreenCaptureSource"; }
#endif
// CGDisplayStreamCaptureSource
- RetainPtr<CGDisplayStreamRef> createDisplayStream(float, FrameAvailableCallback, dispatch_queue_t) final;
+ RetainPtr<CGDisplayStreamRef> createDisplayStream(FrameAvailableCallback, dispatch_queue_t) final;
bool checkDisplayStream() final;
class DisplaySurface {
Modified: trunk/Source/WebCore/platform/mediastream/mac/CGDisplayStreamScreenCaptureSource.mm (281879 => 281880)
--- trunk/Source/WebCore/platform/mediastream/mac/CGDisplayStreamScreenCaptureSource.mm 2021-09-01 21:34:59 UTC (rev 281879)
+++ trunk/Source/WebCore/platform/mediastream/mac/CGDisplayStreamScreenCaptureSource.mm 2021-09-01 21:49:04 UTC (rev 281880)
@@ -111,7 +111,7 @@
return true;
}
-RetainPtr<CGDisplayStreamRef> CGDisplayStreamScreenCaptureSource::createDisplayStream(float frameRate, FrameAvailableCallback frameAvailableHandler, dispatch_queue_t queue)
+RetainPtr<CGDisplayStreamRef> CGDisplayStreamScreenCaptureSource::createDisplayStream(FrameAvailableCallback frameAvailableHandler, dispatch_queue_t queue)
{
static const int screenQueueMaximumLength = 6;
@@ -118,26 +118,27 @@
ASSERT(!displayStream());
ASSERT(m_displayID == updateDisplayID(m_displayID));
- ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER);
+ ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER, "frame rate ", frameRate(), ", size ", width(), "x", height());
- auto displayMode = adoptCF(CGDisplayCopyDisplayMode(m_displayID));
- auto screenWidth = CGDisplayModeGetPixelsWide(displayMode.get());
- auto screenHeight = CGDisplayModeGetPixelsHigh(displayMode.get());
- if (!screenWidth || !screenHeight) {
- ERROR_LOG_IF(loggerPtr(), LOGIDENTIFIER, "unable to get screen width/height");
- return nullptr;
- }
-
NSDictionary* streamOptions = @{
- (__bridge NSString *)kCGDisplayStreamMinimumFrameTime : @(1 / frameRate),
+ (__bridge NSString *)kCGDisplayStreamMinimumFrameTime : @(1 / frameRate()),
(__bridge NSString *)kCGDisplayStreamQueueDepth : @(screenQueueMaximumLength),
(__bridge NSString *)kCGDisplayStreamColorSpace : (__bridge id)sRGBColorSpaceRef(),
(__bridge NSString *)kCGDisplayStreamShowCursor : @YES,
};
- return adoptCF(CGDisplayStreamCreateWithDispatchQueue(m_displayID, screenWidth, screenHeight, preferedPixelBufferFormat(), (__bridge CFDictionaryRef)streamOptions, queue, frameAvailableHandler));
+ return adoptCF(CGDisplayStreamCreateWithDispatchQueue(m_displayID, width(), height(), preferedPixelBufferFormat(), (__bridge CFDictionaryRef)streamOptions, queue, frameAvailableHandler));
}
+IntSize CGDisplayStreamScreenCaptureSource::intrinsicSize() const
+{
+ auto displayMode = adoptCF(CGDisplayCopyDisplayMode(m_displayID));
+ auto screenWidth = CGDisplayModeGetPixelsWide(displayMode.get());
+ auto screenHeight = CGDisplayModeGetPixelsHigh(displayMode.get());
+
+ return { Checked<int>(screenWidth), Checked<int>(screenHeight) };
+}
+
std::optional<CaptureDevice> CGDisplayStreamScreenCaptureSource::screenCaptureDeviceWithPersistentID(const String& deviceID)
{
auto displayID = parseInteger<uint32_t>(deviceID);
Modified: trunk/Source/WebCore/platform/mediastream/mac/CGWindowCaptureSource.h (281879 => 281880)
--- trunk/Source/WebCore/platform/mediastream/mac/CGWindowCaptureSource.h 2021-09-01 21:34:59 UTC (rev 281879)
+++ trunk/Source/WebCore/platform/mediastream/mac/CGWindowCaptureSource.h 2021-09-01 21:49:04 UTC (rev 281880)
@@ -50,12 +50,13 @@
private:
// DisplayCaptureSourceMac::Capturer
- bool start(float) final { return true; }
+ bool start() final { return true; }
void stop() final { }
DisplayCaptureSourceMac::DisplayFrameType generateFrame() final;
RealtimeMediaSourceSettings::DisplaySurfaceType surfaceType() const final { return RealtimeMediaSourceSettings::DisplaySurfaceType::Window; }
CaptureDevice::DeviceType deviceType() const final { return CaptureDevice::DeviceType::Window; }
- void commitConfiguration(float) final { }
+ void commitConfiguration(const RealtimeMediaSourceSettings&) final { }
+ IntSize intrinsicSize() const final;
const char* logClassName() const final { return "CGWindowCaptureSource"; }
RetainPtr<CGImageRef> windowImage();
Modified: trunk/Source/WebCore/platform/mediastream/mac/CGWindowCaptureSource.mm (281879 => 281880)
--- trunk/Source/WebCore/platform/mediastream/mac/CGWindowCaptureSource.mm 2021-09-01 21:34:59 UTC (rev 281879)
+++ trunk/Source/WebCore/platform/mediastream/mac/CGWindowCaptureSource.mm 2021-09-01 21:49:04 UTC (rev 281880)
@@ -103,17 +103,40 @@
Expected<UniqueRef<DisplayCaptureSourceMac::Capturer>, String> CGWindowCaptureSource::create(const String& deviceID)
{
- auto displayID = parseInteger<uint32_t>(deviceID);
- if (!displayID)
+ auto windowID = parseInteger<uint32_t>(deviceID);
+ if (!windowID)
return makeUnexpected("Invalid window device ID"_s);
- auto windowInfo = windowDescription(*displayID);
+ auto windowInfo = windowDescription(*windowID);
if (!windowInfo)
return makeUnexpected("Invalid window ID"_s);
- return UniqueRef<DisplayCaptureSourceMac::Capturer>(makeUniqueRef<CGWindowCaptureSource>(*displayID));
+ return UniqueRef<DisplayCaptureSourceMac::Capturer>(makeUniqueRef<CGWindowCaptureSource>(*windowID));
}
+IntSize CGWindowCaptureSource::intrinsicSize() const
+{
+ auto windowInfo = windowDescription(m_windowID);
+ if (!windowInfo) {
+ RELEASE_LOG(WebRTC, "Invalid window ID?");
+ return { };
+ }
+
+ auto boundsDictionary = checked_cf_cast<CFDictionaryRef>(CFDictionaryGetValue(windowInfo.get(), kCGWindowBounds));
+ if (!boundsDictionary) {
+ RELEASE_LOG(WebRTC, "Unable to get window bounds");
+ return { };
+ }
+
+ CGRect windowBounds;
+ if (!CGRectMakeWithDictionaryRepresentation(boundsDictionary, &windowBounds)) {
+ RELEASE_LOG(WebRTC, "Unable to decode window bounds");
+ return { };
+ }
+
+ return IntSize(windowBounds.size);
+}
+
CGWindowCaptureSource::CGWindowCaptureSource(uint32_t windowID)
: m_windowID(windowID)
{
Modified: trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceMac.cpp (281879 => 281880)
--- trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceMac.cpp 2021-09-01 21:34:59 UTC (rev 281879)
+++ trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceMac.cpp 2021-09-01 21:49:04 UTC (rev 281880)
@@ -103,9 +103,9 @@
if (!m_capabilities) {
RealtimeMediaSourceCapabilities capabilities(settings().supportedConstraints());
- // FIXME: what should these be?
- capabilities.setWidth(CapabilityValueOrRange(1, 3840));
- capabilities.setHeight(CapabilityValueOrRange(1, 2160));
+ auto intrinsicSize = m_capturer->intrinsicSize();
+ capabilities.setWidth(CapabilityValueOrRange(1, intrinsicSize.width()));
+ capabilities.setHeight(CapabilityValueOrRange(1, intrinsicSize.height()));
capabilities.setFrameRate(CapabilityValueOrRange(.01, 30.0));
m_capabilities = WTFMove(capabilities);
@@ -145,9 +145,6 @@
if (settings.contains(RealtimeMediaSourceSettings::Flag::FrameRate) && m_timer.isActive())
m_timer.startRepeating(1_s / frameRate());
- if (settings.containsAny({ RealtimeMediaSourceSettings::Flag::Width, RealtimeMediaSourceSettings::Flag::Height }))
- m_bufferAttributes = nullptr;
-
m_currentSettings = { };
}
@@ -156,7 +153,7 @@
m_startTime = MonotonicTime::now();
m_timer.startRepeating(1_s / frameRate());
- if (!m_capturer->start(frameRate()))
+ if (!m_capturer->start())
captureFailed();
}
Modified: trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceMac.h (281879 => 281880)
--- trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceMac.h 2021-09-01 21:34:59 UTC (rev 281879)
+++ trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceMac.h 2021-09-01 21:49:04 UTC (rev 281880)
@@ -59,12 +59,13 @@
public:
virtual ~Capturer() = default;
- virtual bool start(float frameRate) = 0;
+ virtual bool start() = 0;
virtual void stop() = 0;
virtual DisplayFrameType generateFrame() = 0;
virtual CaptureDevice::DeviceType deviceType() const = 0;
virtual RealtimeMediaSourceSettings::DisplaySurfaceType surfaceType() const = 0;
- virtual void commitConfiguration(float frameRate) = 0;
+ virtual void commitConfiguration(const RealtimeMediaSourceSettings&) = 0;
+ virtual IntSize intrinsicSize() const = 0;
virtual void setLogger(const Logger&, const void*);
const Logger* loggerPtr() const { return m_logger.get(); }
@@ -94,7 +95,7 @@
const RealtimeMediaSourceCapabilities& capabilities() final;
const RealtimeMediaSourceSettings& settings() final;
CaptureDevice::DeviceType deviceType() const { return m_capturer->deviceType(); }
- void commitConfiguration() final { return m_capturer->commitConfiguration(frameRate()); }
+ void commitConfiguration() final { m_capturer->commitConfiguration(settings()); }
const char* logClassName() const final { return "DisplayCaptureSourceMac"; }
@@ -108,7 +109,6 @@
MonotonicTime m_startTime { MonotonicTime::nan() };
Seconds m_elapsedTime { 0_s };
- RetainPtr<CFMutableDictionaryRef> m_bufferAttributes;
RunLoop::Timer<DisplayCaptureSourceMac> m_timer;
std::unique_ptr<ImageTransferSessionVT> m_imageTransferSession;
Modified: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp (281879 => 281880)
--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp 2021-09-01 21:34:59 UTC (rev 281879)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp 2021-09-01 21:49:04 UTC (rev 281880)
@@ -91,8 +91,8 @@
Color::darkGray,
} },
- MockMediaDevice { "SCREEN-1"_s, "Mock screen device 1"_s, MockDisplayProperties { CaptureDevice::DeviceType::Screen, Color::lightGray, { 3840, 2160 } } },
- MockMediaDevice { "SCREEN-2"_s, "Mock screen device 2"_s, MockDisplayProperties { CaptureDevice::DeviceType::Screen, Color::yellow, { 1920, 1080 } } },
+ MockMediaDevice { "SCREEN-1"_s, "Mock screen device 1"_s, MockDisplayProperties { CaptureDevice::DeviceType::Screen, Color::lightGray, { 1920, 1080 } } },
+ MockMediaDevice { "SCREEN-2"_s, "Mock screen device 2"_s, MockDisplayProperties { CaptureDevice::DeviceType::Screen, Color::yellow, { 3840, 2160 } } },
MockMediaDevice { "WINDOW-2"_s, "Mock window 1"_s, MockDisplayProperties { CaptureDevice::DeviceType::Screen, SRGBA<uint8_t> { 255, 241, 181 }, { 640, 480 } } },
MockMediaDevice { "WINDOW-2"_s, "Mock window 2"_s, MockDisplayProperties { CaptureDevice::DeviceType::Screen, SRGBA<uint8_t> { 255, 208, 181 }, { 1280, 600 } } },
@@ -120,12 +120,13 @@
explicit MockDisplayCapturer(const CaptureDevice&);
private:
- bool start(float) final;
+ bool start() final;
void stop() final { m_source->stop(); }
DisplayCaptureSourceMac::DisplayFrameType generateFrame() final;
RealtimeMediaSourceSettings::DisplaySurfaceType surfaceType() const final { return RealtimeMediaSourceSettings::DisplaySurfaceType::Monitor; }
- void commitConfiguration(float) final { }
+ void commitConfiguration(const RealtimeMediaSourceSettings&) final { }
CaptureDevice::DeviceType deviceType() const final { return CaptureDevice::DeviceType::Screen; }
+ IntSize intrinsicSize() const final;
#if !RELEASE_LOG_DISABLED
const char* logClassName() const final { return "MockDisplayCapturer"; }
#endif
@@ -138,7 +139,7 @@
{
}
-bool MockDisplayCapturer::start(float)
+bool MockDisplayCapturer::start()
{
m_source->start();
return true;
@@ -150,8 +151,23 @@
return imageBuffer->copyNativeImage();
return { };
}
-#endif
+IntSize MockDisplayCapturer::intrinsicSize() const
+{
+ auto device = MockRealtimeMediaSourceCenter::mockDeviceWithPersistentID(m_source->persistentID());
+ ASSERT(device);
+ if (!device)
+ return { };
+
+ ASSERT(device->isDisplay());
+ if (!device->isDisplay())
+ return { };
+
+ auto& properties = WTF::get<MockDisplayProperties>(device->properties);
+ return properties.defaultSize;
+}
+#endif // PLATFORM(MAC)
+
class MockRealtimeDisplaySourceFactory : public DisplayCaptureFactory {
public:
CaptureSourceOrError createDisplayCaptureSource(const CaptureDevice& device, const MediaConstraints* constraints) final