WebKit Bugzilla
Attachment 357228 Details for
Bug 192632
: [MediaStream] Calculate width or height when constraints contain only the other
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch for landing
bug-192632-20181213063102.patch (text/plain), 24.99 KB, created by
Eric Carlson
on 2018-12-13 06:31:03 PST
(
hide
)
Description:
Patch for landing
Filename:
MIME Type:
Creator:
Eric Carlson
Created:
2018-12-13 06:31:03 PST
Size:
24.99 KB
patch
obsolete
>Subversion Revision: 239092 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index ef0fcf796c45007befa7e05d6662197c5a711289..aeeb6025f8a9d604ab2adc820cad292eb418c82a 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,45 @@ >+2018-12-12 Eric Carlson <eric.carlson@apple.com> >+ >+ [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-11 Fujii Hironori <Hironori.Fujii@sony.com> > > [Win][Clang] Fix warning -Wmissing-field-initializers >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index db710474ef4e35767243012a231987a2e3097068..56df89cf0d32be0391729790cbeef481a49dd8f3 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,19 @@ >+2018-12-12 Eric Carlson <eric.carlson@apple.com> >+ >+ [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-11 Fujii Hironori <Hironori.Fujii@sony.com> > > [Win][Clang] Fix warning -Wmissing-field-initializers >diff --git a/Source/WebCore/platform/graphics/RemoteVideoSample.cpp b/Source/WebCore/platform/graphics/RemoteVideoSample.cpp >index 0da27cad922a1972409735e71a3220e66b1aedc7..93c9305f42102d726e741e59f226b5ee4689c12a 100644 >--- a/Source/WebCore/platform/graphics/RemoteVideoSample.cpp >+++ b/Source/WebCore/platform/graphics/RemoteVideoSample.cpp >@@ -47,12 +47,14 @@ std::unique_ptr<RemoteVideoSample> RemoteVideoSample::create(MediaSample&& sampl > 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; > } > >diff --git a/Source/WebCore/platform/graphics/cv/ImageTransferSessionVT.h b/Source/WebCore/platform/graphics/cv/ImageTransferSessionVT.h >index 5672b856002be129debd21c9ade63d56d6ab1620..14028cb2fded4998a8c80aa9cf954ccbfbdd1147 100644 >--- a/Source/WebCore/platform/graphics/cv/ImageTransferSessionVT.h >+++ b/Source/WebCore/platform/graphics/cv/ImageTransferSessionVT.h >@@ -55,6 +55,8 @@ public: > 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); > >diff --git a/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp b/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp >index 835a79080b4162a903f951414ef7c3d96da3c3fa..3bac9336a4eb7a4b6c8962d53357ee40969eb4c2 100644 >--- a/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp >+++ b/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp >@@ -163,13 +163,6 @@ void RealtimeMediaSource::videoSampleAvailable(MediaSample& mediaSample) > }); > } > >-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 @@ static void applyNumericConstraint(const NumericConstraint<ValueType>& constrain > > 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,14 +865,38 @@ void RealtimeMediaSource::setSize(const IntSize& size) > 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) >diff --git a/Source/WebCore/platform/mediastream/RealtimeMediaSource.h b/Source/WebCore/platform/mediastream/RealtimeMediaSource.h >index 67fff69c638f39f9ab16fcefb15c85c6bc4c770e..6de176298a3dc8aa5bd22e7f5bcba175d49aa441 100644 >--- a/Source/WebCore/platform/mediastream/RealtimeMediaSource.h >+++ b/Source/WebCore/platform/mediastream/RealtimeMediaSource.h >@@ -82,7 +82,6 @@ public: > > // 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,8 +118,11 @@ public: > 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 @@ protected: > > void videoSampleAvailable(MediaSample&); > void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t); >- void remoteVideoSampleAvailable(RemoteVideoSample&&); > > private: > virtual void startProducingData() { } >@@ -221,6 +222,7 @@ private: > 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 }; >diff --git a/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp b/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp >index 26db195077e36e9e504584cf3d98a689b4dd802a..3028ca4a8ce0b81adea92dcfa8c3ba499dfbbf1d 100644 >--- a/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp >+++ b/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp >@@ -388,30 +388,22 @@ void RealtimeVideoSource::dispatchMediaSampleToObservers(MediaSample& sample) > 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 (!m_imageTransferSession) >- m_imageTransferSession = ImageTransferSessionVT::create(sample.videoPixelFormat()); >- >- if (m_imageTransferSession) { >- mediaSample = m_imageTransferSession->convertMediaSample(sample, size); >- if (!mediaSample) { >- ASSERT_NOT_REACHED(); >- return; >+ if (!isRemote()) { >+ auto size = this->size(); >+ ASSERT(!size.isEmpty()); >+ if (!size.isEmpty() && size != expandedIntSize(sample.presentationSize())) { >+ >+ 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; >+ } > } > } > } >diff --git a/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp b/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp >index 0a0f634608f5b8b753d4b7f5d7cd26bc14f36d85..c5a6267ba815f648e7206ec3abc29b706b516842 100644 >--- a/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp >+++ b/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp >@@ -86,11 +86,11 @@ const RealtimeMediaSourceSettings& DisplayCaptureSourceCocoa::settings() > 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 DisplayCaptureSourceCocoa::frameSize() const > { > 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 @@ void DisplayCaptureSourceCocoa::emitFrame() > if (imageSize.isEmpty()) > return; > >- if (m_intrinsicSize != imageSize) >- setIntrinsicSize(imageSize); >+ setIntrinsicSize(imageSize); > > auto mediaSampleSize = isRemote() ? imageSize : frameSize(); > >@@ -219,14 +208,6 @@ void DisplayCaptureSourceCocoa::emitFrame() > return; > } > >- if (isRemote()) { >- auto remoteSample = RemoteVideoSample::create(WTFMove(*sample)); >- if (remoteSample) >- remoteVideoSampleAvailable(WTFMove(*remoteSample)); >- >- return; >- } >- > videoSampleAvailable(*sample.get()); > #endif > } >diff --git a/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.h b/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.h >index 9c09ec8d3214024d4e6b67d2bf022fdd034f35a2..ed79d2cb49117ca87869c0a54f941ef271df3d53 100644 >--- a/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.h >+++ b/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.h >@@ -68,8 +68,6 @@ protected: > > 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 @@ private: > > void emitFrame(); > >- IntSize m_intrinsicSize; > std::optional<RealtimeMediaSourceCapabilities> m_capabilities; > std::optional<RealtimeMediaSourceSettings> m_currentSettings; > RealtimeMediaSourceSupportedConstraints m_supportedConstraints; >diff --git a/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp b/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp >index b12dd4a3d1ab73f7dd19610facd7dd8d6925bce3..d948d561ba6d2d4d7f4ab8a05e864dff8d60422f 100644 >--- a/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp >+++ b/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp >@@ -80,6 +80,7 @@ MockRealtimeVideoSource::MockRealtimeVideoSource(String&& deviceID, String&& nam > > 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 @@ void MockRealtimeVideoSource::setSizeAndFrameRate(std::optional<int> width, std: > { > // 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 @@ const RealtimeMediaSourceSettings& MockRealtimeVideoSource::settings() > 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 @@ void MockRealtimeVideoSource::drawText(GraphicsContext& context) > 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); >+ > const char* camera; > switch (facingMode()) { > case RealtimeMediaSourceSettings::User: >diff --git a/Source/WebCore/platform/mock/MockRealtimeVideoSource.h b/Source/WebCore/platform/mock/MockRealtimeVideoSource.h >index 075c0efc25ccef79ec281c8c2a009c2722f6bb4a..58b8e4292afa78c23b413b6609017fc898198176 100644 >--- a/Source/WebCore/platform/mock/MockRealtimeVideoSource.h >+++ b/Source/WebCore/platform/mock/MockRealtimeVideoSource.h >@@ -70,7 +70,7 @@ private: > 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; >diff --git a/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp b/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp >index c26ec0a28b4adde109c8fe4afe8f4fff936197cb..d67c66d36cd0dbd79d794bcd423c060657c2de57 100644 >--- a/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp >+++ b/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp >@@ -99,9 +99,15 @@ public: > 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 { >diff --git a/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp b/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp >index 84f99ea8005063e1e517b9d87e5b0808005a2914..5e5e159fd43ea9a779239d8bd98b407f12bf2c97 100644 >--- a/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp >+++ b/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp >@@ -132,11 +132,18 @@ public: > { > ASSERT(type() == Type::Video); > >- auto videoSampleSize = IntSize(m_settings.width(), m_settings.height()); >- if (videoSampleSize.isEmpty()) >- videoSampleSize = remoteSample.size(); >+ auto remoteSampleSize = remoteSample.size(); >+ setIntrinsicSize(remoteSampleSize); > >- if (!m_imageTransferSession) >+ auto videoSampleSize = IntSize(m_settings.width(), m_settings.height()); >+ 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 || m_imageTransferSession->pixelFormat() != remoteSample.videoFormat()) > m_imageTransferSession = ImageTransferSessionVT::create(remoteSample.videoFormat()); > > if (!m_imageTransferSession) { >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 9b7017f392e91998d8e874bc2eaead85d77e6525..4dfe28ffbfd331876be64cb2b207de48cb83c7bf 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,14 @@ >+2018-12-12 Eric Carlson <eric.carlson@apple.com> >+ >+ [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-11 Brent Fulgham <bfulgham@apple.com> > > Don't attempt to compute animated values when there is no relevant animation >diff --git a/LayoutTests/fast/mediastream/constraint-intrinsic-size-expected.txt b/LayoutTests/fast/mediastream/constraint-intrinsic-size-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..5b108ea8078cf7da478de8fa9cc404db0746c180 >--- /dev/null >+++ b/LayoutTests/fast/mediastream/constraint-intrinsic-size-expected.txt >@@ -0,0 +1,5 @@ >+ >+PASS setup >+PASS height calculated correctly only width is specified >+PASS width calculated correctly only height is specified >+ >diff --git a/LayoutTests/fast/mediastream/constraint-intrinsic-size.html b/LayoutTests/fast/mediastream/constraint-intrinsic-size.html >new file mode 100644 >index 0000000000000000000000000000000000000000..b8b60758a0bb7634561263d68415fa0ea446c91a >--- /dev/null >+++ b/LayoutTests/fast/mediastream/constraint-intrinsic-size.html >@@ -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="../../resources/testharness.js"></script> >+ <script src="../../resources/testharnessreport.js"></script> >+ </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
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 192632
:
357150
|
357157
|
357159
|
357174
| 357228 |
357234