Ë
    ÜÓ^jÇ8  ã                   ó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 ddlmZmZ ddlmZmZmZ ddlmZ dd	lmZmZmZ  e«       rd dlmZ  ej:                  e«      Zd
Z dZ!dZ"dZ#dZ$de%d   de%e&   fd„Z'de&de(e&e&f   fd„Z) G d„ ded¬«      Z* G d„ de«      Z+dgZ,y)é    N)Ú
functionalé   )ÚBatchFeatureÚget_size_dict)ÚIMAGENET_STANDARD_MEANÚIMAGENET_STANDARD_STDÚPILImageResamplingÚSizeDict)ÚUnpackÚVideosKwargs)Ú
TensorTypeÚis_torchvision_availableÚlogging)ÚBaseVideoProcessor)ÚVideoMetadataÚgroup_videos_by_shapeÚreorder_videoszºYou are a helpful language and vision assistant. You are able to understand the visual content that the user provides, and assist the user with a variety of tasks using natural language.zgYou are provided the following series of {frame_count} frames from a {video_duration} [H:MM:SS] video.
z

z
Frame from {timestamp}:i   Úvideosútorch.TensorÚreturnc                 óŽ   — t        d«      x}}| D ]0  }|j                  «       dd \  }}t        ||«      }t        ||«      }Œ2 ||fS )zH
    Get the maximum height and width across all videos in a batch.
    z-inféþÿÿÿN)ÚfloatÚsizeÚmax)r   Ú
max_heightÚ	max_widthÚvideoÚheightÚwidths         ú/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/smolvlm/video_processing_smolvlm.pyÚget_max_height_widthr"   0   s\   € ô # 6›]Ð*€J�Øò *ˆØŸ
™
› R SÐ)‰ˆ�Ü˜ Ó,ˆ
Ü˜˜yÓ)‰	ð*ð ˜	Ð"Ð"ó    Úresolution_max_sidec                 ó:  — | j                  «       dd \  }}t        t        |«      }|€t        ||«      n|}||z  }||k\  r|}t	        ||z  «      }|dz  dk7  r(|dz  }n"||kD  r|}t	        ||z  «      }|dz  dk7  r|dz  }t        |d«      }t        |d«      }||fS )a±  
    Get the output size of the video after resizing given a dictionary specifying the max and min sizes.
    Args:
        video (`np.ndarray`):
            Video to resize.
        resolution_max_side (`int`):
            The longest edge of the video will be resized to this value. The shortest edge will be resized to keep the
            input aspect ratio.
    Returns:
        The output size of the video after resizing.
    r   Né   r   é   )r   ÚminÚMAX_IMAGE_SIZEr   Úint)r   r$   r   r    Úaspect_ratios        r!   Úget_resize_output_image_sizer,   <   sÆ   € ð —J‘J“L  Ð%�M€FˆEô œnÐ.AÓBÐØ0CÐ0Kœ#˜f eÔ,ÐQdÐØ˜6‘>€Là�‚Ø#ˆÜ�U˜\Ñ)Ó*ˆØ�A‰:˜Š?Ø�a‰K‰FØ	�%ŠØ$ˆÜ�F˜\Ñ)Ó*ˆØ�1‰9˜Š>Ø�Q‰JˆEä�˜‹^€FÜ��q‹M€Eà�5ˆ=Ðr#   c                   ó"   — e Zd ZU eeef   ed<   y)ÚSmolVLMVideoProcessorInitKwargsÚmax_image_sizeN)Ú__name__Ú
__module__Ú__qualname__ÚdictÚstrr*   Ú__annotations__© r#   r!   r.   r.   d   s   … Ø˜˜c˜‘NÔ"r#   r.   F)Útotalc                   óz  ‡ — e Zd Zej                  ZddiZddiZeZ	e
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	 	 d(dddedddeddf
ˆ fd„Z	 	 d)dddeeef   dededef
d„Z	 	 	 d*deded
z  deez  d
z  ded
z  fd„Z	 d+de d   dedededdd e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  fd'„Z#ˆ xZ$S ),ÚSmolVLMVideoProcessorÚlongest_edgei°  il  TFÚpixel_valuesÚpixel_attention_maskÚkwargsc                 óÌ   •— t        ‰| �  di |¤Ž d|v rd|v r|d   |d   d<   d|v r=|d   d   | _        |d   d   | _        t	        |d   d   | j
                  ¬«      | _        y y )Nr   Úvideo_samplingÚ
video_sizeÚ
max_framesÚfps)Údefault_to_squarer6   )ÚsuperÚ__init__Ú
num_framesrB   r   rC   r   )Úselfr=   Ú	__class__s     €r!   rE   zSmolVLMVideoProcessor.__init__w   sŠ   ø€ Ü‰ÑÑ"˜6Ò"ð �VÑÐ 0°FÑ :Ø5;¸F±^ˆFÐ#Ñ$ \Ñ2à˜vÑ%Ø$Ð%5Ñ6°|ÑDˆDŒOØÐ.Ñ/°Ñ6ˆDŒHÜ% fÐ-=Ñ&>¸|Ñ&LÐ`d×`vÑ`vÔwˆD�Ið &r#   Nr   r   r   Úresamplez7PILImageResampling | tvF.InterpolationMode | int | NoneÚ	antialiasr   c                 óŒ  •— |j                   rt        ||j                   ¬«      }n@|j                  r%|j                  r|j                  |j                  f}nt	        d|› d�«      ‚t
        ‰| �  |t        |d   |d   ¬«      ||¬«      }t        | j                  d   | j                  d   ¬«      }t
        ‰| �  ||||¬«      }|S )	a'  
        Resize an video to `(size["height"], size["width"])`.
        Args:
            video (`torch.Tensor`):
                Video to resize.
            size (`SizeDict`):
                Dictionary in the format `{"height": int, "width": int}` specifying the size of the output video.
            resample (`PILImageResampling` or `InterpolationMode`, *optional*, defaults to `InterpolationMode.BILINEAR`):
                Resampling filter to use when resizing the video.
        Returns:
            `torch.Tensor`: The resized video.
        )r$   zHSize must contain 'height' and 'width' keys, or 'longest_edge' key. Got ú.r   r'   )r   r    )rI   rJ   r:   )	r:   r,   r   r    Ú
ValueErrorrD   Úresizer
   r/   )	rG   r   r   rI   rJ   r=   Únew_sizeÚmax_sizerH   s	           €r!   rN   zSmolVLMVideoProcessor.resizeƒ   sË   ø€ ð( ×Òô 4ØØ$(×$5Ñ$5ô‰Hð �[Š[˜TŸZšZØŸ™ T§Z¡ZÐ0‰HäÐgÐhlÐgmÐmnÐoÓpÐpä‘‘Ø”8 8¨A¡;°h¸q±kÔBÈXÐajð ó 
ˆô  4×#6Ñ#6°~Ñ#FÈd×NaÑNaÐbpÑNqÔrˆÜ‘‘˜u h¸ÈY�ÓWˆØˆr#   Úpadded_sizeÚmax_num_framesÚfillÚreturn_pixel_maskc                 óò  — |j                  «       dd }|j                  dk(  r|j                  d   n|j                  d   }|d   |d   z
  }|d   |d   z
  }	||z
  }
|	dk  s
|dk  s|
dk  rt        d|› d|› d|› d	|› d
�	«      ‚||k7  s|
dkD  r"d|	d|ddd|
g}t	        j
                  |||¬«      }d}|rBt        j                  |dddd…dd…f   t        j                  ¬«      }d|dd|d   …d|d   …f<   ||fS )a*  Pads the sample with empty video to the padded_size
        Args:
            video (`torch.Tensor`):
                Batched video to pad.
            padded_size (`tuple[int, int]`):
                Height and width to pad.
            max_num_frames (`int`):
                The maximum number of frames to which video will be padded.
            fill (`int`, *optional*):
                The value to use for the padding.
            return_pixel_mask (`bool`, *optional*, defaults to `True`):
                Whether to return a pixel mask.
        r   Né   r'   r   z‰Padding dimensions are negative. Please make sure that the padded size is larger than the original size. Got padded max number of frames z and padded size: z, original number of frames z and size: rL   )Úvalue.©Údtype)	r   ÚndimÚshaperM   ÚFÚpadÚtorchÚ
zeros_likeÚint64)rG   r   rQ   rR   rS   rT   Úoriginal_sizerF   Úpadding_heightÚpadding_widthÚpadding_frameÚpaddingÚ
pixel_masks                r!   r]   zSmolVLMVideoProcessor.pad­   sQ  € ð* Ÿ
™
› R SÐ)ˆØ',§z¡z°Q¢�U—[‘[ ’^¸E¿K¹KÈ¹Nˆ
Ø$ Q™¨-¸Ñ*:Ñ:ˆØ# A™¨°qÑ)9Ñ9ˆØ&¨Ñ3ˆØ˜1Ò °Ò 2°mÀaÒ6GÜðBØBPÐAQÐQcÐdoÐcpð q-Ø-7¨L¸ÀMÀ?ÐRSðUóð ð
 ˜KÒ'¨=¸1Ò+<Ø˜-¨¨N¸A¸qÀ!À]ÐSˆGÜ—E‘E˜% °Ô5ˆEð ˆ
ÙÜ×)Ñ)¨%°°Qºº1°Ñ*=ÄUÇ[Á[ÔQˆJØFGˆJ�sÐ.˜m¨AÑ.Ð.Ð0B°-ÀÑ2BÐ0BÐBÑCà�jÐ Ð r#   ÚmetadatarF   rB   Ú	skip_secsc                 ó"  — |�t        |dd«      €t        d«      ‚|�|n| j                  }|�|n| j                  }|j                  }t        t        ||d   z  «      «      }t        ||«      }|dk  rd}d}	|dz
  }
|dkD  r6|d   d|z  z
  ||z  kD  r%t        ||d   z  «      }	t        |||d   z  z
  «      }
t        d|	«      }	t        |
|dz
  «      }
|	|
k\  rd|dz
  }
}	t        j                  |	|
|t
        ¬«      }t        j                  |«      }|S )	a!  
        Video sampling function which:
            - Uses `num_frames` (if provided) or calculates it from `fps` and metadata.
            - Applies a basic center-skip if fewer frames than available, otherwise
                optionally skips `skip_secs` from both the start and end.
            - Uniformly samples the desired number of frames between the start and end indices.

        Args:
            metadata (`VideoMetadata`):
                Metadata of the video containing information about total duration, fps and total number of frames.
            num_frames (`int`, *optional*):
                Maximum number of frames to sample. Defaults to `self.num_frames`.
            fps (`int` or `float`, *optional*):
                Target frames to sample per second. Defaults to `self.fps`.
            skip_secs (`float`, *optional*, defaults to `1`):
                Number of seconds to skip from the start and end if the video is long enough.

        Returns:
            np.ndarray:
                Indices to sample video frames.
        NrB   z¶Asked to sample frames per second but no video metadata was provided which is required when sampling in SmolVLM. Please pass in `VideoMetadata` object or set `do_sample_frames=False`Údurationr'   r   r&   rX   )ÚgetattrrM   rF   rB   Útotal_num_framesr*   Úroundr(   r   ÚnpÚlinspaceÚunique)rG   rg   rF   rB   rh   r=   rl   Úestimated_framesÚdesired_framesÚ	start_idxÚend_idxÚindicess               r!   Úsample_framesz#SmolVLMVideoProcessor.sample_framesÚ   sK  € ð: Ðœw x°¸Ó=ÐEÜðXóð ð
 $.Ð#9‘Z¸t¿¹ˆ
Ø�_‰c¨$¯(©(ˆØ#×4Ñ4Ðô œu S¨8°JÑ+?Ñ%?Ó@ÓAÐô Ð-¨zÓ:ˆØ˜AÒØˆNð ˆ	Ø" QÑ&ˆà�qŠ=˜h zÑ2°Q¸±]ÑBÀzÐTWÑGWÒXÜ˜I¨°©Ñ7Ó8ˆIÜÐ*¨Y¸À%¹Ñ-HÑHÓIˆGä˜˜9Ó%ˆ	Ü�gÐ/°!Ñ3Ó4ˆØ˜ÒØ!"Ð$4°qÑ$8�wˆIä—+‘+˜i¨°.ÌÔLˆÜ—)‘)˜GÓ$ˆàˆr#   r   Údo_convert_rgbÚ	do_resizeÚ
do_rescaleÚrescale_factorÚdo_normalizeÚdo_padÚ
image_meanÚ	image_stdÚreturn_tensorsc           	      óÎ  — t        |«      \  }}i }|j                  «       D ]3  \  }}|r| j                  |«      }|r| j                  |||¬«      }|||<   Œ5 t	        ||«      }t        |«      \  }}i }|j                  «       D ]   \  }}| j                  |||||
|«      }|||<   Œ" t	        ||«      }|	r€t        |«      }t        d„ |D «       «      }t        |«      \  }}i }i }|j                  «       D ]&  \  }}| j                  |||¬«      \  }}|||<   |||<   Œ( t	        ||«      }t	        ||«      }d|i}|	r |	r|�t        j                  d¬«      n|d<   t        ||¬«      S )	N)r   rI   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­w©N)Úlen)Ú.0r   s     r!   ú	<genexpr>z4SmolVLMVideoProcessor._preprocess.<locals>.<genexpr>A  s   è ø€ Ò J°¤ U§Ñ Jùs   ‚)rQ   rR   r;   r   )Údimr<   )Útensor_type)r   ÚitemsÚconvert_to_rgbrN   r   Úrescale_and_normalizer"   r   r]   r^   Ústackr   )rG   r   rw   rx   r   rI   ry   rz   r{   r|   r}   r~   r   r=   Úgrouped_videosÚgrouped_videos_indexÚresized_videos_groupedr[   Ústacked_videosÚresized_videosÚprocessed_videos_groupedÚprocessed_videosÚpad_sizerR   Úprocessed_padded_mask_groupedÚpadded_masksr<   Údatas                               r!   Ú_preprocessz!SmolVLMVideoProcessor._preprocess  sæ  € ô  0EÀVÓ/LÑ,ˆÐ,Ø!#ÐØ%3×%9Ñ%9Ó%;ò 	;Ñ!ˆE�>ÙØ!%×!4Ñ!4°^Ó!D�ÙØ!%§¡¨^À$ÐQY Ó!Z�Ø,:Ð" 5Ò)ð	;ô (Ð(>Ð@TÓUˆä/DÀ^Ó/TÑ,ˆÐ,Ø#%Ð Ø%3×%9Ñ%9Ó%;ò 	=Ñ!ˆE�>Ø!×7Ñ7Ø 
¨N¸LÈ*ÐV_óˆNð /=Ð$ UÒ+ð		=ô *Ð*BÐDXÓYÐáÜ+Ð,<Ó=ˆHÜ Ñ JÐ9IÔ JÓJˆNÜ3HÐIYÓ3ZÑ0ˆNÐ0Ø,.Ð)Ø')Ð$à)7×)=Ñ)=Ó)?ò DÑ%��~Ø/3¯x©xØ"°Èð 08ó 0Ñ,� ð 3AÐ(¨Ñ/Ø7CÐ-¨eÒ4ðDô  .Ð.FÐH\Ó]ÐÜ#1Ð2OÐQeÓ#fÐ àÐ 0Ð1ˆáñ ˜nÐ8ô —‘Ð0°aÕ8à)ð Ð'Ñ(ô
 ˜D¨nÔ=Ð=r#   )NT)r   T)NNr'   r‚   )%r0   r1   r2   r	   ÚLANCZOSrI   r   r/   r   r}   r   r~   rx   ry   r{   rw   r|   Údo_sample_framesr.   Úvalid_kwargsÚmodel_input_namesr   rE   r
   ÚboolrN   Útupler*   r]   r   r   rv   Úlistr4   r   r—   Ú__classcell__)rH   s   @r!   r9   r9   h   së  ø„ Ø!×)Ñ)€HØ˜GÐ$€DØ$ cÐ*€NØ'€JØ%€IØ€IØ€JØ€LØ€NØ€FØÐØ2€LØ'Ð)?Ð@Ðð
x Ð(GÑ!Hõ 
xð  OSØñ(àð(ð ð(ð Lð	(ð
 ð(ð 
õ(ð^ Ø"&ñ+!àð+!ð ˜3 ˜8‘_ð+!ð ð	+!ð
 ð+!ð  ó+!ð` "&Ø"&Ø !ñ?àð?ð ˜$‘Jð?ð �5‰[˜4Ñð	?ð
 ˜‘:ó?ð\ 37ñ=>à�^Ñ$ð=>ð ð=>ð ð	=>ð
 ð=>ð Lð=>ð ð=>ð ð=>ð ð=>ð ð=>ð ˜D ™KÑ'¨$Ñ.ð=>ð ˜4 ™;Ñ&¨Ñ-ð=>ð ˜jÑ(¨4Ñ/÷=>r#   r9   )-Únumpyrn   r^   Útorch.nnr   r\   Úimage_processing_utilsr   r   Úimage_utilsr   r   r	   r
   Úprocessing_utilsr   r   Úutilsr   r   r   Úvideo_processing_utilsr   Úvideo_utilsr   r   r   Útorchvision.transforms.v2ÚtvFÚ
get_loggerr0   ÚloggerÚDEFAULT_SYSTEM_MESSAGEÚDEFAULT_VIDEO_INTROÚDEFAULT_MEDIA_OUTTROÚFRAME_TIMESTAMP_MESSAGEr)   rž   r*   r"   r�   r,   r.   r9   Ú__all__r6   r#   r!   ú<module>r±      sØ   ðó  Û Ý $ç A÷ó ÷ 5ß BÑ BÝ 8ß OÑ Oñ ÔÝ;ð 
ˆ×	Ñ	˜HÓ	%€ð VÐ ànð ð Ð Ø5Ð Ø€ð	#  nÑ!5ð 	#¸$¸s¹)ó 	#ð%àð%ð ˆ3�ˆ8�_ó%ôP# l¸%õ #ôp>Ð.ô p>ðf #Ð
#�r#   