U
    =jg,                     @   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d.eee eeddd	Zd/eeeee dddZd0dee eejdddZd1eeeeeee eeejef dddZejedddZedddZeeedddZdd  Zee ee ee ee d!d"d#Zd2eejeeee ee ee eee	jj dd$
d%d&Z eed'd(d)Z!eeedd*d+Z"G d,d- d-eZ#dS )3    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   >/tmp/pip-unpacked-wheel-4jtxrwwc/torchaudio/_backend/ffmpeg.py
info_audio   s    
r!   T)frame_offsetr   convertr   c                 C   s   | dk rt d| |dks&|dk r4t d|| dkrL|dkrL|sLd S d}| dkrh|dkrh|rh|S |dkrd| | | }n
d| }|s|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$   ZaformatZatrimr   r   r    _get_load_filter$   s    
r&   ztorchaudio.io.StreamReader)r   filterchannels_firstr   c                 C   sH   | j dd|d |   |  d }|d kr4td|j}|rD|jS |S )Nr"   )Zfilter_descr   zFailed to decode audio.)add_audio_streamZprocess_all_packetsZ
pop_chunksr%   _elemT)r   r'   r(   chunkr   r   r   r    r   ?   s    r   )r
   r#   r   r$   r(   r   r   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    	r1   )dtyper   c                 C   s\   t jdt jdt jdt jdt jdt jdi}|| }|d krXtd|  dt	|
  d	|S )
Nu8s16s32Zs64ZfltZdblzNo format found for dtype z; dtype must be one of .)torchZuint8Zint16Zint32Zint64Zfloat32Zfloat64get
ValueErrorlistkeys)r2   Zdtype_to_formatr   r   r   r    _get_sample_format_   s"          
r<   )r   c                   C   s   t jdkrdS dS d S )Nlittlelebe)sys	byteorderr   r   r   r    _native_endiannessn   s    
rB   )encodingr   r   c                 C   s  |dkrt d| dt }| sJ|s0d| S |dkr<dS d| | S | dkrx|sZd	}|dkrjt d
d| | S | dkr|dkrdS t d| dkr|sd}|dkrd| | S t d| dkr|dkrdS t d| dkr|dkrdS t dt d|  dd S )N>       @            NzInvalid bits_per_sample z for WAV encoding.Zpcm_s16rF   Zpcm_u8Zpcm_sPCM_SrG   z4For WAV signed PCM, 8-bit encoding is not supported.PCM_U)NrF   z7For WAV unsigned PCM, only 8-bit encoding is supported.PCM_FrD   )rD   rE   Zpcm_fz?For WAV float PCM, only 32- and 64-bit encodings are supported.ULAWZ	pcm_mulawz5For WAV PCM mu-law, only 8-bit encoding is supported.ALAWZpcm_alawz4For WAV PCM A-law, only 8-bit encoding is supported.zWAV encoding z is not supported.)r9   rB   )rC   r   Z
endiannessr   r   r    _get_encoder_for_wavu   sD    
rN   c                 C   s4   | d ks| dkrdS | dkr dS t d|  dd S )NrG   r4   rH   r5   z8FLAC only supports bits_per_sample values of 16 and 24 (z specified).)r9   )bpsr   r   r    _get_flac_sample_fmt   s
    rP   )extr   rC   rO   c                    s~    fdd}|ds|dr2d}t ||}d }nB|drHd}d}d }n,}d }d }|drdt|}|drtt|}|||fS )Nc                    s   | kpd ko | kS Nr   )specrQ   r   r   r    _type   s    z_parse_save_args.<locals>._typeZwavZambr.   r/   Zflac)rN   rP   )rQ   r   rC   rO   rU   muxerencoderZ
sample_fmtr   rT   r    _parse_save_args   s"    

rX   
urir
   r   r(   r   rC   r   r   compressionr   c	              	   C   s   d }	t | dr |d krRtdn2tj| } t| ddd   }
rR|
d  }	t|	|||\}}}|rp|j	}t
jj| ||d}|j||dt|j|||d |  |d| W 5 Q R X d S )	Nwritez0'format' is required when saving to file object.r6   r   r"   )r   r   )r   r   rW   Zencoder_formatZcodec_configr   )r0   r%   ospathnormpathstrsplitlowerrX   r+   r   r   StreamWriterr)   r   r<   r2   openZwrite_audio_chunk)rZ   r
   r   r(   r   rC   r   r   r[   rQ   tokensrV   rW   Zenc_fmtr   r   r   r    
save_audio   s*    


rf   )rC   r   c                 C   s6   dD ]}|| kr|  S q| dkr&dS | dkr2dS | S )N)rI   rJ   rK   	PCM_MULAWrL   PCM_ALAWrM   r   )rC   dstr   r   r    _map_encoding  s    
rj   c                 C   s.   t d|  }rt|dS | dkr*dS |S )NzPCM_\w(\d+)\w*r   )rh   rg   rF   )researchr   group)rC   r   mr   r   r    _get_bits_per_sample  s
    ro   c                   @   s   e Zd Zedeee eedddZ	edeeee
e
ee eeejef d	d
dZedeejee
ee ee ee eeeejjeef  dd
ddZeeee e
dddZeeee e
dddZdS )FFmpegBackendr	   )rZ   r   r   r   c                 C   s,   t | ||}t|j|j|_t|j|_|S rR   )r!   ro   rC   r   rj   )rZ   r   r   metadatar   r   r    info  s    zFFmpegBackend.infor   r"   TN)rZ   r#   r   	normalizer(   r   r   r   c                 C   s   t | |||||S rR   )r1   )rZ   r#   r   rs   r(   r   r   r   r   r    load  s    
zFFmpegBackend.loadrY   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typer9   rf   )	rZ   r
   r   r(   r   rC   r   r   r[   r   r   r    save+  s     zFFmpegBackend.save)rZ   r   r   c                 C   s   dS NTr   rZ   r   r   r   r    
can_decodeH  s    zFFmpegBackend.can_decodec                 C   s   dS ry   r   rz   r   r   r    
can_encodeL  s    zFFmpegBackend.can_encode)r	   )r   r"   TTNr	   )TNNNr	   N)__name__
__module____qualname__staticmethod	InputTyper   r`   r   r   rr   boolr   r7   Tensorrt   r   r   r   rv   floatrx   r{   r|   r   r   r   r    rp     sT               rp   )r	   )r   r"   T)NT)r   r"   TTNr	   )TNNNr	   N)$r]   rk   r@   typingr   r   r   r   r7   r   backendr   commonr   r`   PathLiker   r   r!   r   r&   r   r   r1   r2   r<   rB   rN   rP   rX   r   rv   rf   rj   ro   rp   r   r   r   r    <module>   s               &	?      
&