Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 0e0d7976dfe09316e3cb57a4786defeb5c5d7eb6
      
https://github.com/WebKit/WebKit/commit/0e0d7976dfe09316e3cb57a4786defeb5c5d7eb6
  Author: Youenn Fablet <[email protected]>
  Date:   2023-05-31 (Wed, 31 May 2023)

  Changed paths:
    M 
Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.h
    M 
Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm
    M 
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h
    M 
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm

  Log Message:
  -----------
  WebRTC backed media element rendering is slow to update to changes of layers 
(size or layer made hidden/visible)
https://bugs.webkit.org/show_bug.cgi?id=256695
rdar://109257177

Reviewed by Eric Carlson.

AVSampleBufferDisplayLayer may sometimes take a very long time to update when 
its bounds are changed.
To workaround this, we are now recreating a new AVSampleBufferDisplayLayer 
whenever there is a resizing.
We are then enqueuing a VideoFrame if there is one on the current layer.
And we hop back to main thread to replace the old AVSampleBufferDisplayLayer 
with the new one.

Since we are changing of AVSampleBufferDisplayLayer, we are storing a member on 
main thread and another on the work queue where we enqueue video frames.
We are also storing the last enqueued pixel buffer in case we need to reenqueue 
it in the new AVSampleBufferDisplayLayer.
We are adding thread checks for these members.

On MediaPlayerPrivateMediaStreamAVFObjC, we are reducing the number of resizing 
we were doing.
We remove some class to updateRootLayerBoundsAndPosition that were needed for 
in process rendering.
We are also delaying creation of the display layer until the size is not empty.

Manually tested.

* 
Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.h:
* 
Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm:
(WebCore::LocalSampleBufferDisplayLayer::initialize):
(WebCore::LocalSampleBufferDisplayLayer::~LocalSampleBufferDisplayLayer):
(WebCore::LocalSampleBufferDisplayLayer::updateRootLayerBoundsAndPosition):
(WebCore::LocalSampleBufferDisplayLayer::flush):
(WebCore::LocalSampleBufferDisplayLayer::flushAndRemoveImage):
(WebCore::LocalSampleBufferDisplayLayer::enqueueVideoFrame):
(WebCore::LocalSampleBufferDisplayLayer::enqueueBuffer):
(WebCore::LocalSampleBufferDisplayLayer::removeOldVideoFramesFromPendingQueue):
(WebCore::LocalSampleBufferDisplayLayer::addVideoFrameToPendingQueue):
(WebCore::LocalSampleBufferDisplayLayer::clearVideoFrames):
(WebCore::LocalSampleBufferDisplayLayer::requestNotificationWhenReadyForVideoData):
* 
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h:
* 
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::enqueueVideoFrame):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::ensureLayers):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setPresentationSize):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::layersAreInitialized):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::characteristicsChanged):
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setVideoInlineSizeFenced):

Canonical link: https://commits.webkit.org/264777@main


_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to