Changeset 280776 in webkit
- Timestamp:
- Aug 9, 2021, 8:15:19 AM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 8 edited
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp (modified) (2 diffs)
-
WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h (modified) (2 diffs)
-
WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp (modified) (4 diffs)
-
WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm (modified) (6 diffs)
-
WebKit/ChangeLog (modified) (1 diff)
-
WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp (modified) (1 diff)
-
WebKit/GPUProcess/media/cocoa/RemoteMediaPlayerProxyCocoa.mm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r280775 r280776 1 2021-08-09 Jer Noble <jer.noble@apple.com> 2 3 [Cocoa|GPU] platformLayer() not always added to remotedly hosted context; black video while playing 4 https://bugs.webkit.org/show_bug.cgi?id=228873 5 <rdar://81271107> 6 7 Reviewed by Eric Carlson. 8 9 Coalesce calls to renderingModeChanged() by setting a flag to call renderingModeChanged() in 10 the next run loop, and call into this coalescing method, setNeedsRenderingModeChanged(), 11 whenever the MediaPlayerPrivateAVFoundation subclasses create or destroy a video layer 12 or software painting context. This ensures that the MediaPlayerClient is always notified 13 when the rendering mode changes, regardless of why that change occurred. 14 15 Drive-by fix: replace the call in createVideoLayer() to "callOnMainThread()" 16 with "ensureOnMainThread()". The call to "callOnMainThread()" was added to avoid a 17 deadlock in WebKitLegacy, and "ensureOnMainThread()" has the correct behavior there, but 18 will be synchronous in WebKit. 19 20 * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp: 21 (WebCore::MediaPlayerPrivateAVFoundation::setUpVideoRendering): 22 (WebCore::MediaPlayerPrivateAVFoundation::setNeedsRenderingModeChanged): 23 (WebCore::MediaPlayerPrivateAVFoundation::renderingModeChanged): 24 (WebCore::MediaPlayerPrivateAVFoundation::prepareForRendering): 25 * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h: 26 * platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp: 27 (WebCore::MediaPlayerPrivateAVFoundationCF::destroyVideoLayer): 28 (WebCore::AVFWrapper::createAVCFVideoLayer): 29 (WebCore::AVFWrapper::createImageGenerator): 30 (WebCore::AVFWrapper::destroyImageGenerator): 31 * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm: 32 (WebCore::MediaPlayerPrivateAVFoundationObjC::createVideoLayer): 33 (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVPlayerLayer): 34 (WebCore::MediaPlayerPrivateAVFoundationObjC::destroyVideoLayer): 35 (WebCore::MediaPlayerPrivateAVFoundationObjC::createVideoOutput): 36 (WebCore::MediaPlayerPrivateAVFoundationObjC::destroyVideoOutput): 37 1 38 2021-08-09 Alicia Boya García <aboya@igalia.com> 2 39 -
trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp
r280723 r280776 143 143 // If using a movie layer, inform the client so the compositing tree is updated. 144 144 if (currentMode == MediaRenderingToLayer || preferredMode == MediaRenderingToLayer) 145 m_player->renderingModeChanged(); 145 setNeedsRenderingModeChanged(); 146 } 147 148 void MediaPlayerPrivateAVFoundation::setNeedsRenderingModeChanged() 149 { 150 if (m_needsRenderingModeChanged) 151 return; 152 m_needsRenderingModeChanged = true; 153 154 queueTaskOnEventLoop([weakThis = makeWeakPtr(*this)] { 155 if (weakThis) 156 weakThis->renderingModeChanged(); 157 }); 158 } 159 160 void MediaPlayerPrivateAVFoundation::renderingModeChanged() 161 { 162 ASSERT(m_needsRenderingModeChanged); 163 m_needsRenderingModeChanged = false; 164 m_player->renderingModeChanged(); 146 165 } 147 166 … … 444 463 445 464 if (currentRenderingMode() == MediaRenderingToLayer || preferredRenderingMode() == MediaRenderingToLayer) 446 m_player->renderingModeChanged();465 setNeedsRenderingModeChanged(); 447 466 } 448 467 -
trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h
r280624 r280776 321 321 const URL& resolvedURL() const { return m_resolvedURL; } 322 322 323 void setNeedsRenderingModeChanged(); 324 void renderingModeChanged(); 325 323 326 private: 324 327 MediaPlayer* m_player; … … 369 372 bool m_shouldMaintainAspectRatio; 370 373 bool m_seeking; 374 bool m_needsRenderingModeChanged { false }; 371 375 }; 372 376 -
trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp
r280624 r280776 443 443 return; 444 444 445 if (m_avfWrapper) 446 m_avfWrapper->createImageGenerator(); 445 if (!m_avfWrapper) 446 return; 447 448 m_avfWrapper->createImageGenerator(); 449 setNeedsRenderingModeChanged(); 447 450 } 448 451 … … 450 453 { 451 454 ASSERT(isMainThread()); 452 if (m_avfWrapper) 453 m_avfWrapper->destroyImageGenerator(); 455 if (!m_avfWrapper) 456 return; 457 458 m_avfWrapper->destroyImageGenerator(); 459 setNeedsRenderingModeChanged(); 454 460 } 455 461 … … 459 465 ASSERT(supportsAcceleratedRendering()); 460 466 461 if (m_avfWrapper) 462 m_avfWrapper->createAVCFVideoLayer(); 467 if (!m_avfWrapper) 468 return; 469 470 m_avfWrapper->createAVCFVideoLayer(); 471 setNeedsRenderingModeChanged(); 463 472 } 464 473 … … 467 476 ASSERT(isMainThread()); 468 477 LOG(Media, "MediaPlayerPrivateAVFoundationCF::destroyVideoLayer(%p) - destroying %p", this, videoLayer(m_avfWrapper)); 469 if (m_avfWrapper) 470 m_avfWrapper->destroyVideoLayer(); 478 if (!m_avfWrapper) 479 return; 480 481 m_avfWrapper->destroyVideoLayer(); 482 setNeedsRenderingModeChanged(); 471 483 } 472 484 -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm
r280766 r280776 607 607 return; 608 608 609 callOnMainThread([this, weakThis = makeWeakPtr(*this)] {609 ensureOnMainThread([this, weakThis = makeWeakPtr(*this)] { 610 610 if (!weakThis) 611 611 return; … … 620 620 if (!m_videoOutput) 621 621 createVideoOutput(); 622 623 player()->renderingModeChanged();624 622 }); 625 623 } … … 646 644 [m_videoLayer setPIPModeEnabled:(player()->fullscreenMode() & MediaPlayer::VideoFullscreenModePictureInPicture)]; 647 645 #endif 646 647 setNeedsRenderingModeChanged(); 648 648 } 649 649 … … 660 660 661 661 m_videoLayer = nil; 662 663 setNeedsRenderingModeChanged(); 662 664 } 663 665 … … 2433 2435 2434 2436 [m_avPlayerItem.get() addOutput:m_videoOutput.get()]; 2437 2438 setNeedsRenderingModeChanged(); 2435 2439 } 2436 2440 … … 2446 2450 2447 2451 m_videoOutput = 0; 2452 2453 setNeedsRenderingModeChanged(); 2448 2454 } 2449 2455 -
trunk/Source/WebKit/ChangeLog
r280774 r280776 1 2021-08-09 Jer Noble <jer.noble@apple.com> 2 3 [Cocoa|GPU] platformLayer() not always added to remotedly hosted context; black video while playing 4 https://bugs.webkit.org/show_bug.cgi?id=228873 5 <rdar://81271107> 6 7 Reviewed by Eric Carlson. 8 9 Currently, the RemoteMediaPlayerProxy will insert its MediaPlayer's platformLayer() into the 10 remotely hosted context when it receives a "firstVideoFrameAvailable()" notification. 11 However this is problematic for two reasons: AVPlayerLayer may not become "ready for 12 playback" when it is not in an active CALayer heirarchy, and for 13 MediaPlayerPrivateAVFoundation, firstVideoFrameAvailable() is only fired during 14 updateStates(), which is not guaranteed to occur unless another state change occurs. 15 16 Instead, reparent the MediaPlayer's platformLayer() when we receive a 17 mediaPlayerRenderingModeChanged() notification, which notifies the client whenever a 18 platformLayer() is created or destroyed. 19 20 * GPUProcess/media/RemoteMediaPlayerProxy.cpp: 21 * GPUProcess/media/cocoa/RemoteMediaPlayerProxyCocoa.mm: 22 (WebKit::RemoteMediaPlayerProxy::mediaPlayerFirstVideoFrameAvailable): 23 (WebKit::RemoteMediaPlayerProxy::mediaPlayerRenderingModeChanged): 24 1 25 2021-08-09 Imanol Fernandez <ifernandez@igalia.com> 2 26 -
trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp
r280308 r280776 519 519 } 520 520 521 #if !PLATFORM(COCOA) 521 522 void RemoteMediaPlayerProxy::mediaPlayerRenderingModeChanged() 522 523 { 523 524 m_webProcessConnection->send(Messages::MediaPlayerPrivateRemote::RenderingModeChanged(), m_id); 524 525 } 526 #endif 525 527 526 528 TrackPrivateRemoteIdentifier RemoteMediaPlayerProxy::addRemoteAudioTrackProxy(WebCore::AudioTrackPrivate& track) -
trunk/Source/WebKit/GPUProcess/media/cocoa/RemoteMediaPlayerProxyCocoa.mm
r279221 r280776 67 67 { 68 68 // Initially the size of the platformLayer may be 0x0 because we do not provide mediaPlayerContentBoxRect() in this class. 69 m_inlineLayerHostingContext->setRootLayer(m_player->platformLayer());70 69 setVideoInlineSizeIfPossible(*m_inlineLayerHostingContext, m_videoInlineSize); 71 70 m_webProcessConnection->send(Messages::MediaPlayerPrivateRemote::FirstVideoFrameAvailable(), m_id); 72 71 } 73 72 73 void RemoteMediaPlayerProxy::mediaPlayerRenderingModeChanged() 74 { 75 m_inlineLayerHostingContext->setRootLayer(m_player->platformLayer()); 76 m_webProcessConnection->send(Messages::MediaPlayerPrivateRemote::RenderingModeChanged(), m_id); 77 } 74 78 void RemoteMediaPlayerProxy::setVideoInlineSizeFenced(const WebCore::FloatSize& size, const WTF::MachSendRight& machSendRight) 75 79 {
Note:
See TracChangeset
for help on using the changeset viewer.