Easy MiniMax H3 HiRes Continuity
Context for the second pass, not just the first
- current_hires_latent
- previous_hires_latent
- latent
- trim_frames
Dual-sampling H3 (first pass low, second pass high) has a subtle continuity problem that Easy-Media's easy MiniMaxH3HiResContinuity exists to solve. If you upscale the current segment's latent and copy over the previous segment's context from the first-pass resolution, you get a low-detail ghost pasted into a high-res image - a soft, wrong-looking join. This node copies the previous segment's final high-resolution video tail into the current upscaled latent instead, so the seam holds at the resolution you're actually going to deliver.
It's the second-pass counterpart to easy MiniMaxH3MotionContextHard, and in the project pipeline the two are used together: the hard node seeds pass one, this node seeds pass two. Used standalone, it slots between your latent upscaler and your second-pass sampler in a hand-built H3 dual-sampling graph.
How it works
The mechanism is short and mechanical. It splits the current high-res latent into its video and audio streams, takes the previous final high-res latent, cuts its tail (default 22 frames), and writes that tail into the first temporal positions of the current video latent. Then it builds a per-stream noise mask:
- video mask -
1inside the copied prefix, meaning "denoise here", then a shortvideo_transition_stepsramp down to0(fully free) before the newly generated content begins. Wait - read the source's ramp direction carefully: the copied prefix is written into the latent, and the mask releases it - the model is told it may start changing the copied region gradually across the transition steps rather than being allowed to redraw it instantly. The0/1conventions here are the same lock-then-release shape as the hard node, applied at high resolution. - audio mask - frozen at
0for pass two. The second pass keeps the audio continuity established in pass one rather than resampling it and risking a drift between the two passes.
It validates that the previous and current latents are actually the same resolution - if your upscaler changed the dimensions, the copied tail won't line up and it errors rather than producing garbage. Outputs: the seeded latent and trim_frames (how many frames the copied prefix spans, for trimming the final decode back to your target length).
The inputs that matter
current_hires_latent- your upscaled second-pass latent.previous_hires_latent- the previous segment's final high-res latent (the project pipeline saves this for you; in a hand-built graph you're on the hook for routing it).context_length- frames of the previous tail to copy (5,22,39,56; default22).video_transition_steps- the release ramp, default4. Raise it if the high-res join shows a visible blend band; lower toward0for a harder lock.
Installation
Same pack install as the rest of Easy-Media:
# FFmpeg installed first
cd ComfyUI/custom_nodes
git clone https://github.com/yolain/ComfyUI-Easy-Media
Restart ComfyUI or use Manager (search "ComfyUI-Easy-Media"). No extra dependencies beyond what dual-sampling already needs - an upscaler path (KJNodes' ImageResizeKJv2 or an H3 latent upscaler) - and the H3 model itself.
Troubleshooting
- "previous and current video resolutions differ" - the upscaler changed dimensions, or you fed the wrong previous latent. The node refuses to guess. Check that
previous_hires_latentis genuinely the previous segment's final high-res result, and that your upscale keeps the spatial size you think it does. - High-res join looks soft where the low-res one was fine - you're likely feeding it the previous first-pass latent by mistake; that's exactly the failure this node is meant to prevent.
- Second-pass audio drifts - the audio is intentionally frozen; if you hear a mismatch, the drift happened in pass one, before this node ran.
The reason this node exists is that "just enlarge the low-res join" is the naive approach and it visibly fails. Two lines in the README sum it up: the second pass inherits the previous final high-res result rather than a scaled-up low-res one. That's the whole trick.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| current_hires_latent | LATENT | — | |
| previous_hires_latent | LATENT | — | |
| context_length | COMBO | 22 | 4 options: 22, 5, 39, 56 |
| video_transition_steps | INT | 40–32 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | — |
| trim_frames | INT | — |