From 7c951cab2224dbae2c11896a822f46d4e2c8dfdd Mon Sep 17 00:00:00 2001 From: Chandragupt Date: Mon, 22 Dec 2025 13:37:25 +0530 Subject: [PATCH 1/3] Fix: Avoid panic in CEA-708 service decoder when transcript output is disabled (observed with -stdout on Windows) --- src/rust/src/decoder/service_decoder.rs | 39 +++++++++++++++---------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/rust/src/decoder/service_decoder.rs b/src/rust/src/decoder/service_decoder.rs index 3ce528b32..b1d7d25dc 100644 --- a/src/rust/src/decoder/service_decoder.rs +++ b/src/rust/src/decoder/service_decoder.rs @@ -860,19 +860,27 @@ impl dtvcc_service_decoder { /// Print the contents of tv screen to the output file pub fn screen_print(&mut self, encoder: &mut encoder_ctx, timing: &mut ccx_common_timing_ctx) { - debug!("dtvcc_screen_print rust"); + debug!("dtvcc::screen_print rust"); + self.cc_count += 1; + unsafe { - let tv = &mut (*self.tv); + let tv = &mut *self.tv; tv.cc_count += 1; + let sn = tv.service_number; let writer_ctx = &mut encoder.dtvcc_writers[(sn - 1) as usize]; + tv.update_time_hide(timing.get_visible_end(3)); - let transcript_settings = if !encoder.transcript_settings.is_null() { - &*encoder.transcript_settings - } else { - &ccx_encoders_transcript_format::default() + + let transcript_settings = match encoder.transcript_settings.as_ref() { + Some(ts) => ts, + None => { + // No transcript settings => transcript output disabled + return; + } }; + let mut writer = Writer::new( &mut encoder.cea_708_counter, encoder.subs_delay, @@ -882,7 +890,8 @@ impl dtvcc_service_decoder { transcript_settings, encoder.no_bom, ); - tv.writer_output(&mut writer).unwrap(); + + tv.writer_output(&mut writer); tv.clear(); } } @@ -1190,18 +1199,17 @@ impl dtvcc_service_decoder { } /// Flush the decoder of any remaining subtitles pub fn flush(&self, encoder: &mut encoder_ctx) { - let transcript_settings = unsafe { - if !encoder.transcript_settings.is_null() { - &*encoder.transcript_settings - } else { - &ccx_encoders_transcript_format::default() - } - }; unsafe { - let tv = &mut (*self.tv); + let tv = &mut *self.tv; let sn = tv.service_number; let writer_ctx = &mut encoder.dtvcc_writers[(sn - 1) as usize]; + // If transcript output is disabled, do nothing + let transcript_settings = match encoder.transcript_settings.as_ref() { + Some(ts) => ts, + None => return, + }; + let mut writer = Writer::new( &mut encoder.cea_708_counter, encoder.subs_delay, @@ -1211,6 +1219,7 @@ impl dtvcc_service_decoder { transcript_settings, encoder.no_bom, ); + writer.write_done(); } } From ce3f32c46836647718d5153940524fcabdd8c41d Mon Sep 17 00:00:00 2001 From: Chandragupt Singh Date: Mon, 22 Dec 2025 23:31:53 +0530 Subject: [PATCH 2/3] rust: handle Result from writer_output to fix CI warning --- src/rust/src/decoder/service_decoder.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/rust/src/decoder/service_decoder.rs b/src/rust/src/decoder/service_decoder.rs index b1d7d25dc..4e84d9d24 100644 --- a/src/rust/src/decoder/service_decoder.rs +++ b/src/rust/src/decoder/service_decoder.rs @@ -891,7 +891,9 @@ impl dtvcc_service_decoder { encoder.no_bom, ); - tv.writer_output(&mut writer); + if let Err(e) = tv.writer_output(&mut writer) { + warn!("dtvcc::screen_print: writer_output failed: {}", e); + } tv.clear(); } } From 14aa72cbe62004bebb563b6b314483ade3df62ec Mon Sep 17 00:00:00 2001 From: Chandragupt Singh Date: Mon, 22 Dec 2025 23:46:33 +0530 Subject: [PATCH 3/3] docs: update changelog --- docs/CHANGES.TXT | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/CHANGES.TXT b/docs/CHANGES.TXT index e3c962b90..9702ef623 100644 --- a/docs/CHANGES.TXT +++ b/docs/CHANGES.TXT @@ -1,5 +1,6 @@ 0.96 (2025-12-21) ----------------- +- Fix: Prevent CEA-708 decoder panic when using --stdout on Windows by safely handling writer output errors - New: Added --list-tracks (-L) option to list all tracks in media files without processing - Fix: Garbled captions from HDHomeRun and I/P-only H.264 streams (#1109) - Fix: Enable stdout output for CEA-708 captions on Windows (#1693)