Skip to content

[PROPOSAL] The C-vs-Rust dual-build comparison from #2207 never runs; the C-only build drops 708 and HEVC captions #2398

Open

Description

@Deepak-negi11

#2207 added two builds so that "both must produce identical output on the sample platform; divergence means a Rust port introduced a behavioral difference". That comparison never got wired up: sample-platform#1122 pointed the platform at the "(with migrations)" builds only (mod_ci/controllers.py:264-268), and no workflow compares the two artifacts. In #2109 you mentioned Rust ports won't be merged until this kind of C-vs-Rust check exists.

I built both variants from master on macOS (same source, only -DDISABLE_RUST differs) and compared them on public samples from https://streams.videolan.org/streams/ts/ with 5 option sets each:

Sample Result
Closed Caption EIA.ts identical
atsc-cea-708-dtvcc-and-cea-608.ts (first 20 MB) 608 identical; the min-rust build writes no 708 file (Rust: 5 cues), both exit 0
CC/wabc-4pm-ota.clip1.ts (US broadcast) 608 identical (40 cues); the min-rust build writes no 708 file (Rust: 42 cues), both exit 0
CC/hevc_cc.ts min-rust build writes nothing (exit 10) although it logs "Total caption blocks received: 762"; Rust extracts 608 + 708

I'd like to build the comparison:

  1. A CI job that runs both Linux artifacts on a small public sample set and reports differences (non-blocking at first).
  2. Triage each difference (fix the C path, or record it as expected).
  3. Then use it as the check for Rust ports.

Two questions before I start:

  • Should this live in this repo's GitHub Actions, or in the sample platform?
  • Where should the samples come from (download from VideoLAN with caching, or the sample platform)?

Activity

  1. Deepak-negi11 commented on Oct 18, 2026

    @Deepak-negi11
    ContributorAuthor

    Update: I found why the C-only (min-rust) build loses all 708 captions.

    In #1738 the C code that sends 708 data to the C decoder was removed. Since then, with DISABLE_RUST, the data goes to the Rust decoder instead, which isn't running in that build, so the captions are silently dropped.

    Fixing that showed two more problems in the C-only build:

    • the C writer printed every letter as 2 bytes, so the file wasn't readable text
    • --out=report crashed

    I've opened a #2399 that fixes all three (the normal Rust build's output doesn't change). With it, the US broadcast sample gives identical output from both builds. Two differences remain: HEVC captions (only the Rust code handles them, #1852) and a 1 ms timing difference on one sample.

    I also have the comparison job working locally. I'll wait for your answer on where it should live before opening it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions