Title: [272719] trunk/Source/WebKit
Revision
272719
Author
[email protected]
Date
2021-02-11 03:08:23 -0800 (Thu, 11 Feb 2021)

Log Message

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):

Modified Paths

Added Paths

Removed Paths

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
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to