WebKit Bugzilla
Attachment 348885 Details for
Bug 189284
: [MediaStream] Simplify logic when changing RealtimeMediaSource settings
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-189284-20180904193506.patch (text/plain), 65.90 KB, created by
Eric Carlson
on 2018-09-04 19:35:07 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Eric Carlson
Created:
2018-09-04 19:35:07 PDT
Size:
65.90 KB
patch
obsolete
>Subversion Revision: 235627 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 8a8b6c14ad9a41efb2cd33d4b9425eef24c3c5ab..b6d987f9fe5cf8b7c9c7ed6f48c598d18f358f32 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,103 @@ >+2018-09-04 Eric Carlson <eric.carlson@apple.com> >+ >+ [MediaStream] Simplify logic when changing RealtimeMediaSource settings >+ https://bugs.webkit.org/show_bug.cgi?id=189284 >+ <rdar://problem/44117948> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Remove all "apply<setting>" methods from RealtimeMediaSource and derived classes, and >+ add a bitfield to settingsDidChange so classes can do setting-specific setup and >+ configuration by overriding settingsDidChange. >+ >+ No new tests, no functionality changed. >+ >+ * Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp: >+ (WebCore::CanvasCaptureMediaStreamTrack::Source::canvasResized): >+ * Modules/mediastream/CanvasCaptureMediaStreamTrack.h: >+ * platform/mediastream/MediaConstraints.h: >+ (WebCore::NumericConstraint::fitnessDistance const): >+ (WebCore::NumericConstraint::valueForDiscreteCapabilityValues const): >+ * platform/mediastream/RealtimeIncomingVideoSource.h: >+ (): Deleted. >+ * platform/mediastream/RealtimeMediaSource.cpp: >+ (WebCore::RealtimeMediaSource::RealtimeMediaSource): >+ (WebCore::RealtimeMediaSource::settingsDidChange): >+ (WebCore::RealtimeMediaSource::fitnessDistance): >+ (WebCore::applyNumericConstraint): >+ (WebCore::RealtimeMediaSource::applyConstraint): >+ (WebCore::RealtimeMediaSource::applyConstraints): >+ (WebCore::RealtimeMediaSource::setSize): >+ (WebCore::RealtimeMediaSource::setWidth): >+ (WebCore::RealtimeMediaSource::setHeight): >+ (WebCore::RealtimeMediaSource::setFrameRate): >+ (WebCore::RealtimeMediaSource::setAspectRatio): >+ (WebCore::RealtimeMediaSource::setFacingMode): >+ (WebCore::RealtimeMediaSource::setVolume): >+ (WebCore::RealtimeMediaSource::setSampleRate): >+ (WebCore::RealtimeMediaSource::setSampleSize): >+ (WebCore::RealtimeMediaSource::setEchoCancellation): >+ * platform/mediastream/RealtimeMediaSource.h: >+ * platform/mediastream/RealtimeMediaSourceSettings.cpp: >+ (WebCore::RealtimeMediaSourceSettings::diff const): >+ * platform/mediastream/RealtimeMediaSourceSettings.h: >+ (WebCore::RealtimeMediaSourceSettings::allFlags): >+ * platform/mediastream/RealtimeVideoSource.cpp: >+ (WebCore::RealtimeVideoSource::applySize): Deleted. >+ (WebCore::RealtimeVideoSource::applyFrameRate): Deleted. >+ * platform/mediastream/RealtimeVideoSource.h: >+ * platform/mediastream/gstreamer/GStreamerAudioCaptureSource.cpp: >+ (WebCore::GStreamerAudioCaptureSource::settingsDidChange): >+ (WebCore::GStreamerAudioCaptureSource::applySampleRate): Deleted. >+ * platform/mediastream/gstreamer/GStreamerAudioCaptureSource.h: >+ * platform/mediastream/gstreamer/GStreamerVideoCaptureSource.cpp: >+ (WebCore::GStreamerVideoCaptureSource::settingsDidChange): >+ (WebCore::GStreamerVideoCaptureSource::applySize): Deleted. >+ (WebCore::GStreamerVideoCaptureSource::applyFrameRate): Deleted. >+ * platform/mediastream/gstreamer/GStreamerVideoCaptureSource.h: >+ * platform/mediastream/mac/AVVideoCaptureSource.h: >+ * platform/mediastream/mac/AVVideoCaptureSource.mm: >+ (WebCore::AVVideoCaptureSource::settingsDidChange): >+ (WebCore::AVVideoCaptureSource::setPreset): >+ (WebCore::AVVideoCaptureSource::setFrameRate): >+ (WebCore::AVVideoCaptureSource::applySizeAndFrameRate): >+ (WebCore::AVVideoCaptureSource::processNewFrame): >+ (WebCore::AVVideoCaptureSource::applySize): Deleted. >+ (WebCore::AVVideoCaptureSource::applyFrameRate): Deleted. >+ * platform/mediastream/mac/CoreAudioCaptureSource.cpp: >+ (WebCore::CoreAudioCaptureSource::settingsDidChange): >+ (WebCore::CoreAudioCaptureSource::applySampleRate): Deleted. >+ (WebCore::CoreAudioCaptureSource::applyEchoCancellation): Deleted. >+ * platform/mediastream/mac/CoreAudioCaptureSource.h: >+ * platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp: >+ (WebCore::DisplayCaptureSourceCocoa::settingsDidChange): >+ (WebCore::DisplayCaptureSourceCocoa::startProducingData): >+ (WebCore::DisplayCaptureSourceCocoa::applySize): Deleted. >+ (WebCore::DisplayCaptureSourceCocoa::applyFrameRate): Deleted. >+ * platform/mediastream/mac/DisplayCaptureSourceCocoa.h: >+ * platform/mediastream/mac/MockRealtimeAudioSourceMac.h: >+ * platform/mediastream/mac/MockRealtimeAudioSourceMac.mm: >+ (WebCore::MockRealtimeAudioSourceMac::settingsDidChange): >+ (WebCore::MockRealtimeAudioSourceMac::applySampleRate): Deleted. >+ * platform/mediastream/mac/MockRealtimeVideoSourceMac.h: >+ * platform/mediastream/mac/MockRealtimeVideoSourceMac.mm: >+ (WebCore::MockRealtimeVideoSourceMac::settingsDidChange): >+ (WebCore::MockRealtimeVideoSourceMac::applySize): Deleted. >+ * platform/mediastream/mac/RealtimeIncomingVideoSourceCocoa.mm: >+ (WebCore::RealtimeIncomingVideoSourceCocoa::processNewSample): >+ * platform/mediastream/mac/ScreenDisplayCaptureSourceMac.h: >+ * platform/mediastream/mac/ScreenDisplayCaptureSourceMac.mm: >+ (WebCore::ScreenDisplayCaptureSourceMac::settingsDidChange): >+ (WebCore::ScreenDisplayCaptureSourceMac::applySize): Deleted. >+ (WebCore::ScreenDisplayCaptureSourceMac::applyFrameRate): Deleted. >+ * platform/mock/MockRealtimeAudioSource.cpp: >+ (WebCore::MockRealtimeAudioSource::settingsDidChange): >+ * platform/mock/MockRealtimeAudioSource.h: >+ * platform/mock/MockRealtimeVideoSource.cpp: >+ (WebCore::MockRealtimeVideoSource::settingsDidChange): >+ (WebCore::MockRealtimeVideoSource::applySize): Deleted. >+ * platform/mock/MockRealtimeVideoSource.h: >+ > 2018-09-03 Dean Jackson <dino@apple.com> > > Move SystemPreview code from WebKitAdditions to WebKit >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index c6aee48d92462482e79070b96e5e9a81a26bba7f..9892af63d806c2a382e7ecbfab040e1eb8ef067c 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,14 @@ >+2018-09-04 Eric Carlson <eric.carlson@apple.com> >+ >+ [MediaStream] Simplify logic when changing RealtimeMediaSource settings >+ https://bugs.webkit.org/show_bug.cgi?id=189284 >+ <rdar://problem/44117948> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * WebProcess/cocoa/UserMediaCaptureManager.cpp: >+ (WebKit::UserMediaCaptureManager::Source::setSettings): >+ > 2018-09-03 Dean Jackson <dino@apple.com> > > Move SystemPreview code from WebKitAdditions to WebKit >diff --git a/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp b/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp >index 24b816d2f0f88635811d63c6c35b79edc7987b65..cdd04b903c7bf26cfe89d6879075b343d640e48f 100644 >--- a/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp >+++ b/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp >@@ -114,10 +114,16 @@ void CanvasCaptureMediaStreamTrack::Source::canvasResized(CanvasBase& canvas) > { > ASSERT_UNUSED(canvas, m_canvas == &canvas); > >+ OptionSet<RealtimeMediaSourceSettings::Flag> changed; >+ if (m_canvas->width() != m_settings.width()) >+ changed.add(RealtimeMediaSourceSettings::Flag::Width); >+ if (m_canvas->height() != m_settings.height()) >+ changed.add(RealtimeMediaSourceSettings::Flag::Height); >+ > m_settings.setWidth(m_canvas->width()); > m_settings.setHeight(m_canvas->height()); > >- settingsDidChange(); >+ settingsDidChange(changed); > } > > void CanvasCaptureMediaStreamTrack::Source::canvasChanged(CanvasBase& canvas, const FloatRect&) >diff --git a/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.h b/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.h >index 635b4b1c8a6c607ed2851cf20fc4a0f3e40c40ac..b006af93bf4d11253ff7c16d2376c0ae1c34c4ae 100644 >--- a/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.h >+++ b/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.h >@@ -67,7 +67,6 @@ private: > void stopProducingData() final; > const RealtimeMediaSourceCapabilities& capabilities() const final { return RealtimeMediaSourceCapabilities::emptyCapabilities(); } > const RealtimeMediaSourceSettings& settings() const final { return m_settings; } >- bool applySize(const IntSize&) final { return true; } > > void captureCanvas(); > void requestFrameTimerFired(); >diff --git a/Source/WebCore/platform/mediastream/MediaConstraints.h b/Source/WebCore/platform/mediastream/MediaConstraints.h >index 65e96aca9db172dd2728b3c5f159167df33c2b6e..30ec41a63b888d15c0345a9233308045d912a5fd 100644 >--- a/Source/WebCore/platform/mediastream/MediaConstraints.h >+++ b/Source/WebCore/platform/mediastream/MediaConstraints.h >@@ -193,6 +193,19 @@ public: > return static_cast<double>(std::abs(ideal - m_ideal.value())) / std::max(std::abs(ideal), std::abs(m_ideal.value())); > } > >+ double fitnessDistance(const Vector<ValueType>& discreteCapabilityValues) const >+ { >+ double minDistance = std::numeric_limits<double>::infinity(); >+ >+ for (auto& value : discreteCapabilityValues) { >+ auto distance = fitnessDistance(value, value); >+ if (distance < minDistance) >+ minDistance = distance; >+ } >+ >+ return minDistance; >+ } >+ > bool validForRange(ValueType rangeMin, ValueType rangeMax) const > { > if (isEmpty()) >@@ -277,6 +290,46 @@ public: > return value; > } > >+ ValueType valueForDiscreteCapabilityValues(ValueType current, const Vector<ValueType>& discreteCapabilityValues) const >+ { >+ ValueType value { 0 }; >+ std::optional<ValueType> min; >+ std::optional<ValueType> max; >+ >+ if (m_exact) { >+ ASSERT(discreteCapabilityValues.contains(m_exact.value())); >+ return m_exact.value(); >+ } >+ >+ if (m_min) { >+ auto index = discreteCapabilityValues.findMatching([&](ValueType value) { return m_min.value() >= value; }); >+ if (index != notFound) { >+ min = value = discreteCapabilityValues[index]; >+ >+ // If there is no ideal, don't change if minimum is smaller than current. >+ if (!m_ideal && value < current) >+ value = current; >+ } >+ } >+ >+ if (m_max && m_max.value() >= discreteCapabilityValues[0]) { >+ for (auto& discreteValue : discreteCapabilityValues) { >+ if (m_max.value() <= discreteValue) >+ max = value = discreteValue; >+ } >+ } >+ >+ if (m_ideal && discreteCapabilityValues.contains(m_ideal.value())) { >+ value = m_ideal.value(); >+ if (max) >+ value = std::min(max.value(), value); >+ if (min) >+ value = std::max(min.value(), value); >+ } >+ >+ return value; >+ } >+ > bool isEmpty() const { return !m_min && !m_max && !m_exact && !m_ideal; } > bool isMandatory() const { return m_min || m_max || m_exact; } > >diff --git a/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.h b/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.h >index 7247bb833857e48e99ee786e75e4a93bb005d5ed..1b0bf94df5d4c93def8024efa91a5e165bf5d96d 100644 >--- a/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.h >+++ b/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.h >@@ -71,8 +71,6 @@ private: > const RealtimeMediaSourceCapabilities& capabilities() const final; > const RealtimeMediaSourceSettings& settings() const final; > >- bool applySize(const IntSize&) final { return true; } >- > rtc::scoped_refptr<webrtc::VideoTrackInterface> m_videoTrack; > }; > >diff --git a/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp b/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp >index 2e9d965a199b5b321ad3fe30e18188f22e2b41df..49e99e4f2ace2297ffc7b3fdf68b526c842bd6fb 100644 >--- a/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp >+++ b/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp >@@ -1,6 +1,6 @@ > /* > * Copyright (C) 2012 Google Inc. All rights reserved. >- * Copyright (C) 2013-2017 Apple Inc. All rights reserved. >+ * Copyright (C) 2013-2018 Apple Inc. All rights reserved. > * Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies). > * Copyright (C) 2015 Ericsson AB. All rights reserved. > * >@@ -52,8 +52,6 @@ RealtimeMediaSource::RealtimeMediaSource(const String& id, Type type, const Stri > , m_type(type) > , m_name(name) > { >- // FIXME(147205): Need to implement fitness score for constraints >- > if (m_id.isEmpty()) > m_id = createCanonicalUUIDString(); > m_persistentID = m_id; >@@ -133,13 +131,12 @@ void RealtimeMediaSource::notifyMutedObservers() const > }); > } > >-void RealtimeMediaSource::settingsDidChange() >+void RealtimeMediaSource::settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) > { > ASSERT(isMainThread()); > > if (m_pendingSettingsDidChangeNotification) > return; >- > m_pendingSettingsDidChangeNotification = true; > > scheduleDeferredTask([this] { >@@ -356,6 +353,9 @@ double RealtimeMediaSource::fitnessDistance(const MediaConstraint& constraint) > if (!capabilities.supportsSampleRate()) > return 0; > >+ if (auto discreteRates = discreteSampleRates()) >+ return downcast<IntConstraint>(constraint).fitnessDistance(*discreteRates); >+ > auto range = capabilities.sampleRate(); > return downcast<IntConstraint>(constraint).fitnessDistance(range.rangeMin().asInt, range.rangeMax().asInt); > break; >@@ -366,6 +366,9 @@ double RealtimeMediaSource::fitnessDistance(const MediaConstraint& constraint) > if (!capabilities.supportsSampleSize()) > return 0; > >+ if (auto discreteSizes = discreteSampleSizes()) >+ return downcast<IntConstraint>(constraint).fitnessDistance(*discreteSizes); >+ > auto range = capabilities.sampleSize(); > return downcast<IntConstraint>(constraint).fitnessDistance(range.rangeMin().asInt, range.rangeMax().asInt); > break; >@@ -421,8 +424,15 @@ double RealtimeMediaSource::fitnessDistance(const MediaConstraint& constraint) > } > > template <typename ValueType> >-static void applyNumericConstraint(const NumericConstraint<ValueType>& constraint, ValueType current, ValueType capabilityMin, ValueType capabilityMax, RealtimeMediaSource* source, void (RealtimeMediaSource::*applier)(ValueType)) >+static void applyNumericConstraint(const NumericConstraint<ValueType>& constraint, ValueType current, std::optional<Vector<ValueType>> discreteCapabilityValues, ValueType capabilityMin, ValueType capabilityMax, RealtimeMediaSource* source, void (RealtimeMediaSource::*applier)(ValueType)) > { >+ if (discreteCapabilityValues) { >+ int value = constraint.valueForDiscreteCapabilityValues(current, *discreteCapabilityValues); >+ if (value != current) >+ (source->*applier)(value); >+ return; >+ } >+ > ValueType value = constraint.valueForCapabilityRange(current, capabilityMin, capabilityMax); > if (value != current) > (source->*applier)(value); >@@ -442,35 +452,17 @@ void RealtimeMediaSource::applyConstraint(const MediaConstraint& constraint) > { > auto& capabilities = this->capabilities(); > switch (constraint.constraintType()) { >- case MediaConstraintType::Width: { >- ASSERT(constraint.isInt()); >- if (!capabilities.supportsWidth()) >- return; >- >- auto range = capabilities.width(); >- applyNumericConstraint(downcast<IntConstraint>(constraint), size().width(), range.rangeMin().asInt, range.rangeMax().asInt, this, &RealtimeMediaSource::setWidth); >+ case MediaConstraintType::Width: >+ ASSERT_NOT_REACHED(); > break; >- } >- >- case MediaConstraintType::Height: { >- ASSERT(constraint.isInt()); >- if (!capabilities.supportsHeight()) >- return; > >- auto range = capabilities.height(); >- applyNumericConstraint(downcast<IntConstraint>(constraint), size().height(), range.rangeMin().asInt, range.rangeMax().asInt, this, &RealtimeMediaSource::setHeight); >+ case MediaConstraintType::Height: >+ ASSERT_NOT_REACHED(); > break; >- } >- >- case MediaConstraintType::FrameRate: { >- ASSERT(constraint.isDouble()); >- if (!capabilities.supportsFrameRate()) >- return; > >- auto range = capabilities.frameRate(); >- applyNumericConstraint(downcast<DoubleConstraint>(constraint), frameRate(), range.rangeMin().asDouble, range.rangeMax().asDouble, this, &RealtimeMediaSource::setFrameRate); >+ case MediaConstraintType::FrameRate: >+ ASSERT_NOT_REACHED(); > break; >- } > > case MediaConstraintType::AspectRatio: { > ASSERT(constraint.isDouble()); >@@ -478,7 +470,7 @@ void RealtimeMediaSource::applyConstraint(const MediaConstraint& constraint) > return; > > auto range = capabilities.aspectRatio(); >- applyNumericConstraint(downcast<DoubleConstraint>(constraint), aspectRatio(), range.rangeMin().asDouble, range.rangeMax().asDouble, this, &RealtimeMediaSource::setAspectRatio); >+ applyNumericConstraint(downcast<DoubleConstraint>(constraint), aspectRatio(), { }, range.rangeMin().asDouble, range.rangeMax().asDouble, this, &RealtimeMediaSource::setAspectRatio); > break; > } > >@@ -488,7 +480,7 @@ void RealtimeMediaSource::applyConstraint(const MediaConstraint& constraint) > return; > > auto range = capabilities.volume(); >- applyNumericConstraint(downcast<DoubleConstraint>(constraint), volume(), range.rangeMin().asDouble, range.rangeMax().asDouble, this, &RealtimeMediaSource::setVolume); >+ applyNumericConstraint(downcast<DoubleConstraint>(constraint), volume(), { }, range.rangeMin().asDouble, range.rangeMax().asDouble, this, &RealtimeMediaSource::setVolume); > break; > } > >@@ -498,7 +490,7 @@ void RealtimeMediaSource::applyConstraint(const MediaConstraint& constraint) > return; > > auto range = capabilities.sampleRate(); >- applyNumericConstraint(downcast<IntConstraint>(constraint), sampleRate(), range.rangeMin().asInt, range.rangeMax().asInt, this, &RealtimeMediaSource::setSampleRate); >+ applyNumericConstraint(downcast<IntConstraint>(constraint), sampleRate(), discreteSampleRates(), range.rangeMin().asInt, range.rangeMax().asInt, this, &RealtimeMediaSource::setSampleRate); > break; > } > >@@ -508,7 +500,7 @@ void RealtimeMediaSource::applyConstraint(const MediaConstraint& constraint) > return; > > auto range = capabilities.sampleSize(); >- applyNumericConstraint(downcast<IntConstraint>(constraint), sampleSize(), range.rangeMin().asInt, range.rangeMax().asInt, this, &RealtimeMediaSource::setSampleSize); >+ applyNumericConstraint(downcast<IntConstraint>(constraint), sampleSize(), { }, range.rangeMin().asInt, range.rangeMax().asInt, this, &RealtimeMediaSource::setSampleSize); > break; > } > >@@ -823,8 +815,6 @@ void RealtimeMediaSource::applyConstraints(const FlattenedConstraint& constraint > } > } > >- // FIXME: applySizeAndFrameRate should take MediaConstraint* instead of std::optional<> so it can see if a constraint is an exact, min, max, >- // or ideal, and choose the correct value for properties with non-discreet capabilities when necessary. > if (width || height || frameRate) > applySizeAndFrameRate(WTFMove(width), WTFMove(height), WTFMove(frameRate)); > >@@ -865,11 +855,14 @@ void RealtimeMediaSource::setSize(const IntSize& size) > if (size == m_size) > return; > >- if (!applySize(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; >- settingsDidChange(); >+ settingsDidChange(changed); > } > > void RealtimeMediaSource::setWidth(int width) >@@ -877,15 +870,11 @@ void RealtimeMediaSource::setWidth(int width) > if (width == m_size.width()) > return; > >- int height = m_aspectRatio ? width / m_aspectRatio : m_size.height(); >- if (!applySize(IntSize(width, height))) >- return; >- > m_size.setWidth(width); > if (m_aspectRatio) > m_size.setHeight(width / m_aspectRatio); > >- settingsDidChange(); >+ settingsDidChange(RealtimeMediaSourceSettings::Flag::Width); > } > > void RealtimeMediaSource::setHeight(int height) >@@ -893,79 +882,85 @@ void RealtimeMediaSource::setHeight(int height) > if (height == m_size.height()) > return; > >- int width = m_aspectRatio ? height * m_aspectRatio : m_size.width(); >- if (!applySize(IntSize(width, height))) >- return; >- > if (m_aspectRatio) >- m_size.setWidth(width); >+ m_size.setWidth(height * m_aspectRatio); > m_size.setHeight(height); > >- settingsDidChange(); >+ settingsDidChange(RealtimeMediaSourceSettings::Flag::Height); > } > > void RealtimeMediaSource::setFrameRate(double rate) > { >- if (m_frameRate == rate || !applyFrameRate(rate)) >+ if (m_frameRate == rate) > return; > > m_frameRate = rate; >- settingsDidChange(); >+ settingsDidChange(RealtimeMediaSourceSettings::Flag::FrameRate); > } > > void RealtimeMediaSource::setAspectRatio(double ratio) > { >- if (m_aspectRatio == ratio || !applyAspectRatio(ratio)) >+ if (m_aspectRatio == ratio) > return; > > m_aspectRatio = ratio; > m_size.setHeight(m_size.width() / ratio); >- settingsDidChange(); >+ settingsDidChange(RealtimeMediaSourceSettings::Flag::AspectRatio); > } > > void RealtimeMediaSource::setFacingMode(RealtimeMediaSourceSettings::VideoFacingMode mode) > { >- if (m_facingMode == mode || !applyFacingMode(mode)) >+ if (m_facingMode == mode) > return; > > m_facingMode = mode; >- settingsDidChange(); >+ settingsDidChange(RealtimeMediaSourceSettings::Flag::FacingMode); > } > > void RealtimeMediaSource::setVolume(double volume) > { >- if (m_volume == volume || !applyVolume(volume)) >+ if (m_volume == volume) > return; > > m_volume = volume; >- settingsDidChange(); >+ settingsDidChange(RealtimeMediaSourceSettings::Flag::Volume); > } > > void RealtimeMediaSource::setSampleRate(int rate) > { >- if (m_sampleRate == rate || !applySampleRate(rate)) >+ if (m_sampleRate == rate) > return; > > m_sampleRate = rate; >- settingsDidChange(); >+ settingsDidChange(RealtimeMediaSourceSettings::Flag::SampleRate); >+} >+ >+std::optional<Vector<int>> RealtimeMediaSource::discreteSampleRates() const >+{ >+ return std::nullopt; > } > > void RealtimeMediaSource::setSampleSize(int size) > { >- if (m_sampleSize == size || !applySampleSize(size)) >+ if (m_sampleSize == size) > return; > > m_sampleSize = size; >- settingsDidChange(); >+ settingsDidChange(RealtimeMediaSourceSettings::Flag::SampleSize); >+} >+ >+std::optional<Vector<int>> RealtimeMediaSource::discreteSampleSizes() const >+{ >+ return std::nullopt; > } > > void RealtimeMediaSource::setEchoCancellation(bool echoCancellation) > { >- if (m_echoCancellation == echoCancellation || !applyEchoCancellation(echoCancellation)) >+ if (m_echoCancellation == echoCancellation) > return; > > m_echoCancellation = echoCancellation; >- settingsDidChange(); >+ settingsDidChange(RealtimeMediaSourceSettings::Flag::EchoCancellation); > } > > void RealtimeMediaSource::scheduleDeferredTask(WTF::Function<void()>&& function) >diff --git a/Source/WebCore/platform/mediastream/RealtimeMediaSource.h b/Source/WebCore/platform/mediastream/RealtimeMediaSource.h >index 48419bad0189f72469c26ccc6540843a700a2fe3..e08e656e3e71e106d69dff907f76826b6a743d2c 100644 >--- a/Source/WebCore/platform/mediastream/RealtimeMediaSource.h >+++ b/Source/WebCore/platform/mediastream/RealtimeMediaSource.h >@@ -1,7 +1,7 @@ > /* > * Copyright (C) 2011 Ericsson AB. All rights reserved. > * Copyright (C) 2012 Google Inc. All rights reserved. >- * Copyright (C) 2013-2017 Apple Inc. All rights reserved. >+ * Copyright (C) 2013-2018 Apple Inc. All rights reserved. > * Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies). > * > * Redistribution and use in source and binary forms, with or without >@@ -169,35 +169,29 @@ public: > void setHeight(int); > void setSize(const IntSize&); > const IntSize& size() const { return m_size; } >- virtual bool applySize(const IntSize&) { return false; } > > double frameRate() const { return m_frameRate; } > void setFrameRate(double); >- virtual bool applyFrameRate(double) { return false; } > > double aspectRatio() const { return m_aspectRatio; } > void setAspectRatio(double); >- virtual bool applyAspectRatio(double) { return false; } > > RealtimeMediaSourceSettings::VideoFacingMode facingMode() const { return m_facingMode; } > void setFacingMode(RealtimeMediaSourceSettings::VideoFacingMode); >- virtual bool applyFacingMode(RealtimeMediaSourceSettings::VideoFacingMode) { return false; } > > double volume() const { return m_volume; } > void setVolume(double); >- virtual bool applyVolume(double) { return false; } > > int sampleRate() const { return m_sampleRate; } > void setSampleRate(int); >- virtual bool applySampleRate(int) { return false; } >+ virtual std::optional<Vector<int>> discreteSampleRates() const; > > int sampleSize() const { return m_sampleSize; } > void setSampleSize(int); >- virtual bool applySampleSize(int) { return false; } >+ virtual std::optional<Vector<int>> discreteSampleSizes() const; > > bool echoCancellation() const { return m_echoCancellation; } > void setEchoCancellation(bool); >- virtual bool applyEchoCancellation(bool) { return false; } > > virtual const RealtimeMediaSourceCapabilities& capabilities() const = 0; > virtual const RealtimeMediaSourceSettings& settings() const = 0; >@@ -210,7 +204,7 @@ public: > bool supportsConstraints(const MediaConstraints&, String&); > bool supportsConstraint(const MediaConstraint&) const; > >- virtual void settingsDidChange(); >+ virtual void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>); > > virtual bool isIsolated() const { return false; } > >@@ -274,8 +268,8 @@ private: > double m_fitnessScore { std::numeric_limits<double>::infinity() }; > RealtimeMediaSourceSettings::VideoFacingMode m_facingMode { RealtimeMediaSourceSettings::User}; > >- bool m_echoCancellation { false }; > bool m_pendingSettingsDidChangeNotification { false }; >+ bool m_echoCancellation { false }; > bool m_isProducingData { false }; > bool m_interrupted { false }; > bool m_captureDidFailed { false }; >diff --git a/Source/WebCore/platform/mediastream/RealtimeMediaSourceSettings.cpp b/Source/WebCore/platform/mediastream/RealtimeMediaSourceSettings.cpp >index 6a6dcfed5f7b5a6273289eeec3313e1fbf869824..bc304a94867ff5d08569c04acf458e38415c7eb4 100644 >--- a/Source/WebCore/platform/mediastream/RealtimeMediaSourceSettings.cpp >+++ b/Source/WebCore/platform/mediastream/RealtimeMediaSourceSettings.cpp >@@ -69,6 +69,43 @@ RealtimeMediaSourceSettings::VideoFacingMode RealtimeMediaSourceSettings::videoF > return RealtimeMediaSourceSettings::Unknown; > } > >+OptionSet<RealtimeMediaSourceSettings::Flag> RealtimeMediaSourceSettings::diff(const RealtimeMediaSourceSettings& that) const >+{ >+ OptionSet<RealtimeMediaSourceSettings::Flag> diff; >+ >+ if (width() != that.width()) >+ diff.add(RealtimeMediaSourceSettings::Width); >+ if (height() != that.height()) >+ diff.add(RealtimeMediaSourceSettings::Height); >+ if (aspectRatio() != that.aspectRatio()) >+ diff.add(RealtimeMediaSourceSettings::AspectRatio); >+ if (frameRate() != that.frameRate()) >+ diff.add(RealtimeMediaSourceSettings::FrameRate); >+ if (facingMode() != that.facingMode()) >+ diff.add(RealtimeMediaSourceSettings::FacingMode); >+ if (volume() != that.volume()) >+ diff.add(RealtimeMediaSourceSettings::Volume); >+ if (sampleRate() != that.sampleRate()) >+ diff.add(RealtimeMediaSourceSettings::SampleRate); >+ if (sampleSize() != that.sampleSize()) >+ diff.add(RealtimeMediaSourceSettings::SampleSize); >+ if (echoCancellation() != that.echoCancellation()) >+ diff.add(RealtimeMediaSourceSettings::EchoCancellation); >+ if (deviceId() != that.deviceId()) >+ diff.add(RealtimeMediaSourceSettings::DeviceId); >+ if (groupId() != that.groupId()) >+ diff.add(RealtimeMediaSourceSettings::GroupId); >+ if (label() != that.label()) >+ diff.add(RealtimeMediaSourceSettings::Label); >+ if (displaySurface() != that.displaySurface()) >+ diff.add(RealtimeMediaSourceSettings::DisplaySurface); >+ if (logicalSurface() != that.logicalSurface()) >+ diff.add(RealtimeMediaSourceSettings::LogicalSurface); >+ >+ return diff; >+} >+ >+ > } // namespace WebCore > > #endif // ENABLE(MEDIA_STREAM) >diff --git a/Source/WebCore/platform/mediastream/RealtimeMediaSourceSettings.h b/Source/WebCore/platform/mediastream/RealtimeMediaSourceSettings.h >index 01c1523b820eb9460892130d96fdbbcad653db32..6b00dd41e0c66f5a9c7f6d05fa20d05fcf505e00 100644 >--- a/Source/WebCore/platform/mediastream/RealtimeMediaSourceSettings.h >+++ b/Source/WebCore/platform/mediastream/RealtimeMediaSourceSettings.h >@@ -30,6 +30,7 @@ > > #include "RealtimeMediaSourceSupportedConstraints.h" > #include <wtf/EnumTraits.h> >+#include <wtf/OptionSet.h> > #include <wtf/RefCounted.h> > #include <wtf/Vector.h> > #include <wtf/text/AtomicString.h> >@@ -43,6 +44,27 @@ public: > static String facingMode(RealtimeMediaSourceSettings::VideoFacingMode); > static RealtimeMediaSourceSettings::VideoFacingMode videoFacingModeEnum(const String&); > >+ enum Flag { >+ Width = 1 << 0, >+ Height = 1 << 1, >+ AspectRatio = 1 << 2, >+ FrameRate = 1 << 3, >+ FacingMode = 1 << 4, >+ Volume = 1 << 5, >+ SampleRate = 1 << 6, >+ SampleSize = 1 << 7, >+ EchoCancellation = 1 << 8, >+ DeviceId = 1 << 9, >+ GroupId = 1 << 10, >+ Label = 1 << 11, >+ DisplaySurface = 1 << 12, >+ LogicalSurface = 1 << 13, >+ }; >+ >+ static constexpr OptionSet<Flag> allFlags() { return { Width, Height, AspectRatio, FrameRate, FacingMode, Volume, SampleRate, SampleSize, EchoCancellation, DeviceId, GroupId, Label, DisplaySurface, LogicalSurface }; } >+ >+ WEBCORE_EXPORT OptionSet<RealtimeMediaSourceSettings::Flag> diff(const RealtimeMediaSourceSettings&) const; >+ > explicit RealtimeMediaSourceSettings() = default; > > bool supportsWidth() const { return m_supportedConstraints.supportsWidth(); } >diff --git a/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp b/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp >index 2d1faead179d705f4198cc14e51bcd88b00f6d03..f3fc4ea551b8e7b2a0b302b084d2001c17b5ab53 100644 >--- a/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp >+++ b/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp >@@ -125,17 +125,6 @@ IntSize RealtimeVideoSource::bestSupportedCaptureSizeForWidthAndHeight(std::opti > return { }; > } > >-bool RealtimeVideoSource::applySize(const IntSize& size) >-{ >- IntSize supportedSize = bestSupportedCaptureSizeForWidthAndHeight(size.width(), size.height()); >- if (supportedSize.isEmpty()) { >- LOG(Media, "RealtimeVideoSource::applySize(%p), unable find or set preset for width: %i, height: %i", this, size.width(), size.height()); >- return false; >- } >- >- return true; >-} >- > void RealtimeVideoSource::applySizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double> frameRate) > { > if (width || height) { >@@ -168,11 +157,6 @@ void RealtimeVideoSource::dispatchMediaSampleToObservers(MediaSample& sample) > videoSampleAvailable(sample); > } > >-bool RealtimeVideoSource::applyFrameRate(double rate) >-{ >- return supportsFrameRate(rate); >-} >- > bool RealtimeVideoSource::supportsFrameRate(double frameRate) > { > double epsilon = 0.001; >diff --git a/Source/WebCore/platform/mediastream/RealtimeVideoSource.h b/Source/WebCore/platform/mediastream/RealtimeVideoSource.h >index 1c257f6ddba675435550110c300c0189dcbe6510..6a2d4a11f32f0e675dad2024d959b3fb270a65c8 100644 >--- a/Source/WebCore/platform/mediastream/RealtimeVideoSource.h >+++ b/Source/WebCore/platform/mediastream/RealtimeVideoSource.h >@@ -46,8 +46,6 @@ protected: > void prepareToProduceData(); > bool supportsSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final; > void applySizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final; >- bool applySize(const IntSize&) override; >- bool applyFrameRate(double) final; > > void setSupportedFrameRates(Vector<double>&&); > void setSupportedCaptureSizes(const Vector<IntSize>&& sizes) { m_supportedCaptureSizes = sizes; } >diff --git a/Source/WebCore/platform/mediastream/gstreamer/GStreamerAudioCaptureSource.cpp b/Source/WebCore/platform/mediastream/gstreamer/GStreamerAudioCaptureSource.cpp >index 0d57b23f45282fbb27aba97bb8994eea0530df8b..7e216735d8c137c9c65c0b333a41501199259973 100644 >--- a/Source/WebCore/platform/mediastream/gstreamer/GStreamerAudioCaptureSource.cpp >+++ b/Source/WebCore/platform/mediastream/gstreamer/GStreamerAudioCaptureSource.cpp >@@ -172,9 +172,12 @@ const RealtimeMediaSourceCapabilities& GStreamerAudioCaptureSource::capabilities > return m_capabilities.value(); > } > >-bool GStreamerAudioCaptureSource::applySampleRate(int sampleRate) >+void GStreamerAudioCaptureSource::settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag> settings) > { >- return m_capturer->setSampleRate(sampleRate); >+ if (settings.contains(RealtimeMediaSourceSettings::Flag::SampleRate)) >+ m_capturer->setSampleRate(sampleRate()); >+ >+ RealtimeMediaSource::settingsDidChange(settings); > } > > const RealtimeMediaSourceSettings& GStreamerAudioCaptureSource::settings() const >diff --git a/Source/WebCore/platform/mediastream/gstreamer/GStreamerAudioCaptureSource.h b/Source/WebCore/platform/mediastream/gstreamer/GStreamerAudioCaptureSource.h >index 3fa4a9c2e3225227a62e0c31266f24bed8e260a3..985a2e42d0f60a80690dc71e2d58f3f74f00e150 100644 >--- a/Source/WebCore/platform/mediastream/gstreamer/GStreamerAudioCaptureSource.h >+++ b/Source/WebCore/platform/mediastream/gstreamer/GStreamerAudioCaptureSource.h >@@ -50,9 +50,8 @@ protected: > mutable std::optional<RealtimeMediaSourceSettings> m_currentSettings; > > private: >- bool applySampleRate(int) final; > bool isCaptureSource() const final { return true; } >- bool applyVolume(double) final { return true; } >+ void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) final; > > std::unique_ptr<GStreamerAudioCapturer> m_capturer; > >diff --git a/Source/WebCore/platform/mediastream/gstreamer/GStreamerVideoCaptureSource.cpp b/Source/WebCore/platform/mediastream/gstreamer/GStreamerVideoCaptureSource.cpp >index 5a9dfb517fa2487e1b9084dcb4b20e08ab54ddb0..401c60302b8b4b85bc21275bc3f1aa143b6ceb93 100644 >--- a/Source/WebCore/platform/mediastream/gstreamer/GStreamerVideoCaptureSource.cpp >+++ b/Source/WebCore/platform/mediastream/gstreamer/GStreamerVideoCaptureSource.cpp >@@ -107,18 +107,14 @@ GStreamerVideoCaptureSource::~GStreamerVideoCaptureSource() > { > } > >-bool GStreamerVideoCaptureSource::applySize(const IntSize &size) >+void GStreamerVideoCaptureSource::settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag> settings) > { >- m_capturer->setSize(size.width(), size.height()); >+ if (settings.containsAny({ RealtimeMediaSourceSettings::Flag::Width, RealtimeMediaSourceSettings::Flag::Height })) >+ m_capturer->setSize(width(), height()); >+ if (settings.contains(RealtimeMediaSourceSettings::Flag::FrameRate)) >+ m_capturer->setFrameRate(frameRate()); > >- return true; >-} >- >-bool GStreamerVideoCaptureSource::applyFrameRate(double framerate) >-{ >- m_capturer->setFrameRate(framerate); >- >- return true; >+ RealtimeMediaSource::settingsDidChange(settings); > } > > void GStreamerVideoCaptureSource::startProducingData() >diff --git a/Source/WebCore/platform/mediastream/gstreamer/GStreamerVideoCaptureSource.h b/Source/WebCore/platform/mediastream/gstreamer/GStreamerVideoCaptureSource.h >index 379ba7e0fd6e767b3cb728d8d58dde0bcfc2ef18..1609b00c49b6bc81c83b7a8c43f84fecf478cb6c 100644 >--- a/Source/WebCore/platform/mediastream/gstreamer/GStreamerVideoCaptureSource.h >+++ b/Source/WebCore/platform/mediastream/gstreamer/GStreamerVideoCaptureSource.h >@@ -37,7 +37,6 @@ public: > GstElement* pipeline() { return m_capturer->pipeline(); } > GStreamerCapturer* capturer() { return m_capturer.get(); } > >- > protected: > GStreamerVideoCaptureSource(const String& deviceID, const String& name, const gchar * source_factory); > GStreamerVideoCaptureSource(GStreamerCaptureDevice); >@@ -52,9 +51,7 @@ private: > static GstFlowReturn newSampleCallback(GstElement*, GStreamerVideoCaptureSource*); > > bool isCaptureSource() const final { return true; } >- bool applySize(const IntSize&) final; >- bool applyFrameRate(double) final; >- bool applyAspectRatio(double) final { return true; } >+ void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) final; > > std::unique_ptr<GStreamerVideoCapturer> m_capturer; > }; >diff --git a/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h b/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h >index 748e4800c551f89527bca60eb9637c4495f4e768..913836098c6e1614106907b1f75f743bf148a1c4 100644 >--- a/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h >+++ b/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h >@@ -73,13 +73,12 @@ private: > > const RealtimeMediaSourceCapabilities& capabilities() const final; > void applySizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final; >- bool applySize(const IntSize&) final; >- bool applyFrameRate(double) final; >+ bool setFrameRate(double); > const RealtimeMediaSourceSettings& settings() const final; > void startProducingData() final; > void stopProducingData() final; > bool supportsSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final; >- void settingsDidChange() final; >+ void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) final; > void monitorOrientation(OrientationNotifier&) final; > void beginConfiguration() final; > void commitConfiguration() final; >diff --git a/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm b/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm >index 17e0556d9c67810293ee289d1e9f02a7ecca204f..91614125351ff85ff53769b7a6010409a126e4ae 100644 >--- a/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm >+++ b/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm >@@ -270,10 +270,10 @@ void AVVideoCaptureSource::commitConfiguration() > [m_session commitConfiguration]; > } > >-void AVVideoCaptureSource::settingsDidChange() >+void AVVideoCaptureSource::settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag> settings) > { > m_currentSettings = std::nullopt; >- RealtimeMediaSource::settingsDidChange(); >+ RealtimeMediaSource::settingsDidChange(settings); > } > > const RealtimeMediaSourceSettings& AVVideoCaptureSource::settings() const >@@ -357,17 +357,6 @@ const RealtimeMediaSourceCapabilities& AVVideoCaptureSource::capabilities() cons > return *m_capabilities; > } > >-bool AVVideoCaptureSource::applySize(const IntSize& size) >-{ >- NSString *preset = bestSessionPresetForVideoDimensions(size.width(), size.height()); >- if (!preset || ![session() canSetSessionPreset:preset]) { >- LOG(Media, "AVVideoCaptureSource::applySize(%p), unable find or set preset for width: %i, height: %i", this, size.width(), size.height()); >- return false; >- } >- >- return setPreset(preset); >-} >- > IntSize AVVideoCaptureSource::sizeForPreset(NSString* preset) > { > if (!preset) >@@ -405,14 +394,14 @@ bool AVVideoCaptureSource::setPreset(NSString *preset) > [m_videoOutput setVideoSettings:settingsDictionary]; > #endif > } @catch(NSException *exception) { >- LOG(Media, "AVVideoCaptureSource::applySize(%p), exception thrown configuring device: <%s> %s", this, [[exception name] UTF8String], [[exception reason] UTF8String]); >+ LOG(Media, "AVVideoCaptureSource::setPreset(%p), exception thrown configuring device: <%s> %s", this, [[exception name] UTF8String], [[exception reason] UTF8String]); > return false; > } > > return true; > } > >-bool AVVideoCaptureSource::applyFrameRate(double rate) >+bool AVVideoCaptureSource::setFrameRate(double rate) > { > using namespace PAL; > double epsilon = 0.00001; >@@ -425,7 +414,7 @@ bool AVVideoCaptureSource::applyFrameRate(double rate) > } > > if (!bestFrameRateRange || !isFrameRateSupported(rate)) { >- LOG(Media, "AVVideoCaptureSource::applyFrameRate(%p), frame rate %f not supported by video device", this, rate); >+ LOG(Media, "AVVideoCaptureSource::setFrameRate(%p), frame rate %f not supported by video device", this, rate); > return false; > } > >@@ -442,16 +431,16 @@ bool AVVideoCaptureSource::applyFrameRate(double rate) > [device() unlockForConfiguration]; > } > } @catch(NSException *exception) { >- LOG(Media, "AVVideoCaptureSource::applyFrameRate(%p), exception thrown configuring device: <%s> %s", this, [[exception name] UTF8String], [[exception reason] UTF8String]); >+ LOG(Media, "AVVideoCaptureSource::setFrameRate(%p), exception thrown configuring device: <%s> %s", this, [[exception name] UTF8String], [[exception reason] UTF8String]); > return false; > } > > if (error) { >- LOG(Media, "AVVideoCaptureSource::applyFrameRate(%p), failed to lock video device for configuration: %s", this, [[error localizedDescription] UTF8String]); >+ LOG(Media, "AVVideoCaptureSource::setFrameRate(%p), failed to lock video device for configuration: %s", this, [[error localizedDescription] UTF8String]); > return false; > } > >- LOG(Media, "AVVideoCaptureSource::applyFrameRate(%p) - set frame rate range to %f", this, rate); >+ LOG(Media, "AVVideoCaptureSource::setFrameRate(%p) - set frame rate range to %f", this, rate); > return true; > } > >@@ -461,7 +450,7 @@ void AVVideoCaptureSource::applySizeAndFrameRate(std::optional<int> width, std:: > setPreset(bestSessionPresetForVideoDimensions(WTFMove(width), WTFMove(height))); > > if (frameRate) >- applyFrameRate(frameRate.value()); >+ setFrameRate(frameRate.value()); > } > > static inline int sensorOrientation(AVCaptureVideoOrientation videoOrientation) >@@ -627,10 +616,15 @@ void AVVideoCaptureSource::processNewFrame(RetainPtr<CMSampleBufferRef> sampleBu > std::swap(dimensions.width, dimensions.height); > > if (dimensions.width != m_width || dimensions.height != m_height) { >+ OptionSet<RealtimeMediaSourceSettings::Flag> changed; >+ if (m_width != dimensions.width) >+ changed.add(RealtimeMediaSourceSettings::Flag::Width); >+ if (m_height != dimensions.height) >+ changed.add(RealtimeMediaSourceSettings::Flag::Height); >+ > m_width = dimensions.width; > m_height = dimensions.height; >- >- settingsDidChange(); >+ settingsDidChange(changed); > } > > videoSampleAvailable(MediaSampleAVFObjC::create(m_buffer.get(), m_sampleRotation, [connection isVideoMirrored])); >diff --git a/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp b/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp >index 6c74407e15fdb16181ffa557c31e621c12f22a02..7d727cca63b5fa8169c7015392cf34b57c5f55c8 100644 >--- a/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp >+++ b/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2017 Apple Inc. All rights reserved. >+ * Copyright (C) 2017-2018 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -876,39 +876,19 @@ const RealtimeMediaSourceSettings& CoreAudioCaptureSource::settings() const > return m_currentSettings.value(); > } > >-void CoreAudioCaptureSource::settingsDidChange() >+void CoreAudioCaptureSource::settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag> settings) > { >- m_currentSettings = std::nullopt; >- RealtimeMediaSource::settingsDidChange(); >-} >- >-bool CoreAudioCaptureSource::applySampleRate(int sampleRate) >-{ >- // FIXME: We should be able to describe sample rate as a discreet range constraint so that we only enter here with values that can be applied. >- switch (sampleRate) { >- case 8000: >- case 16000: >- case 32000: >- case 44100: >- case 48000: >- case 96000: >- break; >- default: >- return false; >+ if (settings.contains(RealtimeMediaSourceSettings::Flag::EchoCancellation)) { >+ CoreAudioSharedUnit::singleton().setEnableEchoCancellation(echoCancellation()); >+ scheduleReconfiguration(); >+ } >+ if (settings.contains(RealtimeMediaSourceSettings::Flag::SampleRate)) { >+ CoreAudioSharedUnit::singleton().setSampleRate(sampleRate()); >+ scheduleReconfiguration(); > } > >- CoreAudioSharedUnit::singleton().setSampleRate(sampleRate); >- >- scheduleReconfiguration(); >- return true; >-} >- >-bool CoreAudioCaptureSource::applyEchoCancellation(bool enableEchoCancellation) >-{ >- CoreAudioSharedUnit::singleton().setEnableEchoCancellation(enableEchoCancellation); >- >- scheduleReconfiguration(); >- return true; >+ m_currentSettings = std::nullopt; >+ RealtimeMediaSource::settingsDidChange(settings); > } > > void CoreAudioCaptureSource::scheduleReconfiguration() >diff --git a/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h b/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h >index 792eaf07e0cefb4785e0f76f252569f63661140e..c40d3c6c34d60cf4ba9ccedbf021d3d593d2ddba 100644 >--- a/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h >+++ b/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2017 Apple Inc. All rights reserved. >+ * Copyright (C) 2017-2018 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -84,13 +84,11 @@ private: > void startProducingData() final; > void stopProducingData() final; > >- bool applyVolume(double) final { return true; } >- bool applySampleRate(int) final; >- bool applyEchoCancellation(bool) final; >+ std::optional<Vector<int>> discreteSampleRates() const final { return { { 8000, 16000, 32000, 44100, 48000, 96000 } }; } > > const RealtimeMediaSourceCapabilities& capabilities() const final; > const RealtimeMediaSourceSettings& settings() const final; >- void settingsDidChange() final; >+ void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) final; > > bool interrupted() const final; > >diff --git a/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp b/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp >index e74cbee792efe5da942417d7f4e295c7ee852079..3ecd5ca2cded4175f5d47fa07e8c8990916a2341 100644 >--- a/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp >+++ b/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2017 Apple Inc. All rights reserved. >+ * Copyright (C) 2017-2018 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -98,10 +98,17 @@ const RealtimeMediaSourceSettings& DisplayCaptureSourceCocoa::settings() const > return m_currentSettings.value(); > } > >-void DisplayCaptureSourceCocoa::settingsDidChange() >+void DisplayCaptureSourceCocoa::settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag> settings) > { >+ if (settings.contains(RealtimeMediaSourceSettings::Flag::FrameRate) && m_timer.isActive()) >+ m_timer.startRepeating(1_s / frameRate()); >+ >+ if (settings.containsAny({ RealtimeMediaSourceSettings::Flag::Width, RealtimeMediaSourceSettings::Flag::Height })) >+ m_bufferAttributes = nullptr; >+ > m_currentSettings = std::nullopt; >- RealtimeMediaSource::settingsDidChange(); >+ >+ RealtimeMediaSource::settingsDidChange(settings); > } > > void DisplayCaptureSourceCocoa::startProducingData() >@@ -111,7 +118,7 @@ void DisplayCaptureSourceCocoa::startProducingData() > #endif > > m_startTime = MonotonicTime::now(); >- m_timer.startRepeating(1_ms * lround(1000 / frameRate())); >+ m_timer.startRepeating(1_s / frameRate()); > } > > void DisplayCaptureSourceCocoa::stopProducingData() >@@ -129,23 +136,6 @@ Seconds DisplayCaptureSourceCocoa::elapsedTime() > return m_elapsedTime + (MonotonicTime::now() - m_startTime); > } > >-bool DisplayCaptureSourceCocoa::applySize(const IntSize& newSize) >-{ >- if (size() == newSize) >- return true; >- >- m_bufferAttributes = nullptr; >- return true; >-} >- >-bool DisplayCaptureSourceCocoa::applyFrameRate(double rate) >-{ >- if (m_timer.isActive()) >- m_timer.startRepeating(1_ms * lround(1000 / rate)); >- >- return true; >-} >- > void DisplayCaptureSourceCocoa::emitFrame() > { > if (muted()) >diff --git a/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.h b/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.h >index 7877e0bac490cb0df32de191ec85b59553ef2a17..484c1b0a7278396cde6e13e4a991e72e542e2959 100644 >--- a/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.h >+++ b/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.h >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2017 Apple Inc. All rights reserved. >+ * Copyright (C) 2017-2018 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -54,21 +54,20 @@ protected: > void stopProducingData() override; > > Seconds elapsedTime(); >- bool applyFrameRate(double) override; >- bool applySize(const IntSize&) override; > > RetainPtr<CMSampleBufferRef> sampleBufferFromPixelBuffer(CVPixelBufferRef); > #if HAVE(IOSURFACE) > RetainPtr<CVPixelBufferRef> pixelBufferFromIOSurface(IOSurfaceRef); > #endif > >+ void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) override; >+ > private: > > bool isCaptureSource() const final { return true; } > > const RealtimeMediaSourceCapabilities& capabilities() const final; > const RealtimeMediaSourceSettings& settings() const final; >- void settingsDidChange() final; > > void emitFrame(); > >diff --git a/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.h b/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.h >index 6d14b035110b3cec693ddf0719053daf8e33b40c..99d78eec7c702ecd16ecfda0b84d0c56b9d4f3bc 100644 >--- a/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.h >+++ b/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.h >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2016 Apple Inc. All rights reserved. >+ * Copyright (C) 2016-2018 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -50,8 +50,8 @@ private: > friend class MockRealtimeAudioSource; > MockRealtimeAudioSourceMac(const String& deviceID, const String& name); > >- bool applySampleRate(int) final; >- bool applySampleSize(int) final { return false; } >+ void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) final; >+ std::optional<Vector<int>> discreteSampleRates() const final { return { { 44100, 48000 } }; } > > void emitSampleBuffers(uint32_t); > void render(Seconds) final; >diff --git a/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.mm b/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.mm >index 5abb8f28b25d7a327287c169e325a859ce4663fb..0c8a4bde205c9b9b2ab2a888976bc9749c3371ac 100644 >--- a/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.mm >+++ b/Source/WebCore/platform/mediastream/mac/MockRealtimeAudioSourceMac.mm >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2016 Apple Inc. All rights reserved. >+ * Copyright (C) 2016-2018 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -158,30 +158,27 @@ void MockRealtimeAudioSourceMac::render(Seconds delta) > } > } > >-bool MockRealtimeAudioSourceMac::applySampleRate(int sampleRate) >+void MockRealtimeAudioSourceMac::settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag> settings) > { >- if (sampleRate < 44100 || sampleRate > 48000) >- return false; >+ if (settings.contains(RealtimeMediaSourceSettings::Flag::SampleRate)) { >+ m_formatDescription = nullptr; >+ m_audioBufferList = nullptr; > >- if (sampleRate == this->sampleRate()) >- return true; >+ auto rate = sampleRate(); >+ size_t sampleCount = 2 * rate; > >- m_formatDescription = nullptr; >- m_audioBufferList = nullptr; >+ m_bipBopBuffer.grow(sampleCount); >+ m_bipBopBuffer.fill(0); > >- size_t sampleCount = 2 * sampleRate; >+ size_t bipBopSampleCount = ceil(BipBopDuration * rate); >+ size_t bipStart = 0; >+ size_t bopStart = rate; > >- m_bipBopBuffer.grow(sampleCount); >- m_bipBopBuffer.fill(0); >- >- size_t bipBopSampleCount = ceil(BipBopDuration * sampleRate); >- size_t bipStart = 0; >- size_t bopStart = sampleRate; >- >- addHum(BipBopVolume, BipFrequency, sampleRate, 0, m_bipBopBuffer.data() + bipStart, bipBopSampleCount); >- addHum(BipBopVolume, BopFrequency, sampleRate, 0, m_bipBopBuffer.data() + bopStart, bipBopSampleCount); >+ addHum(BipBopVolume, BipFrequency, rate, 0, m_bipBopBuffer.data() + bipStart, bipBopSampleCount); >+ addHum(BipBopVolume, BopFrequency, rate, 0, m_bipBopBuffer.data() + bopStart, bipBopSampleCount); >+ } > >- return true; >+ MockRealtimeAudioSource::settingsDidChange(settings); > } > > } // namespace WebCore >diff --git a/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.h b/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.h >index f583671337df07aa64ca883cbff64e0baa27e9be..73129e1be7cb6dcc166fd556e00fd195ec44374e 100644 >--- a/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.h >+++ b/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.h >@@ -56,7 +56,7 @@ private: > > PlatformLayer* platformLayer() const; > void updateSampleBuffer() final; >- bool applySize(const IntSize&) final; >+ void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) final; > > void orientationChanged(int orientation) final; > void monitorOrientation(OrientationNotifier&) final; >diff --git a/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm b/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm >index 4ccee19126074cc080731380a2117230e93c20dd..17b35baa157d5f446bb90397cc336151092fe8dc 100644 >--- a/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm >+++ b/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm >@@ -154,13 +154,11 @@ void MockRealtimeVideoSourceMac::updateSampleBuffer() > dispatchMediaSampleToObservers(MediaSampleAVFObjC::create(sampleBuffer.get(), m_deviceOrientation)); > } > >-bool MockRealtimeVideoSourceMac::applySize(const IntSize& newSize) >+void MockRealtimeVideoSourceMac::settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag> settings) > { >- if (!MockRealtimeVideoSource::applySize(newSize)) >- return false; >- >- m_bufferPool = nullptr; >- return true; >+ if (settings.containsAny({ RealtimeMediaSourceSettings::Flag::Width, RealtimeMediaSourceSettings::Flag::Height })) >+ m_bufferPool = nullptr; >+ MockRealtimeVideoSource::settingsDidChange(settings); > } > > void MockRealtimeVideoSourceMac::orientationChanged(int orientation) >diff --git a/Source/WebCore/platform/mediastream/mac/RealtimeIncomingVideoSourceCocoa.mm b/Source/WebCore/platform/mediastream/mac/RealtimeIncomingVideoSourceCocoa.mm >index 4b425f9ba62b0f3f093a906fd4b2ae49c2a43c3e..bbac8da5e439c8a20a28decf577decd6618e7a47 100644 >--- a/Source/WebCore/platform/mediastream/mac/RealtimeIncomingVideoSourceCocoa.mm >+++ b/Source/WebCore/platform/mediastream/mac/RealtimeIncomingVideoSourceCocoa.mm >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2017 Apple Inc. All rights reserved. >+ * Copyright (C) 2017-2018 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -173,9 +173,15 @@ void RealtimeIncomingVideoSourceCocoa::processNewSample(CMSampleBufferRef sample > { > m_buffer = sample; > if (width != m_currentSettings.width() || height != m_currentSettings.height()) { >+ OptionSet<RealtimeMediaSourceSettings::Flag> changed; >+ if (width != m_currentSettings.width()) >+ changed.add(RealtimeMediaSourceSettings::Flag::Width); >+ if (height != m_currentSettings.height()) >+ changed.add(RealtimeMediaSourceSettings::Flag::Height); >+ > m_currentSettings.setWidth(width); > m_currentSettings.setHeight(height); >- settingsDidChange(); >+ settingsDidChange(changed); > } > > videoSampleAvailable(MediaSampleAVFObjC::create(sample, rotation)); >diff --git a/Source/WebCore/platform/mediastream/mac/ScreenDisplayCaptureSourceMac.h b/Source/WebCore/platform/mediastream/mac/ScreenDisplayCaptureSourceMac.h >index d26a294e36e79e8a3a11950e2af1887c8127479f..0b1f3ef9f2f8d94a9a1eb886b8540e05976a38ac 100644 >--- a/Source/WebCore/platform/mediastream/mac/ScreenDisplayCaptureSourceMac.h >+++ b/Source/WebCore/platform/mediastream/mac/ScreenDisplayCaptureSourceMac.h >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2017 Apple Inc. All rights reserved. >+ * Copyright (C) 2017-2018 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -59,8 +59,7 @@ private: > void generateFrame() final; > void startProducingData() final; > void stopProducingData() final; >- bool applySize(const IntSize&) final; >- bool applyFrameRate(double) final; >+ void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) final; > void commitConfiguration() final; > > bool createDisplayStream(); >diff --git a/Source/WebCore/platform/mediastream/mac/ScreenDisplayCaptureSourceMac.mm b/Source/WebCore/platform/mediastream/mac/ScreenDisplayCaptureSourceMac.mm >index b17e7c2b45e0d90523a2c422c6e8cce7771bb2d8..e6e448c3ecaaf05083480930d5cdc40310e98a4d 100644 >--- a/Source/WebCore/platform/mediastream/mac/ScreenDisplayCaptureSourceMac.mm >+++ b/Source/WebCore/platform/mediastream/mac/ScreenDisplayCaptureSourceMac.mm >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2017 Apple Inc. All rights reserved. >+ * Copyright (C) 2017-2018 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -253,21 +253,12 @@ void ScreenDisplayCaptureSourceMac::startDisplayStream() > m_isRunning = true; > } > >-bool ScreenDisplayCaptureSourceMac::applySize(const IntSize& newSize) >+void ScreenDisplayCaptureSourceMac::settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag> settings) > { >- if (!DisplayCaptureSourceCocoa::applySize(newSize)) >- return false; >- >- m_displayStream = nullptr; >- return true; >-} >- >-bool ScreenDisplayCaptureSourceMac::applyFrameRate(double rate) >-{ >- if (frameRate() != rate) >+ if (settings.containsAny({ RealtimeMediaSourceSettings::Flag::Width, RealtimeMediaSourceSettings::Flag::Height, RealtimeMediaSourceSettings::Flag::FrameRate })) > m_displayStream = nullptr; > >- return DisplayCaptureSourceCocoa::applyFrameRate(rate); >+ return DisplayCaptureSourceCocoa::settingsDidChange(settings); > } > > void ScreenDisplayCaptureSourceMac::commitConfiguration() >diff --git a/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp b/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp >index f3c937ff8a5bbd72f5f9839ad7d96ec24526725d..965727082cb323989596b81ac6a13a6d910f1095 100644 >--- a/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp >+++ b/Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp >@@ -134,10 +134,10 @@ const RealtimeMediaSourceCapabilities& MockRealtimeAudioSource::capabilities() c > return m_capabilities.value(); > } > >-void MockRealtimeAudioSource::settingsDidChange() >+void MockRealtimeAudioSource::settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag> settings) > { > m_currentSettings = std::nullopt; >- RealtimeMediaSource::settingsDidChange(); >+ RealtimeMediaSource::settingsDidChange(settings); > } > > void MockRealtimeAudioSource::startProducingData() >diff --git a/Source/WebCore/platform/mock/MockRealtimeAudioSource.h b/Source/WebCore/platform/mock/MockRealtimeAudioSource.h >index 443dd073f0b43bc562b4a7c1a039d32065156397..79c6678ad0153116c7ab7177449ba6895332b2a0 100644 >--- a/Source/WebCore/platform/mock/MockRealtimeAudioSource.h >+++ b/Source/WebCore/platform/mock/MockRealtimeAudioSource.h >@@ -54,18 +54,13 @@ protected: > void stopProducingData() final; > > virtual void render(Seconds) { } >+ void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) override; > > static Seconds renderInterval() { return 60_ms; } > > private: >- bool applyVolume(double) override { return true; } >- bool applySampleRate(int) override { return true; } >- bool applySampleSize(int) override { return true; } >- bool applyEchoCancellation(bool) override { return true; } >- > const RealtimeMediaSourceCapabilities& capabilities() const final; > const RealtimeMediaSourceSettings& settings() const final; >- void settingsDidChange() final; > > void tick(); > >diff --git a/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp b/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp >index 1eec441d78ecad145d97d01f748ec082e1b26ea3..2aeaf2cafe173726e44de6377f11fea19bc5e7d3 100644 >--- a/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp >+++ b/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp >@@ -192,10 +192,17 @@ const RealtimeMediaSourceSettings& MockRealtimeVideoSource::settings() const > return m_currentSettings.value(); > } > >-void MockRealtimeVideoSource::settingsDidChange() >+void MockRealtimeVideoSource::settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag> settings) > { > m_currentSettings = std::nullopt; >- RealtimeVideoSource::settingsDidChange(); >+ if (settings.containsAny({ RealtimeMediaSourceSettings::Flag::Width, RealtimeMediaSourceSettings::Flag::Height })) { >+ m_baseFontSize = size().height() * .08; >+ m_bipBopFontSize = m_baseFontSize * 2.5; >+ m_statsFontSize = m_baseFontSize * .5; >+ m_imageBuffer = nullptr; >+ } >+ >+ RealtimeVideoSource::settingsDidChange(settings); > } > > void MockRealtimeVideoSource::startCaptureTimer() >@@ -225,19 +232,6 @@ Seconds MockRealtimeVideoSource::elapsedTime() > return m_elapsedTime + (MonotonicTime::now() - m_startTime); > } > >-bool MockRealtimeVideoSource::applySize(const IntSize& size) >-{ >- if (!RealtimeVideoSource::applySize(size)) >- return false; >- >- m_baseFontSize = size.height() * .08; >- m_bipBopFontSize = m_baseFontSize * 2.5; >- m_statsFontSize = m_baseFontSize * .5; >- m_imageBuffer = nullptr; >- >- return true; >-} >- > void MockRealtimeVideoSource::drawAnimation(GraphicsContext& context) > { > float radius = size().width() * .09; >diff --git a/Source/WebCore/platform/mock/MockRealtimeVideoSource.h b/Source/WebCore/platform/mock/MockRealtimeVideoSource.h >index 6ac7358e74c8e33a001b28e06f4525b73418c4f6..91f656afc1771db2f6fe6c6883f2e124007a9160 100644 >--- a/Source/WebCore/platform/mock/MockRealtimeVideoSource.h >+++ b/Source/WebCore/platform/mock/MockRealtimeVideoSource.h >@@ -60,12 +60,11 @@ protected: > ImageBuffer* imageBuffer() const; > > Seconds elapsedTime(); >- bool applySize(const IntSize&) override; >+ void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) override; > > private: > const RealtimeMediaSourceCapabilities& capabilities() const final; > const RealtimeMediaSourceSettings& settings() const final; >- void settingsDidChange() final; > > void startProducingData() final; > void stopProducingData() final; >@@ -74,9 +73,6 @@ private: > void drawText(GraphicsContext&); > void drawBoxes(GraphicsContext&); > >- bool applyFacingMode(RealtimeMediaSourceSettings::VideoFacingMode) override { return true; } >- bool applyAspectRatio(double) override { return true; } >- > bool isCaptureSource() const final { return true; } > > void generateFrame(); >diff --git a/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp b/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp >index 8240d50a5280a44fc77ef3cdf0ce82ad7ae270c2..25cbfc3c16b4121eefc37197154f2ccd479bdc24 100644 >--- a/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp >+++ b/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2017 Apple Inc. All rights reserved. >+ * Copyright (C) 2017-2018 Apple Inc. All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions >@@ -74,8 +74,9 @@ public: > const RealtimeMediaSourceSettings& settings() const final { return m_settings; } > void setSettings(RealtimeMediaSourceSettings&& settings) > { >+ auto changed = m_settings.diff(settings); > m_settings = WTFMove(settings); >- settingsDidChange(); >+ settingsDidChange(changed); > } > > const CAAudioStreamDescription& description() const { return m_description; }
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 189284
:
348882
|
348885
|
348888
|
348921
|
348923