Title: [255913] releases/WebKitGTK/webkit-2.28/Source/WebCore
Revision
255913
Author
[email protected]
Date
2020-02-06 07:08:19 -0800 (Thu, 06 Feb 2020)

Log Message

Merge r255790 - [GStreamer] Client-side video rendering doesn't fallback to internal compositing
https://bugs.webkit.org/show_bug.cgi?id=207208

Patch by Philippe Normand <[email protected]> on 2020-02-05
Reviewed by Xabier Rodriguez-Calvar and Žan Doberšek.

Refactor the default video composition code into a self-contained
closure and invoke it if the video frame holder failed to export
the EGLImage to a valid DMABuf.

* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
(WebCore::GstVideoFrameHolder::GstVideoFrameHolder):
(WebCore::GstVideoFrameHolder::hasDMABuf const):
(WebCore::MediaPlayerPrivateGStreamer::pushTextureToCompositor):

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.28/Source/WebCore/ChangeLog (255912 => 255913)


--- releases/WebKitGTK/webkit-2.28/Source/WebCore/ChangeLog	2020-02-06 11:23:45 UTC (rev 255912)
+++ releases/WebKitGTK/webkit-2.28/Source/WebCore/ChangeLog	2020-02-06 15:08:19 UTC (rev 255913)
@@ -1,3 +1,19 @@
+2020-02-05  Philippe Normand  <[email protected]>
+
+        [GStreamer] Client-side video rendering doesn't fallback to internal compositing
+        https://bugs.webkit.org/show_bug.cgi?id=207208
+
+        Reviewed by Xabier Rodriguez-Calvar and Žan Doberšek.
+
+        Refactor the default video composition code into a self-contained
+        closure and invoke it if the video frame holder failed to export
+        the EGLImage to a valid DMABuf.
+
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
+        (WebCore::GstVideoFrameHolder::GstVideoFrameHolder):
+        (WebCore::GstVideoFrameHolder::hasDMABuf const):
+        (WebCore::MediaPlayerPrivateGStreamer::pushTextureToCompositor):
+
 2020-02-01  Darin Adler  <[email protected]>
 
         Replace RGBA32 typedef with a class to improve type safety

Modified: releases/WebKitGTK/webkit-2.28/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp (255912 => 255913)


--- releases/WebKitGTK/webkit-2.28/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp	2020-02-06 11:23:45 UTC (rev 255912)
+++ releases/WebKitGTK/webkit-2.28/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp	2020-02-06 15:08:19 UTC (rev 255913)
@@ -205,6 +205,21 @@
 #if USE(GSTREAMER_GL)
         m_flags = flags | (m_hasAlphaChannel ? TextureMapperGL::ShouldBlend : 0);
 
+#if USE(WPE_VIDEO_PLANE_DISPLAY_DMABUF)
+        GstMemory* memory = gst_buffer_peek_memory(m_buffer.get(), 0);
+        if (gst_is_gl_memory(memory)) {
+            GstGLMemory* glMemory = GST_GL_MEMORY_CAST(memory);
+            GRefPtr<GstEGLImage> eglImage = adoptGRef(gst_egl_image_from_texture(GST_GL_BASE_MEMORY_CAST(memory)->context, glMemory, nullptr));
+            gsize offset;
+            if (eglImage && gst_egl_image_export_dmabuf(eglImage.get(), &m_dmabufFD, &m_dmabufStride, &offset))
+                return;
+        }
+        static std::once_flag s_onceFlag;
+        std::call_once(s_onceFlag, [] {
+            GST_WARNING("Texture export to DMABuf failed, falling back to internal rendering");
+        });
+#endif // USE(WPE_VIDEO_PLANE_DISPLAY_DMABUF)
+
         if (gstGLEnabled) {
             m_isMapped = gst_video_frame_map(&m_videoFrame, &videoInfo, m_buffer.get(), static_cast<GstMapFlags>(GST_MAP_READ | GST_MAP_GL));
             if (m_isMapped) {
@@ -218,20 +233,6 @@
 #endif // USE(GSTREAMER_GL)
 
         {
-#if USE(WPE_VIDEO_PLANE_DISPLAY_DMABUF)
-            GstMemory* memory = gst_buffer_peek_memory(m_buffer.get(), 0);
-            if (gst_is_gl_memory(memory)) {
-                GstGLMemory* glMemory = GST_GL_MEMORY_CAST(memory);
-                GRefPtr<GstEGLImage> eglImage = adoptGRef(gst_egl_image_from_texture(GST_GL_BASE_MEMORY_CAST(memory)->context, glMemory, nullptr));
-                gsize offset;
-                if (eglImage && gst_egl_image_export_dmabuf(eglImage.get(), &m_dmabufFD, &m_dmabufStride, &offset))
-                    return;
-            }
-            static std::once_flag onceFlag;
-            std::call_once(onceFlag, [] {
-                GST_WARNING("Texture export to DMABuf failed, falling back to internal rendering");
-            });
-#endif
             m_textureID = 0;
             m_isMapped = gst_video_frame_map(&m_videoFrame, &videoInfo, m_buffer.get(), GST_MAP_READ);
             if (m_isMapped) {
@@ -365,6 +366,15 @@
         return nullptr;
     }
 
+    bool hasDMABuf() const
+    {
+#if USE(WPE_VIDEO_PLANE_DISPLAY_DMABUF)
+        return m_dmabufFD >= 0;
+#else
+        return false;
+#endif
+    }
+
 private:
     GRefPtr<GstBuffer> m_buffer;
     GstVideoFrame m_videoFrame { };
@@ -3159,10 +3169,29 @@
     if (!GST_IS_SAMPLE(m_sample.get()))
         return;
 
+    auto internalCompositingOperation = [this](TextureMapperPlatformLayerProxy& proxy, std::unique_ptr<GstVideoFrameHolder>&& frameHolder) {
+        std::unique_ptr<TextureMapperPlatformLayerBuffer> layerBuffer;
+        if (frameHolder->hasMappedTextures()) {
+            layerBuffer = frameHolder->platformLayerBuffer();
+            if (!layerBuffer)
+                return;
+            layerBuffer->setUnmanagedBufferDataHolder(WTFMove(frameHolder));
+        } else {
+            layerBuffer = proxy.getAvailableBuffer(frameHolder->size(), GL_DONT_CARE);
+            if (UNLIKELY(!layerBuffer)) {
+                auto texture = BitmapTextureGL::create(TextureMapperContextAttributes::get());
+                texture->reset(frameHolder->size(), frameHolder->hasAlphaChannel() ? BitmapTexture::SupportsAlpha : BitmapTexture::NoFlag);
+                layerBuffer = makeUnique<TextureMapperPlatformLayerBuffer>(WTFMove(texture));
+            }
+            frameHolder->updateTexture(layerBuffer->textureGL());
+            layerBuffer->setExtraFlags(m_textureMapperFlags | (frameHolder->hasAlphaChannel() ? TextureMapperGL::ShouldBlend : 0));
+        }
+        proxy.pushNextBuffer(WTFMove(layerBuffer));
+    };
+
 #if USE(WPE_VIDEO_PLANE_DISPLAY_DMABUF)
-
     auto proxyOperation =
-        [this](TextureMapperPlatformLayerProxy& proxy)
+        [this, internalCompositingOperation](TextureMapperPlatformLayerProxy& proxy)
         {
             LockHolder holder(proxy.lock());
 
@@ -3169,16 +3198,18 @@
             if (!proxy.isActive())
                 return;
 
-            std::unique_ptr<GstVideoFrameHolder> frameHolder = makeUnique<GstVideoFrameHolder>(m_sample.get(), m_videoDecoderPlatform, m_textureMapperFlags, false);
-
-            std::unique_ptr<TextureMapperPlatformLayerBuffer> layerBuffer = makeUnique<TextureMapperPlatformLayerBuffer>(0, m_size, TextureMapperGL::ShouldNotBlend, GL_DONT_CARE);
-            auto holePunchClient = makeUnique<GStreamerDMABufHolePunchClient>(WTFMove(frameHolder), m_wpeVideoPlaneDisplayDmaBuf.get());
-            layerBuffer->setHolePunchClient(WTFMove(holePunchClient));
-            proxy.pushNextBuffer(WTFMove(layerBuffer));
+            auto frameHolder = makeUnique<GstVideoFrameHolder>(m_sample.get(), m_videoDecoderPlatform, m_textureMapperFlags, !m_isUsingFallbackVideoSink);
+            if (frameHolder->hasDMABuf()) {
+                auto layerBuffer = makeUnique<TextureMapperPlatformLayerBuffer>(0, m_size, TextureMapperGL::ShouldNotBlend, GL_DONT_CARE);
+                auto holePunchClient = makeUnique<GStreamerDMABufHolePunchClient>(WTFMove(frameHolder), m_wpeVideoPlaneDisplayDmaBuf.get());
+                layerBuffer->setHolePunchClient(WTFMove(holePunchClient));
+                proxy.pushNextBuffer(WTFMove(layerBuffer));
+            } else
+                internalCompositingOperation(proxy, WTFMove(frameHolder));
         };
 #else
     auto proxyOperation =
-        [this](TextureMapperPlatformLayerProxy& proxy)
+        [this, internalCompositingOperation](TextureMapperPlatformLayerProxy& proxy)
         {
             LockHolder holder(proxy.lock());
 
@@ -3185,25 +3216,8 @@
             if (!proxy.isActive())
                 return;
 
-            std::unique_ptr<GstVideoFrameHolder> frameHolder = makeUnique<GstVideoFrameHolder>(m_sample.get(), m_videoDecoderPlatform, m_textureMapperFlags, !m_isUsingFallbackVideoSink);
-
-            std::unique_ptr<TextureMapperPlatformLayerBuffer> layerBuffer;
-            if (frameHolder->hasMappedTextures()) {
-                layerBuffer = frameHolder->platformLayerBuffer();
-                if (!layerBuffer)
-                    return;
-                layerBuffer->setUnmanagedBufferDataHolder(WTFMove(frameHolder));
-            } else {
-                layerBuffer = proxy.getAvailableBuffer(frameHolder->size(), GL_DONT_CARE);
-                if (UNLIKELY(!layerBuffer)) {
-                    auto texture = BitmapTextureGL::create(TextureMapperContextAttributes::get());
-                    texture->reset(frameHolder->size(), frameHolder->hasAlphaChannel() ? BitmapTexture::SupportsAlpha : BitmapTexture::NoFlag);
-                    layerBuffer = makeUnique<TextureMapperPlatformLayerBuffer>(WTFMove(texture));
-                }
-                frameHolder->updateTexture(layerBuffer->textureGL());
-                layerBuffer->setExtraFlags(m_textureMapperFlags | (frameHolder->hasAlphaChannel() ? TextureMapperGL::ShouldBlend : 0));
-            }
-            proxy.pushNextBuffer(WTFMove(layerBuffer));
+            auto frameHolder = makeUnique<GstVideoFrameHolder>(m_sample.get(), m_videoDecoderPlatform, m_textureMapperFlags, !m_isUsingFallbackVideoSink);
+            internalCompositingOperation(proxy, WTFMove(frameHolder));
         };
 #endif // USE(WPE_VIDEO_PLANE_DISPLAY_DMABUF)
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to