o
    di)                     @   sH   d dl mZ ddlmZ ddlmZ dZG dd dZG dd	 d	Zd
S )    )Optional   )	RtpPacket)
uint16_addd   c                   @   s"   e Zd ZdededdfddZdS )JitterFramedata	timestampreturnNc                 C   s   || _ || _d S Nr   r	   )selfr   r	    r   G/home/ubuntu/.local/lib/python3.10/site-packages/aiortc/jitterbuffer.py__init__
   s   
zJitterFrame.__init__)__name__
__module____qualname__bytesintr   r   r   r   r   r   	   s    r   c                	   @   s   e Zd Z	ddedededdfdd	Zedefd
dZdede	ee
e f fddZdede
e fddZdeddfddZdedefddZdS )JitterBufferr   Fcapacityprefetchis_videor
   Nc                 C   sH   ||d @ dksJ d|| _ d | _dd t|D | _|| _|| _d S )Nr   r   zcapacity must be a power of 2c                 S   s   g | ]}d qS r   r   ).0ir   r   r   
<listcomp>   s    z)JitterBuffer.__init__.<locals>.<listcomp>)	_capacity_originrange_packets	_prefetch	_is_video)r   r   r   r   r   r   r   r      s   
zJitterBuffer.__init__c                 C   s   | j S r   )r   )r   r   r   r   r      s   zJitterBuffer.capacitypacketc                 C   s   d}| j d u r|j| _ d}d}nt|j| j  }t| j |j }||k r@|tkr<| | j |j| _ d }}| jr;d}n|d fS || jkrZ|| j d }| |rU|j| _ | jrZd}|j| j }|| j	|< || 
|jfS )NFr   Tr   )r   sequence_numberr   MAX_MISORDERremover   r"   smart_remover   r    _remove_frame)r   r#   pli_flagdeltamisorderexcessposr   r   r   add   s2   



zJitterBuffer.addr$   c           
      C   s   d }d}g }d}d }t | jD ]S}| j| | j }| j| }	|	d u r% d S |d u r-|	j}n0|	j|kr]|d u rFtddd |D |d}|}|d7 }|| jkrX| 	| |  S g }|	j}|
|	 qd S )Nr       c                 S   s   g | ]}|j qS r   )_data)r   xr   r   r   r   Q   s    z.JitterBuffer._remove_frame.<locals>.<listcomp>r   r   )r   r   r   r   r    r	   r   joinr!   r&   append)
r   r$   frameframespacketsr&   r	   countr-   r#   r   r   r   r(   ?   s8   



zJitterBuffer._remove_framer7   c                 C   sD   || j ksJ t|D ]}| j| j  }d | j|< t| jd| _qd S )Nr   )r   r   r   r    r   )r   r7   r   r-   r   r   r   r&   d   s   
zJitterBuffer.removec                 C   s   d}t | jD ]6}| j| j }| j| }|dur'||kr$||jkr$ dS |j}d| j|< t| jd| _|| jd kr= dS qdS )z
        Makes sure that all packages belonging to the same frame are removed
        to prevent sending corrupted frames to the decoder.
        Nr   TF)r   r   r   r    r	   r   )r   r7   r	   r   r-   r#   r   r   r   r'   k   s   

zJitterBuffer.smart_remove)r   F)r   r   r   r   boolr   propertyr   r   tupler   r   r.   r(   r&   r'   r   r   r   r   r      s"    

!%r   N)	typingr   rtpr   utilsr   r%   r   r   r   r   r   r   <module>   s    