Changeset 239319 in webkit
- Timestamp:
- Dec 17, 2018 9:31:22 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 2 deleted
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r239314 r239319 1 2018-12-17 Eric Carlson <eric.carlson@apple.com> 2 3 [MediaStream] A stream's first video frame should be rendered 4 https://bugs.webkit.org/show_bug.cgi?id=192629 5 <rdar://problem/46664353> 6 7 Reviewed by Youenn Fablet. 8 9 * fast/mediastream/MediaStream-video-element-displays-buffer.html: Updated. 10 * fast/mediastream/MediaStream-video-element-video-tracks-disabled-then-enabled-expected.txt: Ditto. 11 * fast/mediastream/MediaStream-video-element-video-tracks-disabled-then-enabled.html: Ditto. 12 * fast/mediastream/media-stream-renders-first-frame-expected.txt: Added. 13 * fast/mediastream/media-stream-renders-first-frame.html: Added. 14 * http/tests/media/media-stream/getusermedia-with-canvas-expected.txt: Removed. 15 * http/tests/media/media-stream/getusermedia-with-canvas.html: Removed. 16 1 17 2018-12-17 Wenson Hsieh <wenson_hsieh@apple.com> 2 18 -
trunk/LayoutTests/fast/mediastream/MediaStream-video-element-displays-buffer.html
r214951 r239319 3 3 <head> 4 4 <script src="../../resources/js-test-pre.js"></script> 5 <script src="./resources/getUserMedia-helper.js"></script>6 5 </head> 7 6 <body onload="start()"> … … 86 85 debug(`<br> === checking pixels from ${!currentTest ? "front" : "back"} camera ===`); 87 86 let constraints = {video : !currentTest ? true : {facingMode: "environment"}}; 88 getUserMedia("allow", constraints,setupVideoElement);87 navigator.mediaDevices.getUserMedia(constraints).then(setupVideoElement); 89 88 } 90 89 … … 92 91 { 93 92 description("Tests that the stream displays captured buffers to the video element."); 93 if (window.testRunner) 94 testRunner.setUserMediaPermission(true); 94 95 95 96 videos = Array.from(document.getElementsByTagName('video')); -
trunk/LayoutTests/fast/mediastream/MediaStream-video-element-video-tracks-disabled-then-enabled-expected.txt
r214951 r239319 8 8 9 9 === beginning round of pixel tests === 10 PASS pixel was black.10 PASS pixel was white. 11 11 12 12 === all video tracks disabled === 13 13 PASS pixel was black. 14 14 15 === video track reenabled, should NOTrender current frame ===16 PASS pixel was black.15 === video track reenabled, should render current frame === 16 PASS pixel was white. 17 17 18 18 ===== play video ===== -
trunk/LayoutTests/fast/mediastream/MediaStream-video-element-video-tracks-disabled-then-enabled.html
r213880 r239319 3 3 <head> 4 4 <script src="../../resources/js-test-pre.js"></script> 5 <script src="./resources/getUserMedia-helper.js"></script>6 5 </head> 7 6 <body onload="start()"> … … 15 14 let mediaStream; 16 15 let video; 17 let havePlayed = false;18 16 19 17 let buffer; … … 36 34 function canvasShouldBeBlack() 37 35 { 38 return ! (mediaStream.getVideoTracks()[0].enabled && havePlayed);36 return !mediaStream.getVideoTracks()[0].enabled; 39 37 } 40 38 … … 62 60 debug('<br> ===== play video ====='); 63 61 evalAndLog('video.play()'); 64 havePlayed = true;65 62 beginTestRound(); 66 63 } else { … … 74 71 { 75 72 mediaStream.getVideoTracks()[0].enabled = true; 76 debug(`<br> === video track reenabled, should ${havePlayed ? "" : " NOT"}render current frame ===`);73 debug(`<br> === video track reenabled, should render current frame ===`); 77 74 78 75 // The video is not guaranteed to render non-black frames before the canvas is drawn to and the pixels are checked. … … 124 121 { 125 122 description("Tests that re-enabling a video MediaStreamTrack when all tracks were previously disabled causes captured media to display."); 123 if (window.testRunner) 124 testRunner.setUserMediaPermission(true); 126 125 127 126 video = document.querySelector('video'); 128 127 video.addEventListener('canplay', canplay); 129 128 130 getUserMedia("allow", {video:true}, setupVideoElementWithStream); 129 navigator.mediaDevices.getUserMedia({ video : true }) 130 .then((stream) => { 131 mediaStream = stream; 132 testPassed('mediaDevices.getUserMedia generated a stream successfully.'); 133 evalAndLog('video.srcObject = mediaStream'); 134 }); 131 135 } 132 136 -
trunk/LayoutTests/platform/gtk/TestExpectations
r239156 r239319 611 611 webkit.org/b/79203 fast/mediastream/MediaStream-video-element-displays-buffer.html [ Failure ] 612 612 webkit.org/b/79203 fast/mediastream/RTCPeerConnection-stats.html [ Timeout Crash ] 613 webkit.org/b/79203 http/tests/media/media-stream/getusermedia-with-canvas.html [ Timeout ]614 613 webkit.org/b/79203 imported/w3c/web-platform-tests/mediacapture-streams/MediaStream-MediaElement-preload-none.https.html [ Failure Pass ] 615 614 webkit.org/b/79203 imported/w3c/web-platform-tests/mediacapture-streams/MediaStreamTrack-end-manual.https.html [ Failure ] -
trunk/Source/WebCore/ChangeLog
r239316 r239319 1 2018-12-17 Eric Carlson <eric.carlson@apple.com> 2 3 [MediaStream] A stream's first video frame should be rendered 4 https://bugs.webkit.org/show_bug.cgi?id=192629 5 <rdar://problem/46664353> 6 7 Reviewed by Youenn Fablet. 8 9 Test: fast/mediastream/media-stream-renders-first-frame.html 10 11 * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h: 12 * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm: 13 (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::enqueueVideoSample): 14 (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::ensureLayers): 15 (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::currentDisplayMode const): 16 (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::updateDisplayMode): 17 (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::play): 18 (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::currentReadyState): 19 (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::characteristicsChanged): 20 (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::checkSelectedVideoTrack): 21 (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::paintCurrentFrameInContext): 22 * platform/mediastream/RealtimeMediaSource.cpp: 23 (WebCore::RealtimeMediaSource::size const): 24 * platform/mediastream/mac/AVVideoCaptureSource.mm: 25 (WebCore::AVVideoCaptureSource::processNewFrame): 26 * platform/mediastream/mac/RealtimeIncomingVideoSourceCocoa.mm: 27 (WebCore::RealtimeIncomingVideoSourceCocoa::processNewSample): 28 1 29 2018-12-17 Justin Michaud <justin_michaud@apple.com> 2 30 -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h
r232613 r239319 190 190 None, 191 191 PaintItBlack, 192 WaitingForFirstImage, 192 193 PausedImage, 193 194 LivePreview, … … 229 230 230 231 void applicationDidBecomeActive() final; 232 233 bool hideBackgroundLayer() const { return (!m_activeVideoTrack || m_waitingForFirstImage) && m_displayMode != PaintItBlack; } 231 234 232 235 MediaPlayer* m_player { nullptr }; … … 275 278 bool m_hasEverEnqueuedVideoFrame { false }; 276 279 bool m_pendingSelectedTrackCheck { false }; 277 bool m_shouldDisplayFirstVideoFrame { false };278 280 bool m_transformIsValid { false }; 279 281 bool m_visible { false }; 280 282 bool m_haveSeenMetadata { false }; 283 bool m_waitingForFirstImage { false }; 281 284 }; 282 285 -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm
r237266 r239319 166 166 if ((CALayer *)object == _parent->backgroundLayer()) { 167 167 if ([keyPath isEqualToString:@"bounds"]) { 168 if (!_parent) 169 return; 170 171 if (isMainThread()) { 172 _parent->backgroundLayerBoundsChanged(); 173 return; 174 } 175 168 176 callOnMainThread([protectedSelf = RetainPtr<WebAVSampleBufferStatusChangeListener>(self)] { 169 177 if (!protectedSelf->_parent) … … 364 372 } 365 373 366 if (m_displayMode != LivePreview || (m_displayMode == PausedImage && m_imagePainter.mediaSample))374 if (m_displayMode != LivePreview && !m_waitingForFirstImage) 367 375 return; 368 376 … … 392 400 393 401 enqueueCorrectedVideoSample(sample); 402 if (m_waitingForFirstImage) { 403 m_waitingForFirstImage = false; 404 updateDisplayMode(); 405 } 394 406 } 395 407 … … 482 494 483 495 m_backgroundLayer = adoptNS([[CALayer alloc] init]); 496 m_backgroundLayer.get().hidden = hideBackgroundLayer(); 497 484 498 m_backgroundLayer.get().backgroundColor = cachedCGColor(Color::black); 485 499 m_backgroundLayer.get().needsDisplayOnBoundsChange = YES; 500 501 auto size = snappedIntRect(m_player->client().mediaPlayerContentBoxRect()).size(); 502 m_backgroundLayer.get().bounds = CGRectMake(0, 0, size.width(), size.height()); 486 503 487 504 [m_statusChangeListener beginObservingLayers]; … … 497 514 updateDisplayLayer(); 498 515 499 m_videoFullscreenLayerManager->setVideoLayer(m_backgroundLayer.get(), s nappedIntRect(m_player->client().mediaPlayerContentBoxRect()).size());516 m_videoFullscreenLayerManager->setVideoLayer(m_backgroundLayer.get(), size); 500 517 } 501 518 … … 602 619 } 603 620 621 if (m_waitingForFirstImage) 622 return WaitingForFirstImage; 623 604 624 if (playing() && !m_ended) { 605 625 if (!m_mediaStreamPrivate->isProducingData()) … … 624 644 m_displayMode = displayMode; 625 645 626 if (m_sampleBufferDisplayLayer) { 627 runWithoutAnimations([this] { 628 m_sampleBufferDisplayLayer.get().hidden = m_displayMode < PausedImage; 646 auto hidden = m_displayMode < PausedImage; 647 if (m_sampleBufferDisplayLayer && m_sampleBufferDisplayLayer.get().hidden != hidden) { 648 runWithoutAnimations([this, hidden] { 649 m_sampleBufferDisplayLayer.get().hidden = hidden; 650 }); 651 } 652 hidden = hideBackgroundLayer(); 653 if (m_backgroundLayer && m_backgroundLayer.get().hidden != hidden) { 654 runWithoutAnimations([this, hidden] { 655 m_backgroundLayer.get().hidden = hidden; 629 656 }); 630 657 } … … 647 674 track->play(); 648 675 649 m_shouldDisplayFirstVideoFrame = true;650 676 updateDisplayMode(); 651 677 … … 766 792 767 793 if (track == m_mediaStreamPrivate->activeVideoTrack() && !m_imagePainter.mediaSample) { 768 if (!m_haveSeenMetadata )794 if (!m_haveSeenMetadata || m_waitingForFirstImage) 769 795 return MediaPlayer::ReadyState::HaveNothing; 770 796 allTracksAreLive = false; … … 772 798 } 773 799 774 if ( !allTracksAreLive && !m_haveSeenMetadata)800 if (m_waitingForFirstImage || (!allTracksAreLive && !m_haveSeenMetadata)) 775 801 return MediaPlayer::ReadyState::HaveMetadata; 776 802 … … 829 855 m_intrinsicSize = intrinsicSize; 830 856 sizeChanged = true; 857 if (m_playbackState == PlaybackState::None) 858 m_playbackState = PlaybackState::Paused; 831 859 } 832 860 … … 980 1008 } 981 1009 982 if (oldVideoTrack != m_activeVideoTrack) 1010 if (oldVideoTrack != m_activeVideoTrack) { 983 1011 m_imagePainter.reset(); 1012 if (m_displayMode == None) 1013 m_waitingForFirstImage = true; 1014 } 984 1015 ensureLayers(); 985 1016 m_sampleBufferDisplayLayer.get().hidden = hideVideoLayer || m_displayMode < PausedImage; 1017 m_backgroundLayer.get().hidden = hideBackgroundLayer(); 1018 986 1019 m_pendingSelectedTrackCheck = false; 987 1020 updateDisplayMode(); … … 1076 1109 1077 1110 GraphicsContextStateSaver stateSaver(context); 1078 if (m_displayMode == PaintItBlack || !m_imagePainter.cgImage || !m_imagePainter.mediaSample) {1111 if (m_displayMode == PaintItBlack) { 1079 1112 context.fillRect(IntRect(IntPoint(), IntSize(destRect.width(), destRect.height())), Color::black); 1080 1113 return; 1081 1114 } 1115 1116 if (!m_imagePainter.cgImage || !m_imagePainter.mediaSample) 1117 return; 1082 1118 1083 1119 auto image = m_imagePainter.cgImage.get(); … … 1165 1201 void MediaPlayerPrivateMediaStreamAVFObjC::backgroundLayerBoundsChanged() 1166 1202 { 1167 scheduleDeferredTask([this] { 1168 runWithoutAnimations([this] { 1169 updateDisplayLayer(); 1170 }); 1203 runWithoutAnimations([this] { 1204 updateDisplayLayer(); 1171 1205 }); 1172 1206 } -
trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp
r239163 r239319 875 875 876 876 if (size.isEmpty() && !m_intrinsicSize.isEmpty()) { 877 if (size.width()) 877 if (size.isZero()) 878 size = m_intrinsicSize; 879 else if (size.width()) 878 880 size.setHeight(size.width() * (m_intrinsicSize.height() / static_cast<double>(m_intrinsicSize.width()))); 879 881 else if (size.height()) -
trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h
r238145 r239319 127 127 double m_pendingFrameRate; 128 128 InterruptionReason m_interruption { InterruptionReason::None }; 129 int m_framesToDropAtStartup { 0 }; 129 130 bool m_isRunning { false }; 130 131 }; -
trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm
r239065 r239319 525 525 526 526 m_buffer = &sample.get(); 527 setIntrinsicSize(expandedIntSize(sample->presentationSize())); 527 528 dispatchMediaSampleToObservers(WTFMove(sample)); 528 529 } … … 530 531 void AVVideoCaptureSource::captureOutputDidOutputSampleBufferFromConnection(AVCaptureOutputType*, CMSampleBufferRef sampleBuffer, AVCaptureConnectionType* captureConnection) 531 532 { 533 if (m_framesToDropAtStartup && m_framesToDropAtStartup--) 534 return; 535 532 536 auto sample = MediaSampleAVFObjC::create(sampleBuffer, m_sampleRotation, [captureConnection isVideoMirrored]); 533 537 scheduleDeferredTask([this, sample = WTFMove(sample)] () mutable { … … 543 547 544 548 m_isRunning = state; 549 if (m_isRunning) 550 m_framesToDropAtStartup = 4; 551 545 552 notifyMutedChange(!m_isRunning); 546 553 }); … … 574 581 575 582 CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(format.formatDescription); 576 IntSize size = { dimensions.width, dimensions.height};583 IntSize size = { dimensions.width, dimensions.height }; 577 584 auto index = presets.findMatching([&size](auto& preset) { 578 585 return size == preset->size; -
trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingVideoSourceCocoa.mm
r237266 r239319 230 230 auto size = this->size(); 231 231 if (WTF::safeCast<int>(width) != size.width() || WTF::safeCast<int>(height) != size.height()) 232 set Size(IntSize(width, height));232 setIntrinsicSize(IntSize(width, height)); 233 233 234 234 videoSampleAvailable(MediaSampleAVFObjC::create(sample, rotation));
Note: See TracChangeset
for help on using the changeset viewer.