Changeset 260561 in webkit


Ignore:
Timestamp:
Apr 23, 2020 1:59:31 AM (4 years ago)
Author:
youenn@apple.com
Message:

getDisplayMedia is not respecting aspect ratio with max constraints
https://bugs.webkit.org/show_bug.cgi?id=210858

Reviewed by Eric Carlson.

Source/WebCore:

Add computation of exact frame size to respect aspect ratio in DisplayCaptureSourceCocoa::updateFrameSize.
Refactor code to have one source class DisplayCaptureSourceCocoa and specific capturer for screen and window.
This simplifies code and allows reusing DisplayCaptureSourceCocoa with a mock capturer.
Update mock code to use DisplayCaptureSourceCocoa.

Tests: fast/mediastream/getDisplayMedia-max-constraints.html

fast/mediastream/getDisplayMedia-max-constraints1.html
fast/mediastream/getDisplayMedia-max-constraints2.html
fast/mediastream/getDisplayMedia-max-constraints3.html

  • SourcesCocoa.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • platform/mediastream/mac/DisplayCaptureManagerCocoa.cpp:

(WebCore::DisplayCaptureManagerCocoa::updateDisplayCaptureDevices):
(WebCore::DisplayCaptureManagerCocoa::updateWindowCaptureDevices):
(WebCore::DisplayCaptureManagerCocoa::screenCaptureDeviceWithPersistentID):
(WebCore::DisplayCaptureManagerCocoa::windowCaptureDeviceWithPersistentID):

  • platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp:

(WebCore::DisplayCaptureSourceCocoa::create):
(WebCore::DisplayCaptureSourceCocoa::DisplayCaptureSourceCocoa):
(WebCore::DisplayCaptureSourceCocoa::~DisplayCaptureSourceCocoa):
(WebCore::DisplayCaptureSourceCocoa::capabilities):
(WebCore::DisplayCaptureSourceCocoa::settings):
(WebCore::DisplayCaptureSourceCocoa::startProducingData):
(WebCore::DisplayCaptureSourceCocoa::stopProducingData):
(WebCore::DisplayCaptureSourceCocoa::updateFrameSize):
(WebCore::DisplayCaptureSourceCocoa::emitFrame):
(WebCore::DisplayCaptureSourceCocoa::Capturer::setLogger):
(WebCore::DisplayCaptureSourceCocoa::Capturer::logChannel const):

  • platform/mediastream/mac/DisplayCaptureSourceCocoa.h:
  • platform/mediastream/mac/MockRealtimeVideoSourceMac.h:
  • platform/mediastream/mac/MockRealtimeVideoSourceMac.mm:

(WebCore::MockRealtimeVideoSourceMac::createForMockDisplayCapturer):

  • platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
  • platform/mediastream/mac/ScreenDisplayCapturerMac.h: Added.
  • platform/mediastream/mac/ScreenDisplayCapturerMac.mm: Added.

(WebCore::ScreenDisplayCapturerMac::create):
(WebCore::ScreenDisplayCapturerMac::ScreenDisplayCapturerMac):
(WebCore::ScreenDisplayCapturerMac::~ScreenDisplayCapturerMac):
(WebCore::ScreenDisplayCapturerMac::createDisplayStream):
(WebCore::ScreenDisplayCapturerMac::start):
(WebCore::ScreenDisplayCapturerMac::stop):
(WebCore::ScreenDisplayCapturerMac::generateFrame):
(WebCore::ScreenDisplayCapturerMac::startDisplayStream):
(WebCore::ScreenDisplayCapturerMac::commitConfiguration):
(WebCore::ScreenDisplayCapturerMac::displayWasReconfigured):
(WebCore::ScreenDisplayCapturerMac::displayReconfigurationCallBack):
(WebCore::ScreenDisplayCapturerMac::newFrame):
(WebCore::ScreenDisplayCapturerMac::screenCaptureDeviceWithPersistentID):
(WebCore::ScreenDisplayCapturerMac::screenCaptureDevices):

  • platform/mediastream/mac/WindowDisplayCapturerMac.h: Added.
  • platform/mediastream/mac/WindowDisplayCapturerMac.mm: ddedAdded.

(WebCore::WindowDisplayCapturerMac::create):
(WebCore::WindowDisplayCapturerMac::WindowDisplayCapturerMac):
(WebCore::WindowDisplayCapturerMac::windowImage):
(WebCore::WindowDisplayCapturerMac::generateFrame):
(WebCore::WindowDisplayCapturerMac::windowCaptureDeviceWithPersistentID):
(WebCore::WindowDisplayCapturerMac::windowCaptureDevices):

  • platform/mock/MockRealtimeMediaSourceCenter.cpp:

(WebCore::MockDisplayCapturer::MockDisplayCapturer):
(WebCore::MockDisplayCapturer::start):
(WebCore::MockDisplayCapturer::generateFrame):

  • platform/mock/MockRealtimeVideoSource.h:

(isType):

LayoutTests:

  • fast/mediastream/getDisplayMedia-max-constraints-expected.txt: Added.
  • fast/mediastream/getDisplayMedia-max-constraints.html: Added.
  • fast/mediastream/getDisplayMedia-max-constraints1-expected.txt: Added.
  • fast/mediastream/getDisplayMedia-max-constraints1.html: Added.
  • fast/mediastream/getDisplayMedia-max-constraints2-expected.txt: Added.
  • fast/mediastream/getDisplayMedia-max-constraints2.html: Added.
  • fast/mediastream/getDisplayMedia-max-constraints3-expected.txt: Added.
  • fast/mediastream/getDisplayMedia-max-constraints3.html: Added.
  • fast/mediastream/resources/getDisplayMedia-utils.js: Added.

(async callGetDisplayMedia):
(async waitForHeight):
(async waitForWidth):

  • platform/ios/TestExpectations:

Skip new tests as getDisplayMedia is not supported on iOS.

Location:
trunk
Files:
9 added
15 edited
4 moved

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r260559 r260561  
     12020-04-23  Youenn Fablet  <youenn@apple.com>
     2
     3        getDisplayMedia is not respecting aspect ratio with max constraints
     4        https://bugs.webkit.org/show_bug.cgi?id=210858
     5
     6        Reviewed by Eric Carlson.
     7
     8        * fast/mediastream/getDisplayMedia-max-constraints-expected.txt: Added.
     9        * fast/mediastream/getDisplayMedia-max-constraints.html: Added.
     10        * fast/mediastream/getDisplayMedia-max-constraints1-expected.txt: Added.
     11        * fast/mediastream/getDisplayMedia-max-constraints1.html: Added.
     12        * fast/mediastream/getDisplayMedia-max-constraints2-expected.txt: Added.
     13        * fast/mediastream/getDisplayMedia-max-constraints2.html: Added.
     14        * fast/mediastream/getDisplayMedia-max-constraints3-expected.txt: Added.
     15        * fast/mediastream/getDisplayMedia-max-constraints3.html: Added.
     16        * fast/mediastream/resources/getDisplayMedia-utils.js: Added.
     17        (async callGetDisplayMedia):
     18        (async waitForHeight):
     19        (async waitForWidth):
     20        * platform/ios/TestExpectations:
     21        Skip new tests as getDisplayMedia is not supported on iOS.
     22
    1232020-04-23  Diego Pino Garcia  <dpino@igalia.com>
    224
  • trunk/LayoutTests/fast/mediastream/constraint-intrinsic-size.html

    r253033 r260561  
    66        <script src="../../resources/testharness.js"></script>
    77        <script src="../../resources/testharnessreport.js"></script>
     8        <script src="resources/getDisplayMedia-utils.js"></script>
    89    </head>
    910    <body>
    1011
    1112        <script>
    12             if (window.internals)
    13                 window.internals.settings.setScreenCaptureEnabled(true);
    14 
    15             function callGetDisplayMedia(options)
    16             {
    17                 let promise;
    18                 window.internals.withUserGesture(() => {
    19                     promise = navigator.mediaDevices.getDisplayMedia(options);
    20                 });
    21                 return promise;
    22             }
    23 
    2413            let defaultWidth;
    2514            let defaultHeight;
  • trunk/LayoutTests/platform/ios/TestExpectations

    r260388 r260561  
    28962896# screen capture not supported on iOS.
    28972897fast/mediastream/screencapture-user-gesture.html [ Skip ]
     2898fast/mediastream/getDisplayMedia-max-constraints1.html [ Skip ]
     2899fast/mediastream/getDisplayMedia-max-constraints2.html [ Skip ]
     2900fast/mediastream/getDisplayMedia-max-constraints3.html [ Skip ]
    28982901
    28992902webkit.org/b/177401 webrtc/captureCanvas-webrtc.html [ Pass Timeout Failure ]
  • trunk/Source/WebCore/ChangeLog

    r260557 r260561  
     12020-04-23  Youenn Fablet  <youenn@apple.com>
     2
     3        getDisplayMedia is not respecting aspect ratio with max constraints
     4        https://bugs.webkit.org/show_bug.cgi?id=210858
     5
     6        Reviewed by Eric Carlson.
     7
     8        Add computation of exact frame size to respect aspect ratio in DisplayCaptureSourceCocoa::updateFrameSize.
     9        Refactor code to have one source class DisplayCaptureSourceCocoa and specific capturer for screen and window.
     10        This simplifies code and allows reusing DisplayCaptureSourceCocoa with a mock capturer.
     11        Update mock code to use DisplayCaptureSourceCocoa.
     12
     13        Tests: fast/mediastream/getDisplayMedia-max-constraints.html
     14               fast/mediastream/getDisplayMedia-max-constraints1.html
     15               fast/mediastream/getDisplayMedia-max-constraints2.html
     16               fast/mediastream/getDisplayMedia-max-constraints3.html
     17
     18        * SourcesCocoa.txt:
     19        * WebCore.xcodeproj/project.pbxproj:
     20        * platform/mediastream/mac/DisplayCaptureManagerCocoa.cpp:
     21        (WebCore::DisplayCaptureManagerCocoa::updateDisplayCaptureDevices):
     22        (WebCore::DisplayCaptureManagerCocoa::updateWindowCaptureDevices):
     23        (WebCore::DisplayCaptureManagerCocoa::screenCaptureDeviceWithPersistentID):
     24        (WebCore::DisplayCaptureManagerCocoa::windowCaptureDeviceWithPersistentID):
     25        * platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp:
     26        (WebCore::DisplayCaptureSourceCocoa::create):
     27        (WebCore::DisplayCaptureSourceCocoa::DisplayCaptureSourceCocoa):
     28        (WebCore::DisplayCaptureSourceCocoa::~DisplayCaptureSourceCocoa):
     29        (WebCore::DisplayCaptureSourceCocoa::capabilities):
     30        (WebCore::DisplayCaptureSourceCocoa::settings):
     31        (WebCore::DisplayCaptureSourceCocoa::startProducingData):
     32        (WebCore::DisplayCaptureSourceCocoa::stopProducingData):
     33        (WebCore::DisplayCaptureSourceCocoa::updateFrameSize):
     34        (WebCore::DisplayCaptureSourceCocoa::emitFrame):
     35        (WebCore::DisplayCaptureSourceCocoa::Capturer::setLogger):
     36        (WebCore::DisplayCaptureSourceCocoa::Capturer::logChannel const):
     37        * platform/mediastream/mac/DisplayCaptureSourceCocoa.h:
     38        * platform/mediastream/mac/MockRealtimeVideoSourceMac.h:
     39        * platform/mediastream/mac/MockRealtimeVideoSourceMac.mm:
     40        (WebCore::MockRealtimeVideoSourceMac::createForMockDisplayCapturer):
     41        * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
     42        * platform/mediastream/mac/ScreenDisplayCapturerMac.h: Added.
     43        * platform/mediastream/mac/ScreenDisplayCapturerMac.mm: Added.
     44        (WebCore::ScreenDisplayCapturerMac::create):
     45        (WebCore::ScreenDisplayCapturerMac::ScreenDisplayCapturerMac):
     46        (WebCore::ScreenDisplayCapturerMac::~ScreenDisplayCapturerMac):
     47        (WebCore::ScreenDisplayCapturerMac::createDisplayStream):
     48        (WebCore::ScreenDisplayCapturerMac::start):
     49        (WebCore::ScreenDisplayCapturerMac::stop):
     50        (WebCore::ScreenDisplayCapturerMac::generateFrame):
     51        (WebCore::ScreenDisplayCapturerMac::startDisplayStream):
     52        (WebCore::ScreenDisplayCapturerMac::commitConfiguration):
     53        (WebCore::ScreenDisplayCapturerMac::displayWasReconfigured):
     54        (WebCore::ScreenDisplayCapturerMac::displayReconfigurationCallBack):
     55        (WebCore::ScreenDisplayCapturerMac::newFrame):
     56        (WebCore::ScreenDisplayCapturerMac::screenCaptureDeviceWithPersistentID):
     57        (WebCore::ScreenDisplayCapturerMac::screenCaptureDevices):
     58        * platform/mediastream/mac/WindowDisplayCapturerMac.h: Added.
     59        * platform/mediastream/mac/WindowDisplayCapturerMac.mm: ddedAdded.
     60        (WebCore::WindowDisplayCapturerMac::create):
     61        (WebCore::WindowDisplayCapturerMac::WindowDisplayCapturerMac):
     62        (WebCore::WindowDisplayCapturerMac::windowImage):
     63        (WebCore::WindowDisplayCapturerMac::generateFrame):
     64        (WebCore::WindowDisplayCapturerMac::windowCaptureDeviceWithPersistentID):
     65        (WebCore::WindowDisplayCapturerMac::windowCaptureDevices):
     66        * platform/mock/MockRealtimeMediaSourceCenter.cpp:
     67        (WebCore::MockDisplayCapturer::MockDisplayCapturer):
     68        (WebCore::MockDisplayCapturer::start):
     69        (WebCore::MockDisplayCapturer::generateFrame):
     70        * platform/mock/MockRealtimeVideoSource.h:
     71        (isType):
     72
    1732020-04-22  Simon Fraser  <simon.fraser@apple.com>
    274
  • trunk/Source/WebCore/SourcesCocoa.txt

    r260102 r260561  
    571571platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.cpp
    572572platform/mediastream/mac/RealtimeVideoUtilities.mm
    573 platform/mediastream/mac/ScreenDisplayCaptureSourceMac.mm
    574 platform/mediastream/mac/WindowDisplayCaptureSourceMac.mm
     573platform/mediastream/mac/ScreenDisplayCapturerMac.mm
     574platform/mediastream/mac/WindowDisplayCapturerMac.mm
    575575
    576576platform/audio/mac/AudioSampleDataSource.mm
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r260505 r260561  
    216216                07CE77D516712A6A00C55A47 /* InbandTextTrackPrivateClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 07CE77D416712A6A00C55A47 /* InbandTextTrackPrivateClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
    217217                07D12F5C23DE543F0080997D /* ISOVTTCue.h in Headers */ = {isa = PBXBuildFile; fileRef = CD871C651FB52B6700F0B965 /* ISOVTTCue.h */; settings = {ATTRIBUTES = (Private, ); }; };
    218                 07D60928214C5BFD00E7396C /* WindowDisplayCaptureSourceMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 07D60926214C5BFC00E7396C /* WindowDisplayCaptureSourceMac.h */; };
    219218                07D637401BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.h in Headers */ = {isa = PBXBuildFile; fileRef = 07D6373E1BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.h */; settings = {ATTRIBUTES = (Private, ); }; };
    220219                07D6A4F41BED5F8800174146 /* MockRealtimeAudioSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 07D6A4F21BED5F8800174146 /* MockRealtimeAudioSource.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    54555454                0709D7941AE55A29004E42F8 /* WebMediaSessionManagerClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebMediaSessionManagerClient.h; sourceTree = "<group>"; };
    54565455                0709FC4D1025DEE30059CDBA /* AccessibilitySlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccessibilitySlider.h; sourceTree = "<group>"; };
    5457                 070A9F5E1FFECC70003DF649 /* ScreenDisplayCaptureSourceMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScreenDisplayCaptureSourceMac.h; sourceTree = "<group>"; };
    5458                 070A9F601FFECC71003DF649 /* ScreenDisplayCaptureSourceMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ScreenDisplayCaptureSourceMac.mm; sourceTree = "<group>"; };
    54595456                070DD8F50F01868000727DEB /* mediaControls.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mediaControls.css; sourceTree = "<group>"; };
    54605457                070E09181875ED93003A1D3C /* PlatformMediaSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlatformMediaSession.h; sourceTree = "<group>"; };
     
    56685665                07C8AD121D073D630087C5CE /* AVAssetMIMETypeCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AVAssetMIMETypeCache.h; sourceTree = "<group>"; };
    56695666                07CE77D416712A6A00C55A47 /* InbandTextTrackPrivateClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandTextTrackPrivateClient.h; sourceTree = "<group>"; };
    5670                 07D60924214C5BFB00E7396C /* WindowDisplayCaptureSourceMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WindowDisplayCaptureSourceMac.mm; sourceTree = "<group>"; };
    5671                 07D60926214C5BFC00E7396C /* WindowDisplayCaptureSourceMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowDisplayCaptureSourceMac.h; sourceTree = "<group>"; };
    56725667                07D6373E1BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebAudioSourceProviderAVFObjC.h; sourceTree = "<group>"; };
    56735668                07D6373F1BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebAudioSourceProviderAVFObjC.mm; sourceTree = "<group>"; };
     
    74507445                416E0B37209BC3C2004A95D9 /* FetchIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FetchIdentifier.h; sourceTree = "<group>"; };
    74517446                416E29A5102FA962007FC14E /* WorkerReportingProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerReportingProxy.h; sourceTree = "<group>"; };
     7447                416F807924509F3200B68F02 /* WindowDisplayCapturerMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowDisplayCapturerMac.h; sourceTree = "<group>"; };
     7448                416F807A24509F3200B68F02 /* ScreenDisplayCapturerMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ScreenDisplayCapturerMac.mm; sourceTree = "<group>"; };
     7449                416F807B24509F3300B68F02 /* WindowDisplayCapturerMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WindowDisplayCapturerMac.mm; sourceTree = "<group>"; };
     7450                416F807C24509F3300B68F02 /* ScreenDisplayCapturerMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScreenDisplayCapturerMac.h; sourceTree = "<group>"; };
    74527451                416FD25D240EE1AE006661D8 /* NowPlayingInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NowPlayingInfo.h; sourceTree = "<group>"; };
    74537452                4170A2E91D8C0CC000318452 /* JSDOMWrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDOMWrapper.cpp; sourceTree = "<group>"; };
     
    1654016539                                41D1938F2152C561006F14CA /* RealtimeVideoUtilities.h */,
    1654116540                                4158649F23BF7B9300A0A61E /* RealtimeVideoUtilities.mm */,
    16542                                 070A9F5E1FFECC70003DF649 /* ScreenDisplayCaptureSourceMac.h */,
    16543                                 070A9F601FFECC71003DF649 /* ScreenDisplayCaptureSourceMac.mm */,
     16541                                416F807C24509F3300B68F02 /* ScreenDisplayCapturerMac.h */,
     16542                                416F807A24509F3200B68F02 /* ScreenDisplayCapturerMac.mm */,
    1654416543                                07D6373E1BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.h */,
    1654516544                                07D6373F1BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.mm */,
    16546                                 07D60926214C5BFC00E7396C /* WindowDisplayCaptureSourceMac.h */,
    16547                                 07D60924214C5BFB00E7396C /* WindowDisplayCaptureSourceMac.mm */,
     16545                                416F807924509F3200B68F02 /* WindowDisplayCapturerMac.h */,
     16546                                416F807B24509F3300B68F02 /* WindowDisplayCapturerMac.mm */,
    1654816547                        );
    1654916548                        path = mac;
     
    3356833567                                939B02EF0EA2DBC400C54570 /* WidthIterator.h in Headers */,
    3356933568                                0F15ED5C1B7EC7C500EDDFEB /* WillChangeData.h in Headers */,
    33570                                 07D60928214C5BFD00E7396C /* WindowDisplayCaptureSourceMac.h in Headers */,
    3357133569                                9B27FC60234D9ADB00394A46 /* WindowEventLoop.h in Headers */,
    3357233570                                BC8243E90D0CFD7500460C8F /* WindowFeatures.h in Headers */,
  • trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceFactory.h

    r260013 r260561  
    9090};
    9191
    92 class DisplayCaptureFactory {
     92class DisplayCaptureFactory
     93#if PLATFORM(IOS_FAMILY)
     94    : public SingleSourceFactory
     95#endif
     96{
    9397public:
    9498    virtual ~DisplayCaptureFactory() = default;
  • trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureManagerCocoa.cpp

    r239840 r260561  
    3434
    3535#if PLATFORM(MAC)
    36 #include "ScreenDisplayCaptureSourceMac.h"
    37 #include "WindowDisplayCaptureSourceMac.h"
     36#include "ScreenDisplayCapturerMac.h"
     37#include "WindowDisplayCapturerMac.h"
    3838#include <CoreGraphics/CGDirectDisplay.h>
    3939#endif
     
    6262{
    6363#if PLATFORM(MAC)
    64     ScreenDisplayCaptureSourceMac::screenCaptureDevices(m_devices);
     64    ScreenDisplayCapturerMac::screenCaptureDevices(m_devices);
    6565#endif
    6666}
     
    6969{
    7070#if PLATFORM(MAC)
    71     WindowDisplayCaptureSourceMac::windowCaptureDevices(m_devices);
     71    WindowDisplayCapturerMac::windowCaptureDevices(m_devices);
    7272#endif
    7373}
     
    7676{
    7777#if PLATFORM(MAC)
    78     return ScreenDisplayCaptureSourceMac::screenCaptureDeviceWithPersistentID(deviceID);
     78    return ScreenDisplayCapturerMac::screenCaptureDeviceWithPersistentID(deviceID);
    7979#else
    8080    UNUSED_PARAM(deviceID);
     
    8686{
    8787#if PLATFORM(MAC)
    88     return WindowDisplayCaptureSourceMac::windowCaptureDeviceWithPersistentID(deviceID);
     88    return WindowDisplayCapturerMac::windowCaptureDeviceWithPersistentID(deviceID);
    8989#else
    9090    UNUSED_PARAM(deviceID);
  • trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp

    r253275 r260561  
    5454using namespace PAL;
    5555
    56 DisplayCaptureSourceCocoa::DisplayCaptureSourceCocoa(String&& name)
     56CaptureSourceOrError DisplayCaptureSourceCocoa::create(const CaptureDevice& device, const MediaConstraints* constraints)
     57{
     58#if PLATFORM(MAC)
     59    switch (device.type()) {
     60    case CaptureDevice::DeviceType::Screen:
     61        return create(ScreenDisplayCapturerMac::create(device.persistentId()), device, constraints);
     62    case CaptureDevice::DeviceType::Window:
     63        return create(WindowDisplayCapturerMac::create(device.persistentId()), device, constraints);
     64    case CaptureDevice::DeviceType::Microphone:
     65    case CaptureDevice::DeviceType::Camera:
     66    case CaptureDevice::DeviceType::Unknown:
     67        ASSERT_NOT_REACHED();
     68        break;
     69    }
     70#else
     71    UNUSED_PARAM(device);
     72    UNUSED_PARAM(constraints);
     73#endif
     74    return { };
     75}
     76
     77CaptureSourceOrError DisplayCaptureSourceCocoa::create(Expected<UniqueRef<Capturer>, String>&& capturer, const CaptureDevice& device, const MediaConstraints* constraints)
     78{
     79    if (!capturer.has_value())
     80        return CaptureSourceOrError { WTFMove(capturer.error()) };
     81
     82    auto source = adoptRef(*new DisplayCaptureSourceCocoa(WTFMove(capturer.value()), String { device.label() }));
     83    if (constraints) {
     84        auto result = source->applyConstraints(*constraints);
     85        if (result)
     86            return WTFMove(result.value().badConstraint);
     87    }
     88
     89    return CaptureSourceOrError(WTFMove(source));
     90}
     91
     92DisplayCaptureSourceCocoa::DisplayCaptureSourceCocoa(UniqueRef<Capturer>&& capturer, String&& name)
    5793    : RealtimeMediaSource(Type::Video, WTFMove(name))
     94    , m_capturer(WTFMove(capturer))
    5895    , m_timer(RunLoop::current(), this, &DisplayCaptureSourceCocoa::emitFrame)
    5996{
     
    63100{
    64101#if PLATFORM(IOS_FAMILY)
    65     RealtimeMediaSourceCenter::singleton().videoCaptureFactory().unsetActiveSource(*this);
     102    RealtimeMediaSourceCenter::singleton().displayCaptureFactory().unsetActiveSource(*this);
    66103#endif
    67104}
     
    73110
    74111        // FIXME: what should these be?
    75         capabilities.setWidth(CapabilityValueOrRange(72, 2880));
    76         capabilities.setHeight(CapabilityValueOrRange(45, 1800));
     112        capabilities.setWidth(CapabilityValueOrRange(1, 3840));
     113        capabilities.setHeight(CapabilityValueOrRange(1, 2160));
    77114        capabilities.setFrameRate(CapabilityValueOrRange(.01, 30.0));
    78115
     
    92129        settings.setHeight(size.height());
    93130
    94         settings.setDisplaySurface(surfaceType());
     131        settings.setDisplaySurface(m_capturer->surfaceType());
    95132        settings.setLogicalSurface(false);
    96133
     
    123160{
    124161#if PLATFORM(IOS_FAMILY)
    125     RealtimeMediaSourceCenter::singleton().videoCaptureFactory().setActiveSource(*this);
     162    RealtimeMediaSourceCenter::singleton().displayCaptureFactory().setActiveSource(*this);
    126163#endif
    127164
    128165    m_startTime = MonotonicTime::now();
    129166    m_timer.startRepeating(1_s / frameRate());
     167
     168    if (!m_capturer->start(frameRate()))
     169        captureFailed();
    130170}
    131171
     
    135175    m_elapsedTime += MonotonicTime::now() - m_startTime;
    136176    m_startTime = MonotonicTime::nan();
     177
     178    m_capturer->stop();
    137179}
    138180
     
    145187}
    146188
    147 IntSize DisplayCaptureSourceCocoa::frameSize() const
    148 {
    149     IntSize frameSize = size();
    150     if (frameSize.isEmpty())
    151         return intrinsicSize();
    152 
    153     return frameSize;
     189// We keep the aspect ratio of the intrinsic size for the frame size as getDisplayMedia allows max constraints only.
     190void DisplayCaptureSourceCocoa::updateFrameSize()
     191{
     192    auto intrinsicSize = this->intrinsicSize();
     193
     194    auto frameSize = size();
     195    if (!frameSize.height())
     196        frameSize.setHeight(intrinsicSize.height());
     197    if (!frameSize.width())
     198        frameSize.setWidth(intrinsicSize.width());
     199
     200    auto maxHeight = std::min(frameSize.height(), intrinsicSize.height());
     201    auto maxWidth = std::min(frameSize.width(), intrinsicSize.width());
     202
     203    auto heightForMaxWidth = maxWidth * intrinsicSize.height() / intrinsicSize.width();
     204    auto widthForMaxHeight = maxHeight * intrinsicSize.width() / intrinsicSize.height();
     205
     206    if (heightForMaxWidth <= maxHeight) {
     207        setSize({ maxWidth, heightForMaxWidth });
     208        return;
     209    }
     210    if (widthForMaxHeight <= maxWidth) {
     211        setSize({ widthForMaxHeight, maxHeight });
     212        return;
     213    }
     214    setSize(intrinsicSize);
    154215}
    155216
     
    165226    auto sampleTime = MediaTime::createWithDouble((elapsedTime() + 100_ms).seconds());
    166227
    167     auto frame = generateFrame();
     228    auto frame = m_capturer->generateFrame();
    168229    auto imageSize = WTF::switchOn(frame,
    169230        [](RetainPtr<IOSurfaceRef> surface) -> IntSize {
     
    185246        return;
    186247
    187     setIntrinsicSize(imageSize);
    188 
    189     auto mediaSampleSize = frameSize();
    190 
    191     RefPtr<MediaSample> sample = WTF::switchOn(frame,
    192         [this, sampleTime, mediaSampleSize](RetainPtr<IOSurfaceRef> surface) -> RefPtr<MediaSample> {
     248    if (intrinsicSize() != imageSize) {
     249        setIntrinsicSize(imageSize);
     250        updateFrameSize();
     251    }
     252
     253    auto sample = WTF::switchOn(frame,
     254        [this, sampleTime](RetainPtr<IOSurfaceRef> surface) -> RefPtr<MediaSample> {
    193255            if (!surface)
    194256                return nullptr;
    195257
    196             return m_imageTransferSession->createMediaSample(surface.get(), sampleTime, mediaSampleSize);
     258            return m_imageTransferSession->createMediaSample(surface.get(), sampleTime, size());
    197259        },
    198         [this, sampleTime, mediaSampleSize](RetainPtr<CGImageRef> image) -> RefPtr<MediaSample> {
     260        [this, sampleTime](RetainPtr<CGImageRef> image) -> RefPtr<MediaSample> {
    199261            if (!image)
    200262                return nullptr;
    201263
    202             return m_imageTransferSession->createMediaSample(image.get(), sampleTime, mediaSampleSize);
     264            return m_imageTransferSession->createMediaSample(image.get(), sampleTime, size());
    203265        }
    204266    );
     
    213275}
    214276
     277#if !RELEASE_LOG_DISABLED
     278void DisplayCaptureSourceCocoa::Capturer::setLogger(const Logger& newLogger, const void* newLogIdentifier)
     279{
     280    m_logger = &newLogger;
     281    m_logIdentifier = newLogIdentifier;
     282}
     283
     284WTFLogChannel& DisplayCaptureSourceCocoa::Capturer::logChannel() const
     285{
     286    return LogWebRTC;
     287}
     288#endif
     289
    215290} // namespace WebCore
    216291
  • trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.h

    r239427 r260561  
    3434#include <wtf/RefPtr.h>
    3535#include <wtf/RunLoop.h>
     36#include <wtf/UniqueRef.h>
    3637#include <wtf/text/WTFString.h>
    3738
     
    5051class PixelBufferConformerCV;
    5152
    52 class DisplayCaptureSourceCocoa : public RealtimeMediaSource {
     53class DisplayCaptureSourceCocoa final : public RealtimeMediaSource {
    5354public:
     55    using DisplayFrameType = WTF::Variant<RetainPtr<CGImageRef>, RetainPtr<IOSurfaceRef>>;
     56    class Capturer
     57#if !RELEASE_LOG_DISABLED
     58        : public LoggerHelper
     59#endif
     60    {
     61        WTF_MAKE_FAST_ALLOCATED;
     62    public:
     63        virtual ~Capturer() = default;
    5464
    55 protected:
    56     DisplayCaptureSourceCocoa(String&& name);
    57     virtual ~DisplayCaptureSourceCocoa();
     65        virtual bool start(float frameRate) = 0;
     66        virtual void stop() = 0;
     67        virtual DisplayFrameType generateFrame() = 0;
     68        virtual CaptureDevice::DeviceType deviceType() const = 0;
     69        virtual RealtimeMediaSourceSettings::DisplaySurfaceType surfaceType() const = 0;
     70        virtual void commitConfiguration(float frameRate) = 0;
    5871
    59     using DisplayFrameType = WTF::Variant<RetainPtr<CGImageRef>, RetainPtr<IOSurfaceRef>>;
    60     virtual DisplayFrameType generateFrame() = 0;
     72#if !RELEASE_LOG_DISABLED
     73        virtual void setLogger(const Logger&, const void*);
     74        const Logger* loggerPtr() const { return m_logger.get(); }
     75        const Logger& logger() const final { ASSERT(m_logger); return *m_logger.get(); }
     76        const void* logIdentifier() const final { return m_logIdentifier; }
     77        WTFLogChannel& logChannel() const final;
     78#endif
    6179
    62     virtual RealtimeMediaSourceSettings::DisplaySurfaceType surfaceType() const = 0;
     80    private:
     81#if !RELEASE_LOG_DISABLED
     82        RefPtr<const Logger> m_logger;
     83        const void* m_logIdentifier;
     84#endif
     85    };
    6386
    64     void startProducingData() override;
    65     void stopProducingData() override;
     87    static CaptureSourceOrError create(const CaptureDevice&, const MediaConstraints*);
     88    static CaptureSourceOrError create(Expected<UniqueRef<Capturer>, String>&&, const CaptureDevice&, const MediaConstraints*);
    6689
    6790    Seconds elapsedTime();
    68 
    69     void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) override;
    70 
    71     IntSize frameSize() const;
     91    void updateFrameSize();
    7292
    7393private:
     94    DisplayCaptureSourceCocoa(UniqueRef<Capturer>&&, String&& name);
     95    ~DisplayCaptureSourceCocoa();
    7496
     97    void startProducingData() final;
     98    void stopProducingData() final;
     99    void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) final;
    75100    bool isCaptureSource() const final { return true; }
    76 
    77101    const RealtimeMediaSourceCapabilities& capabilities() final;
    78102    const RealtimeMediaSourceSettings& settings() final;
     103    CaptureDevice::DeviceType deviceType() const { return m_capturer->deviceType(); }
     104    void commitConfiguration() final { return m_capturer->commitConfiguration(frameRate()); }
     105
     106#if !RELEASE_LOG_DISABLED
     107    const char* logClassName() const final { return "DisplayCaptureSourceCocoa"; }
     108#endif
    79109
    80110    void emitFrame();
    81111
     112    UniqueRef<Capturer> m_capturer;
    82113    Optional<RealtimeMediaSourceCapabilities> m_capabilities;
    83114    Optional<RealtimeMediaSourceSettings> m_currentSettings;
  • trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.h

    r247165 r260561  
    4747class MockRealtimeVideoSourceMac final : public MockRealtimeVideoSource {
    4848public:
    49     virtual ~MockRealtimeVideoSourceMac() = default;
     49    static Ref<MockRealtimeVideoSource> createForMockDisplayCapturer(String&& deviceID, String&& name, String&& hashSalt);
     50
     51    ~MockRealtimeVideoSourceMac() = default;
    5052
    5153private:
  • trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm

    r254259 r260561  
    7272}
    7373
     74Ref<MockRealtimeVideoSource> MockRealtimeVideoSourceMac::createForMockDisplayCapturer(String&& deviceID, String&& name, String&& hashSalt)
     75{
     76    return adoptRef(*new MockRealtimeVideoSourceMac(WTFMove(deviceID), WTFMove(name), WTFMove(hashSalt)));
     77}
     78
    7479MockRealtimeVideoSourceMac::MockRealtimeVideoSourceMac(String&& deviceID, String&& name, String&& hashSalt)
    7580    : MockRealtimeVideoSource(WTFMove(deviceID), WTFMove(name), WTFMove(hashSalt))
  • trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp

    r251041 r260561  
    3939#include "Logging.h"
    4040#include "MediaStreamPrivate.h"
    41 #include "ScreenDisplayCaptureSourceMac.h"
    42 #include "WindowDisplayCaptureSourceMac.h"
     41#include "ScreenDisplayCapturerMac.h"
     42#include "WindowDisplayCapturerMac.h"
    4343#include <wtf/MainThread.h>
    4444
     
    7373        UNUSED_PARAM(constraints);
    7474#endif
    75         switch (device.type()) {
    76         case CaptureDevice::DeviceType::Screen:
    7775#if PLATFORM(MAC)
    78             return ScreenDisplayCaptureSourceMac::create(String { device.persistentId() }, constraints);
     76        return DisplayCaptureSourceCocoa::create(device, constraints);
     77#else
     78        return { };
    7979#endif
    80         case CaptureDevice::DeviceType::Window:
    81 #if PLATFORM(MAC)
    82             return WindowDisplayCaptureSourceMac::create(String { device.persistentId() }, constraints);
    83 #endif
    84         case CaptureDevice::DeviceType::Microphone:
    85         case CaptureDevice::DeviceType::Camera:
    86         case CaptureDevice::DeviceType::Unknown:
    87             ASSERT_NOT_REACHED();
    88             break;
    89         }
    90 
    91         return { };
    9280    }
    9381private:
  • trunk/Source/WebCore/platform/mediastream/mac/ScreenDisplayCapturerMac.h

    r260560 r260561  
    4040namespace WebCore {
    4141
    42 class ScreenDisplayCaptureSourceMac : public DisplayCaptureSourceCocoa {
     42class ScreenDisplayCapturerMac final : public DisplayCaptureSourceCocoa::Capturer, public CanMakeWeakPtr<ScreenDisplayCapturerMac> {
    4343public:
    44     static CaptureSourceOrError create(String&&, const MediaConstraints*);
     44    static Expected<UniqueRef<DisplayCaptureSourceCocoa::Capturer>, String> create(const String&);
     45
     46    explicit ScreenDisplayCapturerMac(uint32_t);
     47    ~ScreenDisplayCapturerMac();
    4548
    4649    static Optional<CaptureDevice> screenCaptureDeviceWithPersistentID(const String&);
     
    4851
    4952private:
    50     ScreenDisplayCaptureSourceMac(uint32_t, String&&);
    51     virtual ~ScreenDisplayCaptureSourceMac();
    52 
    5353    static void displayReconfigurationCallBack(CGDirectDisplayID, CGDisplayChangeSummaryFlags, void*);
    5454
    55     void displayWasReconfigured(CGDirectDisplayID, CGDisplayChangeSummaryFlags);
    56 
     55    // DisplayCaptureSourceCocoa::Capturer
     56    bool start(float frameRate) final;
     57    void stop() final;
    5758    DisplayCaptureSourceCocoa::DisplayFrameType generateFrame() final;
    5859    RealtimeMediaSourceSettings::DisplaySurfaceType surfaceType() const final { return RealtimeMediaSourceSettings::DisplaySurfaceType::Monitor; }
     60    void commitConfiguration(float frameRate) final;
     61    CaptureDevice::DeviceType deviceType() const final { return CaptureDevice::DeviceType::Screen; }
     62#if !RELEASE_LOG_DISABLED
     63    const char* logClassName() const final { return "ScreenDisplayCapturerMac"; }
     64#endif
    5965
    60     void startProducingData() final;
    61     void stopProducingData() final;
    62     void commitConfiguration() final;
    63     CaptureDevice::DeviceType deviceType() const final { return CaptureDevice::DeviceType::Screen; }
    64 
    65     bool createDisplayStream();
    66     void startDisplayStream();
    67 
    68 #if !RELEASE_LOG_DISABLED
    69     const char* logClassName() const override { return "ScreenDisplayCaptureSourceMac"; }
    70 #endif
     66    void displayWasReconfigured(CGDirectDisplayID, CGDisplayChangeSummaryFlags);
     67    bool createDisplayStream(float frameRate);
     68    bool startDisplayStream(float frameRate);
    7169
    7270    class DisplaySurface {
  • trunk/Source/WebCore/platform/mediastream/mac/ScreenDisplayCapturerMac.mm

    r260560 r260561  
    2424 */
    2525
    26 #import "config.h"
    27 #import "ScreenDisplayCaptureSourceMac.h"
     26#include "config.h"
     27#include "ScreenDisplayCapturerMac.h"
    2828
    2929#if ENABLE(MEDIA_STREAM) && PLATFORM(MAC)
     
    5454    auto err = CGGetActiveDisplayList(0, nullptr, &displayCount);
    5555    if (err) {
    56         RELEASE_LOG(Media, "CGGetActiveDisplayList() returned error %d when trying to get display count", static_cast<int>(err));
     56        RELEASE_LOG(WebRTC, "CGGetActiveDisplayList() returned error %d when trying to get display count", static_cast<int>(err));
    5757        return WTF::nullopt;
    5858    }
    5959
    6060    if (!displayCount) {
    61         RELEASE_LOG(Media, "CGGetActiveDisplayList() returned a display count of 0");
     61        RELEASE_LOG(WebRTC, "CGGetActiveDisplayList() returned a display count of 0");
    6262        return WTF::nullopt;
    6363    }
     
    6666    err = CGGetActiveDisplayList(displayCount, activeDisplays.data(), &displayCount);
    6767    if (err) {
    68         RELEASE_LOG(Media, "CGGetActiveDisplayList() returned error %d when trying to get the active display list", static_cast<int>(err));
     68        RELEASE_LOG(WebRTC, "CGGetActiveDisplayList() returned error %d when trying to get the active display list", static_cast<int>(err));
    6969        return WTF::nullopt;
    7070    }
     
    7979}
    8080
    81 CaptureSourceOrError ScreenDisplayCaptureSourceMac::create(String&& deviceID, const MediaConstraints* constraints)
     81Expected<UniqueRef<DisplayCaptureSourceCocoa::Capturer>, String> ScreenDisplayCapturerMac::create(const String& deviceID)
    8282{
    8383    bool ok;
    8484    auto displayID = deviceID.toUIntStrict(&ok);
    85     if (!ok) {
    86         RELEASE_LOG(Media, "ScreenDisplayCaptureSourceMac::create: Display ID does not convert to 32-bit integer");
    87         return { };
    88     }
     85    if (!ok)
     86        return makeUnexpected("Invalid display device ID"_s);
    8987
    9088    auto actualDisplayID = updateDisplayID(displayID);
    9189    if (!actualDisplayID)
    92         return { };
    93 
    94     auto source = adoptRef(*new ScreenDisplayCaptureSourceMac(actualDisplayID.value(), "Screen"_s)); // FIXME: figure out what title to use
    95     if (constraints && source->applyConstraints(*constraints))
    96         return { };
    97 
    98     return CaptureSourceOrError(WTFMove(source));
    99 }
    100 
    101 ScreenDisplayCaptureSourceMac::ScreenDisplayCaptureSourceMac(uint32_t displayID, String&& title)
    102     : DisplayCaptureSourceCocoa(WTFMove(title))
    103     , m_displayID(displayID)
    104 {
    105 }
    106 
    107 ScreenDisplayCaptureSourceMac::~ScreenDisplayCaptureSourceMac()
     90        return makeUnexpected("Invalid display ID"_s);
     91
     92    return UniqueRef<DisplayCaptureSourceCocoa::Capturer>(makeUniqueRef<ScreenDisplayCapturerMac>(actualDisplayID.value()));
     93}
     94
     95ScreenDisplayCapturerMac::ScreenDisplayCapturerMac(uint32_t displayID)
     96    : m_displayID(displayID)
     97{
     98}
     99
     100ScreenDisplayCapturerMac::~ScreenDisplayCapturerMac()
    108101{
    109102    if (m_observingDisplayChanges)
     
    113106}
    114107
    115 bool ScreenDisplayCaptureSourceMac::createDisplayStream()
     108bool ScreenDisplayCapturerMac::createDisplayStream(float frameRate)
    116109{
    117110    static const int screenQueueMaximumLength = 6;
     
    122115    if (!actualDisplayID) {
    123116        ERROR_LOG_IF(loggerPtr(), LOGIDENTIFIER, "invalid display ID: ", m_displayID);
    124         captureFailed();
    125117        return false;
    126118    }
     
    138130        if (!screenWidth || !screenHeight) {
    139131            ERROR_LOG_IF(loggerPtr(), LOGIDENTIFIER, "unable to get screen width/height");
    140             captureFailed();
    141132            return false;
    142133        }
    143         setIntrinsicSize(IntSize(screenWidth, screenHeight));
    144134
    145135        if (!m_captureQueue)
    146             m_captureQueue = adoptOSObject(dispatch_queue_create("ScreenDisplayCaptureSourceMac Capture Queue", DISPATCH_QUEUE_SERIAL));
     136            m_captureQueue = adoptOSObject(dispatch_queue_create("ScreenDisplayCapturerMac Capture Queue", DISPATCH_QUEUE_SERIAL));
    147137
    148138        NSDictionary* streamOptions = @{
    149             (__bridge NSString *)kCGDisplayStreamMinimumFrameTime : @(1 / frameRate()),
     139            (__bridge NSString *)kCGDisplayStreamMinimumFrameTime : @(1 / frameRate),
    150140            (__bridge NSString *)kCGDisplayStreamQueueDepth : @(screenQueueMaximumLength),
    151141            (__bridge NSString *)kCGDisplayStreamColorSpace : (__bridge id)sRGBColorSpaceRef(),
     
    174164        if (!m_displayStream) {
    175165            ERROR_LOG_IF(loggerPtr(), LOGIDENTIFIER, "CGDisplayStreamCreate failed");
    176             captureFailed();
    177166            return false;
    178167        }
     
    187176}
    188177
    189 void ScreenDisplayCaptureSourceMac::startProducingData()
     178bool ScreenDisplayCapturerMac::start(float frameRate)
    190179{
    191180    ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER);
    192     DisplayCaptureSourceCocoa::startProducingData();
    193181
    194182    if (m_isRunning)
    195         return;
    196 
    197     startDisplayStream();
    198 }
    199 
    200 void ScreenDisplayCaptureSourceMac::stopProducingData()
     183        return true;
     184
     185    return startDisplayStream(frameRate);
     186}
     187
     188void ScreenDisplayCapturerMac::stop()
    201189{
    202190    ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER);
    203     DisplayCaptureSourceCocoa::stopProducingData();
    204191
    205192    if (!m_isRunning)
     
    212199}
    213200
    214 DisplayCaptureSourceCocoa::DisplayFrameType ScreenDisplayCaptureSourceMac::generateFrame()
     201DisplayCaptureSourceCocoa::DisplayFrameType ScreenDisplayCapturerMac::generateFrame()
    215202{
    216203    return DisplayCaptureSourceCocoa::DisplayFrameType { RetainPtr<IOSurfaceRef> { m_currentFrame.ioSurface() } };
    217204}
    218205
    219 void ScreenDisplayCaptureSourceMac::startDisplayStream()
     206bool ScreenDisplayCapturerMac::startDisplayStream(float frameRate)
    220207{
    221208    auto actualDisplayID = updateDisplayID(m_displayID);
    222209    if (!actualDisplayID)
    223         return;
     210        return false;
    224211
    225212    if (m_displayID != actualDisplayID.value()) {
     
    228215    }
    229216
    230     if (!m_displayStream && !createDisplayStream())
    231         return;
     217    if (!m_displayStream && !createDisplayStream(frameRate))
     218        return false;
    232219
    233220    auto err = CGDisplayStreamStart(m_displayStream.get());
    234221    if (err) {
    235222        ERROR_LOG_IF(loggerPtr(), LOGIDENTIFIER, "CGDisplayStreamStart failed with error ", static_cast<int>(err));
    236         captureFailed();
    237         return;
     223        return false;
    238224    }
    239225
    240226    m_isRunning = true;
    241 }
    242 
    243 void ScreenDisplayCaptureSourceMac::commitConfiguration()
     227    return true;
     228}
     229
     230void ScreenDisplayCapturerMac::commitConfiguration(float frameRate)
    244231{
    245232    if (m_isRunning && !m_displayStream)
    246         startDisplayStream();
    247 }
    248 
    249 void ScreenDisplayCaptureSourceMac::displayWasReconfigured(CGDirectDisplayID, CGDisplayChangeSummaryFlags)
     233        startDisplayStream(frameRate);
     234}
     235
     236void ScreenDisplayCapturerMac::displayWasReconfigured(CGDirectDisplayID, CGDisplayChangeSummaryFlags)
    250237{
    251238    // FIXME: implement!
    252239}
    253240
    254 void ScreenDisplayCaptureSourceMac::displayReconfigurationCallBack(CGDirectDisplayID display, CGDisplayChangeSummaryFlags flags, void *userInfo)
     241void ScreenDisplayCapturerMac::displayReconfigurationCallBack(CGDirectDisplayID display, CGDisplayChangeSummaryFlags flags, void *userInfo)
    255242{
    256243    if (userInfo)
    257         reinterpret_cast<ScreenDisplayCaptureSourceMac *>(userInfo)->displayWasReconfigured(display, flags);
    258 }
    259 
    260 void ScreenDisplayCaptureSourceMac::newFrame(CGDisplayStreamFrameStatus status, DisplaySurface&& newFrame)
     244        reinterpret_cast<ScreenDisplayCapturerMac *>(userInfo)->displayWasReconfigured(display, flags);
     245}
     246
     247void ScreenDisplayCapturerMac::newFrame(CGDisplayStreamFrameStatus status, DisplaySurface&& newFrame)
    261248{
    262249    switch (status) {
     
    268255
    269256    case kCGDisplayStreamFrameStatusFrameBlank:
    270         RELEASE_LOG(Media, "ScreenDisplayCaptureSourceMac::frameAvailable: kCGDisplayStreamFrameStatusFrameBlank");
     257        RELEASE_LOG(WebRTC, "ScreenDisplayCapturerMac::frameAvailable: kCGDisplayStreamFrameStatusFrameBlank");
    271258        break;
    272259
    273260    case kCGDisplayStreamFrameStatusStopped:
    274         RELEASE_LOG(Media, "ScreenDisplayCaptureSourceMac::frameAvailable: kCGDisplayStreamFrameStatusStopped");
     261        RELEASE_LOG(WebRTC, "ScreenDisplayCapturerMac::frameAvailable: kCGDisplayStreamFrameStatusStopped");
    275262        break;
    276263    }
     
    279266}
    280267
    281 Optional<CaptureDevice> ScreenDisplayCaptureSourceMac::screenCaptureDeviceWithPersistentID(const String& deviceID)
     268Optional<CaptureDevice> ScreenDisplayCapturerMac::screenCaptureDeviceWithPersistentID(const String& deviceID)
    282269{
    283270    bool ok;
    284271    auto displayID = deviceID.toUIntStrict(&ok);
    285272    if (!ok) {
    286         RELEASE_LOG(Media, "ScreenDisplayCaptureSourceMac::screenCaptureDeviceWithPersistentID: display ID does not convert to 32-bit integer");
     273        RELEASE_LOG(WebRTC, "ScreenDisplayCapturerMac::screenCaptureDeviceWithPersistentID: display ID does not convert to 32-bit integer");
    287274        return WTF::nullopt;
    288275    }
     
    298285}
    299286
    300 void ScreenDisplayCaptureSourceMac::screenCaptureDevices(Vector<CaptureDevice>& displays)
     287void ScreenDisplayCapturerMac::screenCaptureDevices(Vector<CaptureDevice>& displays)
    301288{
    302289    auto screenID = displayID([NSScreen mainScreen]);
     
    311298    auto err = CGGetActiveDisplayList(0, nullptr, &displayCount);
    312299    if (err) {
    313         RELEASE_LOG(Media, "CGGetActiveDisplayList() returned error %d when trying to get display count", (int)err);
     300        RELEASE_LOG(WebRTC, "CGGetActiveDisplayList() returned error %d when trying to get display count", (int)err);
    314301        return;
    315302    }
    316303
    317304    if (!displayCount) {
    318         RELEASE_LOG(Media, "CGGetActiveDisplayList() returned a display count of 0");
     305        RELEASE_LOG(WebRTC, "CGGetActiveDisplayList() returned a display count of 0");
    319306        return;
    320307    }
     
    323310    err = CGGetActiveDisplayList(displayCount, activeDisplays.data(), &displayCount);
    324311    if (err) {
    325         RELEASE_LOG(Media, "CGGetActiveDisplayList() returned error %d when trying to get the active display list", (int)err);
     312        RELEASE_LOG(WebRTC, "CGGetActiveDisplayList() returned error %d when trying to get the active display list", (int)err);
    326313        return;
    327314    }
  • trunk/Source/WebCore/platform/mediastream/mac/WindowDisplayCapturerMac.h

    r260560 r260561  
    3939class PixelBufferConformerCV;
    4040
    41 class WindowDisplayCaptureSourceMac : public DisplayCaptureSourceCocoa {
     41class WindowDisplayCapturerMac final : public DisplayCaptureSourceCocoa::Capturer {
    4242public:
    43     static CaptureSourceOrError create(String&&, const MediaConstraints*);
     43    static Expected<UniqueRef<DisplayCaptureSourceCocoa::Capturer>, String> create(const String&);
     44
     45    explicit WindowDisplayCapturerMac(uint32_t);
     46    virtual ~WindowDisplayCapturerMac() = default;
    4447
    4548    static Optional<CaptureDevice> windowCaptureDeviceWithPersistentID(const String&);
     
    4750
    4851private:
    49     WindowDisplayCaptureSourceMac(uint32_t, String&&);
    50     virtual ~WindowDisplayCaptureSourceMac() = default;
    51 
     52    // DisplayCaptureSourceCocoa::Capturer
     53    bool start(float) final { return true; }
     54    void stop() final { }
    5255    DisplayCaptureSourceCocoa::DisplayFrameType generateFrame() final;
    5356    RealtimeMediaSourceSettings::DisplaySurfaceType surfaceType() const final { return RealtimeMediaSourceSettings::DisplaySurfaceType::Window; }
    5457    CaptureDevice::DeviceType deviceType() const final { return CaptureDevice::DeviceType::Window; }
     58    void commitConfiguration(float) final { }
     59#if !RELEASE_LOG_DISABLED
     60    const char* logClassName() const final { return "WindowDisplayCapturerMac"; }
     61#endif
    5562
    5663    RetainPtr<CGImageRef> windowImage();
  • trunk/Source/WebCore/platform/mediastream/mac/WindowDisplayCapturerMac.mm

    r260560 r260561  
    2525
    2626#import "config.h"
    27 #import "WindowDisplayCaptureSourceMac.h"
     27#import "WindowDisplayCapturerMac.h"
    2828
    2929#if ENABLE(MEDIA_STREAM) && PLATFORM(MAC)
     
    3838#import "PlatformLayer.h"
    3939#import "RealtimeMediaSourceSettings.h"
    40 #import <pal/cf/CoreMediaSoftLink.h>
    4140#import <pal/spi/cg/CoreGraphicsSPI.h>
    4241#import <wtf/cf/TypeCastsCF.h>
    4342
     43#import <pal/cf/CoreMediaSoftLink.h>
    4444#import "CoreVideoSoftLink.h"
    4545
     
    5353    auto windows = adoptCF(CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID));
    5454    if (!windows) {
    55         RELEASE_LOG(Media, "CGWindowListCopyWindowInfo returned NULL");
     55        RELEASE_LOG(WebRTC, "CGWindowListCopyWindowInfo returned NULL");
    5656        return false;
    5757    }
     
    103103}
    104104
    105 CaptureSourceOrError WindowDisplayCaptureSourceMac::create(String&& windowID, const MediaConstraints* constraints)
     105Expected<UniqueRef<DisplayCaptureSourceCocoa::Capturer>, String> WindowDisplayCapturerMac::create(const String& deviceID)
    106106{
    107107    bool ok;
    108     auto actualID = windowID.toUIntStrict(&ok);
    109     if (!ok) {
    110         RELEASE_LOG(Media, "WindowDisplayCaptureSourceMac::create: window ID does not convert to 32-bit integer");
    111         return { };
    112     }
     108    auto displayID = deviceID.toUIntStrict(&ok);
     109    if (!ok)
     110        return makeUnexpected("Invalid window device ID"_s);
    113111
    114     auto windowInfo = windowDescription(actualID);
    115     if (!windowInfo) {
    116         RELEASE_LOG(Media, "WindowDisplayCaptureSourceMac::create: invalid window ID");
    117         return { };
    118     }
     112    auto windowInfo = windowDescription(displayID);
     113    if (!windowInfo)
     114        return makeUnexpected("Invalid window ID"_s);
    119115
    120     auto source = adoptRef(*new WindowDisplayCaptureSourceMac(actualID, checked_cf_cast<CFStringRef>(CFDictionaryGetValue(windowInfo.get(), kCGWindowName))));
    121     if (constraints && source->applyConstraints(*constraints))
    122         return { };
    123 
    124     return CaptureSourceOrError(WTFMove(source));
     116    return UniqueRef<DisplayCaptureSourceCocoa::Capturer>(makeUniqueRef<WindowDisplayCapturerMac>(displayID));
    125117}
    126118
    127 WindowDisplayCaptureSourceMac::WindowDisplayCaptureSourceMac(uint32_t windowID, String&& title)
    128     : DisplayCaptureSourceCocoa(WTFMove(title))
    129     , m_windowID(windowID)
     119WindowDisplayCapturerMac::WindowDisplayCapturerMac(uint32_t windowID)
     120    : m_windowID(windowID)
    130121{
    131122}
    132123
    133 RetainPtr<CGImageRef> WindowDisplayCaptureSourceMac::windowImage()
     124RetainPtr<CGImageRef> WindowDisplayCapturerMac::windowImage()
    134125{
    135126    auto image = adoptCF(CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, m_windowID, kCGWindowImageBoundsIgnoreFraming | kCGWindowImageShouldBeOpaque));
    136127    if (!image)
    137         RELEASE_LOG(Media, "WindowDisplayCaptureSourceMac::windowImage: failed to capture window image");
     128        RELEASE_LOG(WebRTC, "WindowDisplayCapturerMac::windowImage: failed to capture window image");
    138129
    139130    return image;
    140131}
    141132
    142 DisplayCaptureSourceCocoa::DisplayFrameType WindowDisplayCaptureSourceMac::generateFrame()
     133DisplayCaptureSourceCocoa::DisplayFrameType WindowDisplayCapturerMac::generateFrame()
    143134{
    144135    return DisplayCaptureSourceCocoa::DisplayFrameType { RetainPtr<CGImageRef> { windowImage() } };
    145136}
    146137
    147 Optional<CaptureDevice> WindowDisplayCaptureSourceMac::windowCaptureDeviceWithPersistentID(const String& idString)
     138Optional<CaptureDevice> WindowDisplayCapturerMac::windowCaptureDeviceWithPersistentID(const String& idString)
    148139{
    149140    bool ok;
    150141    auto windowID = idString.toUIntStrict(&ok);
    151142    if (!ok) {
    152         RELEASE_LOG(Media, "WindowDisplayCaptureSourceMac::windowCaptureDeviceWithPersistentID: window ID does not convert to 32-bit integer");
     143        RELEASE_LOG(WebRTC, "WindowDisplayCapturerMac::windowCaptureDeviceWithPersistentID: window ID does not convert to 32-bit integer");
    153144        return WTF::nullopt;
    154145    }
     
    163154
    164155    })) {
    165         RELEASE_LOG(Media, "WindowDisplayCaptureSourceMac::windowCaptureDeviceWithPersistentID: window ID is not valid");
     156        RELEASE_LOG(WebRTC, "WindowDisplayCapturerMac::windowCaptureDeviceWithPersistentID: window ID is not valid");
    166157        return WTF::nullopt;
    167158    }
     
    173164}
    174165
    175 void WindowDisplayCaptureSourceMac::windowCaptureDevices(Vector<CaptureDevice>& windows)
     166void WindowDisplayCapturerMac::windowCaptureDevices(Vector<CaptureDevice>& windows)
    176167{
    177168    anyOfCGWindow([&] (CFDictionaryRef, int id, const String& title) mutable {
  • trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp

    r260013 r260561  
    4444#if PLATFORM(COCOA)
    4545#include "CoreAudioCaptureSource.h"
     46#include "DisplayCaptureSourceCocoa.h"
     47#include "MockRealtimeVideoSourceMac.h"
    4648#endif
    4749
     
    111113};
    112114
     115#if PLATFORM(MAC)
     116class MockDisplayCapturer final : public DisplayCaptureSourceCocoa::Capturer {
     117public:
     118    explicit MockDisplayCapturer(const CaptureDevice&);
     119
     120private:
     121    bool start(float) final;
     122    void stop() final  { m_source->stop(); }
     123    DisplayCaptureSourceCocoa::DisplayFrameType generateFrame() final;
     124    RealtimeMediaSourceSettings::DisplaySurfaceType surfaceType() const final { return RealtimeMediaSourceSettings::DisplaySurfaceType::Monitor; }
     125    void commitConfiguration(float) final { }
     126    CaptureDevice::DeviceType deviceType() const final { return CaptureDevice::DeviceType::Screen; }
     127#if !RELEASE_LOG_DISABLED
     128    const char* logClassName() const final { return "MockDisplayCapturer"; }
     129#endif
     130   
     131    Ref<MockRealtimeVideoSource> m_source;
     132};
     133
     134MockDisplayCapturer::MockDisplayCapturer(const CaptureDevice& device)
     135    : m_source(MockRealtimeVideoSourceMac::createForMockDisplayCapturer(String { device.persistentId() }, String { device.label() }, String { }))
     136{
     137}
     138
     139bool MockDisplayCapturer::start(float)
     140{
     141    m_source->start();
     142    return true;
     143}
     144
     145DisplayCaptureSourceCocoa::DisplayFrameType MockDisplayCapturer::generateFrame()
     146{
     147    if (auto* imageBuffer = m_source->imageBuffer())
     148        return imageBuffer->copyNativeImage();
     149    return { };
     150}
     151#endif
     152
    113153class MockRealtimeDisplaySourceFactory : public DisplayCaptureFactory {
    114154public:
     
    116156    {
    117157        if (!MockRealtimeMediaSourceCenter::captureDeviceWithPersistentID(device.type(), device.persistentId()))
    118             return { "Unable to find mock  display device with given persistentID"_s };
     158            return { "Unable to find mock display device with given persistentID"_s };
    119159
    120160        switch (device.type()) {
    121161        case CaptureDevice::DeviceType::Screen:
    122162        case CaptureDevice::DeviceType::Window:
     163#if PLATFORM(MAC)
     164            return DisplayCaptureSourceCocoa::create(UniqueRef<DisplayCaptureSourceCocoa::Capturer>(makeUniqueRef<MockDisplayCapturer>(device)), device, constraints);
     165#else
    123166            return MockRealtimeVideoSource::create(String { device.persistentId() }, String { device.label() }, String { }, constraints);
     167#endif
    124168            break;
    125169        case CaptureDevice::DeviceType::Microphone:
  • trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h

    r253368 r260561  
    4949class MockRealtimeVideoSource : public RealtimeVideoCaptureSource, private OrientationNotifier::Observer {
    5050public:
     51    static CaptureSourceOrError create(String&& deviceID, String&& name, String&& hashSalt, const MediaConstraints*);
    5152
    52     static CaptureSourceOrError create(String&& deviceID, String&& name, String&& hashSalt, const MediaConstraints*);
     53    ImageBuffer* imageBuffer() const;
    5354
    5455protected:
     
    5859
    5960    void setCurrentFrame(MediaSample&);
    60     ImageBuffer* imageBuffer() const;
    6161
    6262    Seconds elapsedTime();
     
    126126} // namespace WebCore
    127127
     128SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::MockRealtimeVideoSource)
     129    static bool isType(const WebCore::RealtimeMediaSource& source) { return source.isCaptureSource() && source.isMockSource() && (source.deviceType() == WebCore::CaptureDevice::DeviceType::Camera || source.deviceType() == WebCore::CaptureDevice::DeviceType::Screen || source.deviceType() == WebCore::CaptureDevice::DeviceType::Window); }
     130SPECIALIZE_TYPE_TRAITS_END()
     131
    128132#endif // ENABLE(MEDIA_STREAM)
    129133
Note: See TracChangeset for help on using the changeset viewer.