o
    oi:                     @   s   d 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Z	ddl
Z
ddlmZ ee jd Zejdee ddlmZ zddlZejd W n eyU   dZY nw dd	 Zd
d Zedkrge  dS dS )zmPre-extract 8-frame clips from videos to a cache dir. Training then loads .pt files instead of decoding MP4s.    N)Path)tqdm   )	find_mp4storchc                 C   s  ddl }|jd | \}}}}}}t|}t|}	z|jt|dd}
W n
 ty/   Y dS w t|
}|
 }|d t	dt
||  d }||k rMdS tt|   dd }tjt|d  t|D ]`}tjd|| d }tj||| d |d	t}|
|}| d
 }|dddd}tjjj|||fddd}|dddd}|d d }| d}|	| d|dd }t!|| qldS )zpWorker: (path_str, cache_dir_str, clips_per_video, num_frames, sample_fps, size) -> 0 on success, -1 if skipped.r   Nr   r   Znum_threads   l        Znum     o@      bilinearFsizemodeZalign_corners       @      ?_03d.pt)"decordbridge
set_bridger   VideoReaderstr	Exceptionlenget_avg_fpsmaxroundhashlibmd5resolveencode	hexdigestnprandomZseedhashrangerandintlinspaceastypeint	get_batchfloatpermuter   nn
functionalinterpolate	unsqueezesave)Z
args_tupler   Zpath_strZcache_dir_strclips_per_video
num_frames
sample_fpsr   path	cache_dirvrtotalfpsneed	path_hashcistartindicesframesoutout_path rF   5/data/cameron/vidgen/dino_vid_model/precache_clips.py_extract_one   s@   "

rH   c                     s  t jdd} | jdtdd | jdtddd	 | jd
tddd | jdtdd | jdtdd | jdtdd | jdtd dd | jdtddd |   td u rVtdt	 j
jddd t j}|sqtd j  jd ur}|d  j }tdt| d d j d  jdkrGtt|d d!D ]\}}t	|}tjt|d"d#}t|}| } jd tdt| j  d }||k rqtt|   d d$ }t  j!D ]c}	t"j#$d%|| d }
t"j%|
|
| d  jd&&t}|'|}| d' }|(d%d(dd"}t)j*j+j,| j- j-fd)d*d+}|(dd%d"d(}|d, d- }|.d%}| d.|	d/d0 }t)/|| qqn4 fd1d2|D }t01 j}t|j2t3|dd3t|d d4D ]}qgW d    n	1 svw   Y  td5  d S )6Nz-Pre-extract clips to cache for fast training.)Zdescriptionz--data-rootz /data/weiduoyuan/droid_raw/1.0.1)typedefaultz--cache-dirTzOutput dir for .pt clip files)rI   Zrequiredhelpz--clips-per-video
   z!Random clips to extract per video)rI   rJ   rK   z--num-frames   z--sample-fpsg      @z--size   z--max-videosz"Cap number of videos (for testing)z	--workersz"Parallel workers (multiprocessing)zdecord required for precache)parentsexist_okzNo .mp4 under zExtracting clips from z videos -> z
 (workers=)r   videos)descr   r   r	   r   r
   r   r   r   Fr   r   r   r   r   r   c                    s4   g | ]}t t| t  j j j jfqS rF   )r   r   r#   r6   r7   r8   r   ).0pargsr:   rF   rG   
<listcomp>m   s    &zmain.<locals>.<listcomp>)Z	chunksize)r<   rS   zDone. Clips in )4argparseZArgumentParserZadd_argumentr   r-   r/   Z
parse_argsr   RuntimeErrorr   r:   mkdirr   Z	data_rootFileNotFoundErrorZ
max_videosprintr   Zworkers	enumerater   r   r   r7   r   r    r8   r!   r"   r#   r$   r%   r)   r6   r&   r'   r*   r+   r,   r.   r0   r   r1   r2   r3   r   r4   r5   mpZPoolZimap_unorderedrH   )rU   rR   Zvir9   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   Ztask_tuplesZpoolr   rF   rV   rG   main<   sv   


""" 


r`   __main__)__doc__rY   r!   Zmultiprocessingr_   sysZpathlibr   Znumpyr&   r   r   __file__r#   rO   Zvidgen_rootr9   insertr   Zdino_vid_model.datasetr   r   r   r   r   rH   r`   __name__rF   rF   rF   rG   <module>   s.    #?
