o
    i                     @   s   d dl mZ d dlmZmZmZmZ d dlZd dlmZ d dl	m
Z
 d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZmZmZmZmZ d dlmZ G dd deZdS )    )cached_property)AnyIteratorListOptionalN)	time_base)Codec)EOFErrorInvalidDataError)Flags)split_audio_frame)	get_dtype)Graph)
UINT32_MAXAudioFormat
AudioFrameFilterSeconds)Backendc                       s  e Zd Zd4dedee def fddZedefd	d
Z	edee f fddZ
edefddZedefddZedee fddZedefddZedefddZedefddZedee fddZedefddZedefddZedee f fdd Zedefd!d"Zd5d#ed$eee  fd%d&Zd6d(ed)ee dee fd*d+Z dee fd,d-Z!d(efd.d/Z"d0ed(ed1efd2d3Z#  Z$S )7PyAVNFfile
frame_sizeforced_decodingc                    sH   t  ||| tj|dd| _| jjjd | _t| jj	| _
d | _d S )Nignore)metadata_errorsr   )super__init__avopen	containerstreamsaudiostreamr   formatdtypegraph)selfr   r   r   	__class__ P/home/ubuntu/.local/lib/python3.10/site-packages/audiolab/reader/backend/pyav.pyr       s
   
zPyAV.__init__returnc                 C   
   | j jjS N)r"   r#   bitsr&   r)   r)   r*   bits_per_sample'      
zPyAV.bits_per_samplec                    sB   d }| j jd ur| j j}n
| jjd ur| jj}|dv rt j}|S )Nr   N)r"   bit_rater   r   )r&   r3   r'   r)   r*   r3   +   s   
zPyAV.bit_ratec                 C   r,   r-   )r"   codec	long_namer/   r)   r)   r*   r4   6   r1   z
PyAV.codecc                 C   r,   r-   )r   r#   namer/   r)   r)   r*   r#   :   r1   zPyAV.formatc              
   C   s   | j r*d}z| j| jD ]}||j7 }qW n tttfy"   Y nw || jj }nd }| jj	d ur;| jj	| jj
 }n| jj	d urG| jj	t
 }|d u rMd S t|S Nr   )r   r   decoder"   samplesr	   r
   StopIterationratedurationr   r   )r&   
num_framesframer<   r)   r)   r*   r<   >   s    zPyAV.durationc                 C   r,   r-   )r"   r#   	is_planarr/   r)   r)   r*   r?   P   r1   zPyAV.is_planarc                 C      | j jS r-   )r   r6   r/   r)   r)   r*   r6   T      z	PyAV.namec                 C   r@   r-   )r"   channelsr/   r)   r)   r*   num_channelsX   rA   zPyAV.num_channelsc                 C   s    | j d u rd S t| j | jj S r-   )r<   intr"   r;   r/   r)   r)   r*   r=   \   s   
zPyAV.num_framesc                 C   s   i | j j| jjS r-   )r   metadatar"   r/   r)   r)   r*   rE   b   s   zPyAV.metadatac                 C   r@   r-   )r"   sample_rater/   r)   r)   r*   rF   f   rA   zPyAV.sample_ratec                    s   t  j}|d u r| jj}|S r-   )r   sizer   )r&   rG   r'   r)   r*   rG   j   s   z	PyAV.sizec                 C   s8   t | jjj}t j|v }t j|v }t j|v}|p|p|S r-   )r   r   r#   flagsgeneric_indexseek_to_ptsno_byte_seek)r&   rH   rI   rJ   	byte_seekr)   r)   r*   seekableq   s
   


zPyAV.seekabler#   filtersc                 C   s<   | j d u rt|| _t| j| j| j| j|| jd| _ d S d S )N)r;   r$   r?   rB   rN   r   )r%   r   r$   r   rF   r?   rC   r   )r&   r#   rN   r)   r)   r*   build_graphy   s   

zPyAV.build_graphr   offsetr<   c                 c   s    t || jj }| | |d u rtnt || j }|dkrQ|  }|d u r(n)| |j | 	|||}|d u r:q||j
8 }| j| | j E d H  |dks| jd urb| jjddE d H  d S d S )Nr   T)partial)rD   r"   r   seekr   rF   readrO   r#   split_framer9   r%   pushpull)r&   rP   r<   framesr>   r)   r)   r*   
load_audio   s&   


zPyAV.load_audioc              
   C   s0   z
t | j| jW S  tttfy   Y d S w r-   )nextr   r8   r"   r	   r
   r:   r/   r)   r)   r*   rS      s
   z	PyAV.readc                 C   s"   |dkr| j j|| jd d S d S )Nr   )r"   )r   rR   r"   )r&   rP   r)   r)   r*   rR      s   z	PyAV.seekr>   rW   c                 C   sH   t ||j d|j |j }t|t|\}}|d ur"t||\}}|S r7   )maxptsr   rF   r   rD   )r&   r>   rP   rW   _r)   r)   r*   rT      s
   zPyAV.split_frame)NFr-   r2   )%__name__
__module____qualname__r   r   rD   boolr   r   r0   r3   r   r4   strr#   r   r<   r?   r6   rC   r=   dictrE   rF   rG   rM   r   r   r   rO   r   r   rX   rS   rR   rT   __classcell__r)   r)   r'   r*   r      sB     
 r   )	functoolsr   typingr   r   r   r   r   r   av.codecr   av.errorr	   r
   	av.formatr   audiolab.avr   audiolab.av.formatr   audiolab.av.graphr   audiolab.av.typingr   r   r   r   r   audiolab.reader.backend.backendr   r   r)   r)   r)   r*   <module>   s   