| Differences between
and this patch
- a/Source/WebCore/ChangeLog +57 lines
Lines 1-3 a/Source/WebCore/ChangeLog_sec1
1
2017-03-06  Jer Noble  <jer.noble@apple.com>
2
3
        Refactor: Allow WebKit2 to override the creation of RealtimeMediaSources
4
        https://bugs.webkit.org/show_bug.cgi?id=169227
5
6
        Reviewed by Eric Carlson.
7
8
        Allow clients of RealtimeMediaSourceCenter to specify a factory for creating
9
        RealtimeMediaSources, to be used by subclasess of RealtimeMediaSourceCenter. Add virtual
10
        methods to retrieve the "default" factories for the RealtimeMediaSourceCenter subclass. The
11
        requires moving the creation of sources up from CaptureDeviceManager into
12
        RealtimeMediaSourceCenterMac, and the addition of factory methods to AVAudioCaptureSource
13
        and AVVideoCaptureSource.
14
15
        * platform/mediastream/CaptureDeviceManager.cpp:
16
        (CaptureDeviceManager::deviceWithUID):
17
        (CaptureDeviceManager::bestSourcesForTypeAndConstraints): Deleted.
18
        (CaptureDeviceManager::sourceWithUID): Deleted.
19
        * platform/mediastream/CaptureDeviceManager.h:
20
        * platform/mediastream/RealtimeMediaSource.h:
21
        * platform/mediastream/RealtimeMediaSourceCenter.cpp:
22
        (WebCore::RealtimeMediaSourceCenter::setAudioFactory):
23
        (WebCore::RealtimeMediaSourceCenter::unsetAudioFactory):
24
        (WebCore::RealtimeMediaSourceCenter::setVideoFactory):
25
        (WebCore::RealtimeMediaSourceCenter::unsetVideoFactory):
26
        * platform/mediastream/RealtimeMediaSourceCenter.h:
27
        (WebCore::RealtimeMediaSourceCenter::audioFactory):
28
        (WebCore::RealtimeMediaSourceCenter::videoFactory):
29
        * platform/mediastream/mac/AVAudioCaptureSource.h:
30
        * platform/mediastream/mac/AVAudioCaptureSource.mm:
31
        (WebCore::AVAudioCaptureSource::factory):
32
        * platform/mediastream/mac/AVCaptureDeviceManager.h:
33
        * platform/mediastream/mac/AVCaptureDeviceManager.mm:
34
        (WebCore::AVCaptureDeviceManager::createMediaSourceForCaptureDeviceWithConstraints): Deleted.
35
        * platform/mediastream/mac/AVMediaCaptureSource.h:
36
        * platform/mediastream/mac/AVVideoCaptureSource.h:
37
        * platform/mediastream/mac/AVVideoCaptureSource.mm:
38
        (WebCore::AVVideoCaptureSource::factory):
39
        * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
40
        (WebCore::RealtimeMediaSourceCenterMac::RealtimeMediaSourceCenterMac):
41
        (WebCore::RealtimeMediaSourceCenterMac::validateRequestConstraints):
42
        (WebCore::RealtimeMediaSourceCenterMac::createMediaStream):
43
        (WebCore::RealtimeMediaSourceCenterMac::bestSourcesForTypeAndConstraints):
44
        (WebCore::RealtimeMediaSourceCenterMac::defaultAudioFactory):
45
        (WebCore::RealtimeMediaSourceCenterMac::defaultVideoFactory):
46
        * platform/mediastream/mac/RealtimeMediaSourceCenterMac.h:
47
        * platform/mock/MockRealtimeAudioSource.cpp:
48
        (WebCore::MockRealtimeAudioSource::factory):
49
        * platform/mock/MockRealtimeAudioSource.h:
50
        * platform/mock/MockRealtimeMediaSourceCenter.cpp:
51
        (WebCore::MockRealtimeMediaSourceCenter::defaultAudioFactory):
52
        (WebCore::MockRealtimeMediaSourceCenter::defaultVideoFactory):
53
        * platform/mock/MockRealtimeMediaSourceCenter.h:
54
        * platform/mock/MockRealtimeVideoSource.cpp:
55
        (WebCore::MockRealtimeVideoSource::factory):
56
        * platform/mock/MockRealtimeVideoSource.h:
57
1
2017-03-14  Wenson Hsieh  <wenson_hsieh@apple.com>
58
2017-03-14  Wenson Hsieh  <wenson_hsieh@apple.com>
2
59
3
        [WK2] Data interaction tests occasionally hit assertions in debug builds
60
        [WK2] Data interaction tests occasionally hit assertions in debug builds
- a/Source/WebKit2/ChangeLog +15 lines
Lines 1-3 a/Source/WebKit2/ChangeLog_sec1
1
2017-03-06  Jer Noble  <jer.noble@apple.com>
2
3
        Refactor: Allow WebKit2 to override the creation of RealtimeMediaSources
4
        https://bugs.webkit.org/show_bug.cgi?id=169227
5
6
        Reviewed by Eric Carlson.
7
8
        * WebKit2.xcodeproj/project.pbxproj:
9
        * WebProcess/WebCoreSupport/WebUserMediaClient.cpp:
10
        (WebKit::WebUserMediaClient::WebUserMediaClient):
11
        (WebKit::WebUserMediaClient::initializeFactories): Add empty non-Cocoa implementation.
12
        * WebProcess/WebCoreSupport/WebUserMediaClient.h:
13
        * WebProcess/WebCoreSupport/cocoa/WebUserMediaClientMac.mm: Added.
14
        (WebKit::WebUserMediaClient::initializeFactories): Initialize a (for now) pass-through factory.
15
1
2017-03-10  Ada Chan  <adachan@apple.com>
16
2017-03-10  Ada Chan  <adachan@apple.com>
2
17
3
        [Mac] Add API to get the NSURLProtectionSpace from WKProtectionSpaceRef
18
        [Mac] Add API to get the NSURLProtectionSpace from WKProtectionSpaceRef
- a/Source/WebCore/platform/mediastream/CaptureDeviceManager.cpp -37 / +3 lines
Lines 69-108 bool CaptureDeviceManager::captureDeviceFromDeviceID(const String& captureDevice a/Source/WebCore/platform/mediastream/CaptureDeviceManager.cpp_sec1
69
    return false;
69
    return false;
70
}
70
}
71
71
72
Vector<String> CaptureDeviceManager::bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type type, const MediaConstraints& constraints, String& invalidConstraint)
72
std::optional<CaptureDevice> CaptureDeviceManager::deviceWithUID(const String& deviceUID, RealtimeMediaSource::Type type)
73
{
74
    Vector<RefPtr<RealtimeMediaSource>> bestSources;
75
76
    struct {
77
        bool operator()(RefPtr<RealtimeMediaSource> a, RefPtr<RealtimeMediaSource> b)
78
        {
79
            return a->fitnessScore() < b->fitnessScore();
80
        }
81
    } sortBasedOnFitnessScore;
82
83
    ASSERT(type != RealtimeMediaSource::Type::None);
84
    CaptureDevice::DeviceType deviceType = type == RealtimeMediaSource::Type::Video ? CaptureDevice::DeviceType::Video : CaptureDevice::DeviceType::Audio;
85
    for (auto& captureDevice : captureDevices()) {
86
        if (!captureDevice.enabled() || captureDevice.type() != deviceType)
87
            continue;
88
89
        if (auto captureSource = createMediaSourceForCaptureDeviceWithConstraints(captureDevice, &constraints, invalidConstraint))
90
            bestSources.append(captureSource.leakRef());
91
    }
92
93
    Vector<String> sourceUIDs;
94
    if (bestSources.isEmpty())
95
        return sourceUIDs;
96
97
    sourceUIDs.reserveInitialCapacity(bestSources.size());
98
    std::sort(bestSources.begin(), bestSources.end(), sortBasedOnFitnessScore);
99
    for (auto& device : bestSources)
100
        sourceUIDs.uncheckedAppend(device->persistentID());
101
102
    return sourceUIDs;
103
}
104
105
RefPtr<RealtimeMediaSource> CaptureDeviceManager::sourceWithUID(const String& deviceUID, RealtimeMediaSource::Type type, const MediaConstraints* constraints, String& invalidConstraint)
106
{
73
{
107
    for (auto& captureDevice : captureDevices()) {
74
    for (auto& captureDevice : captureDevices()) {
108
        CaptureDevice::DeviceType deviceType;
75
        CaptureDevice::DeviceType deviceType;
Lines 124-134 RefPtr<RealtimeMediaSource> CaptureDeviceManager::sourceWithUID(const String& de a/Source/WebCore/platform/mediastream/CaptureDeviceManager.cpp_sec2
124
        if (!captureDevice.enabled())
91
        if (!captureDevice.enabled())
125
            continue;
92
            continue;
126
93
127
        if (auto mediaSource = createMediaSourceForCaptureDeviceWithConstraints(captureDevice, constraints, invalidConstraint))
94
        return captureDevice;
128
            return mediaSource;
129
    }
95
    }
130
96
131
    return nullptr;
97
    return std::nullopt;
132
}
98
}
133
99
134
#endif // ENABLE(MEDIA_STREAM)
100
#endif // ENABLE(MEDIA_STREAM)
- a/Source/WebCore/platform/mediastream/CaptureDeviceManager.h -4 / +1 lines
Lines 37-49 public: a/Source/WebCore/platform/mediastream/CaptureDeviceManager.h_sec1
37
    virtual Vector<CaptureDevice>& captureDevices() = 0;
37
    virtual Vector<CaptureDevice>& captureDevices() = 0;
38
    virtual void refreshCaptureDevices() { }
38
    virtual void refreshCaptureDevices() { }
39
    virtual Vector<CaptureDevice> getSourcesInfo();
39
    virtual Vector<CaptureDevice> getSourcesInfo();
40
    virtual Vector<String> bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type, const MediaConstraints&, String&);
40
    virtual std::optional<CaptureDevice> deviceWithUID(const String&, RealtimeMediaSource::Type);
41
    virtual RefPtr<RealtimeMediaSource> sourceWithUID(const String&, RealtimeMediaSource::Type, const MediaConstraints*, String&);
42
41
43
protected:
42
protected:
44
    virtual ~CaptureDeviceManager();
43
    virtual ~CaptureDeviceManager();
45
    virtual RefPtr<RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice&, const MediaConstraints*, String&) = 0;
46
47
    bool captureDeviceFromDeviceID(const String& captureDeviceID, CaptureDevice& source);
44
    bool captureDeviceFromDeviceID(const String& captureDeviceID, CaptureDevice& source);
48
};
45
};
49
46
- a/Source/WebCore/platform/mediastream/RealtimeMediaSource.h +10 lines
Lines 54-59 class MediaTime; a/Source/WebCore/platform/mediastream/RealtimeMediaSource.h_sec1
54
namespace WebCore {
54
namespace WebCore {
55
55
56
class AudioStreamDescription;
56
class AudioStreamDescription;
57
class CaptureDevice;
57
class FloatRect;
58
class FloatRect;
58
class GraphicsContext;
59
class GraphicsContext;
59
class MediaStreamPrivate;
60
class MediaStreamPrivate;
Lines 82-87 public: a/Source/WebCore/platform/mediastream/RealtimeMediaSource.h_sec2
82
        virtual void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t /*numberOfFrames*/) { }
83
        virtual void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t /*numberOfFrames*/) { }
83
    };
84
    };
84
85
86
    class CaptureFactory {
87
    public:
88
        virtual ~CaptureFactory() = default;
89
        virtual RefPtr<RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice&, const MediaConstraints*, String&) = 0;
90
91
    protected:
92
        CaptureFactory() = default;
93
    };
94
85
    virtual ~RealtimeMediaSource() { }
95
    virtual ~RealtimeMediaSource() { }
86
96
87
    const String& id() const { return m_id; }
97
    const String& id() const { return m_id; }
- a/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp +22 lines
Lines 66-71 RealtimeMediaSourceCenter::~RealtimeMediaSourceCenter() a/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp_sec1
66
{
66
{
67
}
67
}
68
68
69
void RealtimeMediaSourceCenter::setAudioFactory(RealtimeMediaSource::CaptureFactory& factory)
70
{
71
    m_audioFactory = &factory;
72
}
73
74
void RealtimeMediaSourceCenter::unsetAudioFactory(RealtimeMediaSource::CaptureFactory& factory)
75
{
76
    if (m_audioFactory == &factory)
77
        m_audioFactory = nullptr;
78
}
79
80
void RealtimeMediaSourceCenter::setVideoFactory(RealtimeMediaSource::CaptureFactory& factory)
81
{
82
    m_videoFactory = &factory;
83
}
84
85
void RealtimeMediaSourceCenter::unsetVideoFactory(RealtimeMediaSource::CaptureFactory& factory)
86
{
87
    if (m_videoFactory == &factory)
88
        m_videoFactory = nullptr;
89
}
90
69
} // namespace WebCore
91
} // namespace WebCore
70
92
71
#endif // ENABLE(MEDIA_STREAM)
93
#endif // ENABLE(MEDIA_STREAM)
- a/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h +14 lines
Lines 65-75 public: a/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h_sec1
65
    
65
    
66
    virtual const RealtimeMediaSourceSupportedConstraints& supportedConstraints() { return m_supportedConstraints; }
66
    virtual const RealtimeMediaSourceSupportedConstraints& supportedConstraints() { return m_supportedConstraints; }
67
67
68
    virtual RealtimeMediaSource::CaptureFactory* defaultAudioFactory() { return nullptr; }
69
    virtual RealtimeMediaSource::CaptureFactory* defaultVideoFactory() { return nullptr; }
70
71
    WEBCORE_EXPORT void setAudioFactory(RealtimeMediaSource::CaptureFactory&);
72
    WEBCORE_EXPORT void unsetAudioFactory(RealtimeMediaSource::CaptureFactory&);
73
    RealtimeMediaSource::CaptureFactory* audioFactory() const { return m_audioFactory; }
74
75
    WEBCORE_EXPORT void setVideoFactory(RealtimeMediaSource::CaptureFactory&);
76
    WEBCORE_EXPORT void unsetVideoFactory(RealtimeMediaSource::CaptureFactory&);
77
    RealtimeMediaSource::CaptureFactory* videoFactory() const { return m_videoFactory; }
78
68
protected:
79
protected:
69
    RealtimeMediaSourceCenter();
80
    RealtimeMediaSourceCenter();
70
81
71
    static RealtimeMediaSourceCenter& platformCenter();
82
    static RealtimeMediaSourceCenter& platformCenter();
72
    RealtimeMediaSourceSupportedConstraints m_supportedConstraints;
83
    RealtimeMediaSourceSupportedConstraints m_supportedConstraints;
84
85
    RealtimeMediaSource::CaptureFactory* m_audioFactory { nullptr };
86
    RealtimeMediaSource::CaptureFactory* m_videoFactory { nullptr };
73
};
87
};
74
88
75
} // namespace WebCore
89
} // namespace WebCore
- a/Source/WebCore/platform/mediastream/mac/AVAudioCaptureSource.h +2 lines
Lines 46-51 public: a/Source/WebCore/platform/mediastream/mac/AVAudioCaptureSource.h_sec1
46
46
47
    static RefPtr<AVMediaCaptureSource> create(AVCaptureDevice*, const AtomicString&, const MediaConstraints*, String&);
47
    static RefPtr<AVMediaCaptureSource> create(AVCaptureDevice*, const AtomicString&, const MediaConstraints*, String&);
48
48
49
    WEBCORE_EXPORT static CaptureFactory& factory();
50
49
private:
51
private:
50
    AVAudioCaptureSource(AVCaptureDevice*, const AtomicString&);
52
    AVAudioCaptureSource(AVCaptureDevice*, const AtomicString&);
51
    virtual ~AVAudioCaptureSource();
53
    virtual ~AVAudioCaptureSource();
- a/Source/WebCore/platform/mediastream/mac/AVAudioCaptureSource.mm +17 lines
Lines 30-35 a/Source/WebCore/platform/mediastream/mac/AVAudioCaptureSource.mm_sec1
30
30
31
#import "AudioSampleBufferList.h"
31
#import "AudioSampleBufferList.h"
32
#import "CAAudioStreamDescription.h"
32
#import "CAAudioStreamDescription.h"
33
#import "CaptureDevice.h"
33
#import "Logging.h"
34
#import "Logging.h"
34
#import "MediaConstraints.h"
35
#import "MediaConstraints.h"
35
#import "MediaSampleAVFObjC.h"
36
#import "MediaSampleAVFObjC.h"
Lines 41-46 a/Source/WebCore/platform/mediastream/mac/AVAudioCaptureSource.mm_sec2
41
#import <AVFoundation/AVCaptureSession.h>
42
#import <AVFoundation/AVCaptureSession.h>
42
#import <CoreAudio/CoreAudioTypes.h>
43
#import <CoreAudio/CoreAudioTypes.h>
43
#import <wtf/HashSet.h>
44
#import <wtf/HashSet.h>
45
#import <wtf/NeverDestroyed.h>
44
46
45
#import "CoreMediaSoftLink.h"
47
#import "CoreMediaSoftLink.h"
46
48
Lines 75-80 SOFT_LINK_POINTER(AVFoundation, AVMediaTypeAudio, NSString *) a/Source/WebCore/platform/mediastream/mac/AVAudioCaptureSource.mm_sec3
75
77
76
namespace WebCore {
78
namespace WebCore {
77
79
80
class AVAudioCaptureSourceFactory : public RealtimeMediaSource::CaptureFactory {
81
public:
82
    RefPtr<RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice& captureDevice, const MediaConstraints* constraints, String& invalidConstraint) final {
83
        AVCaptureDeviceTypedef *device = [getAVCaptureDeviceClass() deviceWithUniqueID:captureDevice.persistentId()];
84
        ASSERT(!device || (device && captureDevice.type() == CaptureDevice::DeviceType::Audio));
85
        return device ? AVAudioCaptureSource::create(device, emptyString(), constraints, invalidConstraint) : nullptr;
86
    }
87
};
88
78
RefPtr<AVMediaCaptureSource> AVAudioCaptureSource::create(AVCaptureDeviceTypedef* device, const AtomicString& id, const MediaConstraints* constraints, String& invalidConstraint)
89
RefPtr<AVMediaCaptureSource> AVAudioCaptureSource::create(AVCaptureDeviceTypedef* device, const AtomicString& id, const MediaConstraints* constraints, String& invalidConstraint)
79
{
90
{
80
    auto source = adoptRef(new AVAudioCaptureSource(device, id));
91
    auto source = adoptRef(new AVAudioCaptureSource(device, id));
Lines 89-94 RefPtr<AVMediaCaptureSource> AVAudioCaptureSource::create(AVCaptureDeviceTypedef a/Source/WebCore/platform/mediastream/mac/AVAudioCaptureSource.mm_sec4
89
    return source;
100
    return source;
90
}
101
}
91
102
103
RealtimeMediaSource::CaptureFactory& AVAudioCaptureSource::factory()
104
{
105
    static NeverDestroyed<AVAudioCaptureSourceFactory> factory;
106
    return factory.get();
107
}
108
92
AVAudioCaptureSource::AVAudioCaptureSource(AVCaptureDeviceTypedef* device, const AtomicString& id)
109
AVAudioCaptureSource::AVAudioCaptureSource(AVCaptureDeviceTypedef* device, const AtomicString& id)
93
    : AVMediaCaptureSource(device, id, Type::Audio)
110
    : AVMediaCaptureSource(device, id, Type::Audio)
94
{
111
{
- a/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.h -1 lines
Lines 60-66 protected: a/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.h_sec1
60
    AVCaptureDeviceManager();
60
    AVCaptureDeviceManager();
61
    ~AVCaptureDeviceManager() final;
61
    ~AVCaptureDeviceManager() final;
62
62
63
    RefPtr<RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice&, const MediaConstraints*, String&) final;
64
    void refreshCaptureDevices() final;
63
    void refreshCaptureDevices() final;
65
    void registerForDeviceNotifications();
64
    void registerForDeviceNotifications();
66
65
- a/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm -12 lines
Lines 176-193 Vector<CaptureDevice> AVCaptureDeviceManager::getSourcesInfo() a/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm_sec1
176
    return CaptureDeviceManager::getSourcesInfo();
176
    return CaptureDeviceManager::getSourcesInfo();
177
}
177
}
178
178
179
RefPtr<RealtimeMediaSource> AVCaptureDeviceManager::createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice& captureDevice, const MediaConstraints* constraints, String& invalidConstraint)
180
{
181
    AVCaptureDeviceTypedef *device = [getAVCaptureDeviceClass() deviceWithUniqueID:captureDevice.persistentId()];
182
    if (!device)
183
        return nullptr;
184
185
    if (captureDevice.type() == CaptureDevice::DeviceType::Audio)
186
        return AVAudioCaptureSource::create(device, emptyString(), constraints, invalidConstraint);
187
188
    return AVVideoCaptureSource::create(device, emptyString(), constraints, invalidConstraint);
189
}
190
191
void AVCaptureDeviceManager::registerForDeviceNotifications()
179
void AVCaptureDeviceManager::registerForDeviceNotifications()
192
{
180
{
193
    [[NSNotificationCenter defaultCenter] addObserver:m_objcObserver.get() selector:@selector(deviceConnected:) name:AVCaptureDeviceWasConnectedNotification object:nil];
181
    [[NSNotificationCenter defaultCenter] addObserver:m_objcObserver.get() selector:@selector(deviceConnected:) name:AVCaptureDeviceWasConnectedNotification object:nil];
- a/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h +1 lines
Lines 40-45 OBJC_CLASS AVCaptureOutput; a/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h_sec1
40
OBJC_CLASS AVCaptureSession;
40
OBJC_CLASS AVCaptureSession;
41
OBJC_CLASS AVCaptureVideoDataOutput;
41
OBJC_CLASS AVCaptureVideoDataOutput;
42
OBJC_CLASS NSError;
42
OBJC_CLASS NSError;
43
OBJC_CLASS NSNotification;
43
OBJC_CLASS WebCoreAVMediaCaptureSourceObserver;
44
OBJC_CLASS WebCoreAVMediaCaptureSourceObserver;
44
45
45
typedef struct opaqueCMSampleBuffer *CMSampleBufferRef;
46
typedef struct opaqueCMSampleBuffer *CMSampleBufferRef;
- a/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h +2 lines
Lines 47-52 class AVVideoCaptureSource : public AVMediaCaptureSource { a/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h_sec1
47
public:
47
public:
48
    static RefPtr<AVMediaCaptureSource> create(AVCaptureDevice*, const AtomicString&, const MediaConstraints*, String&);
48
    static RefPtr<AVMediaCaptureSource> create(AVCaptureDevice*, const AtomicString&, const MediaConstraints*, String&);
49
49
50
    WEBCORE_EXPORT static CaptureFactory& factory();
51
50
    int32_t width() const { return m_width; }
52
    int32_t width() const { return m_width; }
51
    int32_t height() const { return m_height; }
53
    int32_t height() const { return m_height; }
52
54
- a/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm +15 lines
Lines 109-114 const OSType videoCaptureFormat = kCVPixelFormatType_420YpCbCr8Planar; a/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm_sec1
109
const OSType videoCaptureFormat = kCVPixelFormatType_420YpCbCr8BiPlanarFullRange;
109
const OSType videoCaptureFormat = kCVPixelFormatType_420YpCbCr8BiPlanarFullRange;
110
#endif
110
#endif
111
111
112
class AVVideoCaptureSourceFactory : public RealtimeMediaSource::CaptureFactory {
113
public:
114
    RefPtr<RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice& captureDevice, const MediaConstraints* constraints, String& invalidConstraint) final {
115
        AVCaptureDeviceTypedef *device = [getAVCaptureDeviceClass() deviceWithUniqueID:captureDevice.persistentId()];
116
        ASSERT(!device || (captureDevice.type() == CaptureDevice::DeviceType::Video));
117
        return device ? AVVideoCaptureSource::create(device, emptyString(), constraints, invalidConstraint) : nullptr;
118
    }
119
};
120
112
RefPtr<AVMediaCaptureSource> AVVideoCaptureSource::create(AVCaptureDeviceTypedef* device, const AtomicString& id, const MediaConstraints* constraints, String& invalidConstraint)
121
RefPtr<AVMediaCaptureSource> AVVideoCaptureSource::create(AVCaptureDeviceTypedef* device, const AtomicString& id, const MediaConstraints* constraints, String& invalidConstraint)
113
{
122
{
114
    auto source = adoptRef(new AVVideoCaptureSource(device, id));
123
    auto source = adoptRef(new AVVideoCaptureSource(device, id));
Lines 123-128 RefPtr<AVMediaCaptureSource> AVVideoCaptureSource::create(AVCaptureDeviceTypedef a/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm_sec2
123
    return source;
132
    return source;
124
}
133
}
125
134
135
RealtimeMediaSource::CaptureFactory& AVVideoCaptureSource::factory()
136
{
137
    static NeverDestroyed<AVVideoCaptureSourceFactory> factory;
138
    return factory.get();
139
}
140
126
AVVideoCaptureSource::AVVideoCaptureSource(AVCaptureDeviceTypedef* device, const AtomicString& id)
141
AVVideoCaptureSource::AVVideoCaptureSource(AVCaptureDeviceTypedef* device, const AtomicString& id)
127
    : AVMediaCaptureSource(device, id, Type::Video)
142
    : AVMediaCaptureSource(device, id, Type::Video)
128
{
143
{
- a/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp -11 / +65 lines
Lines 33-39 a/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp_sec1
33
#if ENABLE(MEDIA_STREAM)
33
#if ENABLE(MEDIA_STREAM)
34
#include "RealtimeMediaSourceCenterMac.h"
34
#include "RealtimeMediaSourceCenterMac.h"
35
35
36
#include "AVAudioCaptureSource.h"
36
#include "AVCaptureDeviceManager.h"
37
#include "AVCaptureDeviceManager.h"
38
#include "AVVideoCaptureSource.h"
37
#include "Logging.h"
39
#include "Logging.h"
38
#include "MediaStreamPrivate.h"
40
#include "MediaStreamPrivate.h"
39
#include <wtf/MainThread.h>
41
#include <wtf/MainThread.h>
Lines 60-65 RealtimeMediaSourceCenterMac::RealtimeMediaSourceCenterMac() a/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp_sec2
60
    m_supportedConstraints.setSupportsEchoCancellation(false);
62
    m_supportedConstraints.setSupportsEchoCancellation(false);
61
    m_supportedConstraints.setSupportsDeviceId(true);
63
    m_supportedConstraints.setSupportsDeviceId(true);
62
    m_supportedConstraints.setSupportsGroupId(true);
64
    m_supportedConstraints.setSupportsGroupId(true);
65
66
    m_audioFactory = &AVAudioCaptureSource::factory();
67
    m_videoFactory = &AVVideoCaptureSource::factory();
63
}
68
}
64
69
65
RealtimeMediaSourceCenterMac::~RealtimeMediaSourceCenterMac()
70
RealtimeMediaSourceCenterMac::~RealtimeMediaSourceCenterMac()
Lines 73-79 void RealtimeMediaSourceCenterMac::validateRequestConstraints(ValidConstraintsHa a/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp_sec3
73
    String invalidConstraint;
78
    String invalidConstraint;
74
79
75
    if (audioConstraints.isValid()) {
80
    if (audioConstraints.isValid()) {
76
        audioSourceUIDs = AVCaptureDeviceManager::singleton().bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type::Audio, audioConstraints, invalidConstraint);
81
        audioSourceUIDs = bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type::Audio, audioConstraints, invalidConstraint);
77
        if (!invalidConstraint.isEmpty()) {
82
        if (!invalidConstraint.isEmpty()) {
78
            invalidHandler(invalidConstraint);
83
            invalidHandler(invalidConstraint);
79
            return;
84
            return;
Lines 81-87 void RealtimeMediaSourceCenterMac::validateRequestConstraints(ValidConstraintsHa a/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp_sec4
81
    }
86
    }
82
87
83
    if (videoConstraints.isValid()) {
88
    if (videoConstraints.isValid()) {
84
        videoSourceUIDs = AVCaptureDeviceManager::singleton().bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type::Video, videoConstraints, invalidConstraint);
89
        videoSourceUIDs = bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type::Video, videoConstraints, invalidConstraint);
85
        if (!invalidConstraint.isEmpty()) {
90
        if (!invalidConstraint.isEmpty()) {
86
            invalidHandler(invalidConstraint);
91
            invalidHandler(invalidConstraint);
87
            return;
92
            return;
Lines 98-120 void RealtimeMediaSourceCenterMac::createMediaStream(NewMediaStreamHandler compl a/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp_sec5
98
    String invalidConstraint;
103
    String invalidConstraint;
99
104
100
    if (!audioDeviceID.isEmpty()) {
105
    if (!audioDeviceID.isEmpty()) {
101
        auto audioSource = AVCaptureDeviceManager::singleton().sourceWithUID(audioDeviceID, RealtimeMediaSource::Type::Audio, audioConstraints, invalidConstraint);
106
        auto audioDevice = AVCaptureDeviceManager::singleton().deviceWithUID(audioDeviceID, RealtimeMediaSource::Audio);
107
        if (audioDevice && m_audioFactory) {
108
            if (auto audioSource = m_audioFactory->createMediaSourceForCaptureDeviceWithConstraints(audioDevice.value(), audioConstraints, invalidConstraint))
109
                audioSources.append(audioSource.releaseNonNull());
102
#if !LOG_DISABLED
110
#if !LOG_DISABLED
103
        if (!invalidConstraint.isEmpty())
111
            if (!invalidConstraint.isEmpty())
104
            LOG(Media, "RealtimeMediaSourceCenterMac::createMediaStream(%p), audio constraints failed to apply: %s", this, invalidConstraint.utf8().data());
112
                LOG(Media, "RealtimeMediaSourceCenterMac::createMediaStream(%p), audio constraints failed to apply: %s", this, invalidConstraint.utf8().data());
105
#endif
113
#endif
106
114
        }
107
        if (audioSource)
108
            audioSources.append(audioSource.releaseNonNull());
109
    }
115
    }
110
    if (!videoDeviceID.isEmpty()) {
116
    if (!videoDeviceID.isEmpty()) {
111
        auto videoSource = AVCaptureDeviceManager::singleton().sourceWithUID(videoDeviceID, RealtimeMediaSource::Type::Video, videoConstraints, invalidConstraint);
117
        auto videoDevice = AVCaptureDeviceManager::singleton().deviceWithUID(videoDeviceID, RealtimeMediaSource::Video);
118
        if (videoDevice && m_videoFactory) {
119
            if (auto videoSource = m_videoFactory->createMediaSourceForCaptureDeviceWithConstraints(videoDevice.value(), videoConstraints, invalidConstraint))
120
                videoSources.append(videoSource.releaseNonNull());
112
#if !LOG_DISABLED
121
#if !LOG_DISABLED
113
        if (!invalidConstraint.isEmpty())
122
        if (!invalidConstraint.isEmpty())
114
            LOG(Media, "RealtimeMediaSourceCenterMac::createMediaStream(%p), video constraints failed to apply: %s", this, invalidConstraint.utf8().data());
123
            LOG(Media, "RealtimeMediaSourceCenterMac::createMediaStream(%p), video constraints failed to apply: %s", this, invalidConstraint.utf8().data());
115
#endif
124
#endif
116
        if (videoSource)
125
        }
117
            videoSources.append(videoSource.releaseNonNull());
118
    }
126
    }
119
127
120
    if (videoSources.isEmpty() && audioSources.isEmpty())
128
    if (videoSources.isEmpty() && audioSources.isEmpty())
Lines 128-133 Vector<CaptureDevice> RealtimeMediaSourceCenterMac::getMediaStreamDevices() a/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp_sec6
128
    return AVCaptureDeviceManager::singleton().getSourcesInfo();
136
    return AVCaptureDeviceManager::singleton().getSourcesInfo();
129
}
137
}
130
138
139
Vector<String> RealtimeMediaSourceCenterMac::bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type type, const MediaConstraints& constraints, String& invalidConstraint)
140
{
141
    Vector<RefPtr<RealtimeMediaSource>> bestSources;
142
143
    struct {
144
        bool operator()(RefPtr<RealtimeMediaSource> a, RefPtr<RealtimeMediaSource> b)
145
        {
146
            return a->fitnessScore() < b->fitnessScore();
147
        }
148
    } sortBasedOnFitnessScore;
149
150
    CaptureDevice::DeviceType deviceType = type == RealtimeMediaSource::Video ? CaptureDevice::DeviceType::Video : CaptureDevice::DeviceType::Audio;
151
    for (auto& captureDevice : getMediaStreamDevices()) {
152
        if (!captureDevice.enabled() || captureDevice.type() != deviceType)
153
            continue;
154
155
        RealtimeMediaSource::CaptureFactory* factory = type == RealtimeMediaSource::Video ? m_videoFactory : m_audioFactory;
156
        if (!factory)
157
            continue;
158
159
        if (auto captureSource = factory->createMediaSourceForCaptureDeviceWithConstraints(captureDevice, &constraints, invalidConstraint))
160
            bestSources.append(captureSource.leakRef());
161
    }
162
163
    Vector<String> sourceUIDs;
164
    if (bestSources.isEmpty())
165
        return sourceUIDs;
166
167
    sourceUIDs.reserveInitialCapacity(bestSources.size());
168
    std::sort(bestSources.begin(), bestSources.end(), sortBasedOnFitnessScore);
169
    for (auto& device : bestSources)
170
        sourceUIDs.uncheckedAppend(device->persistentID());
171
172
    return sourceUIDs;
173
}
174
175
RealtimeMediaSource::CaptureFactory* RealtimeMediaSourceCenterMac::defaultAudioFactory()
176
{
177
    return &AVAudioCaptureSource::factory();
178
}
179
180
RealtimeMediaSource::CaptureFactory* RealtimeMediaSourceCenterMac::defaultVideoFactory()
181
{
182
    return &AVVideoCaptureSource::factory();
183
}
184
131
} // namespace WebCore
185
} // namespace WebCore
132
186
133
#endif // ENABLE(MEDIA_STREAM)
187
#endif // ENABLE(MEDIA_STREAM)
- a/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.h +5 lines
Lines 50-55 private: a/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.h_sec1
50
    void validateRequestConstraints(ValidConstraintsHandler validHandler, InvalidConstraintsHandler invalidHandler, const MediaConstraints& audioConstraints, const MediaConstraints& videoConstraints) final;
50
    void validateRequestConstraints(ValidConstraintsHandler validHandler, InvalidConstraintsHandler invalidHandler, const MediaConstraints& audioConstraints, const MediaConstraints& videoConstraints) final;
51
    void createMediaStream(NewMediaStreamHandler, const String& audioDeviceID, const String& videoDeviceID, const MediaConstraints* audioConstraints, const MediaConstraints* videoConstraints) final;
51
    void createMediaStream(NewMediaStreamHandler, const String& audioDeviceID, const String& videoDeviceID, const MediaConstraints* audioConstraints, const MediaConstraints* videoConstraints) final;
52
    Vector<CaptureDevice> getMediaStreamDevices() final;
52
    Vector<CaptureDevice> getMediaStreamDevices() final;
53
54
    Vector<String> bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type, const MediaConstraints&, String& invalidConstraint);
55
56
    RealtimeMediaSource::CaptureFactory* defaultAudioFactory() final;
57
    RealtimeMediaSource::CaptureFactory* defaultVideoFactory() final;
53
};
58
};
54
59
55
} // namespace WebCore
60
} // namespace WebCore
- a/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp -1 / +17 lines
Lines 32-37 a/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp_sec1
32
#include "MockRealtimeAudioSource.h"
32
#include "MockRealtimeAudioSource.h"
33
33
34
#if ENABLE(MEDIA_STREAM)
34
#if ENABLE(MEDIA_STREAM)
35
#include "CaptureDevice.h"
35
#include "Logging.h"
36
#include "Logging.h"
36
#include "MediaConstraints.h"
37
#include "MediaConstraints.h"
37
#include "NotImplemented.h"
38
#include "NotImplemented.h"
Lines 40-45 a/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp_sec2
40
41
41
namespace WebCore {
42
namespace WebCore {
42
43
44
class MockRealtimeAudioSourceFactory : public RealtimeMediaSource::CaptureFactory {
45
public:
46
    RefPtr<RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice& captureDevice, const MediaConstraints* constraints, String&) final {
47
        if (captureDevice.type() == CaptureDevice::DeviceType::Audio)
48
            return MockRealtimeAudioSource::create(captureDevice.label(), constraints);
49
        return nullptr;
50
    }
51
};
52
43
#if !PLATFORM(MAC) && !PLATFORM(IOS)
53
#if !PLATFORM(MAC) && !PLATFORM(IOS)
44
RefPtr<MockRealtimeAudioSource> MockRealtimeAudioSource::create(const String& name, const MediaConstraints* constraints)
54
RefPtr<MockRealtimeAudioSource> MockRealtimeAudioSource::create(const String& name, const MediaConstraints* constraints)
45
{
55
{
Lines 57-63 RefPtr<MockRealtimeAudioSource> MockRealtimeAudioSource::createMuted(const Strin a/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp_sec3
57
    return source;
67
    return source;
58
}
68
}
59
#endif
69
#endif
60
    
70
71
RealtimeMediaSource::CaptureFactory& MockRealtimeAudioSource::factory()
72
{
73
    NeverDestroyed<MockRealtimeAudioSourceFactory> factory;
74
    return factory.get();
75
}
76
61
MockRealtimeAudioSource::MockRealtimeAudioSource(const String& name)
77
MockRealtimeAudioSource::MockRealtimeAudioSource(const String& name)
62
    : MockRealtimeMediaSource(createCanonicalUUIDString(), RealtimeMediaSource::Type::Audio, name)
78
    : MockRealtimeMediaSource(createCanonicalUUIDString(), RealtimeMediaSource::Type::Audio, name)
63
    , m_timer(RunLoop::current(), this, &MockRealtimeAudioSource::tick)
79
    , m_timer(RunLoop::current(), this, &MockRealtimeAudioSource::tick)
- a/Source/WebCore/platform/mock/MockRealtimeAudioSource.h +2 lines
Lines 45-50 public: a/Source/WebCore/platform/mock/MockRealtimeAudioSource.h_sec1
45
    static RefPtr<MockRealtimeAudioSource> create(const String&, const MediaConstraints*);
45
    static RefPtr<MockRealtimeAudioSource> create(const String&, const MediaConstraints*);
46
    static RefPtr<MockRealtimeAudioSource> createMuted(const String& name);
46
    static RefPtr<MockRealtimeAudioSource> createMuted(const String& name);
47
47
48
    static CaptureFactory& factory();
49
48
    virtual ~MockRealtimeAudioSource() = default;
50
    virtual ~MockRealtimeAudioSource() = default;
49
51
50
protected:
52
protected:
- a/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp +11 lines
Lines 131-136 Vector<CaptureDevice> MockRealtimeMediaSourceCenter::getMediaStreamDevices() a/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp_sec1
131
    return sources;
131
    return sources;
132
}
132
}
133
133
134
RealtimeMediaSource::CaptureFactory* MockRealtimeMediaSourceCenter::defaultAudioFactory()
135
{
136
    return &MockRealtimeAudioSource::factory();
137
}
138
139
RealtimeMediaSource::CaptureFactory* MockRealtimeMediaSourceCenter::defaultVideoFactory()
140
{
141
    return &MockRealtimeVideoSource::factory();
142
}
143
144
134
} // namespace WebCore
145
} // namespace WebCore
135
146
136
#endif // ENABLE(MEDIA_STREAM)
147
#endif // ENABLE(MEDIA_STREAM)
- a/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h +3 lines
Lines 44-49 private: a/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h_sec1
44
    void validateRequestConstraints(ValidConstraintsHandler validHandler, InvalidConstraintsHandler invalidHandler, const MediaConstraints& audioConstraints, const MediaConstraints& videoConstraints) final;
44
    void validateRequestConstraints(ValidConstraintsHandler validHandler, InvalidConstraintsHandler invalidHandler, const MediaConstraints& audioConstraints, const MediaConstraints& videoConstraints) final;
45
    Vector<CaptureDevice> getMediaStreamDevices() final;
45
    Vector<CaptureDevice> getMediaStreamDevices() final;
46
    void createMediaStream(NewMediaStreamHandler, const String& audioDeviceID, const String& videoDeviceID, const MediaConstraints* audioConstraints, const MediaConstraints* videoConstraints) final;
46
    void createMediaStream(NewMediaStreamHandler, const String& audioDeviceID, const String& videoDeviceID, const MediaConstraints* audioConstraints, const MediaConstraints* videoConstraints) final;
47
48
    RealtimeMediaSource::CaptureFactory* defaultAudioFactory() final;
49
    RealtimeMediaSource::CaptureFactory* defaultVideoFactory() final;
47
};
50
};
48
51
49
}
52
}
- a/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp +16 lines
Lines 32-37 a/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp_sec1
32
#include "MockRealtimeVideoSource.h"
32
#include "MockRealtimeVideoSource.h"
33
33
34
#if ENABLE(MEDIA_STREAM)
34
#if ENABLE(MEDIA_STREAM)
35
#include "CaptureDevice.h"
35
#include "GraphicsContext.h"
36
#include "GraphicsContext.h"
36
#include "ImageBuffer.h"
37
#include "ImageBuffer.h"
37
#include "IntRect.h"
38
#include "IntRect.h"
Lines 47-52 a/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp_sec2
47
48
48
namespace WebCore {
49
namespace WebCore {
49
50
51
class MockRealtimeVideoSourceFactory : public RealtimeMediaSource::CaptureFactory {
52
public:
53
    RefPtr<RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice& captureDevice, const MediaConstraints* constraints, String&) final {
54
        if (captureDevice.type() == CaptureDevice::DeviceType::Video)
55
            return MockRealtimeVideoSource::create(captureDevice.label(), constraints);
56
        return nullptr;
57
    }
58
};
59
50
#if !PLATFORM(MAC) && !PLATFORM(IOS)
60
#if !PLATFORM(MAC) && !PLATFORM(IOS)
51
RefPtr<MockRealtimeVideoSource> MockRealtimeVideoSource::create(const String& name, const MediaConstraints* constraints)
61
RefPtr<MockRealtimeVideoSource> MockRealtimeVideoSource::create(const String& name, const MediaConstraints* constraints)
52
{
62
{
Lines 65-70 RefPtr<MockRealtimeVideoSource> MockRealtimeVideoSource::createMuted(const Strin a/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp_sec3
65
}
75
}
66
#endif
76
#endif
67
77
78
RealtimeMediaSource::CaptureFactory& MockRealtimeVideoSource::factory()
79
{
80
    NeverDestroyed<MockRealtimeVideoSourceFactory> factory;
81
    return factory.get();
82
}
83
68
MockRealtimeVideoSource::MockRealtimeVideoSource(const String& name)
84
MockRealtimeVideoSource::MockRealtimeVideoSource(const String& name)
69
    : MockRealtimeMediaSource(createCanonicalUUIDString(), RealtimeMediaSource::Type::Video, name)
85
    : MockRealtimeMediaSource(createCanonicalUUIDString(), RealtimeMediaSource::Type::Video, name)
70
    , m_timer(RunLoop::current(), this, &MockRealtimeVideoSource::generateFrame)
86
    , m_timer(RunLoop::current(), this, &MockRealtimeVideoSource::generateFrame)
- a/Source/WebCore/platform/mock/MockRealtimeVideoSource.h +2 lines
Lines 49-54 public: a/Source/WebCore/platform/mock/MockRealtimeVideoSource.h_sec1
49
    static RefPtr<MockRealtimeVideoSource> create(const String&, const MediaConstraints*);
49
    static RefPtr<MockRealtimeVideoSource> create(const String&, const MediaConstraints*);
50
    static RefPtr<MockRealtimeVideoSource> createMuted(const String& name);
50
    static RefPtr<MockRealtimeVideoSource> createMuted(const String& name);
51
51
52
    static CaptureFactory& factory();
53
52
    virtual ~MockRealtimeVideoSource() { }
54
    virtual ~MockRealtimeVideoSource() { }
53
55
54
protected:
56
protected:
- a/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj +12 lines
Lines 1881-1886 a/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj_sec1
1881
		CD19A26E1A13E834008D650E /* WebDiagnosticLoggingClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CD19A26A1A13E821008D650E /* WebDiagnosticLoggingClient.h */; };
1881
		CD19A26E1A13E834008D650E /* WebDiagnosticLoggingClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CD19A26A1A13E821008D650E /* WebDiagnosticLoggingClient.h */; };
1882
		CD5C66A0134B9D38004FE2A8 /* InjectedBundlePageFullScreenClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD5C669E134B9D36004FE2A8 /* InjectedBundlePageFullScreenClient.cpp */; };
1882
		CD5C66A0134B9D38004FE2A8 /* InjectedBundlePageFullScreenClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD5C669E134B9D36004FE2A8 /* InjectedBundlePageFullScreenClient.cpp */; };
1883
		CD5C66A1134B9D38004FE2A8 /* InjectedBundlePageFullScreenClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CD5C669F134B9D37004FE2A8 /* InjectedBundlePageFullScreenClient.h */; };
1883
		CD5C66A1134B9D38004FE2A8 /* InjectedBundlePageFullScreenClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CD5C669F134B9D37004FE2A8 /* InjectedBundlePageFullScreenClient.h */; };
1884
		CD6178141E6DE9A000FDA57D /* WebUserMediaClientMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = CD6178121E6DE9A000FDA57D /* WebUserMediaClientMac.mm */; };
1884
		CD6F75F4131B66D000D6B21E /* WebFullScreenManagerProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD73BA3E131A2E8A00EEDED2 /* WebFullScreenManagerProxy.cpp */; };
1885
		CD6F75F4131B66D000D6B21E /* WebFullScreenManagerProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD73BA3E131A2E8A00EEDED2 /* WebFullScreenManagerProxy.cpp */; };
1885
		CD73BA47131ACC9A00EEDED2 /* WebFullScreenManagerProxyMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD73BA45131ACC8800EEDED2 /* WebFullScreenManagerProxyMessageReceiver.cpp */; };
1886
		CD73BA47131ACC9A00EEDED2 /* WebFullScreenManagerProxyMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD73BA45131ACC8800EEDED2 /* WebFullScreenManagerProxyMessageReceiver.cpp */; };
1886
		CD73BA4E131ACDB700EEDED2 /* WebFullScreenManagerMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD73BA48131ACD8E00EEDED2 /* WebFullScreenManagerMessageReceiver.cpp */; };
1887
		CD73BA4E131ACDB700EEDED2 /* WebFullScreenManagerMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD73BA48131ACD8E00EEDED2 /* WebFullScreenManagerMessageReceiver.cpp */; };
Lines 4168-4173 a/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj_sec2
4168
		CD19A26A1A13E821008D650E /* WebDiagnosticLoggingClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebDiagnosticLoggingClient.h; sourceTree = "<group>"; };
4169
		CD19A26A1A13E821008D650E /* WebDiagnosticLoggingClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebDiagnosticLoggingClient.h; sourceTree = "<group>"; };
4169
		CD5C669E134B9D36004FE2A8 /* InjectedBundlePageFullScreenClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundlePageFullScreenClient.cpp; sourceTree = "<group>"; };
4170
		CD5C669E134B9D36004FE2A8 /* InjectedBundlePageFullScreenClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundlePageFullScreenClient.cpp; sourceTree = "<group>"; };
4170
		CD5C669F134B9D37004FE2A8 /* InjectedBundlePageFullScreenClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InjectedBundlePageFullScreenClient.h; sourceTree = "<group>"; };
4171
		CD5C669F134B9D37004FE2A8 /* InjectedBundlePageFullScreenClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InjectedBundlePageFullScreenClient.h; sourceTree = "<group>"; };
4172
		CD6178121E6DE9A000FDA57D /* WebUserMediaClientMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WebUserMediaClientMac.mm; path = cocoa/WebUserMediaClientMac.mm; sourceTree = "<group>"; };
4171
		CD73BA37131A29FE00EEDED2 /* WebFullScreenManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebFullScreenManager.cpp; path = FullScreen/WebFullScreenManager.cpp; sourceTree = "<group>"; };
4173
		CD73BA37131A29FE00EEDED2 /* WebFullScreenManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebFullScreenManager.cpp; path = FullScreen/WebFullScreenManager.cpp; sourceTree = "<group>"; };
4172
		CD73BA38131A29FE00EEDED2 /* WebFullScreenManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebFullScreenManager.h; path = FullScreen/WebFullScreenManager.h; sourceTree = "<group>"; };
4174
		CD73BA38131A29FE00EEDED2 /* WebFullScreenManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebFullScreenManager.h; path = FullScreen/WebFullScreenManager.h; sourceTree = "<group>"; };
4173
		CD73BA39131A29FE00EEDED2 /* WebFullScreenManager.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = WebFullScreenManager.messages.in; path = FullScreen/WebFullScreenManager.messages.in; sourceTree = "<group>"; };
4175
		CD73BA39131A29FE00EEDED2 /* WebFullScreenManager.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = WebFullScreenManager.messages.in; path = FullScreen/WebFullScreenManager.messages.in; sourceTree = "<group>"; };
Lines 6444-6449 a/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj_sec3
6444
		BC032D5D10F437220058C15A /* WebCoreSupport */ = {
6446
		BC032D5D10F437220058C15A /* WebCoreSupport */ = {
6445
			isa = PBXGroup;
6447
			isa = PBXGroup;
6446
			children = (
6448
			children = (
6449
				CD6178111E6DE98000FDA57D /* cocoa */,
6447
				2D28F3DF1885CCB4004B9EAE /* ios */,
6450
				2D28F3DF1885CCB4004B9EAE /* ios */,
6448
				BC111ADE112F5B9A00337BAB /* mac */,
6451
				BC111ADE112F5B9A00337BAB /* mac */,
6449
				1A7284441959ED100007BCE5 /* SessionStateConversion.cpp */,
6452
				1A7284441959ED100007BCE5 /* SessionStateConversion.cpp */,
Lines 7812-7817 a/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj_sec4
7812
			name = forms;
7815
			name = forms;
7813
			sourceTree = "<group>";
7816
			sourceTree = "<group>";
7814
		};
7817
		};
7818
		CD6178111E6DE98000FDA57D /* cocoa */ = {
7819
			isa = PBXGroup;
7820
			children = (
7821
				CD6178121E6DE9A000FDA57D /* WebUserMediaClientMac.mm */,
7822
			);
7823
			name = cocoa;
7824
			sourceTree = "<group>";
7825
		};
7815
		CD73BA3D131A2A2100EEDED2 /* FullScreen */ = {
7826
		CD73BA3D131A2A2100EEDED2 /* FullScreen */ = {
7816
			isa = PBXGroup;
7827
			isa = PBXGroup;
7817
			children = (
7828
			children = (
Lines 9961-9966 a/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj_sec5
9961
				753E3E0D1887398500188496 /* SessionTracker.cpp in Sources */,
9972
				753E3E0D1887398500188496 /* SessionTracker.cpp in Sources */,
9962
				1A6420E412DCE2FF00CAAE2C /* ShareableBitmap.cpp in Sources */,
9973
				1A6420E412DCE2FF00CAAE2C /* ShareableBitmap.cpp in Sources */,
9963
				C01A260112662F2100C9ED55 /* ShareableBitmapCG.cpp in Sources */,
9974
				C01A260112662F2100C9ED55 /* ShareableBitmapCG.cpp in Sources */,
9975
				CD6178141E6DE9A000FDA57D /* WebUserMediaClientMac.mm in Sources */,
9964
				51217460164C20E30037A5C1 /* ShareableResource.cpp in Sources */,
9976
				51217460164C20E30037A5C1 /* ShareableResource.cpp in Sources */,
9965
				4450AEC01DC3FAE5009943F2 /* SharedMemoryCocoa.cpp in Sources */,
9977
				4450AEC01DC3FAE5009943F2 /* SharedMemoryCocoa.cpp in Sources */,
9966
				2DAF06D718BD1A470081CEB1 /* SmartMagnificationController.mm in Sources */,
9978
				2DAF06D718BD1A470081CEB1 /* SmartMagnificationController.mm in Sources */,
- a/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.cpp +8 lines
Lines 33-38 namespace WebKit { a/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.cpp_sec1
33
WebUserMediaClient::WebUserMediaClient(WebPage& page)
33
WebUserMediaClient::WebUserMediaClient(WebPage& page)
34
    : m_page(page)
34
    : m_page(page)
35
{
35
{
36
    initializeFactories();
36
}
37
}
37
38
38
void WebUserMediaClient::pageDestroyed()
39
void WebUserMediaClient::pageDestroyed()
Lines 60-65 void WebUserMediaClient::cancelMediaDevicesEnumerationRequest(MediaDevicesEnumer a/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.cpp_sec2
60
    m_page.userMediaPermissionRequestManager().cancelMediaDevicesEnumeration(request);
61
    m_page.userMediaPermissionRequestManager().cancelMediaDevicesEnumeration(request);
61
}
62
}
62
63
64
#if !PLATFORM(COCOA)
65
void WebUserMediaClient::initializeFactories()
66
{
67
68
}
69
#endif
70
63
} // namespace WebKit;
71
} // namespace WebKit;
64
72
65
#endif // MEDIA_STREAM
73
#endif // MEDIA_STREAM
- a/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.h +2 lines
Lines 42-47 private: a/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.h_sec1
42
    void enumerateMediaDevices(WebCore::MediaDevicesEnumerationRequest&) final;
42
    void enumerateMediaDevices(WebCore::MediaDevicesEnumerationRequest&) final;
43
    void cancelMediaDevicesEnumerationRequest(WebCore::MediaDevicesEnumerationRequest&) final;
43
    void cancelMediaDevicesEnumerationRequest(WebCore::MediaDevicesEnumerationRequest&) final;
44
44
45
    void initializeFactories();
46
45
    WebPage& m_page;
47
    WebPage& m_page;
46
};
48
};
47
49
- a/Source/WebKit2/WebProcess/WebCoreSupport/cocoa/WebUserMediaClientMac.mm +63 lines
Line 0 a/Source/WebKit2/WebProcess/WebCoreSupport/cocoa/WebUserMediaClientMac.mm_sec1
1
/*
2
 * Copyright (C) 2017 Apple Inc. All rights reserved.
3
 *
4
 * Redistribution and use in source and binary forms, with or without
5
 * modification, are permitted provided that the following conditions
6
 * are met:
7
 * 1. Redistributions of source code must retain the above copyright
8
 *    notice, this list of conditions and the following disclaimer.
9
 * 2. Redistributions in binary form must reproduce the above copyright
10
 *    notice, this list of conditions and the following disclaimer in the
11
 *    documentation and/or other materials provided with the distribution.
12
 *
13
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23
 * THE POSSIBILITY OF SUCH DAMAGE.
24
 */
25
26
#include "config.h"
27
#include "WebUserMediaClient.h"
28
29
#if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA)
30
31
#import <WebCore/RealtimeMediaSourceCenter.h>
32
#import <wtf/NeverDestroyed.h>
33
34
using namespace WebCore;
35
36
namespace WebKit {
37
38
class WebUserMediaClientAudioFactory final : public RealtimeMediaSource::CaptureFactory {
39
public:
40
    static WebUserMediaClientAudioFactory& singleton()
41
    {
42
        static NeverDestroyed<WebUserMediaClientAudioFactory> factory;
43
        return factory;
44
    }
45
46
private:
47
    RefPtr<RealtimeMediaSource> createMediaSourceForCaptureDeviceWithConstraints(const CaptureDevice& device, const MediaConstraints* constraints, String& invalidConstraints) final {
48
        auto* factory = RealtimeMediaSourceCenter::singleton().defaultAudioFactory();
49
        return factory ? factory->createMediaSourceForCaptureDeviceWithConstraints(device, constraints, invalidConstraints) : nullptr;
50
    }
51
};
52
53
void WebUserMediaClient::initializeFactories()
54
{
55
    static dispatch_once_t onceToken;
56
    dispatch_once(&onceToken, ^ {
57
        WebCore::RealtimeMediaSourceCenter::singleton().setAudioFactory(WebUserMediaClientAudioFactory::singleton());
58
    });
59
}
60
61
}
62
63
#endif

Return to Bug 169227