o
    )i:=                     @   sp  d dl 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m	Z	m
Z
mZmZmZ d dlZd dlZddlmZ ddlmZ zd dlZejejj eejjjdsWed	ZW n eye   ed
ZY nw d<ddZdefddZ d a!da"						d=de#dej$de%de#dee	e#ef  deej$ dee% dee# dee	e#ef  ddfddZ&ddde%d e%d!e#d"d#d$e	e#eee'ee'd%f e
e' f  f de
d& fd'd(Z(d)ej$d*e
d& d+e'd,e%dej$f
d-d.Z)	 		/	0d>de#d1ee%ef d2eee%ef  d!e#d3e#deej$ej$e	e#ef f fd4d5Z*dddefd6d7Z+ddde
e' fd8d9Z,d?de#d!e#dee
e' ee% f fd:d;Z-dS )@    N)Fraction)AnyDictListOptionalTupleUnion   )_log_api_usage_once   )
_video_opt	pict_typea+  Your version of PyAV is too old for the necessary video operations in torchvision.
If you are on Python 3.5, you will have to build from source (the conda-forge
packages are not up-to-date).  See
https://github.com/mikeboers/PyAV#installation for instructions on how to
install PyAV on your system.
zPyAV is not installed, and is necessary for the video operations in torchvision.
See https://github.com/mikeboers/PyAV#installation for instructions on how to
install PyAV on your system.
returnc                   C   s   t ttrtd S N
isinstanceav	Exception r   r   c/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/torchvision/io/video.py_check_av_available'   s   
r   c                   C   s   t tt S r   r   r   r   r   r   _av_available,   s   r   
   libx264filenamevideo_arrayfpsvideo_codecoptionsaudio_array	audio_fpsaudio_codecaudio_optionsc	                 C   s  t j st j stt t  t j|t jd	 }t
|tr%t|}tj| dd}	|	j||d}
|jd |
_|jd |
_|dkrFdnd	|
_|pLi |
_|d
urddddddddddd
}|	j||d}|pii |_|jd }|dkrvdnd}|	jjd jj}t|| }t |	 |}tjj|||d}||_||D ]}|	 | q| D ]}|	 | q|D ]}tj!j|d	d}d|_"|
|D ]}|	 | qq|
 D ]}|	 | qW d
   d
S 1 sw   Y  d
S )a|  
    Writes a 4d tensor in [T, H, W, C] format in a video file

    Args:
        filename (str): path where the video will be saved
        video_array (Tensor[T, H, W, C]): tensor containing the individual frames,
            as a uint8 tensor in [T, H, W, C] format
        fps (Number): video frames per second
        video_codec (str): the name of the video codec, i.e. "libx264", "h264", etc.
        options (Dict): dictionary containing options to be passed into the PyAV video stream
        audio_array (Tensor[C, N]): tensor containing the audio, where C is the number of channels
            and N is the number of samples
        audio_fps (Number): audio sample rate, typically 44100 or 48000
        audio_codec (str): the name of the audio codec, i.e. "mp3", "aac", etc.
        audio_options (Dict): dictionary containing options to be passed into the PyAV audio stream
    dtypew)mode)rater	   r   Z
libx264rgbZyuv420pZrgb24Nz<f8z<f4z<i2z<i4u1)
ZdblZdblpZfltZfltpZs16Zs16pZs32Zs32pu8Zu8pr   Zstereomono)formatZlayout)r+   NONE)#torchjitis_scripting
is_tracingr
   write_videor   	as_tensoruint8numpyr   floatnproundr   openZ
add_streamshapewidthheightZpix_fmtr   streamsaudior+   namer$   ZastypeZ
AudioFrameZfrom_ndarrayZsample_rateencodeZmux
VideoFramer   )r   r   r   r   r   r   r    r!   r"   	containerstreamZaudio_format_dtypesZa_streamZnum_channelsZaudio_layoutZaudio_sample_fmtZformat_dtypeframepacketZimgr   r   r   r1   5   s^   




"r1   rA   zav.container.Containerstart_offset
end_offsetpts_unitrB   zav.stream.Streamstream_name.zav.frame.Framec                    s  t d7 a t t td krt  |dkr3ttd|j   tdkr2tt	 d|j   nt
d i d}d}|jdkrs|jj}|rsd|v rs|d}	||	d  }
td	|
}|d u rhtd
|
}|d urs|ddk}}t|d d}|rt|| d}z| j|dd|d W n tjy   g  Y S w d}z(t| jdi |D ]\}}||j< |j kr|r||k r|d7 }q nqW n
 tjy   Y nw  fddtD }tdkrdkrvrfddD }t|dkrt|}|d|  |S )Nr   secinfzBThe pts_unit 'pts' gives wrong results. Please use pts_unit 'sec'.T   videos   DivXs   DivX(\d+)Build(\d+)(\w)s   DivX(\d+)b(\d+)(\w)      pr   F)Z	any_frameZbackwardrB   c                    s2   g | ]}| j   kr krn n| qS r   pts.0irF   framesrE   r   r   
<listcomp>   s   2 z%_read_from_stream.<locals>.<listcomp>c                    s   g | ]}| k r|qS r   r   rQ   )rE   r   r   rV          r   )_CALLED_TIMES_GC_COLLECTION_INTERVALgcZcollectintmathfloor	time_baser5   ceilwarningswarntypecodec_context	extradatafindresearchgroupmaxseekr   AVError	enumeratedecoderP   sortedleninsert)rA   rE   rF   rG   rB   rH   Zshould_buffermax_buffer_sizerd   posdoZseek_offsetZbuffer_countZ_idxrC   resultZpreceding_framesZfirst_frame_ptsr   rT   r   _read_from_stream   sh   	




"rv   aframesaudio_frames	ref_startref_endc           
      C   s|   |d j |d j }}| jd }|| d | }d}|}	||k r(t|| | }||kr4t|| | }	| d d ||	f S )Nr   r   )rP   r9   r[   )
rw   rx   ry   rz   startendZtotal_aframesZstep_per_aframeZs_idxZe_idxr   r   r   _align_audio_frames   s   
r~   rP   THWC	start_ptsend_ptsoutput_formatc              	   C   s  t j st j stt | }|dvrtd| dddlm	} t
j| s1td|  | dkrBt| |||\}}}nt  |du rMtd	}||k r[td
| d| i }g }	g }
tj}zdtj| ddS}|jjrx|jjd j}|jjrt|||||jjd ddi}	|jjd j}|durt||d< |jjrt|||||jjd ddi}
|jjd j|d< W d   n1 sw   Y  W n
 tjy   Y nw dd |	D }dd |
D }|rt t|}nt j dt j!d}|r,t"|d}t |}|dkr$t#t$%|d|  }|td	kr$t#t$&|d|  }t'||
||}nt j dt j(d}|dkrA|)dddd}|||fS )a   
    Reads a video from a file, returning both the video frames and the audio frames

    Args:
        filename (str): path to the video file
        start_pts (int if pts_unit = 'pts', float / Fraction if pts_unit = 'sec', optional):
            The start presentation time of the video
        end_pts (int if pts_unit = 'pts', float / Fraction if pts_unit = 'sec', optional):
            The end presentation time
        pts_unit (str, optional): unit in which start_pts and end_pts values will be interpreted,
            either 'pts' or 'sec'. Defaults to 'pts'.
        output_format (str, optional): The format of the output video tensors. Can be either "THWC" (default) or "TCHW".

    Returns:
        vframes (Tensor[T, H, W, C] or Tensor[T, C, H, W]): the `T` video frames
        aframes (Tensor[K, L]): the audio frames, where `K` is the number of channels and `L` is the number of points
        info (Dict): metadata for the video and audio. Can contain the fields video_fps (float) and audio_fps (int)
    )r   TCHWz5output_format should be either 'THWC' or 'TCHW', got .r   get_video_backendzFile not found: pyavNrJ   z7end_pts should be larger than start_pts, got start_pts=z and end_pts=ignoreZmetadata_errorsrL   	video_fpsr=   r    c                 S   s   g | ]}|   qS r   )Zto_rgb
to_ndarrayrR   rC   r   r   r   rV   D  rW   zread_video.<locals>.<listcomp>c                 S   s   g | ]}|  qS r   )r   r   r   r   r   rV   E      )r   r   r   rM   r#   r   rI   )r   r   r   rM   r	   )*r-   r.   r/   r0   r
   
read_videoupper
ValueErrortorchvisionr   ospathexistsRuntimeErrorr   Z_read_videor   r5   Zdefault_timebaser   r8   r<   r=   r^   rL   rv   average_rater'   rk   r2   r6   stackemptyr3   Zconcatenater[   r\   r]   r_   r~   Zfloat32Zpermute)r   r   r   rG   r   r   Zvframesrw   infoZvideo_framesrx   Zaudio_timebaserA   r   Zvframes_listZaframes_listr   r   r   r      s   






r   c                 C   s*   | j d jj}|d u rdS d|v rdS dS )Nr   Fs   LavcT)r<   rc   rd   )rA   rd   r   r   r   !_can_read_timestamps_from_packets^  s   r   c                 C   s4   t | rdd | jddD S dd | jddD S )Nc                 S      g | ]
}|j d ur|j qS r   rO   rR   xr   r   r   rV   j      z,_decode_video_timestamps.<locals>.<listcomp>r   )rL   c                 S   r   r   rO   r   r   r   r   rV   l  r   )r   Zdemuxrm   )rA   r   r   r   _decode_video_timestampsg  s   r   c           	   
      sB  t j st j stt ddlm} | dkrt	| |S t
  d}g }zDtj| dd3}|jjrZ|jjd }|j zt|}W n tjyT   td|   Y nw t|j}W d   n1 sdw   Y  W n! tjy } zd|  d	| }t|t W Y d}~nd}~ww |  |d
kr fdd|D }||fS )a   
    List the video frames timestamps.

    Note that the function decodes the whole video frame-by-frame.

    Args:
        filename (str): path to the video file
        pts_unit (str, optional): unit in which timestamp values will be returned
            either 'pts' or 'sec'. Defaults to 'pts'.

    Returns:
        pts (List[int] if pts_unit = 'pts', List[Fraction] if pts_unit = 'sec'):
            presentation timestamps for each one of the frames in the video.
        video_fps (float, optional): the frame rate for the video

    r   r   r   Nr   r   z Failed decoding frames for file zFailed to open container for z; Caught error: rI   c                    s   g | ]}|  qS r   r   r   Zvideo_time_baser   r   rV     r   z)read_video_timestamps.<locals>.<listcomp>)r-   r.   r/   r0   r
   read_video_timestampsr   r   r   Z_read_video_timestampsr   r   r8   r<   rL   r^   r   rk   r`   ra   r5   r   RuntimeWarningsort)	r   rG   r   r   rP   rA   Zvideo_streamemsgr   r   r   r   o  s>   

	r   )r   N)r   NNNNN)r   NrP   r   rO   ).rZ   r\   r   rf   r`   	fractionsr   typingr   r   r   r   r   r   r4   r6   r-   utilsr
    r   r   loggingZ	set_levelERRORhasattrrL   rC   r@   ImportErrorr   boolr   rX   rY   strZTensorr5   r1   r[   rv   r~   r   r   r   r   r   r   r   r   <module>   s     	

	

X$
P


r	,