From b2c1babf905589aa41cfd483767e47e5d709e985 Mon Sep 17 00:00:00 2001 From: Pranav Sharma <134720928+pranavshar223@users.noreply.github.com> Date: Sat, 7 Mar 2026 13:56:55 +0530 Subject: [PATCH] Feat(rust): Implement WebVTT-specific timestamp format and layout anchor (#2135) * Feat(rust): Implement WebVTT-specific timestamp format and layout anchor * style: apply rustfmt to g608.rs * fix(rust): use WebVTT-spec dot separator for milliseconds in timestamp line --- src/rust/src/encoder/g608.rs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/rust/src/encoder/g608.rs b/src/rust/src/encoder/g608.rs index 9399968a..90af1e94 100644 --- a/src/rust/src/encoder/g608.rs +++ b/src/rust/src/encoder/g608.rs @@ -191,9 +191,20 @@ pub fn write_cc_buffer_as_g608(data: &eia608_screen, context: &mut encoder_ctx) } // Create timeline string for timestamps - let timestamp_line = format!( - "{h1:02}:{m1:02}:{s1:02},{ms1:03} --> {h2:02}:{m2:02}:{s2:02},{ms2:03}{encoded_clrf}" - ); + let is_webvtt = context.write_format == crate::bindings::ccx_output_format::CCX_OF_WEBVTT; + + let timestamp_line = if is_webvtt { + // WebVTT Standard requires dots instead of commas for milliseconds + // and supports trailing settings (e.g., vertical text direction, alignment) + format!( + "{h1:02}:{m1:02}:{s1:02}.{ms1:03} --> {h2:02}:{m2:02}:{s2:02}.{ms2:03}{encoded_clrf}" + ) + } else { + // Legacy SRT Standard requires commas + format!( + "{h1:02}:{m1:02}:{s1:02},{ms1:03} --> {h2:02}:{m2:02}:{s2:02},{ms2:03}{encoded_clrf}" + ) + }; // Encode and write timestamp line let used = encode_line(context, buffer_slice, timestamp_line.as_bytes());