Ë
    ÛÓ^j:*  ã                   ó¨  — d dl Z d dlZddlmZ ddlmZmZ ddlmZm	Z	m
Z
mZmZmZmZ ddlmZmZ ddlmZ  e«       rddlmZ  e
«       rd dlZ e«       rd d	lmZ n e«       rd d	lmZ  ej4                  e«      Z G d
„ ded¬«      ZdZdededededede eef   fd„Z!dddeddfd„Z"dddddede d   fd„Z# e	de«       G d„ de«      «       Z$dgZ%y) é    Né   )ÚBatchFeature)ÚUnpackÚVideosKwargs)Ú
TensorTypeÚadd_start_docstringsÚis_torch_availableÚis_torchvision_availableÚis_torchvision_v2_availableÚis_vision_availableÚlogging)ÚBASE_VIDEO_PROCESSOR_DOCSTRINGÚBaseVideoProcessor)Ú
VideoInput)ÚPILImageResampling)Ú
functionalc                   ó0   — e Zd ZU dZeed<   eed<   eed<   y)ÚGemma4VideoProcessorKwargsa_  
    patch_size (`int`, *optional*):
        Size of each image patch in pixels.
    max_soft_tokens (`int`, *optional*):
        Maximum number of soft (vision) tokens per video frame.
        Must be one of {70, 140, 280, 560, 1120}.
    pooling_kernel_size (`int`, *optional*):
        Spatial pooling kernel size applied after patchification.
    Ú
patch_sizeÚmax_soft_tokensÚpooling_kernel_sizeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚintÚ__annotations__© ó    ú}/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/gemma4/video_processing_gemma4.pyr   r   0   s   … ñð ƒOØÓØÔr   r   F)Útotal)éF   éŒ   i  i0  i`  ÚheightÚwidthr   Úmax_patchesr   Úreturnc                 óp  — | |z  }||dz  z  }t        j                  ||z  «      }|| z  }||z  }	||z  }
t        t        j                  ||
z  «      «      |
z  }t        t        j                  |	|
z  «      «      |
z  }|dk(  r|dk(  rt	        d||z  › d�«      ‚||dz  z  |
z  }|dk(  r1|
}t        t        t        j                  || z  «      «      |
z  |«      }n5|dk(  r0|
}t        t        t        j                  | |z  «      «      |
z  |«      }||z  |kD  rt	        d| › d|› d|› d|› d|› d	|› �«      ‚||fS )
a  
    Image is resized to preserve aspect ratio so it fits within the patch budget.
    Target dimensions are the largest that:
    1) Produce at most `max_patches` patches when patchified with `patch_size`
    2) Have height and width divisible by `pooling_kernel_size * patch_size`
    é   r   zpAttempting to resize to a 0 x 0 image. Resized height should be divisible by `pooling_kernel_size * patch_size`=ú.z
Resizing [Úxz] to [z] but this exceeds z patches with patch_size )ÚmathÚsqrtr   ÚfloorÚ
ValueErrorÚmin)r$   r%   r   r&   r   Útotal_pxÚ	target_pxÚfactorÚideal_heightÚideal_widthÚ	side_multÚtarget_heightÚtarget_widthÚmax_side_lengths                 r    Ú get_aspect_ratio_preserving_sizer:   D   s˜  € ð ˜‰~€HØ˜z¨1™}Ñ-€IÜ�Y‰Y�y 8Ñ+Ó,€FØ˜F‘?€LØ˜5‘.€KØ# jÑ0€Iô œŸ
™
 <°)Ñ#;Ó<Ó=À	ÑI€MÜ”t—z‘z +°	Ñ"9Ó:Ó;¸iÑG€Lð ˜Ò˜l¨aÒ/Üð2Ø2EÈ
Ñ2RÐ1SÐSTðVó
ð 	
ð
 #Ð&9¸1Ñ&<Ñ<À	ÑI€OØ˜ÒØ!ˆÜÜ”—
‘
˜5 6™>Ó*Ó+¨iÑ7Øó
‰ð 
˜Ò	Ø ˆÜÜ”—
‘
˜6 E™>Ó*Ó+¨iÑ7Øó
ˆð
 �|Ñ# iÒ/ÜØ˜˜  % ¨¨}¨o¸Q¸|¸nð M Ø +˜}Ð,EÀjÀ\ðSó
ð 	
ð
 ˜,Ð&Ð&r   Úvideoútorch.Tensorc                 óÀ   — | j                   \  }}}}||z  }||z  }| j                  ||||||«      }|j                  dddddd«      }|j                  |||z  d«      }|S )zÙ
    Convert 4D tensor video of shape (num_frames, num_channels, height, width) into 3D tensor of patches of shape
    (num_frames, num_patches_height * num_patches_width, patch_size * patch_size * num_channels).
    r   r)   é   r   é   é   éÿÿÿÿ)ÚshapeÚreshapeÚpermute)	r;   r   Ú
num_framesÚnum_channelsr$   r%   Únum_patches_heightÚnum_patches_widthÚpatched_videos	            r    Úconvert_video_to_patchesrJ   z   sˆ   € ð
 /4¯k©kÑ+€J�˜f eØ :Ñ-ÐØ Ñ+ÐØ—M‘MØ�LÐ"4°jÐBSÐU_ó€Mð "×)Ñ)¨!¨Q°°1°a¸Ó;€MØ!×)Ñ)¨*Ð6HÐK\Ñ6\Ð^`Óa€MØÐr   Ú	positionsÚtarget_length)r<   r<   c                 ó  — | j                   d   }||z
  }|dkD  rjddd|ddg}ddd|ddf}t        j                  j                  j	                  | |dd¬«      } t        j                  j                  j	                  ||dd¬«      }| |fS )z6
    Pad the video along to max number of patches
    r@   r   Úconstant)ÚmodeÚvaluerA   )rB   ÚtorchÚnnr   Úpad)r;   rK   rL   Úcurrent_lengthÚpadding_lengthÚpaddingÚpos_paddings          r    Úpad_to_max_patchesrX   Š   s™   € ð —[‘[ ‘^€NØ" ^Ñ3€NØ˜ÒØ�a˜˜N¨A¨qÐ1ˆØ˜!˜Q °°1Ð5ˆÜ—‘×#Ñ#×'Ñ'¨¨w¸ZÈqÐ'ÓQˆÜ—H‘H×'Ñ'×+Ñ+¨I°{ÈÐ[]Ð+Ó^ˆ	Ø�)ÐÐr   zbConstructs a Gemma4 video processor that samples frames from videos for use with the Gemma4 model.c                   óž  ‡ — e Zd Zej                  Zg d¢Zg d¢ZdZdZ	dZ
dZdZdZdZdZdZdZdZeZd	d
gZdee   fˆ fd„Zˆ fd„Zdej4                  dedededej:                  dej4                  fd„Zdedee   de fˆ fd„Z!	 	 	 d#de"d   de#de#ddde#de$de#de$e"e$   z  dz  de$e"e$   z  dz  d e%e&z  dz  dedz  d!edz  dedz  de fd"„Z'ˆ xZ(S )$ÚGemma4VideoProcessor)ç        r[   r[   )ç      ð?r\   r\   NTé    é   r"   r   Úpixel_values_videosÚvideo_position_idsÚkwargsc                 óˆ   •— t        ‰| �  di |¤Ž | j                  t        vr t	        dt        › d| j                  › d�«      ‚y )Nú!`max_soft_tokens` must be one of ú, got r*   r   )ÚsuperÚ__init__r   Ú_SUPPORTED_SOFT_TOKENSr/   ©Úselfra   Ú	__class__s     €r    rf   zGemma4VideoProcessor.__init__°   sN   ø€ Ü‰ÑÑ"˜6Ò"à×ÑÔ'=Ñ=ÜÐ@ÔAWÐ@XÐX^Ð_c×_sÑ_sÐ^tÐtuÐvÓwÐwð >r   c                 ó.   •— d|d<   t        ‰| �  di |¤Ž y )NFÚ	do_resizer   )re   Ú_validate_preprocess_kwargsrh   s     €r    rm   z0Gemma4VideoProcessor._validate_preprocess_kwargs¶   s   ø€ ð
 $ˆˆ{ÑÜ‰Ñ+Ñ5¨fÓ5r   r;   r   r&   r   Úresampler'   c                 ó²   — |j                   d   |j                   d   }}t        |||||¬«      \  }}	||k(  r|	|k(  r|S t        j                  |||	g|d¬«      S )NéþÿÿÿrA   )r$   r%   r   r&   r   T)ÚsizeÚinterpolationÚ	antialias)rB   r:   ÚtvFÚresize)
ri   r;   r   r&   r   rn   r$   r%   r7   r8   s
             r    Úaspect_ratio_preserving_resizez3Gemma4VideoProcessor.aspect_ratio_preserving_resize¾   ss   € ð Ÿ™ B™¨¯©°R©�ˆÜ&FØØØ!Ø#Ø 3ô'
Ñ#ˆ�|ð ˜FÒ" |°uÒ'<ØˆLä�z‰zØØ Ð.Ø"Øô	
ð 	
r   Úvideosc                 ó$   •— t        ‰| �  |fi |¤ŽS )N)re   Ú
preprocess)ri   rw   ra   rj   s      €r    ry   zGemma4VideoProcessor.preprocessÙ   s   ø€ ô
 ‰wÑ! &Ñ3¨FÑ3Ð3r   r<   Údo_convert_rgbrl   z"tvF.InterpolationMode | int | NoneÚ
do_rescaleÚrescale_factorÚdo_normalizeÚ
image_meanÚ	image_stdÚreturn_tensorsr   c           	      óÒ  — |t         vrt        dt         › d|› d�«      ‚||dz  z  }g }g }g }d}|D �]s  }|r| j                  |«      }|r| j                  |||||¬«      }| j	                  ||||||	«      }|j
                  d   }|j
                  d   |z  }|j
                  d	   |z  }t        ||«      }|j                  |j
                  d   |dz  z  «       |j                  }t        j                  t        j                  ||¬
«      t        j                  ||¬
«      d¬«      }t        j                  |d	¬«      }|j                  |j
                  d   d«      }|d   j                  |dd«      }t        |||«      \  }}|j                  |«       |j                  |«       �Œv t        j                  |d¬«      }t        j                  |d¬«      }|||dœ}t!        ||
¬«      S )Nrc   rd   r*   r)   r@   )r;   r   r&   r   rn   r   rp   rA   )ÚdeviceÚxy)Úindexing)Údim)N.)r_   r`   Únum_soft_tokens_per_video)ÚdataÚtensor_type)rg   r/   Úconvert_to_rgbrv   Úrescale_and_normalizerB   rJ   Úappendr‚   rQ   ÚmeshgridÚarangeÚstackrC   ÚrepeatrX   r   )ri   rw   rz   rl   rn   r{   r|   r}   r~   r   r€   r   r   r   ra   r&   Úpixel_valuesÚposition_idsr†   rE   r;   Úpatch_heightÚpatch_widthÚpatchesr‚   Ú
patch_gridÚstacked_gridÚreal_positionsrK   r‡   s                                 r    Ú_preprocessz Gemma4VideoProcessor._preprocessà   s  € ð" Ô"8Ñ8ÜÐ@ÔAWÐ@XÐX^Ð_nÐ^oÐopÐqÓrÐrà%Ð(;¸QÑ(>Ñ>ˆàˆØˆØ$&Ð!Øˆ
àó  	+ˆEÙØ×+Ñ+¨EÓ2�ÙØ×;Ñ;ØØ)Ø +Ø(;Ø%ð <ó �ð ×.Ñ.¨u°jÀ.ÐR^Ð`jÐluÓvˆEàŸ™ Q™ˆJØ Ÿ;™; r™?¨jÑ8ˆLØŸ+™+ b™/¨ZÑ7ˆKÜ.¨u°jÓAˆGØ%×,Ñ,¨W¯]©]¸1Ñ-=ÐATÐVWÑAWÑ-WÔXà—\‘\ˆFÜŸ™Ü—‘˜[°Ô8Ü—‘˜\°&Ô9ØôˆJô
 !Ÿ;™; z°rÔ:ˆLØ)×1Ñ1°'·-±-ÀÑ2BÀAÓFˆNØ+¨IÑ6×=Ñ=¸jÈ!ÈQÓOˆNä!3°G¸^È[Ó!YÑˆG�YØ×Ñ Ô(Ø×Ñ 	Ö*ðA 	+ôF —{‘{ <°QÔ7ˆÜ—{‘{ <°QÔ7ˆð $0Ø".Ø)Bñ
ˆô
  °>ÔBÐBr   )NNN))r   r   r   r   ÚBICUBICrn   r~   r   rq   Údefault_to_squarerz   rl   r{   r}   rE   Údo_sample_framesr   r   r   r   Úvalid_kwargsÚmodel_input_namesr   rf   rm   rQ   ÚTensorr   rt   ÚInterpolationModerv   r   r   ry   ÚlistÚboolÚfloatÚstrr   r˜   Ú__classcell__)rj   s   @r    rZ   rZ   š   sá  ø„ ð
 "×)Ñ)€HÚ €JÚ€IØ€DØÐØ€NØ€IØ€JØ€LØ€JØÐØ€JØ€OØÐØ-€LØ.Ð0DÐEÐðx Ð(BÑ!Cõ xô6ð
à�|‰|ð
ð ð
ð ð	
ð
 !ð
ð ×'Ñ'ð
ð 
�‰ó
ð64àð4ð Ð3Ñ4ð4ð 
õ	4ð& "&Ø&*Ø*.ñFCà�^Ñ$ðFCð ðFCð ð	FCð
 7ðFCð ðFCð ðFCð ðFCð ˜D ™KÑ'¨$Ñ.ðFCð ˜4 ™;Ñ&¨Ñ-ðFCð ˜jÑ(¨4Ñ/ðFCð ˜$‘JðFCð ˜t™ðFCð ! 4™ZðFCð  
÷!FCr   rZ   )&r,   rQ   Úimage_processing_utilsr   Úprocessing_utilsr   r   Úutilsr   r   r	   r
   r   r   r   Úvideo_processing_utilsr   r   Úvideo_utilsr   Úimage_utilsr   Útorchvision.transforms.v2r   rt   Útorchvision.transformsÚ
get_loggerr   Úloggerr   rg   r   Útupler:   rJ   rX   rZ   Ú__all__r   r   r    ú<module>r±      s>  ðó ã å 2ß 4÷÷ ñ ÷ YÝ %ñ ÔÝ1áÔÛáÔ Þ;ÙÔÝ8ð 
ˆ×	Ñ	˜HÓ	%€ô °Uõ ð  3Ð ð3'Øð3'àð3'ð ð3'ð ð	3'ð
 ð3'ð ˆ3�ˆ8�_ó3'ðl Nð Àð Èó ð ØðØ&4ðØEHðà
Ð)Ñ*óñ  ØhØ"óôHCÐ-ó HCó	ðHCðV "Ð
"�r   