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) {