a
    PSic1<                     @   s(  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 z4d dlZejejj eejjjdsed	ZW n ey   ed
ZY n0 ddddZedddZ d a!da"d,e#ej$e%e#ee	e#ef  eej$ ee% ee# ee	e#ef  dd
ddZ&de%e%e#de	e#eee'ee'df e
e' f  f e
d dddZ(ej$e
d e'e%ej$dddZ)d-e#ee%ef eee%ef  e#e#eej$ej$e	e#ef f d!d"d#Z*ded$d%d&Z+de
e' d$d'd(Z,d.e#e#ee
e' ee% f d)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   P/var/www/html/django/DPS/env/lib/python3.9/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_optionsr   c	                 C   s  t j st j stt t  t j|t jd	 }t
|trJt|}tj| dd}	|	j||d}
|jd |
_|jd |
_|dkrdnd	|
_|pi |
_|d
urtddddddddddd
}|	j||d}|pi |_|jd }|dkrdnd}|	jjd jj}t|| }t |	 |}tjj|||d}||_||D ]}|	 | qH| D ]}|	 | qb|D ]8}tj!j|d	d}d|_"|
|D ]}|	 | qqx|
 D ]}|	 | qW d
   n1 s0    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yuv420prgb24Nz<f8z<f4z<i2z<i4u1)
ZdblZdblpfltZfltpZs16Zs16pZs32Zs32pu8Zu8pr   Zstereomono)format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$   astypeZ
AudioFrameZfrom_ndarraysample_rateencodemux
VideoFramer   )r   r   r   r   r   r   r    r!   r"   	containerstreamZaudio_format_dtypesZa_streamnum_channelsZaudio_layoutZaudio_sample_fmtformat_dtypeframepacketimgr   r   r   r4   6   sX    





r4   zav.container.Containerzav.stream.Stream.zav.frame.Frame)rG   start_offset
end_offsetpts_unitrH   stream_namer   c                    s.  t d7 a t t td kr t  |dkrfttd|j   tdkrptt	 d|j   n
t
d i d}d}|jdkr|jj}|rd|v r|d}	||	d  }
td	|
}|d u rtd
|
}|d ur|ddk}}t|d d}|rt|| d}z| j|dd|d W n tjy<   g  Y S 0 d}z\t| jf i |D ]B\}}||j< |j krX|r||k r|d7 }qX qqXW n tjy   Y n0  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_framebackwardrH   c                    s2   g | ]*}| j   kr" krn q| qS r   pts.0irO   framesrN   r   r   
<listcomp>       z%_read_from_stream.<locals>.<listcomp>c                    s   g | ]}| k r|qS r   r   r[   )rN   r   r   r`      ra   )_CALLED_TIMES_GC_COLLECTION_INTERVALgccollectintmathfloor	time_baser8   ceilwarningswarntypecodec_context	extradatafindresearchgroupmaxseekr   AVError	enumeratedecoderZ   sortedleninsert)rG   rN   rO   rP   rH   rQ   Zshould_buffermax_buffer_sizero   posdoZseek_offsetZbuffer_count_idxrK   resultZpreceding_framesZfirst_frame_ptsr   r^   r   _read_from_stream   s^    	




"r   )aframesaudio_frames	ref_startref_endr   c           
      C   s|   |d j |d j  }}| jd }|| d | }d}|}	||k rPt|| | }||krht|| | }	| d d ||	f S )Nr   r   )rZ   r<   rf   )
r   r   r   r   startendZtotal_aframesstep_per_aframes_idxe_idxr   r   r   _align_audio_frames   s    
r   rZ   THWC)r   	start_ptsend_ptsrP   output_formatr   c              	   C   s  t j st j stt | }|dvr<td| dddlm	} t
j| sbtd|  | dkr|t| |||S t  |du rtd	}||k rtd
| d| i }g }g }tj}	ztj| dd}
|
jjr|
jjd j}	|
jjr4t|
||||
jjd ddi}|
jjd j}|dur4t||d< |
jjrnt|
||||
jjd ddi}|
jjd j|d< W d   n1 s0    Y  W n tjy   Y n0 dd |D }dd |D }|rt t|}nt j dt j!d}|r\t"|d}t |}|dkrLt#t$%|d|	  }|td	krLt#t$&|d|	  }t'||||}nt j dt j(d}|dkr|)dddd}|||fS )a  
    Reads a video from a file, returning both the video frames as well as
    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: pyavNrS   z7end_pts should be larger than start_pts, got start_pts=z and end_pts=ignoreZmetadata_errorsrU   	video_fpsr@   r    c                 S   s   g | ]}|   qS r   )to_rgb
to_ndarrayr\   rK   r   r   r   r`   D  ra   zread_video.<locals>.<listcomp>c                 S   s   g | ]}|  qS r   )r   r   r   r   r   r`   E  ra   )r   r   r   rV   r#   r   rR   )r   r   r   rV   r	   )*r0   r1   r2   r3   r
   
read_videoupper
ValueErrortorchvisionr   ospathexistsRuntimeErrorr   _read_videor   r8   default_timebaser   r;   r?   r@   ri   rU   r   average_rater'   rv   r5   r9   stackemptyr6   concatenaterf   rg   rh   rj   r   float32permute)r   r   r   rP   r   r   infoZvideo_framesr   audio_timebaserG   r   Zvframes_listZaframes_listvframesr   r   r   r   r      s    





6


r   )rG   r   c                 C   s*   | j d jj}|d u rdS d|v r&dS dS )Nr   Fs   LavcT)r?   rn   ro   )rG   ro   r   r   r   !_can_read_timestamps_from_packets^  s    r   c                 C   s8   t | rdd | jddD S dd | jddD S d S )Nc                 S   s   g | ]}|j d ur|j qS r   rY   r\   xr   r   r   r`   j  ra   z,_decode_video_timestamps.<locals>.<listcomp>r   )rU   c                 S   s   g | ]}|j d ur|j qS r   rY   r   r   r   r   r`   l  ra   )r   demuxrx   )rG   r   r   r   _decode_video_timestampsg  s    r   )r   rP   r   c           	   
      sF  t j st j stt ddlm} | dkr>t	| |S t
  d}g }ztj| ddf}|jjr|jjd }|j zt|}W n$ tjy   td|   Y n0 t|j}W d   n1 s0    Y  W nD tjy } z(d|  d	| }t|t W Y d}~n
d}~0 0 |  |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: rR   c                    s   g | ]}|  qS r   r   r   video_time_baser   r   r`     ra   z)read_video_timestamps.<locals>.<listcomp>)r0   r1   r2   r3   r
   read_video_timestampsr   r   r   _read_video_timestampsr   r   r;   r?   rU   ri   r   rv   rk   rl   r8   r   RuntimeWarningsort)	r   rP   r   r   rZ   rG   Zvideo_streamemsgr   r   r   r   o  s2    
,"
r   )r   NNNNN)r   NrZ   r   )rZ   ).rd   rg   r   rq   rk   	fractionsr   typingr   r   r   r   r   r   r7   r9   r0   utilsr
    r   r   logging	set_levelERRORhasattrrU   rK   rF   ImportErrorr   boolr   rb   rc   strTensorr8   r4   rf   r   r   r   r   r   r   r   r   r   r   <module>   s    	
	      Y$Q    
q	