Nodes/IAMCCS-nodes/IAMCCS H3 Disk Upscale · 3 Assemble Film
ComfyUI Node

IAMCCS H3 Disk Upscale · 3 Assemble Film

Joins Your Upscaled Segments — and Refuses to Join Bad Ones

By IAMCCS·Created 12 months ago·Updated about 14 hours ago· 113
IAMCCS H3 Disk Upscale · 3 Assemble Film
    • film_path
    • report
    render_idh3_upscale_test
    segment_count1
    output_namefinal_full_hd

    The last mile of any segmented video pipeline is a concat, and concat is where the wheels come off. A two-frame drift here, a mixed canvas there, a join that silently ate the wrong 17 frames - you find out when you watch the cut, which is far too late. This node's whole personality is that it checks first.

    What it does

    You give it a render_id, a segment_count, and an output_name. It looks in ComfyUI/output/IAMCCS/H3_DISK_UPSCALE/<render_id>/segments/ for segment_00000.mp4 through segment_<N-1>.mp4, and then it verifies every single one:

    • the manifest exists, declares the right schema, carries the same render_id, is numbered in the order you asked for, and points at the file it's sitting next to;
    • the MP4's SHA-256 matches the hash recorded in that manifest;
    • the file actually decodes to the frame count, width, height and audio presence the manifest claims;
    • all segments share one canvas size and one frame rate;
    • the join policy is consistent - the node explicitly refuses a mix of cut and crossfade, because mixing them across a film is a bug, not a style.

    Only then does it concatenate, either straight or with a frame-based crossfade (the same overlap you set on Save AV Checkpoint), then validate the assembled file against the expected total: sum(frames) - overlap × (segments - 1), plus canvas and audio. The write is atomic - a temp file that gets renamed only after validation - and the node refuses to overwrite an existing output.

    Outputs are film_path (STRING) and report.

    Why the arithmetic is the point

    Long-form video in ComfyUI is a stitching problem before it's a generation problem, and the community writes the same complaint over and over: you have to divide the length into segments that respect the model's frame grid, work out the final segment's shorter length, and account for the context overlap - get it wrong and the video comes up short or the join behaves strangely. On Wan it's the 4n+1 grid; on H3 it's a 17k+5 grid with a 1-4-4-4-4 token spacing, which is why the pack's tools all snap to 17.

    This node takes that arithmetic off your hands and makes it falsifiable. The expected frame count is computed from the manifests, not from your intent, and a mismatch is an error instead of a quiet 2-frame slip. If you've ever chased a lip-sync drift that turned out to be one duplicated frame at a segment boundary, that is the bug this prevents.

    Picking a name, and the one thing that will annoy you

    output_name becomes output/.../segments/<output_name>.mp4, sanitised down to safe characters. Use something that tells you which take it was - final_full_hd_v3, not final.

    The annoyance is the no-overwrite rule. It applies all the way down: checkpoints, refined segments, and the assembled film. Re-run the same render_id and segment index and you'll get a FileExistsError rather than a quiet replacement. The intended workflow is to bump the segment index or start a fresh render_id when you want a new take, and to treat the old folder as a delivered artifact. Annoying the first time, correct on reflection - this is the family's whole safety story.

    Install

    cd ComfyUI/custom_nodes
    git clone https://github.com/IAMCCS/IAMCCS-nodes.git
    

    Restart and hard-refresh the browser; one copy in custom_nodes only. You need ffmpeg on PATH - the actual muxing goes through the pack's shared concat helpers, which shell out to it. PyAV matters too, since the frame validation decodes each file to count frames.

    Nothing else in the graph has to be loaded for this node to run; it's a cheap final step, so it's fine to queue it alone once your segments exist.

    Worth knowing about the whole route

    This is the standalone, disk-bound path - no Shotboard, no backend routing, no state carried in the graph. That's a feature when you're finishing a long film on a modest card, and it's the same instinct that made this pack's author a known name in the Wan and LTX long-video threads in the first place: his SVI Pro v2 release was the one people credited for minute-plus Wan 2.2 output on a single consumer GPU, and his low-VRAM LTX workflow did 1080p on a 3060. The approach there is the approach here - do the work in pieces, put the pieces on disk, and let a validator decide whether they're allowed to become a film.

    You'll have to be the judge of whether the assembled result holds up. Identity drift across segment boundaries is the unsolved failure mode of every chained video pipeline in mid-2026, and a checksum cannot see it.

    CategoryIAMCCS/MiniMax H3/Disk Upscale (Standalone)

    Inputs (3)

    NameTypeDefaultDescription
    render_idSTRINGh3_upscale_test
    segment_countINT11–1000
    output_nameSTRINGfinal_full_hd

    Outputs (2)

    NameTypeDescription
    film_pathSTRING
    reportSTRING