Changeset 275871 in webkit
- Timestamp:
- Apr 13, 2021, 1:38:14 AM (6 years ago)
- Location:
- trunk/Source
- Files:
-
- 9 edited
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/platform/mediastream/CaptureDevice.h (modified) (1 diff)
-
WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp (modified) (5 diffs)
-
WebCore/platform/mediastream/RealtimeMediaSourceCenter.h (modified) (4 diffs)
-
WebKit/ChangeLog (modified) (1 diff)
-
WebKit/UIProcess/UserMediaProcessManager.cpp (modified) (5 diffs)
-
WebKit/UIProcess/UserMediaProcessManager.h (modified) (3 diffs)
-
WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp (modified) (2 diffs)
-
WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.h (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r275869 r275871 1 2021-04-13 Philippe Normand <pnormand@igalia.com> 2 3 [GStreamer] CaptureDevice monitor used from UIProcess 4 https://bugs.webkit.org/show_bug.cgi?id=222888 5 6 Reviewed by Youenn Fablet . 7 8 Move the device observer infrastructure from the WebKit UserMediaProcessManager to the 9 RealtimeMediaSourceCenter. 10 11 * platform/mediastream/CaptureDevice.h: 12 (WebCore::haveDevicesChanged): 13 * platform/mediastream/RealtimeMediaSourceCenter.cpp: 14 (WebCore::RealtimeMediaSourceCenter::RealtimeMediaSourceCenter): 15 (WebCore::RealtimeMediaSourceCenter::Observer::~Observer): 16 (WebCore::RealtimeMediaSourceCenter::addDevicesChangedObserver): 17 (WebCore::RealtimeMediaSourceCenter::removeDevicesChangedObserver): 18 (WebCore::RealtimeMediaSourceCenter::captureDevicesChanged): 19 (WebCore::RealtimeMediaSourceCenter::triggerDevicesChangedObservers): 20 (WebCore::RealtimeMediaSourceCenter::setDevicesChangedObserver): Deleted. 21 * platform/mediastream/RealtimeMediaSourceCenter.h: 22 (WebCore::RealtimeMediaSourceCenter::Observer::devicesChanged): 23 1 24 2021-04-13 Antoine Quint <graouts@webkit.org> 2 25 -
trunk/Source/WebCore/platform/mediastream/CaptureDevice.h
r274819 r275871 141 141 }; 142 142 143 inline bool haveDevicesChanged(const Vector<CaptureDevice>& oldDevices, const Vector<CaptureDevice>& newDevices) 144 { 145 if (oldDevices.size() != newDevices.size()) 146 return true; 147 148 for (auto& newDevice : newDevices) { 149 if (newDevice.type() != CaptureDevice::DeviceType::Camera && newDevice.type() != CaptureDevice::DeviceType::Microphone) 150 continue; 151 152 auto index = oldDevices.findMatching([&newDevice](auto& oldDevice) { 153 return newDevice.persistentId() == oldDevice.persistentId() && newDevice.enabled() != oldDevice.enabled(); 154 }); 155 156 if (index == notFound) 157 return true; 158 } 159 160 return false; 161 } 162 143 163 } // namespace WebCore 144 164 -
trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp
r271471 r275871 43 43 namespace WebCore { 44 44 45 static const Seconds deviceChangeDebounceTimerInterval { 200_ms }; 46 45 47 RealtimeMediaSourceCenter& RealtimeMediaSourceCenter::singleton() 46 48 { … … 51 53 52 54 RealtimeMediaSourceCenter::RealtimeMediaSourceCenter() 55 : m_debounceTimer(RunLoop::main(), this, &RealtimeMediaSourceCenter::triggerDevicesChangedObservers) 53 56 { 54 57 m_supportedConstraints.setSupportsEchoCancellation(true); … … 63 66 64 67 RealtimeMediaSourceCenter::~RealtimeMediaSourceCenter() = default; 68 69 RealtimeMediaSourceCenter::Observer::~Observer() = default; 65 70 66 71 void RealtimeMediaSourceCenter::createMediaStream(Ref<const Logger>&& logger, NewMediaStreamHandler&& completionHandler, String&& hashSalt, CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, const MediaStreamRequest& request) … … 189 194 } 190 195 191 void RealtimeMediaSourceCenter:: setDevicesChangedObserver(std::function<void()>&& observer)196 void RealtimeMediaSourceCenter::addDevicesChangedObserver(Observer& observer) 192 197 { 193 198 ASSERT(isMainThread()); 194 ASSERT(!m_deviceChangedObserver); 195 m_deviceChangedObserver = WTFMove(observer); 199 m_observers.add(observer); 200 } 201 202 void RealtimeMediaSourceCenter::removeDevicesChangedObserver(Observer& observer) 203 { 204 ASSERT(isMainThread()); 205 m_observers.remove(observer); 196 206 } 197 207 … … 199 209 { 200 210 ASSERT(isMainThread()); 201 if (m_deviceChangedObserver) 202 m_deviceChangedObserver(); 211 212 // When a device with camera and microphone is attached or detached, the CaptureDevice notification for 213 // the different devices won't arrive at the same time so delay a bit so we can coalesce the callbacks. 214 if (!m_debounceTimer.isActive()) 215 m_debounceTimer.startOneShot(deviceChangeDebounceTimerInterval); 216 } 217 218 void RealtimeMediaSourceCenter::triggerDevicesChangedObservers() 219 { 220 auto protectedThis = makeRef(*this); 221 m_observers.forEach([](auto& observer) { 222 observer.devicesChanged(); 223 }); 203 224 } 204 225 -
trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.h
r271471 r275871 40 40 #include "RealtimeMediaSourceFactory.h" 41 41 #include "RealtimeMediaSourceSupportedConstraints.h" 42 #include "UserMediaClient.h" 42 43 #include <wtf/Function.h> 43 44 #include <wtf/RefPtr.h> 45 #include <wtf/RunLoop.h> 44 46 #include <wtf/text/WTFString.h> 45 47 … … 53 55 54 56 struct MediaConstraints; 55 56 class RealtimeMediaSourceCenter{57 58 class WEBCORE_EXPORT RealtimeMediaSourceCenter : public ThreadSafeRefCounted<RealtimeMediaSourceCenter, WTF::DestructionThread::MainRunLoop> { 57 59 public: 60 class Observer : public CanMakeWeakPtr<Observer> { 61 public: 62 virtual ~Observer(); 63 64 virtual void devicesChanged() = 0; 65 }; 66 58 67 ~RealtimeMediaSourceCenter(); 59 68 … … 85 94 WEBCORE_EXPORT String hashStringWithSalt(const String& id, const String& hashSalt); 86 95 87 WEBCORE_EXPORT void setDevicesChangedObserver(std::function<void()>&&); 96 WEBCORE_EXPORT void addDevicesChangedObserver(Observer&); 97 WEBCORE_EXPORT void removeDevicesChangedObserver(Observer&); 88 98 89 99 void captureDevicesChanged(); … … 109 119 RealtimeMediaSourceSupportedConstraints m_supportedConstraints; 110 120 111 WTF::Function<void()> m_deviceChangedObserver; 121 RunLoop::Timer<RealtimeMediaSourceCenter> m_debounceTimer; 122 void triggerDevicesChangedObservers(); 123 124 WeakHashSet<Observer> m_observers; 112 125 113 126 AudioCaptureFactory* m_audioCaptureFactoryOverride { nullptr }; -
trunk/Source/WebKit/ChangeLog
r275861 r275871 1 2021-04-13 Philippe Normand <pnormand@igalia.com> 2 3 [GStreamer] CaptureDevice monitor used from UIProcess 4 https://bugs.webkit.org/show_bug.cgi?id=222888 5 6 Reviewed by Youenn Fablet. 7 8 GStreamer ports aim to reduce usage of the GStreamer library in the UIProcess and thus 9 should not relay capture devicechange monitoring to the UIProcess. For the long term we plan 10 to migrate media processing to the GPUProcess but for now we have to maintain the media 11 pipelines in the WebProcess. Initializing GStreamer in multiple processes (including the 12 UIProcess) has a significant performance impact on embedded platforms, that's why we try to 13 avoid it as much as possible. 14 15 The device monitoring code from the UserMediaProcessManager was partly moved to the 16 RealtimeMediaSourceCenter so that it can be easily reused by GStreamer ports from the 17 UserMediaPermissionRequestManager. 18 19 * UIProcess/UserMediaProcessManager.cpp: 20 (WebKit::UserMediaProcessManager::UserMediaProcessManager): 21 (WebKit::UserMediaProcessManager::updateCaptureDevices): 22 (WebKit::UserMediaProcessManager::devicesChanged): 23 (WebKit::UserMediaProcessManager::beginMonitoringCaptureDevices): 24 * UIProcess/UserMediaProcessManager.h: 25 * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp: 26 (WebKit::UserMediaPermissionRequestManager::UserMediaPermissionRequestManager): 27 (WebKit::UserMediaPermissionRequestManager::updateCaptureDevices): 28 (WebKit::UserMediaPermissionRequestManager::DeviceObserver::devicesChanged): 29 (WebKit::UserMediaPermissionRequestManager::addDeviceChangeObserver): 30 * WebProcess/MediaStream/UserMediaPermissionRequestManager.h: 31 (WebKit::UserMediaPermissionRequestManager::DeviceObserver::DeviceObserver): 32 1 33 2021-04-12 Julian Gonzalez <julian_a_gonzalez@apple.com> 2 34 -
trunk/Source/WebKit/UIProcess/UserMediaProcessManager.cpp
r274279 r275871 28 28 #include "WebProcessMessages.h" 29 29 #include "WebProcessProxy.h" 30 #include <WebCore/RealtimeMediaSourceCenter.h>31 30 #include <wtf/HashMap.h> 32 31 #include <wtf/NeverDestroyed.h> … … 42 41 #endif 43 42 44 static const Seconds deviceChangeDebounceTimerInterval { 200_ms };45 46 43 UserMediaProcessManager& UserMediaProcessManager::singleton() 47 44 { … … 51 48 52 49 UserMediaProcessManager::UserMediaProcessManager() 53 : m_debounceTimer(RunLoop::main(), this, &UserMediaProcessManager::captureDevicesChanged)54 50 { 55 51 } … … 217 213 void UserMediaProcessManager::updateCaptureDevices(ShouldNotify shouldNotify) 218 214 { 219 WebCore::RealtimeMediaSourceCenter::singleton().getMediaStreamDevices([this, shouldNotify] (auto&& newDevices) mutable { 220 auto oldDevices = WTFMove(m_captureDevices); 215 WebCore::RealtimeMediaSourceCenter::singleton().getMediaStreamDevices([weakThis = makeWeakPtr(*this), this, shouldNotify](auto&& newDevices) mutable { 216 if (!weakThis) 217 return; 218 219 if (!haveDevicesChanged(m_captureDevices, newDevices)) 220 return; 221 221 222 m_captureDevices = WTFMove(newDevices); 222 223 if (shouldNotify == ShouldNotify::No) 224 return; 225 226 if (m_captureDevices.size() == oldDevices.size()) { 227 bool haveChanges = false; 228 for (auto &newDevice : m_captureDevices) { 229 if (newDevice.type() != WebCore::CaptureDevice::DeviceType::Camera && newDevice.type() != WebCore::CaptureDevice::DeviceType::Microphone) 230 continue; 231 232 auto index = oldDevices.findMatching([&newDevice] (auto& oldDevice) { 233 return newDevice.persistentId() == oldDevice.persistentId() && newDevice.enabled() != oldDevice.enabled(); 234 }); 235 236 if (index == notFound) { 237 haveChanges = true; 238 break; 239 } 240 } 241 242 if (!haveChanges) 243 return; 244 } 245 246 // When a device with camera and microphone is attached or detached, the CaptureDevice notification for 247 // the different devices won't arrive at the same time so delay a bit so we can coalesce the callbacks. 248 if (!m_debounceTimer.isActive()) 249 m_debounceTimer.startOneShot(deviceChangeDebounceTimerInterval); 250 }); 223 if (shouldNotify == ShouldNotify::Yes) 224 captureDevicesChanged(); 225 }); 226 } 227 228 void UserMediaProcessManager::devicesChanged() 229 { 230 updateCaptureDevices(ShouldNotify::Yes); 251 231 } 252 232 … … 257 237 std::call_once(onceFlag, [this] { 258 238 updateCaptureDevices(ShouldNotify::No); 259 260 WebCore::RealtimeMediaSourceCenter::singleton().setDevicesChangedObserver([this]() { 261 updateCaptureDevices(ShouldNotify::Yes); 262 }); 239 WebCore::RealtimeMediaSourceCenter::singleton().addDevicesChangedObserver(*this); 263 240 }); 264 241 } -
trunk/Source/WebKit/UIProcess/UserMediaProcessManager.h
r271471 r275871 24 24 #include <WebCore/CaptureDevice.h> 25 25 #include <WebCore/PageIdentifier.h> 26 #include <wtf/RunLoop.h> 26 #include <WebCore/RealtimeMediaSourceCenter.h> 27 #include <WebCore/UserMediaClient.h> 28 #include <wtf/WeakPtr.h> 27 29 28 30 namespace WebKit { … … 30 32 class WebProcessProxy; 31 33 32 class UserMediaProcessManager {34 class UserMediaProcessManager : public WebCore::RealtimeMediaSourceCenter::Observer { 33 35 public: 34 36 … … 49 51 50 52 private: 51 enum class ShouldNotify { Yes, No};53 enum class ShouldNotify : bool { No, Yes }; 52 54 void updateCaptureDevices(ShouldNotify); 53 55 void captureDevicesChanged(); 54 56 57 // RealtimeMediaSourceCenter::Observer 58 void devicesChanged() final; 59 55 60 Vector<WebCore::CaptureDevice> m_captureDevices; 56 RunLoop::Timer<UserMediaProcessManager> m_debounceTimer;57 61 bool m_captureEnabled { true }; 58 62 bool m_denyNextRequest { false }; -
trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp
r269676 r275871 149 149 } 150 150 151 #if USE(GSTREAMER) 152 void UserMediaPermissionRequestManager::updateCaptureDevices(ShouldNotify shouldNotify) 153 { 154 WebCore::RealtimeMediaSourceCenter::singleton().getMediaStreamDevices([weakThis = makeWeakPtr(*this), this, shouldNotify](auto&& newDevices) mutable { 155 if (!weakThis) 156 return; 157 158 if (!haveDevicesChanged(m_captureDevices, newDevices)) 159 return; 160 161 m_captureDevices = WTFMove(newDevices); 162 if (shouldNotify == ShouldNotify::Yes) 163 captureDevicesChanged(); 164 }); 165 } 166 167 void UserMediaPermissionRequestManager::devicesChanged() 168 { 169 updateCaptureDevices(ShouldNotify::Yes); 170 } 171 #endif 172 151 173 UserMediaClient::DeviceChangeObserverToken UserMediaPermissionRequestManager::addDeviceChangeObserver(Function<void()>&& observer) 152 174 { … … 156 178 if (!m_monitoringDeviceChange) { 157 179 m_monitoringDeviceChange = true; 180 #if USE(GSTREAMER) 181 updateCaptureDevices(ShouldNotify::No); 182 WebCore::RealtimeMediaSourceCenter::singleton().addDevicesChangedObserver(*this); 183 #else 158 184 m_page.send(Messages::WebPageProxy::BeginMonitoringCaptureDevices()); 185 #endif 159 186 } 160 187 return identifier; -
trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.h
r269676 r275871 25 25 #include <WebCore/MediaCanStartListener.h> 26 26 #include <WebCore/MediaConstraints.h> 27 #include <WebCore/RealtimeMediaSourceCenter.h> 27 28 #include <WebCore/UserMediaClient.h> 28 29 #include <WebCore/UserMediaRequest.h> … … 35 36 class WebPage; 36 37 37 class UserMediaPermissionRequestManager : private WebCore::MediaCanStartListener { 38 class UserMediaPermissionRequestManager : public WebCore::MediaCanStartListener 39 #if USE(GSTREAMER) 40 , public WebCore::RealtimeMediaSourceCenter::Observer 41 #endif 42 { 38 43 WTF_MAKE_FAST_ALLOCATED; 39 44 public: 45 using WebCore::MediaCanStartListener::weakPtrFactory; 46 using WeakValueType = WebCore::MediaCanStartListener::WeakValueType; 47 40 48 explicit UserMediaPermissionRequestManager(WebPage&); 41 49 ~UserMediaPermissionRequestManager() = default; … … 54 62 55 63 private: 64 #if USE(GSTREAMER) 65 // WebCore::RealtimeMediaSourceCenter::Observer 66 void devicesChanged() final; 67 #endif 68 56 69 void sendUserMediaRequest(WebCore::UserMediaRequest&); 57 70 … … 66 79 HashMap<WebCore::UserMediaClient::DeviceChangeObserverToken, Function<void()>> m_deviceChangeObserverMap; 67 80 bool m_monitoringDeviceChange { false }; 81 82 #if USE(GSTREAMER) 83 enum class ShouldNotify : bool { No, Yes }; 84 void updateCaptureDevices(ShouldNotify); 85 86 Vector<WebCore::CaptureDevice> m_captureDevices; 87 #endif 68 88 }; 69 89
Note:
See TracChangeset
for help on using the changeset viewer.