Remove receiver/latency from Settings to State struct

And clean up usage of both.
This commit is contained in:
Sebastian Dröge 2019-07-15 18:10:34 +03:00
parent 9afe1d74b8
commit 32289047a5
2 changed files with 52 additions and 49 deletions

View file

@ -26,9 +26,6 @@ struct Settings {
stream_name: String, stream_name: String,
ip: String, ip: String,
loss_threshold: u32, loss_threshold: u32,
// FIXME: Should be in State
id_receiver: Option<usize>,
latency: Option<gst::ClockTime>,
} }
impl Default for Settings { impl Default for Settings {
@ -37,8 +34,6 @@ impl Default for Settings {
stream_name: String::from("Fixed ndi stream name"), stream_name: String::from("Fixed ndi stream name"),
ip: String::from(""), ip: String::from(""),
loss_threshold: 5, loss_threshold: 5,
id_receiver: None,
latency: None,
} }
} }
} }
@ -77,11 +72,17 @@ static PROPERTIES: [subclass::Property; 3] = [
struct State { struct State {
info: Option<gst_audio::AudioInfo>, info: Option<gst_audio::AudioInfo>,
id_receiver: Option<usize>,
latency: Option<gst::ClockTime>,
} }
impl Default for State { impl Default for State {
fn default() -> State { fn default() -> State {
State { info: None } State {
info: None,
id_receiver: None,
latency: None,
}
} }
} }
@ -247,9 +248,9 @@ impl ElementImpl for NdiAudioSrc {
) -> Result<gst::StateChangeSuccess, gst::StateChangeError> { ) -> Result<gst::StateChangeSuccess, gst::StateChangeError> {
if transition == gst::StateChange::PausedToPlaying { if transition == gst::StateChange::PausedToPlaying {
let mut receivers = HASHMAP_RECEIVERS.lock().unwrap(); let mut receivers = HASHMAP_RECEIVERS.lock().unwrap();
let settings = self.settings.lock().unwrap(); let state = self.state.lock().unwrap();
let receiver = receivers.get_mut(&settings.id_receiver.unwrap()).unwrap(); let receiver = receivers.get_mut(&state.id_receiver.unwrap()).unwrap();
let recv = &receiver.ndi_instance; let recv = &receiver.ndi_instance;
// FIXME error handling, make interruptable // FIXME error handling, make interruptable
@ -316,15 +317,16 @@ impl BaseSrcImpl for NdiAudioSrc {
fn start(&self, element: &gst_base::BaseSrc) -> Result<(), gst::ErrorMessage> { fn start(&self, element: &gst_base::BaseSrc) -> Result<(), gst::ErrorMessage> {
*self.state.lock().unwrap() = Default::default(); *self.state.lock().unwrap() = Default::default();
let mut settings = self.settings.lock().unwrap(); let settings = self.settings.lock().unwrap().clone();
settings.id_receiver = connect_ndi( let mut state = self.state.lock().unwrap();
state.id_receiver = connect_ndi(
self.cat, self.cat,
element, element,
&settings.ip.clone(), &settings.ip.clone(),
&settings.stream_name.clone(), &settings.stream_name.clone(),
); );
match settings.id_receiver { match state.id_receiver {
None => Err(gst_error_msg!( None => Err(gst_error_msg!(
gst::ResourceError::NotFound, gst::ResourceError::NotFound,
["Could not connect to this source"] ["Could not connect to this source"]
@ -336,10 +338,11 @@ impl BaseSrcImpl for NdiAudioSrc {
fn stop(&self, element: &gst_base::BaseSrc) -> Result<(), gst::ErrorMessage> { fn stop(&self, element: &gst_base::BaseSrc) -> Result<(), gst::ErrorMessage> {
*self.state.lock().unwrap() = Default::default(); *self.state.lock().unwrap() = Default::default();
let settings = self.settings.lock().unwrap(); let mut state = self.state.lock().unwrap();
stop_ndi(self.cat, element, settings.id_receiver.unwrap()); if let Some(id_receiver) = state.id_receiver.take() {
// Commented because when adding ndi destroy stopped in this line stop_ndi(self.cat, element, id_receiver);
//*self.state.lock().unwrap() = Default::default(); }
*state = State::default();
Ok(()) Ok(())
} }
@ -351,11 +354,10 @@ impl BaseSrcImpl for NdiAudioSrc {
return true; return true;
} }
if let QueryView::Latency(ref mut q) = query.view_mut() { if let QueryView::Latency(ref mut q) = query.view_mut() {
let settings = &*self.settings.lock().unwrap();
let state = self.state.lock().unwrap(); let state = self.state.lock().unwrap();
if let Some(ref _info) = state.info { if let Some(ref _info) = state.info {
let latency = settings.latency.unwrap(); let latency = state.latency.unwrap();
gst_debug!(self.cat, obj: element, "Returning latency {}", latency); gst_debug!(self.cat, obj: element, "Returning latency {}", latency);
q.set(true, latency, gst::CLOCK_TIME_NONE); q.set(true, latency, gst::CLOCK_TIME_NONE);
return true; return true;
@ -368,9 +370,9 @@ impl BaseSrcImpl for NdiAudioSrc {
fn fixate(&self, element: &gst_base::BaseSrc, caps: gst::Caps) -> gst::Caps { fn fixate(&self, element: &gst_base::BaseSrc, caps: gst::Caps) -> gst::Caps {
let receivers = HASHMAP_RECEIVERS.lock().unwrap(); let receivers = HASHMAP_RECEIVERS.lock().unwrap();
let mut settings = self.settings.lock().unwrap(); let mut state = self.state.lock().unwrap();
let receiver = receivers.get(&settings.id_receiver.unwrap()).unwrap(); let receiver = receivers.get(&state.id_receiver.unwrap()).unwrap();
let recv = &receiver.ndi_instance; let recv = &receiver.ndi_instance;
@ -389,7 +391,7 @@ impl BaseSrcImpl for NdiAudioSrc {
// FIXME: Why? // FIXME: Why?
let no_samples = audio_frame.no_samples() as u64; let no_samples = audio_frame.no_samples() as u64;
let audio_rate = audio_frame.sample_rate(); let audio_rate = audio_frame.sample_rate();
settings.latency = gst::SECOND.mul_div_floor(no_samples, audio_rate as u64); state.latency = gst::SECOND.mul_div_floor(no_samples, audio_rate as u64);
let mut caps = gst::Caps::truncate(caps); let mut caps = gst::Caps::truncate(caps);
{ {
@ -418,7 +420,7 @@ impl BaseSrcImpl for NdiAudioSrc {
_offset: u64, _offset: u64,
_length: u32, _length: u32,
) -> Result<gst::Buffer, gst::FlowError> { ) -> Result<gst::Buffer, gst::FlowError> {
let _settings = &*self.settings.lock().unwrap(); let settings = self.settings.lock().unwrap().clone();
let mut timestamp_data = self.timestamp_data.lock().unwrap(); let mut timestamp_data = self.timestamp_data.lock().unwrap();
@ -432,7 +434,7 @@ impl BaseSrcImpl for NdiAudioSrc {
}; };
let receivers = HASHMAP_RECEIVERS.lock().unwrap(); let receivers = HASHMAP_RECEIVERS.lock().unwrap();
let receiver = &receivers.get(&_settings.id_receiver.unwrap()).unwrap(); let receiver = &receivers.get(&state.id_receiver.unwrap()).unwrap();
let recv = &receiver.ndi_instance; let recv = &receiver.ndi_instance;
let time = receiver.initial_timestamp; let time = receiver.initial_timestamp;
@ -456,8 +458,8 @@ impl BaseSrcImpl for NdiAudioSrc {
gst_element_error!(element, gst::ResourceError::Read, ["NDI frame type error received, assuming that the source closed the stream...."]); gst_element_error!(element, gst::ResourceError::Read, ["NDI frame type error received, assuming that the source closed the stream...."]);
return Err(gst::FlowError::Error); return Err(gst::FlowError::Error);
}, },
Ok(None) if _settings.loss_threshold != 0 => { Ok(None) if settings.loss_threshold != 0 => {
if count_frame_none < _settings.loss_threshold { if count_frame_none < settings.loss_threshold {
count_frame_none += 1; count_frame_none += 1;
continue; continue;
} }

View file

@ -27,9 +27,6 @@ struct Settings {
stream_name: String, stream_name: String,
ip: String, ip: String,
loss_threshold: u32, loss_threshold: u32,
// FIXME: should be in state
id_receiver: Option<usize>,
latency: Option<gst::ClockTime>,
} }
impl Default for Settings { impl Default for Settings {
@ -38,8 +35,6 @@ impl Default for Settings {
stream_name: String::from("Fixed ndi stream name"), stream_name: String::from("Fixed ndi stream name"),
ip: String::from(""), ip: String::from(""),
loss_threshold: 5, loss_threshold: 5,
id_receiver: None,
latency: None,
} }
} }
} }
@ -78,11 +73,17 @@ static PROPERTIES: [subclass::Property; 3] = [
struct State { struct State {
info: Option<gst_video::VideoInfo>, info: Option<gst_video::VideoInfo>,
id_receiver: Option<usize>,
latency: Option<gst::ClockTime>,
} }
impl Default for State { impl Default for State {
fn default() -> State { fn default() -> State {
State { info: None } State {
info: None,
id_receiver: None,
latency: None,
}
} }
} }
@ -255,9 +256,9 @@ impl ElementImpl for NdiVideoSrc {
) -> Result<gst::StateChangeSuccess, gst::StateChangeError> { ) -> Result<gst::StateChangeSuccess, gst::StateChangeError> {
if transition == gst::StateChange::PausedToPlaying { if transition == gst::StateChange::PausedToPlaying {
let mut receivers = HASHMAP_RECEIVERS.lock().unwrap(); let mut receivers = HASHMAP_RECEIVERS.lock().unwrap();
let settings = self.settings.lock().unwrap(); let state = self.state.lock().unwrap();
let receiver = receivers.get_mut(&settings.id_receiver.unwrap()).unwrap(); let receiver = receivers.get_mut(&state.id_receiver.unwrap()).unwrap();
let recv = &receiver.ndi_instance; let recv = &receiver.ndi_instance;
// FIXME error handling, make interruptable // FIXME error handling, make interruptable
@ -322,8 +323,9 @@ impl BaseSrcImpl for NdiVideoSrc {
fn start(&self, element: &gst_base::BaseSrc) -> Result<(), gst::ErrorMessage> { fn start(&self, element: &gst_base::BaseSrc) -> Result<(), gst::ErrorMessage> {
*self.state.lock().unwrap() = Default::default(); *self.state.lock().unwrap() = Default::default();
let mut settings = self.settings.lock().unwrap(); let mut state = self.state.lock().unwrap();
settings.id_receiver = connect_ndi( let settings = self.settings.lock().unwrap().clone();
state.id_receiver = connect_ndi(
self.cat, self.cat,
element, element,
&settings.ip, &settings.ip,
@ -331,7 +333,7 @@ impl BaseSrcImpl for NdiVideoSrc {
); );
// settings.id_receiver exists // settings.id_receiver exists
match settings.id_receiver { match state.id_receiver {
None => Err(gst_error_msg!( None => Err(gst_error_msg!(
gst::ResourceError::NotFound, gst::ResourceError::NotFound,
["Could not connect to this source"] ["Could not connect to this source"]
@ -343,10 +345,11 @@ impl BaseSrcImpl for NdiVideoSrc {
fn stop(&self, element: &gst_base::BaseSrc) -> Result<(), gst::ErrorMessage> { fn stop(&self, element: &gst_base::BaseSrc) -> Result<(), gst::ErrorMessage> {
*self.state.lock().unwrap() = Default::default(); *self.state.lock().unwrap() = Default::default();
let settings = self.settings.lock().unwrap(); let mut state = self.state.lock().unwrap();
stop_ndi(self.cat, element, settings.id_receiver.unwrap()); if let Some(id_receiver) = state.id_receiver.take() {
// Commented because when adding ndi destroy stopped in this line stop_ndi(self.cat, element, id_receiver);
//*self.state.lock().unwrap() = Default::default(); }
*state = State::default();
Ok(()) Ok(())
} }
@ -358,11 +361,10 @@ impl BaseSrcImpl for NdiVideoSrc {
return true; return true;
} }
if let QueryView::Latency(ref mut q) = query.view_mut() { if let QueryView::Latency(ref mut q) = query.view_mut() {
let settings = &*self.settings.lock().unwrap();
let state = self.state.lock().unwrap(); let state = self.state.lock().unwrap();
if let Some(ref _info) = state.info { if let Some(ref _info) = state.info {
let latency = settings.latency.unwrap(); let latency = state.latency.unwrap();
gst_debug!(self.cat, obj: element, "Returning latency {}", latency); gst_debug!(self.cat, obj: element, "Returning latency {}", latency);
q.set(true, latency, gst::CLOCK_TIME_NONE); q.set(true, latency, gst::CLOCK_TIME_NONE);
return true; return true;
@ -375,9 +377,9 @@ impl BaseSrcImpl for NdiVideoSrc {
fn fixate(&self, element: &gst_base::BaseSrc, caps: gst::Caps) -> gst::Caps { fn fixate(&self, element: &gst_base::BaseSrc, caps: gst::Caps) -> gst::Caps {
let receivers = HASHMAP_RECEIVERS.lock().unwrap(); let receivers = HASHMAP_RECEIVERS.lock().unwrap();
let mut settings = self.settings.lock().unwrap(); let mut state = self.state.lock().unwrap();
let receiver = receivers.get(&settings.id_receiver.unwrap()).unwrap(); let receiver = receivers.get(&state.id_receiver.unwrap()).unwrap();
let recv = &receiver.ndi_instance; let recv = &receiver.ndi_instance;
// FIXME: Should be done in create() and caps be updated as needed // FIXME: Should be done in create() and caps be updated as needed
@ -392,7 +394,7 @@ impl BaseSrcImpl for NdiVideoSrc {
}; };
// FIXME: Why? // FIXME: Why?
settings.latency = gst::SECOND.mul_div_floor( state.latency = gst::SECOND.mul_div_floor(
video_frame.frame_rate().1 as u64, video_frame.frame_rate().1 as u64,
video_frame.frame_rate().0 as u64, video_frame.frame_rate().0 as u64,
); );
@ -419,9 +421,8 @@ impl BaseSrcImpl for NdiVideoSrc {
_offset: u64, _offset: u64,
_length: u32, _length: u32,
) -> Result<gst::Buffer, gst::FlowError> { ) -> Result<gst::Buffer, gst::FlowError> {
let _settings = &*self.settings.lock().unwrap();
let mut timestamp_data = self.timestamp_data.lock().unwrap(); let mut timestamp_data = self.timestamp_data.lock().unwrap();
let settings = self.settings.lock().unwrap().clone();
let state = self.state.lock().unwrap(); let state = self.state.lock().unwrap();
let _info = match state.info { let _info = match state.info {
None => { None => {
@ -432,7 +433,7 @@ impl BaseSrcImpl for NdiVideoSrc {
}; };
let receivers = HASHMAP_RECEIVERS.lock().unwrap(); let receivers = HASHMAP_RECEIVERS.lock().unwrap();
let receiver = &receivers.get(&_settings.id_receiver.unwrap()).unwrap(); let receiver = &receivers.get(&state.id_receiver.unwrap()).unwrap();
let recv = &receiver.ndi_instance; let recv = &receiver.ndi_instance;
let time = receiver.initial_timestamp; let time = receiver.initial_timestamp;
@ -456,8 +457,8 @@ impl BaseSrcImpl for NdiVideoSrc {
gst_element_error!(element, gst::ResourceError::Read, ["NDI frame type error received, assuming that the source closed the stream...."]); gst_element_error!(element, gst::ResourceError::Read, ["NDI frame type error received, assuming that the source closed the stream...."]);
return Err(gst::FlowError::Error); return Err(gst::FlowError::Error);
}, },
Ok(None) if _settings.loss_threshold != 0 => { Ok(None) if settings.loss_threshold != 0 => {
if count_frame_none < _settings.loss_threshold { if count_frame_none < settings.loss_threshold {
count_frame_none += 1; count_frame_none += 1;
continue; continue;
} }