GStreamer example: move video sink setup to a submodule

This makes it easier to reuse in a larger application.
This commit is contained in:
Be 2025-07-29 13:32:12 -05:00 committed by Simon Hausmann
parent 78c47bbb27
commit 2d6a9c65d3
4 changed files with 27 additions and 12 deletions

View file

@ -6,10 +6,7 @@ slint::include_modules!();
use futures::stream::StreamExt;
use gst::{prelude::*, MessageView};
#[cfg(slint_gstreamer_egl)]
mod egl_integration;
#[cfg(not(slint_gstreamer_egl))]
mod software_rendering;
mod slint_video_sink;
fn main() -> anyhow::Result<()> {
slint::BackendSelector::new()
@ -28,10 +25,6 @@ fn main() -> anyhow::Result<()> {
.downcast::<gst::Pipeline>()
.unwrap();
let new_frame_callback = |app: App, new_frame| {
app.set_video_frame(new_frame);
};
// Handle messages from the GStreamer pipeline bus.
// For most GStreamer objects with buses, you can use `while let Some(msg) = bus.next().await`
// inside an async closure passed to `slint::spawn_local` to read messages from the bus.
@ -73,10 +66,7 @@ fn main() -> anyhow::Result<()> {
})
.unwrap();
#[cfg(not(slint_gstreamer_egl))]
software_rendering::init(&app, &pipeline, new_frame_callback, bus_sender)?;
#[cfg(slint_gstreamer_egl)]
egl_integration::init(&app, &pipeline, new_frame_callback, bus_sender)?;
slint_video_sink::init(&app, &pipeline, bus_sender)?;
let pipeline_weak_for_callback = pipeline.downgrade();
app.on_toggle_pause_play(move || {

View file

@ -0,0 +1,25 @@
// Copyright © SixtyFPS GmbH <info@slint.dev>
// SPDX-License-Identifier: MIT
use crate::App;
use futures::channel::mpsc::UnboundedSender;
#[cfg(slint_gstreamer_egl)]
mod egl_integration;
#[cfg(not(slint_gstreamer_egl))]
mod software_rendering;
pub fn init(
app: &App,
pipeline: &gst::Pipeline,
bus_sender: UnboundedSender<gst::Message>,
) -> anyhow::Result<()> {
let new_frame_callback = |app: App, new_frame| {
app.set_video_frame(new_frame);
};
#[cfg(not(slint_gstreamer_egl))]
return software_rendering::init(app, pipeline, new_frame_callback, bus_sender);
#[cfg(slint_gstreamer_egl)]
return egl_integration::init(app, pipeline, new_frame_callback, bus_sender);
}