
    
3jʅ                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
rS SKrS SKrS SKJr  S SKJrJr   SSKJrJr   S SKJr  S	 r " S
 S5      rS rS"S jr S r!\!" 5       r"Sr#Sr$Sq%S r&S r'S r(S r)S#S jr*S#S jr+S r,S r-S r.S r/ " S S5      r0 " S S\Rb                  5      r2 " S  S!\Rb                  5      r3g! \ a$  r\R2                  " S\ S35        SrSr SrCNSrCff = f! \ a    Sr Nf = f)$    N)io)ImageImageOps   )WrappedPreviewerget_ltx_rgb_factorsz6[KJ PreviewOverride] LTX preview helpers unavailable (z); LTX previews disabled.)PromptServerc                     g N )self_preview_formatx0s      X/home/wildlama/comfy/ComfyUI/custom_nodes/ComfyUI-KJNodes/nodes/preview_override_node.py_suppressed_preview_imager      s        c                   F    \ rS rSrSr\" 5       rS	S jrS rS r	S
S jr
Srg)_AsyncPreviewEncoder"   zQOff-thread encoder. Bounded FIFO drops-on-full so the sampler never blocks on us.c                     [         R                  " US9U l        [        R                  " U R
                  SSS9U l        U R                  R                  5         g )N)maxsizekj_preview_encoderT)targetnamedaemon)queueQueueq	threadingThread_runthreadstart)selfmax_in_flights     r   __init___AsyncPreviewEncoder.__init__'   s>    ]3&&dii>R[_`r   c                 p     U R                   R                  U5        g! [        R                   a     gf = f)NTF)r   
put_nowaitr   Full)r$   fns     r   submit_AsyncPreviewEncoder.submit,   s2    	FFb!zz 		s    55c                      U R                   R                  5       nXR                  L a  g  U" 5         M3  ! [         a    [        R
                  " S5         N$f = f)Nz)[KJ Preview Override] async encoder error)r   get_STOP	Exceptionlogging	exception)r$   items     r   r!   _AsyncPreviewEncoder._run3   sS    66::<Dzz!O   O!!"MNOs   5  AAc                      U R                   R                  U R                  US9  U R
                  R                  US9  g ! [        R                   a     N0f = f)N)timeout)r   putr0   r   r*   r"   join)r$   drain_timeouts     r   shutdown_AsyncPreviewEncoder.shutdown=   sN    	FFJJtzz=J9 	/ zz 		s   $A   AA)r   r"   N)   )      @)__name__
__module____qualname____firstlineno____doc__objectr0   r&   r,   r!   r;   __static_attributes__r   r   r   r   r   "   s!    [HE
O0r   r   c                    [         R                  n[        5       n[        US5      (       aW  [	        U5      U;  aH  UR                  [	        U5      5        UR                  n[        US5      (       a  [	        U5      U;  a  MH  U" X5      $ )N__wrapped__)latent_previewget_previewersethasattridaddrG   )load_devicelatent_formatr+   seens       r   _get_core_previewerrQ   E   sl    		%	%B5D
"m
$
$Bt);B^^ "m
$
$Bt); k))r   c                 b   U R                   S:w  a  / $ [        USS 5      nUc  / $  [        USS 5      nUb  U" U 5      n [        USS 5      n[        R                  " X@R                  U R
                  S9R                  SS5      nUb)  [        R                  " X`R                  U R
                  S9OS nU S   n	US:  a  U	S S 2S S U24   n	U	R                  S   n
US:  aX  X*:  aS  [        R                  " SU
S-
  U5      R                  5       R                  [        5      R                  5       nU	S S 2U4   n	U	R                  SS5      n	[        R                  R                   R#                  XUS	9nUR%                  S
5      R'                  S5      R)                  SS5        UR+                  [        R,                  5      R/                  5       R1                  5       n[3        UR                  S   5       Vs/ s H  n[4        R6                  " X   5      PM     sn$ s  snf ! [8         a    / s $ f = f)N   latent_rgb_factorslatent_rgb_factors_reshapelatent_rgb_factors_bias)devicedtyper   r   )bias      ?g     _@   )ndimgetattrtorchtensorrW   rX   	transposeshapenplinspaceroundastypeinttolistmovedimnn
functionallinearadd_mul_clamp_touint8cpunumpyranger   	fromarrayr1   )r   rO   
max_framesstridergb_factorsreshaperZ   factorsbias_txt_totalindicesrgbrgb_cpuis                  r   _decode_video_frames_l2rgbr   O   s   	ww!|	-)=tDK	-)EtLB}&?F,,{99BHHMWWXY[\]IMIYd99BHHE_cqEA:!XvX+A''!*>j2kk!Wq[*=CCELLSQXXZG!W*AIIahh!!((&(A5!((C0&&%))+1135:7==;K5LM5L
+5LMMM 	s$   GH 5"HH H H.-H.c                  R     SS K n U R                  SS5        g! [         a     gf = f)Nr   
h264_nvencwTF)avCodecr1   )r   s    r   _probe_nvencr   n   s-    
s# s    
&&   1   Fc           
      D   U (       d  g SS K n/ nU  H  nUR                  S:X  a  UOUR                  S5      nU(       aM  US:  aG  UR                  U:  d  UR
                  U:  a'  [        R                  " XbU4[        R                  5      nUR                  U5        M     US   R                  US   R
                  pUS-  US-  pX4Xx4:w  a0  U Vs/ s H#  ofR                  X4[        R                  5      PM%     nnU	[        :  d
  U
[        :  a  gSSSS.S	S0/nS nU GH$  n[        R                  " 5       n UR!                  US
SSS0S9nUR#                  S[%        ['        SU5      5      S9nU	Ul        U
Ul        SUl        UUl        U HE  nUR-                  UR.                  R1                  U5      5       H  nUR3                  U5        M     MG     UR-                  5        H  nUR3                  U5        M     UR5                  5         [6        R8                  " UR;                  5       5      R=                  S5      X4s  $    [>        (       d  Sq[@        RB                  " SU 35        g! [         a     gf = fs  snf ! [         a  nUn S nAGMx  S nAff = f)NNr   r   r   RGBp1vbr23)presetrccqr   r   mp4movflagsz*frag_keyframe+empty_moov+default_base_moof)modeformatoptionsr   r   )rateyuv420pasciiTzC[KJ PreviewOverride] NVENC MP4 encode failed, using WebP fallback: )"r   r1   r   convertwidthheightr   containr   LANCZOSappendresize_NVENC_MIN_W_NVENC_MIN_HpyioBytesIOopen
add_streamrg   maxpix_fmtr   encode
VideoFrame
from_imagemuxclosebase64	b64encodegetvaluedecode_nvenc_warnedr2   warning)framesfpsmax_resr   
pil_framesfpfw0h0out_wout_hoption_candidateslast_erroptsbuf	containerstreampktes                      r   _encode_mp4_nvencr      sq     J&&E/Qqyy'7w{7(:bii'>Q!!"&8%--HB"	  ]  *Q-"6"67BG5~"!IST2ii>
T|u|3 uD1	4 H!lln	#e#%QR   I )),SQ=M)NF FL!FM&FN!FN !==)A)A")EFCMM#& G ! }}c" 'OO##CLLN3::7CUQQ% ", =]^f]ghi]   U8  	H	s0   I2 *J<D
J2
I?>I?
JJJc                    U (       d  g/ nU  H  nUnUR                   S:w  a  UR                  S5      nU(       aM  US:  aG  UR                  U:  d  UR                  U:  a'  [        R
                  " XcU4[        R                  5      nUR                  U5        M     [        S[        [        S[        SU5      -  5      5      5      n[        R                  " 5       n US   R                  USSUSS  USUSS	9  [$        R&                  " UR)                  5       5      R+                  S5      US   R                  US   R                  4$ ! [         a#  n	[         R"                  " S
U	 35         S n	A	gS n	A	ff = f)Nr   r   r   r   i  WEBPT   )r   save_allappend_imagesdurationloopqualitymethodzAnimated WebP encode failed: r   )r   r   r   r   r   r   r   r   r   r   rg   re   r   r   saver1   r2   r   r   r   r   r   )
r   r   r   r   r   r   r   duration_msr   r   s
             r   _encode_animated_webpr      sQ   J77eE"Bw{7(:bii'>Q!!"&8%--HB"  aU4#a+#5678K
,,.C1$QR.  	 		
 CLLN+227;Z]=P=PR\]^R_RfRfff  7s;<s   E	 	
E6E11E6c                    XS   ::  a  US   $ XS   :  a  US   $ [        [        U5      S-
  5       HS  nX   U s=::  a  XS-      ::  d  M  O  M  XS-      X   -
  nUS::  a  X#   s  $ XU   -
  U-  nX#   XRUS-      X#   -
  -  -   s  $    g)Nr   rY   r           )rt   len)txsysr   spanr   s         r   _interp_db_curver      s    qEz!urF{"v3r7Q;5A"E""!e9ru$DqyuUd"A511q5	BE 1222   r   c                     [        U SS 5      =(       d    0 nUR                  S5      nUR                  S5      nSU;  d5  U(       a.  U(       a'  [        U5      [        U5      :w  d  [        U5      S:  a  g UR                  S5      n[	        UR                  UR                  SS5      5      5      n[	        UR                  UR                  S	S
5      5      5      n/ n	U HZ  n
[	        U
5      nUS::  d  Xx::  d
  X:  d  X::  a  U	R                  S 5        M6  X{-
  Xx-
  -  nU	R                  [        XU5      5        M\     U	$ ! [         a#  n[        R                  " SU 35         S nAg S nAff = f)Nextra_optionsdb_curve_xsdb_curve_ysdb_wrapped_samplerr=   model_samplingdb_start_percentr   db_end_percentr[   r   z0[KJ PreviewOverride] DB curve detection failed: )r^   r/   r   get_model_objectfloatpercent_to_sigmar   r   r1   r2   r   )samplermodel_patchersigmas_listextrar   r   msstart_sigma	end_sigmaoutssigr   r   s                 r   _detect_detail_boost_curver      sF   $7=2YY}%YY}%u,BbCGsSUwDVZ]^`ZadeZe++,<=B//		:Lc0RST"--eii8H#.NOP	A(Cax;3s7ISM]

4 "{'>?AJJ'r23  
 J1#NOs   A3D? 6CD? ?
E,	E''E,c                 R   U b  UR                   S:w  a  / $ US:  a  US S 2S S 2S S U24   nUR                  SS5      nUR                  SUR                  SS  -   5      nU R	                  U5      nUc  / $ UR                   S:X  a  UR                  S5      nUR                   S:w  a  / $ UR                  S   nUb^  SUs=:  a  U:  aQ  O  ON[        R                  " SUS-
  U5      R                  5       R                  [        5      R                  5       nXh   nUS	-  R                  SS	5      R                  [        R                  5      R!                  5       R#                  5       n	[%        U	R                  S   5       V
s/ s H  n
[&        R(                  " X   5      PM     sn
$ s  sn
f )
NrS   r   r=   )rY      r   r   r\   )r]   ri   ry   rb   decode_latent_to_preview	unsqueezerc   rd   re   rf   rg   rh   clamprp   r_   rq   rr   rs   rt   r   ru   )ltx_previewerx0_5drv   rw   x_movedx_inr   r}   r~   u8r   s              r   _ltx_decode_to_pilr      se   

a	zaHfHn%mmAq!G??57==#556D

0
0
6C
{	
xx1}mmA
xx1}	iilG!j":7":++a1j9??AHHMTTVl
)		1c	"	%	%ekk	2	6	6	8	>	>	@B,1"((1+,>?,>qEOOBE",>???s   ?"F$c                 L   U b  UR                   S:w  a  / $ US:  a  US S 2S S 2S S U24   n U R                  U5      nUR                   S:X  a  US   nUR                   S:w  a  / $ UR
                  S   nUb^  SUs=:  a  U:  aQ  O  ON[        R                  " SUS-
  U5      R                  5       R                  [        5      R                  5       nXG   nUR                  5       S-  R                  SS5      R                  [        R                   5      R#                  5       R%                  5       n['        UR
                  S   5       V	s/ s H  n	[(        R*                  " X   5      PM     sn	$ ! [         a%  n[        R                  " SU 35        / s S nA$ S nAff = fs  sn	f )NrS   r   z,[KJ PreviewOverride] LTX VAE decode failed: r   r   r\   )r]   r   r1   r2   r   rb   rc   rd   re   rf   rg   rh   r   r   rp   r_   rq   rr   rs   rt   r   ru   )
vaer   rv   rw   imagesr   r}   r~   r   r   s
             r   _ltx_full_vae_decode_to_pilr    sd    {ejjAo	zaHfHn%E" {{a{{a	ll1oG!j":7":++a1j9??AHHMTTV
,,.3
	%	%a	-	0	0	=	A	A	C	I	I	KB,1"((1+,>?,>qEOOBE",>??  FqcJK	 @s#   E/ 
"F!/
F9FFFc                 2    S[        U 5      R                  ;   $ )NLTX)typer?   )rO   s    r   _is_ltx_latent_formatr  /  s    D'0000r   c                 t     U R                   R                  n[        USS5      (       + $ ! [         a     gf = f)Ncaption_projection_first_linearTF)modeldiffusion_modelr^   r1   )r   dms     r   _is_ltx2_diffusion_modelr  3  s=      002@$GGG s   '* 
77c           	      H    [        U S5      (       a  U R                  R                  S5      OS nU(       a\  [        U5      S:  aM  US   R                  S5      nUb6  [	        [
        R                  " USSS S 2S4   5      R                  5       5      $ g! [         a     gf = f)Ncondspositiver   keyframe_idxs)	rK   r  r/   r   rg   r_   uniquenumelr1   )guiderr  kfs      r   _ltx_num_keyframesr  <  s    3:673K3K6<<##J/QUH)!1B~5<<1aA:7==?@@   s   BB 
B! B!c                 p   U(       a  [        U5      S:  az  US   nU R                  S:X  ae  [        U5      S:  aV  SnUSS   H  nU[        U5      -  nM     U S S 2S S 2S U24   R                  U R                  S   /[        U5      SS  -   5      n US:  a  U R                  S:X  a  U S S 2S S 2S U* 24   n U $ )Nr   r   r   rS   )r   r]   rg   ry   rb   list)r   latent_shapesnum_keyframesr   cutds         r   _normalize_ltx_x0r  H  s     ]+a/q!77a<CK1,CABZs1v  Aq$3$J''!VQR8H(HIBqRWW\1o~o%&Ir   c                   $    \ rS rSrSS jrS rSrg)_PreviewOverrideWrapperiW  Nc                     Xl         Ub  [        U5      OS U l        X0l        X@l        XPl        X`l        Xpl        / U l        g r   )	max_resolutionstrnode_idjpeg_qualitysuppress_defaultpreview_framespreview_fpsr  r   )r$   r!  r#  r$  r%  r&  r'  r  s           r   r&    _PreviewOverrideWrapper.__init__X  s>    ,'.':s7|( 0,&r   c                   ^ ^
^(^)^*^+^,^-^.^/^0^1^2^3^4^5^6^7^8 UR                   nUR                  m1[        T1R                  R                  5      m-T-=(       a    [        T15      nT-(       a  [        U5      OSm3S m/S m.S nT-(       a   [        U5      u  pS nT R                  b  T R                  R                  R                  R                  S:X  a  [        R                  R                  5       n T R                  R                  R                  5        H  nUR                   n  O   T R                  R                  R#                  U5        T R                  nOT R                  m.[+        XSUS9m/[-        T1R.                  T1R                  R                  5      m5S m, T1R                  R                  n[1        USS 5      nUb.  [2        R4                  " U[1        USS 5      [1        US	S 5      5      m,Um4T R6                  m2T R8                  m0T R:                  m6/ T l        Ub,  UR?                  5       RA                  5       RC                  5       O/ m7S n Ub  [E        U5      S:  a|  [G        US   S
5      (       a  US   R#                  UR                   5      OUS   nUU-  nT-(       a  [I        UT
T35      nUR?                  5       RK                  5       RA                  5       nUS / S.m8[M        S[E        T75      S-
  5      nT2Gbx  [N        Gbp  T2SUT7(       a  T7S   OS T7S.n[Q        UT1T75      nUb  UUS'    T1R                  R                  n[1        USS 5      nUbL  [E        U5      S:  a=  [G        US   S
5      (       a  US   R#                  UR                   5      OUS   nUU-  nOUnT-(       a  [I        UT
T35      nS nT/b*  URR                  S:X  a  [U        T/USS9nU(       a  US   OS nOcUb`  [2        R4                  " U[1        USS 5      [1        US	S 5      5      nURW                  U5      n [Y        U [Z        RZ                  5      (       a  U nUb  UR\                  S:w  a  UR_                  S5      nT0(       aN  T0S:  aH  UR`                  T0:  d  URb                  T0:  a(  [d        Rf                  " UT0T04[Z        Rh                  5      n[j        Rl                  " 5       n!URo                  U!ST6S9  [p        Rr                  " U!Ru                  5       5      Rw                  S5      US'   UR`                  US'   URb                  US'   [N        Rx                  R{                  SU[N        Rx                  R|                  5        [        5       m+T R                  S:  m*T R                  m)T R                  m(U(U)U*U+U,U-U
U.U/U0U1U2U3U4U5U6U U7U84S jn"/ n#T R                  (       a  [2        R                  /n$[        [2        R                  R                  5       5      n%U%(       aI  U%R                  5       n&U$R                  U&5        U%R                  U&R                  5       5        U%(       a  MI  U$ H@  n&SU&R                  ;   d  M  U#R                  U&U&R                  S   45        [        U&lK        MB      [        R                  " 5       T8S'   U" X#XEUU"XT
S9	T+R                  SS 9  U# H  u  n&n'U'U&lK        M     Ub5  T R                  b'   T R                  R                  R#                  U5        $ $ $ ! [$         a$  n[&        R(                  " SU 35         S nAGNS nAff = f! [$         a$  n[&        R(                  " SU 35         S nAGNS nAff = f! [$         a     GNf = f! [$         a$  n[&        R(                  " SU 35         S nAGNS nAff = f! [$         a$  n[&        R(                  " SU 35         S nAGNS nAff = f! [$         a     $ f = f! T+R                  SS 9  U# H  u  n&n'U'U&lK        M     UbE  T R                  b7   T R                  R                  R#                  U5        f ! [$         a     f f = ff f = f)!Nr   TAEHVz@[KJ PreviewOverride] Could not move TAEHV-LTX to GPU, skipping:    )r   taeltxz1[KJ PreviewOverride] LTX previewer setup failed: rT   rV   rU   rp   u6   [KJ PreviewOverride] initial seed Δ pre-fill failed: )last_x0_cpu	last_timestep_ms_windowr   )r#  steptotalsigmasigmasdb_curverS   rv   r   JPEGr   r   r   imager   hz2Initial noise preview failed (sigmas still sent): kj_preview_overridec           	        > T"c  Tc  TGb   UnT(       a  [        UTT 5      n/ nT(       a  TOSnTb  UR                  S:X  a
  [        TXFS9nU(       d  Tb  UR                  S:X  a   [        TXFS9nU(       d;  T(       a4  UR                  S:X  a$  Tc!  [        UTR                  R                  T5      nU(       d  T"T4 H  nUc  M   UR                  U5      n	[        U	[        R                  5      (       a  U	/n  ONUT"L d  ME  [
        R                  " S[        T"5      R                   S[        U	5      R                   S35        M     U(       d  T!b	  T!" XX#5        g US	   n
U
R                  S
:w  a  U
R!                  S
5      n
XS	'   T$R"                  R%                  U
5        TGb  [&        Gb
  UR)                  5       R+                  5       R-                  5       nT&S   nUT&S'   [.        R0                  " 5       nS nT&S   bA  UT&S   -
  S-  nT&S   nUR%                  U5        [3        U5      S:  a  UR5                  S	5        UT&S'   T&S   (       a  [7        T&S   5      [3        T&S   5      -  OS nS	U s=::  a  [3        T%5      :  a  O  OT%U    OS nU S-   nX[UUUUUU4UUUU#4S jjnTR9                  U5        T!b
  T!" XX#5        g g ! [         a$  n[
        R                  " SU 35         S nAGNS nAff = f! [         a*  nUT"L a  [
        R                  " SU 35         S nAGMi  S nAff = f! [         a#  n[
        R                  " SU 35         S nANS nAff = f)Nr   rS   r5  zLTX preview decode failed: z5Active previewer raised, trying Latent2RGB fallback: zPreview override: z
 returned u5    instead of PIL.Image — falling back to Latent2RGB.r   r   r-  r.  g     @@r/  r+  c                   > [        U 5      S:  aD  Su  pp[        (       a  [        U TT5      u  pn
U(       a  SnU(       d  [        U TTT5      u  pn
SnOU S   nT(       aN  TS:  aH  UR                  T:  d  UR
                  T:  a(  [        R                  " UTT4[        R                  5      n[        R                  " 5       nUR                  USTS9  [        R                  " UR                  5       5      R!                  S5      nUR                  UR
                  pS	nU(       d  g S nUbZ  UR"                  UR"                  :X  a@  X-
  nUR%                  5       ['        SUR)                  5       5      S
-  -  R+                  5       n[,        R.                  R1                  STUUU	U
UUUS UUUUS;   a  TOS S.[,        R.                  R2                  5        g )Nr   )Nr   r   N	video/mp4
image/webpr   r6  r7  r   z
image/jpegg      ?r:  )r=  r>  )r#  r8  mimer   r9  r0  r1  r2  r3  deltastep_msavg_step_msr   )r   _NVENC_AVAILABLEr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rb   normr   r  r4   r	   instance	send_sync	client_id)r   
x0_cpu_nowprev_x0_cpurA  rB  	sigma_val	sent_steptotal_steps_b64w_h_r?  pil_sendr   delta_vdiffanim_fpsr   r#  r   s                   r   _encode_and_sendP_PreviewOverrideWrapper.__call__.<locals>.new_callback.<locals>._encode_and_send0  s   
  #:24D 1#3#32CJPXZa2bKCR'*/:'*2G
T\^egn2oKCR+7D+5a=#*w{QX@X\d\k\knu\u/7/?/?7T[J\^c^k^k/lH&*lln (c&' R&,&6&6s||~&F&M&Mg&V)1B'3#& &&*G*6;;L;LPZP`P`;`'1'?+/99;Q

9MQT9T+T*Z*Z*\(11;; 5/6-0,0)+)+,5-9-6.2-4/63>7;?Z7Z8`d!" !- 5 5 ? ?#r   zPreview override failed: )r  r]   r  r   r1   r2   r   r   r
  rO   r   
isinstancer   r  r?   r   r   r   r   r	   detachr   rr   timeperf_counterr   popsumr,   )'r0  r   r|   rL  x0_viewr   max_pilr   prevr   	pil_firstrH  rI  nowrA  r   rB  rJ  rK  rT  rS  anim_framesanimate_videoencoderfallback_previeweris_ltxr  ltx_full_vaer   r   r   r#  r  original_callback	previewerr   r$   r   states'                       r   new_callback6_PreviewOverrideWrapper.__call__.<locals>.new_callback  sl   $(:(F-Jc~E !G"3G]M"Z!#J-:kG#/GLLA4E%@w%k
%-*CXYHYO);M7)gJ &-GLLA<MR_Rg%?#]%8%8%F%F&
 &%.0B$CD#| ()&*&C&CG&L
  *#u{{;;.1U
 %!%!2 '&8i9Q9Q8RR\'+Cy'9'9&::o%q!" %D$ &,8-dH *1I ~~.$-$5$5e$<	(11KK&&y1*|/G%,^^%5%;%;%=%A%A%C
&+M&:/9m,"//1"& -9'*U;-?'?6&IG %&6 7AHHW-"1vz !a-0k*glm}g~s51A+B'Cc%P`JaFb'b  EI9:d9USEU9UK$5[_	$(1H	 (2Va$+PY&/l3 3j  '78 !,!$A< -c  ) O#OO.I!,MNNO $- )#'9#4$+OO6klmkn4o$p ()D ! EOO&?s$CDDEs{   AL0 (
K 2AL0 K9'L0 AL0 EL0 
K6K1+L0 1K66L0 9
L-L(!L0 (L--L0 0
M:MMdecode_latent_to_preview_imager.  )r  r>   )r:   )O	class_objr   r  r
  rO   r  r  _ltx_rgb_factorsr  first_stage_model	__class__r?   comfymodel_managementget_torch_device
parametersrW   rp   r1   r2   r   _LTXWrappedPreviewerrQ   rN   r^   rH   Latent2RGBPreviewerr#  r!  r$  r   rW  rr   rh   r   rK   r  r   r   r	   r   r]   r   r   rV  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rE  rF  rG  r   r&  r'  r%  LatentPreviewerr  __subclasses__rZ  r   extend__dict__r   rl  rX  rY  r;   )9r$   executornoiselatent_imager   r3  denoise_maskcallbackdisable_pbarseedr  r  is_ltx2vae_restore_devicerz   rZ   r,  target_devicepr   lfrx   initial_seed_cpus0seededtotal_steps_initinit_payloadr4  init_latentpil_initr   noise_previewerr   ibufrj  prev_methodstargetsstackclsr^  rS  ra  rb  rc  rd  re  rf  r   r   r   r#  r  rg  rh  r   r   ri  s9   `         `                             @@@@@@@@@@@@@@@@@r   __call__ _PreviewOverrideWrapper.__call__b  s   ##,,&}':':'H'HID5mD6<*62!
 !Y 0 988'xx11;;DDO(-(>(>(O(O(Qt%)XX%?%?%J%J%L56XX 2 % &M !HH6699-H%)XXF
 (,xx 4WSY Z ((A(A=CVCVCdCde	 "
	$$22B!"&:DAK&%3%G%GB 94@B <dC&" %,,%%## 9?8Jfmmo))+224PR		Z!c&kAo3:6!9d3K3KVAY\\%,,/QWXYQZ.v}mTF#)==?#8#8#:#>#>#@  !1tWYZq#k"2Q"67 <#;")+6QD%L 2'=+VH#+3Z("Z"((66%b*>E%#f+/7>vay$7O7Oell3U[\]U^B"'"*K"'K"3KP]"^K ,1A1AQ1F!3M;[\!]J0:z!}H ,&4&H&H#$=tD$@$G'O
 *BB;OC!#u{{33#&'}}-#+#3#3E#:7Q;HNNW4LPXP_P_biPi#+#3#3Hw>PRWR_R_#`<<>DMM$vwMG,2,<,<T]]_,M,T,TU\,]L)(0L%(0L% !!++,A<Q]QfQfQpQpq&(++a/))##B	= B	= B	=L   %556G77FFHIEiiks#S//12 % 3s||C ''cll;[.\(]^9RC6 	!%!2!2!4E+E,P\^j  AN  O3/)	T592 *!-$((2FHH..112DE 3G-G  ) t#OO.nopnq,rsst  Y"STUSV WXXY   		*  	ZOOTUVTWXYY	Zh  Z"TUVTW XYYZN !  3/)	T592 *!-$((2FHH..112DE   3G-s   A(] *A(\ ] A]> B^ .H_  "` 4%_1
]
&]?] ]

] 
];]66];>
^^
^=^88^= 
_.
_))_.1
_>=_>3a-5%aa-
a(%a-'a((a-)r   r$  r!  r#  r'  r&  r%  r  )r      N)r?   r@   rA   rB   r&   r  rE   r   r   r   r  r  W  s    cr   r  c                   p    \ rS rSr\S\R                  4S j5       r\SS\R                  4S jj5       r	Sr
g)ModelPreviewOverrideKJi  returnc                 \   [         R                  " SSSS[         R                  R                  SSS9[         R                  R                  SS	S
SSSS9[         R                  R                  SSSSSSS9[         R
                  R                  SSSS9[         R                  R                  SSSS	SSS9[         R                  R                  SSSSSSS9[         R                  R                  SSS S!9/[         R                  R                  S"S9/[         R                  R                  /SS#9$ )$Nr  zModel Preview OverrideKJNodes/samplingu,  Adds a dedicated live-preview frame on this node, with overridable max resolution. Default ComfyUI preview caps at 512px; this node sends its own preview straight to a DOM widget on the node so pixel-space models (Chroma Radiance, ZImage, HiDream-O1, …) can be previewed at full sampler resolution.r
  z(Model to attach the preview override to.tooltipr!  i   r   i    r+  z[Max preview side in pixels for the live widget. 0 = full sampler resolution (no downscale).)defaultminr   r0  r  r$  P      d   r   z,JPEG quality for the live preview transport.suppress_default_previewTzSuppress the standard sampler-node preview overlay while sampling, so only this node's frame updates. Progress bar still advances normally.)r  r  r&  zFrames to sample from each video step's latent for animated preview. 1 = single frame (current behavior, fastest). >1 = animated WebP playing back at preview_fps. Only applies to video models (5D latents); ignored for image models.r'  r  <   zJPlayback FPS for the animated WebP preview. Ignored when preview_frames=1.r  u   Optional LTX VAE for true-RGB previews. TAEHV-LTX = fast tiny decode (VAE pinned to GPU). Any other LTX VAE = full-quality decode via vae.decode() — MUCH slower per step.)optionalr  z%Model with preview override attached.)r#  display_namecategorydescriptioninputsoutputshiddenis_experimental)
r   SchemaModelInputIntBooleanVaeOutputHidden	unique_idr  s    r   define_schema$ModelPreviewOverrideKJ.define_schema  sX   yy,1'? w0Z[$ y   "J   

  .  j ! 
 $c  	 !h   !E  S0b XX__-T_UVII''( {>
 >	
r   Nc                     UR                  5       nUR                  [        R                  R                  R
                  S[        X R                  R                  X4XVU5      5        [        R                  " U5      $ )Nr:  )cloneadd_wrapper_with_keyrq  patcher_extension
WrappersMPOUTER_SAMPLEr  r  r  r   
NodeOutput)	r  r
  r!  r$  r  r&  r'  r  ms	            r   executeModelPreviewOverrideKJ.execute  s`    KKM	##..;;!#

 4 4lS	
 }}Qr   r   r   r?   r@   rA   rB   classmethodr   r  r  r  r  rE   r   r   r   r  r    sN    ?
bii ?
 ?
B 
   A  L  L 
  
 r   r  c                   l    \ rS rSr\S\R                  4S j5       r\S\R                  4S j5       r	Sr
g)GetPreviewOverrideFramesKJi  r  c                     [         R                  " SSSS[         R                  R                  SSS9[         R                  R                  S[         R
                  [         R                  /S	S9/[         R                  R                  S
S9/SS9$ )Nr  zGet Preview Override Framesr  zReturns the frames captured by Model Preview Override during the most recent sampling. Wire 'model' from Model Preview Override (the same one feeding the sampler) and 'after_sample' from after the sampler (LATENT/IMAGE) to enforce correct execution order.r
  zPThe model output by Model Preview Override (used to locate the captured frames).r  after_sampleu{   Anything from after the sampler (LATENT or IMAGE). The value is ignored — it just forces this node to run after sampling.r   )r  T)r#  r  r  r  r  r  r  )r   r  r  r  	MultiTypeLatentr   r  r  s    r   r  (GetPreviewOverrideFramesKJ.define_schema  s    yy06'\
 w  1C  D"""YY) Z #  XX__(_;< %
 	
r   c                    UR                  [        R                  R                  R                  S5      nU(       d  [        S5      eUS   R                  nU(       d  [        S5      e/ nU HN  n[        R                  " U[        R                  S9S-  nUR                  [        R                  " U5      5        MP     [        R                  " [        R                  " USS95      $ )	Nr:  zSGet Preview Override Frames: no Model Preview Override wrapper found on this model.rY   zXGet Preview Override Frames: no frames captured. Ensure the sampler ran with this model.)rX   g     o@r   )dim)get_wrappersrq  r  r  r  RuntimeErrorr   rc   asarrayfloat32r   r_   
from_numpyr   r  r  )r  r
  r  wrappersr   tensorspilarrs           r   r  "GetPreviewOverrideFramesKJ.execute  s    %%e&=&=&H&H&U&UWlmtuu"$$yzzC**S

3e;CNN5++C01  }}U[[a899r   r   Nr  r   r   r   r  r    s>    
bii 
 
, :R]] : :r   r  )r   )Nr   )4r   r   r   r2   r   r   rX  rs   rc   r_   comfy.model_managementrq  comfy.patcher_extensionrH   comfy_api.latestPILr   r   
ltxv_nodesr   ru  r   rn  r1   r   r   serverr	   ImportErrorr   r   rQ   r   r   rC  r   r   r   r   r   r   r   r   r  r  r  r  r  r  	ComfyNoder  r  r   r   r   <module>r     s'               m# 0  0F*>  >  6rg< 4@.@01	n nb	N R\\ N b$: $:M  OOLQCOhij  Ls)   C C4 C1C,,C14C?>C?