Title: [238909] trunk/Source
Revision
238909
Author
you...@apple.com
Date
2018-12-05 14:32:26 -0800 (Wed, 05 Dec 2018)

Log Message

Enable the possibility to do video capture in UIProcess
https://bugs.webkit.org/show_bug.cgi?id=192394

Reviewed by Eric Carlson.

Source/WebCore:

Create IOSurface-backed sample buffers so that we can easily send them through IPC.
Manually tested.

* platform/mediastream/mac/AVVideoCaptureSource.mm:
(WebCore::AVVideoCaptureSource::setSizeAndFrameRateWithPreset):

Source/WebKit:

Add two web preferences to toggle audio/video capture in UIProcess or WebProcess.
Add mechanism for video capture that was not implemented yet.

* Shared/WebPreferences.yaml:
* Shared/WebPreferencesDefaultValues.h:
* Shared/WebProcessCreationParameters.cpp:
(WebKit::WebProcessCreationParameters::encode const):
(WebKit::WebProcessCreationParameters::decode):
* Shared/WebProcessCreationParameters.h:
* UIProcess/API/APIProcessPoolConfiguration.h:
* UIProcess/API/C/WKPreferences.cpp:
(WKPreferencesSetCaptureAudioInUIProcessEnabled):
(WKPreferencesGetCaptureAudioInUIProcessEnabled):
(WKPreferencesSetCaptureVideoInUIProcessEnabled):
(WKPreferencesGetCaptureVideoInUIProcessEnabled):
* UIProcess/API/C/WKPreferencesRef.h:
* UIProcess/WebPreferences.cpp:
(WebKit::WebPreferences::updateBoolValueForInternalDebugFeatureKey):
* UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::initializeNewWebProcess):
(WebKit::WebProcessPool::createWebPage):
* WebProcess/cocoa/UserMediaCaptureManager.cpp:
(WebKit::UserMediaCaptureManager::initialize):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (238908 => 238909)


--- trunk/Source/WebCore/ChangeLog	2018-12-05 21:35:50 UTC (rev 238908)
+++ trunk/Source/WebCore/ChangeLog	2018-12-05 22:32:26 UTC (rev 238909)
@@ -1,5 +1,18 @@
 2018-12-05  Youenn Fablet  <you...@apple.com>
 
+        Enable the possibility to do video capture in UIProcess
+        https://bugs.webkit.org/show_bug.cgi?id=192394
+
+        Reviewed by Eric Carlson.
+
+        Create IOSurface-backed sample buffers so that we can easily send them through IPC.
+        Manually tested.
+
+        * platform/mediastream/mac/AVVideoCaptureSource.mm:
+        (WebCore::AVVideoCaptureSource::setSizeAndFrameRateWithPreset):
+
+2018-12-05  Youenn Fablet  <you...@apple.com>
+
         Update ServiceWorkerContainer::getRegistration lambdas
         https://bugs.webkit.org/show_bug.cgi?id=192376
 

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm (238908 => 238909)


--- trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm	2018-12-05 21:35:50 UTC (rev 238908)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm	2018-12-05 22:32:26 UTC (rev 238909)
@@ -342,7 +342,8 @@
                 auto settingsDictionary = @{
                     (__bridge NSString *)kCVPixelBufferPixelFormatTypeKey: @(avVideoCapturePixelBufferFormat()),
                     (__bridge NSString *)kCVPixelBufferWidthKey: @(avPreset->size.width()),
-                    (__bridge NSString *)kCVPixelBufferHeightKey: @(avPreset->size.height())
+                    (__bridge NSString *)kCVPixelBufferHeightKey: @(avPreset->size.height()),
+                    (__bridge NSString *)kCVPixelBufferIOSurfacePropertiesKey : @{ }
                 };
                 [m_videoOutput setVideoSettings:settingsDictionary];
 #endif

Modified: trunk/Source/WebKit/ChangeLog (238908 => 238909)


--- trunk/Source/WebKit/ChangeLog	2018-12-05 21:35:50 UTC (rev 238908)
+++ trunk/Source/WebKit/ChangeLog	2018-12-05 22:32:26 UTC (rev 238909)
@@ -1,3 +1,34 @@
+2018-12-05  Youenn Fablet  <you...@apple.com>
+
+        Enable the possibility to do video capture in UIProcess
+        https://bugs.webkit.org/show_bug.cgi?id=192394
+
+        Reviewed by Eric Carlson.
+
+        Add two web preferences to toggle audio/video capture in UIProcess or WebProcess.
+        Add mechanism for video capture that was not implemented yet.
+
+        * Shared/WebPreferences.yaml:
+        * Shared/WebPreferencesDefaultValues.h:
+        * Shared/WebProcessCreationParameters.cpp:
+        (WebKit::WebProcessCreationParameters::encode const):
+        (WebKit::WebProcessCreationParameters::decode):
+        * Shared/WebProcessCreationParameters.h:
+        * UIProcess/API/APIProcessPoolConfiguration.h:
+        * UIProcess/API/C/WKPreferences.cpp:
+        (WKPreferencesSetCaptureAudioInUIProcessEnabled):
+        (WKPreferencesGetCaptureAudioInUIProcessEnabled):
+        (WKPreferencesSetCaptureVideoInUIProcessEnabled):
+        (WKPreferencesGetCaptureVideoInUIProcessEnabled):
+        * UIProcess/API/C/WKPreferencesRef.h:
+        * UIProcess/WebPreferences.cpp:
+        (WebKit::WebPreferences::updateBoolValueForInternalDebugFeatureKey):
+        * UIProcess/WebProcessPool.cpp:
+        (WebKit::WebProcessPool::initializeNewWebProcess):
+        (WebKit::WebProcessPool::createWebPage):
+        * WebProcess/cocoa/UserMediaCaptureManager.cpp:
+        (WebKit::UserMediaCaptureManager::initialize):
+
 2018-12-05  Alex Christensen  <achristen...@webkit.org>
 
         Make WebsiteDataStoreConfiguration a proper API object

Modified: trunk/Source/WebKit/Shared/WebPreferences.yaml (238908 => 238909)


--- trunk/Source/WebKit/Shared/WebPreferences.yaml	2018-12-05 21:35:50 UTC (rev 238908)
+++ trunk/Source/WebKit/Shared/WebPreferences.yaml	2018-12-05 22:32:26 UTC (rev 238909)
@@ -1474,3 +1474,20 @@
   webcoreBinding: RuntimeEnabledFeatures
   condition: ENABLE(LAYOUT_FORMATTING_CONTEXT)
 
+CaptureAudioInUIProcessEnabled:
+  type: bool
+  defaultValue: DEFAULT_CAPTURE_AUDIO_IN_UIPROCESS
+  humanReadableName: "Capture audio in UIProcess"
+  humanReadableDescription: "Enable audio capture in UIProcess"
+  category: internal
+  webcoreBinding: none
+  condition: ENABLE(MEDIA_STREAM)
+
+CaptureVideoInUIProcessEnabled:
+  type: bool
+  defaultValue: false
+  humanReadableName: "Capture video in UIProcess"
+  humanReadableDescription: "Enable video capture in UIProcess"
+  category: internal
+  webcoreBinding: none
+  condition: ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebKit/Shared/WebPreferencesDefaultValues.h (238908 => 238909)


--- trunk/Source/WebKit/Shared/WebPreferencesDefaultValues.h	2018-12-05 21:35:50 UTC (rev 238908)
+++ trunk/Source/WebKit/Shared/WebPreferencesDefaultValues.h	2018-12-05 22:32:26 UTC (rev 238909)
@@ -223,6 +223,12 @@
 bool defaultPassiveTouchListenersAsDefaultOnDocument();
 bool defaultCustomPasteboardDataEnabled();
 
+#if PLATFORM(MAC)
+#define DEFAULT_CAPTURE_AUDIO_IN_UIPROCESS true
+#else
+#define DEFAULT_CAPTURE_AUDIO_IN_UIPROCESS false
+#endif
+
 #if PLATFORM(WATCHOS)
 #define DEFAULT_INPUT_TYPE_COLOR_ENABLED false
 #define DEFAULT_DATALIST_ELEMENT_ENABLED false

Modified: trunk/Source/WebKit/Shared/WebProcessCreationParameters.cpp (238908 => 238909)


--- trunk/Source/WebKit/Shared/WebProcessCreationParameters.cpp	2018-12-05 21:35:50 UTC (rev 238908)
+++ trunk/Source/WebKit/Shared/WebProcessCreationParameters.cpp	2018-12-05 22:32:26 UTC (rev 238909)
@@ -69,6 +69,7 @@
 #if ENABLE(MEDIA_STREAM)
     encoder << audioCaptureExtensionHandle;
     encoder << shouldCaptureAudioInUIProcess;
+    encoder << shouldCaptureVideoInUIProcess;
     encoder << shouldCaptureDisplayInUIProcess;
 #endif
     encoder << shouldUseTestingNetworkSession;
@@ -261,6 +262,8 @@
 
     if (!decoder.decode(parameters.shouldCaptureAudioInUIProcess))
         return false;
+    if (!decoder.decode(parameters.shouldCaptureVideoInUIProcess))
+        return false;
     if (!decoder.decode(parameters.shouldCaptureDisplayInUIProcess))
         return false;
 #endif

Modified: trunk/Source/WebKit/Shared/WebProcessCreationParameters.h (238908 => 238909)


--- trunk/Source/WebKit/Shared/WebProcessCreationParameters.h	2018-12-05 21:35:50 UTC (rev 238908)
+++ trunk/Source/WebKit/Shared/WebProcessCreationParameters.h	2018-12-05 22:32:26 UTC (rev 238909)
@@ -93,6 +93,7 @@
 #if ENABLE(MEDIA_STREAM)
     SandboxExtension::Handle audioCaptureExtensionHandle;
     bool shouldCaptureAudioInUIProcess { false };
+    bool shouldCaptureVideoInUIProcess { false };
     bool shouldCaptureDisplayInUIProcess { false };
 #endif
     String mediaKeyStorageDirectory;

Modified: trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h (238908 => 238909)


--- trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h	2018-12-05 21:35:50 UTC (rev 238908)
+++ trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h	2018-12-05 22:32:26 UTC (rev 238909)
@@ -138,6 +138,9 @@
     bool shouldCaptureAudioInUIProcess() const { return m_shouldCaptureAudioInUIProcess; }
     void setShouldCaptureAudioInUIProcess(bool shouldCaptureAudioInUIProcess) { m_shouldCaptureAudioInUIProcess = shouldCaptureAudioInUIProcess; }
 
+    bool shouldCaptureVideoInUIProcess() const { return m_shouldCaptureVideoInUIProcess; }
+    void setShouldCaptureVideoInUIProcess(bool shouldCaptureVideoInUIProcess) { m_shouldCaptureVideoInUIProcess = shouldCaptureVideoInUIProcess; }
+
     bool shouldCaptureDisplayInUIProcess() const { return m_shouldCaptureDisplayInUIProcess; }
     void setShouldCaptureDisplayInUIProcess(bool shouldCaptureDisplayInUIProcess) { m_shouldCaptureDisplayInUIProcess = shouldCaptureDisplayInUIProcess; }
 
@@ -206,6 +209,7 @@
     bool m_alwaysRunsAtBackgroundPriority { false };
     bool m_shouldTakeUIBackgroundAssertion { true };
     bool m_shouldCaptureAudioInUIProcess { false };
+    bool m_shouldCaptureVideoInUIProcess { false };
     bool m_shouldCaptureDisplayInUIProcess { DEFAULT_CAPTURE_DISPLAY_IN_UI_PROCESS };
     ProcessID m_presentingApplicationPID { getCurrentProcessID() };
     std::optional<bool> m_processSwapsOnNavigationFromClient;

Modified: trunk/Source/WebKit/UIProcess/API/C/WKPreferences.cpp (238908 => 238909)


--- trunk/Source/WebKit/UIProcess/API/C/WKPreferences.cpp	2018-12-05 21:35:50 UTC (rev 238908)
+++ trunk/Source/WebKit/UIProcess/API/C/WKPreferences.cpp	2018-12-05 22:32:26 UTC (rev 238909)
@@ -2079,3 +2079,23 @@
 {
     return toImpl(preferencesRef)->webSQLDisabled();
 }
+
+void WKPreferencesSetCaptureAudioInUIProcessEnabled(WKPreferencesRef preferencesRef, bool flag)
+{
+    toImpl(preferencesRef)->setCaptureAudioInUIProcessEnabled(flag);
+}
+
+bool WKPreferencesGetCaptureAudioInUIProcessEnabled(WKPreferencesRef preferencesRef)
+{
+    return toImpl(preferencesRef)->captureAudioInUIProcessEnabled();
+}
+
+void WKPreferencesSetCaptureVideoInUIProcessEnabled(WKPreferencesRef preferencesRef, bool flag)
+{
+    toImpl(preferencesRef)->setCaptureVideoInUIProcessEnabled(flag);
+}
+
+bool WKPreferencesGetCaptureVideoInUIProcessEnabled(WKPreferencesRef preferencesRef)
+{
+    return toImpl(preferencesRef)->captureVideoInUIProcessEnabled();
+}

Modified: trunk/Source/WebKit/UIProcess/API/C/WKPreferencesRef.h (238908 => 238909)


--- trunk/Source/WebKit/UIProcess/API/C/WKPreferencesRef.h	2018-12-05 21:35:50 UTC (rev 238908)
+++ trunk/Source/WebKit/UIProcess/API/C/WKPreferencesRef.h	2018-12-05 22:32:26 UTC (rev 238909)
@@ -332,6 +332,11 @@
 WK_EXPORT bool WKPreferencesGetWebSQLDisabled(WKPreferencesRef preferencesRef);
 WK_EXPORT void WKPreferencesSetWebSQLDisabled(WKPreferencesRef preferencesRef, bool enabled);
 
+WK_EXPORT void WKPreferencesSetCaptureAudioInUIProcessEnabled(WKPreferencesRef preferencesRef, bool flag);
+WK_EXPORT bool WKPreferencesGetCaptureAudioInUIProcessEnabled(WKPreferencesRef preferencesRef);
+WK_EXPORT void WKPreferencesSetCaptureVideoInUIProcessEnabled(WKPreferencesRef preferencesRef, bool flag);
+WK_EXPORT bool WKPreferencesGetCaptureVideoInUIProcessEnabled(WKPreferencesRef preferencesRef);
+
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/Source/WebKit/UIProcess/WebPreferences.cpp (238908 => 238909)


--- trunk/Source/WebKit/UIProcess/WebPreferences.cpp	2018-12-05 21:35:50 UTC (rev 238908)
+++ trunk/Source/WebKit/UIProcess/WebPreferences.cpp	2018-12-05 22:32:26 UTC (rev 238909)
@@ -139,7 +139,19 @@
 
         return;
     }
+    if (key == WebPreferencesKey::captureAudioInUIProcessEnabledKey()) {
+        for (auto* page : m_pages)
+            page->process().processPool().configuration().setShouldCaptureAudioInUIProcess(value);
 
+        return;
+    }
+    if (key == WebPreferencesKey::captureVideoInUIProcessEnabledKey()) {
+        for (auto* page : m_pages)
+            page->process().processPool().configuration().setShouldCaptureVideoInUIProcess(value);
+
+        return;
+    }
+
     update(); // FIXME: Only send over the changed key and value.
 }
 

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (238908 => 238909)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2018-12-05 21:35:50 UTC (rev 238908)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2018-12-05 22:32:26 UTC (rev 238909)
@@ -919,6 +919,7 @@
     parameters.resourceLoadStatisticsEnabled = websiteDataStore.resourceLoadStatisticsEnabled();
 #if ENABLE(MEDIA_STREAM)
     parameters.shouldCaptureAudioInUIProcess = m_configuration->shouldCaptureAudioInUIProcess();
+    parameters.shouldCaptureVideoInUIProcess = m_configuration->shouldCaptureVideoInUIProcess();
     parameters.shouldCaptureDisplayInUIProcess = m_configuration->shouldCaptureDisplayInUIProcess();
 #endif
 
@@ -1146,6 +1147,8 @@
 
     auto page = process->createWebPage(pageClient, WTFMove(pageConfiguration));
     m_configuration->setProcessSwapsOnNavigationFromExperimentalFeatures(page->preferences().processSwapOnCrossSiteNavigationEnabled());
+    m_configuration->setShouldCaptureAudioInUIProcess(page->preferences().captureAudioInUIProcessEnabled());
+    m_configuration->setShouldCaptureVideoInUIProcess(page->preferences().captureVideoInUIProcessEnabled());
 
     return page;
 }

Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp (238908 => 238909)


--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp	2018-12-05 21:35:50 UTC (rev 238908)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp	2018-12-05 22:32:26 UTC (rev 238909)
@@ -219,6 +219,8 @@
 {
     if (parameters.shouldCaptureAudioInUIProcess)
         RealtimeMediaSourceCenter::setAudioFactory(*this);
+    if (parameters.shouldCaptureVideoInUIProcess)
+        RealtimeMediaSourceCenter::setVideoFactory(*this);
     if (parameters.shouldCaptureDisplayInUIProcess)
         RealtimeMediaSourceCenter::setDisplayCaptureFactory(*this);
 }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to