Title: [239163] trunk
Revision
239163
Author
[email protected]
Date
2018-12-13 07:34:15 -0800 (Thu, 13 Dec 2018)

Log Message

[MediaStream] Calculate width or height when constraints contain only the other
https://bugs.webkit.org/show_bug.cgi?id=192632
<rdar://problem/46665734>

Reviewed by Youenn Fablet.

Source/WebCore:

Test: fast/mediastream/constraint-intrinsic-size.html

* platform/graphics/RemoteVideoSample.cpp:
(WebCore::RemoteVideoSample::create): Log errors with RELEASE_LOG_ERROR.

* platform/graphics/cv/ImageTransferSessionVT.h:
(WebCore::ImageTransferSessionVT::pixelFormat const): New.

* platform/mediastream/RealtimeMediaSource.cpp:
(WebCore::RealtimeMediaSource::setSizeAndFrameRate): Replace current size with new size.
(WebCore::RealtimeMediaSource::setSize): Don't notify about width and height.
(WebCore::RealtimeMediaSource::size const): Use intrinsic size when necessary.
(WebCore::RealtimeMediaSource::setIntrinsicSize): New.
(WebCore::RealtimeMediaSource::remoteVideoSampleAvailable): Deleted.
* platform/mediastream/RealtimeMediaSource.h:

* platform/mediastream/RealtimeVideoSource.cpp:
(WebCore::RealtimeVideoSource::dispatchMediaSampleToObservers): No more remoteVideoSampleAvailable.

* platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp:
(WebCore::DisplayCaptureSourceCocoa::settings): Report size correctly.
(WebCore::DisplayCaptureSourceCocoa::frameSize const): Use intrinsicSize().
(WebCore::DisplayCaptureSourceCocoa::emitFrame): No more remoteVideoSampleAvailable.
(WebCore::DisplayCaptureSourceCocoa::setIntrinsicSize): Deleted.
* platform/mediastream/mac/DisplayCaptureSourceCocoa.h:
(WebCore::DisplayCaptureSourceCocoa::intrinsicSize const): Deleted.

* platform/mock/MockRealtimeVideoSource.cpp:
(WebCore::MockRealtimeVideoSource::MockRealtimeVideoSource): Report intrinsic size.
(WebCore::MockRealtimeVideoSource::setSizeAndFrameRate): Minor cleanup.
(WebCore::MockRealtimeVideoSource::setSizeAndFrameRateWithPreset):  Report intrinsic size.
(WebCore::MockRealtimeVideoSource::drawText): Don't render preset info for display source.
* platform/mock/MockRealtimeVideoSource.h:

Source/WebKit:

* UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
(WebKit::UserMediaCaptureManagerProxy::SourceProxy::remoteVideoSampleAvailable): Deleted,
replaced with videoSampleAvailable.

* WebProcess/cocoa/UserMediaCaptureManager.cpp:
(WebKit::UserMediaCaptureManager::Source::remoteVideoSampleAvailable): Use original frame
size if necessary when calculating new frame size.

LayoutTests:

* fast/mediastream/constraint-intrinsic-size-expected.txt: Added.
* fast/mediastream/constraint-intrinsic-size.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (239162 => 239163)


--- trunk/LayoutTests/ChangeLog	2018-12-13 15:08:00 UTC (rev 239162)
+++ trunk/LayoutTests/ChangeLog	2018-12-13 15:34:15 UTC (rev 239163)
@@ -1,3 +1,14 @@
+2018-12-13  Eric Carlson  <[email protected]>
+
+        [MediaStream] Calculate width or height when constraints contain only the other
+        https://bugs.webkit.org/show_bug.cgi?id=192632
+        <rdar://problem/46665734>
+
+        Reviewed by Youenn Fablet.
+
+        * fast/mediastream/constraint-intrinsic-size-expected.txt: Added.
+        * fast/mediastream/constraint-intrinsic-size.html: Added.
+
 2018-12-13  Carlos Garcia Campos  <[email protected]>
 
         [FreeType] Remove HarfBuzzFace

Added: trunk/LayoutTests/fast/mediastream/constraint-intrinsic-size-expected.txt (0 => 239163)


--- trunk/LayoutTests/fast/mediastream/constraint-intrinsic-size-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/mediastream/constraint-intrinsic-size-expected.txt	2018-12-13 15:34:15 UTC (rev 239163)
@@ -0,0 +1,5 @@
+
+PASS setup 
+PASS height calculated correctly only width is specified 
+PASS width calculated correctly only height is specified 
+

Added: trunk/LayoutTests/fast/mediastream/constraint-intrinsic-size.html (0 => 239163)


--- trunk/LayoutTests/fast/mediastream/constraint-intrinsic-size.html	                        (rev 0)
+++ trunk/LayoutTests/fast/mediastream/constraint-intrinsic-size.html	2018-12-13 15:34:15 UTC (rev 239163)
@@ -0,0 +1,47 @@
+<!doctype html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <title>video track width and height should be set correctly when only one constraint is passed to getDisplayMedia</title>
+        <script src=""
+        <script src=""
+    </head>
+    <body>
+
+        <script>
+            if (window.testRunner)
+                testRunner.setUserMediaPermission(true);
+            if (window.internals) {
+                window.internals.setMockMediaCaptureDevicesEnabled(true);
+                window.internals.settings.setScreenCaptureEnabled(true);
+            }
+
+            let defaultWidth;
+            let defaultHeight;
+            promise_test(async () => {
+                stream = await navigator.mediaDevices.getDisplayMedia({ video: true });
+                let settings = stream.getVideoTracks()[0].getSettings();
+                defaultWidth = settings.width;
+                defaultHeight = settings.height;
+            }, "setup");
+            
+            promise_test((test) => {
+                return navigator.mediaDevices.getDisplayMedia({ video: { width: {ideal: 640} } })
+                    .then((stream) => {
+                        let settings = stream.getVideoTracks()[0].getSettings()
+                        assert_equals(settings.height, Math.floor(640 * (defaultHeight / defaultWidth)));
+                    })
+            }, "height calculated correctly only width is specified");
+
+            promise_test((test) => {
+
+                return navigator.mediaDevices.getDisplayMedia({ video: { height: {ideal: 240} } })
+                    .then((stream) => {
+                        let settings = stream.getVideoTracks()[0].getSettings()
+                        assert_equals(settings.width, Math.floor(240 * (defaultWidth / defaultHeight)));
+                    })
+            }, "width calculated correctly only height is specified");
+
+        </script>
+    </body>
+</html>
\ No newline at end of file

Modified: trunk/Source/WebCore/ChangeLog (239162 => 239163)


--- trunk/Source/WebCore/ChangeLog	2018-12-13 15:08:00 UTC (rev 239162)
+++ trunk/Source/WebCore/ChangeLog	2018-12-13 15:34:15 UTC (rev 239163)
@@ -1,3 +1,45 @@
+2018-12-13  Eric Carlson  <[email protected]>
+
+        [MediaStream] Calculate width or height when constraints contain only the other
+        https://bugs.webkit.org/show_bug.cgi?id=192632
+        <rdar://problem/46665734>
+
+        Reviewed by Youenn Fablet.
+
+        Test: fast/mediastream/constraint-intrinsic-size.html
+
+        * platform/graphics/RemoteVideoSample.cpp:
+        (WebCore::RemoteVideoSample::create): Log errors with RELEASE_LOG_ERROR.
+
+        * platform/graphics/cv/ImageTransferSessionVT.h:
+        (WebCore::ImageTransferSessionVT::pixelFormat const): New.
+
+        * platform/mediastream/RealtimeMediaSource.cpp:
+        (WebCore::RealtimeMediaSource::setSizeAndFrameRate): Replace current size with new size.
+        (WebCore::RealtimeMediaSource::setSize): Don't notify about width and height.
+        (WebCore::RealtimeMediaSource::size const): Use intrinsic size when necessary.
+        (WebCore::RealtimeMediaSource::setIntrinsicSize): New.
+        (WebCore::RealtimeMediaSource::remoteVideoSampleAvailable): Deleted.
+        * platform/mediastream/RealtimeMediaSource.h:
+
+        * platform/mediastream/RealtimeVideoSource.cpp:
+        (WebCore::RealtimeVideoSource::dispatchMediaSampleToObservers): No more remoteVideoSampleAvailable.
+
+        * platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp:
+        (WebCore::DisplayCaptureSourceCocoa::settings): Report size correctly.
+        (WebCore::DisplayCaptureSourceCocoa::frameSize const): Use intrinsicSize().
+        (WebCore::DisplayCaptureSourceCocoa::emitFrame): No more remoteVideoSampleAvailable.
+        (WebCore::DisplayCaptureSourceCocoa::setIntrinsicSize): Deleted.
+        * platform/mediastream/mac/DisplayCaptureSourceCocoa.h:
+        (WebCore::DisplayCaptureSourceCocoa::intrinsicSize const): Deleted.
+
+        * platform/mock/MockRealtimeVideoSource.cpp:
+        (WebCore::MockRealtimeVideoSource::MockRealtimeVideoSource): Report intrinsic size.
+        (WebCore::MockRealtimeVideoSource::setSizeAndFrameRate): Minor cleanup.
+        (WebCore::MockRealtimeVideoSource::setSizeAndFrameRateWithPreset):  Report intrinsic size.
+        (WebCore::MockRealtimeVideoSource::drawText): Don't render preset info for display source.
+        * platform/mock/MockRealtimeVideoSource.h:
+
 2018-12-13  David Kilzer  <[email protected]>
 
         clang-tidy: loop variable is copied but only used as const reference in Document.cpp, Element.cpp

Modified: trunk/Source/WebCore/platform/graphics/RemoteVideoSample.cpp (239162 => 239163)


--- trunk/Source/WebCore/platform/graphics/RemoteVideoSample.cpp	2018-12-13 15:08:00 UTC (rev 239162)
+++ trunk/Source/WebCore/platform/graphics/RemoteVideoSample.cpp	2018-12-13 15:34:15 UTC (rev 239163)
@@ -47,12 +47,14 @@
     ASSERT(sample.platformSample().type == PlatformSample::CMSampleBufferType);
 
     auto imageBuffer = CMSampleBufferGetImageBuffer(sample.platformSample().sample.cmSampleBuffer);
-    if (!imageBuffer)
+    if (!imageBuffer) {
+        RELEASE_LOG_ERROR(Media, "RemoteVideoSample::create: CMSampleBufferGetImageBuffer returned nullptr");
         return nullptr;
+    }
 
     auto surface = CVPixelBufferGetIOSurface(imageBuffer);
     if (!surface) {
-        RELEASE_LOG(Media, "RemoteVideoSample::create: CVPixelBufferGetIOSurface returned nullptr");
+        RELEASE_LOG_ERROR(Media, "RemoteVideoSample::create: CVPixelBufferGetIOSurface returned nullptr");
         return nullptr;
     }
 

Modified: trunk/Source/WebCore/platform/graphics/cv/ImageTransferSessionVT.h (239162 => 239163)


--- trunk/Source/WebCore/platform/graphics/cv/ImageTransferSessionVT.h	2018-12-13 15:08:00 UTC (rev 239162)
+++ trunk/Source/WebCore/platform/graphics/cv/ImageTransferSessionVT.h	2018-12-13 15:34:15 UTC (rev 239163)
@@ -55,6 +55,8 @@
     WEBCORE_EXPORT RefPtr<MediaSample> createMediaSample(IOSurfaceRef, const MediaTime&, const IntSize&, MediaSample::VideoRotation = MediaSample::VideoRotation::None, bool mirrored = false);
 #endif
 
+    uint32_t pixelFormat() const { return m_pixelFormat; }
+
 private:
     WEBCORE_EXPORT explicit ImageTransferSessionVT(uint32_t pixelFormat);
 

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp (239162 => 239163)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp	2018-12-13 15:08:00 UTC (rev 239162)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp	2018-12-13 15:34:15 UTC (rev 239163)
@@ -163,13 +163,6 @@
     });
 }
 
-void RealtimeMediaSource::remoteVideoSampleAvailable(RemoteVideoSample&& sample)
-{
-    forEachObserver([&](auto& observer) {
-        observer.remoteVideoSampleAvailable(sample);
-    });
-}
-
 void RealtimeMediaSource::audioSamplesAvailable(const MediaTime& time, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t numberOfFrames)
 {
     forEachObserver([&](auto& observer) {
@@ -456,7 +449,7 @@
 
 void RealtimeMediaSource::setSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double> frameRate)
 {
-    IntSize size = this->size();
+    IntSize size;
     if (width)
         size.setWidth(width.value());
     if (height)
@@ -872,16 +865,40 @@
     if (size == m_size)
         return;
 
-    OptionSet<RealtimeMediaSourceSettings::Flag> changed;
-    if (m_size.width() != size.width())
-        changed.add(RealtimeMediaSourceSettings::Flag::Width);
-    if (m_size.height() != size.height())
-        changed.add(RealtimeMediaSourceSettings::Flag::Height);
-
     m_size = size;
-    notifySettingsDidChangeObservers(changed);
+    notifySettingsDidChangeObservers({ RealtimeMediaSourceSettings::Flag::Width, RealtimeMediaSourceSettings::Flag::Height });
 }
 
+const IntSize RealtimeMediaSource::size() const
+{
+    auto size = m_size;
+
+    if (size.isEmpty() && !m_intrinsicSize.isEmpty()) {
+        if (size.width())
+            size.setHeight(size.width() * (m_intrinsicSize.height() / static_cast<double>(m_intrinsicSize.width())));
+        else if (size.height())
+            size.setWidth(size.height() * (m_intrinsicSize.width() / static_cast<double>(m_intrinsicSize.height())));
+    }
+
+    return size;
+}
+
+void RealtimeMediaSource::setIntrinsicSize(const IntSize& size)
+{
+    if (m_intrinsicSize == size)
+        return;
+
+    m_intrinsicSize = size;
+
+    if (m_intrinsicSize != m_size)
+        notifySettingsDidChangeObservers({ RealtimeMediaSourceSettings::Flag::Width, RealtimeMediaSourceSettings::Flag::Height });
+}
+
+const IntSize RealtimeMediaSource::intrinsicSize() const
+{
+    return m_intrinsicSize;
+}
+
 void RealtimeMediaSource::setFrameRate(double rate)
 {
     if (m_frameRate == rate)

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h (239162 => 239163)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h	2018-12-13 15:08:00 UTC (rev 239162)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h	2018-12-13 15:34:15 UTC (rev 239163)
@@ -82,7 +82,6 @@
 
         // Called on the main thread.
         virtual void videoSampleAvailable(MediaSample&) { }
-        virtual void remoteVideoSampleAvailable(RemoteVideoSample&) { }
 
         // May be called on a background thread.
         virtual void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t /*numberOfFrames*/) { }
@@ -119,9 +118,12 @@
     WEBCORE_EXPORT void addObserver(Observer&);
     WEBCORE_EXPORT void removeObserver(Observer&);
 
+    const IntSize size() const;
     void setSize(const IntSize&);
-    const IntSize& size() const { return m_size; }
 
+    const IntSize intrinsicSize() const;
+    void setIntrinsicSize(const IntSize&);
+
     double frameRate() const { return m_frameRate; }
     void setFrameRate(double);
 
@@ -202,7 +204,6 @@
 
     void videoSampleAvailable(MediaSample&);
     void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t);
-    void remoteVideoSampleAvailable(RemoteVideoSample&&);
 
 private:
     virtual void startProducingData() { }
@@ -221,6 +222,7 @@
     mutable RecursiveLock m_observersLock;
     HashSet<Observer*> m_observers;
     IntSize m_size;
+    IntSize m_intrinsicSize;
     double m_frameRate { 30 };
     double m_aspectRatio { 0 };
     double m_volume { 1 };

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp (239162 => 239163)


--- trunk/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp	2018-12-13 15:08:00 UTC (rev 239162)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp	2018-12-13 15:34:15 UTC (rev 239163)
@@ -388,30 +388,22 @@
     if (interval > 1)
         m_observedFrameRate = (m_observedFrameTimeStamps.size() / interval);
 
-    if (isRemote()) {
-#if HAVE(IOSURFACE)
-        auto remoteSample = RemoteVideoSample::create(WTFMove(sample));
-        if (remoteSample)
-            remoteVideoSampleAvailable(WTFMove(*remoteSample));
-#else
-        ASSERT_NOT_REACHED();
-#endif
-        return;
-    }
-
     auto mediaSample = makeRefPtr(&sample);
 #if PLATFORM(COCOA)
-    auto size = this->size();
-    if (!size.isEmpty() && size != expandedIntSize(sample.presentationSize())) {
+    if (!isRemote()) {
+        auto size = this->size();
+        ASSERT(!size.isEmpty());
+        if (!size.isEmpty() && size != expandedIntSize(sample.presentationSize())) {
 
-        if (!m_imageTransferSession)
-            m_imageTransferSession = ImageTransferSessionVT::create(sample.videoPixelFormat());
+            if (!m_imageTransferSession || m_imageTransferSession->pixelFormat() != sample.videoPixelFormat())
+                m_imageTransferSession = ImageTransferSessionVT::create(sample.videoPixelFormat());
 
-        if (m_imageTransferSession) {
-            mediaSample = m_imageTransferSession->convertMediaSample(sample, size);
-            if (!mediaSample) {
-                ASSERT_NOT_REACHED();
-                return;
+            if (m_imageTransferSession) {
+                mediaSample = m_imageTransferSession->convertMediaSample(sample, size);
+                if (!mediaSample) {
+                    ASSERT_NOT_REACHED();
+                    return;
+                }
             }
         }
     }

Modified: trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp (239162 => 239163)


--- trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp	2018-12-13 15:08:00 UTC (rev 239162)
+++ trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp	2018-12-13 15:34:15 UTC (rev 239163)
@@ -86,11 +86,11 @@
     if (!m_currentSettings) {
         RealtimeMediaSourceSettings settings;
         settings.setFrameRate(frameRate());
-        auto size = frameSize();
-        if (!size.isEmpty()) {
-            settings.setWidth(size.width());
-            settings.setHeight(size.height());
-        }
+
+        auto size = this->size();
+        settings.setWidth(size.width());
+        settings.setHeight(size.height());
+
         settings.setDisplaySurface(surfaceType());
         settings.setLogicalSurface(false);
 
@@ -148,21 +148,11 @@
 {
     IntSize frameSize = size();
     if (frameSize.isEmpty())
-        frameSize = m_intrinsicSize;
+        return intrinsicSize();
 
     return frameSize;
 }
 
-void DisplayCaptureSourceCocoa::setIntrinsicSize(const IntSize& size)
-{
-    if (m_intrinsicSize == size)
-        return;
-
-    m_intrinsicSize = size;
-    notifySettingsDidChangeObservers({ RealtimeMediaSourceSettings::Flag::Width, RealtimeMediaSourceSettings::Flag::Height });
-
-}
-
 void DisplayCaptureSourceCocoa::emitFrame()
 {
 #if PLATFORM(COCOA) && !PLATFORM(IOS_FAMILY_SIMULATOR)
@@ -194,8 +184,7 @@
     if (imageSize.isEmpty())
         return;
 
-    if (m_intrinsicSize != imageSize)
-        setIntrinsicSize(imageSize);
+    setIntrinsicSize(imageSize);
 
     auto mediaSampleSize = isRemote() ? imageSize : frameSize();
 
@@ -219,14 +208,6 @@
         return;
     }
 
-    if (isRemote()) {
-        auto remoteSample = RemoteVideoSample::create(WTFMove(*sample));
-        if (remoteSample)
-            remoteVideoSampleAvailable(WTFMove(*remoteSample));
-
-        return;
-    }
-
     videoSampleAvailable(*sample.get());
 #endif
 }

Modified: trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.h (239162 => 239163)


--- trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.h	2018-12-13 15:08:00 UTC (rev 239162)
+++ trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.h	2018-12-13 15:34:15 UTC (rev 239163)
@@ -68,8 +68,6 @@
 
     void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) override;
 
-    const IntSize& intrinsicSize() const { return m_intrinsicSize; }
-    void setIntrinsicSize(const IntSize&);
     IntSize frameSize() const;
 
 private:
@@ -81,7 +79,6 @@
 
     void emitFrame();
 
-    IntSize m_intrinsicSize;
     std::optional<RealtimeMediaSourceCapabilities> m_capabilities;
     std::optional<RealtimeMediaSourceSettings> m_currentSettings;
     RealtimeMediaSourceSupportedConstraints m_supportedConstraints;

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp (239162 => 239163)


--- trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp	2018-12-13 15:08:00 UTC (rev 239162)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp	2018-12-13 15:34:15 UTC (rev 239163)
@@ -80,6 +80,7 @@
 
     if (mockDisplay()) {
         auto& properties = WTF::get<MockDisplayProperties>(m_device.properties);
+        setIntrinsicSize(properties.defaultSize);
         setSize(properties.defaultSize);
         m_fillColor = properties.fillColor;
         return;
@@ -105,10 +106,12 @@
 {
     // FIXME: consider splitting mock display into another class so we don't don't have to do this silly dance
     // because of the RealtimeVideoSource inheritance.
-    if (mockCamera())
-        return RealtimeVideoSource::setSizeAndFrameRate(width, height, rate);
+    if (mockCamera()) {
+        RealtimeVideoSource::setSizeAndFrameRate(width, height, rate);
+        return;
+    }
 
-    return RealtimeMediaSource::setSizeAndFrameRate(width, height, rate);
+    RealtimeMediaSource::setSizeAndFrameRate(width, height, rate);
 }
 
 void MockRealtimeVideoSource::generatePresets()
@@ -178,6 +181,13 @@
     return m_currentSettings.value();
 }
 
+void MockRealtimeVideoSource::setSizeAndFrameRateWithPreset(IntSize, double, RefPtr<VideoPreset> preset)
+{
+    m_preset = preset;
+    if (preset)
+        setIntrinsicSize(preset->size);
+}
+
 IntSize MockRealtimeVideoSource::captureSize() const
 {
     return m_preset ? m_preset->size : this->size();
@@ -360,11 +370,11 @@
     string = String::format("Size: %u x %u", size.width(), size.height());
     context.drawText(statsFont, TextRun((StringView(string))), statsLocation);
 
-    statsLocation.move(0, m_statsFontSize);
-    string = String::format("Preset size: %u x %u", captureSize.width(), captureSize.height());
-    context.drawText(statsFont, TextRun((StringView(string))), statsLocation);
+    if (mockCamera()) {
+        statsLocation.move(0, m_statsFontSize);
+        string = String::format("Preset size: %u x %u", captureSize.width(), captureSize.height());
+        context.drawText(statsFont, TextRun((StringView(string))), statsLocation);
 
-    if (mockCamera()) {
         const char* camera;
         switch (facingMode()) {
         case RealtimeMediaSourceSettings::User:

Modified: trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h (239162 => 239163)


--- trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h	2018-12-13 15:08:00 UTC (rev 239162)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.h	2018-12-13 15:34:15 UTC (rev 239163)
@@ -70,7 +70,7 @@
     bool isCaptureSource() const final { return true; }
     bool supportsSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final;
     void setSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final;
-    void setSizeAndFrameRateWithPreset(IntSize, double, RefPtr<VideoPreset> preset) final { m_preset = preset; }
+    void setSizeAndFrameRateWithPreset(IntSize, double, RefPtr<VideoPreset>) final;
     IntSize captureSize() const;
 
     void generatePresets() final;

Modified: trunk/Source/WebKit/ChangeLog (239162 => 239163)


--- trunk/Source/WebKit/ChangeLog	2018-12-13 15:08:00 UTC (rev 239162)
+++ trunk/Source/WebKit/ChangeLog	2018-12-13 15:34:15 UTC (rev 239163)
@@ -1,3 +1,19 @@
+2018-12-13  Eric Carlson  <[email protected]>
+
+        [MediaStream] Calculate width or height when constraints contain only the other
+        https://bugs.webkit.org/show_bug.cgi?id=192632
+        <rdar://problem/46665734>
+
+        Reviewed by Youenn Fablet.
+
+        * UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
+        (WebKit::UserMediaCaptureManagerProxy::SourceProxy::remoteVideoSampleAvailable): Deleted,
+        replaced with videoSampleAvailable.
+
+        * WebProcess/cocoa/UserMediaCaptureManager.cpp:
+        (WebKit::UserMediaCaptureManager::Source::remoteVideoSampleAvailable): Use original frame
+        size if necessary when calculating new frame size.
+
 2018-12-12  Chris Fleizach  <[email protected]>
 
         [meta][WebKit] Remove using namespace WebCore and WebKit in the global scope for unified source builds

Modified: trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (239162 => 239163)


--- trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2018-12-13 15:08:00 UTC (rev 239162)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2018-12-13 15:34:15 UTC (rev 239163)
@@ -99,9 +99,15 @@
         m_manager.process().send(Messages::UserMediaCaptureManager::AudioSamplesAvailable(m_id, time, numberOfFrames, startFrame, endFrame), 0);
     }
 
-    virtual void remoteVideoSampleAvailable(RemoteVideoSample& sample)
+    void videoSampleAvailable(MediaSample& sample) final
     {
-        m_manager.process().send(Messages::UserMediaCaptureManager::RemoteVideoSampleAvailable(m_id, WTFMove(sample)), 0);
+#if HAVE(IOSURFACE)
+        auto remoteSample = RemoteVideoSample::create(WTFMove(sample));
+        if (remoteSample)
+            m_manager.process().send(Messages::UserMediaCaptureManager::RemoteVideoSampleAvailable(m_id, WTFMove(*remoteSample)), 0);
+#else
+        ASSERT_NOT_REACHED();
+#endif
     }
 
     void storageChanged(SharedMemory* storage) final {

Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp (239162 => 239163)


--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp	2018-12-13 15:08:00 UTC (rev 239162)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp	2018-12-13 15:34:15 UTC (rev 239163)
@@ -132,11 +132,18 @@
     {
         ASSERT(type() == Type::Video);
 
+        auto remoteSampleSize = remoteSample.size();
+        setIntrinsicSize(remoteSampleSize);
+
         auto videoSampleSize = IntSize(m_settings.width(), m_settings.height());
-        if (videoSampleSize.isEmpty())
-            videoSampleSize = remoteSample.size();
+        if (videoSampleSize.isZero())
+            videoSampleSize = remoteSampleSize;
+        else if (!videoSampleSize.height())
+            videoSampleSize.setHeight(videoSampleSize.width() * (remoteSampleSize.height() / static_cast<double>(remoteSampleSize.width())));
+        else if (!videoSampleSize.width())
+            videoSampleSize.setWidth(videoSampleSize.height() * (remoteSampleSize.width() / static_cast<double>(remoteSampleSize.height())));
 
-        if (!m_imageTransferSession)
+        if (!m_imageTransferSession || m_imageTransferSession->pixelFormat() != remoteSample.videoFormat())
             m_imageTransferSession = ImageTransferSessionVT::create(remoteSample.videoFormat());
 
         if (!m_imageTransferSession) {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to