Title: [281880] trunk
Revision
281880
Author
[email protected]
Date
2021-09-01 14:49:04 -0700 (Wed, 01 Sep 2021)

Log Message

[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.

Source/WebCore:

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):

LayoutTests:

* fast/mediastream/get-display-media-capabilities-expected.txt: Added.
* fast/mediastream/get-display-media-capabilities.html: Added.

Modified Paths

Added Paths

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
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to