tttocea608: implement paint-on mode

That mode has been mostly obsoleted by roll-up modes, but let's
include it for completeness' sake.
This commit is contained in:
Mathieu Duponchelle 2021-01-19 22:22:51 +01:00
parent 13efa59252
commit 875c3efb91
2 changed files with 38 additions and 7 deletions

View file

@ -263,6 +263,30 @@ impl State {
) )
} }
fn resume_direct_captioning(
&mut self,
element: &super::TtToCea608,
bufferlist: &mut gst::BufferListRef,
) {
self.cc_data(
element,
bufferlist,
eia608_control_command(ffi::eia608_control_t_eia608_control_resume_direct_captioning),
)
}
fn delete_to_end_of_row(
&mut self,
element: &super::TtToCea608,
bufferlist: &mut gst::BufferListRef,
) {
self.cc_data(
element,
bufferlist,
eia608_control_command(ffi::eia608_control_t_eia608_control_delete_to_end_of_row),
)
}
fn roll_up_2(&mut self, element: &super::TtToCea608, bufferlist: &mut gst::BufferListRef) { fn roll_up_2(&mut self, element: &super::TtToCea608, bufferlist: &mut gst::BufferListRef) {
self.cc_data( self.cc_data(
element, element,
@ -438,7 +462,7 @@ impl TtToCea608 {
let mut ret = true; let mut ret = true;
let do_preamble = match state.mode { let do_preamble = match state.mode {
Cea608Mode::PopOn => true, Cea608Mode::PopOn | Cea608Mode::PaintOn => true,
Cea608Mode::RollUp2 | Cea608Mode::RollUp3 | Cea608Mode::RollUp4 => { Cea608Mode::RollUp2 | Cea608Mode::RollUp3 | Cea608Mode::RollUp4 => {
if let Some(carriage_return) = carriage_return { if let Some(carriage_return) = carriage_return {
if carriage_return { if carriage_return {
@ -495,6 +519,10 @@ impl TtToCea608 {
); );
} }
if state.mode == Cea608Mode::PaintOn {
state.delete_to_end_of_row(element, bufferlist);
}
state.tab_offset(element, bufferlist, offset); state.tab_offset(element, bufferlist, offset);
state.underline = chunk.underline; state.underline = chunk.underline;
@ -522,7 +550,7 @@ impl TtToCea608 {
let mut bufferlist = gst::BufferList::new(); let mut bufferlist = gst::BufferList::new();
let mut_list = bufferlist.get_mut().unwrap(); let mut_list = bufferlist.get_mut().unwrap();
let mut col = if state.mode == Cea608Mode::PopOn { let mut col = if state.mode == Cea608Mode::PopOn || state.mode == Cea608Mode::PaintOn {
0 0
} else { } else {
state.column state.column
@ -564,7 +592,7 @@ impl TtToCea608 {
if clear && !cleared { if clear && !cleared {
state.erase_display_frame_no = None; state.erase_display_frame_no = None;
state.erase_display_memory(element, mut_list); state.erase_display_memory(element, mut_list);
if state.mode != Cea608Mode::PopOn { if state.mode != Cea608Mode::PopOn && state.mode != Cea608Mode::PaintOn {
state.send_roll_up_preamble = true; state.send_roll_up_preamble = true;
} }
col = 0; col = 0;
@ -578,6 +606,8 @@ impl TtToCea608 {
} }
state.resume_caption_loading(element, mut_list); state.resume_caption_loading(element, mut_list);
state.cc_data(element, mut_list, erase_non_displayed_memory()); state.cc_data(element, mut_list, erase_non_displayed_memory());
} else if state.mode == Cea608Mode::PaintOn {
state.resume_direct_captioning(element, mut_list);
} }
let mut prev_char = 0; let mut prev_char = 0;
@ -600,11 +630,11 @@ impl TtToCea608 {
} }
if let Some(line_column) = line.column { if let Some(line_column) = line.column {
if state.mode != Cea608Mode::PopOn { if state.mode != Cea608Mode::PopOn && state.mode != Cea608Mode::PaintOn {
state.send_roll_up_preamble = true; state.send_roll_up_preamble = true;
} }
col = line_column; col = line_column;
} else if state.mode == Cea608Mode::PopOn { } else if state.mode == Cea608Mode::PopOn || state.mode == Cea608Mode::PaintOn {
col = 0; col = 0;
} }
@ -686,7 +716,7 @@ impl TtToCea608 {
if col > 31 { if col > 31 {
match state.mode { match state.mode {
Cea608Mode::PopOn => { Cea608Mode::PaintOn | Cea608Mode::PopOn => {
gst_warning!( gst_warning!(
CAT, CAT,
obj: element, obj: element,
@ -716,7 +746,7 @@ impl TtToCea608 {
} }
} }
if state.mode == Cea608Mode::PopOn { if state.mode == Cea608Mode::PopOn || state.mode == Cea608Mode::PaintOn {
if prev_char != 0 { if prev_char != 0 {
state.cc_data(element, mut_list, prev_char); state.cc_data(element, mut_list, prev_char);
prev_char = 0; prev_char = 0;

View file

@ -24,6 +24,7 @@ use serde::{Deserialize, Serialize};
#[genum(type_name = "GstTtToCea608Mode")] #[genum(type_name = "GstTtToCea608Mode")]
pub enum Cea608Mode { pub enum Cea608Mode {
PopOn, PopOn,
PaintOn,
RollUp2, RollUp2,
RollUp3, RollUp3,
RollUp4, RollUp4,