o
    )i                     @   s4  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
 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 dejdeeef dejfddZdejdedejfddZdejdedejfddZG dd dZG dd dZe Z e !dG dd deZ"G dd deej Z#dS )     N)abstractmethod)partial)BytesIO)Path)Any)Image)envs   )MediaIO)ImageMediaIOframessizereturnc                 C   sd   | j \}}}}|\}}tj||||f| jd}dd l}t| D ]\}	}
||
||f}|||	< q|S )Ndtyper   )shapenpemptyr   cv2	enumerateresize)r   r   
num_frames_Zchannels
new_height	new_widthZresized_framesr   iframeZresized_frame r   a/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/vllm/multimodal/video.pyresize_video   s   
r   size_factorc                 C   s4   | j \}}}}t|| }t|| }t| ||fS N)r   intr   )r   r    r   heightwidthr   r   r   r   r   rescale_video_size#   s   r%   r   c                 C   s<   | j d }|dkr| S tjd|d |td}| |df }|S )Nr   r	   r   .)r   r   linspacer"   )r   r   Ztotal_framesZframe_indicesZsampled_framesr   r   r   sample_frames_from_video+   s   
r(   c                   @   s@   e Zd Zee	ddededeej	e
eef f fddZdS )	VideoLoaderr&   datar   r   c                 K   s   t r!   )NotImplementedError)clsr*   r   kwargsr   r   r   
load_bytes8   s   zVideoLoader.load_bytesNr&   )__name__
__module____qualname__classmethodr   bytesr"   tuplenptNDArraydictstrr   r.   r   r   r   r   r)   6   s    r)   c                   @   s:   e Zd ZdddZdefddZededefd	d
ZdS )VideoLoaderRegistryr   Nc                 C   s
   i | _ d S r!   
name2class)selfr   r   r   __init__C   s   
zVideoLoaderRegistry.__init__namec                    s    fdd}|S )Nc                    s   | j  < | S r!   r;   )Zcls_to_registerr?   r=   r   r   wrapH   s   
z*VideoLoaderRegistry.register.<locals>.wrapr   )r=   r?   rA   r   r@   r   registerF   s   zVideoLoaderRegistry.registercls_namec                 C   s*   t j| }|d usJ d|  d| S )NzVideoLoader class z
 not found)VIDEO_LOADER_REGISTRYr<   get)rC   r,   r   r   r   loadN   s   zVideoLoaderRegistry.load)r   N)	r0   r1   r2   r>   r9   rB   staticmethodr)   rF   r   r   r   r   r:   A   s
    
r:   opencvc                   @   sD   e Zd Zdd Ze	d
dededeej	e
eef f fddZd	S )OpenCVVideoBackendc                 C   sj   dd l m} d }| D ]&}||sq||s.||\}}}|dk s-|dkr.|dk r.q|} |S |S )Nr   r	      )Zcv2.videoio_registryZvideoio_registryZgetStreamBufferedBackendsZ
hasBackendZisBackendBuiltInZ%getStreamBufferedBackendPluginVersion)r=   ZvrZapi_prefbackendr   abiapir   r   r   get_cv2_video_api[   s   

z$OpenCVVideoBackend.get_cv2_video_apir&   r*   r   r   c                 K   sn  dd l }|   }|t||g }| stdt||j}||j	}|dkr0|| nd}	|dkp9||k }
|
rF|}t
td|}ntjd|d |td}| }t||j}t||j}tjt|||dftjd}d}t|D ]#}| }|s n||v r| \}}|r|||j||< |d7 }qy||ksJ d| d| d	|||	d
d}||fS )Nr   zCould not open video streamr&   r	   r      zExpected reading z frames, but only loaded z frames from video.rH   )Ztotal_num_framesZfpsdurationZvideo_backend)r   rN   ZVideoCapturer   ZisOpened
ValueErrorr"   rE   ZCAP_PROP_FRAME_COUNTZCAP_PROP_FPSlistranger   r'   tolistZCAP_PROP_FRAME_WIDTHZCAP_PROP_FRAME_HEIGHTr   lenZuint8ZgrabretrieveZcvtColorZCOLOR_BGR2RGB)r,   r*   r   r-   r   rK   capZtotal_frames_numZoriginal_fpsrP   Z	full_readZ	frame_idxZuniform_sampled_framesr$   r#   r   r   idxokretr   metadatar   r   r   r.   j   sR   

zOpenCVVideoBackend.load_bytesNr/   )r0   r1   r2   rN   r3   r4   r"   r5   r6   r7   r8   r9   r   r.   r   r   r   r   rI   X   s    rI   c                
       s   e Zd Z	ddededdf fddZdedeej	e
eef f fd	d
Zdededeej	e
eef f fddZdedeej	e
eef f fddZdddej	dedefddZ  ZS )VideoMediaIO    image_ior   r   Nc                    s2   t    || _|| _|| _tj}t|| _	d S r!   )
superr>   r^   r   r-   r   ZVLLM_VIDEO_LOADER_BACKENDrD   rF   video_loader)r=   r^   r   r-   Zvideo_loader_backend	__class__r   r   r>      s   
zVideoMediaIO.__init__r*   c                 C   s   | j j|fd| ji| jS )Nr   )r`   r.   r   r-   )r=   r*   r   r   r   r.      s
   zVideoMediaIO.load_bytes
media_typec                    sL   |  dkrt| jjd t fdd|dD i fS | t	|S )Nz
video/jpegz
image/jpegc                    s   g | ]	}t  |qS r   )r   Zasarray).0Z
frame_data
load_framer   r   
<listcomp>   s    z,VideoMediaIO.load_base64.<locals>.<listcomp>,)
lowerr   r^   load_base64r   stacksplitr.   base64	b64decode)r=   rc   r*   r   re   r   rj      s   zVideoMediaIO.load_base64filepathc                 C   s<   | d}| }W d    n1 sw   Y  | |S )Nrb)openreadr.   )r=   ro   fr*   r   r   r   	load_file   s   

zVideoMediaIO.load_fileJPEG)video_formatmediarv   c                   s@   |}|dkrt | jj|d d fdd|D S d}t|)Nru   )Zimage_formatrh   c                 3   s    | ]
} t |V  qd S r!   )r   Z	fromarray)rd   r   Zencode_framer   r   	<genexpr>   s    
z-VideoMediaIO.encode_base64.<locals>.<genexpr>z&Only JPEG format is supported for now.)r   r^   encode_base64joinr+   )r=   rw   rv   Zvideomsgr   rx   r   rz      s   zVideoMediaIO.encode_base64)r]   )r0   r1   r2   r   r"   r>   r4   r5   r6   r7   r8   r9   r   r.   rj   r   rt   rz   __classcell__r   r   ra   r   r\      s0    $
$
r\   )$rm   abcr   	functoolsr   ior   pathlibr   typingr   numpyr   Znumpy.typingr6   ZPILr   Zvllmr   baser
   imager   r7   r5   r"   r   floatr%   r(   r)   r:   rD   rB   rI   r\   r   r   r   r   <module>   s2   "
I