VOID Inference
Pass 1, Pass 2, and why CFG 1 is the default
- void_pipeline
- video
- quadmask
- Pass 1
- Pass 2
This is the node that does the actual work. Give it a video, a quadmask, and a description of what the scene should look like after the object is gone, and it runs Netflix's VOID - Pass 1 base inpainting, then optional Pass 2 refinement - and hands you back two videos: the Pass 1 result and the Pass 2 result. Both outputs are always connected, so when you disable Pass 2 the second output just mirrors the first.
If you've never seen VOID: it's a purpose-trained video object-removal model (built on CogVideoX-Fun) that deletes objects and their physical interactions - the shadow under a cup, the contact patch where it sat, the reflection - instead of just painting over the pixels. That's the whole reason it exists, and it's why you'd pick it over a general-purpose video-to-video model that changes every frame. Masked inpainting still owns the "leave the rest of the frame exactly as it was" job; VOID just does that for time as well as space.
The inputs that matter
Most of the 15 inputs are defaults you can leave alone. The ones worth your attention:
video- [T,H,W,C]. Scaled down to fit within 480×720, snapped to multiples of 16, frames trimmed to (n−1) % 4 == 0, max 85. That resolution cap is the model's RoPE bound, not a bug - crop the region you care about out of your 4K footage before feeding it, which is what the community does in practice.quadmask- the IMAGE output from VOID Quadmask Builder (0=remove, 63=overlap, 127=affected, 255=background).prompt- describe the result, e.g. "A table with a cup." The model regenerates the masked region to match.guidance_scale- default 1.0, and that's deliberate. VOID's Pass 1 is guidance-distilled: the guidance is trained into the weights, so CFG 1.0 is the paper's setting. Crank it to 7 because SDXL taught you to and you're double-applying guidance on a model that didn't ask for it. The KB's guidance-distillation essay makes exactly this point about 2026-era models.num_inference_steps- 50 default, applies to both passes.denoise_strength- 1.0 = full inpaint; lower it if you want the surrounding pixels to hold more strongly.enable_pass2- on by default;pass2_guidance_scale6.0 is the recommended setting.warped_noise_path- optional path to anoises.npygenerated bymake_warped_noise.pyfrom the void-model repo. It seeds Pass 2 with optical-flow-warped noise for better temporal consistency. Leave empty and Pass 2 uses random init - fine for a first run.
Two details worth knowing. negative_prompt has a sensible default (low-quality, watermark, distortion - the standard video-regeneration gripes), and Pass 2 ignores it, always running with an empty negative. And the quadmask's "affected" region is where VOID's interaction-awareness lives: mask only the object and it degrades to plain inpainting, which works but leaves the shadow behind.
What to expect when you hit Run
It's heavy. Two transformer pipelines, each ~10 GB of weights, multi-diffusion over up to 85-frame windows. On a 12GB card with the default fp8+cpu-offload loader mode you'll wait minutes, not seconds, and that's normal. Pass 1's transformer is shunted to CPU before Pass 2 runs so the second pass gets the full GPU budget.
Troubleshooting
- OOM at start - it's the memory mode on VOID Loader, not this node. Switch to fp8+cpu offload or sequential.
- "Resolution too large" / weird dimension errors - the 480×720 cap again. Downscale or crop the input first; ComfyUI's VHS nodes have a resize/scale path.
- Object removed but the shadow stays - that's a quadmask problem. You didn't mark the affected region, or your SAM masks didn't cover the interaction. Go back to the Quadmask Builder and add an
affected_mask. - Everything flickers / Pass 2 output looks worse - try random-init Pass 2 first, then consider the warped-noise file; and remember VOID is young. Early-adopter reports from spring 2026 described results as "beta" quality - worth managing expectations on tricky clips.
The defaults are the paper's settings for a reason. Change prompt, set your frames, and let the passes do their thing.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| void_pipeline | VOID_PIPELINE | — | |
| video | IMAGE | Input video [T, H, W, C]. Scaled down to fit within 480×720 if needed, then snapped to the nearest multiple of 16. Frame count is trimmed to (n−1) % 4 == 0, max 85. | |
| quadmask | IMAGE | Quadmask [T, H, W, C]. 0=remove 63=overlap 127=affected 255=background. | |
| prompt | STRING | Describe the scene after object removal (e.g. 'A table with a cup.'). | |
| negative_prompt | STRING | The video is not of a high quality, it has a low resolution. Watermark present in each frame. The background is solid. Strange body and strange trajectory. Distortion. | Used by both passes. Pass 2 ignores this (always runs with empty negative). |
| width | INT | 672 | Output width in pixels. Snapped to nearest multiple of 16. |
| height | INT | 384 | Output height in pixels. Snapped to nearest multiple of 16. |
| num_frames | INT | 85 | Number of frames. Trimmed to nearest (n−1) % 4 == 0, max 85. |
| num_inference_steps | INT | 5010–200 | Denoising steps. Applies to both passes. |
| seed | INT | 420–2147483647 | RNG seed. Applies to both passes. |
| guidance_scale | FLOAT | 1.01–20 | Pass 1 CFG scale. 1.0 = distillation mode (paper default). |
| denoise_strength | FLOAT | 1.000.1–1 | Pass 1 denoise strength. 1.0 = full inpaint. |
| enable_pass2 | BOOLEAN | true | Run Pass 2 refinement. When off, Pass 2 output mirrors Pass 1. |
| pass2_guidance_scale | FLOAT | 6.01–20 | Pass 2 CFG scale. 6.0 recommended. |
| warped_noise_path | STRING | Optional path to noises.npy from make_warped_noise.py (void-model repo). Seeds Pass 2 with optical-flow-warped noise for better temporal consistency. Leave empty to use random init. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| Pass 1 | IMAGE | — |
| Pass 2 | IMAGE | — |