Nodes/was-node-suite-comfyui/H3 Upscale Video
ComfyUI Node Runs on cloud

H3 Upscale Video

Upscale inside the latent, or get boiling wallpaper

By WASasquatch·Created 4 years ago·Updated about 9 hours ago· 1,884
H3 Upscale Video
  • source
  • model
  • positive
  • negative
  • vae
  • audio_vae
  • video
  • latent
  • frames
  • report
◄upscale_model▾►
◄scale2.00►
◄mode▾►
◄color_transfertrue►
◄color_methodwavelet►
◄seed0►
◄roottemp►
◄nameframe_cache/h3_upscale►
◄delete_after_savetrue►

Video upscaling is the third job in upscaling, and the one where the still-image advice quietly fails. A 4x ESRGAN that looks great on a photo, run 24 times a second, picks a different way to enlarge the patterned wallpaper on every frame. Boiling background: perfectly sharp, completely unwatchable. This node's answer is to not upscale frames at all - it works on MiniMax H3's latent, chunk by chunk, with H3 doing the refining, so the frames agree with each other by construction rather than by hope.

What it actually does

For each chunk it encodes a stretch of the source into an H3 video latent, enlarges that latent with a learned 3D latent upscaler (or a plain bicubic resize, if you'd rather not), then re-samples it with the H3 model from a low noise level. That last part is the point: the enlargement is redrawn by the model that already knows how this clip's frames relate, at a sigma low enough that it adds detail instead of re-imagining the shot.

Long clips get chunked the way H3 likes to be sampled - whole 17-frame clips plus the five frames that close them. Each chunk repeats whole clips from the chunk before and holds those rows at the values the earlier chunk refined them to, so the join has nothing to argue about. Frames are decoded and written to a frame cache on disk as they settle, colour-corrected against their source frame on the way, with the clip's own audio attached. That's what makes "any length" real: the whole clip is never in memory at once.

The inputs that matter

  • source - VIDEO or IMAGE frames. A VIDEO passes its frame rate and sound to the result; bare frames play at 24 fps, silent. For long clips, come from core Load Video, which reads frames as they're used.
  • mode - every preset runs at cfg 1, in light (each chunk starts at sigma 0.4 and sharpens) and creative (0.75, redraws more). The 2 to 12 step presets expect a turbo LoRA; full 25 step doesn't. manual gives you steps, cfg, sampler_name, scheduler, strength, chunk_frames, overlap_frames, max_tokens and anchor - exactly what you want when a 24 GB card is refusing to cooperate.
  • upscale_model - from ComfyUI/models/latent_upscale_models. Only checkpoints matching the pack's vendored 3D conv network get listed, so a stray ESRGAN file dropped in there won't show up. bicubic resizes without a model; the H3 upscaler is fetched on first use, but only with the pack's network feature switched on.
  • scale - 1 to 4, sides rounded to 32 pixels. 1 refines at the same size, which is a perfectly sensible thing to want.
  • color_transfer / color_method - on by default, correcting each written frame against its source. wavelet takes coarse colour from the source and fine detail from H3, fixing local drift; the others match colour statistics instead.

Also wire model (H3, after any LoRA), positive, negative (read only when cfg is above 1), the H3 video vae, and optionally audio_vae so each chunk is refined beside its own sound. root, name and delete_after_save control the frame cache: temp clears on restart, output survives for Load Video Cache.

Outputs: video, the upscaled clip, read off disk a frame at a time by a saver like the suite's own Save Video (Advanced); latent, the whole clip's latent before colour transfer, for H3 Decode Video or another pass; frames; and report, listing sizes, chunks and times. The panel plays source beside result, which is the quickest way to judge whether light was enough.

Installing

ComfyUI Manager, search WAS Node Suite v3, or:

cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was-node-suite-comfyui.git

Restart, done. Requires ComfyUI 0.14.0+ and Python 3.10+. The pack installs nothing itself, but this node wants three things from elsewhere: the H3 model, the H3 video VAE (plus the audio VAE if you want chunks refined with sound), and the learned latent upscaler - which is fetched on first use only when network: true sits under features: in <ComfyUI user dir>/was-node-suite/config.yaml, and that switch is off out of the box.

Where people get burned

"This node needs a MiniMax H3 model." It means what it says - the node checks what's wired into model before doing anything, so a Wan or LTX checkpoint is rejected rather than producing nonsense.

The upscaler isn't in the menu. Either features.network is off or the file isn't in models/latent_upscale_models. With the switch off, the node names the checkpoint it wanted rather than quietly reaching for the network - so you can grab minimax_h3_latent_upscaler_3d_conv_v1_fp16.safetensors by hand and never touch the config.

Out of memory, or out of patience. If it dies you're usually maxing out max_tokens: leave mode on a preset and chunking and the token budget are sized to your card automatically, or set them in manual - 64000 tokens at 24 GB, down to 24000 at 12 to 16 GB. Smaller chunk_frames and a lower scale are the other levers, and the learned upscaler's memory grows with chunk length in a way bicubic's doesn't.

You queued it twice. This is an output node, and with delete_after_save on (the default) it re-runs from scratch on every queue. Turn that off while you're tuning and the frames stay for Load Video Cache.

And before any of it: H3's weights are licensed under terms that exclude the US, EU, UK and South Korea from the "Applicable Territory", so for a good number of readers the local path isn't licensed at all.

CategoryWAS Suite/Sampling

Inputs (15)

NameTypeDefaultDescription
sourceVIDEO,IMAGEThe clip to upscale, as a VIDEO or IMAGE frames. A VIDEO gives the result its frame rate and sound; frames play at 24 fps with none. A long clip comes from core Load Video, which reads frames as they are used.
modelMODELThe MiniMax H3 model, after any LoRA.
positiveCONDITIONINGWhat the clip shows, or how to refine it, from CLIP Text Encode.
negativeCONDITIONINGWhat to avoid, read only when cfg is above 1.
vaeVAEThe H3 video VAE, for reading and writing the frames.
upscale_modelCOMBOThe learned upscaler, from ComfyUI/models/latent_upscale_models; `minimax_h3_latent_upscaler_3d_conv_v1_fp16.safetensors` is fetched on first use with features.network on. `bicubic` resizes without one.
scaleFLOAT2.001–4Size multiplier, sides rounded to 32 pixels: `1` = refine at the same size; `2` = 1216x672 to 2432x1344.
modeCOMBO`light` starts each chunk at sigma 0.4 and sharpens; `creative` starts at sigma 0.75 and redraws more. `2` to `12 step` expect a turbo LoRA; `full 25 step` none.
color_transferBOOLEANtrue`true` = each frame's colour and brightness are corrected against its source frame, by color_method; `false` = frames are written as H3 decoded them.
color_methodCOMBOwavelet`wavelet` = colour and brightness at coarse scales from the source, fine detail from H3, fixing local drift too; `reinhard`, `mkl`, `histogram` = each frame's colour statistics matched to its source's.
seedINT00–18446744073709550000Noise seed of the first chunk, as `0` or `42`; each later chunk adds its number.
rootCOMBOtempWhich folder the frames land in: 'temp' = cleared when ComfyUI restarts; 'output' = kept until deleted, for Load Video Cache.
nameSTRINGframe_cache/h3_upscaleThe frames' folder below root, numbered on each run, as `frame_cache/h3_upscale` for `frame_cache/h3_upscale_00001`.
delete_after_saveBOOLEANtrue`true` = the frames are deleted once a save has written all of them, and the node runs again on every queue; `false` = they are kept.
audio_vaeoptVAEThe H3 audio VAE, so each chunk is refined beside its own sound. Left empty, silence is held. The result carries the source's sound either way.

Outputs (4)

NameTypeDescription
videoVIDEOThe upscaled clip with the source's sound, read from disk by Save Video a frame at a time.
latentLATENTThe refined video latent of the whole clip, padded to an H3 length and before colour transfer, for H3 Decode Video or another pass.
framesINTFrames written.
reportSTRINGThe sizes, the chunks and how long each took.