Nodes/ComfyUI-Easy-Media/Easy MiniMax H3 HiRes Continuity
ComfyUI Node

Easy MiniMax H3 HiRes Continuity

Context for the second pass, not just the first

By yolain·Created 4 months ago·Updated about 23 hours ago· 184
Easy MiniMax H3 HiRes Continuity
  • current_hires_latent
  • previous_hires_latent
  • latent
  • trim_frames
context_length22
video_transition_steps4

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 - 1 inside the copied prefix, meaning "denoise here", then a short video_transition_steps ramp down to 0 (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. The 0/1 conventions here are the same lock-then-release shape as the hard node, applied at high resolution.
  • audio mask - frozen at 0 for 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; default 22).
  • video_transition_steps - the release ramp, default 4. Raise it if the high-res join shows a visible blend band; lower toward 0 for 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_latent is 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.

CategoryEasyUse/MiniMax

Inputs (4)

NameTypeDefaultDescription
current_hires_latentLATENT
previous_hires_latentLATENT
context_lengthCOMBO224 options: 22, 5, 39, 56
video_transition_stepsINT40–32

Outputs (2)

NameTypeDescription
latentLATENT
trim_framesINT