Fix gradual video/audio degradation: pass full NestedTensor to VAE decode

_decode_video was extracting only the video tensor before calling vae.decode(),
stripping the audio component. LTXAV's video decoder uses audio as temporal
conditioning — without it, decode quality degrades progressively across scenes
(causal: later frames suffer most) and audio timing drifts.

Standard ComfyUI decode passes output["samples"] directly (full NestedTensor).
Match that behavior. Tiled path still extracts video tensor since decode_tiled
likely doesn't support NestedTensor, falling back to full decode on failure.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
digital-garbage
2026-05-26 02:50:10 +03:00
co-authored by Claude Sonnet 4.6
parent 4eb82b2388
commit 4bceaa72b2
+10 -4
View File
@@ -1306,15 +1306,21 @@ class FunPackLTXAVSceneChainSampler:
frames[i] = self._blur_pixel_frame(frames[i], sigma)
def _decode_video(self, output, vae, tile_size=0):
"""Decode the video component of a latent to [N, H, W, C] pixel frames."""
video_tensor = self._latent_tensors(output)[0]
"""Decode latent to [N, H, W, C] pixel frames.
Must pass the full samples (NestedTensor for LTXAV) to vae.decode —
stripping audio before decode loses the audio conditioning that LTXAV's
video decoder uses, causing gradual quality degradation across scenes.
"""
samples = output.get("samples")
if tile_size > 0:
video_tensor = self._latent_tensors(output)[0]
try:
decoded = vae.decode_tiled(video_tensor, tile_x=tile_size // 8, tile_y=tile_size // 8)
except Exception:
decoded = vae.decode(video_tensor)
decoded = vae.decode(samples)
else:
decoded = vae.decode(video_tensor)
decoded = vae.decode(samples)
if decoded.dim() == 5:
b, t, h, w, c = decoded.shape
decoded = decoded.reshape(b * t, h, w, c)