MiniMax H3 V2V Object Swap Conditioning (R22)
The node that slices your source video and builds object-swap conditioning for MiniMax H3
- model
- clip
- video_vae
- audio_vae
- cine_linx
- model
- positive
- latent
- source_preview
- source_audio_segment
- manifest_json
- prompt
- current_segment
- total_segments
- requested_frames
- aligned_frames
- trim_tail_frames
- report
Video-to-video on MiniMax H3 means you're replacing something in an existing clip - a person, an object - while keeping the motion, timing and camera of the source. The hard part isn't the model, it's the conditioning: you have to slice the source video to the exact segment you're working on, resample it to H3's canvas, pull the matching audio, and build the REF2VA conditioning. IAMCCS_MiniMaxH3V2VConditioningR22 is the "R22" (round-two, refactored) node that does all of that deterministically from the Shotboard's plan.
How it works
The node is one big prepare step. It reads the shotplan from cine_linx, resolves the current segment_index, and pulls the source video/audio plus optional depth and pose guides from the CineInfo H3 V2V resources upstream. Then it does the arithmetic that always trips people up:
- works out how many frames the segment requests,
- aligns that to H3's frame constraints (
align_h3_frames), - picks the source frame indices using the source-range policy from the Shotboard (
timeline_segment,sequential_requested, orrepeat_from_offset), - fits those frames to the canvas (
canvas_pad,canvas_crop,native_adapt, orstretch), - slices the matching audio segment.
Depth and pose guides are only pulled when the shotplan's guide_mode asks for them (raw_pose / raw_depth / raw_depth_pose) - and it validates that guide frame counts match the source before slicing, because mismatched guide arrays are the classic silent-failure source in V2V.
Inputs and outputs
Required: model, clip, video_vae, audio_vae, cine_linx, and segment_index. Optional: prompt_override (a per-segment prompt that wins over the shotplan text).
Outputs are the full conditioning bundle:
model/positive/latent- feed the sampler.source_preview(IMAGE) andsource_audio_segment(AUDIO) - the exact slice it's working from.manifest_json,prompt,current_segment,total_segments,requested_frames,aligned_frames,trim_tail_frames,report.
The requested_frames vs aligned_frames pair is the one to watch - it tells you how much of the segment is "real" request versus H3 alignment padding, and it's exactly what the delivery trim node uses later to cut back to the true length.
The traps
Two hard requirements you'll hit immediately. First, it requires IAMCCS_CineInfoH3V2V upstream in cine_linx - the resources block with the source media has to exist or it raises with a message that's effectively "V2V needs the CineInfo source node." Second, it insists the model family is ref2va; route anything else and it refuses. This is an opinionated node and the opinions are load-bearing - H3's object-swap path is a reference-to-video job under the hood, so mixing in a plain I2V model breaks the whole contract.
It's in the IAMCCS pack, so install once via ComfyUI Manager (search "IAMCCS") or git clone https://github.com/IAMCCS/IAMCCS-nodes.git into custom_nodes, then restart. This node itself adds no model downloads - the H3 model, VAEs and text encoder are loaded elsewhere in the graph.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| video_vae | VAE | — | |
| audio_vae | VAE | — | |
| cine_linx | IAMCCS_SUPERNODE_LINX | — | |
| segment_index | INT | 00–1000000 | — |
| prompt_overrideopt | STRING | — |
Outputs (13)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| positive | CONDITIONING | — |
| latent | LATENT | — |
| source_preview | IMAGE | — |
| source_audio_segment | AUDIO | — |
| manifest_json | STRING | — |
| prompt | STRING | — |
| current_segment | INT | — |
| total_segments | INT | — |
| requested_frames | INT | — |
| aligned_frames | INT | — |
| trim_tail_frames | INT | — |
| report | STRING | — |