Nodes/Polyhedron Suite/⬡ Polyhedron Interpolate
ComfyUI Node

⬡ Polyhedron Interpolate

The RIFE interpolator that fixes the lies in the incumbent

By PolyhedronAI·Created 3 months ago·Updated 2 days ago· 2
⬡ Polyhedron Interpolate
  • frames
  • video
  • frames
  • frame_count
  • fps
  • interp_info
  • video
  • audio
ckpt_name◈ rife426.pth · 23 MB
rate_modemultiplier
multiplier2
source_fps16.0
target_fps32.0
precisionfloat32
ensembletrue
fast_modetrue
scale_factor1
static_skip0.000
cut_guard0.000
audio_modekeep

Wan 2.2 ships its clips at 16fps as a convention, and 16fps is fine until you want the footage to actually play smooth. That's where frame interpolation comes in - RIFE-style flow interpolation invents the in-between frames so a 16fps clip becomes 32 or 48, or just moves more smoothly at the same rate. The Polyhedron Interpolate is a RIFE node, but it's a RIFE node with an unusual amount of honesty in the details.

The engine itself is not theirs: it's the MIT-licensed IFNet from Practical-RIFE, vendored byte-for-byte from Fannovel16's ComfyUI-Frame-Interpolation on purpose, and every correction this pack makes lives outside the engine so it can be audited. And it needed corrections, because the package it forked from has problems the source header documents in embarrassing detail. The big one: the model in the incumbent's own dropdown - rife426.pth - ships its training graph inside the checkpoint, and the upstream loader crashes on it. The Interpolate strips those training tensors by name so the model the RIFE author actually recommends for diffusion footage loads instead of exploding. It also calls out the "knobs that lie": fast_mode does nothing from arch 4.5 up, and ensemble is silently forced off on 4.26 - both are reported honestly in the console instead of pretending.

The inputs that matter

  • ckpt_name - which RIFE checkpoint (rife417, rife426, rife47, rife49; prefer the newest for diffusion-model footage). Weights fetch into your usual ComfyUI model folders on first use.
  • rate_mode - multiplier (2×, 4×) or target_fps (name the rate you want; the node works out the ratio and reports what you'll actually get).
  • precision - float32 is the default on purpose: this network's coarse-to-fine flow is sensitive to half precision, and the weights are ~23MB, so there's no memory to save. The faster modes are a measurement, not a setting.
  • static_skip - pairs whose two frames differ by less than this are duplicated instead of interpolated. Identical pixels cannot produce motion, only noise.
  • cut_guard - pairs that differ by more than this are held, not blended. Interpolating across a scene cut produces a dissolve, which at the seam of a joined sequence is a certainty. This is the artefact that gives machine interpolation away fastest.

Take a frame batch OR a video. A wired video brings its own fps, so no fps wire is needed - and the tooltip warns that an fps wire from a Save behind a de-selected switch carries an ExecutionBlocker that silently disables the whole node. Don't.

The alignment gotcha

RIFE's IFNet pads to a mod-64 canvas internally, with zeros bottom-right, and crops back. A canvas that isn't a multiple of 64 therefore gets a black ring the flow estimator tries to track - measured here at ~16 dB worse at the border. The node's answer is to not "fix" it silently: it warns you to keep your canvas on the mod-64 grid, because its own experiments showed a "nicer" centered-replicate pad measures worse than the network's native zeros. Feed it 1088-wide frames, not 1075.

Outputs: frames, frame_count, fps, and interp_info (a string reporting what actually ran and which knobs were ignored). One law worth remembering: k frames per pair over N inputs yields k*(N-1)+1 outputs. 65 frames at 2× gives 129, not 130 - and now you know why.

Installing it

Same pack as everything else - ComfyUI Manager search "Polyhedron Suite", or clone https://github.com/PolyhedronAI/ComfyUI-PolyhedronLoRAStack.git into custom_nodes and restart. No hard dependencies; the RIFE weights download into the standard ComfyUI model folders on first run.

CategoryPolyhedron/Video

Inputs (14)

NameTypeDefaultDescription
ckpt_nameCOMBO◈ rife426.pth · 23 MBWhich RIFE checkpoint to run. Prefer the newest for footage that came out of a diffusion model; after a run, interp_info names the loaded arch and any knob it ignored.
rate_modeCOMBOmultiplierA multiplier changes the frame count and leaves the frame rate to whatever the encoder assumes. Name the rate you want instead and the node reports the rate you will actually get.
multiplierINT21–16
source_fpsFLOAT16.00.1–240
target_fpsFLOAT32.00.1–480
precisionCOMBOfloat32float32 is the default on purpose: this network's coarse-to-fine flow is sensitive to half precision, and the weights are 23 MB - there is no memory to save. Treat the faster modes as a measurement, not a setting.
ensembleBOOLEANtrue
fast_modeBOOLEANtrue
scale_factorCOMBO15 options: 0.25, 0.5, 1, 2, 4
static_skipFLOAT0.0000–0.2Pairs whose two frames differ by less than this (mean absolute error, 0-1) are duplicated instead of interpolated. Identical pixels cannot produce motion, only noise. 0 disables.
cut_guardFLOAT0.0000–1Pairs that differ by MORE than this are held, not blended. Interpolating across a scene cut yields a dissolve; at the seam of a joined sequence that is a certainty, not a risk. 0 disables.
audio_modeCOMBOkeepWhat happens to a wired video's soundtrack. keep: passed through untouched - right whenever the duration does not change (plain fps doubling). stretch to output: retimed by exactly the video's own factor and trimmed to the output duration - the slow-motion mode; speech keeps its pitch and stays on the lips. mute: the video output carries no sound.
framesoptIMAGEFrame batch to interpolate. Wire EITHER this OR video, not both.
videooptVIDEOA video to interpolate. Its own frame rate is used as source_fps (the widget is ignored and interp_info says so); if the video names no rate, the widget steps back in. No fps wire needed -- and none should be used: an fps wire from a Save behind a de-selected switch carries an ExecutionBlocker that silently disables this whole node.

Outputs (6)

NameTypeDescription
framesIMAGEThe interpolated frame batch.
frame_countINTHow many frames came out: multiplier*(n-1)+1, never multiplier*n.
fpsFLOATThe rate these frames are meant to be written at. Wire it to the Save's frame_rate -- or use the video output and wire nothing.
interp_infoSTRINGReadout: arch, counts, gates, timing, and the duration arithmetic.
videoVIDEOThe interpolated frames, the NEW rate and the source clip's ORIGINAL audio in one object. Wire this to the Save and the sound stays in sync without an fps wire; audio only rides along when a video was wired IN (a bare frame batch carries no sound).
audioAUDIO