| 1 | // Copyright © SixtyFPS GmbH <info@slint.dev> |
| 2 | // SPDX-License-Identifier: MIT |
| 3 | |
| 4 | slint::include_modules!(); |
| 5 | |
| 6 | use gst::prelude::*; |
| 7 | |
| 8 | #[cfg (slint_gstreamer_egl)] |
| 9 | mod egl_integration; |
| 10 | #[cfg (not(slint_gstreamer_egl))] |
| 11 | mod software_rendering; |
| 12 | |
| 13 | fn 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 | |