Title: [245296] trunk/Source/WebCore
Revision
245296
Author
[email protected]
Date
2019-05-14 12:30:19 -0700 (Tue, 14 May 2019)

Log Message

getUserMedia capture changes on iOS after homing out
https://bugs.webkit.org/show_bug.cgi?id=197707

Reviewed by Eric Carlson.

In case of muting an AVVideoCaptureSource on iOS, the session is cleared.
We need to store the preset information, to setup the new session on unnmuting correctly.
Manually tested.

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

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (245295 => 245296)


--- trunk/Source/WebCore/ChangeLog	2019-05-14 19:06:23 UTC (rev 245295)
+++ trunk/Source/WebCore/ChangeLog	2019-05-14 19:30:19 UTC (rev 245296)
@@ -1,3 +1,20 @@
+2019-05-14  Youenn Fablet  <[email protected]>
+
+        getUserMedia capture changes on iOS after homing out
+        https://bugs.webkit.org/show_bug.cgi?id=197707
+
+        Reviewed by Eric Carlson.
+
+        In case of muting an AVVideoCaptureSource on iOS, the session is cleared.
+        We need to store the preset information, to setup the new session on unnmuting correctly.
+        Manually tested.
+
+        * platform/mediastream/mac/AVVideoCaptureSource.h:
+        * platform/mediastream/mac/AVVideoCaptureSource.mm:
+        (WebCore::AVVideoCaptureSource::setSizeAndFrameRateWithPreset):
+        (WebCore::AVVideoCaptureSource::setSessionSizeAndFrameRate):
+        (WebCore::AVVideoCaptureSource::setupCaptureSession):
+
 2019-05-14  Oriol Brufau  <[email protected]>
 
         [css-grid] Update grid when changing auto repeat type

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp (245295 => 245296)


--- trunk/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp	2019-05-14 19:06:23 UTC (rev 245295)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp	2019-05-14 19:30:19 UTC (rev 245296)
@@ -366,7 +366,7 @@
     if (!match)
         return;
 
-    setSizeAndFrameRateWithPreset(match->requestedSize, match->requestedFrameRate, match->encodingPreset);
+    setFrameRateWithPreset(match->requestedFrameRate, match->encodingPreset);
 
     if (!match->requestedSize.isEmpty())
         setSize(match->requestedSize);

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeVideoSource.h (245295 => 245296)


--- trunk/Source/WebCore/platform/mediastream/RealtimeVideoSource.h	2019-05-14 19:06:23 UTC (rev 245295)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeVideoSource.h	2019-05-14 19:30:19 UTC (rev 245296)
@@ -51,7 +51,7 @@
 
     virtual void generatePresets() = 0;
     virtual bool prefersPreset(VideoPreset&) { return true; }
-    virtual void setSizeAndFrameRateWithPreset(IntSize, double, RefPtr<VideoPreset>) { };
+    virtual void setFrameRateWithPreset(double, RefPtr<VideoPreset>) { };
     virtual bool canResizeVideoFrames() const { return false; }
     bool shouldUsePreset(VideoPreset& current, VideoPreset& candidate);
 

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h (245295 => 245296)


--- trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h	2019-05-14 19:06:23 UTC (rev 245295)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h	2019-05-14 19:30:19 UTC (rev 245296)
@@ -91,11 +91,12 @@
     CaptureDevice::DeviceType deviceType() const final { return CaptureDevice::DeviceType::Camera; }
     bool interrupted() const final;
 
-    void setSizeAndFrameRateWithPreset(IntSize, double, RefPtr<VideoPreset>) final;
+    void setFrameRateWithPreset(double, RefPtr<VideoPreset>) final;
     bool prefersPreset(VideoPreset&) final;
     void generatePresets() final;
     bool canResizeVideoFrames() const final { return true; }
 
+    void setSessionSizeAndFrameRate();
     bool setPreset(NSString*);
     void computeSampleRotation();
     AVFrameRateRange* frameDurationForFrameRate(double);
@@ -127,12 +128,11 @@
     RetainPtr<WebCoreAVVideoCaptureSourceObserver> m_objcObserver;
     RetainPtr<AVCaptureSession> m_session;
     RetainPtr<AVCaptureDevice> m_device;
-    RefPtr<VideoPreset> m_pendingPreset;
 
     Lock m_presetMutex;
     RefPtr<AVVideoPreset> m_currentPreset;
-    IntSize m_pendingSize;
-    double m_pendingFrameRate;
+    IntSize m_currentSize;
+    double m_currentFrameRate;
     InterruptionReason m_interruption { InterruptionReason::None };
     int m_framesToDropAtStartup { 0 };
     bool m_isRunning { false };

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


--- trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm	2019-05-14 19:06:23 UTC (rev 245295)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm	2019-05-14 19:30:19 UTC (rev 245296)
@@ -283,22 +283,23 @@
     return true;
 }
 
-void AVVideoCaptureSource::setSizeAndFrameRateWithPreset(IntSize requestedSize, double requestedFrameRate, RefPtr<VideoPreset> preset)
+void AVVideoCaptureSource::setFrameRateWithPreset(double requestedFrameRate, RefPtr<VideoPreset> preset)
 {
-    ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER, SizeAndFrameRate { requestedSize.width(), requestedSize.height(), requestedFrameRate });
+    ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER, SizeAndFrameRate { preset->size.width(), preset->size.height(), requestedFrameRate });
 
     auto* avPreset = preset ? downcast<AVVideoPreset>(preset.get()) : nullptr;
+    m_currentPreset = avPreset;
+    m_currentFrameRate = requestedFrameRate;
 
-    if (!m_session) {
-        m_pendingPreset = avPreset;
-        m_pendingSize = requestedSize;
-        m_pendingFrameRate = requestedFrameRate;
+    setSessionSizeAndFrameRate();
+}
+
+void AVVideoCaptureSource::setSessionSizeAndFrameRate()
+{
+    if (!m_session)
         return;
-    }
 
-    m_pendingPreset = nullptr;
-    m_pendingFrameRate = 0;
-
+    auto* avPreset = m_currentPreset.get();
     if (!avPreset)
         return;
 
@@ -308,29 +309,29 @@
     [m_session beginConfiguration];
     @try {
         if ([device() lockForConfiguration:&error]) {
-            if (!m_currentPreset || ![m_currentPreset->format.get() isEqual:avPreset->format.get()]) {
-                [device() setActiveFormat:avPreset->format.get()];
+            ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER, "setting preset to ", m_currentSize);
+            [device() setActiveFormat:avPreset->format.get()];
 
 #if PLATFORM(MAC)
-                auto settingsDictionary = @{
-                    (__bridge NSString *)kCVPixelBufferPixelFormatTypeKey: @(avVideoCapturePixelBufferFormat()),
-                    (__bridge NSString *)kCVPixelBufferWidthKey: @(avPreset->size.width()),
-                    (__bridge NSString *)kCVPixelBufferHeightKey: @(avPreset->size.height()),
-                    (__bridge NSString *)kCVPixelBufferIOSurfacePropertiesKey : @{ }
-                };
-                [m_videoOutput setVideoSettings:settingsDictionary];
+            auto settingsDictionary = @{
+                (__bridge NSString *)kCVPixelBufferPixelFormatTypeKey: @(avVideoCapturePixelBufferFormat()),
+                (__bridge NSString *)kCVPixelBufferWidthKey: @(avPreset->size.width()),
+                (__bridge NSString *)kCVPixelBufferHeightKey: @(avPreset->size.height()),
+                (__bridge NSString *)kCVPixelBufferIOSurfacePropertiesKey : @{ }
+            };
+            [m_videoOutput setVideoSettings:settingsDictionary];
 #endif
-            }
-            auto* frameRateRange = frameDurationForFrameRate(requestedFrameRate);
+
+            auto* frameRateRange = frameDurationForFrameRate(m_currentFrameRate);
             ASSERT(frameRateRange);
             if (!frameRateRange)
                 return;
 
-            requestedFrameRate = clampTo(requestedFrameRate, frameRateRange.minFrameRate, frameRateRange.maxFrameRate);
+            m_currentFrameRate = clampTo(m_currentFrameRate, frameRateRange.minFrameRate, frameRateRange.maxFrameRate);
 
-            ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER, "setting frame rate to ", requestedFrameRate);
-            [device() setActiveVideoMinFrameDuration: CMTimeMake(1, requestedFrameRate)];
-            [device() setActiveVideoMaxFrameDuration: CMTimeMake(1, requestedFrameRate)];
+            ALWAYS_LOG_IF(loggerPtr(), LOGIDENTIFIER, "setting frame rate to ", m_currentFrameRate);
+            [device() setActiveVideoMinFrameDuration: CMTimeMake(1, m_currentFrameRate)];
+            [device() setActiveVideoMaxFrameDuration: CMTimeMake(1, m_currentFrameRate)];
 
             [device() unlockForConfiguration];
         }
@@ -340,8 +341,6 @@
     }
     [m_session commitConfiguration];
 
-    m_currentPreset = avPreset;
-
     ERROR_LOG_IF(error && loggerPtr(), LOGIDENTIFIER, [[error localizedDescription] UTF8String]);
 }
 
@@ -448,8 +447,7 @@
     }
     [session() addOutput:m_videoOutput.get()];
 
-    if (m_pendingPreset || m_pendingFrameRate)
-        setSizeAndFrameRateWithPreset(m_pendingSize, m_pendingFrameRate, m_pendingPreset);
+    setSessionSizeAndFrameRate();
 
     m_sensorOrientation = sensorOrientationFromVideoOutput(m_videoOutput.get());
     computeSampleRotation();

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp (245295 => 245296)


--- trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp	2019-05-14 19:06:23 UTC (rev 245295)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp	2019-05-14 19:30:19 UTC (rev 245296)
@@ -181,9 +181,9 @@
     return m_currentSettings.value();
 }
 
-void MockRealtimeVideoSource::setSizeAndFrameRateWithPreset(IntSize, double, RefPtr<VideoPreset> preset)
+void MockRealtimeVideoSource::setFrameRateWithPreset(double, RefPtr<VideoPreset> preset)
 {
-    m_preset = preset;
+    m_preset = WTFMove(preset);
     if (preset)
         setIntrinsicSize(preset->size);
 }

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h (245295 => 245296)


--- trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h	2019-05-14 19:06:23 UTC (rev 245295)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h	2019-05-14 19:30:19 UTC (rev 245296)
@@ -71,7 +71,7 @@
     CaptureDevice::DeviceType deviceType() const final { return CaptureDevice::DeviceType::Camera; }
     bool supportsSizeAndFrameRate(Optional<int> width, Optional<int> height, Optional<double>) final;
     void setSizeAndFrameRate(Optional<int> width, Optional<int> height, Optional<double>) final;
-    void setSizeAndFrameRateWithPreset(IntSize, double, RefPtr<VideoPreset>) final;
+    void setFrameRateWithPreset(double, RefPtr<VideoPreset>) final;
     IntSize captureSize() const;
 
     void generatePresets() final;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to