mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-11-25 13:01:07 +00:00
togglerecord: Add is-live mode
No "gap eating" behaviour, will forward incoming segment
This commit is contained in:
parent
f6aa03b58a
commit
a132fdb8be
1 changed files with 38 additions and 4 deletions
|
@ -29,16 +29,19 @@ use std::iter;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
const DEFAULT_RECORD: bool = false;
|
const DEFAULT_RECORD: bool = false;
|
||||||
|
const DEFAULT_LIVE: bool = false;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
struct Settings {
|
struct Settings {
|
||||||
record: bool,
|
record: bool,
|
||||||
|
live: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Settings {
|
impl Default for Settings {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Settings {
|
Settings {
|
||||||
record: DEFAULT_RECORD,
|
record: DEFAULT_RECORD,
|
||||||
|
live: DEFAULT_LIVE,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -132,6 +135,7 @@ struct State {
|
||||||
recording_duration: gst::ClockTime,
|
recording_duration: gst::ClockTime,
|
||||||
// Updated whenever going to Recording
|
// Updated whenever going to Recording
|
||||||
running_time_offset: i64,
|
running_time_offset: i64,
|
||||||
|
live: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for State {
|
impl Default for State {
|
||||||
|
@ -142,6 +146,7 @@ impl Default for State {
|
||||||
last_recording_stop: None,
|
last_recording_stop: None,
|
||||||
recording_duration: gst::ClockTime::ZERO,
|
recording_duration: gst::ClockTime::ZERO,
|
||||||
running_time_offset: 0,
|
running_time_offset: 0,
|
||||||
|
live: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1195,10 +1200,13 @@ impl ToggleRecord {
|
||||||
// recording_duration
|
// recording_duration
|
||||||
|
|
||||||
state.out_segment = state.in_segment.clone();
|
state.out_segment = state.in_segment.clone();
|
||||||
state
|
|
||||||
.out_segment
|
if !rec_state.live {
|
||||||
.offset_running_time(-rec_state.running_time_offset)
|
state
|
||||||
.expect("Adjusting record duration");
|
.out_segment
|
||||||
|
.offset_running_time(-rec_state.running_time_offset)
|
||||||
|
.expect("Adjusting record duration");
|
||||||
|
}
|
||||||
events.push(
|
events.push(
|
||||||
gst::event::Segment::builder(&state.out_segment)
|
gst::event::Segment::builder(&state.out_segment)
|
||||||
.seqnum(state.segment_seqnum)
|
.seqnum(state.segment_seqnum)
|
||||||
|
@ -1770,6 +1778,13 @@ impl ObjectImpl for ToggleRecord {
|
||||||
DEFAULT_RECORD,
|
DEFAULT_RECORD,
|
||||||
glib::ParamFlags::READABLE,
|
glib::ParamFlags::READABLE,
|
||||||
),
|
),
|
||||||
|
glib::ParamSpec::new_boolean(
|
||||||
|
"is-live",
|
||||||
|
"Live mode",
|
||||||
|
"Live mode: no \"gap eating\", forward incoming segment",
|
||||||
|
DEFAULT_LIVE,
|
||||||
|
glib::ParamFlags::READWRITE | gst::PARAM_FLAG_MUTABLE_READY,
|
||||||
|
),
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1797,6 +1812,19 @@ impl ObjectImpl for ToggleRecord {
|
||||||
|
|
||||||
settings.record = record;
|
settings.record = record;
|
||||||
}
|
}
|
||||||
|
"is-live" => {
|
||||||
|
let mut settings = self.settings.lock();
|
||||||
|
let live = value.get().expect("type checked upstream");
|
||||||
|
gst_debug!(
|
||||||
|
CAT,
|
||||||
|
obj: obj,
|
||||||
|
"Setting live from {:?} to {:?}",
|
||||||
|
settings.live,
|
||||||
|
live
|
||||||
|
);
|
||||||
|
|
||||||
|
settings.live = live;
|
||||||
|
}
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1811,6 +1839,10 @@ impl ObjectImpl for ToggleRecord {
|
||||||
let rec_state = self.state.lock();
|
let rec_state = self.state.lock();
|
||||||
(rec_state.recording_state == RecordingState::Recording).to_value()
|
(rec_state.recording_state == RecordingState::Recording).to_value()
|
||||||
}
|
}
|
||||||
|
"is-live" => {
|
||||||
|
let settings = self.settings.lock();
|
||||||
|
settings.live.to_value()
|
||||||
|
}
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1905,6 +1937,8 @@ impl ElementImpl for ToggleRecord {
|
||||||
|
|
||||||
let mut rec_state = self.state.lock();
|
let mut rec_state = self.state.lock();
|
||||||
*rec_state = State::default();
|
*rec_state = State::default();
|
||||||
|
let settings = *self.settings.lock();
|
||||||
|
rec_state.live = settings.live;
|
||||||
}
|
}
|
||||||
gst::StateChange::PausedToReady => {
|
gst::StateChange::PausedToReady => {
|
||||||
for s in &self.other_streams.lock().0 {
|
for s in &self.other_streams.lock().0 {
|
||||||
|
|
Loading…
Reference in a new issue