mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-11-29 15:01:07 +00:00
tttocea608: expose roll-up timeout property
In roll-up mode, when no more timed text comes in, the closed captions may remain displayed on screen indefinitely (unless the decoder implements a timeout, but that is not mandatory). Expose a property to erase the display memory after a configurable amount of time has elapsed instead. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/754>
This commit is contained in:
parent
6b80fdc270
commit
05ece5560e
1 changed files with 35 additions and 0 deletions
|
@ -94,6 +94,7 @@ struct Settings {
|
||||||
mode: Cea608Mode,
|
mode: Cea608Mode,
|
||||||
origin_row: i32,
|
origin_row: i32,
|
||||||
origin_column: u32,
|
origin_column: u32,
|
||||||
|
roll_up_timeout: Option<gst::ClockTime>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Settings {
|
impl Default for Settings {
|
||||||
|
@ -102,6 +103,7 @@ impl Default for Settings {
|
||||||
mode: DEFAULT_MODE,
|
mode: DEFAULT_MODE,
|
||||||
origin_row: DEFAULT_ORIGIN_ROW,
|
origin_row: DEFAULT_ORIGIN_ROW,
|
||||||
origin_column: DEFAULT_ORIGIN_COLUMN,
|
origin_column: DEFAULT_ORIGIN_COLUMN,
|
||||||
|
roll_up_timeout: gst::ClockTime::NONE,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -187,6 +189,8 @@ impl State {
|
||||||
if let Some(erase_display_frame_no) = self.erase_display_frame_no {
|
if let Some(erase_display_frame_no) = self.erase_display_frame_no {
|
||||||
if self.last_frame_no == erase_display_frame_no - 1 {
|
if self.last_frame_no == erase_display_frame_no - 1 {
|
||||||
self.erase_display_frame_no = None;
|
self.erase_display_frame_no = None;
|
||||||
|
self.column = 0;
|
||||||
|
self.send_roll_up_preamble = true;
|
||||||
self.erase_display_memory(element, bufferlist);
|
self.erase_display_memory(element, bufferlist);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -791,6 +795,9 @@ impl TtToCea608 {
|
||||||
if state.mode == Cea608Mode::PopOn {
|
if state.mode == Cea608Mode::PopOn {
|
||||||
state.erase_display_frame_no =
|
state.erase_display_frame_no =
|
||||||
Some(state.last_frame_no + duration.mul_div_round(fps_n, fps_d).unwrap().seconds());
|
Some(state.last_frame_no + duration.mul_div_round(fps_n, fps_d).unwrap().seconds());
|
||||||
|
} else if let Some(timeout) = settings.roll_up_timeout {
|
||||||
|
state.erase_display_frame_no =
|
||||||
|
Some(state.last_frame_no + timeout.mul_div_round(fps_n, fps_d).unwrap().seconds());
|
||||||
}
|
}
|
||||||
|
|
||||||
state.pad(element, mut_list, state.max_frame_no);
|
state.pad(element, mut_list, state.max_frame_no);
|
||||||
|
@ -1080,6 +1087,15 @@ impl ObjectImpl for TtToCea608 {
|
||||||
DEFAULT_ORIGIN_COLUMN,
|
DEFAULT_ORIGIN_COLUMN,
|
||||||
glib::ParamFlags::READWRITE | gst::PARAM_FLAG_MUTABLE_PLAYING,
|
glib::ParamFlags::READWRITE | gst::PARAM_FLAG_MUTABLE_PLAYING,
|
||||||
),
|
),
|
||||||
|
glib::ParamSpecUInt64::new(
|
||||||
|
"roll-up-timeout",
|
||||||
|
"Roll-Up Timeout",
|
||||||
|
"Duration after which to erase display memory in roll-up mode",
|
||||||
|
0,
|
||||||
|
u64::MAX,
|
||||||
|
u64::MAX,
|
||||||
|
glib::ParamFlags::READWRITE | gst::PARAM_FLAG_MUTABLE_PLAYING,
|
||||||
|
),
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1120,6 +1136,16 @@ impl ObjectImpl for TtToCea608 {
|
||||||
state.force_clear = true;
|
state.force_clear = true;
|
||||||
state.column = settings.origin_column;
|
state.column = settings.origin_column;
|
||||||
}
|
}
|
||||||
|
"roll-up-timeout" => {
|
||||||
|
let mut settings = self.settings.lock().unwrap();
|
||||||
|
|
||||||
|
let timeout = value.get().expect("type checked upstream");
|
||||||
|
|
||||||
|
settings.roll_up_timeout = match timeout {
|
||||||
|
u64::MAX => gst::ClockTime::NONE,
|
||||||
|
_ => Some(gst::ClockTime::from_nseconds(timeout)),
|
||||||
|
};
|
||||||
|
}
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1138,6 +1164,15 @@ impl ObjectImpl for TtToCea608 {
|
||||||
let settings = self.settings.lock().unwrap();
|
let settings = self.settings.lock().unwrap();
|
||||||
settings.origin_column.to_value()
|
settings.origin_column.to_value()
|
||||||
}
|
}
|
||||||
|
"roll-up-timeout" => {
|
||||||
|
let settings = self.settings.lock().unwrap();
|
||||||
|
|
||||||
|
if let Some(timeout) = settings.roll_up_timeout {
|
||||||
|
timeout.nseconds().to_value()
|
||||||
|
} else {
|
||||||
|
u64::MAX.to_value()
|
||||||
|
}
|
||||||
|
}
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue