Merge pull request #77 from Meisoftcoltd/jules-fix-frame-absorption-bypass-2060959048677752393

fix: implement final batch bypass and aggressive frame absorption
This commit is contained in:
Meisoft
2026-04-11 15:06:46 +02:00
committed by GitHub
5 changed files with 11 additions and 70 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
+11
View File
@@ -105,10 +105,21 @@ class SessionImageSender:
batch_size = generated_images.shape[0]
best_idx = batch_size - 1
accumulated = getattr(loop, 'global_accumulated_frames', 0)
source_total = getattr(loop, 'global_source_frame_count', 1)
stride = getattr(loop, 'global_select_every_nth', 1)
ltx_mode_active = getattr(loop, 'global_ltx_mode', False)
print(f"\n{'='*50}")
print(f"📤 [DEBUG] NODO: Image Sender (Filtro Dinámico)")
print(f" -> Frames recibidos de la IA: {batch_size}")
# 🧠 BYPASS IMPLACABLE: Si al sumar este lote llegamos al final del video, NO RECORTAMOS
advance_check = (batch_size - 1) * stride if ltx_mode_active else batch_size * stride
if (accumulated + advance_check) >= source_total:
print(f" -> 🏁 LOTE FINAL ABSOLUTO DETECTADO. Desactivando recorte de rostros para forzar la salida de TODOS los frames.")
detect_faces = False
if detect_faces:
try:
cascade_path = cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
-70
View File
@@ -1,70 +0,0 @@
import sys
import types
import os
# Create dummy modules for comfyui dependencies
comfy_module = types.ModuleType("comfy")
comfy_mm_module = types.ModuleType("comfy.model_management")
comfy_module.model_management = comfy_mm_module
sys.modules["comfy"] = comfy_module
sys.modules["comfy.model_management"] = comfy_mm_module
folder_paths_module = types.ModuleType("folder_paths")
sys.modules["folder_paths"] = folder_paths_module
nodes_module = types.ModuleType("nodes")
sys.modules["nodes"] = nodes_module
# Mock torchaudio and torch
sys.modules["torch"] = types.ModuleType("torch")
sys.modules["torchaudio"] = types.ModuleType("torchaudio")
sys.modules["cv2"] = types.ModuleType("cv2")
sys.modules["numpy"] = types.ModuleType("numpy")
sys.modules["tqdm"] = types.ModuleType("tqdm")
def mock_tqdm(iter_obj, *args, **kwargs):
class DummyPbar:
def update(self, *args, **kwargs): pass
def close(self): pass
if isinstance(iter_obj, int):
return DummyPbar()
return iter_obj
sys.modules["tqdm"].tqdm = mock_tqdm
# Mock parent package for relative imports
dummy_pkg = types.ModuleType("dummy_pkg")
def mock_register_node(cls):
return cls
dummy_pkg.register_node = mock_register_node
sys.modules["dummy_pkg"] = dummy_pkg
# Overwrite sys.modules for testing so `from . import register_node` works
# We'll just load the file using importlib
import importlib.util
def load_module(name, path):
spec = importlib.util.spec_from_file_location(name, path)
module = importlib.util.module_from_spec(spec)
sys.modules[name] = module
# make it part of dummy_pkg
module.__package__ = "dummy_pkg"
spec.loader.exec_module(module)
return module
load_module("dummy_pkg.loop", "loop.py")
video = load_module("dummy_pkg.video", "video.py")
loop_mod = sys.modules["dummy_pkg.loop"]
# Run tests
calc_base = video.AutoLoopCalculator()
calc_wan = video.AutoLoopCalculatorWan()
calc_ltx = loop_mod.AutoLoopCalculatorLTX()
print("Testing base calculator...")
calc_base.calculate(source_frame_count=876, target_frames_per_loop=50, select_every_nth=8, current_loop_index=0)
print("\nTesting WanVideo calculator...")
calc_wan.calculate(source_frame_count=876, target_frames_per_loop=48, select_every_nth=8, current_loop_index=0)
print("\nTesting LTX calculator...")
calc_ltx.calculate(source_frame_count=876, target_frames_per_loop=81, select_every_nth=8, current_loop_index=0)
print("\nTests passed!")