o
    #i4                     @   s   d dl Z d dlZd dlmZ d dlZd dlZd dl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d	lmZ G d
d deZG dd deZdS )    N)Union)Image)Dataset)v2)trange)print0   )read_frames_with_decordc                       s   e Zd Z				ddedededed	ed
ededef f fddZ	g dg dfddZ
dd Zdd Zdd Zdd Z  ZS )VidTokDataset      ?FTNdata_dir	meta_pathvideo_params	data_fracis_strict_loadingskip_missing_filesstart_indexc                    s|   t    || _td| j  || _td| j  || _|| _|| _|| _|| _	| 
|d |d | _g | _|   d S )NzN[bold yellow]\[vidtok.data.vidtok][VidTokDataset][/bold yellow] Use data dir: zO[bold yellow]\[vidtok.data.vidtok][VidTokDataset][/bold yellow] Use meta path: input_heightinput_width)super__init__r   r   r   r   r   r   r   r   _get_transforms
transformsmissing_files_load_metadata)selfr   r   r   r   r   r   r   	__class__ 1/data/cameron/vidgen/VidTok/vidtok/data/vidtok.pyr      s    

zVidTokDataset.__init__      ?r!   r!   c                 C   2   t j||d}t t j|ddt ||f|gS N)meanstdT)	antialiasr   	NormalizeComposeResize
CenterCropr   r   r   Z	norm_meanZnorm_std	normalizer   r   r   r   3      zVidTokDataset._get_transformsc                 C   sF   t j| jddddd}| jdk r|j| jd}|| _| jjdd	 d S )
Nskip
ISO-8859-1python,Zon_bad_linesencodingenginesepr   )fracTinplace)pdread_csvr   r   samplemetadatadropnar   r=   r   r   r   r   =   s   
zVidTokDataset._load_metadatac                 C   $   t |d }tj| j|}||fS )z&reduce the access to the disk
        videosstrospathjoinr   r   r<   Zrel_video_fpZabs_video_fpr   r   r   _get_video_pathJ   s   zVidTokDataset._get_video_pathc                 C   
   t | jS N)lenr=   r   r   r   r   __len__Q      
zVidTokDataset.__len__c              
   C   s  |t | j }| jj| }| |\}}zHtj|r-t|| jd | jd | j	d\}}n.|| j
vr8| j
| | jrOtd| d | tj|  W S td| d| j dW n> ty } z2| jrttd	| d
| j d|td td| jd | jd fd}t |d}W Y d }~nd }~ww | jd ur| |}|jd | jd k rtj||d d| jd |jd  dddgdd}| dddd}||dS )Nsample_num_frames
sample_fps)
video_pathrO   rP   r   z\[bold yellow]\[vidtok.data.vidtok][VidTokDataset][/bold yellow] Warning: missing video file . Resampling another video.Video file   is missing, skip_missing_files=.Video loading failed for , is_strict_loading=zw[bold yellow]\[vidtok.data.vidtok][VidTokDataset][/bold yellow] Warning: using the pure black image as the frame sampleRGBr   r   r   r   r   r   r   dim      jpgrE   )!rK   r=   ilocrH   rD   rE   isfiler	   r   r   r   appendr   r   __getitem__nprandomchoicerM   
ValueError	Exceptionr   r   newr   ToTensor	unsqueezer   shapetorchcatrepeatpermute)r   itemr<   video_fp_imgsidxser   r   r   rd   T   sD   

	
8zVidTokDataset.__getitem__)r   FTN)__name__
__module____qualname__rC   dictfloatboolr   intr   r   r   rH   rM   rd   __classcell__r   r   r   r   r
      s2    
 
r
   c                       s   e Zd Z								d!dedededef d	ed
edededededef fddZg dg dfddZ	dd Z
dd Zdd Zdd Zdd Zdd  Z  ZS )"VidTokValDatasetNTrp   F   r   r   r   pre_load_framesr   last_frames_handler   read_long_video
chunk_size	is_causalc                    s   t    || _td| j  || _td| j  || _|| _|	| _|
| _|| _	|| _
|| _| |d |d | _g | _|   |   |rRtd |   d S d S )NzQ[bold yellow]\[vidtok.data.vidtok][VidTokValDataset][/bold yellow] Use data dir: zR[bold yellow]\[vidtok.data.vidtok][VidTokValDataset][/bold yellow] Use meta path: r   r   ze[bold yellow]\[vidtok.data.vidtok][VidTokValDataset][/bold yellow] Pre-loading all frames into CPU...)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   _load_every_frame_from_meta_pre_load_frames)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s:   


zVidTokValDataset.__init__r    c                 C   r"   r#   r'   r,   r   r   r   r      r.   z VidTokValDataset._get_transformsc                 C   sZ   | j d urtj| j ddddd}|| _| jjdd d S tjtj| j	dd	dd
| _d S )Nr/   r0   r1   r2   r3   Tr8   z**z*.mp4)	recursive)
r   r:   r;   r=   r>   globrD   rE   rF   r   r?   r   r   r   r      s   
"zVidTokValDataset._load_metadatac                 C   s  t jd g | _tt| jD ]}z| jj| }| |\}}W n	   | j| }Y t	j
|rt j|dd}t|}| }t|| jd  }ttd||}	| jrt|	}
| jrq|
| jkrq|	d | j|
d | j  d  }n| js|
| jkr|	d | j|
| j   }nq| j||d qtdt|	| jd D ]C}|	||| jd   }t|| jd k r| jdkr||d	 g| jd t|  7 }n| jd
krqtd| j | j||d qqtdt| j d d S )Nrn   r   num_threadsrP   r   )rs   num_frames_idsrO   rp   rZ   dropzInvalid last_frames_handle: z`[bold yellow]\[vidtok.data.vidtok][VidTokValDataset][/bold yellow] Loaded all frames index from z videos.)decordbridge
set_bridgeframes_batchrangerK   r=   ra   rH   rD   rE   rb   VideoReaderget_avg_fpsroundr   listr   r   r   rc   r   rh   r   )r   	video_idxr<   rs   rt   video_readertotal_framesfpsinterval	frame_idsvideo_lengthr   xr   r   r   r      sZ   "


z,VidTokValDataset._load_every_frame_from_metac                 C   s   d }t t| jddD ]7}| j| d |kr"tj| j| d dd}| j| d }|| j| d dddd	 d
 | j| d< qd S )NzPre-loading all frames)descrs   r   r   r   r^   r   r]        o@frames)r   rK   r   r   r   	get_batchrq   r|   )r   Zlast_video_fpidxr   r   r   r   r      s   "z!VidTokValDataset._pre_load_framesc                 C   r@   )zreduce the access to the diskrA   rB   rG   r   r   r   rH     s   z VidTokValDataset._get_video_pathc                 C   rI   rJ   )rK   r   rL   r   r   r   rM     rN   zVidTokValDataset.__len__c              
   C   s  | j | d }zad| j | v r| j | d }nPtj|r9tj|dd}|| j | d dddd d	 }n.|| j	vrD| j	
| | jr[td
| d | tj|  W S td| d| j dW n> ty } z2| jrtd| d| j d|td td| jd | jd fd}t |d}W Y d }~nd }~ww | jd ur| |}| js|jd | jd k rtd| d|jd  d| jd  d tj||d d | jd |jd  dddgdd}|dddd}||dS )Nrs   r   r   r   r   r^   r   r]   r   z_[bold yellow]\[vidtok.data.vidtok][VidTokValDataset][/bold yellow] Warning: missing video file rR   rS   rT   rU   rV   rW   zz[bold yellow]\[vidtok.data.vidtok][VidTokValDataset][/bold yellow] Warning: using the pure black image as the frame samplerX   r   r   rY   rO   zR[bold yellow]\[vidtok.data.vidtok][VidTokValDataset][/bold yellow] Warning: video z has less frames z than sample_num_frames rZ   r[   r_   )!r   rD   rE   rb   r   r   r   rq   r|   r   rc   r   r   rd   re   rf   rg   rM   rh   ri   r   r   rj   r   r   rk   rl   r   r   rm   rn   ro   rp   )r   rr   rs   ru   r   rw   r   r   r   rd     sd   "



",zVidTokValDataset.__getitem__)NTTrp   FFr   T)rx   ry   rz   rC   r{   r   r}   r~   r   r   r   r   r   rH   rM   rd   r   r   r   r   r   r      sJ    
	
0
4r   )rD   r   typingr   r   numpyre   pandasr:   rn   PILr   torch.utils.datar   Ztorchvision.transformsr   tqdmr   vidtok.modules.utilr   Z
video_readr	   r
   r   r   r   r   r   <module>   s    q