Add two-clip support for Join Extend mode

SourcePrep gets optional source_clip_2 input — when connected in Join
Extend mode, joins two separate clips instead of splitting one in half.
MergeBack gets optional original_clip_2 to reconstruct the full result
from both originals. Single-clip behavior is unchanged.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-20 10:19:45 +01:00
parent 08d6f21f18
commit 32e28ac4b4
2 changed files with 35 additions and 9 deletions

View File

@@ -106,9 +106,12 @@ Blend methods:
"blend_method": (["optical_flow", "alpha", "none"], {"default": "optical_flow", "description": "Blending method at seams."}),
"of_preset": (["fast", "balanced", "quality", "max"], {"default": "balanced", "description": "Optical flow quality preset."}),
},
"optional": {
"original_clip_2": ("IMAGE", {"description": "Second original clip for Join Extend with two separate clips."}),
},
}
def merge(self, original_clip, vace_output, vace_pipe, blend_method, of_preset):
def merge(self, original_clip, vace_output, vace_pipe, blend_method, of_preset, original_clip_2=None):
mode = vace_pipe["mode"]
trim_start = vace_pipe["trim_start"]
trim_end = vace_pipe["trim_end"]
@@ -120,9 +123,15 @@ Blend methods:
return (vace_output,)
# Splice modes: reconstruct full video
two_clip = vace_pipe.get("two_clip", False)
V = vace_output.shape[0]
head = original_clip[:trim_start]
tail = original_clip[trim_end:]
if two_clip and original_clip_2 is not None:
tail = original_clip_2[trim_end:]
right_orig = original_clip_2
else:
tail = original_clip[trim_end:]
right_orig = original_clip
result = torch.cat([head, vace_output, tail], dim=0)
if blend_method == "none" or (left_ctx == 0 and right_ctx == 0):
@@ -142,7 +151,7 @@ Blend methods:
for j in range(right_ctx):
alpha = 1.0 - (j + 1) / (right_ctx + 1)
frame_idx = V - right_ctx + j
result[trim_start + frame_idx] = blend_frame(original_clip[trim_end - right_ctx + j], vace_output[frame_idx], alpha)
result[trim_start + frame_idx] = blend_frame(right_orig[trim_end - right_ctx + j], vace_output[frame_idx], alpha)
return (result,)