From 4bceaa72b29bd52a3be37a63f8bfc32d9ca615e4 Mon Sep 17 00:00:00 2001 From: digital-garbage <133010426+digital-garbage@users.noreply.github.com> Date: Tue, 26 May 2026 02:50:10 +0300 Subject: [PATCH] Fix gradual video/audio degradation: pass full NestedTensor to VAE decode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _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 --- samplers.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/samplers.py b/samplers.py index c91a3d7f..ae557242 100644 --- a/samplers.py +++ b/samplers.py @@ -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)