Changeset 280720 in webkit
- Timestamp:
- Aug 6, 2021, 2:15:49 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 12 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/fast/mediastream/mediaPlayer-visibility-expected.txt (added)
-
LayoutTests/fast/mediastream/mediaPlayer-visibility.html (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/html/HTMLMediaElement.cpp (modified) (2 diffs)
-
Source/WebCore/platform/graphics/MediaPlayer.cpp (modified) (2 diffs)
-
Source/WebCore/platform/graphics/MediaPlayer.h (modified) (2 diffs)
-
Source/WebCore/platform/graphics/MediaPlayerPrivate.h (modified) (1 diff)
-
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h (modified) (4 diffs)
-
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm (modified) (5 diffs)
-
Source/WebCore/rendering/RenderVideo.cpp (modified) (1 diff)
-
Source/WebCore/testing/Internals.cpp (modified) (1 diff)
-
Source/WebCore/testing/Internals.h (modified) (1 diff)
-
Source/WebCore/testing/Internals.idl (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r280719 r280720 1 2021-08-06 Youenn Fablet <youenn@apple.com> 2 3 MediaPlayerPrivateMediaStreamAVFObjC should skip enqueuing frames when not visible 4 https://bugs.webkit.org/show_bug.cgi?id=228816 5 <rdar://81077972> 6 7 Reviewed by Eric Carlson. 8 9 * fast/mediastream/mediaPlayer-visibility-expected.txt: Added. 10 * fast/mediastream/mediaPlayer-visibility.html: Added. 11 1 12 2021-08-05 Ryan Haddad <ryanhaddad@apple.com> 2 13 -
trunk/Source/WebCore/ChangeLog
r280718 r280720 1 2021-08-06 Youenn Fablet <youenn@apple.com> 2 3 MediaPlayerPrivateMediaStreamAVFObjC should skip enqueuing frames when not visible 4 https://bugs.webkit.org/show_bug.cgi?id=228816 5 <rdar://81077972> 6 7 Reviewed by Eric Carlson. 8 9 Do not create layers when not needed. 10 This prevents enqueuing frames in a AVSampleBufferDisplayLayer that will only buffer them, thus breaking camera capture/video decoding. 11 We do this by not calling ensureLayers when getting a new track. Instead we react upon player renderingCanBeAccelerated value. 12 13 It is also unnecessary and takes CPU cycles to enqueue frames when the video element is not visible. 14 HTMLMediaElement and RenderVideo thus pass to MediaPlayer a new flag telling whether the video element is visible in the view port. 15 MediaPlayerPrivateMediaStreamAVFObjC will then skip enqueueing frames if not needed. 16 17 Add getter and internals API to cover these changes. 18 19 Test: fast/mediastream/mediaPlayer-visibility.html 20 21 * html/HTMLMediaElement.cpp: 22 (WebCore::HTMLMediaElement::isVisibleInViewportChanged): 23 * platform/graphics/MediaPlayer.cpp: 24 (WebCore::MediaPlayer::loadWithNextMediaEngine): 25 (WebCore::MediaPlayer::setVisibleInViewport): 26 * platform/graphics/MediaPlayer.h: 27 * platform/graphics/MediaPlayerPrivate.h: 28 (WebCore::MediaPlayerPrivateInterface::setVisibleInViewport): 29 * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h: 30 * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm: 31 (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::enqueueVideoSample): 32 (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setVisible): 33 (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setVisibleInViewport): 34 (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::checkSelectedVideoTrack): 35 (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::paintCurrentFrameInContext): 36 * rendering/RenderVideo.cpp: 37 (WebCore::RenderVideo::updatePlayer): 38 * testing/Internals.cpp: 39 (WebCore::Internals::isPlayerVisibleInViewport const): 40 * testing/Internals.h: 41 * testing/Internals.idl: 42 1 43 2021-08-05 Cameron McCormack <heycam@apple.com> 2 44 -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r280664 r280720 6745 6745 m_player->setMuted(effectiveMuted()); 6746 6746 m_player->setVisible(!m_elementIsHidden); 6747 m_player->setVisibleInViewport(isVisibleInViewport()); 6747 6748 schedulePlaybackControlsManagerUpdate(); 6748 6749 … … 8072 8073 void HTMLMediaElement::isVisibleInViewportChanged() 8073 8074 { 8075 if (m_player) 8076 m_player->setVisibleInViewport(isVisibleInViewport()); 8074 8077 queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this] { 8075 8078 if (isContextStopped()) -
trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp
r280308 r280720 576 576 if (m_visible) 577 577 m_private->setVisible(m_visible); 578 if (m_visibleInViewport) 579 m_private->setVisibleInViewport(m_visibleInViewport); 578 580 m_private->prepareForPlayback(m_privateBrowsing, m_preload, m_preservesPitch, m_shouldPrepareToRender); 579 581 } … … 1010 1012 { 1011 1013 m_private->setVisibleForCanvas(visible); 1014 } 1015 1016 void MediaPlayer::setVisibleInViewport(bool visible) 1017 { 1018 m_visibleInViewport = visible; 1019 m_private->setVisibleInViewport(visible); 1012 1020 } 1013 1021 -
trunk/Source/WebCore/platform/graphics/MediaPlayer.h
r280308 r280720 361 361 void setVisibleForCanvas(bool); 362 362 363 void setVisibleInViewport(bool); 364 bool isVisibleInViewport() const { return m_visibleInViewport; } 365 363 366 void prepareToPlay(); 364 367 void play(); … … 700 703 double m_volume { 1 }; 701 704 bool m_visible { false }; 705 bool m_visibleInViewport { false }; 702 706 bool m_muted { false }; 703 707 bool m_preservesPitch { true }; -
trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h
r280308 r280720 99 99 virtual void setVisible(bool) = 0; 100 100 virtual void setVisibleForCanvas(bool visible) { setVisible(visible); } 101 virtual void setVisibleInViewport(bool) { } 101 102 102 103 virtual float duration() const { return 0; } -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h
r278253 r280720 123 123 void setVisible(bool) final; 124 124 void setVisibleForCanvas(bool) final; 125 void setVisibleInViewport(bool) final; 125 126 126 127 MediaTime durationMediaTime() const override; … … 144 145 bool metaDataAvailable() const { return m_mediaStreamPrivate && m_readyState >= MediaPlayer::ReadyState::HaveMetadata; } 145 146 146 void acceleratedRenderingStateChanged() override;147 void acceleratedRenderingStateChanged() final { updateLayersAsNeeded(); } 147 148 bool supportsAcceleratedRendering() const override { return true; } 148 149 … … 171 172 172 173 void layersAreInitialized(IntSize, bool); 174 void updateLayersAsNeeded(); 173 175 174 176 enum DisplayMode { … … 273 275 bool m_ended { false }; 274 276 bool m_hasEverEnqueuedVideoFrame { false }; 275 bool m_visible { false }; 277 bool m_isPageVisible { false }; 278 bool m_isVisibleInViewPort { false }; 276 279 bool m_haveSeenMetadata { false }; 277 280 bool m_waitingForFirstImage { false }; -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm
r280518 r280720 253 253 void MediaPlayerPrivateMediaStreamAVFObjC::enqueueVideoSample(MediaSample& sample) 254 254 { 255 if (!m_ visible)255 if (!m_isPageVisible || !m_isVisibleInViewPort) 256 256 return; 257 257 … … 615 615 } 616 616 617 void MediaPlayerPrivateMediaStreamAVFObjC::setVisible(bool visible)618 { 619 if (m_ visible == visible)620 return; 621 622 m_ visible = visible;617 void MediaPlayerPrivateMediaStreamAVFObjC::setVisible(bool isVisible) 618 { 619 if (m_isPageVisible == isVisible) 620 return; 621 622 m_isPageVisible = isVisible; 623 623 flushRenderers(); 624 624 } … … 626 626 void MediaPlayerPrivateMediaStreamAVFObjC::setVisibleForCanvas(bool) 627 627 { 628 } 629 630 void MediaPlayerPrivateMediaStreamAVFObjC::setVisibleInViewport(bool isVisible) 631 { 632 m_isVisibleInViewPort = isVisible; 628 633 } 629 634 … … 862 867 m_waitingForFirstImage = true; 863 868 } 864 ensureLayers(); 869 870 updateLayersAsNeeded(); 871 865 872 if (m_sampleBufferDisplayLayer) { 866 873 if (!m_activeVideoTrack) … … 999 1006 } 1000 1007 1001 void MediaPlayerPrivateMediaStreamAVFObjC:: acceleratedRenderingStateChanged()1008 void MediaPlayerPrivateMediaStreamAVFObjC::updateLayersAsNeeded() 1002 1009 { 1003 1010 if (m_player->renderingCanBeAccelerated()) -
trunk/Source/WebCore/rendering/RenderVideo.cpp
r277321 r280720 283 283 mediaPlayer->setSize(IntSize(videoBounds.width(), videoBounds.height())); 284 284 mediaPlayer->setVisible(!videoElement().elementIsHidden()); 285 mediaPlayer->setVisibleInViewport(videoElement().isVisibleInViewport()); 285 286 mediaPlayer->setShouldMaintainAspectRatio(style().objectFit() != ObjectFit::Fill); 286 287 } -
trunk/Source/WebCore/testing/Internals.cpp
r280715 r280720 4421 4421 return element.isDisablingSleep(); 4422 4422 } 4423 4424 bool Internals::isPlayerVisibleInViewport(HTMLMediaElement& element) const 4425 { 4426 auto player = element.player(); 4427 return player && player->isVisibleInViewport(); 4428 } 4429 4423 4430 #endif // ENABLE(VIDEO) 4424 4431 -
trunk/Source/WebCore/testing/Internals.h
r280715 r280720 714 714 void activeAudioRouteDidChange(bool shouldPause); 715 715 bool elementIsBlockingDisplaySleep(HTMLMediaElement&) const; 716 bool isPlayerVisibleInViewport(HTMLMediaElement&) const; 716 717 #endif 717 718 -
trunk/Source/WebCore/testing/Internals.idl
r280715 r280720 774 774 [Conditional=VIDEO] undefined simulateSystemWake(); 775 775 [Conditional=VIDEO] boolean elementIsBlockingDisplaySleep(HTMLMediaElement element); 776 [Conditional=VIDEO] boolean isPlayerVisibleInViewport(HTMLMediaElement element); 776 777 777 778 MockPageOverlay installMockPageOverlay(PageOverlayType type);
Note:
See TracChangeset
for help on using the changeset viewer.