Nodes/radiance/Upscale Video
ComfyUI Node

Upscale Video

Windowed, not temporal — and why that distinction costs you

By FXTD-Studios·Created 8 months ago·Updated about 18 hours ago· 246
Upscale Video
  • frames
  • upscale_model
  • upscaled
  • confidence_map
  • pass_info
◄scale4×►
◄tile_size512►
◄overlap_spatial128►
◄window_size16►
◄overlap_temporal4►
◄flow_compensationtrue►
◄sharpness_boost0.00►
◄model_tiertier1_fast (Real-ESRGAN — GAN, ms/frame)►
◄enhancement_prompt►
◄diffusion_steps1►
◄hdr_modeauto►
◄color_encodingpassthrough►

Upscaling video is not upscaling a lot of stills. Each frame has to agree with its neighbours, and a GAN that adds beautiful per-frame detail will still make the whole clip shimmer. Upscale Video is the pack's attempt at that problem: spatial tiling, temporal windowing, flow-compensated seams - and one documented limitation that tells you exactly how far it gets.

How it works

Frames come in as an IMAGE batch ([B,H,W,C]). Processing happens in windows of window_size frames (default 16, for VRAM), and adjacent windows share overlap_temporal frames (default 4, minimum 1 for a seam-free stitch). Within a window, frames are also processed in spatial tiles - tile_size (default 512) with overlap_spatial (default 128).

The interesting part is what happens at a window seam. Each overlap frame gets upscaled twice - once as the tail of one window, once as the head of the next - and those two versions won't be identical. With flow_compensation on (default), Lucas-Kanade flow aligns the two results before they're blended, so the seam doesn't show as a jump. The tooltip is careful about its own scope: "It does not compensate camera motion between frames." It's fixing the seam, not the shot.

scale gives 2×, 4× or 8× (tile cascade) - the 4× model run twice with the second pass area-downsampled by half. sharpness_boost (default 0) is an unsharp mask at sigma 1.5 applied after, if you like that sort of thing.

And the HDR handling carries over from the pack: hdr_mode (auto / preserve / clamp) and color_encoding (passthrough / linear<->sRGB / linear<->LogC3) let you move scene-linear footage into a display space the LDR-trained network expects and back again, so you're not feeding a GAN values it has never seen.

The limitation, in the author's own words

From the pack's known issues: "Upscale Video is windowed, not temporal. Tier 1/2 models upscale each frame independently; overlap frames are flow-aligned and blended at window seams. GAN flicker between frames is not removed."

That's the whole story. For Tier 1 and 2, this is a fast, memory-safe, seam-managed per-frame upscale - good when the source is clean and the model isn't inventing much. If your clip flickers, the answer is not a setting on this node; it's a model that actually sees time, which in 2026 means model_tier: tier3_creative (SeedVR2) - the option the wider community rates highest for video detail, Apache 2.0, one-step, and consistently described as the thing to use on low-resolution sources.

SeedVR2 here needs seedvr2 or diffusers installed, and the tooltip for the Tier 3 entry says as much. Set diffusion_steps to 1 for SeedVR2; 15–25 is the recommendation for the SD x4 upscaler. And the SFW-video dialogue now has enhancement_prompt for steering Tier 3 - text only, obviously; there is no pixel-level HDR here beyond the hdr_mode handoff.

Outputs: upscaled, confidence_map and pass_info. Read pass_info; it's where the node admits which tier actually ran.

Install

  1. ComfyUI Manager → search Radiance → Install → restart → refresh.
  2. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/fxtd-studios/radiance.git
cd radiance
python -m pip install -r requirements.txt

Windows portable: python_embeded\python.exe. Weights fetch on first use (SHA-verified) into ComfyUI's model folders. HAT-L has no pinned download and must be installed by hand; SeedVR2 needs its own node pack or a diffusers/seedvr2 install. RADIANCE_ALLOW_DOWNLOADS=0 or RADIANCE_UPSCALE_OFFLINE=1 disables automatic fetching.

Practical notes

Tune window and tile sizes against your card, and expect the temporal overlap to cost real time - every overlap frame is processed twice by design, so overlap_temporal: 4 is 4 redundant frame-upscales per window boundary. Drop it to 1 for speed on a shot with little motion; raise it if you see a pulse every 16 frames.

And feed it a sane source. The upscaling consensus that matters here: on a soft or out-of-focus plate, downscaling to roughly a third of a megapixel and rebuilding from there beats upscaling the full frame, because there was never detail at full resolution to recover.

CategoryFXTD STUDIOS/Radiance/Upscale

Inputs (14)

NameTypeDefaultDescription
framesIMAGEVideo frame batch (B,H,W,C) float32. B = frame count.
scaleCOMBO4×Output scale. 8× runs the 4× model twice, the second pass area-downsampled by half.
tile_sizeINT512128–1024Spatial tile size in input pixels. Reduce if OOM.
overlap_spatialINT12832–256Spatial tile overlap in input pixels.
window_sizeINT164–64Frames per processing batch (VRAM). Tier 1/2 models are single-image: each frame is still upscaled on its own.
overlap_temporalINT41–16Frames shared between adjacent windows. Minimum 1 for seam-free stitching.
flow_compensationBOOLEANtrueAt window seams each overlap frame is upscaled twice; Lucas-Kanade flow aligns the two results before they are blended. It does not compensate camera motion between frames.
sharpness_boostFLOAT0.000–1Unsharp-mask strength (sigma 1.5 px) applied after upscaling. 0 = off.
upscale_modeloptUPSCALE_MODELOptional ComfyUI UPSCALE_MODEL; its native scale should match scale. When connected it replaces model_tier.
model_tieroptCOMBOtier1_fast (Real-ESRGAN — GAN, ms/frame)Select 'SeedVR2' for best temporal consistency on video. Requires seedvr2 or diffusers package.
enhancement_promptoptSTRINGText prompt for Tier 3 diffusion steering (e.g. 'cinematic film grain, detailed textures').
diffusion_stepsoptINT11–50Diffusion inference steps. SeedVR2 uses 1 (one-step); SD x4 upscaler recommended 15-25.
hdr_modeoptCOMBOautoScene-linear / HDR handling. auto: preserve range when input exceeds 1.0, else clamp. preserve: Reinhard tonemap before SR and re-expand after. clamp: legacy [0,1] (LDR).
color_encodingoptCOMBOpassthroughEncode scene-linear -> display (sRGB/LogC3) before SR and decode after. passthrough: feed pixels unchanged.

Outputs (3)

NameTypeDescription
upscaledIMAGE—
confidence_mapIMAGE—
pass_infoSTRING—