From ccf8adb6ae2b6e8eb0c6147adee940f47510ff06 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Mon, 24 Feb 2025 14:46:20 +1100 Subject: [PATCH] closedcaption: only increase dtvcc packet sequence if we have services Otherwise, we can produce DTVCC packets that skip sequence numbers. Part-of: --- video/closedcaption/src/cea708mux/imp.rs | 4 +++- video/closedcaption/src/tttocea708/translate.rs | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/video/closedcaption/src/cea708mux/imp.rs b/video/closedcaption/src/cea708mux/imp.rs index 1f89208d..1aa52b4e 100644 --- a/video/closedcaption/src/cea708mux/imp.rs +++ b/video/closedcaption/src/cea708mux/imp.rs @@ -346,7 +346,6 @@ impl AggregatorImpl for Cea708Mux { } let mut packet = DTVCCPacket::new(state.dtvcc_seq_no & 0x3); - state.dtvcc_seq_no = state.dtvcc_seq_no.wrapping_add(1); for (_service_no, service) in services.into_iter().filter(|(_, s)| !s.codes().is_empty()) { // FIXME: handle needing to split services @@ -357,6 +356,9 @@ impl AggregatorImpl for Cea708Mux { service.number() ); packet.push_service(service).unwrap(); + if packet.sequence_no() == state.dtvcc_seq_no & 0x3 { + state.dtvcc_seq_no = state.dtvcc_seq_no.wrapping_add(1); + } } let mut data = vec![]; diff --git a/video/closedcaption/src/tttocea708/translate.rs b/video/closedcaption/src/tttocea708/translate.rs index 354ccb51..2a6a6534 100644 --- a/video/closedcaption/src/tttocea708/translate.rs +++ b/video/closedcaption/src/tttocea708/translate.rs @@ -264,13 +264,15 @@ impl TextToCea708 { self.check_erase_display(); let seq_no = self.sequence_no; - self.sequence_no = (self.sequence_no + 1) & 0x3; let mut packet = DTVCCPacket::new(seq_no); gst::trace!(CAT, "New packet {}", packet.sequence_no()); while let Some(service) = self.service_writer.take_service(packet.free_space()) { gst::trace!(CAT, "adding service {service:?} to packet"); packet.push_service(service).unwrap(); + if seq_no == self.sequence_no { + self.sequence_no = (self.sequence_no + 1) & 0x3; + } } gst::trace!(CAT, "push packet to writer"); self.cc_data_writer.push_packet(packet);