1// Copyright © SixtyFPS GmbH <info@slint.dev>
2// SPDX-License-Identifier: MIT
3
4slint::include_modules!();
5
6use gst::prelude::*;
7
8#[cfg(slint_gstreamer_egl)]
9mod egl_integration;
10#[cfg(not(slint_gstreamer_egl))]
11mod software_rendering;
12
13fn main() -> anyhow::Result<()> {
14 slint::BackendSelector::new()
15 .backend_name("winit".into())
16 .require_opengl_es()
17 .select()
18 .expect("Unable to create Slint backend with OpenGL ES renderer");
19
20 let app = App::new().unwrap();
21
22 gst::init().unwrap();
23
24 let pipeline = gst::ElementFactory::make("playbin")
25 .property("uri", "https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm")
26 .build()?
27 .downcast::<gst::Pipeline>()
28 .unwrap();
29
30 let new_frame_callback = |app: App, new_frame| {
31 app.set_video_frame(new_frame);
32 };
33
34 #[cfg(not(slint_gstreamer_egl))]
35 software_rendering::init(&app, &pipeline, new_frame_callback)?;
36 #[cfg(slint_gstreamer_egl)]
37 egl_integration::init(&app, &pipeline, new_frame_callback)?;
38
39 let pipeline_weak_for_callback = pipeline.downgrade();
40 let app_weak = app.as_weak();
41 app.on_toggle_pause_play(move || {
42 if let Some(pipeline) = pipeline_weak_for_callback.upgrade() {
43 let current_state = pipeline.state(gst::ClockTime::NONE).1;
44 let result;
45 let new_state = match current_state {
46 gst::State::Playing => {
47 result = false;
48 gst::State::Paused
49 }
50 _ => {
51 result = true;
52 gst::State::Playing
53 }
54 };
55
56 // Attempt to set the state of the pipeline
57 let state_result = pipeline.set_state(new_state);
58 match state_result {
59 Ok(_) => {
60 app_weak.unwrap().set_playing(result);
61 }
62 Err(err) => {
63 eprintln!("Failed to set pipeline state to {:?}: {}", new_state, err);
64 }
65 }
66 }
67 });
68
69 app.run().unwrap();
70
71 let _ = pipeline.set_state(gst::State::Null);
72
73 Ok(())
74}
75