Changeset 253275 in webkit
- Timestamp:
- Dec 8, 2019, 11:10:02 AM (7 years ago)
- Location:
- trunk
- Files:
-
- 17 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/fast/mediastream/mediastreamtrack-video-clone-expected.txt (modified) (1 diff)
-
LayoutTests/fast/mediastream/mediastreamtrack-video-clone.html (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/platform/mediastream/RealtimeMediaSource.h (modified) (2 diffs)
-
Source/WebCore/platform/mediastream/RealtimeMediaSourceFactory.h (modified) (1 diff)
-
Source/WebCore/platform/mediastream/RealtimeVideoCaptureSource.cpp (modified) (1 diff)
-
Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp (modified) (2 diffs)
-
Source/WebCore/platform/mediastream/RealtimeVideoSource.h (modified) (1 diff)
-
Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp (modified) (1 diff)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/Shared/WebPreferences.yaml (modified) (2 diffs)
-
Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (modified) (7 diffs)
-
Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h (modified) (1 diff)
-
Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in (modified) (1 diff)
-
Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp (modified) (7 diffs)
-
Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r253267 r253275 1 2019-12-08 youenn fablet <youenn@apple.com> 2 3 Support different resolutions for video tracks captured from UIProcess 4 https://bugs.webkit.org/show_bug.cgi?id=204945 5 6 Reviewed by Eric Carlson. 7 8 * fast/mediastream/mediastreamtrack-video-clone-expected.txt: 9 * fast/mediastream/mediastreamtrack-video-clone.html: 10 1 11 2019-12-07 Wenson Hsieh <wenson_hsieh@apple.com> 2 12 -
trunk/LayoutTests/fast/mediastream/mediastreamtrack-video-clone-expected.txt
r247391 r253275 1 1 2 2 3 3 PASS Setup for width test -
trunk/LayoutTests/fast/mediastream/mediastreamtrack-video-clone.html
r253033 r253275 1 <!-- webkit-test-runner [ enableCaptureVideoInUIProcess=false ] -->2 1 <!DOCTYPE html> 3 2 <html> -
trunk/Source/WebCore/ChangeLog
r253270 r253275 1 2019-12-08 youenn fablet <youenn@apple.com> 2 3 Support different resolutions for video tracks captured from UIProcess 4 https://bugs.webkit.org/show_bug.cgi?id=204945 5 6 Reviewed by Eric Carlson. 7 8 Remove whether the a source is remote or not. 9 Previously we were doing the distinction as resizing would happen in WebProcess and not in UIProcess. 10 We are now moving away from doing resizing in WebProcess. 11 Covered by existing tests. 12 13 * platform/mediastream/RealtimeMediaSource.h: 14 * platform/mediastream/RealtimeMediaSourceFactory.h: 15 * platform/mediastream/RealtimeVideoCaptureSource.cpp: 16 (WebCore::RealtimeVideoCaptureSource::adaptVideoSample): 17 For remote tracks, we also update the size for observers. 18 * platform/mediastream/RealtimeVideoSource.cpp: 19 (WebCore::m_source): 20 (WebCore::RealtimeVideoSource::sourceSettingsChanged): 21 Update computation of size based on rotation. 22 This makes sure we have resizing done right. 23 * platform/mediastream/RealtimeVideoSource.h: 24 * platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp: 25 (WebCore::DisplayCaptureSourceCocoa::emitFrame): 26 1 27 2019-12-08 Antti Koivisto <antti@apple.com> 2 28 -
trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h
r248046 r253275 184 184 virtual bool isIncomingVideoSource() const { return false; } 185 185 186 void setIsRemote(bool isRemote) { m_isRemote = isRemote; }187 bool isRemote() const { return m_isRemote; }188 189 186 #if !RELEASE_LOG_DISABLED 190 187 void setLogger(const Logger&, const void*); … … 269 266 bool m_interrupted { false }; 270 267 bool m_captureDidFailed { false }; 271 bool m_isRemote { false };272 268 bool m_isEnded { false }; 273 269 }; -
trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceFactory.h
r253033 r253275 43 43 WEBCORE_EXPORT void setActiveSource(RealtimeMediaSource&); 44 44 WEBCORE_EXPORT void unsetActiveSource(RealtimeMediaSource&); 45 46 protected: 45 47 RealtimeMediaSource* activeSource() { return m_activeSource; } 46 48 -
trunk/Source/WebCore/platform/mediastream/RealtimeVideoCaptureSource.cpp
r246644 r253275 396 396 397 397 #if PLATFORM(COCOA) 398 if (!isRemote()) { 399 auto size = this->size(); 400 if (!size.isEmpty() && size != expandedIntSize(sample.presentationSize())) { 401 402 if (!m_imageTransferSession || m_imageTransferSession->pixelFormat() != sample.videoPixelFormat()) 403 m_imageTransferSession = ImageTransferSessionVT::create(sample.videoPixelFormat()); 404 405 if (m_imageTransferSession) { 406 mediaSample = m_imageTransferSession->convertMediaSample(sample, size); 407 if (!mediaSample) { 408 ASSERT_NOT_REACHED(); 409 return nullptr; 410 } 398 auto size = this->size(); 399 if (!size.isEmpty() && size != expandedIntSize(sample.presentationSize())) { 400 401 if (!m_imageTransferSession || m_imageTransferSession->pixelFormat() != sample.videoPixelFormat()) 402 m_imageTransferSession = ImageTransferSessionVT::create(sample.videoPixelFormat()); 403 404 ASSERT(m_imageTransferSession); 405 if (m_imageTransferSession) { 406 mediaSample = m_imageTransferSession->convertMediaSample(sample, size); 407 if (!mediaSample) { 408 ASSERT_NOT_REACHED(); 409 return nullptr; 411 410 } 412 411 } -
trunk/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp
r247391 r253275 37 37 m_source->addObserver(*this); 38 38 m_currentSettings = m_source->settings(); 39 m_rotation = m_source->sampleRotation(); 40 setSize(m_source->size()); 39 41 } 40 42 … … 92 94 void RealtimeVideoSource::sourceSettingsChanged() 93 95 { 94 auto rotation = m_source->sampleRotation();95 96 auto size = this->size(); 96 97 if (size.isEmpty()) 97 98 size = m_source->size(); 98 if (rotation == MediaSample::VideoRotation::Left || rotation == MediaSample::VideoRotation::Right) 99 size = size.transposedSize(); 99 100 auto rotation = m_source->sampleRotation(); 101 if (m_rotation != rotation) { 102 bool shouldTransposeSize = false; 103 switch (m_rotation) { 104 case MediaSample::VideoRotation::None: 105 case MediaSample::VideoRotation::UpsideDown: 106 shouldTransposeSize = rotation == MediaSample::VideoRotation::Left || rotation == MediaSample::VideoRotation::Right; 107 break; 108 case MediaSample::VideoRotation::Left: 109 case MediaSample::VideoRotation::Right: 110 shouldTransposeSize = rotation == MediaSample::VideoRotation::None || rotation == MediaSample::VideoRotation::UpsideDown; 111 } 112 m_rotation = rotation; 113 if (shouldTransposeSize) { 114 size = size.transposedSize(); 115 setSize(size); 116 } 117 } 118 100 119 m_currentSettings.setWidth(size.width()); 101 120 m_currentSettings.setHeight(size.height()); -
trunk/Source/WebCore/platform/mediastream/RealtimeVideoSource.h
r247391 r253275 65 65 void videoSampleAvailable(MediaSample&) final; 66 66 67 MediaSample::VideoRotation m_rotation { MediaSample::VideoRotation::None }; 67 68 Ref<RealtimeVideoCaptureSource> m_source; 68 69 RealtimeMediaSourceSettings m_currentSettings; -
trunk/Source/WebCore/platform/mediastream/mac/DisplayCaptureSourceCocoa.cpp
r239163 r253275 187 187 setIntrinsicSize(imageSize); 188 188 189 auto mediaSampleSize = isRemote() ? imageSize :frameSize();189 auto mediaSampleSize = frameSize(); 190 190 191 191 RefPtr<MediaSample> sample = WTF::switchOn(frame, -
trunk/Source/WebKit/ChangeLog
r253274 r253275 1 2019-12-08 youenn fablet <youenn@apple.com> 2 3 Support different resolutions for video tracks captured from UIProcess 4 https://bugs.webkit.org/show_bug.cgi?id=204945 5 6 Reviewed by Eric Carlson. 7 8 Change video capture in uiprocess to an experimental flag. 9 Add support for remote video source cloning by sending some IPC to UIProcess and cloning the source there. 10 This triggers IPC for both cloning and cloned sources but this allows to do resizing in UIProcess instead of WebProcess. 11 We thus disable video capture resizing in WebProcess. 12 13 * Shared/WebPreferences.yaml: 14 * UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp: 15 (WebKit::UserMediaCaptureManagerProxy::SourceProxy::start): 16 (WebKit::UserMediaCaptureManagerProxy::SourceProxy::stop): 17 (WebKit::UserMediaCaptureManagerProxy::SourceProxy::requestToEnd): 18 (WebKit::UserMediaCaptureManagerProxy::SourceProxy::preventSourceFromStopping): 19 (WebKit::UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints): 20 (WebKit::UserMediaCaptureManagerProxy::startProducingData): 21 (WebKit::UserMediaCaptureManagerProxy::stopProducingData): 22 (WebKit::UserMediaCaptureManagerProxy::clone): 23 (WebKit::UserMediaCaptureManagerProxy::requestToEnd): 24 * UIProcess/Cocoa/UserMediaCaptureManagerProxy.h: 25 * UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in: 26 * WebProcess/cocoa/UserMediaCaptureManager.cpp: 27 (WebKit::UserMediaCaptureManager::Source::sourceID const): 28 (WebKit::UserMediaCaptureManager::Source::settings const): 29 (WebKit::UserMediaCaptureManager::Source::remoteVideoSampleAvailable): 30 (WebKit::UserMediaCaptureManager::Source::requestToEnd): 31 (WebKit::UserMediaCaptureManager::Source::stopBeingObserved): 32 (WebKit::UserMediaCaptureManager::cloneSource): 33 (WebKit::UserMediaCaptureManager::cloneVideoSource): 34 (WebKit::UserMediaCaptureManager::requestToEnd): 35 (WebKit::UserMediaCaptureManager::VideoFactory::setVideoCapturePageState): 36 * WebProcess/cocoa/UserMediaCaptureManager.h: 37 1 38 2019-12-08 youenn fablet <youenn@apple.com> 2 39 -
trunk/Source/WebKit/Shared/WebPreferences.yaml
r253213 r253275 1499 1499 webcoreName: genericCueAPIEnabled 1500 1500 1501 CaptureVideoInUIProcessEnabled: 1502 type: bool 1503 defaultValue: false 1504 humanReadableName: "Capture video in UIProcess" 1505 humanReadableDescription: "Enable video capture in UIProcess" 1506 category: experimental 1507 webcoreBinding: none 1508 condition: ENABLE(MEDIA_STREAM) 1509 1510 1501 1511 # For internal features: 1502 1512 # The type should be boolean. … … 1678 1688 humanReadableName: "Capture audio in UIProcess" 1679 1689 humanReadableDescription: "Enable audio capture in UIProcess" 1680 category: internal1681 webcoreBinding: none1682 condition: ENABLE(MEDIA_STREAM)1683 1684 CaptureVideoInUIProcessEnabled:1685 type: bool1686 defaultValue: false1687 humanReadableName: "Capture video in UIProcess"1688 humanReadableDescription: "Enable video capture in UIProcess"1689 1690 category: internal 1690 1691 webcoreBinding: none -
trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp
r253045 r253275 69 69 int64_t numberOfFrames() { return m_numberOfFrames; } 70 70 71 void start() 72 { 73 m_isEnded = false; 74 m_source->start(); 75 } 76 77 void stop() 78 { 79 m_isEnded = true; 80 m_source->stop(); 81 } 82 83 void requestToEnd() 84 { 85 m_isEnded = true; 86 m_source->requestToEnd(*this); 87 } 88 89 private: 71 90 void sourceStopped() final { 72 91 if (m_source->captureDidFail()) { … … 122 141 } 123 142 124 protected: 143 bool preventSourceFromStopping() 144 { 145 // Do not allow the source to stop if we are still using it. 146 return !m_isEnded; 147 } 148 125 149 uint64_t m_id; 126 150 Ref<IPC::Connection> m_connection; … … 129 153 CAAudioStreamDescription m_description { }; 130 154 int64_t m_numberOfFrames { 0 }; 155 bool m_isEnded { false }; 131 156 }; 132 157 … … 170 195 if (sourceOrError) { 171 196 auto source = sourceOrError.source(); 172 source->setIsRemote(true);173 197 settings = source->settings(); 174 198 ASSERT(!m_proxies.contains(id)); … … 183 207 MESSAGE_CHECK_CONTEXTID(id); 184 208 if (auto* proxy = m_proxies.get(id)) 185 proxy->s ource().start();209 proxy->start(); 186 210 } 187 211 … … 190 214 MESSAGE_CHECK_CONTEXTID(id); 191 215 if (auto* proxy = m_proxies.get(id)) 192 proxy->s ource().stop();216 proxy->stop(); 193 217 } 194 218 … … 230 254 } 231 255 256 void UserMediaCaptureManagerProxy::clone(uint64_t clonedID, uint64_t newSourceID) 257 { 258 ASSERT(m_proxies.contains(clonedID)); 259 ASSERT(!m_proxies.contains(newSourceID)); 260 if (auto* proxy = m_proxies.get(clonedID)) 261 m_proxies.add(newSourceID, makeUnique<SourceProxy>(newSourceID, *m_process.connection(), proxy->source().clone())); 262 } 263 264 void UserMediaCaptureManagerProxy::requestToEnd(uint64_t sourceID) 265 { 266 if (auto* proxy = m_proxies.get(sourceID)) 267 proxy->requestToEnd(); 268 } 269 232 270 void UserMediaCaptureManagerProxy::clear() 233 271 { -
trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h
r253045 r253275 62 62 void setMuted(uint64_t, bool); 63 63 void applyConstraints(uint64_t, const WebCore::MediaConstraints&); 64 void clone(uint64_t clonedID, uint64_t cloneID); 65 void requestToEnd(uint64_t); 64 66 65 67 class SourceProxy; -
trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in
r252655 r253275 32 32 SetMuted(uint64_t id, bool muted) 33 33 ApplyConstraints(uint64_t id, struct WebCore::MediaConstraints constraints) 34 Clone(uint64_t clonedID, uint64_t cloneID) 35 RequestToEnd(uint64_t sourceID) 34 36 } 35 37 -
trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp
r253055 r253275 111 111 } 112 112 113 Ref<RealtimeMediaSource> clone() final 114 { 115 return m_manager.cloneSource(*this); 116 } 117 118 uint64_t sourceID() const 119 { 120 return m_id; 121 } 122 123 const RealtimeMediaSourceSettings& settings() const 124 { 125 return m_settings; 126 } 127 113 128 const RealtimeMediaSourceCapabilities& capabilities() final 114 129 { … … 166 181 ASSERT(type() == Type::Video); 167 182 168 auto remoteSampleSize = remoteSample.size(); 169 setIntrinsicSize(remoteSampleSize); 170 171 auto videoSampleSize = IntSize(m_settings.width(), m_settings.height()); 172 if (videoSampleSize.isZero()) 173 videoSampleSize = remoteSampleSize; 174 else if (!videoSampleSize.height()) 175 videoSampleSize.setHeight(videoSampleSize.width() * (remoteSampleSize.height() / static_cast<double>(remoteSampleSize.width()))); 176 else if (!videoSampleSize.width()) 177 videoSampleSize.setWidth(videoSampleSize.height() * (remoteSampleSize.width() / static_cast<double>(remoteSampleSize.height()))); 183 setIntrinsicSize(remoteSample.size()); 178 184 179 185 if (!m_imageTransferSession || m_imageTransferSession->pixelFormat() != remoteSample.videoFormat()) … … 185 191 } 186 192 187 auto sampleRef = m_imageTransferSession->createMediaSample(remoteSample.surface(), remoteSample.time(), videoSampleSize);193 auto sampleRef = m_imageTransferSession->createMediaSample(remoteSample.surface(), remoteSample.time(), remoteSample.size()); 188 194 if (!sampleRef) { 189 195 ASSERT_NOT_REACHED(); … … 209 215 } 210 216 217 CaptureDevice::DeviceType deviceType() const final { return m_deviceType; } 218 211 219 private: 212 220 void startProducingData() final { m_manager.startProducingData(m_id); } 213 221 void stopProducingData() final { m_manager.stopProducingData(m_id); } 214 222 bool isCaptureSource() const final { return true; } 215 CaptureDevice::DeviceType deviceType() const final { return m_deviceType; }216 223 217 224 // RealtimeMediaSource … … 224 231 m_manager.applyConstraints(m_id, constraints); 225 232 m_pendingApplyConstraintsCallbacks.append(WTFMove(completionHandler)); 233 } 234 235 void requestToEnd(RealtimeMediaSource::Observer&) 236 { 237 m_manager.requestToEnd(m_id); 238 } 239 240 void stopBeingObserved() 241 { 242 m_manager.requestToEnd(m_id); 226 243 } 227 244 … … 401 418 } 402 419 420 Ref<RealtimeMediaSource> UserMediaCaptureManager::cloneSource(Source& source) 421 { 422 switch (source.type()) { 423 case RealtimeMediaSource::Type::Video: 424 return cloneVideoSource(source); 425 case RealtimeMediaSource::Type::Audio: 426 break; 427 case RealtimeMediaSource::Type::None: 428 ASSERT_NOT_REACHED(); 429 } 430 return makeRef(source); 431 } 432 433 Ref<RealtimeMediaSource> UserMediaCaptureManager::cloneVideoSource(Source& source) 434 { 435 uint64_t id = nextSessionID(); 436 if (!m_process.send(Messages::UserMediaCaptureManagerProxy::Clone { source.sourceID(), id }, 0)) 437 return makeRef(source); 438 439 auto settings = source.settings(); 440 auto cloneSource = adoptRef(*new Source(String::number(id), source.type(), source.deviceType(), String { settings.label().string() }, source.deviceIDHashSalt(), id, *this)); 441 cloneSource->setSettings(WTFMove(settings)); 442 m_sources.add(id, cloneSource.copyRef()); 443 return cloneSource; 444 } 445 446 void UserMediaCaptureManager::requestToEnd(uint64_t sourceID) 447 { 448 m_process.send(Messages::UserMediaCaptureManagerProxy::RequestToEnd { sourceID }, 0); 449 } 450 403 451 #if PLATFORM(IOS_FAMILY) 404 452 void UserMediaCaptureManager::AudioFactory::setAudioCapturePageState(bool interrupted, bool pageMuted) 405 453 { 406 if (auto* activeSource = static_cast<AudioCaptureFactory*>(this)->activeSource())454 if (auto* activeSource = this->activeSource()) 407 455 activeSource->setInterrupted(interrupted, pageMuted); 408 456 } … … 410 458 void UserMediaCaptureManager::VideoFactory::setVideoCapturePageState(bool interrupted, bool pageMuted) 411 459 { 412 if (auto* activeSource = static_cast<VideoCaptureFactory*>(this)->activeSource()) 413 activeSource->setInterrupted(interrupted, pageMuted); 414 } 415 #endif 416 417 } 418 419 #endif 460 // In case of cloning, we might have more than a single source. 461 for (auto& source : m_manager.m_sources.values()) { 462 if (source->deviceType() == CaptureDevice::DeviceType::Camera) 463 source->setInterrupted(interrupted, pageMuted); 464 } 465 } 466 #endif 467 468 } 469 470 #endif -
trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h
r253055 r253275 135 135 class Source; 136 136 friend class Source; 137 138 void requestToEnd(uint64_t sourceID); 139 Ref<WebCore::RealtimeMediaSource> cloneSource(Source&); 140 Ref<WebCore::RealtimeMediaSource> cloneVideoSource(Source&); 141 137 142 HashMap<uint64_t, RefPtr<Source>> m_sources; 138 143 WebProcess& m_process;
Note:
See TracChangeset
for help on using the changeset viewer.