From 5faa03da49ee22f1c87af5fcb3a8677249250e75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Wed, 9 Jan 2019 15:24:26 +0100 Subject: [PATCH] Use a Once per Player init --- backends/gstreamer/src/player.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/backends/gstreamer/src/player.rs b/backends/gstreamer/src/player.rs index 9dcd9f85..9d12eef7 100644 --- a/backends/gstreamer/src/player.rs +++ b/backends/gstreamer/src/player.rs @@ -16,7 +16,6 @@ use std::sync::{Arc, Mutex, Once}; use std::time; use std::u64; -static PLAYER_INIT: Once = Once::new(); const MAX_SRC_QUEUE_SIZE: u64 = 50 * 1024 * 1024; // 50 MB. fn frame_from_sample(sample: &gst::Sample) -> Result { @@ -268,6 +267,9 @@ pub struct GStreamerPlayer { inner: RefCell>>>, observers: Arc>, renderers: Arc>, + /// Indicates whether the setup was succesfully performed and + /// we are ready to consume a/v data. + is_ready: Arc, } impl GStreamerPlayer { @@ -276,6 +278,7 @@ impl GStreamerPlayer { inner: RefCell::new(None), observers: Arc::new(Mutex::new(PlayerEventObserverList::new())), renderers: Arc::new(Mutex::new(FrameRendererList::new())), + is_ready: Arc::new(Once::new()), } } @@ -498,6 +501,7 @@ impl GStreamerPlayer { let sender = Arc::new(Mutex::new(sender)); let sender_clone = sender.clone(); + let is_ready_clone = self.is_ready.clone(); let observers = self.observers.clone(); let connect_result = pipeline.connect("source-setup", false, move |args| { let source = args[1].get::(); @@ -528,6 +532,7 @@ impl GStreamerPlayer { } let sender_clone = sender.clone(); + let is_ready_ = is_ready_clone.clone(); let observers_ = observers.clone(); let observers__ = observers.clone(); let observers___ = observers.clone(); @@ -539,7 +544,7 @@ impl GStreamerPlayer { // don't miss any data between the moment the client // calls setup and the player is actually ready to // get any data. - PLAYER_INIT.call_once(|| { + is_ready_.call_once(|| { let _ = sender_clone.lock().unwrap().send(Ok(())); }); observers_.lock().unwrap().notify(PlayerEvent::NeedData);