gtk4paintablesink: Don't initialize a GL context unless a GL platform is enabled

And also don't suggest in the template caps that GL might be supported.

For clarification, the wayland feature is also renamed to waylandegl and
using wayland gives a deprecation warning.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1837>
This commit is contained in:
Sebastian Dröge 2024-10-02 17:02:29 +03:00 committed by GStreamer Marge Bot
parent d1254fc4ef
commit 36304a7d36
4 changed files with 66 additions and 6 deletions

View file

@ -45,11 +45,13 @@ gst-plugin-version-helper.workspace = true
[features] [features]
default = [] default = []
static = [] static = []
wayland = ["gdk-wayland", "gst-gl-wayland"] # Deprecated
wayland = ["waylandegl"]
waylandegl = ["gdk-wayland", "gst-gl-wayland"]
x11glx = ["gdk-x11", "gst-gl-x11"] x11glx = ["gdk-x11", "gst-gl-x11"]
x11egl = ["gdk-x11", "gst-gl-egl"] x11egl = ["gdk-x11", "gst-gl-egl"]
winegl = ["gdk-win32/egl", "gst-gl-egl"] winegl = ["gdk-win32/egl", "gst-gl-egl"]
dmabuf = ["gst-allocators", "wayland", "gtk_v4_14", "gst-video/v1_24"] dmabuf = ["gst-allocators", "gtk_v4_14", "gst-video/v1_24"]
capi = [] capi = []
doc = ["gst/v1_18"] doc = ["gst/v1_18"]
gtk_v4_10 = ["gtk/v4_10"] gtk_v4_10 = ["gtk/v4_10"]

View file

@ -4,7 +4,7 @@ GTK 4 provides `gtk::Video` & `gtk::Picture` for rendering media such as videos.
offer the possibility to use a custom `gst::Pipeline`. The plugin provides a `gst_video::VideoSink` along with a `gdk::Paintable` that's capable of rendering the sink's frames. offer the possibility to use a custom `gst::Pipeline`. The plugin provides a `gst_video::VideoSink` along with a `gdk::Paintable` that's capable of rendering the sink's frames.
The sink can generate GL Textures if the system is capable of it, but it needs The sink can generate GL Textures if the system is capable of it, but it needs
to be compiled with either `wayland`, `x11glx` or `x11egl` cargo features. On to be compiled with either `waylandegl`, `x11glx` or `x11egl` cargo features. On
Windows and macOS this is enabled by default. Windows and macOS this is enabled by default.
Additionally, the sink can render DMABufs directly on Linux if GTK 4.14 or Additionally, the sink can render DMABufs directly on Linux if GTK 4.14 or
@ -52,7 +52,7 @@ To build and include the plugin in a Flatpak manifest, you can add the following
} }
}, },
"build-commands": [ "build-commands": [
"cargo cinstall --offline --release --features=wayland,x11glx,x11egl,dmabuf --library-type=cdylib --prefix=/app" "cargo cinstall --offline --release --features=waylandegl,x11glx,x11egl,dmabuf --library-type=cdylib --prefix=/app"
] ]
} }
] ]

View file

@ -1,3 +1,7 @@
fn main() { fn main() {
#[cfg(feature = "wayland")]
{
println!("cargo:warning=\"wayland\" feature is deprecated, use \"waylandegl\" instead");
}
gst_plugin_version_helper::info() gst_plugin_version_helper::info()
} }

View file

@ -36,6 +36,7 @@ use crate::utils;
enum GLContext { enum GLContext {
Uninitialized, Uninitialized,
Unsupported, Unsupported,
#[allow(unused)]
Initialized { Initialized {
display: gst_gl::GLDisplay, display: gst_gl::GLDisplay,
wrapped_context: gst_gl::GLContext, wrapped_context: gst_gl::GLContext,
@ -261,10 +262,24 @@ impl ElementImpl for PaintableSink {
} }
for features in [ for features in [
#[cfg(any(
feature = "x11egl",
feature = "x11glx",
feature = "waylandegl",
target_os = "macos",
target_os = "windows"
))]
Some(gst::CapsFeatures::new([ Some(gst::CapsFeatures::new([
gst_gl::CAPS_FEATURE_MEMORY_GL_MEMORY, gst_gl::CAPS_FEATURE_MEMORY_GL_MEMORY,
gst_video::CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION, gst_video::CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION,
])), ])),
#[cfg(any(
feature = "x11egl",
feature = "x11glx",
feature = "waylandegl",
target_os = "macos",
target_os = "windows"
))]
Some(gst::CapsFeatures::new([ Some(gst::CapsFeatures::new([
gst_gl::CAPS_FEATURE_MEMORY_GL_MEMORY, gst_gl::CAPS_FEATURE_MEMORY_GL_MEMORY,
])), ])),
@ -818,9 +833,27 @@ impl PaintableSink {
} }
fn create_paintable(&self, paintable_storage: &mut Option<ThreadGuard<Paintable>>) { fn create_paintable(&self, paintable_storage: &mut Option<ThreadGuard<Paintable>>) {
#[cfg(any(
feature = "x11egl",
feature = "x11glx",
feature = "waylandegl",
target_os = "macos",
target_os = "windows"
))]
{ {
self.initialize_gl_context(); self.initialize_gl_context();
} }
#[cfg(not(any(
feature = "x11egl",
feature = "x11glx",
feature = "waylandegl",
target_os = "macos",
target_os = "windows"
)))]
{
gst::debug!(CAT, imp = self, "No GL platform enabled");
*GL_CONTEXT.lock().unwrap() = GLContext::Unsupported;
}
self.configure_caps(); self.configure_caps();
self.initialize_paintable(paintable_storage); self.initialize_paintable(paintable_storage);
@ -862,6 +895,13 @@ impl PaintableSink {
*self.sender.lock().unwrap() = Some(sender); *self.sender.lock().unwrap() = Some(sender);
} }
#[cfg(any(
feature = "x11egl",
feature = "x11glx",
feature = "waylandegl",
target_os = "macos",
target_os = "windows"
))]
fn initialize_gl_context(&self) { fn initialize_gl_context(&self) {
gst::debug!(CAT, imp = self, "Realizing GDK GL Context"); gst::debug!(CAT, imp = self, "Realizing GDK GL Context");
@ -871,6 +911,13 @@ impl PaintableSink {
}); });
} }
#[cfg(any(
feature = "x11egl",
feature = "x11glx",
feature = "waylandegl",
target_os = "macos",
target_os = "windows"
))]
fn initialize_gl_context_main(&self) { fn initialize_gl_context_main(&self) {
gst::debug!(CAT, imp = self, "Realizing GDK GL Context from main thread"); gst::debug!(CAT, imp = self, "Realizing GDK GL Context from main thread");
@ -965,6 +1012,13 @@ impl PaintableSink {
}; };
} }
#[cfg(any(
feature = "x11egl",
feature = "x11glx",
feature = "waylandegl",
target_os = "macos",
target_os = "windows"
))]
fn initialize_gst_gl( fn initialize_gst_gl(
&self, &self,
gdk_display: &gdk::Display, gdk_display: &gdk::Display,
@ -975,7 +1029,7 @@ impl PaintableSink {
"GdkX11GLContextEGL" => self.initialize_x11egl(gdk_display), "GdkX11GLContextEGL" => self.initialize_x11egl(gdk_display),
#[cfg(feature = "x11glx")] #[cfg(feature = "x11glx")]
"GdkX11GLContextGLX" => self.initialize_x11glx(gdk_display), "GdkX11GLContextGLX" => self.initialize_x11glx(gdk_display),
#[cfg(feature = "wayland")] #[cfg(feature = "waylandegl")]
"GdkWaylandGLContext" => self.initialize_waylandegl(gdk_display), "GdkWaylandGLContext" => self.initialize_waylandegl(gdk_display),
#[cfg(target_os = "macos")] #[cfg(target_os = "macos")]
"GdkMacosGLContext" => self.initialize_macosgl(gdk_display), "GdkMacosGLContext" => self.initialize_macosgl(gdk_display),
@ -1094,7 +1148,7 @@ impl PaintableSink {
} }
} }
#[cfg(feature = "wayland")] #[cfg(feature = "waylandegl")]
fn initialize_waylandegl( fn initialize_waylandegl(
&self, &self,
display: &gdk::Display, display: &gdk::Display,