Title: [213941] trunk/Source
Revision
213941
Author
jer.no...@apple.com
Date
2017-03-14 14:41:48 -0700 (Tue, 14 Mar 2017)

Log Message

Refactor: Allow WebKit2 to override the creation of RealtimeMediaSources
https://bugs.webkit.org/show_bug.cgi?id=169227

Reviewed by Eric Carlson.

Source/WebCore:

Allow clients of RealtimeMediaSourceCenter to specify a factory for creating
RealtimeMediaSources, to be used by subclasess of RealtimeMediaSourceCenter. Add virtual
methods to retrieve the "default" factories for the RealtimeMediaSourceCenter subclass. The
requires moving the creation of sources up from CaptureDeviceManager into
RealtimeMediaSourceCenterMac, and the addition of factory methods to AVAudioCaptureSource
and AVVideoCaptureSource.

* platform/mediastream/CaptureDeviceManager.cpp:
(CaptureDeviceManager::deviceWithUID):
(CaptureDeviceManager::bestSourcesForTypeAndConstraints): Deleted.
(CaptureDeviceManager::sourceWithUID): Deleted.
* platform/mediastream/CaptureDeviceManager.h:
* platform/mediastream/RealtimeMediaSource.h:
* platform/mediastream/RealtimeMediaSourceCenter.cpp:
(WebCore::RealtimeMediaSourceCenter::setAudioFactory):
(WebCore::RealtimeMediaSourceCenter::unsetAudioFactory):
(WebCore::RealtimeMediaSourceCenter::setVideoFactory):
(WebCore::RealtimeMediaSourceCenter::unsetVideoFactory):
* platform/mediastream/RealtimeMediaSourceCenter.h:
(WebCore::RealtimeMediaSourceCenter::audioFactory):
(WebCore::RealtimeMediaSourceCenter::videoFactory):
* platform/mediastream/mac/AVAudioCaptureSource.h:
* platform/mediastream/mac/AVAudioCaptureSource.mm:
(WebCore::AVAudioCaptureSource::factory):
* platform/mediastream/mac/AVCaptureDeviceManager.h:
* platform/mediastream/mac/AVCaptureDeviceManager.mm:
(WebCore::AVCaptureDeviceManager::createMediaSourceForCaptureDeviceWithConstraints): Deleted.
* platform/mediastream/mac/AVMediaCaptureSource.h:
* platform/mediastream/mac/AVVideoCaptureSource.h:
* platform/mediastream/mac/AVVideoCaptureSource.mm:
(WebCore::AVVideoCaptureSource::factory):
* platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
(WebCore::RealtimeMediaSourceCenterMac::RealtimeMediaSourceCenterMac):
(WebCore::RealtimeMediaSourceCenterMac::validateRequestConstraints):
(WebCore::RealtimeMediaSourceCenterMac::createMediaStream):
(WebCore::RealtimeMediaSourceCenterMac::bestSourcesForTypeAndConstraints):
(WebCore::RealtimeMediaSourceCenterMac::defaultAudioFactory):
(WebCore::RealtimeMediaSourceCenterMac::defaultVideoFactory):
* platform/mediastream/mac/RealtimeMediaSourceCenterMac.h:
* platform/mock/MockRealtimeAudioSource.cpp:
(WebCore::MockRealtimeAudioSource::factory):
* platform/mock/MockRealtimeAudioSource.h:
* platform/mock/MockRealtimeMediaSourceCenter.cpp:
(WebCore::MockRealtimeMediaSourceCenter::defaultAudioFactory):
(WebCore::MockRealtimeMediaSourceCenter::defaultVideoFactory):
* platform/mock/MockRealtimeMediaSourceCenter.h:
* platform/mock/MockRealtimeVideoSource.cpp:
(WebCore::MockRealtimeVideoSource::factory):
* platform/mock/MockRealtimeVideoSource.h:

Source/WebKit2:

* WebKit2.xcodeproj/project.pbxproj:
* WebProcess/WebCoreSupport/WebUserMediaClient.cpp:
(WebKit::WebUserMediaClient::WebUserMediaClient):
(WebKit::WebUserMediaClient::initializeFactories): Add empty non-Cocoa implementation.
* WebProcess/WebCoreSupport/WebUserMediaClient.h:
* WebProcess/WebCoreSupport/cocoa/WebUserMediaClientMac.mm: Added.
(WebKit::WebUserMediaClient::initializeFactories): Initialize a (for now) pass-through factory.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (213940 => 213941)


--- trunk/Source/WebCore/ChangeLog	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/ChangeLog	2017-03-14 21:41:48 UTC (rev 213941)
@@ -1,3 +1,60 @@
+2017-03-06  Jer Noble  <jer.no...@apple.com>
+
+        Refactor: Allow WebKit2 to override the creation of RealtimeMediaSources
+        https://bugs.webkit.org/show_bug.cgi?id=169227
+
+        Reviewed by Eric Carlson.
+
+        Allow clients of RealtimeMediaSourceCenter to specify a factory for creating
+        RealtimeMediaSources, to be used by subclasess of RealtimeMediaSourceCenter. Add virtual
+        methods to retrieve the "default" factories for the RealtimeMediaSourceCenter subclass. The
+        requires moving the creation of sources up from CaptureDeviceManager into
+        RealtimeMediaSourceCenterMac, and the addition of factory methods to AVAudioCaptureSource
+        and AVVideoCaptureSource.
+
+        * platform/mediastream/CaptureDeviceManager.cpp:
+        (CaptureDeviceManager::deviceWithUID):
+        (CaptureDeviceManager::bestSourcesForTypeAndConstraints): Deleted.
+        (CaptureDeviceManager::sourceWithUID): Deleted.
+        * platform/mediastream/CaptureDeviceManager.h:
+        * platform/mediastream/RealtimeMediaSource.h:
+        * platform/mediastream/RealtimeMediaSourceCenter.cpp:
+        (WebCore::RealtimeMediaSourceCenter::setAudioFactory):
+        (WebCore::RealtimeMediaSourceCenter::unsetAudioFactory):
+        (WebCore::RealtimeMediaSourceCenter::setVideoFactory):
+        (WebCore::RealtimeMediaSourceCenter::unsetVideoFactory):
+        * platform/mediastream/RealtimeMediaSourceCenter.h:
+        (WebCore::RealtimeMediaSourceCenter::audioFactory):
+        (WebCore::RealtimeMediaSourceCenter::videoFactory):
+        * platform/mediastream/mac/AVAudioCaptureSource.h:
+        * platform/mediastream/mac/AVAudioCaptureSource.mm:
+        (WebCore::AVAudioCaptureSource::factory):
+        * platform/mediastream/mac/AVCaptureDeviceManager.h:
+        * platform/mediastream/mac/AVCaptureDeviceManager.mm:
+        (WebCore::AVCaptureDeviceManager::createMediaSourceForCaptureDeviceWithConstraints): Deleted.
+        * platform/mediastream/mac/AVMediaCaptureSource.h:
+        * platform/mediastream/mac/AVVideoCaptureSource.h:
+        * platform/mediastream/mac/AVVideoCaptureSource.mm:
+        (WebCore::AVVideoCaptureSource::factory):
+        * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
+        (WebCore::RealtimeMediaSourceCenterMac::RealtimeMediaSourceCenterMac):
+        (WebCore::RealtimeMediaSourceCenterMac::validateRequestConstraints):
+        (WebCore::RealtimeMediaSourceCenterMac::createMediaStream):
+        (WebCore::RealtimeMediaSourceCenterMac::bestSourcesForTypeAndConstraints):
+        (WebCore::RealtimeMediaSourceCenterMac::defaultAudioFactory):
+        (WebCore::RealtimeMediaSourceCenterMac::defaultVideoFactory):
+        * platform/mediastream/mac/RealtimeMediaSourceCenterMac.h:
+        * platform/mock/MockRealtimeAudioSource.cpp:
+        (WebCore::MockRealtimeAudioSource::factory):
+        * platform/mock/MockRealtimeAudioSource.h:
+        * platform/mock/MockRealtimeMediaSourceCenter.cpp:
+        (WebCore::MockRealtimeMediaSourceCenter::defaultAudioFactory):
+        (WebCore::MockRealtimeMediaSourceCenter::defaultVideoFactory):
+        * platform/mock/MockRealtimeMediaSourceCenter.h:
+        * platform/mock/MockRealtimeVideoSource.cpp:
+        (WebCore::MockRealtimeVideoSource::factory):
+        * platform/mock/MockRealtimeVideoSource.h:
+
 2017-03-14  Dean Jackson  <d...@apple.com>
 
         Rename LayerTypeWebGLLayer and use it for both WebGL and WebGPU

Modified: trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.cpp (213940 => 213941)


--- trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.cpp	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.cpp	2017-03-14 21:41:48 UTC (rev 213941)
@@ -69,42 +69,9 @@
     return false;
 }
 
-Vector<String> CaptureDeviceManager::bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type type, const MediaConstraints& constraints, String& invalidConstraint)
+std::optional<CaptureDevice> CaptureDeviceManager::deviceWithUID(const String& deviceUID, RealtimeMediaSource::Type type)
 {
-    Vector<RefPtr<RealtimeMediaSource>> bestSources;
-
-    struct {
-        bool operator()(RefPtr<RealtimeMediaSource> a, RefPtr<RealtimeMediaSource> b)
-        {
-            return a->fitnessScore() < b->fitnessScore();
-        }
-    } sortBasedOnFitnessScore;
-
-    ASSERT(type != RealtimeMediaSource::Type::None);
-    CaptureDevice::DeviceType deviceType = type == RealtimeMediaSource::Type::Video ? CaptureDevice::DeviceType::Video : CaptureDevice::DeviceType::Audio;
     for (auto& captureDevice : captureDevices()) {
-        if (!captureDevice.enabled() || captureDevice.type() != deviceType)
-            continue;
-
-        if (auto captureSource = createMediaSourceForCaptureDeviceWithConstraints(captureDevice, &constraints, invalidConstraint))
-            bestSources.append(captureSource.leakRef());
-    }
-
-    Vector<String> sourceUIDs;
-    if (bestSources.isEmpty())
-        return sourceUIDs;
-
-    sourceUIDs.reserveInitialCapacity(bestSources.size());
-    std::sort(bestSources.begin(), bestSources.end(), sortBasedOnFitnessScore);
-    for (auto& device : bestSources)
-        sourceUIDs.uncheckedAppend(device->persistentID());
-
-    return sourceUIDs;
-}
-
-RefPtr<RealtimeMediaSource> CaptureDeviceManager::sourceWithUID(const String& deviceUID, RealtimeMediaSource::Type type, const MediaConstraints* constraints, String& invalidConstraint)
-{
-    for (auto& captureDevice : captureDevices()) {
         CaptureDevice::DeviceType deviceType;
 
         switch (type) {
@@ -124,11 +91,10 @@
         if (!captureDevice.enabled())
             continue;
 
-        if (auto mediaSource = createMediaSourceForCaptureDeviceWithConstraints(captureDevice, constraints, invalidConstraint))
-            return mediaSource;
+        return captureDevice;
     }
 
-    return nullptr;
+    return std::nullopt;
 }
 
 #endif // ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.h (213940 => 213941)


--- trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.h	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mediastream/CaptureDeviceManager.h	2017-03-14 21:41:48 UTC (rev 213941)
@@ -37,13 +37,10 @@
     virtual Vector<CaptureDevice>& captureDevices() = 0;
     virtual void refreshCaptureDevices() { }
     virtual Vector<CaptureDevice> getSourcesInfo();
-    virtual Vector<String> bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type, const MediaConstraints&, String&);
-    virtual RefPtr<RealtimeMediaSource> sourceWithUID(const String&, RealtimeMediaSource::Type, const MediaConstraints*, String&);
+    virtual std::optional<CaptureDevice> deviceWithUID(const String&, RealtimeMediaSource::Type);
 
 protected:
     virtual ~CaptureDeviceManager();
-    virtual RefPtr<RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice&, const MediaConstraints*, String&) = 0;
-
     bool captureDeviceFromDeviceID(const String& captureDeviceID, CaptureDevice& source);
 };
 

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h (213940 => 213941)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h	2017-03-14 21:41:48 UTC (rev 213941)
@@ -54,6 +54,7 @@
 namespace WebCore {
 
 class AudioStreamDescription;
+class CaptureDevice;
 class FloatRect;
 class GraphicsContext;
 class MediaStreamPrivate;
@@ -82,6 +83,15 @@
         virtual void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t /*numberOfFrames*/) { }
     };
 
+    class CaptureFactory {
+    public:
+        virtual ~CaptureFactory() = default;
+        virtual RefPtr<RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice&, const MediaConstraints*, String&) = 0;
+
+    protected:
+        CaptureFactory() = default;
+    };
+
     virtual ~RealtimeMediaSource() { }
 
     const String& id() const { return m_id; }

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp (213940 => 213941)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp	2017-03-14 21:41:48 UTC (rev 213941)
@@ -66,6 +66,28 @@
 {
 }
 
+void RealtimeMediaSourceCenter::setAudioFactory(RealtimeMediaSource::CaptureFactory& factory)
+{
+    m_audioFactory = &factory;
+}
+
+void RealtimeMediaSourceCenter::unsetAudioFactory(RealtimeMediaSource::CaptureFactory& factory)
+{
+    if (m_audioFactory == &factory)
+        m_audioFactory = nullptr;
+}
+
+void RealtimeMediaSourceCenter::setVideoFactory(RealtimeMediaSource::CaptureFactory& factory)
+{
+    m_videoFactory = &factory;
+}
+
+void RealtimeMediaSourceCenter::unsetVideoFactory(RealtimeMediaSource::CaptureFactory& factory)
+{
+    if (m_videoFactory == &factory)
+        m_videoFactory = nullptr;
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h (213940 => 213941)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h	2017-03-14 21:41:48 UTC (rev 213941)
@@ -65,11 +65,25 @@
     
     virtual const RealtimeMediaSourceSupportedConstraints& supportedConstraints() { return m_supportedConstraints; }
 
+    virtual RealtimeMediaSource::CaptureFactory* defaultAudioFactory() { return nullptr; }
+    virtual RealtimeMediaSource::CaptureFactory* defaultVideoFactory() { return nullptr; }
+
+    WEBCORE_EXPORT void setAudioFactory(RealtimeMediaSource::CaptureFactory&);
+    WEBCORE_EXPORT void unsetAudioFactory(RealtimeMediaSource::CaptureFactory&);
+    RealtimeMediaSource::CaptureFactory* audioFactory() const { return m_audioFactory; }
+
+    WEBCORE_EXPORT void setVideoFactory(RealtimeMediaSource::CaptureFactory&);
+    WEBCORE_EXPORT void unsetVideoFactory(RealtimeMediaSource::CaptureFactory&);
+    RealtimeMediaSource::CaptureFactory* videoFactory() const { return m_videoFactory; }
+
 protected:
     RealtimeMediaSourceCenter();
 
     static RealtimeMediaSourceCenter& platformCenter();
     RealtimeMediaSourceSupportedConstraints m_supportedConstraints;
+
+    RealtimeMediaSource::CaptureFactory* m_audioFactory { nullptr };
+    RealtimeMediaSource::CaptureFactory* m_videoFactory { nullptr };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVAudioCaptureSource.h (213940 => 213941)


--- trunk/Source/WebCore/platform/mediastream/mac/AVAudioCaptureSource.h	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVAudioCaptureSource.h	2017-03-14 21:41:48 UTC (rev 213941)
@@ -46,6 +46,8 @@
 
     static RefPtr<AVMediaCaptureSource> create(AVCaptureDevice*, const AtomicString&, const MediaConstraints*, String&);
 
+    WEBCORE_EXPORT static CaptureFactory& factory();
+
 private:
     AVAudioCaptureSource(AVCaptureDevice*, const AtomicString&);
     virtual ~AVAudioCaptureSource();

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVAudioCaptureSource.mm (213940 => 213941)


--- trunk/Source/WebCore/platform/mediastream/mac/AVAudioCaptureSource.mm	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVAudioCaptureSource.mm	2017-03-14 21:41:48 UTC (rev 213941)
@@ -30,6 +30,7 @@
 
 #import "AudioSampleBufferList.h"
 #import "CAAudioStreamDescription.h"
+#import "CaptureDevice.h"
 #import "Logging.h"
 #import "MediaConstraints.h"
 #import "MediaSampleAVFObjC.h"
@@ -41,6 +42,7 @@
 #import <AVFoundation/AVCaptureSession.h>
 #import <CoreAudio/CoreAudioTypes.h>
 #import <wtf/HashSet.h>
+#import <wtf/NeverDestroyed.h>
 
 #import "CoreMediaSoftLink.h"
 
@@ -75,6 +77,15 @@
 
 namespace WebCore {
 
+class AVAudioCaptureSourceFactory : public RealtimeMediaSource::CaptureFactory {
+public:
+    RefPtr<RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice& captureDevice, const MediaConstraints* constraints, String& invalidConstraint) final {
+        AVCaptureDeviceTypedef *device = [getAVCaptureDeviceClass() deviceWithUniqueID:captureDevice.persistentId()];
+        ASSERT(!device || (device && captureDevice.type() == CaptureDevice::DeviceType::Audio));
+        return device ? AVAudioCaptureSource::create(device, emptyString(), constraints, invalidConstraint) : nullptr;
+    }
+};
+
 RefPtr<AVMediaCaptureSource> AVAudioCaptureSource::create(AVCaptureDeviceTypedef* device, const AtomicString& id, const MediaConstraints* constraints, String& invalidConstraint)
 {
     auto source = adoptRef(new AVAudioCaptureSource(device, id));
@@ -89,6 +100,12 @@
     return source;
 }
 
+RealtimeMediaSource::CaptureFactory& AVAudioCaptureSource::factory()
+{
+    static NeverDestroyed<AVAudioCaptureSourceFactory> factory;
+    return factory.get();
+}
+
 AVAudioCaptureSource::AVAudioCaptureSource(AVCaptureDeviceTypedef* device, const AtomicString& id)
     : AVMediaCaptureSource(device, id, Type::Audio)
 {

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.h (213940 => 213941)


--- trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.h	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.h	2017-03-14 21:41:48 UTC (rev 213941)
@@ -60,7 +60,6 @@
     AVCaptureDeviceManager();
     ~AVCaptureDeviceManager() final;
 
-    RefPtr<RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice&, const MediaConstraints*, String&) final;
     void refreshCaptureDevices() final;
     void registerForDeviceNotifications();
 

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm (213940 => 213941)


--- trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm	2017-03-14 21:41:48 UTC (rev 213941)
@@ -176,18 +176,6 @@
     return CaptureDeviceManager::getSourcesInfo();
 }
 
-RefPtr<RealtimeMediaSource> AVCaptureDeviceManager::createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice& captureDevice, const MediaConstraints* constraints, String& invalidConstraint)
-{
-    AVCaptureDeviceTypedef *device = [getAVCaptureDeviceClass() deviceWithUniqueID:captureDevice.persistentId()];
-    if (!device)
-        return nullptr;
-
-    if (captureDevice.type() == CaptureDevice::DeviceType::Audio)
-        return AVAudioCaptureSource::create(device, emptyString(), constraints, invalidConstraint);
-
-    return AVVideoCaptureSource::create(device, emptyString(), constraints, invalidConstraint);
-}
-
 void AVCaptureDeviceManager::registerForDeviceNotifications()
 {
     [[NSNotificationCenter defaultCenter] addObserver:m_objcObserver.get() selector:@selector(deviceConnected:) name:AVCaptureDeviceWasConnectedNotification object:nil];

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h (213940 => 213941)


--- trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h	2017-03-14 21:41:48 UTC (rev 213941)
@@ -40,6 +40,7 @@
 OBJC_CLASS AVCaptureSession;
 OBJC_CLASS AVCaptureVideoDataOutput;
 OBJC_CLASS NSError;
+OBJC_CLASS NSNotification;
 OBJC_CLASS WebCoreAVMediaCaptureSourceObserver;
 
 typedef struct opaqueCMSampleBuffer *CMSampleBufferRef;

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h (213940 => 213941)


--- trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h	2017-03-14 21:41:48 UTC (rev 213941)
@@ -47,6 +47,8 @@
 public:
     static RefPtr<AVMediaCaptureSource> create(AVCaptureDevice*, const AtomicString&, const MediaConstraints*, String&);
 
+    WEBCORE_EXPORT static CaptureFactory& factory();
+
     int32_t width() const { return m_width; }
     int32_t height() const { return m_height; }
 

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm (213940 => 213941)


--- trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm	2017-03-14 21:41:48 UTC (rev 213941)
@@ -109,6 +109,15 @@
 const OSType videoCaptureFormat = kCVPixelFormatType_420YpCbCr8BiPlanarFullRange;
 #endif
 
+class AVVideoCaptureSourceFactory : public RealtimeMediaSource::CaptureFactory {
+public:
+    RefPtr<RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice& captureDevice, const MediaConstraints* constraints, String& invalidConstraint) final {
+        AVCaptureDeviceTypedef *device = [getAVCaptureDeviceClass() deviceWithUniqueID:captureDevice.persistentId()];
+        ASSERT(!device || (captureDevice.type() == CaptureDevice::DeviceType::Video));
+        return device ? AVVideoCaptureSource::create(device, emptyString(), constraints, invalidConstraint) : nullptr;
+    }
+};
+
 RefPtr<AVMediaCaptureSource> AVVideoCaptureSource::create(AVCaptureDeviceTypedef* device, const AtomicString& id, const MediaConstraints* constraints, String& invalidConstraint)
 {
     auto source = adoptRef(new AVVideoCaptureSource(device, id));
@@ -123,6 +132,12 @@
     return source;
 }
 
+RealtimeMediaSource::CaptureFactory& AVVideoCaptureSource::factory()
+{
+    static NeverDestroyed<AVVideoCaptureSourceFactory> factory;
+    return factory.get();
+}
+
 AVVideoCaptureSource::AVVideoCaptureSource(AVCaptureDeviceTypedef* device, const AtomicString& id)
     : AVMediaCaptureSource(device, id, Type::Video)
 {

Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp (213940 => 213941)


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp	2017-03-14 21:41:48 UTC (rev 213941)
@@ -33,7 +33,9 @@
 #if ENABLE(MEDIA_STREAM)
 #include "RealtimeMediaSourceCenterMac.h"
 
+#include "AVAudioCaptureSource.h"
 #include "AVCaptureDeviceManager.h"
+#include "AVVideoCaptureSource.h"
 #include "Logging.h"
 #include "MediaStreamPrivate.h"
 #include <wtf/MainThread.h>
@@ -60,6 +62,9 @@
     m_supportedConstraints.setSupportsEchoCancellation(false);
     m_supportedConstraints.setSupportsDeviceId(true);
     m_supportedConstraints.setSupportsGroupId(true);
+
+    m_audioFactory = &AVAudioCaptureSource::factory();
+    m_videoFactory = &AVVideoCaptureSource::factory();
 }
 
 RealtimeMediaSourceCenterMac::~RealtimeMediaSourceCenterMac()
@@ -73,7 +78,7 @@
     String invalidConstraint;
 
     if (audioConstraints.isValid()) {
-        audioSourceUIDs = AVCaptureDeviceManager::singleton().bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type::Audio, audioConstraints, invalidConstraint);
+        audioSourceUIDs = bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type::Audio, audioConstraints, invalidConstraint);
         if (!invalidConstraint.isEmpty()) {
             invalidHandler(invalidConstraint);
             return;
@@ -81,7 +86,7 @@
     }
 
     if (videoConstraints.isValid()) {
-        videoSourceUIDs = AVCaptureDeviceManager::singleton().bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type::Video, videoConstraints, invalidConstraint);
+        videoSourceUIDs = bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type::Video, videoConstraints, invalidConstraint);
         if (!invalidConstraint.isEmpty()) {
             invalidHandler(invalidConstraint);
             return;
@@ -98,23 +103,26 @@
     String invalidConstraint;
 
     if (!audioDeviceID.isEmpty()) {
-        auto audioSource = AVCaptureDeviceManager::singleton().sourceWithUID(audioDeviceID, RealtimeMediaSource::Type::Audio, audioConstraints, invalidConstraint);
+        auto audioDevice = AVCaptureDeviceManager::singleton().deviceWithUID(audioDeviceID, RealtimeMediaSource::Type::Audio);
+        if (audioDevice && m_audioFactory) {
+            if (auto audioSource = m_audioFactory->createMediaSourceForCaptureDeviceWithConstraints(audioDevice.value(), audioConstraints, invalidConstraint))
+                audioSources.append(audioSource.releaseNonNull());
 #if !LOG_DISABLED
-        if (!invalidConstraint.isEmpty())
-            LOG(Media, "RealtimeMediaSourceCenterMac::createMediaStream(%p), audio constraints failed to apply: %s", this, invalidConstraint.utf8().data());
+            if (!invalidConstraint.isEmpty())
+                LOG(Media, "RealtimeMediaSourceCenterMac::createMediaStream(%p), audio constraints failed to apply: %s", this, invalidConstraint.utf8().data());
 #endif
-
-        if (audioSource)
-            audioSources.append(audioSource.releaseNonNull());
+        }
     }
     if (!videoDeviceID.isEmpty()) {
-        auto videoSource = AVCaptureDeviceManager::singleton().sourceWithUID(videoDeviceID, RealtimeMediaSource::Type::Video, videoConstraints, invalidConstraint);
+        auto videoDevice = AVCaptureDeviceManager::singleton().deviceWithUID(videoDeviceID, RealtimeMediaSource::Type::Video);
+        if (videoDevice && m_videoFactory) {
+            if (auto videoSource = m_videoFactory->createMediaSourceForCaptureDeviceWithConstraints(videoDevice.value(), videoConstraints, invalidConstraint))
+                videoSources.append(videoSource.releaseNonNull());
 #if !LOG_DISABLED
         if (!invalidConstraint.isEmpty())
             LOG(Media, "RealtimeMediaSourceCenterMac::createMediaStream(%p), video constraints failed to apply: %s", this, invalidConstraint.utf8().data());
 #endif
-        if (videoSource)
-            videoSources.append(videoSource.releaseNonNull());
+        }
     }
 
     if (videoSources.isEmpty() && audioSources.isEmpty())
@@ -128,6 +136,52 @@
     return AVCaptureDeviceManager::singleton().getSourcesInfo();
 }
 
+Vector<String> RealtimeMediaSourceCenterMac::bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type type, const MediaConstraints& constraints, String& invalidConstraint)
+{
+    Vector<RefPtr<RealtimeMediaSource>> bestSources;
+
+    struct {
+        bool operator()(RefPtr<RealtimeMediaSource> a, RefPtr<RealtimeMediaSource> b)
+        {
+            return a->fitnessScore() < b->fitnessScore();
+        }
+    } sortBasedOnFitnessScore;
+
+    CaptureDevice::DeviceType deviceType = type == RealtimeMediaSource::Type::Video ? CaptureDevice::DeviceType::Video : CaptureDevice::DeviceType::Audio;
+    for (auto& captureDevice : getMediaStreamDevices()) {
+        if (!captureDevice.enabled() || captureDevice.type() != deviceType)
+            continue;
+
+        RealtimeMediaSource::CaptureFactory* factory = type == RealtimeMediaSource::Type::Video ? m_videoFactory : m_audioFactory;
+        if (!factory)
+            continue;
+
+        if (auto captureSource = factory->createMediaSourceForCaptureDeviceWithConstraints(captureDevice, &constraints, invalidConstraint))
+            bestSources.append(captureSource.leakRef());
+    }
+
+    Vector<String> sourceUIDs;
+    if (bestSources.isEmpty())
+        return sourceUIDs;
+
+    sourceUIDs.reserveInitialCapacity(bestSources.size());
+    std::sort(bestSources.begin(), bestSources.end(), sortBasedOnFitnessScore);
+    for (auto& device : bestSources)
+        sourceUIDs.uncheckedAppend(device->persistentID());
+
+    return sourceUIDs;
+}
+
+RealtimeMediaSource::CaptureFactory* RealtimeMediaSourceCenterMac::defaultAudioFactory()
+{
+    return &AVAudioCaptureSource::factory();
+}
+
+RealtimeMediaSource::CaptureFactory* RealtimeMediaSourceCenterMac::defaultVideoFactory()
+{
+    return &AVVideoCaptureSource::factory();
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.h (213940 => 213941)


--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.h	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.h	2017-03-14 21:41:48 UTC (rev 213941)
@@ -50,6 +50,11 @@
     void validateRequestConstraints(ValidConstraintsHandler validHandler, InvalidConstraintsHandler invalidHandler, const MediaConstraints& audioConstraints, const MediaConstraints& videoConstraints) final;
     void createMediaStream(NewMediaStreamHandler, const String& audioDeviceID, const String& videoDeviceID, const MediaConstraints* audioConstraints, const MediaConstraints* videoConstraints) final;
     Vector<CaptureDevice> getMediaStreamDevices() final;
+
+    Vector<String> bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type, const MediaConstraints&, String& invalidConstraint);
+
+    RealtimeMediaSource::CaptureFactory* defaultAudioFactory() final;
+    RealtimeMediaSource::CaptureFactory* defaultVideoFactory() final;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp (213940 => 213941)


--- trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp	2017-03-14 21:41:48 UTC (rev 213941)
@@ -32,6 +32,7 @@
 #include "MockRealtimeAudioSource.h"
 
 #if ENABLE(MEDIA_STREAM)
+#include "CaptureDevice.h"
 #include "Logging.h"
 #include "MediaConstraints.h"
 #include "NotImplemented.h"
@@ -40,6 +41,15 @@
 
 namespace WebCore {
 
+class MockRealtimeAudioSourceFactory : public RealtimeMediaSource::CaptureFactory {
+public:
+    RefPtr<RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice& captureDevice, const MediaConstraints* constraints, String&) final {
+        if (captureDevice.type() == CaptureDevice::DeviceType::Audio)
+            return MockRealtimeAudioSource::create(captureDevice.label(), constraints);
+        return nullptr;
+    }
+};
+
 #if !PLATFORM(MAC) && !PLATFORM(IOS)
 RefPtr<MockRealtimeAudioSource> MockRealtimeAudioSource::create(const String& name, const MediaConstraints* constraints)
 {
@@ -57,7 +67,13 @@
     return source;
 }
 #endif
-    
+
+RealtimeMediaSource::CaptureFactory& MockRealtimeAudioSource::factory()
+{
+    NeverDestroyed<MockRealtimeAudioSourceFactory> factory;
+    return factory.get();
+}
+
 MockRealtimeAudioSource::MockRealtimeAudioSource(const String& name)
     : MockRealtimeMediaSource(createCanonicalUUIDString(), RealtimeMediaSource::Type::Audio, name)
     , m_timer(RunLoop::current(), this, &MockRealtimeAudioSource::tick)

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.h (213940 => 213941)


--- trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.h	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeAudioSource.h	2017-03-14 21:41:48 UTC (rev 213941)
@@ -45,6 +45,8 @@
     static RefPtr<MockRealtimeAudioSource> create(const String&, const MediaConstraints*);
     static RefPtr<MockRealtimeAudioSource> createMuted(const String& name);
 
+    static CaptureFactory& factory();
+
     virtual ~MockRealtimeAudioSource() = default;
 
 protected:

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp (213940 => 213941)


--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp	2017-03-14 21:41:48 UTC (rev 213941)
@@ -131,6 +131,17 @@
     return sources;
 }
 
+RealtimeMediaSource::CaptureFactory* MockRealtimeMediaSourceCenter::defaultAudioFactory()
+{
+    return &MockRealtimeAudioSource::factory();
+}
+
+RealtimeMediaSource::CaptureFactory* MockRealtimeMediaSourceCenter::defaultVideoFactory()
+{
+    return &MockRealtimeVideoSource::factory();
+}
+
+
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h (213940 => 213941)


--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h	2017-03-14 21:41:48 UTC (rev 213941)
@@ -44,6 +44,9 @@
     void validateRequestConstraints(ValidConstraintsHandler validHandler, InvalidConstraintsHandler invalidHandler, const MediaConstraints& audioConstraints, const MediaConstraints& videoConstraints) final;
     Vector<CaptureDevice> getMediaStreamDevices() final;
     void createMediaStream(NewMediaStreamHandler, const String& audioDeviceID, const String& videoDeviceID, const MediaConstraints* audioConstraints, const MediaConstraints* videoConstraints) final;
+
+    RealtimeMediaSource::CaptureFactory* defaultAudioFactory() final;
+    RealtimeMediaSource::CaptureFactory* defaultVideoFactory() final;
 };
 
 }

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp (213940 => 213941)


--- trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp	2017-03-14 21:41:48 UTC (rev 213941)
@@ -32,6 +32,7 @@
 #include "MockRealtimeVideoSource.h"
 
 #if ENABLE(MEDIA_STREAM)
+#include "CaptureDevice.h"
 #include "GraphicsContext.h"
 #include "ImageBuffer.h"
 #include "IntRect.h"
@@ -47,6 +48,15 @@
 
 namespace WebCore {
 
+class MockRealtimeVideoSourceFactory : public RealtimeMediaSource::CaptureFactory {
+public:
+    RefPtr<RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice& captureDevice, const MediaConstraints* constraints, String&) final {
+        if (captureDevice.type() == CaptureDevice::DeviceType::Video)
+            return MockRealtimeVideoSource::create(captureDevice.label(), constraints);
+        return nullptr;
+    }
+};
+
 #if !PLATFORM(MAC) && !PLATFORM(IOS)
 RefPtr<MockRealtimeVideoSource> MockRealtimeVideoSource::create(const String& name, const MediaConstraints* constraints)
 {
@@ -65,6 +75,12 @@
 }
 #endif
 
+RealtimeMediaSource::CaptureFactory& MockRealtimeVideoSource::factory()
+{
+    NeverDestroyed<MockRealtimeVideoSourceFactory> factory;
+    return factory.get();
+}
+
 MockRealtimeVideoSource::MockRealtimeVideoSource(const String& name)
     : MockRealtimeMediaSource(createCanonicalUUIDString(), RealtimeMediaSource::Type::Video, name)
     , m_timer(RunLoop::current(), this, &MockRealtimeVideoSource::generateFrame)

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h (213940 => 213941)


--- trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h	2017-03-14 21:41:48 UTC (rev 213941)
@@ -49,6 +49,8 @@
     static RefPtr<MockRealtimeVideoSource> create(const String&, const MediaConstraints*);
     static RefPtr<MockRealtimeVideoSource> createMuted(const String& name);
 
+    static CaptureFactory& factory();
+
     virtual ~MockRealtimeVideoSource() { }
 
 protected:

Modified: trunk/Source/WebKit2/ChangeLog (213940 => 213941)


--- trunk/Source/WebKit2/ChangeLog	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebKit2/ChangeLog	2017-03-14 21:41:48 UTC (rev 213941)
@@ -1,3 +1,18 @@
+2017-03-06  Jer Noble  <jer.no...@apple.com>
+
+        Refactor: Allow WebKit2 to override the creation of RealtimeMediaSources
+        https://bugs.webkit.org/show_bug.cgi?id=169227
+
+        Reviewed by Eric Carlson.
+
+        * WebKit2.xcodeproj/project.pbxproj:
+        * WebProcess/WebCoreSupport/WebUserMediaClient.cpp:
+        (WebKit::WebUserMediaClient::WebUserMediaClient):
+        (WebKit::WebUserMediaClient::initializeFactories): Add empty non-Cocoa implementation.
+        * WebProcess/WebCoreSupport/WebUserMediaClient.h:
+        * WebProcess/WebCoreSupport/cocoa/WebUserMediaClientMac.mm: Added.
+        (WebKit::WebUserMediaClient::initializeFactories): Initialize a (for now) pass-through factory.
+
 2017-03-14  Dean Jackson  <d...@apple.com>
 
         Rename LayerTypeWebGLLayer and use it for both WebGL and WebGPU

Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (213940 => 213941)


--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj	2017-03-14 21:41:48 UTC (rev 213941)
@@ -1883,6 +1883,7 @@
 		CD4B4D9D1E765E0000D27092 /* SharedRingBufferStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = CD4B4D9B1E765E0000D27092 /* SharedRingBufferStorage.h */; };
 		CD5C66A0134B9D38004FE2A8 /* InjectedBundlePageFullScreenClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD5C669E134B9D36004FE2A8 /* InjectedBundlePageFullScreenClient.cpp */; };
 		CD5C66A1134B9D38004FE2A8 /* InjectedBundlePageFullScreenClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CD5C669F134B9D37004FE2A8 /* InjectedBundlePageFullScreenClient.h */; };
+		CD6178141E6DE9A000FDA57D /* WebUserMediaClientMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = CD6178121E6DE9A000FDA57D /* WebUserMediaClientMac.mm */; };
 		CD6F75F4131B66D000D6B21E /* WebFullScreenManagerProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD73BA3E131A2E8A00EEDED2 /* WebFullScreenManagerProxy.cpp */; };
 		CD73BA47131ACC9A00EEDED2 /* WebFullScreenManagerProxyMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD73BA45131ACC8800EEDED2 /* WebFullScreenManagerProxyMessageReceiver.cpp */; };
 		CD73BA4E131ACDB700EEDED2 /* WebFullScreenManagerMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD73BA48131ACD8E00EEDED2 /* WebFullScreenManagerMessageReceiver.cpp */; };
@@ -4172,6 +4173,7 @@
 		CD4B4D9B1E765E0000D27092 /* SharedRingBufferStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SharedRingBufferStorage.h; sourceTree = "<group>"; };
 		CD5C669E134B9D36004FE2A8 /* InjectedBundlePageFullScreenClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundlePageFullScreenClient.cpp; sourceTree = "<group>"; };
 		CD5C669F134B9D37004FE2A8 /* InjectedBundlePageFullScreenClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InjectedBundlePageFullScreenClient.h; sourceTree = "<group>"; };
+		CD6178121E6DE9A000FDA57D /* WebUserMediaClientMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WebUserMediaClientMac.mm; path = cocoa/WebUserMediaClientMac.mm; sourceTree = "<group>"; };
 		CD73BA37131A29FE00EEDED2 /* WebFullScreenManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebFullScreenManager.cpp; path = FullScreen/WebFullScreenManager.cpp; sourceTree = "<group>"; };
 		CD73BA38131A29FE00EEDED2 /* WebFullScreenManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebFullScreenManager.h; path = FullScreen/WebFullScreenManager.h; sourceTree = "<group>"; };
 		CD73BA39131A29FE00EEDED2 /* WebFullScreenManager.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = WebFullScreenManager.messages.in; path = FullScreen/WebFullScreenManager.messages.in; sourceTree = "<group>"; };
@@ -6450,6 +6452,7 @@
 		BC032D5D10F437220058C15A /* WebCoreSupport */ = {
 			isa = PBXGroup;
 			children = (
+				CD6178111E6DE98000FDA57D /* cocoa */,
 				2D28F3DF1885CCB4004B9EAE /* ios */,
 				BC111ADE112F5B9A00337BAB /* mac */,
 				1A7284441959ED100007BCE5 /* SessionStateConversion.cpp */,
@@ -7818,6 +7821,14 @@
 			name = forms;
 			sourceTree = "<group>";
 		};
+		CD6178111E6DE98000FDA57D /* cocoa */ = {
+			isa = PBXGroup;
+			children = (
+				CD6178121E6DE9A000FDA57D /* WebUserMediaClientMac.mm */,
+			);
+			name = cocoa;
+			sourceTree = "<group>";
+		};
 		CD73BA3D131A2A2100EEDED2 /* FullScreen */ = {
 			isa = PBXGroup;
 			children = (
@@ -9968,6 +9979,7 @@
 				753E3E0D1887398500188496 /* SessionTracker.cpp in Sources */,
 				1A6420E412DCE2FF00CAAE2C /* ShareableBitmap.cpp in Sources */,
 				C01A260112662F2100C9ED55 /* ShareableBitmapCG.cpp in Sources */,
+				CD6178141E6DE9A000FDA57D /* WebUserMediaClientMac.mm in Sources */,
 				51217460164C20E30037A5C1 /* ShareableResource.cpp in Sources */,
 				4450AEC01DC3FAE5009943F2 /* SharedMemoryCocoa.cpp in Sources */,
 				2DAF06D718BD1A470081CEB1 /* SmartMagnificationController.mm in Sources */,

Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.cpp (213940 => 213941)


--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.cpp	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.cpp	2017-03-14 21:41:48 UTC (rev 213941)
@@ -33,6 +33,7 @@
 WebUserMediaClient::WebUserMediaClient(WebPage& page)
     : m_page(page)
 {
+    initializeFactories();
 }
 
 void WebUserMediaClient::pageDestroyed()
@@ -60,6 +61,13 @@
     m_page.userMediaPermissionRequestManager().cancelMediaDevicesEnumeration(request);
 }
 
+#if !PLATFORM(COCOA)
+void WebUserMediaClient::initializeFactories()
+{
+
+}
+#endif
+
 } // namespace WebKit;
 
 #endif // MEDIA_STREAM

Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.h (213940 => 213941)


--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.h	2017-03-14 21:39:22 UTC (rev 213940)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.h	2017-03-14 21:41:48 UTC (rev 213941)
@@ -42,6 +42,8 @@
     void enumerateMediaDevices(WebCore::MediaDevicesEnumerationRequest&) final;
     void cancelMediaDevicesEnumerationRequest(WebCore::MediaDevicesEnumerationRequest&) final;
 
+    void initializeFactories();
+
     WebPage& m_page;
 };
 

Added: trunk/Source/WebKit2/WebProcess/WebCoreSupport/cocoa/WebUserMediaClientMac.mm (0 => 213941)


--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/cocoa/WebUserMediaClientMac.mm	                        (rev 0)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/cocoa/WebUserMediaClientMac.mm	2017-03-14 21:41:48 UTC (rev 213941)
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WebUserMediaClient.h"
+
+#if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA)
+
+#import <WebCore/RealtimeMediaSourceCenter.h>
+#import <wtf/NeverDestroyed.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+class WebUserMediaClientAudioFactory final : public RealtimeMediaSource::CaptureFactory {
+public:
+    static WebUserMediaClientAudioFactory& singleton()
+    {
+        static NeverDestroyed<WebUserMediaClientAudioFactory> factory;
+        return factory;
+    }
+
+private:
+    RefPtr<RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice& device, const MediaConstraints* constraints, String& invalidConstraints) final {
+        auto* factory = RealtimeMediaSourceCenter::singleton().defaultAudioFactory();
+        return factory ? factory->createMediaSourceForCaptureDeviceWithConstraints(device, constraints, invalidConstraints) : nullptr;
+    }
+};
+
+void WebUserMediaClient::initializeFactories()
+{
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^ {
+        WebCore::RealtimeMediaSourceCenter::singleton().setAudioFactory(WebUserMediaClientAudioFactory::singleton());
+    });
+}
+
+}
+
+#endif
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to