Changeset 281880 in webkit
- Timestamp:
- Sep 1, 2021 2:49:04 PM (11 months ago)
- Location:
- trunk
- Files:
-
- 2 added
- 13 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/fast/mediastream/get-display-media-capabilities-expected.txt (added)
-
LayoutTests/fast/mediastream/get-display-media-capabilities.html (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp (modified) (1 diff)
-
Source/WebCore/platform/mediastream/RealtimeMediaSource.h (modified) (1 diff)
-
Source/WebCore/platform/mediastream/mac/CGDisplayStreamCaptureSource.cpp (modified) (5 diffs)
-
Source/WebCore/platform/mediastream/mac/CGDisplayStreamCaptureSource.h (modified) (3 diffs)
-
Source/WebCore/platform/mediastream/mac/CGDisplayStreamScreenCaptureSource.h (modified) (2 diffs)
-
Source/WebCore/platform/mediastream/mac/CGDisplayStreamScreenCaptureSource.mm (modified) (3 diffs)
-
Source/WebCore/platform/mediastream/mac/CGWindowCaptureSource.h (modified) (1 diff)
-
Source/WebCore/platform/mediastream/mac/CGWindowCaptureSource.mm (modified) (1 diff)
-
Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceMac.cpp (modified) (3 diffs)
-
Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceMac.h (modified) (3 diffs)
-
Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r281876 r281880 1 2021-09-01 Eric Carlson <eric.carlson@apple.com> 2 3 [macOS] getDisplayMedia should capture at the constrained size if possible 4 https://bugs.webkit.org/show_bug.cgi?id=229357 5 <rdar://problem/82191109> 6 7 Reviewed by Youenn Fablet. 8 9 * fast/mediastream/get-display-media-capabilities-expected.txt: Added. 10 * fast/mediastream/get-display-media-capabilities.html: Added. 11 1 12 2021-09-01 Ayumi Kojima <ayumi_kojima@apple.com> 2 13 -
trunk/Source/WebCore/ChangeLog
r281879 r281880 1 2021-09-01 Eric Carlson <eric.carlson@apple.com> 2 3 [macOS] getDisplayMedia should capture at the constrained size if possible 4 https://bugs.webkit.org/show_bug.cgi?id=229357 5 <rdar://problem/82191109> 6 7 Reviewed by Youenn Fablet. 8 9 Create display stream with preferred width, height, and frame rate. 10 11 Test: fast/mediastream/get-display-media-capabilities.html 12 13 * platform/mediastream/mac/CGDisplayStreamCaptureSource.cpp: 14 (WebCore::CGDisplayStreamCaptureSource::start): Remove frame rate parameter. 15 (WebCore::CGDisplayStreamCaptureSource::startDisplayStream): Ditto. 16 (WebCore::CGDisplayStreamCaptureSource::commitConfiguration): Pass source settings 17 instead of frame rate. Release and recreate the display stream if width, height, 18 or frame rate has changed. 19 * platform/mediastream/mac/CGDisplayStreamCaptureSource.h: 20 (WebCore::CGDisplayStreamCaptureSource::width const): 21 (WebCore::CGDisplayStreamCaptureSource::height const): 22 (WebCore::CGDisplayStreamCaptureSource::frameRate const): 23 24 * platform/mediastream/mac/CGDisplayStreamScreenCaptureSource.h: 25 * platform/mediastream/mac/CGDisplayStreamScreenCaptureSource.mm: 26 (WebCore::CGDisplayStreamScreenCaptureSource::createDisplayStream): Remove 27 frame rate parameter. Create display stream with the configured width and height, 28 not the size of the screen. 29 (WebCore::CGDisplayStreamScreenCaptureSource::intrinsicSize const): Return screen 30 size so track capabilities are accurate. 31 32 * platform/mediastream/mac/CGWindowCaptureSource.h: 33 * platform/mediastream/mac/CGWindowCaptureSource.mm: 34 (WebCore::CGWindowCaptureSource::create): Remove frame rate parameter. 35 (WebCore::CGWindowCaptureSource::intrinsicSize const): Return window size. 36 37 * platform/mediastream/mac/DisplayCaptureSourceMac.cpp: 38 (WebCore::DisplayCaptureSourceMac::capabilities): Use capturer intrinsic size for 39 width and height capabilities. 40 41 * platform/mediastream/mac/DisplayCaptureSourceMac.h: 42 * platform/mock/MockRealtimeMediaSourceCenter.cpp: Change the mock screen sizes to 43 make the first one is different than the old hard-coded sizes so we're able to detect 44 that it is used in a test. 45 (WebCore::MockDisplayCapturer::start): Remove frame rate parameter. 46 (WebCore::MockDisplayCapturer::intrinsicSize const): 47 1 48 2021-09-01 Chris Dumez <cdumez@apple.com> 2 49 -
trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp
r279940 r281880 998 998 } 999 999 1000 constIntSize RealtimeMediaSource::intrinsicSize() const1000 IntSize RealtimeMediaSource::intrinsicSize() const 1001 1001 { 1002 1002 return m_intrinsicSize; -
trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h
r279940 r281880 150 150 void setSize(const IntSize&); 151 151 152 constIntSize intrinsicSize() const;152 IntSize intrinsicSize() const; 153 153 void setIntrinsicSize(const IntSize&, bool notifyObservers = true); 154 154 -
trunk/Source/WebCore/platform/mediastream/mac/CGDisplayStreamCaptureSource.cpp
r281852 r281880 49 49 } 50 50 51 bool CGDisplayStreamCaptureSource::start( float frameRate)51 bool CGDisplayStreamCaptureSource::start() 52 52 { 53 53 ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER); … … 56 56 return true; 57 57 58 return startDisplayStream( frameRate);58 return startDisplayStream(); 59 59 } 60 60 … … 77 77 } 78 78 79 bool CGDisplayStreamCaptureSource::startDisplayStream( float frameRate)79 bool CGDisplayStreamCaptureSource::startDisplayStream() 80 80 { 81 81 if (!checkDisplayStream()) … … 86 86 87 87 if (!m_displayStream) { 88 m_displayStream = createDisplayStream(frame Rate, frameAvailableHandler(), m_captureQueue.get());88 m_displayStream = createDisplayStream(frameAvailableHandler(), m_captureQueue.get()); 89 89 if (!m_displayStream) 90 90 return false; … … 106 106 } 107 107 108 void CGDisplayStreamCaptureSource::commitConfiguration( float frameRate)108 void CGDisplayStreamCaptureSource::commitConfiguration(const RealtimeMediaSourceSettings& settings) 109 109 { 110 if (m_isRunning && !m_displayStream) 111 startDisplayStream(frameRate); 110 if (m_width == settings.width() && m_height == settings.height() && m_frameRate == settings.frameRate()) 111 return; 112 113 m_width = settings.width(); 114 m_height = settings.height(); 115 m_frameRate = settings.frameRate(); 116 117 if (m_displayStream) { 118 CGDisplayStreamStop(m_displayStream.get()); 119 m_displayStream = nullptr; 120 } 121 122 if (m_isRunning) 123 startDisplayStream(); 112 124 } 113 125 -
trunk/Source/WebCore/platform/mediastream/mac/CGDisplayStreamCaptureSource.h
r281852 r281880 48 48 protected: 49 49 using FrameAvailableCallback = void (^)(CGDisplayStreamFrameStatus, uint64_t, IOSurfaceRef, CGDisplayStreamUpdateRef); 50 virtual RetainPtr<CGDisplayStreamRef> createDisplayStream( float,FrameAvailableCallback, dispatch_queue_t) = 0;50 virtual RetainPtr<CGDisplayStreamRef> createDisplayStream(FrameAvailableCallback, dispatch_queue_t) = 0; 51 51 virtual bool checkDisplayStream() { return true; } 52 52 … … 54 54 void invalidateDisplayStream() { m_displayStream = nullptr; } 55 55 56 uint32_t width() const { return m_width; } 57 uint32_t height() const { return m_height; } 58 float frameRate() const { return m_frameRate; } 59 56 60 private: 57 61 static void displayReconfigurationCallBack(CGDirectDisplayID, CGDisplayChangeSummaryFlags, void*); 58 62 59 63 // DisplayCaptureSourceMac::Capturer 60 bool start( float frameRate) final;64 bool start() final; 61 65 void stop() final; 62 66 DisplayCaptureSourceMac::DisplayFrameType generateFrame() final; 63 void commitConfiguration( float frameRate) final;67 void commitConfiguration(const RealtimeMediaSourceSettings&) final; 64 68 65 69 void displayWasReconfigured(CGDirectDisplayID, CGDisplayChangeSummaryFlags); 66 bool startDisplayStream( float frameRate);70 bool startDisplayStream(); 67 71 FrameAvailableCallback frameAvailableHandler(); 68 72 … … 106 110 BlockPtr<void(CGDisplayStreamFrameStatus, uint64_t, IOSurfaceRef, CGDisplayStreamUpdateRef)> m_frameAvailableHandler; 107 111 112 uint32_t m_width { 0 }; 113 uint32_t m_height { 0 }; 114 float m_frameRate { 0 }; 115 108 116 bool m_isRunning { false }; 109 117 bool m_observingDisplayChanges { false }; -
trunk/Source/WebCore/platform/mediastream/mac/CGDisplayStreamScreenCaptureSource.h
r281852 r281880 55 55 CaptureDevice::DeviceType deviceType() const final { return CaptureDevice::DeviceType::Screen; } 56 56 RealtimeMediaSourceSettings::DisplaySurfaceType surfaceType() const final { return RealtimeMediaSourceSettings::DisplaySurfaceType::Monitor; } 57 IntSize intrinsicSize() const final; 57 58 #if !RELEASE_LOG_DISABLED 58 59 const char* logClassName() const final { return "CGDisplayStreamScreenCaptureSource"; } … … 60 61 61 62 // CGDisplayStreamCaptureSource 62 RetainPtr<CGDisplayStreamRef> createDisplayStream( float,FrameAvailableCallback, dispatch_queue_t) final;63 RetainPtr<CGDisplayStreamRef> createDisplayStream(FrameAvailableCallback, dispatch_queue_t) final; 63 64 bool checkDisplayStream() final; 64 65 -
trunk/Source/WebCore/platform/mediastream/mac/CGDisplayStreamScreenCaptureSource.mm
r281852 r281880 112 112 } 113 113 114 RetainPtr<CGDisplayStreamRef> CGDisplayStreamScreenCaptureSource::createDisplayStream( float frameRate,FrameAvailableCallback frameAvailableHandler, dispatch_queue_t queue)114 RetainPtr<CGDisplayStreamRef> CGDisplayStreamScreenCaptureSource::createDisplayStream(FrameAvailableCallback frameAvailableHandler, dispatch_queue_t queue) 115 115 { 116 116 static const int screenQueueMaximumLength = 6; … … 119 119 ASSERT(m_displayID == updateDisplayID(m_displayID)); 120 120 121 ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER); 122 123 auto displayMode = adoptCF(CGDisplayCopyDisplayMode(m_displayID)); 124 auto screenWidth = CGDisplayModeGetPixelsWide(displayMode.get()); 125 auto screenHeight = CGDisplayModeGetPixelsHigh(displayMode.get()); 126 if (!screenWidth || !screenHeight) { 127 ERROR_LOG_IF(loggerPtr(), LOGIDENTIFIER, "unable to get screen width/height"); 128 return nullptr; 129 } 121 ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER, "frame rate ", frameRate(), ", size ", width(), "x", height()); 130 122 131 123 NSDictionary* streamOptions = @{ 132 (__bridge NSString *)kCGDisplayStreamMinimumFrameTime : @(1 / frameRate ),124 (__bridge NSString *)kCGDisplayStreamMinimumFrameTime : @(1 / frameRate()), 133 125 (__bridge NSString *)kCGDisplayStreamQueueDepth : @(screenQueueMaximumLength), 134 126 (__bridge NSString *)kCGDisplayStreamColorSpace : (__bridge id)sRGBColorSpaceRef(), … … 136 128 }; 137 129 138 return adoptCF(CGDisplayStreamCreateWithDispatchQueue(m_displayID, screenWidth, screenHeight, preferedPixelBufferFormat(), (__bridge CFDictionaryRef)streamOptions, queue, frameAvailableHandler)); 130 return adoptCF(CGDisplayStreamCreateWithDispatchQueue(m_displayID, width(), height(), preferedPixelBufferFormat(), (__bridge CFDictionaryRef)streamOptions, queue, frameAvailableHandler)); 131 } 132 133 IntSize CGDisplayStreamScreenCaptureSource::intrinsicSize() const 134 { 135 auto displayMode = adoptCF(CGDisplayCopyDisplayMode(m_displayID)); 136 auto screenWidth = CGDisplayModeGetPixelsWide(displayMode.get()); 137 auto screenHeight = CGDisplayModeGetPixelsHigh(displayMode.get()); 138 139 return { Checked<int>(screenWidth), Checked<int>(screenHeight) }; 139 140 } 140 141 -
trunk/Source/WebCore/platform/mediastream/mac/CGWindowCaptureSource.h
r281852 r281880 51 51 private: 52 52 // DisplayCaptureSourceMac::Capturer 53 bool start( float) final { return true; }53 bool start() final { return true; } 54 54 void stop() final { } 55 55 DisplayCaptureSourceMac::DisplayFrameType generateFrame() final; 56 56 RealtimeMediaSourceSettings::DisplaySurfaceType surfaceType() const final { return RealtimeMediaSourceSettings::DisplaySurfaceType::Window; } 57 57 CaptureDevice::DeviceType deviceType() const final { return CaptureDevice::DeviceType::Window; } 58 void commitConfiguration(float) final { } 58 void commitConfiguration(const RealtimeMediaSourceSettings&) final { } 59 IntSize intrinsicSize() const final; 59 60 const char* logClassName() const final { return "CGWindowCaptureSource"; } 60 61 -
trunk/Source/WebCore/platform/mediastream/mac/CGWindowCaptureSource.mm
r281852 r281880 104 104 Expected<UniqueRef<DisplayCaptureSourceMac::Capturer>, String> CGWindowCaptureSource::create(const String& deviceID) 105 105 { 106 auto displayID = parseInteger<uint32_t>(deviceID);107 if (! displayID)106 auto windowID = parseInteger<uint32_t>(deviceID); 107 if (!windowID) 108 108 return makeUnexpected("Invalid window device ID"_s); 109 109 110 auto windowInfo = windowDescription(* displayID);110 auto windowInfo = windowDescription(*windowID); 111 111 if (!windowInfo) 112 112 return makeUnexpected("Invalid window ID"_s); 113 113 114 return UniqueRef<DisplayCaptureSourceMac::Capturer>(makeUniqueRef<CGWindowCaptureSource>(*displayID)); 114 return UniqueRef<DisplayCaptureSourceMac::Capturer>(makeUniqueRef<CGWindowCaptureSource>(*windowID)); 115 } 116 117 IntSize CGWindowCaptureSource::intrinsicSize() const 118 { 119 auto windowInfo = windowDescription(m_windowID); 120 if (!windowInfo) { 121 RELEASE_LOG(WebRTC, "Invalid window ID?"); 122 return { }; 123 } 124 125 auto boundsDictionary = checked_cf_cast<CFDictionaryRef>(CFDictionaryGetValue(windowInfo.get(), kCGWindowBounds)); 126 if (!boundsDictionary) { 127 RELEASE_LOG(WebRTC, "Unable to get window bounds"); 128 return { }; 129 } 130 131 CGRect windowBounds; 132 if (!CGRectMakeWithDictionaryRepresentation(boundsDictionary, &windowBounds)) { 133 RELEASE_LOG(WebRTC, "Unable to decode window bounds"); 134 return { }; 135 } 136 137 return IntSize(windowBounds.size); 115 138 } 116 139 -
trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceMac.cpp
r281852 r281880 104 104 RealtimeMediaSourceCapabilities capabilities(settings().supportedConstraints()); 105 105 106 // FIXME: what should these be?107 capabilities.setWidth(CapabilityValueOrRange(1, 3840));108 capabilities.setHeight(CapabilityValueOrRange(1, 2160));106 auto intrinsicSize = m_capturer->intrinsicSize(); 107 capabilities.setWidth(CapabilityValueOrRange(1, intrinsicSize.width())); 108 capabilities.setHeight(CapabilityValueOrRange(1, intrinsicSize.height())); 109 109 capabilities.setFrameRate(CapabilityValueOrRange(.01, 30.0)); 110 110 … … 146 146 m_timer.startRepeating(1_s / frameRate()); 147 147 148 if (settings.containsAny({ RealtimeMediaSourceSettings::Flag::Width, RealtimeMediaSourceSettings::Flag::Height }))149 m_bufferAttributes = nullptr;150 151 148 m_currentSettings = { }; 152 149 } … … 157 154 m_timer.startRepeating(1_s / frameRate()); 158 155 159 if (!m_capturer->start( frameRate()))156 if (!m_capturer->start()) 160 157 captureFailed(); 161 158 } -
trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceMac.h
r281852 r281880 60 60 virtual ~Capturer() = default; 61 61 62 virtual bool start( float frameRate) = 0;62 virtual bool start() = 0; 63 63 virtual void stop() = 0; 64 64 virtual DisplayFrameType generateFrame() = 0; 65 65 virtual CaptureDevice::DeviceType deviceType() const = 0; 66 66 virtual RealtimeMediaSourceSettings::DisplaySurfaceType surfaceType() const = 0; 67 virtual void commitConfiguration(float frameRate) = 0; 67 virtual void commitConfiguration(const RealtimeMediaSourceSettings&) = 0; 68 virtual IntSize intrinsicSize() const = 0; 68 69 69 70 virtual void setLogger(const Logger&, const void*); … … 95 96 const RealtimeMediaSourceSettings& settings() final; 96 97 CaptureDevice::DeviceType deviceType() const { return m_capturer->deviceType(); } 97 void commitConfiguration() final { return m_capturer->commitConfiguration(frameRate()); }98 void commitConfiguration() final { m_capturer->commitConfiguration(settings()); } 98 99 99 100 const char* logClassName() const final { return "DisplayCaptureSourceMac"; } … … 109 110 Seconds m_elapsedTime { 0_s }; 110 111 111 RetainPtr<CFMutableDictionaryRef> m_bufferAttributes;112 112 RunLoop::Timer<DisplayCaptureSourceMac> m_timer; 113 113 -
trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp
r281852 r281880 92 92 } }, 93 93 94 MockMediaDevice { "SCREEN-1"_s, "Mock screen device 1"_s, MockDisplayProperties { CaptureDevice::DeviceType::Screen, Color::lightGray, { 3840, 2160 } } },95 MockMediaDevice { "SCREEN-2"_s, "Mock screen device 2"_s, MockDisplayProperties { CaptureDevice::DeviceType::Screen, Color::yellow, { 1920, 1080 } } },94 MockMediaDevice { "SCREEN-1"_s, "Mock screen device 1"_s, MockDisplayProperties { CaptureDevice::DeviceType::Screen, Color::lightGray, { 1920, 1080 } } }, 95 MockMediaDevice { "SCREEN-2"_s, "Mock screen device 2"_s, MockDisplayProperties { CaptureDevice::DeviceType::Screen, Color::yellow, { 3840, 2160 } } }, 96 96 97 97 MockMediaDevice { "WINDOW-2"_s, "Mock window 1"_s, MockDisplayProperties { CaptureDevice::DeviceType::Screen, SRGBA<uint8_t> { 255, 241, 181 }, { 640, 480 } } }, … … 121 121 122 122 private: 123 bool start( float) final;123 bool start() final; 124 124 void stop() final { m_source->stop(); } 125 125 DisplayCaptureSourceMac::DisplayFrameType generateFrame() final; 126 126 RealtimeMediaSourceSettings::DisplaySurfaceType surfaceType() const final { return RealtimeMediaSourceSettings::DisplaySurfaceType::Monitor; } 127 void commitConfiguration( float) final { }127 void commitConfiguration(const RealtimeMediaSourceSettings&) final { } 128 128 CaptureDevice::DeviceType deviceType() const final { return CaptureDevice::DeviceType::Screen; } 129 IntSize intrinsicSize() const final; 129 130 #if !RELEASE_LOG_DISABLED 130 131 const char* logClassName() const final { return "MockDisplayCapturer"; } … … 139 140 } 140 141 141 bool MockDisplayCapturer::start( float)142 bool MockDisplayCapturer::start() 142 143 { 143 144 m_source->start(); … … 151 152 return { }; 152 153 } 153 #endif 154 155 IntSize MockDisplayCapturer::intrinsicSize() const 156 { 157 auto device = MockRealtimeMediaSourceCenter::mockDeviceWithPersistentID(m_source->persistentID()); 158 ASSERT(device); 159 if (!device) 160 return { }; 161 162 ASSERT(device->isDisplay()); 163 if (!device->isDisplay()) 164 return { }; 165 166 auto& properties = WTF::get<MockDisplayProperties>(device->properties); 167 return properties.defaultSize; 168 } 169 #endif // PLATFORM(MAC) 154 170 155 171 class MockRealtimeDisplaySourceFactory : public DisplayCaptureFactory {
Note: See TracChangeset
for help on using the changeset viewer.