mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2025-01-18 07:05:45 +00:00
togglerecord: Handle stream-start event after EOS
It should restart any pending streams instead of keeping everything EOS'd Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/622>
This commit is contained in:
parent
9ae8f0d330
commit
2acb83da8f
1 changed files with 72 additions and 4 deletions
|
@ -1086,7 +1086,7 @@ impl ToggleRecord {
|
||||||
// Check whether all secondary streams are in eos. If so, update recording
|
// Check whether all secondary streams are in eos. If so, update recording
|
||||||
// state to Stopped
|
// state to Stopped
|
||||||
if rec_state.recording_state != RecordingState::Stopped {
|
if rec_state.recording_state != RecordingState::Stopped {
|
||||||
let mut others_eos = true;
|
let mut all_others_eos = true;
|
||||||
|
|
||||||
// Check eos state of all secondary streams
|
// Check eos state of all secondary streams
|
||||||
self.other_streams.lock().0.iter().all(|s| {
|
self.other_streams.lock().0.iter().all(|s| {
|
||||||
|
@ -1096,12 +1096,12 @@ impl ToggleRecord {
|
||||||
|
|
||||||
let s = s.state.lock();
|
let s = s.state.lock();
|
||||||
if !s.eos {
|
if !s.eos {
|
||||||
others_eos = false;
|
all_others_eos = false;
|
||||||
}
|
}
|
||||||
others_eos
|
all_others_eos
|
||||||
});
|
});
|
||||||
|
|
||||||
if others_eos {
|
if all_others_eos {
|
||||||
gst_debug!(
|
gst_debug!(
|
||||||
CAT,
|
CAT,
|
||||||
obj: pad,
|
obj: pad,
|
||||||
|
@ -1116,6 +1116,46 @@ impl ToggleRecord {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// should be called only if main stream stops being in eos state
|
||||||
|
fn check_and_update_stream_start(
|
||||||
|
&self,
|
||||||
|
pad: &gst::Pad,
|
||||||
|
stream: &Stream,
|
||||||
|
stream_state: &mut StreamState,
|
||||||
|
rec_state: &mut State,
|
||||||
|
) -> bool {
|
||||||
|
stream_state.eos = false;
|
||||||
|
|
||||||
|
// Check whether no secondary streams are in eos. If so, update recording
|
||||||
|
// state according to the record property
|
||||||
|
if rec_state.recording_state == RecordingState::Stopped {
|
||||||
|
let mut all_others_not_eos = false;
|
||||||
|
|
||||||
|
// Check eos state of all secondary streams
|
||||||
|
self.other_streams.lock().0.iter().any(|s| {
|
||||||
|
if s == stream {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
let s = s.state.lock();
|
||||||
|
if !s.eos {
|
||||||
|
all_others_not_eos = true;
|
||||||
|
}
|
||||||
|
all_others_not_eos
|
||||||
|
});
|
||||||
|
|
||||||
|
if !all_others_not_eos {
|
||||||
|
let settings = self.settings.lock();
|
||||||
|
if settings.record {
|
||||||
|
gst_debug!(CAT, obj: pad, "Restarting recording after EOS");
|
||||||
|
rec_state.recording_state = RecordingState::Starting;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
fn sink_chain(
|
fn sink_chain(
|
||||||
&self,
|
&self,
|
||||||
pad: &gst::Pad,
|
pad: &gst::Pad,
|
||||||
|
@ -1361,6 +1401,34 @@ impl ToggleRecord {
|
||||||
_ => false,
|
_ => false,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
EventView::StreamStart(..) => {
|
||||||
|
let main_state = if stream != self.main_stream {
|
||||||
|
Some(self.main_stream.state.lock())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
let mut state = stream.state.lock();
|
||||||
|
state.eos = false;
|
||||||
|
|
||||||
|
let main_is_eos = if let Some(main_state) = main_state {
|
||||||
|
main_state.eos
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
};
|
||||||
|
|
||||||
|
if !main_is_eos {
|
||||||
|
let mut rec_state = self.state.lock();
|
||||||
|
recording_state_changed = self.check_and_update_stream_start(
|
||||||
|
pad,
|
||||||
|
&stream,
|
||||||
|
&mut state,
|
||||||
|
&mut rec_state,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.main_stream_cond.notify_all();
|
||||||
|
gst_debug!(CAT, obj: pad, "Stream is not EOS now");
|
||||||
|
}
|
||||||
EventView::Eos(..) => {
|
EventView::Eos(..) => {
|
||||||
let main_state = if stream != self.main_stream {
|
let main_state = if stream != self.main_stream {
|
||||||
Some(self.main_stream.state.lock())
|
Some(self.main_stream.state.lock())
|
||||||
|
|
Loading…
Reference in a new issue