Diff
Modified: trunk/Source/WebKit/ChangeLog (272718 => 272719)
--- trunk/Source/WebKit/ChangeLog 2021-02-11 10:55:20 UTC (rev 272718)
+++ trunk/Source/WebKit/ChangeLog 2021-02-11 11:08:23 UTC (rev 272719)
@@ -1,3 +1,94 @@
+2021-02-11 Youenn Fablet <[email protected]>
+
+ Split RemoteRealtimeMediaSource in two audio-specific and video-specific classes
+ https://bugs.webkit.org/show_bug.cgi?id=221608
+
+ Reviewed by Eric Carlson.
+
+ Split RemoteRealtimeMediaSource in RemoteRealtimeAudioSource and RemoteRealtimeVideoSource.
+ This will allow RemoteRealtimeVideoSource to become a RealtimeVideoCaptureSource in a follow-up
+ to properly handle fan-out to multiple clones with various frame rates and resolutions.
+ This also allows removing differences of behaviors between audio and video classes.
+
+ No change of behavior.
+
+ * SourcesCocoa.txt:
+ * WebKit.xcodeproj/project.pbxproj:
+ * WebProcess/cocoa/RemoteCaptureSampleManager.cpp:
+ (WebKit::RemoteCaptureSampleManager::addSource):
+ (WebKit::RemoteCaptureSampleManager::didUpdateSourceConnection):
+ (WebKit::RemoteCaptureSampleManager::RemoteAudio::RemoteAudio):
+ * WebProcess/cocoa/RemoteCaptureSampleManager.h:
+ * WebProcess/cocoa/RemoteRealtimeAudioSource.cpp: Added.
+ (WebKit::RemoteRealtimeAudioSource::create):
+ (WebKit::RemoteRealtimeAudioSource::RemoteRealtimeAudioSource):
+ (WebKit::RemoteRealtimeAudioSource::createRemoteMediaSource):
+ (WebKit::RemoteRealtimeAudioSource::~RemoteRealtimeAudioSource):
+ (WebKit::RemoteRealtimeAudioSource::whenReady):
+ (WebKit::RemoteRealtimeAudioSource::didFail):
+ (WebKit::RemoteRealtimeAudioSource::setAsReady):
+ (WebKit::RemoteRealtimeAudioSource::setCapabilities):
+ (WebKit::RemoteRealtimeAudioSource::setSettings):
+ (WebKit::RemoteRealtimeAudioSource::remoteAudioSamplesAvailable):
+ (WebKit::RemoteRealtimeAudioSource::connection):
+ (WebKit::RemoteRealtimeAudioSource::startProducingData):
+ (WebKit::RemoteRealtimeAudioSource::stopProducingData):
+ (WebKit::RemoteRealtimeAudioSource::capabilities):
+ (WebKit::RemoteRealtimeAudioSource::applyConstraints):
+ (WebKit::RemoteRealtimeAudioSource::applyConstraintsSucceeded):
+ (WebKit::RemoteRealtimeAudioSource::applyConstraintsFailed):
+ (WebKit::RemoteRealtimeAudioSource::hasEnded):
+ (WebKit::RemoteRealtimeAudioSource::captureStopped):
+ (WebKit::RemoteRealtimeAudioSource::captureFailed):
+ (WebKit::RemoteRealtimeAudioSource::gpuProcessConnectionDidClose):
+ * WebProcess/cocoa/RemoteRealtimeAudioSource.h: Copied from Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSource.h.
+ (WebKit::RemoteRealtimeAudioSource::identifier const):
+ * WebProcess/cocoa/RemoteRealtimeVideoSource.cpp: Renamed from Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSource.cpp.
+ (WebKit::RemoteRealtimeVideoSource::create):
+ (WebKit::RemoteRealtimeVideoSource::RemoteRealtimeVideoSource):
+ (WebKit::RemoteRealtimeVideoSource::createRemoteMediaSource):
+ (WebKit::RemoteRealtimeVideoSource::~RemoteRealtimeVideoSource):
+ (WebKit::RemoteRealtimeVideoSource::whenReady):
+ (WebKit::RemoteRealtimeVideoSource::didFail):
+ (WebKit::RemoteRealtimeVideoSource::setAsReady):
+ (WebKit::RemoteRealtimeVideoSource::clone):
+ (WebKit::RemoteRealtimeVideoSource::setCapabilities):
+ (WebKit::RemoteRealtimeVideoSource::setSettings):
+ (WebKit::RemoteRealtimeVideoSource::remoteVideoSampleAvailable):
+ (WebKit::RemoteRealtimeVideoSource::connection):
+ (WebKit::RemoteRealtimeVideoSource::startProducingData):
+ (WebKit::RemoteRealtimeVideoSource::stopProducingData):
+ (WebKit::RemoteRealtimeVideoSource::setShouldApplyRotation):
+ (WebKit::RemoteRealtimeVideoSource::capabilities):
+ (WebKit::RemoteRealtimeVideoSource::applyConstraints):
+ (WebKit::RemoteRealtimeVideoSource::applyConstraintsSucceeded):
+ (WebKit::RemoteRealtimeVideoSource::applyConstraintsFailed):
+ (WebKit::RemoteRealtimeVideoSource::hasEnded):
+ (WebKit::RemoteRealtimeVideoSource::captureStopped):
+ (WebKit::RemoteRealtimeVideoSource::captureFailed):
+ (WebKit::RemoteRealtimeVideoSource::stopBeingObserved):
+ (WebKit::RemoteRealtimeVideoSource::requestToEnd):
+ (WebKit::RemoteRealtimeVideoSource::gpuProcessConnectionDidClose):
+ * WebProcess/cocoa/RemoteRealtimeVideoSource.h: Renamed from Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSource.h.
+ * WebProcess/cocoa/UserMediaCaptureManager.cpp:
+ (WebKit::UserMediaCaptureManager::addAudioSource):
+ (WebKit::UserMediaCaptureManager::removeAudioSource):
+ (WebKit::UserMediaCaptureManager::addVideoSource):
+ (WebKit::UserMediaCaptureManager::removeVideoSource):
+ (WebKit::UserMediaCaptureManager::sourceStopped):
+ (WebKit::UserMediaCaptureManager::sourceEnded):
+ (WebKit::UserMediaCaptureManager::captureFailed):
+ (WebKit::UserMediaCaptureManager::sourceMutedChanged):
+ (WebKit::UserMediaCaptureManager::sourceSettingsChanged):
+ (WebKit::UserMediaCaptureManager::remoteVideoSampleAvailable):
+ (WebKit::UserMediaCaptureManager::applyConstraintsSucceeded):
+ (WebKit::UserMediaCaptureManager::applyConstraintsFailed):
+ (WebKit::UserMediaCaptureManager::AudioFactory::createAudioCaptureSource):
+ (WebKit::UserMediaCaptureManager::VideoFactory::createVideoCaptureSource):
+ (WebKit::UserMediaCaptureManager::DisplayFactory::createDisplayCaptureSource):
+ * WebProcess/cocoa/UserMediaCaptureManager.h:
+ (WebKit::UserMediaCaptureManager::remoteCaptureSampleManager):
+
2021-02-10 Wenson Hsieh <[email protected]>
[Webpage translation] Add support for the -_translate: action on WKContentView
Modified: trunk/Source/WebKit/SourcesCocoa.txt (272718 => 272719)
--- trunk/Source/WebKit/SourcesCocoa.txt 2021-02-11 10:55:20 UTC (rev 272718)
+++ trunk/Source/WebKit/SourcesCocoa.txt 2021-02-11 11:08:23 UTC (rev 272719)
@@ -582,7 +582,8 @@
WebProcess/cocoa/PlaybackSessionManager.mm
WebProcess/cocoa/RemoteCaptureSampleManager.cpp
-WebProcess/cocoa/RemoteRealtimeMediaSource.cpp
+WebProcess/cocoa/RemoteRealtimeAudioSource.cpp
+WebProcess/cocoa/RemoteRealtimeVideoSource.cpp
WebProcess/cocoa/UserMediaCaptureManager.cpp
WebProcess/cocoa/VideoFullscreenManager.mm
WebProcess/cocoa/WebProcessCocoa.mm
Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (272718 => 272719)
--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2021-02-11 10:55:20 UTC (rev 272718)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2021-02-11 11:08:23 UTC (rev 272719)
@@ -3685,8 +3685,8 @@
41684C4D24643BFA001CE8ED /* RemoteCaptureSampleManager.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = RemoteCaptureSampleManager.messages.in; sourceTree = "<group>"; };
41684C4E24643C81001CE8ED /* RemoteCaptureSampleManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoteCaptureSampleManager.h; sourceTree = "<group>"; };
41684C4F24643D3F001CE8ED /* RemoteCaptureSampleManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteCaptureSampleManager.cpp; sourceTree = "<group>"; };
- 41684C50246450FD001CE8ED /* RemoteRealtimeMediaSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteRealtimeMediaSource.cpp; sourceTree = "<group>"; };
- 41684C51246450FD001CE8ED /* RemoteRealtimeMediaSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoteRealtimeMediaSource.h; sourceTree = "<group>"; };
+ 41684C50246450FD001CE8ED /* RemoteRealtimeVideoSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteRealtimeVideoSource.cpp; sourceTree = "<group>"; };
+ 41684C51246450FD001CE8ED /* RemoteRealtimeVideoSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoteRealtimeVideoSource.h; sourceTree = "<group>"; };
416CD74523FB178B00661D99 /* MDNSRegisterIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MDNSRegisterIdentifier.h; path = Network/webrtc/MDNSRegisterIdentifier.h; sourceTree = "<group>"; };
416F8086245B397400B68F02 /* LibWebRTCNetwork.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = LibWebRTCNetwork.messages.in; path = Network/webrtc/LibWebRTCNetwork.messages.in; sourceTree = "<group>"; };
416F8089245C7FF500B68F02 /* LibWebRTCNetwork.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LibWebRTCNetwork.cpp; path = Network/webrtc/LibWebRTCNetwork.cpp; sourceTree = "<group>"; };
@@ -3756,6 +3756,8 @@
41E0A7C623B6397800561060 /* LibWebRTCCodecsProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LibWebRTCCodecsProxy.h; sourceTree = "<group>"; };
41E0A7C723B6397900561060 /* LibWebRTCCodecsProxy.messages.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = LibWebRTCCodecsProxy.messages.in; sourceTree = "<group>"; };
41E0A7C823B6397900561060 /* LibWebRTCCodecsProxy.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = LibWebRTCCodecsProxy.mm; sourceTree = "<group>"; };
+ 41E67A8C25D2CFD0007B0A4C /* RemoteRealtimeAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RemoteRealtimeAudioSource.h; sourceTree = "<group>"; };
+ 41E67A8D25D2CFD0007B0A4C /* RemoteRealtimeAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteRealtimeAudioSource.cpp; sourceTree = "<group>"; };
41F060DD1654317500F3281C /* WebSocketChannelMessageReceiver.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = WebSocketChannelMessageReceiver.cpp; path = DerivedSources/WebKit2/WebSocketChannelMessageReceiver.cpp; sourceTree = BUILT_PRODUCTS_DIR; };
41F9FD1823ED8A810099B579 /* LibWebRTCResolverIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibWebRTCResolverIdentifier.h; path = Network/webrtc/LibWebRTCResolverIdentifier.h; sourceTree = "<group>"; };
41FABD281F4DDFDC006A6C97 /* CacheStorageEngineCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CacheStorageEngineCache.h; sourceTree = "<group>"; };
@@ -9073,8 +9075,10 @@
41684C4F24643D3F001CE8ED /* RemoteCaptureSampleManager.cpp */,
41684C4E24643C81001CE8ED /* RemoteCaptureSampleManager.h */,
41684C4D24643BFA001CE8ED /* RemoteCaptureSampleManager.messages.in */,
- 41684C50246450FD001CE8ED /* RemoteRealtimeMediaSource.cpp */,
- 41684C51246450FD001CE8ED /* RemoteRealtimeMediaSource.h */,
+ 41E67A8D25D2CFD0007B0A4C /* RemoteRealtimeAudioSource.cpp */,
+ 41E67A8C25D2CFD0007B0A4C /* RemoteRealtimeAudioSource.h */,
+ 41684C50246450FD001CE8ED /* RemoteRealtimeVideoSource.cpp */,
+ 41684C51246450FD001CE8ED /* RemoteRealtimeVideoSource.h */,
CD491B051E70D05F00009066 /* UserMediaCaptureManager.cpp */,
CD491B061E70D05F00009066 /* UserMediaCaptureManager.h */,
CD491B0A1E732D1200009066 /* UserMediaCaptureManager.messages.in */,
Modified: trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp (272718 => 272719)
--- trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp 2021-02-11 10:55:20 UTC (rev 272718)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp 2021-02-11 11:08:23 UTC (rev 272719)
@@ -60,7 +60,7 @@
m_connection->addThreadMessageReceiver(Messages::RemoteCaptureSampleManager::messageReceiverName(), this);
}
-void RemoteCaptureSampleManager::addSource(Ref<RemoteRealtimeMediaSource>&& source)
+void RemoteCaptureSampleManager::addSource(Ref<RemoteRealtimeAudioSource>&& source)
{
ASSERT(WTF::isMainRunLoop());
setConnection(source->connection());
@@ -82,7 +82,7 @@
});
}
-void RemoteCaptureSampleManager::didUpdateSourceConnection(RemoteRealtimeMediaSource& source)
+void RemoteCaptureSampleManager::didUpdateSourceConnection(RemoteRealtimeAudioSource& source)
{
ASSERT(WTF::isMainRunLoop());
setConnection(source.connection());
@@ -117,7 +117,7 @@
iterator->value->audioSamplesAvailable(time, numberOfFrames);
}
-RemoteCaptureSampleManager::RemoteAudio::RemoteAudio(Ref<RemoteRealtimeMediaSource>&& source)
+RemoteCaptureSampleManager::RemoteAudio::RemoteAudio(Ref<RemoteRealtimeAudioSource>&& source)
: m_source(WTFMove(source))
, m_ringBuffer(makeUnique<CARingBuffer>())
{
Modified: trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.h (272718 => 272719)
--- trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.h 2021-02-11 10:55:20 UTC (rev 272718)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.h 2021-02-11 11:08:23 UTC (rev 272719)
@@ -29,7 +29,7 @@
#include "Connection.h"
#include "MessageReceiver.h"
-#include "RemoteRealtimeMediaSource.h"
+#include "RemoteRealtimeAudioSource.h"
#include "SharedMemory.h"
#include <WebCore/CAAudioStreamDescription.h>
#include <WebCore/CARingBuffer.h>
@@ -45,10 +45,10 @@
RemoteCaptureSampleManager();
~RemoteCaptureSampleManager();
- void addSource(Ref<RemoteRealtimeMediaSource>&&);
+ void addSource(Ref<RemoteRealtimeAudioSource>&&);
void removeSource(WebCore::RealtimeMediaSourceIdentifier);
- void didUpdateSourceConnection(RemoteRealtimeMediaSource&);
+ void didUpdateSourceConnection(RemoteRealtimeAudioSource&);
void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
@@ -65,13 +65,13 @@
class RemoteAudio {
WTF_MAKE_FAST_ALLOCATED;
public:
- explicit RemoteAudio(Ref<RemoteRealtimeMediaSource>&&);
+ explicit RemoteAudio(Ref<RemoteRealtimeAudioSource>&&);
void setStorage(const SharedMemory::Handle&, const WebCore::CAAudioStreamDescription&, uint64_t numberOfFrames);
void audioSamplesAvailable(MediaTime, uint64_t numberOfFrames);
private:
- Ref<RemoteRealtimeMediaSource> m_source;
+ Ref<RemoteRealtimeAudioSource> m_source;
WebCore::CAAudioStreamDescription m_description;
std::unique_ptr<WebCore::CARingBuffer> m_ringBuffer;
std::unique_ptr<WebCore::WebAudioBufferList> m_buffer;
Added: trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeAudioSource.cpp (0 => 272719)
--- trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeAudioSource.cpp (rev 0)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeAudioSource.cpp 2021-02-11 11:08:23 UTC (rev 272719)
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2020 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 "RemoteRealtimeAudioSource.h"
+
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+
+#include "GPUProcessConnection.h"
+#include "SharedRingBufferStorage.h"
+#include "UserMediaCaptureManager.h"
+#include "UserMediaCaptureManagerMessages.h"
+#include "UserMediaCaptureManagerProxyMessages.h"
+#include "WebCoreArgumentCoders.h"
+#include "WebProcess.h"
+#include <WebCore/MediaConstraints.h>
+#include <WebCore/RealtimeMediaSource.h>
+#include <WebCore/RealtimeMediaSourceCenter.h>
+#include <WebCore/WebAudioBufferList.h>
+
+namespace WebKit {
+using namespace PAL;
+using namespace WebCore;
+
+Ref<RealtimeMediaSource> RemoteRealtimeAudioSource::create(const CaptureDevice& device, const MediaConstraints* constraints, String&& name, String&& hashSalt, UserMediaCaptureManager& manager, bool shouldCaptureInGPUProcess)
+{
+ auto source = adoptRef(*new RemoteRealtimeAudioSource(RealtimeMediaSourceIdentifier::generate(), device, constraints, WTFMove(name), WTFMove(hashSalt), manager, shouldCaptureInGPUProcess));
+ manager.addAudioSource(source.copyRef());
+ manager.remoteCaptureSampleManager().addSource(source.copyRef());
+ source->createRemoteMediaSource();
+ return source;
+}
+
+RemoteRealtimeAudioSource::RemoteRealtimeAudioSource(RealtimeMediaSourceIdentifier identifier, const CaptureDevice& device, const MediaConstraints* constraints, String&& name, String&& hashSalt, UserMediaCaptureManager& manager, bool shouldCaptureInGPUProcess)
+ : RealtimeMediaSource(RealtimeMediaSource::Type::Audio, WTFMove(name), String::number(identifier.toUInt64()), WTFMove(hashSalt))
+ , m_identifier(identifier)
+ , m_manager(manager)
+ , m_shouldCaptureInGPUProcess(shouldCaptureInGPUProcess)
+ , m_device(device)
+{
+ if (constraints)
+ m_constraints = *constraints;
+
+ ASSERT(m_device.type() == CaptureDevice::DeviceType::Microphone);
+#if PLATFORM(IOS_FAMILY)
+ RealtimeMediaSourceCenter::singleton().audioCaptureFactory().setActiveSource(*this);
+#endif
+}
+
+void RemoteRealtimeAudioSource::createRemoteMediaSource()
+{
+ connection()->sendWithAsyncReply(Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints(identifier(), m_device, deviceIDHashSalt(), m_constraints), [this, protectedThis = makeRef(*this)](bool succeeded, auto&& errorMessage, auto&& settings, auto&& capabilities) {
+ if (!succeeded) {
+ didFail(WTFMove(errorMessage));
+ return;
+ }
+ setName(String { settings.label().string() });
+ setSettings(WTFMove(settings));
+ setCapabilities(WTFMove(capabilities));
+ setAsReady();
+ if (m_shouldCaptureInGPUProcess)
+ WebProcess::singleton().ensureGPUProcessConnection().addClient(*this);
+ });
+}
+
+RemoteRealtimeAudioSource::~RemoteRealtimeAudioSource()
+{
+ if (m_shouldCaptureInGPUProcess)
+ WebProcess::singleton().ensureGPUProcessConnection().removeClient(*this);
+
+#if PLATFORM(IOS_FAMILY)
+ RealtimeMediaSourceCenter::singleton().audioCaptureFactory().unsetActiveSource(*this);
+#endif
+}
+
+void RemoteRealtimeAudioSource::whenReady(CompletionHandler<void(String)>&& callback)
+{
+ if (m_isReady)
+ return callback(WTFMove(m_errorMessage));
+ m_callback = WTFMove(callback);
+}
+
+void RemoteRealtimeAudioSource::didFail(String&& errorMessage)
+{
+ m_isReady = true;
+ m_errorMessage = WTFMove(errorMessage);
+ if (m_callback)
+ m_callback(m_errorMessage);
+}
+
+void RemoteRealtimeAudioSource::setAsReady()
+{
+ m_isReady = true;
+ if (m_callback)
+ m_callback({ });
+}
+
+void RemoteRealtimeAudioSource::setCapabilities(RealtimeMediaSourceCapabilities&& capabilities)
+{
+ m_capabilities = WTFMove(capabilities);
+}
+
+void RemoteRealtimeAudioSource::setSettings(RealtimeMediaSourceSettings&& settings)
+{
+ auto changed = m_settings.difference(settings);
+ m_settings = WTFMove(settings);
+ notifySettingsDidChangeObservers(changed);
+}
+
+void RemoteRealtimeAudioSource::remoteAudioSamplesAvailable(const WTF::MediaTime& time, const PlatformAudioData& data, const AudioStreamDescription& description, size_t size)
+{
+ ASSERT(!isMainThread());
+ audioSamplesAvailable(time, data, description, size);
+}
+
+IPC::Connection* RemoteRealtimeAudioSource::connection()
+{
+ ASSERT(isMainThread());
+#if ENABLE(GPU_PROCESS)
+ if (m_shouldCaptureInGPUProcess)
+ return &WebProcess::singleton().ensureGPUProcessConnection().connection();
+#endif
+ return WebProcess::singleton().parentProcessConnection();
+}
+
+void RemoteRealtimeAudioSource::startProducingData()
+{
+ connection()->send(Messages::UserMediaCaptureManagerProxy::StartProducingData { m_identifier }, 0);
+}
+
+void RemoteRealtimeAudioSource::stopProducingData()
+{
+ connection()->send(Messages::UserMediaCaptureManagerProxy::StopProducingData { m_identifier }, 0);
+}
+
+const WebCore::RealtimeMediaSourceCapabilities& RemoteRealtimeAudioSource::capabilities()
+{
+ return m_capabilities;
+}
+
+void RemoteRealtimeAudioSource::applyConstraints(const MediaConstraints& constraints, ApplyConstraintsHandler&& completionHandler)
+{
+ m_pendingApplyConstraintsCallbacks.append(WTFMove(completionHandler));
+ // FIXME: Use sendAsyncWithReply.
+ connection()->send(Messages::UserMediaCaptureManagerProxy::ApplyConstraints { m_identifier, constraints }, 0);
+}
+
+void RemoteRealtimeAudioSource::applyConstraintsSucceeded(RealtimeMediaSourceSettings&& settings)
+{
+ setSettings(WTFMove(settings));
+
+ auto callback = m_pendingApplyConstraintsCallbacks.takeFirst();
+ callback({ });
+}
+
+void RemoteRealtimeAudioSource::applyConstraintsFailed(String&& failedConstraint, String&& errorMessage)
+{
+ auto callback = m_pendingApplyConstraintsCallbacks.takeFirst();
+ callback(ApplyConstraintsError { WTFMove(failedConstraint), WTFMove(errorMessage) });
+}
+
+void RemoteRealtimeAudioSource::hasEnded()
+{
+ connection()->send(Messages::UserMediaCaptureManagerProxy::End { m_identifier }, 0);
+ m_manager.removeAudioSource(m_identifier);
+ m_manager.remoteCaptureSampleManager().removeSource(identifier());
+}
+
+void RemoteRealtimeAudioSource::captureStopped()
+{
+ stop();
+ hasEnded();
+}
+
+void RemoteRealtimeAudioSource::captureFailed()
+{
+ RealtimeMediaSource::captureFailed();
+ hasEnded();
+}
+
+#if ENABLE(GPU_PROCESS)
+void RemoteRealtimeAudioSource::gpuProcessConnectionDidClose(GPUProcessConnection&)
+{
+ ASSERT(m_shouldCaptureInGPUProcess);
+ if (isEnded())
+ return;
+
+ m_manager.remoteCaptureSampleManager().didUpdateSourceConnection(*this);
+ createRemoteMediaSource();
+ // FIXME: We should update the track according current settings.
+ if (isProducingData())
+ startProducingData();
+}
+#endif
+
+}
+
+#endif
Copied: trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeAudioSource.h (from rev 272718, trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSource.h) (0 => 272719)
--- trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeAudioSource.h (rev 0)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeAudioSource.h 2021-02-11 11:08:23 UTC (rev 272719)
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2020 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.
+ */
+
+#pragma once
+
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+
+#include "GPUProcessConnection.h"
+#include <WebCore/CaptureDevice.h>
+#include <WebCore/RealtimeMediaSource.h>
+#include <WebCore/RealtimeMediaSourceIdentifier.h>
+#include <wtf/Deque.h>
+
+namespace IPC {
+class Connection;
+}
+
+namespace WebCore {
+class CAAudioStreamDescription;
+class ImageTransferSessionVT;
+struct MediaConstraints;
+class RemoteVideoSample;
+}
+
+namespace WebKit {
+
+class UserMediaCaptureManager;
+
+class RemoteRealtimeAudioSource : public WebCore::RealtimeMediaSource
+#if ENABLE(GPU_PROCESS)
+ , public GPUProcessConnection::Client
+#endif
+{
+public:
+ static Ref<WebCore::RealtimeMediaSource> create(const WebCore::CaptureDevice&, const WebCore::MediaConstraints*, String&& name, String&& hashSalt, UserMediaCaptureManager&, bool shouldCaptureInGPUProcess);
+ ~RemoteRealtimeAudioSource();
+
+ WebCore::RealtimeMediaSourceIdentifier identifier() const { return m_identifier; }
+ IPC::Connection* connection();
+
+ void setSettings(WebCore::RealtimeMediaSourceSettings&&);
+
+ void applyConstraintsSucceeded(WebCore::RealtimeMediaSourceSettings&&);
+ void applyConstraintsFailed(String&& failedConstraint, String&& errorMessage);
+
+ void captureStopped();
+ void captureFailed() final;
+
+ void remoteAudioSamplesAvailable(const WTF::MediaTime&, const WebCore::PlatformAudioData&, const WebCore::AudioStreamDescription&, size_t);
+
+private:
+ RemoteRealtimeAudioSource(WebCore::RealtimeMediaSourceIdentifier, const WebCore::CaptureDevice&, const WebCore::MediaConstraints*, String&& name, String&& hashSalt, UserMediaCaptureManager&, bool shouldCaptureInGPUProcess);
+
+ // RealtimeMediaSource
+ void startProducingData() final;
+ void stopProducingData() final;
+ bool isCaptureSource() const final { return true; }
+ void beginConfiguration() final { }
+ void commitConfiguration() final { }
+ void applyConstraints(const WebCore::MediaConstraints&, ApplyConstraintsHandler&&) final;
+ void hasEnded() final;
+ const WebCore::RealtimeMediaSourceSettings& settings() final { return m_settings; }
+ const WebCore::RealtimeMediaSourceCapabilities& capabilities() final;
+ void whenReady(CompletionHandler<void(String)>&&) final;
+ WebCore::CaptureDevice::DeviceType deviceType() const final { return m_device.type(); }
+
+#if ENABLE(GPU_PROCESS)
+ // GPUProcessConnection::Client
+ void gpuProcessConnectionDidClose(GPUProcessConnection&) final;
+#endif
+
+ void createRemoteMediaSource();
+ void didFail(String&& errorMessage);
+ void setAsReady();
+ void setCapabilities(WebCore::RealtimeMediaSourceCapabilities&&);
+
+ WebCore::RealtimeMediaSourceIdentifier m_identifier;
+ UserMediaCaptureManager& m_manager;
+ WebCore::RealtimeMediaSourceCapabilities m_capabilities;
+ WebCore::RealtimeMediaSourceSettings m_settings;
+
+ Deque<ApplyConstraintsHandler> m_pendingApplyConstraintsCallbacks;
+ bool m_shouldCaptureInGPUProcess { false };
+ bool m_isReady { false };
+ String m_errorMessage;
+ CompletionHandler<void(String)> m_callback;
+ WebCore::CaptureDevice m_device;
+ WebCore::MediaConstraints m_constraints;
+};
+
+} // namespace WebKit
+
+#endif
Deleted: trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSource.cpp (272718 => 272719)
--- trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSource.cpp 2021-02-11 10:55:20 UTC (rev 272718)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSource.cpp 2021-02-11 11:08:23 UTC (rev 272719)
@@ -1,339 +0,0 @@
-/*
- * Copyright (C) 2020 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 "RemoteRealtimeMediaSource.h"
-
-#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
-
-#include "GPUProcessConnection.h"
-#include "SharedRingBufferStorage.h"
-#include "UserMediaCaptureManager.h"
-#include "UserMediaCaptureManagerMessages.h"
-#include "UserMediaCaptureManagerProxyMessages.h"
-#include "WebCoreArgumentCoders.h"
-#include "WebProcess.h"
-#include <WebCore/ImageTransferSessionVT.h>
-#include <WebCore/MediaConstraints.h>
-#include <WebCore/RealtimeMediaSource.h>
-#include <WebCore/RealtimeMediaSourceCenter.h>
-#include <WebCore/RemoteVideoSample.h>
-#include <WebCore/WebAudioBufferList.h>
-
-namespace WebKit {
-using namespace PAL;
-using namespace WebCore;
-
-Ref<RealtimeMediaSource> RemoteRealtimeMediaSource::create(const CaptureDevice& device, const MediaConstraints* constraints, String&& name, String&& hashSalt, UserMediaCaptureManager& manager, bool shouldCaptureInGPUProcess)
-{
- auto source = adoptRef(*new RemoteRealtimeMediaSource(RealtimeMediaSourceIdentifier::generate(), device, constraints, WTFMove(name), WTFMove(hashSalt), manager, shouldCaptureInGPUProcess));
- manager.addSource(source.copyRef());
- source->createRemoteMediaSource();
- return source;
-}
-
-static inline RealtimeMediaSource::Type sourceTypeFromDeviceType(CaptureDevice::DeviceType deviceType)
-{
- switch (deviceType) {
- case CaptureDevice::DeviceType::Microphone:
- return RealtimeMediaSource::Type::Audio;
- case CaptureDevice::DeviceType::Camera:
- case CaptureDevice::DeviceType::Screen:
- case CaptureDevice::DeviceType::Window:
- return RealtimeMediaSource::Type::Video;
- case CaptureDevice::DeviceType::Speaker:
- case CaptureDevice::DeviceType::Unknown:
- ASSERT_NOT_REACHED();
- }
- return RealtimeMediaSource::Type::None;
-}
-
-RemoteRealtimeMediaSource::RemoteRealtimeMediaSource(RealtimeMediaSourceIdentifier identifier, const CaptureDevice& device, const MediaConstraints* constraints, String&& name, String&& hashSalt, UserMediaCaptureManager& manager, bool shouldCaptureInGPUProcess)
- : RealtimeMediaSource(sourceTypeFromDeviceType(device.type()), WTFMove(name), String::number(identifier.toUInt64()), WTFMove(hashSalt))
- , m_identifier(identifier)
- , m_manager(manager)
- , m_device(device)
- , m_shouldCaptureInGPUProcess(shouldCaptureInGPUProcess)
-{
- if (constraints)
- m_constraints = *constraints;
-
- switch (m_device.type()) {
- case CaptureDevice::DeviceType::Microphone:
-#if PLATFORM(IOS_FAMILY)
- RealtimeMediaSourceCenter::singleton().audioCaptureFactory().setActiveSource(*this);
-#endif
- break;
- case CaptureDevice::DeviceType::Camera:
-#if PLATFORM(IOS_FAMILY)
- RealtimeMediaSourceCenter::singleton().videoCaptureFactory().setActiveSource(*this);
-#endif
- break;
- case CaptureDevice::DeviceType::Screen:
- case CaptureDevice::DeviceType::Window:
- break;
- case CaptureDevice::DeviceType::Speaker:
- case CaptureDevice::DeviceType::Unknown:
- ASSERT_NOT_REACHED();
- }
-}
-
-void RemoteRealtimeMediaSource::createRemoteMediaSource()
-{
- connection()->sendWithAsyncReply(Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints(identifier(), m_device, deviceIDHashSalt(), m_constraints), [this, protectedThis = makeRef(*this)](bool succeeded, auto&& errorMessage, auto&& settings, auto&& capabilities) {
- if (!succeeded) {
- didFail(WTFMove(errorMessage));
- return;
- }
- setName(String { settings.label().string() });
- setSettings(WTFMove(settings));
- setCapabilities(WTFMove(capabilities));
- setAsReady();
- if (m_shouldCaptureInGPUProcess)
- WebProcess::singleton().ensureGPUProcessConnection().addClient(*this);
- });
-}
-
-RemoteRealtimeMediaSource::~RemoteRealtimeMediaSource()
-{
- if (m_shouldCaptureInGPUProcess)
- WebProcess::singleton().ensureGPUProcessConnection().removeClient(*this);
-
- switch (m_device.type()) {
- case CaptureDevice::DeviceType::Microphone:
-#if PLATFORM(IOS_FAMILY)
- RealtimeMediaSourceCenter::singleton().audioCaptureFactory().unsetActiveSource(*this);
-#endif
- break;
- case CaptureDevice::DeviceType::Camera:
-#if PLATFORM(IOS_FAMILY)
- RealtimeMediaSourceCenter::singleton().videoCaptureFactory().unsetActiveSource(*this);
-#endif
- break;
- case CaptureDevice::DeviceType::Screen:
- case CaptureDevice::DeviceType::Window:
- break;
- case CaptureDevice::DeviceType::Speaker:
- case CaptureDevice::DeviceType::Unknown:
- ASSERT_NOT_REACHED();
- }
-}
-
-void RemoteRealtimeMediaSource::whenReady(CompletionHandler<void(String)>&& callback)
-{
- if (m_isReady)
- return callback(WTFMove(m_errorMessage));
- m_callback = WTFMove(callback);
-}
-
-void RemoteRealtimeMediaSource::didFail(String&& errorMessage)
-{
- m_isReady = true;
- m_errorMessage = WTFMove(errorMessage);
- if (m_callback)
- m_callback(m_errorMessage);
-}
-
-void RemoteRealtimeMediaSource::setAsReady()
-{
- m_isReady = true;
- if (m_callback)
- m_callback({ });
-}
-
-Ref<RealtimeMediaSource> RemoteRealtimeMediaSource::clone()
-{
- switch (type()) {
- case RealtimeMediaSource::Type::Video:
- return cloneVideoSource();
- case RealtimeMediaSource::Type::Audio:
- break;
- case RealtimeMediaSource::Type::None:
- ASSERT_NOT_REACHED();
- }
- return *this;
-}
-
-Ref<RealtimeMediaSource> RemoteRealtimeMediaSource::cloneVideoSource()
-{
- auto identifier = RealtimeMediaSourceIdentifier::generate();
- if (!connection()->send(Messages::UserMediaCaptureManagerProxy::Clone { m_identifier, identifier }, 0))
- return *this;
-
- auto cloneSource = adoptRef(*new RemoteRealtimeMediaSource(identifier, m_device, &m_constraints, String { m_settings.label().string() }, deviceIDHashSalt(), m_manager, m_shouldCaptureInGPUProcess));
- cloneSource->setSettings(RealtimeMediaSourceSettings { m_settings });
- m_manager.addSource(cloneSource.copyRef());
- return cloneSource;
-}
-
-void RemoteRealtimeMediaSource::setCapabilities(RealtimeMediaSourceCapabilities&& capabilities)
-{
- m_capabilities = WTFMove(capabilities);
-}
-
-void RemoteRealtimeMediaSource::setSettings(RealtimeMediaSourceSettings&& settings)
-{
- auto changed = m_settings.difference(settings);
- m_settings = WTFMove(settings);
- notifySettingsDidChangeObservers(changed);
-}
-
-void RemoteRealtimeMediaSource::remoteAudioSamplesAvailable(const WTF::MediaTime& time, const PlatformAudioData& data, const AudioStreamDescription& description, size_t size)
-{
- ASSERT(!isMainThread());
- audioSamplesAvailable(time, data, description, size);
-}
-
-void RemoteRealtimeMediaSource::remoteVideoSampleAvailable(RemoteVideoSample&& remoteSample)
-{
- ASSERT(type() == Type::Video);
-
- setIntrinsicSize(remoteSample.size());
-
- if (!m_imageTransferSession || m_imageTransferSession->pixelFormat() != remoteSample.videoFormat())
- m_imageTransferSession = ImageTransferSessionVT::create(remoteSample.videoFormat());
-
- if (!m_imageTransferSession) {
- ASSERT_NOT_REACHED();
- return;
- }
-
- auto sampleRef = m_imageTransferSession->createMediaSample(remoteSample);
- if (!sampleRef) {
- ASSERT_NOT_REACHED();
- return;
- }
-
- RealtimeMediaSource::videoSampleAvailable(*sampleRef);
-}
-
-IPC::Connection* RemoteRealtimeMediaSource::connection()
-{
- ASSERT(isMainThread());
-#if ENABLE(GPU_PROCESS)
- if (m_shouldCaptureInGPUProcess)
- return &WebProcess::singleton().ensureGPUProcessConnection().connection();
-#endif
- return WebProcess::singleton().parentProcessConnection();
-}
-
-void RemoteRealtimeMediaSource::startProducingData()
-{
- connection()->send(Messages::UserMediaCaptureManagerProxy::StartProducingData { m_identifier }, 0);
-}
-
-void RemoteRealtimeMediaSource::stopProducingData()
-{
- connection()->send(Messages::UserMediaCaptureManagerProxy::StopProducingData { m_identifier }, 0);
-}
-
-bool RemoteRealtimeMediaSource::setShouldApplyRotation(bool shouldApplyRotation)
-{
- connection()->send(Messages::UserMediaCaptureManagerProxy::SetShouldApplyRotation { m_identifier, shouldApplyRotation }, 0);
- return true;
-}
-
-const WebCore::RealtimeMediaSourceCapabilities& RemoteRealtimeMediaSource::capabilities()
-{
- return m_capabilities;
-}
-
-void RemoteRealtimeMediaSource::applyConstraints(const WebCore::MediaConstraints& constraints, ApplyConstraintsHandler&& completionHandler)
-{
- m_pendingApplyConstraintsCallbacks.append(WTFMove(completionHandler));
- // FIXME: Use sendAsyncWithReply.
- connection()->send(Messages::UserMediaCaptureManagerProxy::ApplyConstraints { m_identifier, constraints }, 0);
-}
-
-void RemoteRealtimeMediaSource::applyConstraintsSucceeded(const WebCore::RealtimeMediaSourceSettings& settings)
-{
- setSettings(WebCore::RealtimeMediaSourceSettings(settings));
-
- auto callback = m_pendingApplyConstraintsCallbacks.takeFirst();
- callback({ });
-}
-
-void RemoteRealtimeMediaSource::applyConstraintsFailed(String&& failedConstraint, String&& errorMessage)
-{
- auto callback = m_pendingApplyConstraintsCallbacks.takeFirst();
- callback(ApplyConstraintsError { WTFMove(failedConstraint), WTFMove(errorMessage) });
-}
-
-void RemoteRealtimeMediaSource::hasEnded()
-{
- connection()->send(Messages::UserMediaCaptureManagerProxy::End { m_identifier }, 0);
- m_manager.removeSource(m_identifier);
-}
-
-void RemoteRealtimeMediaSource::captureStopped()
-{
- stop();
- hasEnded();
-}
-
-void RemoteRealtimeMediaSource::captureFailed()
-{
- RealtimeMediaSource::captureFailed();
- hasEnded();
-}
-
-void RemoteRealtimeMediaSource::stopBeingObserved()
-{
- m_hasRequestedToEnd = true;
- connection()->send(Messages::UserMediaCaptureManagerProxy::RequestToEnd { m_identifier }, 0);
-}
-
-void RemoteRealtimeMediaSource::requestToEnd(Observer& observer)
-{
- switch (type()) {
- case Type::Audio:
- RealtimeMediaSource::requestToEnd(observer);
- break;
- case Type::Video:
- stopBeingObserved();
- break;
- case Type::None:
- ASSERT_NOT_REACHED();
- }
-}
-
-#if ENABLE(GPU_PROCESS)
-void RemoteRealtimeMediaSource::gpuProcessConnectionDidClose(GPUProcessConnection&)
-{
- ASSERT(m_shouldCaptureInGPUProcess);
- if (isEnded() || m_hasRequestedToEnd)
- return;
-
- m_manager.didUpdateSourceConnection(*this);
- createRemoteMediaSource();
- // FIXME: We should update the track according current settings.
- if (isProducingData())
- startProducingData();
-}
-#endif
-
-}
-
-#endif
Deleted: trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSource.h (272718 => 272719)
--- trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSource.h 2021-02-11 10:55:20 UTC (rev 272718)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSource.h 2021-02-11 11:08:23 UTC (rev 272719)
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2020 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.
- */
-
-#pragma once
-
-#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
-
-#include "GPUProcessConnection.h"
-#include <WebCore/CaptureDevice.h>
-#include <WebCore/RealtimeMediaSource.h>
-#include <WebCore/RealtimeMediaSourceIdentifier.h>
-#include <wtf/Deque.h>
-
-namespace IPC {
-class Connection;
-}
-
-namespace WebCore {
-class CAAudioStreamDescription;
-class ImageTransferSessionVT;
-struct MediaConstraints;
-class RemoteVideoSample;
-}
-
-namespace WebKit {
-
-class UserMediaCaptureManager;
-
-class RemoteRealtimeMediaSource : public WebCore::RealtimeMediaSource
-#if ENABLE(GPU_PROCESS)
- , public GPUProcessConnection::Client
-#endif
-{
-public:
- static Ref<WebCore::RealtimeMediaSource> create(const WebCore::CaptureDevice&, const WebCore::MediaConstraints*, String&& name, String&& hashSalt, UserMediaCaptureManager&, bool shouldCaptureInGPUProcess);
- ~RemoteRealtimeMediaSource();
-
- WebCore::RealtimeMediaSourceIdentifier identifier() const { return m_identifier; }
- IPC::Connection* connection();
-
- void setSettings(WebCore::RealtimeMediaSourceSettings&&);
-
- void applyConstraintsSucceeded(const WebCore::RealtimeMediaSourceSettings&);
- void applyConstraintsFailed(String&& failedConstraint, String&& errorMessage);
-
- void captureStopped();
- void captureFailed() final;
-
- void remoteVideoSampleAvailable(WebCore::RemoteVideoSample&&);
- void remoteAudioSamplesAvailable(const WTF::MediaTime&, const WebCore::PlatformAudioData&, const WebCore::AudioStreamDescription&, size_t);
-
-private:
- RemoteRealtimeMediaSource(WebCore::RealtimeMediaSourceIdentifier, const WebCore::CaptureDevice&, const WebCore::MediaConstraints*, String&& name, String&& hashSalt, UserMediaCaptureManager&, bool shouldCaptureInGPUProcess);
-
- // RealtimeMediaSource
- void startProducingData() final;
- void stopProducingData() final;
- bool isCaptureSource() const final { return true; }
- void beginConfiguration() final { }
- void commitConfiguration() final { }
- bool setShouldApplyRotation(bool /* shouldApplyRotation */) final;
- void applyConstraints(const WebCore::MediaConstraints&, ApplyConstraintsHandler&&) final;
- void requestToEnd(Observer&) final;
- void stopBeingObserved() final;
- void hasEnded() final;
- const WebCore::RealtimeMediaSourceSettings& settings() final { return m_settings; }
- const WebCore::RealtimeMediaSourceCapabilities& capabilities() final;
- void whenReady(CompletionHandler<void(String)>&&) final;
- WebCore::CaptureDevice::DeviceType deviceType() const final { return m_device.type(); }
- Ref<RealtimeMediaSource> clone() final;
-
-#if ENABLE(GPU_PROCESS)
- // GPUProcessConnection::Client
- void gpuProcessConnectionDidClose(GPUProcessConnection&) final;
-#endif
-
- void createRemoteMediaSource();
- void didFail(String&& errorMessage);
- void setAsReady();
- void setCapabilities(WebCore::RealtimeMediaSourceCapabilities&&);
- Ref<RealtimeMediaSource> cloneVideoSource();
-
- WebCore::RealtimeMediaSourceIdentifier m_identifier;
- UserMediaCaptureManager& m_manager;
- WebCore::RealtimeMediaSourceCapabilities m_capabilities;
- WebCore::RealtimeMediaSourceSettings m_settings;
-
- WebCore::CaptureDevice m_device;
- WebCore::MediaConstraints m_constraints;
-
- std::unique_ptr<WebCore::ImageTransferSessionVT> m_imageTransferSession;
-
- Deque<ApplyConstraintsHandler> m_pendingApplyConstraintsCallbacks;
- bool m_shouldCaptureInGPUProcess { false };
- bool m_isReady { false };
- bool m_hasRequestedToEnd { false };
- String m_errorMessage;
- CompletionHandler<void(String)> m_callback;
-};
-
-} // namespace WebKit
-
-#endif
Copied: trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.cpp (from rev 272718, trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSource.cpp) (0 => 272719)
--- trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.cpp (rev 0)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.cpp 2021-02-11 11:08:23 UTC (rev 272719)
@@ -0,0 +1,265 @@
+/*
+ * Copyright (C) 2020 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 "RemoteRealtimeVideoSource.h"
+
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+
+#include "GPUProcessConnection.h"
+#include "SharedRingBufferStorage.h"
+#include "UserMediaCaptureManager.h"
+#include "UserMediaCaptureManagerMessages.h"
+#include "UserMediaCaptureManagerProxyMessages.h"
+#include "WebCoreArgumentCoders.h"
+#include "WebProcess.h"
+#include <WebCore/ImageTransferSessionVT.h>
+#include <WebCore/MediaConstraints.h>
+#include <WebCore/RealtimeMediaSource.h>
+#include <WebCore/RealtimeMediaSourceCenter.h>
+#include <WebCore/RemoteVideoSample.h>
+#include <WebCore/WebAudioBufferList.h>
+
+namespace WebKit {
+using namespace PAL;
+using namespace WebCore;
+
+Ref<RealtimeMediaSource> RemoteRealtimeVideoSource::create(const CaptureDevice& device, const MediaConstraints* constraints, String&& name, String&& hashSalt, UserMediaCaptureManager& manager, bool shouldCaptureInGPUProcess)
+{
+ auto source = adoptRef(*new RemoteRealtimeVideoSource(RealtimeMediaSourceIdentifier::generate(), device, constraints, WTFMove(name), WTFMove(hashSalt), manager, shouldCaptureInGPUProcess));
+ manager.addVideoSource(source.copyRef());
+ source->createRemoteMediaSource();
+ return source;
+}
+
+RemoteRealtimeVideoSource::RemoteRealtimeVideoSource(RealtimeMediaSourceIdentifier identifier, const CaptureDevice& device, const MediaConstraints* constraints, String&& name, String&& hashSalt, UserMediaCaptureManager& manager, bool shouldCaptureInGPUProcess)
+ : RealtimeMediaSource(RealtimeMediaSource::Type::Video, WTFMove(name), String::number(identifier.toUInt64()), WTFMove(hashSalt))
+ , m_identifier(identifier)
+ , m_manager(manager)
+ , m_device(device)
+ , m_shouldCaptureInGPUProcess(shouldCaptureInGPUProcess)
+{
+ if (constraints)
+ m_constraints = *constraints;
+#if PLATFORM(IOS_FAMILY)
+ if (m_device.type() == CaptureDevice::DeviceType::Camera)
+ RealtimeMediaSourceCenter::singleton().videoCaptureFactory().setActiveSource(*this);
+#endif
+}
+
+void RemoteRealtimeVideoSource::createRemoteMediaSource()
+{
+ connection()->sendWithAsyncReply(Messages::UserMediaCaptureManagerProxy::CreateMediaSourceForCaptureDeviceWithConstraints(identifier(), m_device, deviceIDHashSalt(), m_constraints), [this, protectedThis = makeRef(*this)](bool succeeded, auto&& errorMessage, auto&& settings, auto&& capabilities) {
+ if (!succeeded) {
+ didFail(WTFMove(errorMessage));
+ return;
+ }
+ setName(String { settings.label().string() });
+ setSettings(WTFMove(settings));
+ setCapabilities(WTFMove(capabilities));
+ setAsReady();
+ if (m_shouldCaptureInGPUProcess)
+ WebProcess::singleton().ensureGPUProcessConnection().addClient(*this);
+ });
+}
+
+RemoteRealtimeVideoSource::~RemoteRealtimeVideoSource()
+{
+ if (m_shouldCaptureInGPUProcess)
+ WebProcess::singleton().ensureGPUProcessConnection().removeClient(*this);
+
+#if PLATFORM(IOS_FAMILY)
+ if (m_device.type() == CaptureDevice::DeviceType::Camera)
+ RealtimeMediaSourceCenter::singleton().videoCaptureFactory().unsetActiveSource(*this);
+#endif
+}
+
+void RemoteRealtimeVideoSource::whenReady(CompletionHandler<void(String)>&& callback)
+{
+ if (m_isReady)
+ return callback(WTFMove(m_errorMessage));
+ m_callback = WTFMove(callback);
+}
+
+void RemoteRealtimeVideoSource::didFail(String&& errorMessage)
+{
+ m_isReady = true;
+ m_errorMessage = WTFMove(errorMessage);
+ if (m_callback)
+ m_callback(m_errorMessage);
+}
+
+void RemoteRealtimeVideoSource::setAsReady()
+{
+ m_isReady = true;
+ if (m_callback)
+ m_callback({ });
+}
+
+Ref<RealtimeMediaSource> RemoteRealtimeVideoSource::clone()
+{
+ auto identifier = RealtimeMediaSourceIdentifier::generate();
+ if (!connection()->send(Messages::UserMediaCaptureManagerProxy::Clone { m_identifier, identifier }, 0))
+ return *this;
+
+ auto cloneSource = adoptRef(*new RemoteRealtimeVideoSource(identifier, m_device, &m_constraints, String { m_settings.label().string() }, deviceIDHashSalt(), m_manager, m_shouldCaptureInGPUProcess));
+ cloneSource->setSettings(RealtimeMediaSourceSettings { m_settings });
+ m_manager.addVideoSource(cloneSource.copyRef());
+ return cloneSource;
+}
+
+void RemoteRealtimeVideoSource::setCapabilities(RealtimeMediaSourceCapabilities&& capabilities)
+{
+ m_capabilities = WTFMove(capabilities);
+}
+
+void RemoteRealtimeVideoSource::setSettings(RealtimeMediaSourceSettings&& settings)
+{
+ auto changed = m_settings.difference(settings);
+ m_settings = WTFMove(settings);
+ notifySettingsDidChangeObservers(changed);
+}
+
+void RemoteRealtimeVideoSource::remoteVideoSampleAvailable(RemoteVideoSample&& remoteSample)
+{
+ ASSERT(type() == Type::Video);
+
+ setIntrinsicSize(remoteSample.size());
+
+ if (!m_imageTransferSession || m_imageTransferSession->pixelFormat() != remoteSample.videoFormat())
+ m_imageTransferSession = ImageTransferSessionVT::create(remoteSample.videoFormat());
+
+ if (!m_imageTransferSession) {
+ ASSERT_NOT_REACHED();
+ return;
+ }
+
+ auto sampleRef = m_imageTransferSession->createMediaSample(remoteSample);
+ if (!sampleRef) {
+ ASSERT_NOT_REACHED();
+ return;
+ }
+
+ RealtimeMediaSource::videoSampleAvailable(*sampleRef);
+}
+
+IPC::Connection* RemoteRealtimeVideoSource::connection()
+{
+ ASSERT(isMainThread());
+#if ENABLE(GPU_PROCESS)
+ if (m_shouldCaptureInGPUProcess)
+ return &WebProcess::singleton().ensureGPUProcessConnection().connection();
+#endif
+ return WebProcess::singleton().parentProcessConnection();
+}
+
+void RemoteRealtimeVideoSource::startProducingData()
+{
+ connection()->send(Messages::UserMediaCaptureManagerProxy::StartProducingData { m_identifier }, 0);
+}
+
+void RemoteRealtimeVideoSource::stopProducingData()
+{
+ connection()->send(Messages::UserMediaCaptureManagerProxy::StopProducingData { m_identifier }, 0);
+}
+
+bool RemoteRealtimeVideoSource::setShouldApplyRotation(bool shouldApplyRotation)
+{
+ connection()->send(Messages::UserMediaCaptureManagerProxy::SetShouldApplyRotation { m_identifier, shouldApplyRotation }, 0);
+ return true;
+}
+
+const RealtimeMediaSourceCapabilities& RemoteRealtimeVideoSource::capabilities()
+{
+ return m_capabilities;
+}
+
+void RemoteRealtimeVideoSource::applyConstraints(const MediaConstraints& constraints, ApplyConstraintsHandler&& completionHandler)
+{
+ m_pendingApplyConstraintsCallbacks.append(WTFMove(completionHandler));
+ // FIXME: Use sendAsyncWithReply.
+ connection()->send(Messages::UserMediaCaptureManagerProxy::ApplyConstraints { m_identifier, constraints }, 0);
+}
+
+void RemoteRealtimeVideoSource::applyConstraintsSucceeded(RealtimeMediaSourceSettings&& settings)
+{
+ setSettings(WTFMove(settings));
+
+ auto callback = m_pendingApplyConstraintsCallbacks.takeFirst();
+ callback({ });
+}
+
+void RemoteRealtimeVideoSource::applyConstraintsFailed(String&& failedConstraint, String&& errorMessage)
+{
+ auto callback = m_pendingApplyConstraintsCallbacks.takeFirst();
+ callback(ApplyConstraintsError { WTFMove(failedConstraint), WTFMove(errorMessage) });
+}
+
+void RemoteRealtimeVideoSource::hasEnded()
+{
+ connection()->send(Messages::UserMediaCaptureManagerProxy::End { m_identifier }, 0);
+ m_manager.removeAudioSource(m_identifier);
+}
+
+void RemoteRealtimeVideoSource::captureStopped()
+{
+ stop();
+ hasEnded();
+}
+
+void RemoteRealtimeVideoSource::captureFailed()
+{
+ RealtimeMediaSource::captureFailed();
+ hasEnded();
+}
+
+void RemoteRealtimeVideoSource::stopBeingObserved()
+{
+ m_hasRequestedToEnd = true;
+ connection()->send(Messages::UserMediaCaptureManagerProxy::RequestToEnd { m_identifier }, 0);
+}
+
+void RemoteRealtimeVideoSource::requestToEnd(Observer& observer)
+{
+ stopBeingObserved();
+}
+
+#if ENABLE(GPU_PROCESS)
+void RemoteRealtimeVideoSource::gpuProcessConnectionDidClose(GPUProcessConnection&)
+{
+ ASSERT(m_shouldCaptureInGPUProcess);
+ if (isEnded() || m_hasRequestedToEnd)
+ return;
+
+ createRemoteMediaSource();
+ // FIXME: We should update the track according current settings.
+ if (isProducingData())
+ startProducingData();
+}
+#endif
+
+}
+
+#endif
Copied: trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.h (from rev 272718, trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSource.h) (0 => 272719)
--- trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.h (rev 0)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.h 2021-02-11 11:08:23 UTC (rev 272719)
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2020 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.
+ */
+
+#pragma once
+
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+
+#include "GPUProcessConnection.h"
+#include <WebCore/CaptureDevice.h>
+#include <WebCore/RealtimeMediaSource.h>
+#include <WebCore/RealtimeMediaSourceIdentifier.h>
+#include <wtf/Deque.h>
+
+namespace IPC {
+class Connection;
+}
+
+namespace WebCore {
+class CAAudioStreamDescription;
+class ImageTransferSessionVT;
+struct MediaConstraints;
+class RemoteVideoSample;
+}
+
+namespace WebKit {
+
+class UserMediaCaptureManager;
+
+class RemoteRealtimeVideoSource : public WebCore::RealtimeMediaSource
+#if ENABLE(GPU_PROCESS)
+ , public GPUProcessConnection::Client
+#endif
+{
+public:
+ static Ref<WebCore::RealtimeMediaSource> create(const WebCore::CaptureDevice&, const WebCore::MediaConstraints*, String&& name, String&& hashSalt, UserMediaCaptureManager&, bool shouldCaptureInGPUProcess);
+ ~RemoteRealtimeVideoSource();
+
+ WebCore::RealtimeMediaSourceIdentifier identifier() const { return m_identifier; }
+ IPC::Connection* connection();
+
+ void setSettings(WebCore::RealtimeMediaSourceSettings&&);
+
+ void applyConstraintsSucceeded(WebCore::RealtimeMediaSourceSettings&&);
+ void applyConstraintsFailed(String&& failedConstraint, String&& errorMessage);
+
+ void captureStopped();
+ void captureFailed() final;
+
+ void remoteVideoSampleAvailable(WebCore::RemoteVideoSample&&);
+
+private:
+ RemoteRealtimeVideoSource(WebCore::RealtimeMediaSourceIdentifier, const WebCore::CaptureDevice&, const WebCore::MediaConstraints*, String&& name, String&& hashSalt, UserMediaCaptureManager&, bool shouldCaptureInGPUProcess);
+
+ // RealtimeMediaSource
+ void startProducingData() final;
+ void stopProducingData() final;
+ bool isCaptureSource() const final { return true; }
+ void beginConfiguration() final { }
+ void commitConfiguration() final { }
+ bool setShouldApplyRotation(bool /* shouldApplyRotation */) final;
+ void applyConstraints(const WebCore::MediaConstraints&, ApplyConstraintsHandler&&) final;
+ void requestToEnd(Observer&) final;
+ void stopBeingObserved() final;
+ void hasEnded() final;
+ const WebCore::RealtimeMediaSourceSettings& settings() final { return m_settings; }
+ const WebCore::RealtimeMediaSourceCapabilities& capabilities() final;
+ void whenReady(CompletionHandler<void(String)>&&) final;
+ WebCore::CaptureDevice::DeviceType deviceType() const final { return m_device.type(); }
+ Ref<RealtimeMediaSource> clone() final;
+
+#if ENABLE(GPU_PROCESS)
+ // GPUProcessConnection::Client
+ void gpuProcessConnectionDidClose(GPUProcessConnection&) final;
+#endif
+
+ void createRemoteMediaSource();
+ void didFail(String&& errorMessage);
+ void setAsReady();
+ void setCapabilities(WebCore::RealtimeMediaSourceCapabilities&&);
+
+ WebCore::RealtimeMediaSourceIdentifier m_identifier;
+ UserMediaCaptureManager& m_manager;
+ WebCore::RealtimeMediaSourceCapabilities m_capabilities;
+ WebCore::RealtimeMediaSourceSettings m_settings;
+
+ WebCore::CaptureDevice m_device;
+ WebCore::MediaConstraints m_constraints;
+
+ std::unique_ptr<WebCore::ImageTransferSessionVT> m_imageTransferSession;
+
+ Deque<ApplyConstraintsHandler> m_pendingApplyConstraintsCallbacks;
+ bool m_shouldCaptureInGPUProcess { false };
+ bool m_isReady { false };
+ bool m_hasRequestedToEnd { false };
+ String m_errorMessage;
+ CompletionHandler<void(String)> m_callback;
+};
+
+} // namespace WebKit
+
+#endif
Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp (272718 => 272719)
--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp 2021-02-11 10:55:20 UTC (rev 272718)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp 2021-02-11 11:08:23 UTC (rev 272719)
@@ -30,7 +30,8 @@
#include "AudioMediaStreamTrackRenderer.h"
#include "GPUProcessConnection.h"
-#include "RemoteRealtimeMediaSource.h"
+#include "RemoteRealtimeAudioSource.h"
+#include "RemoteRealtimeVideoSource.h"
#include "UserMediaCaptureManagerMessages.h"
#include "WebCoreArgumentCoders.h"
#include "WebProcess.h"
@@ -85,61 +86,88 @@
RealtimeMediaSourceCenter::singleton().setDisplayCaptureFactory(m_displayFactory);
}
-void UserMediaCaptureManager::addSource(Ref<RemoteRealtimeMediaSource>&& source)
+void UserMediaCaptureManager::addAudioSource(Ref<RemoteRealtimeAudioSource>&& source)
{
- if (source->type() == RealtimeMediaSource::Type::Audio)
- m_remoteAudioCaptureSampleManager.addSource(source.copyRef());
+ auto identifier = source->identifier();
+ ASSERT(!m_audioSources.contains(identifier));
+ m_audioSources.add(identifier, WTFMove(source));
+}
+void UserMediaCaptureManager::removeAudioSource(RealtimeMediaSourceIdentifier id)
+{
+ m_audioSources.remove(id);
+}
+
+void UserMediaCaptureManager::addVideoSource(Ref<RemoteRealtimeVideoSource>&& source)
+{
auto identifier = source->identifier();
- ASSERT(!m_sources.contains(identifier));
- m_sources.add(identifier, WTFMove(source));
+ ASSERT(!m_videoSources.contains(identifier));
+ m_videoSources.add(identifier, WTFMove(source));
}
-void UserMediaCaptureManager::removeSource(RealtimeMediaSourceIdentifier id)
+void UserMediaCaptureManager::removeVideoSource(RealtimeMediaSourceIdentifier id)
{
- m_sources.remove(id);
+ m_videoSources.remove(id);
}
void UserMediaCaptureManager::sourceStopped(RealtimeMediaSourceIdentifier id)
{
- if (auto source = m_sources.get(id))
+ if (auto source = m_audioSources.get(id))
source->captureStopped();
+ else if (auto source = m_videoSources.get(id))
+ source->captureStopped();
}
+void UserMediaCaptureManager::sourceEnded(WebCore::RealtimeMediaSourceIdentifier identifier)
+{
+ m_audioSources.remove(identifier);
+ m_videoSources.remove(identifier);
+}
+
void UserMediaCaptureManager::captureFailed(RealtimeMediaSourceIdentifier id)
{
- if (auto source = m_sources.get(id))
+ if (auto source = m_audioSources.get(id))
source->captureFailed();
+ else if (auto source = m_videoSources.get(id))
+ source->captureFailed();
}
void UserMediaCaptureManager::sourceMutedChanged(RealtimeMediaSourceIdentifier id, bool muted)
{
- if (auto source = m_sources.get(id))
+ if (auto source = m_audioSources.get(id))
source->setMuted(muted);
+ else if (auto source = m_videoSources.get(id))
+ source->setMuted(muted);
}
-void UserMediaCaptureManager::sourceSettingsChanged(RealtimeMediaSourceIdentifier id, const RealtimeMediaSourceSettings& settings)
+void UserMediaCaptureManager::sourceSettingsChanged(RealtimeMediaSourceIdentifier id, RealtimeMediaSourceSettings&& settings)
{
- if (auto source = m_sources.get(id))
- source->setSettings(RealtimeMediaSourceSettings(settings));
+ if (auto source = m_audioSources.get(id))
+ source->setSettings(WTFMove(settings));
+ else if (auto source = m_videoSources.get(id))
+ source->setSettings(WTFMove(settings));
}
void UserMediaCaptureManager::remoteVideoSampleAvailable(RealtimeMediaSourceIdentifier id, RemoteVideoSample&& sample)
{
- if (auto source = m_sources.get(id))
+ if (auto source = m_videoSources.get(id))
source->remoteVideoSampleAvailable(WTFMove(sample));
}
-void UserMediaCaptureManager::applyConstraintsSucceeded(RealtimeMediaSourceIdentifier id, const RealtimeMediaSourceSettings& settings)
+void UserMediaCaptureManager::applyConstraintsSucceeded(RealtimeMediaSourceIdentifier id, RealtimeMediaSourceSettings&& settings)
{
- if (auto source = m_sources.get(id))
- source->applyConstraintsSucceeded(settings);
+ if (auto source = m_audioSources.get(id))
+ source->applyConstraintsSucceeded(WTFMove(settings));
+ else if (auto source = m_videoSources.get(id))
+ source->applyConstraintsSucceeded(WTFMove(settings));
}
void UserMediaCaptureManager::applyConstraintsFailed(RealtimeMediaSourceIdentifier id, String&& failedConstraint, String&& message)
{
- if (auto source = m_sources.get(id))
+ if (auto source = m_audioSources.get(id))
source->applyConstraintsFailed(WTFMove(failedConstraint), WTFMove(message));
+ else if (auto source = m_videoSources.get(id))
+ source->applyConstraintsFailed(WTFMove(failedConstraint), WTFMove(message));
}
CaptureSourceOrError UserMediaCaptureManager::AudioFactory::createAudioCaptureSource(const CaptureDevice& device, String&& hashSalt, const MediaConstraints* constraints)
@@ -155,7 +183,7 @@
DeprecatedGlobalSettings::setShouldManageAudioSessionCategory(true);
#endif
- return RemoteRealtimeMediaSource::create(device, constraints, { }, WTFMove(hashSalt), m_manager, m_shouldCaptureInGPUProcess);
+ return RemoteRealtimeAudioSource::create(device, constraints, { }, WTFMove(hashSalt), m_manager, m_shouldCaptureInGPUProcess);
}
void UserMediaCaptureManager::AudioFactory::setShouldCaptureInGPUProcess(bool value)
@@ -170,7 +198,7 @@
return CaptureSourceOrError { "Video capture in GPUProcess is not implemented"_s };
#endif
- return RemoteRealtimeMediaSource::create(device, constraints, { }, WTFMove(hashSalt), m_manager, m_shouldCaptureInGPUProcess);
+ return RemoteRealtimeVideoSource::create(device, constraints, { }, WTFMove(hashSalt), m_manager, m_shouldCaptureInGPUProcess);
}
#if PLATFORM(IOS_FAMILY)
@@ -182,15 +210,9 @@
CaptureSourceOrError UserMediaCaptureManager::DisplayFactory::createDisplayCaptureSource(const CaptureDevice& device, const MediaConstraints* constraints)
{
- return RemoteRealtimeMediaSource::create(device, constraints, { }, { }, m_manager, false);
+ return RemoteRealtimeVideoSource::create(device, constraints, { }, { }, m_manager, false);
}
-void UserMediaCaptureManager::didUpdateSourceConnection(RemoteRealtimeMediaSource& source)
-{
- if (source.type() == RealtimeMediaSource::Type::Audio)
- m_remoteAudioCaptureSampleManager.didUpdateSourceConnection(source);
}
-}
-
#endif
Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h (272718 => 272719)
--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h 2021-02-11 10:55:20 UTC (rev 272718)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h 2021-02-11 11:08:23 UTC (rev 272719)
@@ -43,7 +43,8 @@
namespace WebKit {
-class RemoteRealtimeMediaSource;
+class RemoteRealtimeAudioSource;
+class RemoteRealtimeVideoSource;
class WebProcess;
class UserMediaCaptureManager : public WebProcessSupplement, public IPC::MessageReceiver {
@@ -57,10 +58,14 @@
void didReceiveMessageFromGPUProcess(IPC::Connection& connection, IPC::Decoder& decoder) { didReceiveMessage(connection, decoder); }
void setupCaptureProcesses(bool shouldCaptureAudioInUIProcess, bool shouldCaptureAudioInGPUProcess, bool shouldCaptureVideoInUIProcess, bool shouldCaptureVideoInGPUProcess, bool shouldCaptureDisplayInUIProcess);
- void addSource(Ref<RemoteRealtimeMediaSource>&&);
- void removeSource(WebCore::RealtimeMediaSourceIdentifier);
- void didUpdateSourceConnection(RemoteRealtimeMediaSource&);
+ void addAudioSource(Ref<RemoteRealtimeAudioSource>&&);
+ void removeAudioSource(WebCore::RealtimeMediaSourceIdentifier);
+ void addVideoSource(Ref<RemoteRealtimeVideoSource>&&);
+ void removeVideoSource(WebCore::RealtimeMediaSourceIdentifier);
+
+ RemoteCaptureSampleManager& remoteCaptureSampleManager() { return m_remoteCaptureSampleManager; }
+
private:
// WebCore::RealtimeMediaSource factories
class AudioFactory : public WebCore::AudioCaptureFactory {
@@ -122,22 +127,21 @@
// Messages::UserMediaCaptureManager
void captureFailed(WebCore::RealtimeMediaSourceIdentifier);
void sourceStopped(WebCore::RealtimeMediaSourceIdentifier);
- void sourceEnded(WebCore::RealtimeMediaSourceIdentifier identifier) { removeSource(identifier); }
+ void sourceEnded(WebCore::RealtimeMediaSourceIdentifier);
void sourceMutedChanged(WebCore::RealtimeMediaSourceIdentifier, bool muted);
- void sourceSettingsChanged(WebCore::RealtimeMediaSourceIdentifier, const WebCore::RealtimeMediaSourceSettings&);
+ void sourceSettingsChanged(WebCore::RealtimeMediaSourceIdentifier, WebCore::RealtimeMediaSourceSettings&&);
void remoteVideoSampleAvailable(WebCore::RealtimeMediaSourceIdentifier, WebCore::RemoteVideoSample&&);
- void applyConstraintsSucceeded(WebCore::RealtimeMediaSourceIdentifier, const WebCore::RealtimeMediaSourceSettings&);
+ void applyConstraintsSucceeded(WebCore::RealtimeMediaSourceIdentifier, WebCore::RealtimeMediaSourceSettings&&);
void applyConstraintsFailed(WebCore::RealtimeMediaSourceIdentifier, String&&, String&&);
- Ref<WebCore::RealtimeMediaSource> cloneVideoSource(RemoteRealtimeMediaSource&);
-
- HashMap<WebCore::RealtimeMediaSourceIdentifier, Ref<RemoteRealtimeMediaSource>> m_sources;
+ HashMap<WebCore::RealtimeMediaSourceIdentifier, Ref<RemoteRealtimeAudioSource>> m_audioSources;
+ HashMap<WebCore::RealtimeMediaSourceIdentifier, Ref<RemoteRealtimeVideoSource>> m_videoSources;
WebProcess& m_process;
NoOpCaptureDeviceManager m_noOpCaptureDeviceManager;
AudioFactory m_audioFactory;
VideoFactory m_videoFactory;
DisplayFactory m_displayFactory;
- RemoteCaptureSampleManager m_remoteAudioCaptureSampleManager;
+ RemoteCaptureSampleManager m_remoteCaptureSampleManager;
};
} // namespace WebKit