o
    
۾i                  	   @   s*  d dl mZ d dlmZ d dlmZmZmZ d dlZ	d dl
mZ d dlmZ d dlmZ d dlmZ dd	lmZ zd dlZW n eyK   ed
ZY nw ededefddZddededejfddZddededeej fddZddededeeef fddZed ZeddG dd dZ dS )    )	dataclass)	lru_cache)AnyClassVarLiteralN)hf_hub_download)Image)PlaceholderModule   )get_cache_dirlibrosafilenamereturnc                 C   sD   t  d }|jddd ||  }t|}| s td| d|d}|S )z^
    Download and open an image from huggingface
    repo: raushan-testing-hf/videos-test
    zvideo-example-dataT)parentsexist_okzraushan-testing-hf/videos-testdataset)repo_idr   	repo_type	cache_dir)r   mkdirstrexistsr   )r   video_directory
video_pathvideo_path_str r   E/home/ubuntu/.local/lib/python3.10/site-packages/vllm/assets/video.pydownload_video_asset   s   
r   path
num_framesc                 C   s   dd l }|| }| std|  t||j}g }|dkr$|n|}tjd|d |td}t	|D ] }|
 }|s? n||v rU| \}	}
|	rU|||
|j q5t|}t||k rqtd|  d| dt| d|S )	Nr   Could not open video file r
   )dtypez-Could not read enough frames from video file z (expected z frames, got ))cv2VideoCaptureisOpened
ValueErrorintgetCAP_PROP_FRAME_COUNTnplinspacerangegrabretrieveappendcvtColorCOLOR_BGR2RGBstacklen)r   r    r$   captotal_framesframesframe_indicesidxokretframer   r   r   video_to_ndarrays,   s6   

r=   c                 C   s   t | |}dd |D S )Nc                 S   s   g | ]}t |qS r   )r   	fromarray).0r<   r   r   r   
<listcomp>N   s    z,video_to_pil_images_list.<locals>.<listcomp>)r=   )r   r    r7   r   r   r   video_to_pil_images_listL   s   
rA   c                 C   s   dd l }|| }| std|  t||j}||j}|dkr*|| nd}|dks4||kr6|}||| |dtt	|||kd}|S )Nr   r!   r   opencv)total_num_framesfpsdurationvideo_backendframes_indicesdo_sample_frames)
r$   r%   r&   r'   r(   r)   r*   CAP_PROP_FPSlistr-   )r   r    r$   r5   r6   rD   rE   metadatar   r   r   video_get_metadataQ   s"   


rL   baby_readingT)frozenc                   @   s   e Zd ZU eed< dZeed< ddiZee	ee
f  ed< ede
fdd	Zede
fd
dZedeej fddZedejfddZede	e
ef fddZddedB dejfddZdS )
VideoAssetnamer   r    rM   zsample_demo_1.mp4_NAME_TO_FILEr   c                 C   s   | j | j S N)rQ   rP   selfr   r   r   r   x   s   zVideoAsset.filenamec                 C   s
   t | jS rR   )r   r   rS   r   r   r   r   |   s   
zVideoAsset.video_pathc                 C      t | j| j}|S rR   )rA   r   r    rT   r;   r   r   r   
pil_images      zVideoAsset.pil_imagesc                 C   rU   rR   )r=   r   r    rV   r   r   r   np_ndarrays   rX   zVideoAsset.np_ndarraysc                 C   rU   rR   )rL   r   r    rV   r   r   r   rK      rX   zVideoAsset.metadataNsampling_ratec                 C   s   t j| j|dd S )z
        Read audio data from the video asset, used in Qwen2.5-Omni examples.

        See also: examples/offline_inference/qwen2_5_omni/only_thinker.py
        )srr   )r   loadr   )rT   rZ   r   r   r   	get_audio   s   zVideoAsset.get_audiorR   )__name__
__module____qualname__VideoAssetName__annotations__r    r(   rQ   r   dictr   propertyr   r   rJ   r   rW   nptNDArrayrY   r   rK   floatr]   r   r   r   r   rO   o   s    
 rO   )r   )!dataclassesr   	functoolsr   typingr   r   r   numpyr+   numpy.typingre   huggingface_hubr   PILr   vllm.utils.import_utilsr	   baser   r   ImportErrorr   r   r(   rf   r=   rJ   rA   rc   rL   ra   rO   r   r   r   r   <module>   s,     