o
    헦i,                     @   s  d dl Z d dlZd dlZd dl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 eeee jf Z	d6dedee d	ed
efddZ	 		d7dededed
ee fddZ		d8dddee ded
ejfddZ	 					d9dedededededee d	ed
eejef fddZdejd
efddZd
efdd Zd!ed"ed
efd#d$Zd%d& Zd'ee dee d!ee d(ee fd)d*Z						d:d+edejd,ededee d!ee d"ee d	ed-ee	jj d
dfd.d/Z d!ed
efd0d1Z!d!ed"ed
efd2d3Z"G d4d5 d5eZ#dS );    N)BinaryIOOptionalTupleUnion   )Backend)AudioMetaData   srcformatbuffer_sizereturnc                 C   sb   t j| |d |}||j}|jdkrt|}|d}n|j}tt	|j
||j|j|j S )Nr   r   )
torchaudioioStreamReaderget_src_stream_infodefault_audio_stream
num_frames_load_audiosizer   intsample_ratenum_channelsbits_per_samplecodecupper)r
   r   r   ssinfowaveformr    r   X/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/torchaudio/_backend/ffmpeg.py
info_audio   s   
r!   Tframe_offsetr   convertc                 C   s   | dk rt d| |dks|dk rt d|| dkr&|dkr&|s&d S d}| dkr4|dkr4|r4|S |dkrAd| | | }nd| }|sJ|S d||S )	Nr   z>Invalid argument: frame_offset must be non-negative. Found: {}r"   zDInvalid argument: num_frames must be -1 or greater than 0. Found: {}zaformat=sample_fmts=fltpz#atrim=start_sample={}:end_sample={}zatrim=start_sample={}z{},{})RuntimeErrorr   )r#   r   r$   aformatatrimr   r   r    _get_load_filter$   s   
r(   r   ztorchaudio.io.StreamReaderfilterchannels_firstc                 C   sH   | j dd|d |   |  d }|d u rtd|j}|r"|jS |S )Nr"   )filter_descr   zFailed to decode audio.)add_audio_streamprocess_all_packets
pop_chunksr%   _elemT)r   r)   r*   chunkr   r   r   r    r   ?   s   r   c                 C   sZ   t | dr|dkrd}tj| |d |}t||jj}t|||}	t	||	|}
|
|fS )Nreadvorbisogg)
hasattrr   r   r   r   r   r   r   r(   r   )r
   r#   r   r$   r*   r   r   r   r   r)   r   r   r   r    
load_audioM   s   	r6   dtypec                 C   s\   t jdt jdt jdt jdt jdt jdi}|| }|d u r,td|  dt	|
  d	|S )
Nu8s16s32s64fltdblzNo format found for dtype z; dtype must be one of .)torchuint8int16int32int64float32float64get
ValueErrorlistkeys)r7   dtype_to_formatr   r   r   r    _get_sample_format_   s   
rK   c                   C   s   t jdkrdS dS )Nlittlelebe)sys	byteorderr   r   r   r    _native_endiannessn   s   
rQ   encodingr   c                 C   s
  |dvrt d| dt }| s%|sd| S |dkrdS d| | S | dkr<|s-d	}|dkr5t d
d| | S | dkrJ|dv rFdS t d| dkra|sRd}|dv r]d| | S t d| dkro|dv rkdS t d| dkr}|dv rydS t dt d|  d)N>   N             @   zInvalid bits_per_sample z for WAV encoding.pcm_s16rS   pcm_u8pcm_sPCM_SrT   z4For WAV signed PCM, 8-bit encoding is not supported.PCM_U)NrS   z7For WAV unsigned PCM, only 8-bit encoding is supported.PCM_FrV   )rV   rW   pcm_fz?For WAV float PCM, only 32- and 64-bit encodings are supported.ULAW	pcm_mulawz5For WAV PCM mu-law, only 8-bit encoding is supported.ALAWpcm_alawz4For WAV PCM A-law, only 8-bit encoding is supported.zWAV encoding z is not supported.)rG   rQ   )rR   r   
endiannessr   r   r    _get_encoder_for_wavu   sD   
rd   c                 C   s0   | d u s| dkr
dS | dkrdS t d|  d)NrT   r9   rU   r:   z8FLAC only supports bits_per_sample values of 16 and 24 (z specified).)rG   )bpsr   r   r    _get_flac_sample_fmt   s
   rf   extre   c                    s~    fdd}|ds|drd}t ||}d }n!|dr$d}d}d }n}d }d }|dr2t|}|dr:t|}|||fS )Nc                    s   | kpd u o | kS Nr   )specrg   r   r   r    _type   s   z_parse_save_args.<locals>._typewavambr3   r4   flac)rd   rf   )rg   r   rR   re   rk   muxerencoder
sample_fmtr   rj   r    _parse_save_args   s"   


rr   urir   compressionc	                 C   s   d }	t | dr|d u rtdntj| } t| ddd   }
r)|
d  }	t|	|||\}}}|r8|j	}t
jj| ||d}|j||dt|j|||d |  |d| W d    d S 1 shw   Y  d S )	Nwritez0'format' is required when saving to file object.r>   r   r"   )r   r   )r   r   rp   encoder_formatcodec_configr   )r5   r%   ospathnormpathstrsplitlowerrr   r0   r   r   StreamWriterr,   r   rK   r7   openwrite_audio_chunk)rs   r
   r   r*   r   rR   r   r   rt   rg   tokensro   rp   enc_fmtr   r   r   r    
save_audio   s.   

"r   c                 C   s6   dD ]
}|| v r|  S q| dkrdS | dkrdS | S )N)r[   r\   r]   	PCM_MULAWr_   PCM_ALAWra   r   )rR   dstr   r   r    _map_encoding  s   r   c                 C   s.   t d|  }rt|dS | dv rdS |S )NzPCM_\w(\d+)\w*r   )r   r   rS   )researchr   group)rR   r   mr   r   r    _get_bits_per_sample  s
   r   c                   @   s  e Zd Zeddedee dedefddZ	e				
	
		ddededede
de
dee dedeejef fddZe	
					ddedejdede
dee dee dee dedeeejjeef  ddfddZededee de
fddZededee de
fddZdS ) FFmpegBackendr	   rs   r   r   r   c                 C   s,   t | ||}t|j|j|_t|j|_|S rh   )r!   r   rR   r   r   )rs   r   r   metadatar   r   r    info  s   zFFmpegBackend.infor   r"   TNr#   r   	normalizer*   c                 C   s   t | |||||S rh   )r6   )rs   r#   r   r   r*   r   r   r   r   r    load  s   
zFFmpegBackend.loadr
   r   rR   r   rt   c	           	   
   C   sF   t |tjjtd fstddt| t| ||||||||	 d S )NzLFFmpeg backend expects non-`None` value for argument `compression` to be of z=type `torchaudio.io.CodecConfig`, but received value of type )
isinstancer   r   CodecConfigtyperG   r   )	rs   r
   r   r*   r   rR   r   r   rt   r   r   r    save+  s    zFFmpegBackend.savec                 C      dS NTr   rs   r   r   r   r    
can_decodeH     zFFmpegBackend.can_decodec                 C   r   r   r   r   r   r   r    
can_encodeL  r   zFFmpegBackend.can_encoder	   r   r"   TTNr	   TNNNr	   N)__name__
__module____qualname__staticmethod	InputTyper   r{   r   r   r   boolr   r?   Tensorr   r   r   r   r   floatr   r   r   r   r   r   r    r     sv    "	
 r   r   )r   r"   Tr   r   r   )$rx   r   rO   typingr   r   r   r   r?   r   backendr   commonr   r{   PathLiker   r   r!   r   r(   r   r   r6   r7   rK   rQ   rd   rf   rr   r   r   r   r   r   r   r   r   r   r    <module>   s    



&
?
	

&