⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 236494 in webkit


Ignore:
Timestamp:
Sep 25, 2018, 7:33:02 PM (8 years ago)
Author:
eric.carlson@apple.com
Message:

[MediaStream] Add Mac window capture source
https://bugs.webkit.org/show_bug.cgi?id=189958
<rdar://problem/44767616>

Reviewed by Youenn Fablet.

Source/WebCore:

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

(WebCore::DisplayCaptureManagerCocoa::captureDevices): Include window "devices".
(WebCore::DisplayCaptureManagerCocoa::updateWindowCaptureDevices): New.
(WebCore::DisplayCaptureManagerCocoa::windowCaptureDeviceWithPersistentID): New.
(WebCore::DisplayCaptureManagerCocoa::captureDeviceWithPersistentID): Include window devices.

  • platform/mediastream/mac/DisplayCaptureManagerCocoa.h:
  • platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp:

(WebCore::DisplayCaptureSourceCocoa::DisplayCaptureSourceCocoa):
(WebCore::DisplayCaptureSourceCocoa::settings): Use frameSize, report surface type and
logical surface.
(WebCore::DisplayCaptureSourceCocoa::settingsDidChange): Clear m_lastSampleBuffer when size changes.
(WebCore::DisplayCaptureSourceCocoa::frameSize const): New, return size() or intrinsic size.
(WebCore::DisplayCaptureSourceCocoa::setIntrinsicSize): New.
(WebCore::DisplayCaptureSourceCocoa::emitFrame): generateFrame now returns a CVPixelBuffer
so derived classes don't have to deal with resizing/transforming.

  • platform/mediastream/mac/DisplayCaptureSourceCocoa.h:
  • platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
  • platform/mediastream/mac/ScreenDisplayCaptureSourceMac.h:
  • platform/mediastream/mac/ScreenDisplayCaptureSourceMac.mm:

(WebCore::ScreenDisplayCaptureSourceMac::ScreenDisplayCaptureSourceMac): Add fixme.
(WebCore::ScreenDisplayCaptureSourceMac::createDisplayStream): Update intrinsic size when
width/height changes.
(WebCore::ScreenDisplayCaptureSourceMac::generateFrame): Return a CVPixelBuffer.

  • platform/mediastream/mac/WindowDisplayCaptureSourceMac.h: Added.
  • platform/mediastream/mac/WindowDisplayCaptureSourceMac.mm: Added.

(WebCore::anyOfCGWindow):
(WebCore::windowDescription):
(WebCore::WindowDisplayCaptureSourceMac::create):
(WebCore::WindowDisplayCaptureSourceMac::WindowDisplayCaptureSourceMac):
(WebCore::WindowDisplayCaptureSourceMac::windowImage):
(WebCore::WindowDisplayCaptureSourceMac::generateFrame):
(WebCore::WindowDisplayCaptureSourceMac::pixelBufferFromCGImage):
(WebCore::WindowDisplayCaptureSourceMac::windowCaptureDeviceWithPersistentID):
(WebCore::WindowDisplayCaptureSourceMac::windowCaptureDevices):

Source/WebKit:

  • UIProcess/UserMediaPermissionRequestManagerProxy.h:
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::beginMonitoringCaptureDevices): Sync with webcore prefs before listening
to device changes so we listen on the correct devices.

Location:
trunk/Source
Files:
2 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r236490 r236494  
     12018-09-25  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [MediaStream] Add Mac window capture source
     4        https://bugs.webkit.org/show_bug.cgi?id=189958
     5        <rdar://problem/44767616>
     6
     7        Reviewed by Youenn Fablet.
     8
     9        * SourcesCocoa.txt: Add WindowDisplayCaptureSourceMac.
     10        * WebCore.xcodeproj/project.pbxproj: Ditto.
     11
     12        * platform/mediastream/mac/DisplayCaptureManagerCocoa.cpp:
     13        (WebCore::DisplayCaptureManagerCocoa::captureDevices): Include window "devices".
     14        (WebCore::DisplayCaptureManagerCocoa::updateWindowCaptureDevices): New.
     15        (WebCore::DisplayCaptureManagerCocoa::windowCaptureDeviceWithPersistentID): New.
     16        (WebCore::DisplayCaptureManagerCocoa::captureDeviceWithPersistentID): Include window devices.
     17        * platform/mediastream/mac/DisplayCaptureManagerCocoa.h:
     18
     19        * platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp:
     20        (WebCore::DisplayCaptureSourceCocoa::DisplayCaptureSourceCocoa):
     21        (WebCore::DisplayCaptureSourceCocoa::settings): Use frameSize, report surface type and
     22        logical surface.
     23        (WebCore::DisplayCaptureSourceCocoa::settingsDidChange): Clear m_lastSampleBuffer when size changes.
     24        (WebCore::DisplayCaptureSourceCocoa::frameSize const): New, return size() or intrinsic size.
     25        (WebCore::DisplayCaptureSourceCocoa::setIntrinsicSize): New.
     26        (WebCore::DisplayCaptureSourceCocoa::emitFrame): generateFrame now returns a CVPixelBuffer
     27        so derived classes don't have to deal with resizing/transforming.
     28        * platform/mediastream/mac/DisplayCaptureSourceCocoa.h:
     29
     30        * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
     31
     32        * platform/mediastream/mac/ScreenDisplayCaptureSourceMac.h:
     33        * platform/mediastream/mac/ScreenDisplayCaptureSourceMac.mm:
     34        (WebCore::ScreenDisplayCaptureSourceMac::ScreenDisplayCaptureSourceMac): Add fixme.
     35        (WebCore::ScreenDisplayCaptureSourceMac::createDisplayStream): Update intrinsic size when
     36        width/height changes.
     37        (WebCore::ScreenDisplayCaptureSourceMac::generateFrame): Return a CVPixelBuffer.
     38
     39        * platform/mediastream/mac/WindowDisplayCaptureSourceMac.h: Added.
     40        * platform/mediastream/mac/WindowDisplayCaptureSourceMac.mm: Added.
     41        (WebCore::anyOfCGWindow):
     42        (WebCore::windowDescription):
     43        (WebCore::WindowDisplayCaptureSourceMac::create):
     44        (WebCore::WindowDisplayCaptureSourceMac::WindowDisplayCaptureSourceMac):
     45        (WebCore::WindowDisplayCaptureSourceMac::windowImage):
     46        (WebCore::WindowDisplayCaptureSourceMac::generateFrame):
     47        (WebCore::WindowDisplayCaptureSourceMac::pixelBufferFromCGImage):
     48        (WebCore::WindowDisplayCaptureSourceMac::windowCaptureDeviceWithPersistentID):
     49        (WebCore::WindowDisplayCaptureSourceMac::windowCaptureDevices):
     50
    1512018-09-25  Justin Fan  <justin_fan@apple.com>
    252
  • trunk/Source/WebCore/SourcesCocoa.txt

    r236481 r236494  
    553553platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.cpp
    554554platform/mediastream/mac/ScreenDisplayCaptureSourceMac.mm
     555platform/mediastream/mac/WindowDisplayCaptureSourceMac.mm
    555556
    556557platform/audio/mac/AudioSampleDataSource.mm
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r236481 r236494  
    205205                07C1C0E51BFB60ED00BD2256 /* RealtimeMediaSourceSupportedConstraints.h in Headers */ = {isa = PBXBuildFile; fileRef = 07C1C0E41BFB60ED00BD2256 /* RealtimeMediaSourceSupportedConstraints.h */; settings = {ATTRIBUTES = (Private, ); }; };
    206206                07CE77D516712A6A00C55A47 /* InbandTextTrackPrivateClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 07CE77D416712A6A00C55A47 /* InbandTextTrackPrivateClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
     207                07D60928214C5BFD00E7396C /* WindowDisplayCaptureSourceMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 07D60926214C5BFC00E7396C /* WindowDisplayCaptureSourceMac.h */; };
    207208                07D637401BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.h in Headers */ = {isa = PBXBuildFile; fileRef = 07D6373E1BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.h */; settings = {ATTRIBUTES = (Private, ); }; };
    208209                07D6A4F41BED5F8800174146 /* MockRealtimeAudioSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 07D6A4F21BED5F8800174146 /* MockRealtimeAudioSource.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    54445445                07C8AD121D073D630087C5CE /* AVFoundationMIMETypeCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AVFoundationMIMETypeCache.h; sourceTree = "<group>"; };
    54455446                07CE77D416712A6A00C55A47 /* InbandTextTrackPrivateClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandTextTrackPrivateClient.h; sourceTree = "<group>"; };
     5447                07D60924214C5BFB00E7396C /* WindowDisplayCaptureSourceMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WindowDisplayCaptureSourceMac.mm; sourceTree = "<group>"; };
     5448                07D60926214C5BFC00E7396C /* WindowDisplayCaptureSourceMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowDisplayCaptureSourceMac.h; sourceTree = "<group>"; };
    54465449                07D6373E1BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebAudioSourceProviderAVFObjC.h; sourceTree = "<group>"; };
    54475450                07D6373F1BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebAudioSourceProviderAVFObjC.mm; sourceTree = "<group>"; };
     
    1538915392                                07D6373E1BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.h */,
    1539015393                                07D6373F1BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.mm */,
     15394                                07D60926214C5BFC00E7396C /* WindowDisplayCaptureSourceMac.h */,
     15395                                07D60924214C5BFB00E7396C /* WindowDisplayCaptureSourceMac.mm */,
    1539115396                        );
    1539215397                        path = mac;
     
    3111631121                                939B02EF0EA2DBC400C54570 /* WidthIterator.h in Headers */,
    3111731122                                0F15ED5C1B7EC7C500EDDFEB /* WillChangeData.h in Headers */,
     31123                                07D60928214C5BFD00E7396C /* WindowDisplayCaptureSourceMac.h in Headers */,
    3111831124                                BC8243E90D0CFD7500460C8F /* WindowFeatures.h in Headers */,
    3111931125                                7E99AF530B13846468FB01A5 /* WindowFocusAllowedIndicator.h in Headers */,
  • trunk/Source/WebCore/platform/graphics/cv/PixelBufferResizer.mm

    r236432 r236494  
    6969RetainPtr<CVPixelBufferRef> PixelBufferResizer::resize(CVPixelBufferRef inputBuffer)
    7070{
     71    ASSERT(m_bufferPool && !m_size.isEmpty());
     72    if (!m_bufferPool || m_size.isEmpty())
     73        return nullptr;
     74
    7175    RetainPtr<CVPixelBufferRef> result;
    7276    CVPixelBufferRef outputBuffer = nullptr;
  • trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureManagerCocoa.cpp

    r235521 r236494  
    2929#if ENABLE(MEDIA_STREAM)
    3030
    31 #include "CoreVideoSoftLink.h"
    3231#include "Logging.h"
    3332#include <wtf/Algorithms.h>
     
    3635#if PLATFORM(MAC)
    3736#include "ScreenDisplayCaptureSourceMac.h"
     37#include "WindowDisplayCaptureSourceMac.h"
    3838#include <CoreGraphics/CGDirectDisplay.h>
    3939#endif
     40
     41#include "CoreVideoSoftLink.h"
    4042
    4143namespace WebCore {
     
    5153    m_devices.clear();
    5254
     55    updateWindowCaptureDevices();
    5356    updateDisplayCaptureDevices();
    5457
     
    6063#if PLATFORM(MAC)
    6164    ScreenDisplayCaptureSourceMac::screenCaptureDevices(m_devices);
     65#endif
     66}
     67
     68void DisplayCaptureManagerCocoa::updateWindowCaptureDevices()
     69{
     70#if PLATFORM(MAC)
     71    WindowDisplayCaptureSourceMac::windowCaptureDevices(m_devices);
    6272#endif
    6373}
     
    7383}
    7484
     85std::optional<CaptureDevice> DisplayCaptureManagerCocoa::windowCaptureDeviceWithPersistentID(const String& deviceID)
     86{
     87#if PLATFORM(MAC)
     88    return WindowDisplayCaptureSourceMac::windowCaptureDeviceWithPersistentID(deviceID);
     89#else
     90    UNUSED_PARAM(deviceID);
     91    return std::nullopt;
     92#endif
     93}
     94
    7595std::optional<CaptureDevice> DisplayCaptureManagerCocoa::captureDeviceWithPersistentID(CaptureDevice::DeviceType type, const String& id)
    7696{
     
    7999        return screenCaptureDeviceWithPersistentID(id);
    80100        break;
    81            
     101
     102    case CaptureDevice::DeviceType::Window:
     103        return windowCaptureDeviceWithPersistentID(id);
     104        break;
     105
    82106    case CaptureDevice::DeviceType::Application:
    83     case CaptureDevice::DeviceType::Window:
    84107    case CaptureDevice::DeviceType::Browser:
    85108        break;
  • trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureManagerCocoa.h

    r234146 r236494  
    4242
    4343    void updateDisplayCaptureDevices();
     44    void updateWindowCaptureDevices();
    4445
    4546    const Vector<CaptureDevice>& captureDevices() final;
     
    4748    std::optional<CaptureDevice> captureDeviceWithPersistentID(CaptureDevice::DeviceType, const String&) final;
    4849    std::optional<CaptureDevice> screenCaptureDeviceWithPersistentID(const String&);
     50    std::optional<CaptureDevice> windowCaptureDeviceWithPersistentID(const String&);
    4951
    5052    Vector<CaptureDevice> m_devices;
  • trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp

    r236015 r236494  
    3030
    3131#include "Logging.h"
     32#include "MediaSampleAVFObjC.h"
     33#include "PixelBufferConformerCV.h"
     34#include "PixelBufferResizer.h"
    3235#include "RealtimeMediaSource.h"
    3336#include "RealtimeMediaSourceCenter.h"
    3437#include "RealtimeMediaSourceSettings.h"
     38#include "RealtimeVideoUtilities.h"
    3539#include "Timer.h"
    3640#include <CoreMedia/CMSync.h>
     
    4852using namespace PAL;
    4953
    50 DisplayCaptureSourceCocoa::DisplayCaptureSourceCocoa(const String& name)
    51     : RealtimeMediaSource("", Type::Video, name)
     54DisplayCaptureSourceCocoa::DisplayCaptureSourceCocoa(String&& name)
     55    : RealtimeMediaSource("", Type::Video, WTFMove(name))
    5256    , m_timer(RunLoop::current(), this, &DisplayCaptureSourceCocoa::emitFrame)
    5357{
     
    8185        RealtimeMediaSourceSettings settings;
    8286        settings.setFrameRate(frameRate());
    83         auto size = this->size();
    84         if (size.width() && size.height()) {
     87        auto size = frameSize();
     88        if (!size.isEmpty()) {
    8589            settings.setWidth(size.width());
    8690            settings.setHeight(size.height());
    8791        }
     92        settings.setDisplaySurface(surfaceType());
     93        settings.setLogicalSurface(false);
    8894
    8995        RealtimeMediaSourceSupportedConstraints supportedConstraints;
     
    9197        supportedConstraints.setSupportsWidth(true);
    9298        supportedConstraints.setSupportsHeight(true);
    93         supportedConstraints.setSupportsAspectRatio(true);
     99        supportedConstraints.setSupportsDisplaySurface(true);
     100        supportedConstraints.setSupportsLogicalSurface(true);
     101
    94102        settings.setSupportedConstraints(supportedConstraints);
    95103
     
    104112        m_timer.startRepeating(1_s / frameRate());
    105113
    106     if (settings.containsAny({ RealtimeMediaSourceSettings::Flag::Width, RealtimeMediaSourceSettings::Flag::Height }))
     114    if (settings.containsAny({ RealtimeMediaSourceSettings::Flag::Width, RealtimeMediaSourceSettings::Flag::Height })) {
    107115        m_bufferAttributes = nullptr;
    108 
    109     m_currentSettings = std::nullopt;
     116        m_lastSampleBuffer = nullptr;
     117    }
     118
     119    m_currentSettings = { };
    110120
    111121    RealtimeMediaSource::settingsDidChange(settings);
     
    137147}
    138148
     149IntSize DisplayCaptureSourceCocoa::frameSize() const
     150{
     151    IntSize frameSize = size();
     152    if (frameSize.isEmpty())
     153        frameSize = m_intrinsicSize;
     154
     155    return frameSize;
     156}
     157
     158void DisplayCaptureSourceCocoa::setIntrinsicSize(const IntSize& size)
     159{
     160    if (m_intrinsicSize == size)
     161        return;
     162
     163    m_intrinsicSize = size;
     164    m_lastSampleBuffer = nullptr;
     165}
     166
    139167void DisplayCaptureSourceCocoa::emitFrame()
    140168{
     
    142170        return;
    143171
    144     generateFrame();
     172    auto pixelBuffer = generateFrame();
     173    if (!pixelBuffer)
     174        return;
     175
     176    if (m_lastSampleBuffer && m_lastFullSizedPixelBuffer && CFEqual(m_lastFullSizedPixelBuffer.get(), pixelBuffer.get())) {
     177        videoSampleAvailable(MediaSampleAVFObjC::create(m_lastSampleBuffer.get()));
     178        return;
     179    }
     180
     181    m_lastFullSizedPixelBuffer = pixelBuffer;
     182
     183    int width = WTF::safeCast<int>(CVPixelBufferGetWidth(pixelBuffer.get()));
     184    int height = WTF::safeCast<int>(CVPixelBufferGetHeight(pixelBuffer.get()));
     185    auto requestedSize = frameSize();
     186    if (width != requestedSize.width() || height != requestedSize.height()) {
     187        if (m_pixelBufferResizer && !m_pixelBufferResizer->canResizeTo(requestedSize))
     188            m_pixelBufferResizer = nullptr;
     189
     190        if (!m_pixelBufferResizer)
     191            m_pixelBufferResizer = std::make_unique<PixelBufferResizer>(requestedSize, preferedPixelBufferFormat());
     192
     193        pixelBuffer = m_pixelBufferResizer->resize(pixelBuffer.get());
     194    } else {
     195        m_pixelBufferResizer = nullptr;
     196
     197        auto pixelFormatType = CVPixelBufferGetPixelFormatType(pixelBuffer.get());
     198        if (pixelFormatType != preferedPixelBufferFormat()) {
     199            if (!m_pixelBufferConformer) {
     200                auto preferredFromat = preferedPixelBufferFormat();
     201                auto conformerAttributes = adoptCF(CFDictionaryCreateMutable(nullptr, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
     202                auto videoType = adoptCF(CFNumberCreate(nullptr,  kCFNumberSInt32Type,  &preferredFromat));
     203                CFDictionarySetValue(conformerAttributes.get(), kCVPixelBufferPixelFormatTypeKey, videoType.get());
     204
     205                m_pixelBufferConformer = std::make_unique<PixelBufferConformerCV>(conformerAttributes.get());
     206            }
     207
     208            pixelBuffer = m_pixelBufferConformer->convert(pixelBuffer.get());
     209        }
     210    }
     211    if (!pixelBuffer)
     212        return;
     213
     214    m_lastSampleBuffer = sampleBufferFromPixelBuffer(pixelBuffer.get());
     215    if (!m_lastSampleBuffer)
     216        return;
     217
     218    videoSampleAvailable(MediaSampleAVFObjC::create(m_lastSampleBuffer.get()));
    145219}
    146220
  • trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.h

    r236015 r236494  
    4545
    4646class CaptureDeviceInfo;
     47class PixelBufferConformerCV;
     48class PixelBufferResizer;
    4749
    4850class DisplayCaptureSourceCocoa : public RealtimeMediaSource {
     
    5052
    5153protected:
    52     DisplayCaptureSourceCocoa(const String& name);
     54    DisplayCaptureSourceCocoa(String&&);
    5355    virtual ~DisplayCaptureSourceCocoa();
    5456
    55     virtual void generateFrame() = 0;
     57    virtual RetainPtr<CVPixelBufferRef> generateFrame() = 0;
     58    virtual RealtimeMediaSourceSettings::DisplaySurfaceType surfaceType() const = 0;
     59
    5660    void startProducingData() override;
    5761    void stopProducingData() override;
     
    6670    void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) override;
    6771
     72    const IntSize& intrinsicSize() const { return m_intrinsicSize; }
     73    void setIntrinsicSize(const IntSize&);
     74    IntSize frameSize() const;
     75
    6876private:
    6977
     
    7583    void emitFrame();
    7684
     85    IntSize m_intrinsicSize;
    7786    std::optional<RealtimeMediaSourceCapabilities> m_capabilities;
    7887    std::optional<RealtimeMediaSourceSettings> m_currentSettings;
     
    8493    RetainPtr<CFMutableDictionaryRef> m_bufferAttributes;
    8594    RunLoop::Timer<DisplayCaptureSourceCocoa> m_timer;
     95
     96    std::unique_ptr<PixelBufferResizer> m_pixelBufferResizer;
     97    std::unique_ptr<PixelBufferConformerCV> m_pixelBufferConformer;
     98    RetainPtr<CVPixelBufferRef> m_lastFullSizedPixelBuffer;
     99    RetainPtr<CMSampleBufferRef> m_lastSampleBuffer;
    86100};
    87101
  • trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp

    r226468 r236494  
    5959#if PLATFORM(MAC)
    6060            return ScreenDisplayCaptureSourceMac::create(device.persistentId(), constraints);
    61             break;
     61#endif
     62        case CaptureDevice::DeviceType::Window:
     63#if PLATFORM(MAC)
     64            return WindowDisplayCaptureSourceMac::create(device.persistentId(), constraints);
    6265#endif
    6366        case CaptureDevice::DeviceType::Application:
    64         case CaptureDevice::DeviceType::Window:
    6567        case CaptureDevice::DeviceType::Browser:
    6668        case CaptureDevice::DeviceType::Microphone:
  • trunk/Source/WebCore/platform/mediastream/mac/ScreenDisplayCaptureSourceMac.h

    r235670 r236494  
    5757    void frameAvailable(CGDisplayStreamFrameStatus, uint64_t, IOSurfaceRef, CGDisplayStreamUpdateRef);
    5858
    59     void generateFrame() final;
     59    RetainPtr<CVPixelBufferRef> generateFrame() final;
     60    RealtimeMediaSourceSettings::DisplaySurfaceType surfaceType() const final { return RealtimeMediaSourceSettings::DisplaySurfaceType::Monitor; }
     61
    6062    void startProducingData() final;
    6163    void stopProducingData() final;
  • trunk/Source/WebCore/platform/mediastream/mac/ScreenDisplayCaptureSourceMac.mm

    r235760 r236494  
    9898
    9999ScreenDisplayCaptureSourceMac::ScreenDisplayCaptureSourceMac(uint32_t displayID)
    100     : DisplayCaptureSourceCocoa("Screen")
     100    : DisplayCaptureSourceCocoa("Screen") // FIXME: figure out what to call this
    101101    , m_displayID(displayID)
    102102{
     
    127127
    128128    if (!m_displayStream) {
    129         if (size().isEmpty()) {
    130             RetainPtr<CGDisplayModeRef> displayMode = adoptCF(CGDisplayCopyDisplayMode(m_displayID));
    131             auto screenWidth = CGDisplayModeGetPixelsWide(displayMode.get());
    132             auto screenHeight = CGDisplayModeGetPixelsHigh(displayMode.get());
    133             if (!screenWidth || !screenHeight) {
    134                 RELEASE_LOG(Media, "ScreenDisplayCaptureSourceMac::createDisplayStream(%p), unable to get screen width/height", this);
    135                 captureFailed();
    136                 return false;
    137             }
    138             setSize(IntSize(screenWidth, screenHeight));
     129        auto displayMode = adoptCF(CGDisplayCopyDisplayMode(m_displayID));
     130        auto screenWidth = CGDisplayModeGetPixelsWide(displayMode.get());
     131        auto screenHeight = CGDisplayModeGetPixelsHigh(displayMode.get());
     132        if (!screenWidth || !screenHeight) {
     133            RELEASE_LOG(Media, "ScreenDisplayCaptureSourceMac::createDisplayStream(%p), unable to get screen width/height", this);
     134            captureFailed();
     135            return false;
    139136        }
     137        setIntrinsicSize(IntSize(screenWidth, screenHeight));
    140138
    141139        if (!m_captureQueue)
     
    168166        });
    169167
    170         m_displayStream = adoptCF(CGDisplayStreamCreateWithDispatchQueue(m_displayID, size().width(), size().height(), kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, streamOptions.get(), m_captureQueue.get(), m_frameAvailableBlock));
     168        auto size = frameSize();
     169        m_displayStream = adoptCF(CGDisplayStreamCreateWithDispatchQueue(m_displayID, size.width(), size.height(), kCVPixelFormatType_420YpCbCr8Planar, streamOptions.get(), m_captureQueue.get(), m_frameAvailableBlock));
    171170        if (!m_displayStream) {
    172171            RELEASE_LOG(Media, "ScreenDisplayCaptureSourceMac::createDisplayStream(%p), CGDisplayStreamCreate failed", this);
     
    207206}
    208207
    209 void ScreenDisplayCaptureSourceMac::generateFrame()
     208RetainPtr<CVPixelBufferRef> ScreenDisplayCaptureSourceMac::generateFrame()
    210209{
    211210    if (!m_currentFrame.ioSurface())
    212         return;
     211        return nullptr;
    213212
    214213    DisplaySurface currentFrame;
     
    218217    }
    219218
    220     auto pixelBuffer = pixelBufferFromIOSurface(currentFrame.ioSurface());
    221     if (!pixelBuffer)
    222         return;
    223 
    224     auto sampleBuffer = sampleBufferFromPixelBuffer(pixelBuffer.get());
    225     if (!sampleBuffer)
    226         return;
    227 
    228     videoSampleAvailable(MediaSampleAVFObjC::create(sampleBuffer.get()));
     219    return pixelBufferFromIOSurface(currentFrame.ioSurface());
    229220}
    230221
  • trunk/Source/WebKit/ChangeLog

    r236492 r236494  
     12018-09-25  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [MediaStream] Add Mac window capture source
     4        https://bugs.webkit.org/show_bug.cgi?id=189958
     5        <rdar://problem/44767616>
     6
     7        Reviewed by Youenn Fablet.
     8
     9        * UIProcess/UserMediaPermissionRequestManagerProxy.h:
     10        * UIProcess/WebPageProxy.cpp:
     11        (WebKit::WebPageProxy::beginMonitoringCaptureDevices): Sync with webcore prefs before listening
     12        to device changes so we listen on the correct devices.
     13
    1142018-09-25  Chris Dumez  <cdumez@apple.com>
    215
  • trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h

    r235086 r236494  
    6565
    6666    void captureStateChanged(WebCore::MediaProducer::MediaStateFlags oldState, WebCore::MediaProducer::MediaStateFlags newState);
     67    void syncWithWebCorePrefs() const;
    6768
    6869private:
     
    7778    void getUserMediaPermissionInfo(uint64_t userMediaID, uint64_t frameID, UserMediaPermissionCheckProxy::CompletionHandler&&, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin);
    7879
    79     void syncWithWebCorePrefs() const;
    8080    void watchdogTimerFired();
    8181
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r236492 r236494  
    64496449{
    64506450#if ENABLE(MEDIA_STREAM)
     6451    userMediaPermissionRequestManager().syncWithWebCorePrefs();
    64516452    UserMediaProcessManager::singleton().beginMonitoringCaptureDevices();
    64526453#endif
Note: See TracChangeset for help on using the changeset viewer.