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:
co-authored by
Claude Sonnet 4.6
parent
4eb82b2388
commit
4bceaa72b2
+10
-4
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user