From 3b24aa6b3c1571d392bb7455ca53a572278bb33e Mon Sep 17 00:00:00 2001 From: Vladimir Romashchenko Date: Mon, 5 Aug 2024 18:44:14 -0400 Subject: [PATCH] VideoPlayer error handler --- src/video_player.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/video_player.rs b/src/video_player.rs index 61e30c1..8a9d120 100644 --- a/src/video_player.rs +++ b/src/video_player.rs @@ -16,6 +16,7 @@ where video: &'a Video, on_end_of_stream: Option, on_new_frame: Option, + on_error: Option Message + 'a>>, _phantom: PhantomData<(Theme, Renderer)>, } @@ -29,6 +30,7 @@ where video, on_end_of_stream: None, on_new_frame: None, + on_error: None, _phantom: Default::default(), } } @@ -48,6 +50,16 @@ where ..self } } + + pub fn on_error(self, on_error: F) -> Self + where + F: 'a + Fn(&glib::Error) -> Message, + { + VideoPlayer { + on_error: Some(Box::new(on_error)), + ..self + } + } } impl<'a, Message, Theme, Renderer> Widget @@ -134,7 +146,13 @@ where for msg in inner.bus.iter() { match msg.view() { - gst::MessageView::Error(err) => panic!("{:#?}", err), + gst::MessageView::Error(err) => { + if let Some(ref on_error) = self.on_error { + shell.publish(on_error(&err.error())) + } else { + panic!("{:#?}", err) + }; + } gst::MessageView::Eos(_eos) => { if let Some(on_end_of_stream) = self.on_end_of_stream.clone() { shell.publish(on_end_of_stream);