Upscale Video
Windowed, not temporal — and why that distinction costs you
- frames
- upscale_model
- upscaled
- confidence_map
- pass_info
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
- ComfyUI Manager → search Radiance → Install → restart → refresh.
- 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.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| frames | IMAGE | Video frame batch (B,H,W,C) float32. B = frame count. | |
| scale | COMBO | 4× | Output scale. 8× runs the 4× model twice, the second pass area-downsampled by half. |
| tile_size | INT | 512128–1024 | Spatial tile size in input pixels. Reduce if OOM. |
| overlap_spatial | INT | 12832–256 | Spatial tile overlap in input pixels. |
| window_size | INT | 164–64 | Frames per processing batch (VRAM). Tier 1/2 models are single-image: each frame is still upscaled on its own. |
| overlap_temporal | INT | 41–16 | Frames shared between adjacent windows. Minimum 1 for seam-free stitching. |
| flow_compensation | BOOLEAN | true | At 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_boost | FLOAT | 0.000–1 | Unsharp-mask strength (sigma 1.5 px) applied after upscaling. 0 = off. |
| upscale_modelopt | UPSCALE_MODEL | Optional ComfyUI UPSCALE_MODEL; its native scale should match scale. When connected it replaces model_tier. | |
| model_tieropt | COMBO | tier1_fast (Real-ESRGAN — GAN, ms/frame) | Select 'SeedVR2' for best temporal consistency on video. Requires seedvr2 or diffusers package. |
| enhancement_promptopt | STRING | Text prompt for Tier 3 diffusion steering (e.g. 'cinematic film grain, detailed textures'). | |
| diffusion_stepsopt | INT | 11–50 | Diffusion inference steps. SeedVR2 uses 1 (one-step); SD x4 upscaler recommended 15-25. |
| hdr_modeopt | COMBO | auto | Scene-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_encodingopt | COMBO | passthrough | Encode scene-linear -> display (sRGB/LogC3) before SR and decode after. passthrough: feed pixels unchanged. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| upscaled | IMAGE | — |
| confidence_map | IMAGE | — |
| pass_info | STRING | — |