Diff
Modified: trunk/LayoutTests/ChangeLog (253704 => 253705)
--- trunk/LayoutTests/ChangeLog 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/LayoutTests/ChangeLog 2019-12-18 19:40:07 UTC (rev 253705)
@@ -1,3 +1,12 @@
+2019-12-18 youenn fablet <you...@apple.com>
+
+ Add support for Audio Capture in GPUProcess
+ https://bugs.webkit.org/show_bug.cgi?id=205056
+
+ Reviewed by Eric Carlson.
+
+ * fast/mediastream/captureAudioInGPUProcess-expected.txt:
+
2019-12-18 Chris Dumez <cdu...@apple.com>
Unreviewed, rebaseline all service workers tests and unskip 2 that no longer time out.
Modified: trunk/LayoutTests/fast/mediastream/captureAudioInGPUProcess-expected.txt (253704 => 253705)
--- trunk/LayoutTests/fast/mediastream/captureAudioInGPUProcess-expected.txt 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/LayoutTests/fast/mediastream/captureAudioInGPUProcess-expected.txt 2019-12-18 19:40:07 UTC (rev 253705)
@@ -1,5 +1,4 @@
-CONSOLE MESSAGE: Failed to create MediaStream audio source: Audio capture in GPUProcess is not implemented
-FAIL Play audio captured in GPU process promise_test: Unhandled rejection with value: object "NotReadableError: The I/O read operation failed."
+PASS Play audio captured in GPU process
Modified: trunk/Source/WebCore/ChangeLog (253704 => 253705)
--- trunk/Source/WebCore/ChangeLog 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebCore/ChangeLog 2019-12-18 19:40:07 UTC (rev 253705)
@@ -1,3 +1,21 @@
+2019-12-18 youenn fablet <you...@apple.com>
+
+ Add support for Audio Capture in GPUProcess
+ https://bugs.webkit.org/show_bug.cgi?id=205056
+
+ Reviewed by Eric Carlson.
+
+ Export some WebCore headers.
+ Allow disabling the audio session debug assert in the GPU process.
+ No change of behavior.
+
+ * WebCore.xcodeproj/project.pbxproj:
+ * platform/mediastream/mac/BaseAudioSharedUnit.cpp:
+ (WebCore::BaseAudioSharedUnit::startUnit):
+ * platform/mediastream/mac/BaseAudioSharedUnit.h:
+ (WebCore::BaseAudioSharedUnit::setDisableAudioSessionCheck):
+ * platform/mediastream/mac/MockAudioSharedUnit.h:
+
2019-12-18 Eric Carlson <eric.carl...@apple.com>
Remove unused MediaPlayer methods
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (253704 => 253705)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2019-12-18 19:40:07 UTC (rev 253705)
@@ -1051,6 +1051,8 @@
4129C9AB1F59C573009D7403 /* ReadableStreamSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 418C395B1C8F0A610051C8A3 /* ReadableStreamSource.h */; settings = {ATTRIBUTES = (Private, ); }; };
4129C9AF1F59CF5B009D7403 /* ReadableStreamSink.h in Headers */ = {isa = PBXBuildFile; fileRef = 4129C9801F5861C7009D7403 /* ReadableStreamSink.h */; settings = {ATTRIBUTES = (Private, ); }; };
412DE4B8219285C00075F3A7 /* RTCRtpCapabilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 412DE4B6219285BF0075F3A7 /* RTCRtpCapabilities.h */; };
+ 412DEF1D23A9186600D840F6 /* MockAudioSharedUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 0744ECEB1E0C4AE5000D0944 /* MockAudioSharedUnit.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 412DEF1F23A918A300D840F6 /* BaseAudioSharedUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 4177F51E2382545E00C04486 /* BaseAudioSharedUnit.h */; settings = {ATTRIBUTES = (Private, ); }; };
4133CB8B20F80E9900E89B11 /* MediaStreamAudioSourceCocoa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4133CB8920F80E8600E89B11 /* MediaStreamAudioSourceCocoa.cpp */; };
4136C57A2398E5BE002497D3 /* InternalsMapLike.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4136C5782398E5B5002497D3 /* InternalsMapLike.cpp */; };
4136C57C2398ECCF002497D3 /* JSInternalsMapLike.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2D6F3E921C1F85550061DBD6 /* JSInternalsMapLike.cpp */; };
@@ -29112,6 +29114,7 @@
51A1B87D2087C4C000979A75 /* BackForwardItemIdentifier.h in Headers */,
BC124EE80C2641CD009E2349 /* BarProp.h in Headers */,
460BB6161D0A1BF000221812 /* Base64Utilities.h in Headers */,
+ 412DEF1F23A918A300D840F6 /* BaseAudioSharedUnit.h in Headers */,
379E61CA126CA5C400B63E8D /* BaseButtonInputType.h in Headers */,
379E61CC126CA5C400B63E8D /* BaseCheckableInputType.h in Headers */,
F5E0C65C1643C42C00D6CB69 /* BaseChooserOnlyDateAndTimeInputType.h in Headers */,
@@ -31491,6 +31494,7 @@
53B895AF19DC7ED9009CAA93 /* Microtasks.h in Headers */,
BC772C4F0C4EB3040083285F /* MIMETypeRegistry.h in Headers */,
52F10866162B6DA8009AC81E /* MixedContentChecker.h in Headers */,
+ 412DEF1D23A9186600D840F6 /* MockAudioSharedUnit.h in Headers */,
CDF2B0111820540600F2B424 /* MockBox.h in Headers */,
CDF4B7241E03BF8100E235A2 /* MockCDMFactory.h in Headers */,
CDF4B7201E03BF6F00E235A2 /* MockCDMFactory.idl in Headers */,
Modified: trunk/Source/WebCore/platform/mediastream/mac/BaseAudioSharedUnit.cpp (253704 => 253705)
--- trunk/Source/WebCore/platform/mediastream/mac/BaseAudioSharedUnit.cpp 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebCore/platform/mediastream/mac/BaseAudioSharedUnit.cpp 2019-12-18 19:40:07 UTC (rev 253705)
@@ -93,8 +93,10 @@
OSStatus BaseAudioSharedUnit::startUnit()
{
#if PLATFORM(IOS_FAMILY)
- PlatformMediaSessionManager::sharedManager().sessionCanProduceAudioChanged();
- ASSERT(AudioSession::sharedSession().category() == AudioSession::PlayAndRecord);
+ if (!m_disableAudioSessionCheck) {
+ PlatformMediaSessionManager::sharedManager().sessionCanProduceAudioChanged();
+ ASSERT(AudioSession::sharedSession().category() == AudioSession::PlayAndRecord);
+ }
#endif
if (auto error = startInternal()) {
Modified: trunk/Source/WebCore/platform/mediastream/mac/BaseAudioSharedUnit.h (253704 => 253705)
--- trunk/Source/WebCore/platform/mediastream/mac/BaseAudioSharedUnit.h 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebCore/platform/mediastream/mac/BaseAudioSharedUnit.h 2019-12-18 19:40:07 UTC (rev 253705)
@@ -76,6 +76,8 @@
virtual CapabilityValueOrRange sampleRateCapacities() const = 0;
+ void setDisableAudioSessionCheck(bool value) { m_disableAudioSessionCheck = value; };
+
protected:
void forEachClient(const Function<void(CoreAudioCaptureSource&)>&) const;
bool hasClients() const { return !m_clients.isEmpty(); }
@@ -103,6 +105,7 @@
HashSet<CoreAudioCaptureSource*> m_clients;
mutable RecursiveLock m_clientsLock;
+ bool m_disableAudioSessionCheck { false };
};
} // namespace WebCore
Modified: trunk/Source/WebCore/platform/mediastream/mac/MockAudioSharedUnit.h (253704 => 253705)
--- trunk/Source/WebCore/platform/mediastream/mac/MockAudioSharedUnit.h 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebCore/platform/mediastream/mac/MockAudioSharedUnit.h 2019-12-18 19:40:07 UTC (rev 253705)
@@ -44,7 +44,7 @@
class MockAudioSharedUnit final : public BaseAudioSharedUnit {
public:
- static MockAudioSharedUnit& singleton();
+ WEBCORE_EXPORT static MockAudioSharedUnit& singleton();
MockAudioSharedUnit();
private:
Modified: trunk/Source/WebKit/ChangeLog (253704 => 253705)
--- trunk/Source/WebKit/ChangeLog 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/ChangeLog 2019-12-18 19:40:07 UTC (rev 253705)
@@ -1,3 +1,59 @@
+2019-12-18 youenn fablet <you...@apple.com>
+
+ Add support for Audio Capture in GPUProcess
+ https://bugs.webkit.org/show_bug.cgi?id=205056
+
+ Reviewed by Eric Carlson.
+
+ Make UserMediaCaptureManager and Proxy able to work with GPU process.
+ Add support for capturing audio in the GPU process, this is limited to mock audio sources for now
+ as we do not support AudioSession in the GPU process.
+ Covered by rebased test.
+
+ * GPUProcess/GPUConnectionToWebProcess.cpp:
+ (WebKit::GPUConnectionToWebProcess::GPUConnectionToWebProcess):
+ (WebKit::GPUConnectionToWebProcess::didReceiveMessage):
+ (WebKit::GPUConnectionToWebProcess::didReceiveSyncMessage):
+ * GPUProcess/GPUConnectionToWebProcess.h:
+ * GPUProcess/GPUProcess.cpp:
+ (WebKit::GPUProcess::setMockCaptureDevicesEnabled):
+ * GPUProcess/GPUProcess.h:
+ * GPUProcess/GPUProcess.messages.in:
+ * UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
+ (WebKit::UserMediaCaptureManagerProxy::UserMediaCaptureManagerProxy):
+ (WebKit::UserMediaCaptureManagerProxy::~UserMediaCaptureManagerProxy):
+ (WebKit::UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints):
+ (WebKit::UserMediaCaptureManagerProxy::applyConstraints):
+ (WebKit::UserMediaCaptureManagerProxy::clone):
+ * UIProcess/Cocoa/UserMediaCaptureManagerProxy.h:
+ (WebKit::UserMediaCaptureManagerProxy::didReceiveMessageFromGPUProcess):
+ (WebKit::UserMediaCaptureManagerProxy::didReceiveSyncMessageFromGPUProcess):
+ * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
+ (WebKit::UserMediaPermissionRequestManagerProxy::syncWithWebCorePrefs const):
+ * UIProcess/WebProcessPool.h:
+ * UIProcess/WebProcessProxy.cpp:
+ * WebProcess/GPU/GPUProcessConnection.cpp:
+ (WebKit::GPUProcessConnection::didReceiveMessage):
+ * WebProcess/GPU/GPUProcessConnection.h:
+ * WebProcess/cocoa/UserMediaCaptureManager.cpp:
+ (WebKit::UserMediaCaptureManager::Source::setShouldCaptureInGPUProcess):
+ (WebKit::UserMediaCaptureManager::Source::shouldCaptureInGPUProcess const):
+ (WebKit::UserMediaCaptureManager::Source::requestToEnd):
+ (WebKit::UserMediaCaptureManager::createCaptureSource):
+ (WebKit::UserMediaCaptureManager::sourceStopped):
+ (WebKit::UserMediaCaptureManager::captureFailed):
+ (WebKit::UserMediaCaptureManager::Source::connection):
+ (WebKit::UserMediaCaptureManager::Source::startProducingData):
+ (WebKit::UserMediaCaptureManager::Source::stopProducingData):
+ (WebKit::UserMediaCaptureManager::Source::capabilities):
+ (WebKit::UserMediaCaptureManager::Source::applyConstraints):
+ (WebKit::UserMediaCaptureManager::sourceEnded):
+ (WebKit::UserMediaCaptureManager::Source::hasEnded):
+ (WebKit::UserMediaCaptureManager::Source::stopBeingObserved):
+ (WebKit::UserMediaCaptureManager::AudioFactory::createAudioCaptureSource):
+ * WebProcess/cocoa/UserMediaCaptureManager.h:
+ (WebKit::UserMediaCaptureManager::didReceiveMessageFromGPUProcess):
+
2019-12-18 Ben Nham <n...@apple.com>
Add network loading signposts
Modified: trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp (253704 => 253705)
--- trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp 2019-12-18 19:40:07 UTC (rev 253705)
@@ -38,13 +38,35 @@
#include "RemoteMediaPlayerManagerProxy.h"
#include "RemoteMediaPlayerManagerProxyMessages.h"
#include "RemoteScrollingCoordinatorTransaction.h"
+#include "UserMediaCaptureManagerProxy.h"
+#include "UserMediaCaptureManagerProxyMessages.h"
#include "WebCoreArgumentCoders.h"
#include "WebErrors.h"
#include "WebProcessMessages.h"
+#include <WebCore/MockRealtimeMediaSourceCenter.h>
+
namespace WebKit {
using namespace WebCore;
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+class GPUProxyForCapture final : public UserMediaCaptureManagerProxy::ConnectionProxy {
+ WTF_MAKE_FAST_ALLOCATED;
+public:
+ explicit GPUProxyForCapture(GPUConnectionToWebProcess& process)
+ : m_process(process)
+ {
+ }
+
+private:
+ void addMessageReceiver(IPC::StringReference messageReceiverName, IPC::MessageReceiver& receiver) final { }
+ void removeMessageReceiver(IPC::StringReference messageReceiverName) final { }
+ IPC::Connection& connection() final { return m_process.connection(); }
+
+ GPUConnectionToWebProcess& m_process;
+};
+#endif
+
Ref<GPUConnectionToWebProcess> GPUConnectionToWebProcess::create(GPUProcess& gpuProcess, WebCore::ProcessIdentifier webProcessIdentifier, IPC::Connection::Identifier connectionIdentifier)
{
return adoptRef(*new GPUConnectionToWebProcess(gpuProcess, webProcessIdentifier, connectionIdentifier));
@@ -84,6 +106,16 @@
return *m_remoteMediaPlayerManagerProxy;
}
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+UserMediaCaptureManagerProxy& GPUConnectionToWebProcess::userMediaCaptureManagerProxy()
+{
+ if (!m_userMediaCaptureManagerProxy)
+ m_userMediaCaptureManagerProxy = makeUnique<UserMediaCaptureManagerProxy>(makeUniqueRef<GPUProxyForCapture>(*this));
+
+ return *m_userMediaCaptureManagerProxy;
+}
+#endif
+
void GPUConnectionToWebProcess::didReceiveMessage(IPC::Connection& connection, IPC::Decoder& decoder)
{
if (decoder.messageReceiverName() == Messages::RemoteMediaPlayerManagerProxy::messageReceiverName()) {
@@ -90,6 +122,12 @@
remoteMediaPlayerManagerProxy().didReceiveMessageFromWebProcess(connection, decoder);
return;
}
+#if ENABLE(MEDIA_STREAM)
+ if (decoder.messageReceiverName() == Messages::UserMediaCaptureManagerProxy::messageReceiverName()) {
+ userMediaCaptureManagerProxy().didReceiveMessageFromGPUProcess(connection, decoder);
+ return;
+ }
+#endif
}
void GPUConnectionToWebProcess::didReceiveSyncMessage(IPC::Connection& connection, IPC::Decoder& decoder, std::unique_ptr<IPC::Encoder>& replyEncoder)
@@ -99,6 +137,13 @@
return;
}
+#if ENABLE(MEDIA_STREAM)
+ if (decoder.messageReceiverName() == Messages::UserMediaCaptureManagerProxy::messageReceiverName()) {
+ userMediaCaptureManagerProxy().didReceiveSyncMessageFromGPUProcess(connection, decoder, replyEncoder);
+ return;
+ }
+#endif
+
ASSERT_NOT_REACHED();
}
Modified: trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h (253704 => 253705)
--- trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h 2019-12-18 19:40:07 UTC (rev 253705)
@@ -38,6 +38,7 @@
class GPUProcess;
class RemoteMediaPlayerManagerProxy;
+class UserMediaCaptureManagerProxy;
class GPUConnectionToWebProcess
: public RefCounted<GPUConnectionToWebProcess>
@@ -58,17 +59,23 @@
GPUConnectionToWebProcess(GPUProcess&, WebCore::ProcessIdentifier, IPC::Connection::Identifier);
RemoteMediaPlayerManagerProxy& remoteMediaPlayerManagerProxy();
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+ UserMediaCaptureManagerProxy& userMediaCaptureManagerProxy();
+#endif
// IPC::Connection::Client
- void didClose(IPC::Connection&) override;
- void didReceiveInvalidMessage(IPC::Connection&, IPC::StringReference messageReceiverName, IPC::StringReference messageName) override;
- void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
- void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) override;
+ void didClose(IPC::Connection&) final;
+ void didReceiveInvalidMessage(IPC::Connection&, IPC::StringReference messageReceiverName, IPC::StringReference messageName) final;
+ void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
+ void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) final;
Ref<IPC::Connection> m_connection;
Ref<GPUProcess> m_gpuProcess;
const WebCore::ProcessIdentifier m_webProcessIdentifier;
std::unique_ptr<RemoteMediaPlayerManagerProxy> m_remoteMediaPlayerManagerProxy;
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+ std::unique_ptr<UserMediaCaptureManagerProxy> m_userMediaCaptureManagerProxy;
+#endif
};
} // namespace WebKit
Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.cpp (253704 => 253705)
--- trunk/Source/WebKit/GPUProcess/GPUProcess.cpp 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.cpp 2019-12-18 19:40:07 UTC (rev 253705)
@@ -38,6 +38,7 @@
#include "WebPageProxyMessages.h"
#include "WebProcessPoolMessages.h"
#include <WebCore/LogInitialization.h>
+#include <WebCore/MockAudioSharedUnit.h>
#include <wtf/Algorithms.h>
#include <wtf/CallbackAggregator.h>
#include <wtf/OptionSet.h>
@@ -136,6 +137,15 @@
return m_webProcessConnections.get(identifier);
}
+#if ENABLE(MEDIA_STREAM)
+void GPUProcess::setMockCaptureDevicesEnabled(bool isEnabled)
+{
+ // FIXME: Enable the audio session check by implementing an AudioSession for the GPUProcess.
+ MockAudioSharedUnit::singleton().setDisableAudioSessionCheck(isEnabled);
+ MockRealtimeMediaSourceCenter::setMockRealtimeMediaSourceCenterEnabled(isEnabled);
+}
+#endif
+
} // namespace WebKit
#endif // ENABLE(GPU_PROCESS)
Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.h (253704 => 253705)
--- trunk/Source/WebKit/GPUProcess/GPUProcess.h 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.h 2019-12-18 19:40:07 UTC (rev 253705)
@@ -41,7 +41,7 @@
class GPUProcess : public AuxiliaryProcess, public ThreadSafeRefCounted<GPUProcess>, public CanMakeWeakPtr<GPUProcess> {
WTF_MAKE_NONCOPYABLE(GPUProcess);
public:
- GPUProcess(AuxiliaryProcessInitializationParameters&&);
+ explicit GPUProcess(AuxiliaryProcessInitializationParameters&&);
~GPUProcess();
static constexpr ProcessType processType = ProcessType::GPU;
@@ -74,7 +74,9 @@
void processDidTransitionToForeground();
void processDidTransitionToBackground();
-
+#if ENABLE(MEDIA_STREAM)
+ void setMockCaptureDevicesEnabled(bool);
+#endif
// Connections to WebProcesses.
HashMap<WebCore::ProcessIdentifier, Ref<GPUConnectionToWebProcess>> m_webProcessConnections;
};
Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.messages.in (253704 => 253705)
--- trunk/Source/WebKit/GPUProcess/GPUProcess.messages.in 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.messages.in 2019-12-18 19:40:07 UTC (rev 253705)
@@ -31,6 +31,10 @@
ProcessDidTransitionToForeground()
ProcessDidTransitionToBackground()
+
+#if ENABLE(MEDIA_STREAM)
+ SetMockCaptureDevicesEnabled(bool isEnabled)
+#endif
}
#endif // ENABLE(GPU_PROCESS)
Modified: trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (253704 => 253705)
--- trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp 2019-12-18 19:40:07 UTC (rev 253705)
@@ -40,7 +40,7 @@
#include <WebCore/WebAudioBufferList.h>
#include <wtf/UniqueRef.h>
-#define MESSAGE_CHECK_CONTEXTID(identifier) MESSAGE_CHECK_BASE(m_proxies.isValidKey(identifier), m_process.connection())
+#define MESSAGE_CHECK_CONTEXTID(identifier) MESSAGE_CHECK_BASE(m_proxies.isValidKey(identifier), &m_connectionProxy->connection())
namespace WebKit {
using namespace WebCore;
@@ -155,15 +155,15 @@
bool m_isEnded { false };
};
-UserMediaCaptureManagerProxy::UserMediaCaptureManagerProxy(WebProcessProxy& process)
- : m_process(process)
+UserMediaCaptureManagerProxy::UserMediaCaptureManagerProxy(UniqueRef<ConnectionProxy>&& connectionProxy)
+ : m_connectionProxy(WTFMove(connectionProxy))
{
- m_process.addMessageReceiver(Messages::UserMediaCaptureManagerProxy::messageReceiverName(), *this);
+ m_connectionProxy->addMessageReceiver(Messages::UserMediaCaptureManagerProxy::messageReceiverName(), *this);
}
UserMediaCaptureManagerProxy::~UserMediaCaptureManagerProxy()
{
- m_process.removeMessageReceiver(Messages::UserMediaCaptureManagerProxy::messageReceiverName());
+ m_connectionProxy->removeMessageReceiver(Messages::UserMediaCaptureManagerProxy::messageReceiverName());
}
void UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints(uint64_t id, const CaptureDevice& device, String&& hashSalt, const MediaConstraints& constraints, CompletionHandler<void(bool succeeded, String invalidConstraints, WebCore::RealtimeMediaSourceSettings&&)>&& completionHandler)
@@ -196,7 +196,7 @@
auto source = sourceOrError.source();
settings = source->settings();
ASSERT(!m_proxies.contains(id));
- m_proxies.add(id, makeUnique<SourceProxy>(id, *m_process.connection(), WTFMove(source)));
+ m_proxies.add(id, makeUnique<SourceProxy>(id, m_connectionProxy->connection(), WTFMove(source)));
} else
invalidConstraints = WTFMove(sourceOrError.errorMessage);
completionHandler(succeeded, invalidConstraints, WTFMove(settings));
@@ -248,9 +248,9 @@
auto& source = proxy->source();
auto result = source.applyConstraints(constraints);
if (!result)
- m_process.send(Messages::UserMediaCaptureManager::ApplyConstraintsSucceeded(id, source.settings()), 0);
+ m_connectionProxy->connection().send(Messages::UserMediaCaptureManager::ApplyConstraintsSucceeded(id, source.settings()), 0);
else
- m_process.send(Messages::UserMediaCaptureManager::ApplyConstraintsFailed(id, result->badConstraint, result->message), 0);
+ m_connectionProxy->connection().send(Messages::UserMediaCaptureManager::ApplyConstraintsFailed(id, result->badConstraint, result->message), 0);
}
void UserMediaCaptureManagerProxy::clone(uint64_t clonedID, uint64_t newSourceID)
@@ -258,7 +258,7 @@
ASSERT(m_proxies.contains(clonedID));
ASSERT(!m_proxies.contains(newSourceID));
if (auto* proxy = m_proxies.get(clonedID))
- m_proxies.add(newSourceID, makeUnique<SourceProxy>(newSourceID, *m_process.connection(), proxy->source().clone()));
+ m_proxies.add(newSourceID, makeUnique<SourceProxy>(newSourceID, m_connectionProxy->connection(), proxy->source().clone()));
}
void UserMediaCaptureManagerProxy::requestToEnd(uint64_t sourceID)
Modified: trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h (253704 => 253705)
--- trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h 2019-12-18 19:40:07 UTC (rev 253705)
@@ -32,6 +32,7 @@
#include "UserMediaCaptureManager.h"
#include <WebCore/OrientationNotifier.h>
#include <WebCore/RealtimeMediaSource.h>
+#include <wtf/UniqueRef.h>
namespace WebKit {
@@ -41,14 +42,23 @@
class UserMediaCaptureManagerProxy : private IPC::MessageReceiver {
WTF_MAKE_FAST_ALLOCATED;
public:
- explicit UserMediaCaptureManagerProxy(WebProcessProxy&);
+ class ConnectionProxy {
+ public:
+ virtual ~ConnectionProxy() = default;
+ virtual void addMessageReceiver(IPC::StringReference, IPC::MessageReceiver&) = 0;
+ virtual void removeMessageReceiver(IPC::StringReference) = 0;
+ virtual IPC::Connection& connection() = 0;
+ };
+ explicit UserMediaCaptureManagerProxy(UniqueRef<ConnectionProxy>&&);
~UserMediaCaptureManagerProxy();
- WebProcessProxy& process() const { return m_process; }
void clear();
void setOrientation(uint64_t);
+ void didReceiveMessageFromGPUProcess(IPC::Connection& connection, IPC::Decoder& decoder) { didReceiveMessage(connection, decoder); }
+ void didReceiveSyncMessageFromGPUProcess(IPC::Connection& connection, IPC::Decoder& decoder, std::unique_ptr<IPC::Encoder>& encoder) { didReceiveSyncMessage(connection, decoder, encoder); }
+
private:
// IPC::MessageReceiver
void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
@@ -67,7 +77,7 @@
class SourceProxy;
friend class SourceProxy;
HashMap<uint64_t, std::unique_ptr<SourceProxy>> m_proxies;
- WebProcessProxy& m_process;
+ UniqueRef<ConnectionProxy> m_connectionProxy;
WebCore::OrientationNotifier m_orientationNotifier { 0 };
};
Modified: trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp (253704 => 253705)
--- trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp 2019-12-18 19:40:07 UTC (rev 253705)
@@ -40,6 +40,11 @@
#include <WebCore/UserMediaRequest.h>
#include <wtf/Scope.h>
+#if ENABLE(GPU_PROCESS)
+#include "GPUProcessMessages.h"
+#include "GPUProcessProxy.h"
+#endif
+
namespace WebKit {
using namespace WebCore;
@@ -699,8 +704,14 @@
// Enable/disable the mock capture devices for the UI process as per the WebCore preferences. Note that
// this is a noop if the preference hasn't changed since the last time this was called.
bool mockDevicesEnabled = m_mockDevicesEnabledOverride ? *m_mockDevicesEnabledOverride : m_page.preferences().mockCaptureDevicesEnabled();
+ if (MockRealtimeMediaSourceCenter::mockRealtimeMediaSourceCenterEnabled() == mockDevicesEnabled)
+ return;
MockRealtimeMediaSourceCenter::setMockRealtimeMediaSourceCenterEnabled(mockDevicesEnabled);
+#if ENABLE(GPU_PROCESS)
+ if (m_page.preferences().captureAudioInGPUProcessEnabled())
+ GPUProcessProxy::singleton().send(Messages::GPUProcess::SetMockCaptureDevicesEnabled { mockDevicesEnabled }, 0);
#endif
+#endif
}
void UserMediaPermissionRequestManagerProxy::captureStateChanged(MediaProducer::MediaStateFlags oldState, MediaProducer::MediaStateFlags newState)
Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp (253704 => 253705)
--- trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp 2019-12-18 19:40:07 UTC (rev 253705)
@@ -150,6 +150,20 @@
}
#endif
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+class UIProxyForCapture final : public UserMediaCaptureManagerProxy::ConnectionProxy {
+ WTF_MAKE_FAST_ALLOCATED;
+public:
+ explicit UIProxyForCapture(WebProcessProxy& process) : m_process(process) { }
+private:
+ void addMessageReceiver(IPC::StringReference messageReceiverName, IPC::MessageReceiver& receiver) final { m_process.addMessageReceiver(messageReceiverName, receiver); }
+ void removeMessageReceiver(IPC::StringReference messageReceiverName) final { m_process.removeMessageReceiver(messageReceiverName); }
+ IPC::Connection& connection() final { return *m_process.connection(); }
+
+ WebProcessProxy& m_process;
+};
+#endif
+
WebProcessProxy::WebProcessProxy(WebProcessPool& processPool, WebsiteDataStore* websiteDataStore, IsPrewarmed isPrewarmed)
: AuxiliaryProcessProxy(processPool.alwaysRunsAtBackgroundPriority())
, m_responsivenessTimer(*this)
@@ -162,7 +176,7 @@
, m_visiblePageCounter([this](RefCounterEvent) { updateBackgroundResponsivenessTimer(); })
, m_websiteDataStore(websiteDataStore)
#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
- , m_userMediaCaptureManagerProxy(makeUnique<UserMediaCaptureManagerProxy>(*this))
+ , m_userMediaCaptureManagerProxy(makeUnique<UserMediaCaptureManagerProxy>(makeUniqueRef<UIProxyForCapture>(*this)))
#endif
, m_isPrewarmed(isPrewarmed == IsPrewarmed::Yes)
{
Modified: trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp (253704 => 253705)
--- trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp 2019-12-18 19:40:07 UTC (rev 253705)
@@ -32,6 +32,8 @@
#include "GPUConnectionToWebProcessMessages.h"
#include "RemoteMediaPlayerManager.h"
#include "RemoteMediaPlayerManagerMessages.h"
+#include "UserMediaCaptureManager.h"
+#include "UserMediaCaptureManagerMessages.h"
#include "WebCoreArgumentCoders.h"
#include "WebPage.h"
#include "WebPageMessages.h"
@@ -66,6 +68,13 @@
WebProcess::singleton().supplement<RemoteMediaPlayerManager>()->didReceiveMessageFromWebProcess(connection, decoder);
return;
}
+#if ENABLE(MEDIA_STREAM)
+ if (decoder.messageReceiverName() == Messages::UserMediaCaptureManager::messageReceiverName()) {
+ if (auto* captureManager = WebProcess::singleton().supplement<UserMediaCaptureManager>())
+ captureManager->didReceiveMessageFromGPUProcess(connection, decoder);
+ return;
+ }
+#endif
}
} // namespace WebKit
Modified: trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h (253704 => 253705)
--- trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h 2019-12-18 19:40:07 UTC (rev 253705)
@@ -52,7 +52,7 @@
// IPC::Connection::Client
void didClose(IPC::Connection&) override;
- void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
+ void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
void didReceiveInvalidMessage(IPC::Connection&, IPC::StringReference messageReceiverName, IPC::StringReference messageName) override;
// The connection from a web process to this GPU process.
Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp (253704 => 253705)
--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp 2019-12-18 19:40:07 UTC (rev 253705)
@@ -28,6 +28,7 @@
#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+#include "GPUProcessConnection.h"
#include "SharedRingBufferStorage.h"
#include "UserMediaCaptureManagerMessages.h"
#include "UserMediaCaptureManagerProxyMessages.h"
@@ -125,12 +126,7 @@
return m_settings;
}
- const RealtimeMediaSourceCapabilities& capabilities() final
- {
- if (!m_capabilities)
- m_capabilities = m_manager.capabilities(m_id);
- return m_capabilities.value();
- }
+ const RealtimeMediaSourceCapabilities& capabilities() final;
const RealtimeMediaSourceSettings& settings() final { return m_settings; }
void setSettings(RealtimeMediaSourceSettings&& settings)
@@ -216,32 +212,27 @@
CaptureDevice::DeviceType deviceType() const final { return m_deviceType; }
+ void setShouldCaptureInGPUProcess(bool value) { m_shouldCaptureInGPUProcess = value; }
+ bool shouldCaptureInGPUProcess() const { return m_shouldCaptureInGPUProcess; }
+
+ IPC::Connection* connection();
+
+ void hasEnded() final;
+
private:
- void startProducingData() final { m_manager.startProducingData(m_id); }
- void stopProducingData() final { m_manager.stopProducingData(m_id); }
+ void startProducingData() final;
+ void stopProducingData() final;
bool isCaptureSource() const final { return true; }
// RealtimeMediaSource
void beginConfiguration() final { }
void commitConfiguration() final { }
- void hasEnded() final { m_manager.sourceEnded(m_id); }
- void applyConstraints(const WebCore::MediaConstraints& constraints, ApplyConstraintsHandler&& completionHandler) final
- {
- m_manager.applyConstraints(m_id, constraints);
- m_pendingApplyConstraintsCallbacks.append(WTFMove(completionHandler));
- }
+ void applyConstraints(const WebCore::MediaConstraints&, ApplyConstraintsHandler&&) final;
- void requestToEnd(RealtimeMediaSource::Observer&)
- {
- m_manager.requestToEnd(m_id);
- }
+ void requestToEnd(RealtimeMediaSource::Observer&) { stopBeingObserved(); }
+ void stopBeingObserved();
- void stopBeingObserved()
- {
- m_manager.requestToEnd(m_id);
- }
-
uint64_t m_id;
UserMediaCaptureManager& m_manager;
mutable Optional<RealtimeMediaSourceCapabilities> m_capabilities;
@@ -254,6 +245,7 @@
CaptureDevice::DeviceType m_deviceType { CaptureDevice::DeviceType::Unknown };
Deque<ApplyConstraintsHandler> m_pendingApplyConstraintsCallbacks;
+ bool m_shouldCaptureInGPUProcess { false };
};
UserMediaCaptureManager::UserMediaCaptureManager(WebProcess& process)
@@ -293,7 +285,7 @@
RealtimeMediaSourceCenter::singleton().setDisplayCaptureFactory(m_displayFactory);
}
-WebCore::CaptureSourceOrError UserMediaCaptureManager::createCaptureSource(const CaptureDevice& device, String&& hashSalt, const WebCore::MediaConstraints* constraints)
+WebCore::CaptureSourceOrError UserMediaCaptureManager::createCaptureSource(const CaptureDevice& device, String&& hashSalt, const WebCore::MediaConstraints* constraints, bool shouldCaptureInGPUProcess)
{
if (!constraints)
return { };
@@ -302,11 +294,22 @@
RealtimeMediaSourceSettings settings;
String errorMessage;
bool succeeded;
- if (!m_process.sendSync(Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints(id, device, hashSalt, *constraints), Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints::Reply(succeeded, errorMessage, settings), 0))
+#if ENABLE(GPU_PROCESS)
+ auto* connection = shouldCaptureInGPUProcess ? &m_process.ensureGPUProcessConnection().connection() : m_process.parentProcessConnection();
+#else
+ ASSERT(!shouldCaptureInGPUProcess);
+ auto* connection = m_process.parentProcessConnection();
+#endif
+ if (!connection->sendSync(Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints(id, device, hashSalt, *constraints), Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints::Reply(succeeded, errorMessage, settings), 0))
return WTFMove(errorMessage);
+ if (!succeeded)
+ return WTFMove(errorMessage);
+
auto type = device.type() == CaptureDevice::DeviceType::Microphone ? WebCore::RealtimeMediaSource::Type::Audio : WebCore::RealtimeMediaSource::Type::Video;
auto source = adoptRef(*new Source(String::number(id), type, device.type(), String { settings.label().string() }, WTFMove(hashSalt), id, *this));
+ if (shouldCaptureInGPUProcess)
+ source->setShouldCaptureInGPUProcess(shouldCaptureInGPUProcess);
source->setSettings(WTFMove(settings));
m_sources.add(id, source.copyRef());
return WebCore::CaptureSourceOrError(WTFMove(source));
@@ -316,7 +319,7 @@
{
if (auto source = m_sources.get(id)) {
source->stop();
- sourceEnded(id);
+ source->hasEnded();
}
}
@@ -324,7 +327,7 @@
{
if (auto source = m_sources.get(id)) {
source->captureFailed();
- sourceEnded(id);
+ source->hasEnded();
}
}
@@ -373,39 +376,53 @@
}
#endif
-void UserMediaCaptureManager::startProducingData(uint64_t id)
+IPC::Connection* UserMediaCaptureManager::Source::connection()
{
- m_process.send(Messages::UserMediaCaptureManagerProxy::StartProducingData(id), 0);
+#if ENABLE(GPU_PROCESS)
+ return m_shouldCaptureInGPUProcess ? &WebProcess::singleton().ensureGPUProcessConnection().connection() : WebProcess::singleton().parentProcessConnection();
+#else
+ return m_process.parentProcessConnection();
+#endif
}
-void UserMediaCaptureManager::stopProducingData(uint64_t id)
+void UserMediaCaptureManager::Source::startProducingData()
{
- m_process.send(Messages::UserMediaCaptureManagerProxy::StopProducingData(id), 0);
+ connection()->send(Messages::UserMediaCaptureManagerProxy::StartProducingData(m_id), 0);
}
-WebCore::RealtimeMediaSourceCapabilities UserMediaCaptureManager::capabilities(uint64_t id)
+void UserMediaCaptureManager::Source::stopProducingData()
{
- WebCore::RealtimeMediaSourceCapabilities capabilities;
- m_process.sendSync(Messages::UserMediaCaptureManagerProxy::Capabilities(id), Messages::UserMediaCaptureManagerProxy::Capabilities::Reply(capabilities), 0);
- return capabilities;
+ connection()->send(Messages::UserMediaCaptureManagerProxy::StopProducingData(m_id), 0);
}
-void UserMediaCaptureManager::setMuted(uint64_t id, bool muted)
+const WebCore::RealtimeMediaSourceCapabilities& UserMediaCaptureManager::Source::capabilities()
{
- m_process.send(Messages::UserMediaCaptureManagerProxy::SetMuted(id, muted), 0);
+ if (!m_capabilities) {
+ RealtimeMediaSourceCapabilities capabilities;
+ connection()->sendSync(Messages::UserMediaCaptureManagerProxy::Capabilities { m_id }, Messages::UserMediaCaptureManagerProxy::Capabilities::Reply(capabilities), 0);
+ m_capabilities = WTFMove(capabilities);
+ }
+
+ return m_capabilities.value();
}
-void UserMediaCaptureManager::applyConstraints(uint64_t id, const WebCore::MediaConstraints& constraints)
+void UserMediaCaptureManager::Source::applyConstraints(const WebCore::MediaConstraints& constraints, ApplyConstraintsHandler&& completionHandler)
{
- m_process.send(Messages::UserMediaCaptureManagerProxy::ApplyConstraints(id, constraints), 0);
+ m_pendingApplyConstraintsCallbacks.append(WTFMove(completionHandler));
+ connection()->send(Messages::UserMediaCaptureManagerProxy::ApplyConstraints(m_id, constraints), 0);
}
void UserMediaCaptureManager::sourceEnded(uint64_t id)
{
- m_process.send(Messages::UserMediaCaptureManagerProxy::End(id), 0);
m_sources.remove(id);
}
+void UserMediaCaptureManager::Source::hasEnded()
+{
+ connection()->send(Messages::UserMediaCaptureManagerProxy::End { m_id }, 0);
+ m_manager.sourceEnded(m_id);
+}
+
void UserMediaCaptureManager::applyConstraintsSucceeded(uint64_t id, const WebCore::RealtimeMediaSourceSettings& settings)
{
if (auto source = m_sources.get(id))
@@ -444,15 +461,20 @@
return cloneSource;
}
-void UserMediaCaptureManager::requestToEnd(uint64_t sourceID)
+void UserMediaCaptureManager::Source::stopBeingObserved()
{
- m_process.send(Messages::UserMediaCaptureManagerProxy::RequestToEnd { sourceID }, 0);
+ connection()->send(Messages::UserMediaCaptureManagerProxy::RequestToEnd { m_id }, 0);
}
CaptureSourceOrError UserMediaCaptureManager::AudioFactory::createAudioCaptureSource(const CaptureDevice& device, String&& hashSalt, const MediaConstraints* constraints)
{
- if (m_shouldCaptureInGPUProcess)
+ if (m_shouldCaptureInGPUProcess) {
+#if ENABLE(GPU_PROCESS)
+ return m_manager.createCaptureSource(device, WTFMove(hashSalt), constraints, m_shouldCaptureInGPUProcess);
+#else
return CaptureSourceOrError { "Audio capture in GPUProcess is not implemented"_s };
+#endif
+ }
return m_manager.createCaptureSource(device, WTFMove(hashSalt), constraints);
}
Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h (253704 => 253705)
--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h 2019-12-18 19:39:09 UTC (rev 253704)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h 2019-12-18 19:40:07 UTC (rev 253705)
@@ -53,6 +53,8 @@
static const char* supplementName();
+ void didReceiveMessageFromGPUProcess(IPC::Connection& connection, IPC::Decoder& decoder) { didReceiveMessage(connection, decoder); }
+
private:
// WebProcessSupplement
void initialize(const WebProcessCreationParameters&) final;
@@ -96,7 +98,7 @@
UserMediaCaptureManager& m_manager;
};
- WebCore::CaptureSourceOrError createCaptureSource(const WebCore::CaptureDevice&, String&&, const WebCore::MediaConstraints*);
+ WebCore::CaptureSourceOrError createCaptureSource(const WebCore::CaptureDevice&, String&&, const WebCore::MediaConstraints*, bool shouldCaptureInGPUProcess = false);
class NoOpCaptureDeviceManager : public WebCore::CaptureDeviceManager {
public:
@@ -128,7 +130,6 @@
void startProducingData(uint64_t);
void stopProducingData(uint64_t);
WebCore::RealtimeMediaSourceCapabilities capabilities(uint64_t);
- void setMuted(uint64_t, bool);
void applyConstraints(uint64_t, const WebCore::MediaConstraints&);
void applyConstraintsSucceeded(uint64_t, const WebCore::RealtimeMediaSourceSettings&);
void applyConstraintsFailed(uint64_t, String&&, String&&);