Modified: releases/WebKitGTK/webkit-2.28/Source/WebCore/ChangeLog (257451 => 257452)
--- releases/WebKitGTK/webkit-2.28/Source/WebCore/ChangeLog 2020-02-26 10:57:51 UTC (rev 257451)
+++ releases/WebKitGTK/webkit-2.28/Source/WebCore/ChangeLog 2020-02-26 10:57:56 UTC (rev 257452)
@@ -1,3 +1,21 @@
+2020-02-24 Philippe Normand <[email protected]>
+
+ [GStreamer][WPE] Add GstGLMemoryEGL support for the video-plane-display
+ https://bugs.webkit.org/show_bug.cgi?id=208046
+
+ Reviewed by Žan Doberšek.
+
+ The glupload element might fill EGL memories in some cases, so for
+ the video sink we can then directly access the corresponding
+ EGLImage and export it to DMABuf, instead of using the more
+ general GLMemory code path.
+
+ With this patch we also ensure that both DMABuf FD and stride are valid.
+
+ * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
+ (WebCore::GstVideoFrameHolder::GstVideoFrameHolder):
+ (WebCore::GstVideoFrameHolder::handoffVideoDmaBuf):
+
2020-02-21 Michael Catanzaro <[email protected]>
[WPE][GTK] googleapis.com is a public suffix, defeating isGoogle() check in UserAgentQuirks.cpp
Modified: releases/WebKitGTK/webkit-2.28/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp (257451 => 257452)
--- releases/WebKitGTK/webkit-2.28/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp 2020-02-26 10:57:51 UTC (rev 257451)
+++ releases/WebKitGTK/webkit-2.28/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp 2020-02-26 10:57:56 UTC (rev 257452)
@@ -147,6 +147,7 @@
#if USE(WPE_VIDEO_PLANE_DISPLAY_DMABUF)
#include "PlatformDisplayLibWPE.h"
#include <gst/gl/egl/gsteglimage.h>
+#include <gst/gl/egl/gstglmemoryegl.h>
#include <wpe/extensions/video-plane-display-dmabuf.h>
#endif
@@ -206,14 +207,28 @@
m_flags = flags | (m_hasAlphaChannel ? TextureMapperGL::ShouldBlend : 0);
#if USE(WPE_VIDEO_PLANE_DISPLAY_DMABUF)
+ m_dmabufFD = -1;
+ gsize offset;
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;
+ if (gst_is_gl_memory_egl(memory)) {
+ GstGLMemoryEGL* eglMemory = (GstGLMemoryEGL*) memory;
+ gst_egl_image_export_dmabuf(eglMemory->image, &m_dmabufFD, &m_dmabufStride, &offset);
+ } else if (gst_is_gl_memory(memory)) {
+ GRefPtr<GstEGLImage> eglImage = adoptGRef(gst_egl_image_from_texture(GST_GL_BASE_MEMORY_CAST(memory)->context, GST_GL_MEMORY_CAST(memory), nullptr));
+
+ if (eglImage)
+ gst_egl_image_export_dmabuf(eglImage.get(), &m_dmabufFD, &m_dmabufStride, &offset);
}
+
+ if (hasDMABuf() && m_dmabufStride == -1) {
+ m_isMapped = gst_video_frame_map(&m_videoFrame, &videoInfo, m_buffer.get(), GST_MAP_READ);
+ if (m_isMapped)
+ m_dmabufStride = GST_VIDEO_INFO_PLANE_STRIDE(&m_videoFrame.info, 0);
+ }
+
+ if (hasDMABuf() && m_dmabufStride)
+ return;
+
static std::once_flag s_onceFlag;
std::call_once(s_onceFlag, [] {
GST_WARNING("Texture export to DMABuf failed, falling back to internal rendering");
@@ -256,9 +271,6 @@
if (m_dmabufFD <= 0)
return;
- if (m_dmabufStride == -1)
- m_dmabufStride = GST_VIDEO_INFO_PLANE_STRIDE(&m_videoFrame.info, 0);
-
wpe_video_plane_display_dmabuf_source_update(videoPlaneDisplayDmaBufSource, m_dmabufFD, rect.x(), rect.y(), m_size.width(), m_size.height(), m_dmabufStride, [](void* data) {
gst_buffer_unref(GST_BUFFER_CAST(data));
}, gst_buffer_ref(m_buffer.get()));