Title: [215703] trunk
Revision
215703
Author
commit-qu...@webkit.org
Date
2017-04-24 17:02:29 -0700 (Mon, 24 Apr 2017)

Log Message

Set defaults video getUserMedia constraints
https://bugs.webkit.org/show_bug.cgi?id=171127

Patch by Youenn Fablet <you...@apple.com> on 2017-04-24
Reviewed by Eric Carlson.

Source/WebCore:

Test: fast/mediastream/getUserMedia-default.html

Adding default optional constraints for video size and frame rate if none is defined.
Default is 640x480 30fps.

Doing some refactoring in MeddiaConstraintsImpl and MeddiaConstraintsData to use more move constructors.

* Modules/mediastream/MediaConstraintsImpl.cpp:
(WebCore::defaultVideoConstraints):
(WebCore::MediaConstraintsData::setDefaultVideoConstraints):
(WebCore::MediaConstraintsImpl::create): Deleted.
* Modules/mediastream/MediaConstraintsImpl.h:
* Modules/mediastream/MediaDevices.cpp:
(WebCore::MediaDevices::getUserMedia):
* platform/mediastream/mac/MockRealtimeVideoSourceMac.mm:
(WebCore::MockRealtimeVideoSourceMac::updateSampleBuffer): Fixing crash when setting frameRate.

Source/WebKit2:

Updated to cope with MediaStreamConstraintsImpl refactoring.

* UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
(WebKit::UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints):
* UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
(WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame):

LayoutTests:

* fast/mediastream/getUserMedia-default-expected.txt: Added.
* fast/mediastream/getUserMedia-default.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (215702 => 215703)


--- trunk/LayoutTests/ChangeLog	2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/LayoutTests/ChangeLog	2017-04-25 00:02:29 UTC (rev 215703)
@@ -1,3 +1,13 @@
+2017-04-24  Youenn Fablet  <you...@apple.com>
+
+        Set defaults video getUserMedia constraints
+        https://bugs.webkit.org/show_bug.cgi?id=171127
+
+        Reviewed by Eric Carlson.
+
+        * fast/mediastream/getUserMedia-default-expected.txt: Added.
+        * fast/mediastream/getUserMedia-default.html: Added.
+
 2017-04-24  Chris Dumez  <cdu...@apple.com>
 
         createElementNS() should now throw only InvalidCharacterError, not NamespaceError

Added: trunk/LayoutTests/fast/mediastream/getUserMedia-default-expected.txt (0 => 215703)


--- trunk/LayoutTests/fast/mediastream/getUserMedia-default-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-default-expected.txt	2017-04-25 00:02:29 UTC (rev 215703)
@@ -0,0 +1,7 @@
+
+PASS Checking default video tracks settings 
+PASS Checking only audio capture 
+PASS Checking default video tracks settings except width and height 
+FAIL Checking default video tracks settings except height assert_equals: frame height expected 240 but got 480
+PASS Checking default video tracks settings except frameRate 
+

Added: trunk/LayoutTests/fast/mediastream/getUserMedia-default.html (0 => 215703)


--- trunk/LayoutTests/fast/mediastream/getUserMedia-default.html	                        (rev 0)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-default.html	2017-04-25 00:02:29 UTC (rev 215703)
@@ -0,0 +1,56 @@
+<!doctype html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <title>Testing getUserMedia default behavior</title>
+        <script src=""
+        <script src=""
+    </head>
+    <body>
+        <script>
+if (window.testRunner)
+    testRunner.setUserMediaPermission(true);
+
+var finishTest, errorTest;
+promise_test((test) => {
+    return navigator.mediaDevices.getUserMedia({ audio: true, video: true }).then((stream) => {
+        let settings = stream.getVideoTracks()[0].getSettings();
+        assert_equals(settings.frameRate, 30, "frame rate");
+        assert_equals(settings.width, settings.height == 640 ? 480 : 640, "frame width");
+        assert_equals(settings.height, settings.width = 640 ? 480 : 640, "frame height");
+    });
+}, "Checking default video tracks settings");
+
+promise_test((test) => {
+    return navigator.mediaDevices.getUserMedia({ audio: true, video: false }).then((stream) => {
+        assert_equals(stream.getVideoTracks().length, 0);
+    });
+}, "Checking only audio capture");
+
+promise_test((test) => {
+    return navigator.mediaDevices.getUserMedia({ audio: true, video: { width: 320, height: 240 } }).then((stream) => {
+        let settings = stream.getVideoTracks()[0].getSettings();
+        assert_equals(settings.frameRate, 30, "frame rate");
+        assert_equals(settings.height, 240, "frame height");
+    });
+}, "Checking default video tracks settings except width and height");
+
+promise_test((test) => {
+    return navigator.mediaDevices.getUserMedia({ audio: true, video: { height: 240 } }).then((stream) => {
+        let settings = stream.getVideoTracks()[0].getSettings();
+        assert_equals(settings.frameRate, 30, "frame rate");
+        assert_equals(settings.height, 240, "frame height");
+    });
+}, "Checking default video tracks settings except height");
+
+promise_test((test) => {
+    return navigator.mediaDevices.getUserMedia({ audio: true, video: { frameRate: {ideal: 60 } } }).then((stream) => {
+        let settings = stream.getVideoTracks()[0].getSettings();
+        assert_equals(settings.frameRate, 60, "frame rate");
+        assert_equals(settings.width, settings.height == 640 ? 480 : 640, "frame width");
+        assert_equals(settings.height, settings.width = 640 ? 480 : 640, "frame height");
+    });
+}, "Checking default video tracks settings except frameRate");
+        </script>
+    </body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (215702 => 215703)


--- trunk/Source/WebCore/ChangeLog	2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/Source/WebCore/ChangeLog	2017-04-25 00:02:29 UTC (rev 215703)
@@ -1,3 +1,27 @@
+2017-04-24  Youenn Fablet  <you...@apple.com>
+
+        Set defaults video getUserMedia constraints
+        https://bugs.webkit.org/show_bug.cgi?id=171127
+
+        Reviewed by Eric Carlson.
+
+        Test: fast/mediastream/getUserMedia-default.html
+
+        Adding default optional constraints for video size and frame rate if none is defined.
+        Default is 640x480 30fps.
+
+        Doing some refactoring in MeddiaConstraintsImpl and MeddiaConstraintsData to use more move constructors.
+
+        * Modules/mediastream/MediaConstraintsImpl.cpp:
+        (WebCore::defaultVideoConstraints):
+        (WebCore::MediaConstraintsData::setDefaultVideoConstraints):
+        (WebCore::MediaConstraintsImpl::create): Deleted.
+        * Modules/mediastream/MediaConstraintsImpl.h:
+        * Modules/mediastream/MediaDevices.cpp:
+        (WebCore::MediaDevices::getUserMedia):
+        * platform/mediastream/mac/MockRealtimeVideoSourceMac.mm:
+        (WebCore::MockRealtimeVideoSourceMac::updateSampleBuffer): Fixing crash when setting frameRate.
+
 2017-04-24  Chris Dumez  <cdu...@apple.com>
 
         createElementNS() should now throw only InvalidCharacterError, not NamespaceError

Modified: trunk/Source/WebCore/Modules/mediastream/MediaConstraintsImpl.cpp (215702 => 215703)


--- trunk/Source/WebCore/Modules/mediastream/MediaConstraintsImpl.cpp	2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/Source/WebCore/Modules/mediastream/MediaConstraintsImpl.cpp	2017-04-25 00:02:29 UTC (rev 215703)
@@ -37,16 +37,62 @@
 
 namespace WebCore {
 
-Ref<MediaConstraintsImpl> MediaConstraintsImpl::create(MediaTrackConstraintSetMap&& mandatoryConstraints, Vector<MediaTrackConstraintSetMap>&& advancedConstraints, bool isValid)
+static inline void addDefaultVideoConstraints(MediaTrackConstraintSetMap& videoConstraints, bool addFrameRateConstraint, bool addSizeConstraint, bool addFacingModeConstraint)
 {
-    return adoptRef(*new MediaConstraintsImpl(WTFMove(mandatoryConstraints), WTFMove(advancedConstraints), isValid));
+    if (addFrameRateConstraint) {
+        DoubleConstraint frameRateConstraint({ }, MediaConstraintType::FrameRate);
+        frameRateConstraint.setIdeal(30);
+        videoConstraints.set(MediaConstraintType::FrameRate, WTFMove(frameRateConstraint));
+    }
+    if (addSizeConstraint) {
+        IntConstraint widthConstraint({ }, MediaConstraintType::Width);
+        widthConstraint.setIdeal(640);
+        videoConstraints.set(MediaConstraintType::Width, WTFMove(widthConstraint));
+
+        IntConstraint heightConstraint({ }, MediaConstraintType::Height);
+        heightConstraint.setIdeal(480);
+        videoConstraints.set(MediaConstraintType::Height, WTFMove(heightConstraint));
+    }
+    if (addFacingModeConstraint) {
+        StringConstraint facingModeConstraint({ }, MediaConstraintType::FacingMode);
+        facingModeConstraint.setIdeal(ASCIILiteral("user"));
+        videoConstraints.set(MediaConstraintType::FacingMode, WTFMove(facingModeConstraint));
+    }
 }
 
-Ref<MediaConstraintsImpl> MediaConstraintsImpl::create(const MediaConstraintsData& data)
+bool MediaConstraintsData::isConstraintSet(std::function<bool(const MediaTrackConstraintSetMap&)>&& callback)
 {
-    return adoptRef(*new MediaConstraintsImpl(data));
+    if (callback(mandatoryConstraints))
+        return true;
+
+    for (const auto& constraint : advancedConstraints) {
+        if (callback(constraint))
+            return true;
+    }
+    return false;
 }
 
+void MediaConstraintsData::setDefaultVideoConstraints()
+{
+    // 640x480, 30fps, font-facing camera
+    bool hasFrameRateConstraints = isConstraintSet([](const MediaTrackConstraintSetMap& constraint) {
+        return !!constraint.frameRate();
+    });
+
+    bool hasSizeConstraints = isConstraintSet([](const MediaTrackConstraintSetMap& constraint) {
+        return !!constraint.width() || !!constraint.height();
+    });
+
+    bool hasFacingModeConstraints = isConstraintSet([](const MediaTrackConstraintSetMap& constraint) {
+        return !!constraint.facingMode();
+    });
+
+    if (hasFrameRateConstraints && hasSizeConstraints && hasFacingModeConstraints)
+        return;
+
+    addDefaultVideoConstraints(mandatoryConstraints, !hasFrameRateConstraints, !hasSizeConstraints, !hasFacingModeConstraints);
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/Modules/mediastream/MediaConstraintsImpl.h (215702 => 215703)


--- trunk/Source/WebCore/Modules/mediastream/MediaConstraintsImpl.h	2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/Source/WebCore/Modules/mediastream/MediaConstraintsImpl.h	2017-04-25 00:02:29 UTC (rev 215703)
@@ -47,6 +47,9 @@
     {
     }
 
+    void setDefaultVideoConstraints();
+    bool isConstraintSet(std::function<bool(const MediaTrackConstraintSetMap&)>&&);
+
     MediaTrackConstraintSetMap mandatoryConstraints;
     Vector<MediaTrackConstraintSetMap> advancedConstraints;
     bool isValid { false };
@@ -54,8 +57,8 @@
 
 class MediaConstraintsImpl final : public MediaConstraints {
 public:
-    static Ref<MediaConstraintsImpl> create(MediaTrackConstraintSetMap&& mandatoryConstraints, Vector<MediaTrackConstraintSetMap>&& advancedConstraints, bool isValid);
-    WEBCORE_EXPORT static Ref<MediaConstraintsImpl> create(const MediaConstraintsData&);
+    static Ref<MediaConstraintsImpl> create(MediaTrackConstraintSetMap&& mandatoryConstraints, Vector<MediaTrackConstraintSetMap>&& advancedConstraints, bool isValid) { return create(MediaConstraintsData(WTFMove(mandatoryConstraints), WTFMove(advancedConstraints), isValid)); }
+    static Ref<MediaConstraintsImpl> create(MediaConstraintsData&& data) { return adoptRef(*new MediaConstraintsImpl(WTFMove(data))); }
 
     MediaConstraintsImpl() = default;
     virtual ~MediaConstraintsImpl() = default;
@@ -65,15 +68,10 @@
     bool isValid() const final { return m_data.isValid; }
     const MediaConstraintsData& data() const { return m_data; }
 
+    void setDefaultVideoConstraints() { m_data.setDefaultVideoConstraints(); }
+
 private:
-    MediaConstraintsImpl(MediaTrackConstraintSetMap&& mandatoryConstraints, Vector<MediaTrackConstraintSetMap>&& advancedConstraints, bool isValid)
-        : m_data({ WTFMove(mandatoryConstraints), WTFMove(advancedConstraints), isValid })
-    {
-    }
-    explicit MediaConstraintsImpl(const MediaConstraintsData& data)
-        : m_data(data)
-    {
-    }
+    WEBCORE_EXPORT explicit MediaConstraintsImpl(MediaConstraintsData&& data) : m_data(WTFMove(data)) { }
 
     MediaConstraintsData m_data;
 };

Modified: trunk/Source/WebCore/Modules/mediastream/MediaDevices.cpp (215702 => 215703)


--- trunk/Source/WebCore/Modules/mediastream/MediaDevices.cpp	2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevices.cpp	2017-04-25 00:02:29 UTC (rev 215703)
@@ -74,7 +74,12 @@
     auto* document = this->document();
     if (!document)
         return Exception { INVALID_STATE_ERR };
-    return UserMediaRequest::start(*document, createMediaConstraintsImpl(constraints.audio), createMediaConstraintsImpl(constraints.video), WTFMove(promise));
+
+    auto audioConstraints = createMediaConstraintsImpl(constraints.audio);
+    auto videoConstraints = createMediaConstraintsImpl(constraints.video);
+    if (videoConstraints->isValid())
+        videoConstraints->setDefaultVideoConstraints();
+    return UserMediaRequest::start(*document, WTFMove(audioConstraints), WTFMove(videoConstraints), WTFMove(promise));
 }
 
 void MediaDevices::enumerateDevices(EnumerateDevicesPromise&& promise) const

Modified: trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm (215702 => 215703)


--- trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm	2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm	2017-04-25 00:02:29 UTC (rev 215703)
@@ -143,7 +143,11 @@
 
 void MockRealtimeVideoSourceMac::updateSampleBuffer()
 {
-    auto pixelBuffer = pixelBufferFromCGImage(imageBuffer()->copyImage()->nativeImage().get());
+    auto imageBuffer = this->imageBuffer();
+    if (!imageBuffer)
+        return;
+
+    auto pixelBuffer = pixelBufferFromCGImage(imageBuffer->copyImage()->nativeImage().get());
     auto sampleBuffer = CMSampleBufferFromPixelBuffer(pixelBuffer.get());
     
     videoSampleAvailable(MediaSampleAVFObjC::create(sampleBuffer.get()));

Modified: trunk/Source/WebKit2/ChangeLog (215702 => 215703)


--- trunk/Source/WebKit2/ChangeLog	2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/Source/WebKit2/ChangeLog	2017-04-25 00:02:29 UTC (rev 215703)
@@ -1,3 +1,17 @@
+2017-04-24  Youenn Fablet  <you...@apple.com>
+
+        Set defaults video getUserMedia constraints
+        https://bugs.webkit.org/show_bug.cgi?id=171127
+
+        Reviewed by Eric Carlson.
+
+        Updated to cope with MediaStreamConstraintsImpl refactoring.
+
+        * UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
+        (WebKit::UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints):
+        * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
+        (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame):
+
 2017-04-24  Chris Dumez  <cdu...@apple.com>
 
         Allow tabs with capturing audio or video to exceed background CPU limit

Modified: trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (215702 => 215703)


--- trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2017-04-25 00:02:29 UTC (rev 215703)
@@ -127,7 +127,7 @@
 
 void UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints(uint64_t id, const String& deviceID, WebCore::CaptureDevice::DeviceType type, const MediaConstraintsData& constraintsData, bool& succeeded, String& invalidConstraints)
 {
-    auto constraints = MediaConstraintsImpl::create(constraintsData);
+    auto constraints = MediaConstraintsImpl::create(MediaConstraintsData(constraintsData));
     auto source = RealtimeMediaSourceCenter::singleton().audioFactory()->createMediaSourceForCaptureDeviceWithConstraints(deviceID, type, constraints.ptr(), invalidConstraints);
     succeeded = !!source;
 

Modified: trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp (215702 => 215703)


--- trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp	2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp	2017-04-25 00:02:29 UTC (rev 215703)
@@ -269,11 +269,11 @@
 
         if (!m_page.uiClient().decidePolicyForUserMediaPermissionRequest(m_page, *m_page.process().webFrame(frameID), *userMediaOrigin.get(), *topLevelOrigin.get(), request.get()))
             userMediaAccessWasDenied(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::UserMediaDisabled);
-        
+
     };
 
-    auto audioConstraints = MediaConstraintsImpl::create(audioConstraintsData);
-    auto videoConstraints = MediaConstraintsImpl::create(videoConstraintsData);
+    auto audioConstraints = MediaConstraintsImpl::create(MediaConstraintsData(audioConstraintsData));
+    auto videoConstraints = MediaConstraintsImpl::create(MediaConstraintsData(videoConstraintsData));
 
     syncWithWebCorePrefs();
     RealtimeMediaSourceCenter::singleton().validateRequestConstraints(validHandler, invalidHandler, audioConstraints, videoConstraints);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to