Title: [294235] trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm
Revision
294235
Author
[email protected]
Date
2022-05-16 09:12:23 -0700 (Mon, 16 May 2022)

Log Message

Canvas generated transparent pixels are not well handled by LocalSampleBufferDisplayLayer
https://bugs.webkit.org/show_bug.cgi?id=230621
rdar://problem/83668394

Patch by Youenn Fablet <[email protected]> on 2022-05-16
Reviewed by Eric Carlson.

Remove black color for root and display layer.
When display layer is hidden but root layer is visible, set root layer background color to black to keep existing behavior.
This allows to render transparent video frames without a black background.

Covered by https://jsfiddle.net/nfu7oL60/ (make sure to switch between tabs after clicking start).
Also covered by https://webrtc.github.io/samples/src/content/peerconnection/pc1/ and muting/unmuting the camera.

* Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm:
(WebCore::LocalSampleBufferDisplayLayer::initialize):
(WebCore::LocalSampleBufferDisplayLayer::updateDisplayMode):

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

Modified Paths

Diff

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm (294234 => 294235)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm	2022-05-16 15:52:10 UTC (rev 294234)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm	2022-05-16 16:12:23 UTC (rev 294235)
@@ -164,7 +164,6 @@
 
 void LocalSampleBufferDisplayLayer::initialize(bool hideRootLayer, IntSize size, CompletionHandler<void(bool didSucceed)>&& callback)
 {
-    m_sampleBufferDisplayLayer.get().backgroundColor = cachedCGColor(Color::black).get();
     m_sampleBufferDisplayLayer.get().anchorPoint = { .5, .5 };
     m_sampleBufferDisplayLayer.get().needsDisplayOnBoundsChange = YES;
     m_sampleBufferDisplayLayer.get().videoGravity = AVLayerVideoGravityResizeAspectFill;
@@ -172,7 +171,6 @@
     m_rootLayer = adoptNS([[CALayer alloc] init]);
     m_rootLayer.get().hidden = hideRootLayer;
 
-    m_rootLayer.get().backgroundColor = cachedCGColor(Color::black).get();
     m_rootLayer.get().needsDisplayOnBoundsChange = YES;
 
     m_rootLayer.get().bounds = CGRectMake(0, 0, size.width(), size.height());
@@ -241,6 +239,10 @@
         return;
 
     runWithoutAnimations([&] {
+        if (hideDisplayLayer && !hideRootLayer)
+            m_rootLayer.get().backgroundColor = cachedCGColor(Color::black).get();
+        else
+            m_rootLayer.get().backgroundColor = nil;
         m_sampleBufferDisplayLayer.get().hidden = hideDisplayLayer;
         m_rootLayer.get().hidden = hideRootLayer;
     });
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to