o
    U)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   f/home/app/PaddleOCR-VL-test/.venv_paddleocr/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$   ZaformatZ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"   )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   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   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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<   c                   C   s   t jdkrdS dS )Nlittlelebe)sys	byteorderr   r   r   r    _native_endiannessn   s   
rB   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.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   s0   | d u s| dkr
dS | dkrdS t d|  d)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   extrO   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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   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.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)rY   r
   r   r(   r   rC   r   r   rZ   rQ   tokensrV   rW   Zenc_fmtr   r   r   r    
save_audio   s.   

"re   c                 C   s6   dD ]
}|| v r|  S q| dkrdS | dkrdS | S )N)rI   rJ   rK   	PCM_MULAWrL   PCM_ALAWrM   r   )rC   dstr   r   r    _map_encoding  s   ri   c                 C   s.   t d|  }rt|dS | dv rdS |S )NzPCM_\w(\d+)\w*r   )rg   rf   rF   )researchr   group)rC   r   mr   r   r    _get_bits_per_sample  s
   rn   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	   rY   r   r   r   c                 C   s,   t | ||}t|j|j|_t|j|_|S rR   )r!   rn   rC   r   ri   )rY   r   r   metadatar   r   r    info  s   zFFmpegBackend.infor   r"   TNr#   r   	normalizer(   c                 C   s   t | |||||S rR   )r1   )rY   r#   r   rr   r(   r   r   r   r   r    load  s   
zFFmpegBackend.loadr
   r   rC   r   rZ   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   re   )	rY   r
   r   r(   r   rC   r   r   rZ   r   r   r    save+  s    zFFmpegBackend.savec                 C      dS NTr   rY   r   r   r   r    
can_decodeH     zFFmpegBackend.can_decodec                 C   rx   ry   r   rz   r   r   r    
can_encodeL  r|   zFFmpegBackend.can_encoder	   r   r"   TTNr	   TNNNr	   N)__name__
__module____qualname__staticmethod	InputTyper   r_   r   r   rq   boolr   r7   Tensorrs   r   r   r   ru   floatrw   r{   r}   r   r   r   r    ro     sv    "	
 ro   r~   )r   r"   Try   r   r   )$r\   rj   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   ru   re   ri   rn   ro   r   r   r   r    <module>   s    



&
?
	

&