o
    diP                     @   s   d dl Z d dlmZ d dlmZmZ d dlmZmZ dZ	dZ
dZdZdZd	ZdZd
de>  ZG dd deZG dd deZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZG d d! d!ZdS )"    N)Enum)AnyOptional)
uint32_add	uint32_gt      <             @@   c                   @      e Zd ZdZdZdZdS )BandwidthUsager   r      N)__name__
__module____qualname__NORMAL
UNDERUSING	OVERUSING r   r   ?/home/ubuntu/.local/lib/python3.10/site-packages/aiortc/rate.pyr          r   c                   @   r   )RateControlStater   r   r   N)r   r   r   HOLDINCREASEDECREASEr   r   r   r   r      r   r   c                	   @   s   e Zd ZdddZdefddZdededdfd	d
Zdedee dedee fddZ	dededefddZ
dededefddZdedededefddZdefddZdeddfddZdS )AimdRateControlreturnNc                 C   sB   d | _ d| _d| _d| _d | _d | _d| _d| _d| _t	j
| _d S )N皙?iF   )avg_max_bitrate_kbpsvar_max_bitrate_kbpscurrent_bitratecurrent_bitrate_initializedfirst_estimated_throughput_timelast_change_msnear_maxlatest_estimated_throughputrttr   r   stateselfr   r   r   __init__$   s   zAimdRateControl.__init__c                 C   s   dS )Ni  r   r,   r   r   r   feedback_interval0   s   z!AimdRateControl.feedback_intervalbitratenow_msc                 C   s   |  ||| _d| _|| _dS )z'
        For testing purposes.
        TN)_clamp_bitrater$   r%   r'   )r-   r0   r1   r   r   r   set_estimate3   s   
zAimdRateControl.set_estimatebandwidth_usageestimated_throughputc                 C   s  | j s|d ur| jd u r|| _n|| j dkr|| _d| _ | j s'|tjkr'd S |tjkr:| jtjkr:|| _	tj
| _n|tjkrDtj| _n	|tjkrMtj| _| j}|d urX|| _n| j}|d }| jtj
kr| jd urt| j| j }|| jd|  krd| _d | _| jr|| | j	|7 }n
|| || j	|7 }|| _	n5| jtjkr| jd urt| j| j }|| jd|  k rd | _| | d| _td| }|| _	tj| _| ||| _| jS )Ni  Tr
      Fg333333?)r%   r&   r$   r   r   r   r+   r   r   r'   r   r   r   r)   r"   mathsqrtr#   r(   _additive_rate_increase_multiplicative_rate_increase_update_max_throughput_estimateroundr2   )r-   r4   r5   r1   new_bitrateestimated_throughput_kbps
sigma_kbpsr   r   r   update;   sn   











zAimdRateControl.updatelast_msc                 C   s   t || |   d S )Nr
   )int_near_max_rate_increase)r-   rA   r1   r   r   r   r9         z'AimdRateControl._additive_rate_increaser=   c                 C   s"   t td| d | j}t||S )Ng      ?i'  )maxrB   r$   min)r-   r=   r5   max_bitrater   r   r   r2      s   
zAimdRateControl._clamp_bitratec                 C   s>   d}|d urt || d}t||d }tt|d | dS )NgHzG?r
   r   )rF   powrB   rE   )r-   r=   rA   r1   alpha
elapsed_msr   r   r   r:      s
   z-AimdRateControl._multiplicative_rate_increasec                 C   s@   | j d }t|d }|| }| jd }tdt|d | S )N   i%  d   i  r
   )r$   r7   ceilr*   rE   rB   )r-   bits_per_framepackets_per_frameavg_packet_size_bitsresponse_timer   r   r   rC      s
   

z'AimdRateControl._near_max_rate_increaser>   c                 C   sx   d}| j d u r|| _ nd| | j  ||  | _ td| j }d| | j || j | d  |  | _tdt| jd| _d S )Ng?r   r   r    g      @)r"   rE   r#   rF   )r-   r>   rI   normr   r   r   r;      s   
z/AimdRateControl._update_max_throughput_estimater   N)r   r   r   r.   rB   r/   r3   r   r   r@   r9   r2   r:   rC   floatr;   r   r   r   r   r   #   s4    

V
	r   c                   @   s$   e Zd Zddee ddfddZdS )TimestampGroupN	timestampr   c                 C   s   d | _ || _|| _d| _d S Nr   )arrival_timefirst_timestamplast_timestampsize)r-   rV   r   r   r   r.         
zTimestampGroup.__init__N)r   r   r   r   rB   r.   r   r   r   r   rU      s    rU   c                   @   s&   e Zd ZdedededdfddZdS )InterArrivalDeltarV   rX   r[   r   Nc                 C   s   || _ || _|| _d S r]   rV   rX   r[   )r-   rV   rX   r[   r   r   r   r.      s   
zInterArrivalDelta.__init__)r   r   r   rB   r.   r   r   r   r   r^      s    r^   c                	   @   s   e Zd ZdZdededdfddZded	ed
edee fddZ	ded	ede
fddZded	ede
fddZdede
fddZdS )InterArrivalzX
    Inter-arrival time and size filter.

    Adapted from the webrtc.org codebase.
    group_lengthtimestamp_to_msr   Nc                 C   s   || _ || _d | _d | _d S r]   )ra   rb   current_groupprevious_group)r-   ra   rb   r   r   r   r.      r\   zInterArrival.__init__rV   rX   packet_sizec                 C   s   d }| j d u rt|| _ nC| |r|S | ||rE| jd ur:tt| j j| jj | j j| jj | j j	| jj	 d}| j | _t|d| _ nt
|| j jrP|| j _| j  j	|7  _	|| j _|S )Nr_   )rV   )rc   rU   packet_out_of_ordernew_timestamp_grouprd   r^   r   rZ   rX   r[   r   )r-   rV   rX   re   deltasr   r   r   compute_deltas   s0   


zInterArrival.compute_deltasc                 C   sF   t || jj }t| j| }|| jj }|dkp"|| dk o"|tkS rW   )r   rc   rZ   r<   rb   rX   BURST_DELTA_THRESHOLD_MS)r-   rV   rX   timestamp_deltatimestamp_delta_msarrival_time_deltar   r   r   belongs_to_burst   s   zInterArrival.belongs_to_burstc                 C   s*   |  ||rdS t|| jj }|| jkS )NF)rn   r   rc   rY   ra   )r-   rV   rX   rk   r   r   r   rg      s   
z InterArrival.new_timestamp_groupc                 C   s   t || jj }|dkS )Nl        )r   rc   rY   )r-   rV   rk   r   r   r   rf     s   z InterArrival.packet_out_of_order)r   r   r   __doc__rB   rT   r.   r   r^   ri   boolrn   rg   rf   r   r   r   r   r`      s    
!	r`   c                
   @   s\   e Zd ZdZdddZdededed	edef
d
dZdefddZ	ded	eddfddZ
dS )OveruseDetectorzP
    Bandwidth overuse detector.

    Adapted from the webrtc.org codebase.
    r   Nc                 C   s<   t j| _d | _d| _d| _d| _d | _d| _d| _	d| _
d S )Ng5;Nс?g+?r   
           g      )@)r   r   
hypothesislast_update_msk_upk_downoveruse_counteroveruse_timeoveruse_time_thresholdprevious_offset	thresholdr,   r   r   r   r.     s   
zOveruseDetector.__init__offsetrl   num_of_deltasr1   c                 C   s   |dk rt jS t|t| }|| jkrG| jd u r|d | _n|  j|7  _|  jd7  _| j| jkrF| jdkrF|| jkrFd| _d| _t j	| _
n|| j k rXd| _d | _t j| _
n
d| _d | _t j| _
|| _| || | j
S )Nr   r   r   )r   r   rF   MIN_NUM_DELTASr|   ry   rx   rz   r{   r   rt   r   update_threshold)r-   r}   rl   r~   r1   Tr   r   r   detect  s2   




zOveruseDetector.detectc                 C      | j S r]   )rt   r,   r   r   r   r+   @     zOveruseDetector.statemodified_offsetc                 C   s   | j d u r|| _ t|| jt kr|| _ d S t|| jk r | jn| j}t|| j  d}|  j|t|| j  | 7  _tdt| jd| _|| _ d S )NrL      iX  )ru   absr|   MAX_ADAPT_OFFSET_MSrw   rv   rF   rE   )r-   r   r1   ktime_delta_msr   r   r   r   C  s   
 
z OveruseDetector.update_thresholdrS   )r   r   r   ro   r.   rT   rB   r   r   r+   r   r   r   r   r   rq     s     

#rq   c                   @   s   e Zd ZdZdddZdefddZdefdd	Zd
ededede	deddfddZ
dedefddZdededdfddZdS )OveruseEstimatorzQ
    Bandwidth overuse estimator.

    Adapted from the webrtc.org codebase.
    r   Nc                 C   sJ   ddgddgg| _ d| _d| _d| _d| _g | _d| _d| _ddg| _d S )	Ng      Y@rs   g?r   g      ?g      I@gvIh%<=gMbP?)	E_num_of_deltas_offsetr{   slopets_delta_hist	avg_noise	var_noiseprocess_noiser,   r   r   r   r.   Y  s   zOveruseEstimator.__init__c                 C   r   r]   )r   r,   r   r   r   r~   e  r   zOveruseEstimator.num_of_deltasc                 C   r   r]   )r   r,   r   r   r   r}   h  r   zOveruseEstimator.offsetr   rl   
size_deltacurrent_hypothesisr1   c                 C   s   |  |}|| }|}t| jd t| _| jd d  | jd 7  < | jd d  | jd 7  < |tjkr;| j| j	k sF|tj
krV| j| j	krV| jd d  d| jd  7  < |dg}	| jd d |	d  | jd d |	d   | jd d |	d  | jd d |	d   g}
|| j|	d   | j }|tjkrdt| j }t||k r| || n| |dk r| n|| | j|	d |
d   |	d |
d   }|
d | |
d | g}d|d |	d   |d  |	d  g|d  |	d  d|d |	d   gg}| jd d }| jd d }||d d  | jd d |d d   | jd d< ||d d  | jd d |d d   | jd d< ||d d  | jd d |d d   | jd d< ||d d  | jd d |d d   | jd d< | j| _	|  j|d | 7  _|  j|d | 7  _d S )Nr   r   rr   g      ?g      @)update_min_frame_periodrF   r   DELTA_COUNTER_MAXr   r   r   r   r   r{   r   r   r   r7   r8   r   r   update_noise_estimate)r-   r   rl   r   r   r1   min_frame_period
t_ts_deltafs_deltahEhresidualmax_residualdenomKIKhe00e01r   r   r   r@   k  sF   


 **
&L4444zOveruseEstimator.updatets_deltac                 C   sD   |}t | jtkr| jd | jD ]}t||}q| j| |S rW   )lenr   MIN_FRAME_PERIOD_HISTORY_LENGTHpoprF   append)r-   r   r   old_ts_deltar   r   r   r     s   
z(OveruseEstimator.update_min_frame_periodr   c                 C   sz   d}| j dkr	d}td| |d d }|| j d| |  | _|| j d| | j| d   | _| jdk r;d| _d S d S )Ng{Gz?i,  gMb`?r   g      >@r   r   )r   rH   r   r   )r-   r   r   rI   betar   r   r   r     s   


z&OveruseEstimator.update_noise_estimaterS   )r   r   r   ro   r.   rB   r~   rT   r}   r   r@   r   r   r   r   r   r   r   R  s(    

<r   c                   @   s6   e Zd ZddededdfddZdedefd	d
ZdS )
RateBucketr   countvaluer   Nc                 C   s   || _ || _d S r]   r   r   )r-   r   r   r   r   r   r.     s   
zRateBucket.__init__otherc                 C   s   | j |j ko| j|jkS r]   r   )r-   r   r   r   r   __eq__  rD   zRateBucket.__eq__)r   r   )r   r   r   rB   r.   r   rp   r   r   r   r   r   r     s    r   c                   @   sp   e Zd ZdZddededdfddZd	ed
eddfddZd
edee fddZdddZ	d
eddfddZ
dS )RateCounterzH
    Rate counter, which stores the amount received in 1ms buckets.
    @  window_sizescaler   Nc                 C   s$   d| _ d | _|| _|| _|   d S rW   )_origin_index
_origin_ms_scale_window_sizereset)r-   r   r   r   r   r   r.     s
   zRateCounter.__init__r   r1   c                 C   s~   | j d u r	|| _ n| | | j| | j  | j }| j|  jd7  _| j|  j|7  _| j jd7  _| j j|7  _d S )Nr   )r   
_erase_oldr   r   _bucketsr   r   _total)r-   r   r1   indexr   r   r   add  s   

zRateCounter.addc                 C   sP   | j d ur&| | || j  d }| jjdkr&|dkr&t| j| jj | S d S Nr   r   )r   r   r   r   r<   r   r   )r-   r1   active_window_sizer   r   r   rate  s   

zRateCounter.ratec                 C   s.   dd t | jD | _d| _d | _t | _d S )Nc                 S   s   g | ]}t  qS r   )r   ).0ir   r   r   
<listcomp>  s    z%RateCounter.reset.<locals>.<listcomp>r   )ranger   r   r   r   r   r   r,   r   r   r   r     s   zRateCounter.resetc                 C   s   || j  d }| j|k rA| j| j }| j j|j8  _| j j|j8  _d|_d|_| jd | j  | _|  jd7  _| j|k sd S d S r   )r   r   r   r   r   r   r   )r-   r1   new_origin_msbucketr   r   r   r     s   
zRateCounter._erase_old)r   rS   )r   r   r   ro   rB   r.   r   r   r   r   r   r   r   r   r   r     s    
r   c                   @   sD   e Zd ZdddZdededededeeeee f  f
d	d
ZdS )RemoteBitrateEstimatorr   Nc                 C   sN   t dd| _d| _ttt> d t| _t | _	t
 | _t | _d | _i | _d S )Nr
   r   T)r   incoming_bitrateincoming_bitrate_initializedr`   TIMESTAMP_GROUP_LENGTH_MSINTER_ARRIVAL_SHIFTTIMESTAMP_TO_MSinter_arrivalr   	estimatorrq   detectorr   rate_controlru   ssrcsr,   r   r   r   r.     s   
zRemoteBitrateEstimator.__init__arrival_time_msabs_send_timepayload_sizessrcc           
      C   s2  |d> }d}|| j |< | j|d urd| _n| jr"| j  d| _| j|| | j|||}|d urX|jt	 }| j
|j||j| j | | j| j
 || j
 | |sv| jd u si|| j | j krld}n
| j tjkrvd}|r| j| j | j||}	|	d ur|| _|	t| j  fS d S )N   FT)r   r   r   r   r   r   r   ri   rV   r   r   r@   rX   r[   r   r+   r   r}   r~   ru   r   r/   r   r   listkeys)
r-   r   r   r   r   rV   update_estimaterh   rl   target_bitrater   r   r   r   
  sZ   




zRemoteBitrateEstimator.addrS   )	r   r   r   r.   rB   r   tupler   r   r   r   r   r   r     s    
r   )r7   enumr   typingr   r   aiortc.utilsr   r   rj   r   r   r   r   r   r   r   r   r   r   rU   r^   r`   rq   r   r   r   r   r   r   r   r   <module>   s0     CGo	3