Ë
    ÖÉ�jÞP  ã                   óD  — 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  z  Z G d„ de«      Z G d„ de«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d „ d!«      Zy)"é    N)ÚEnum)ÚAnyÚOptional)Ú
uint32_addÚ	uint32_gté   é   é<   éè  é   ç     @�@é   c                   ó   — e Zd ZdZdZdZy)ÚBandwidthUsager   r   é   N)Ú__name__Ú
__module__Ú__qualname__ÚNORMALÚ
UNDERUSINGÚ	OVERUSING© ó    úL/home/uftp/webrtc-recorder/.venv/lib/python3.12/site-packages/aiortc/rate.pyr   r      s   „ Ø€FØ€JØ�Ir   r   c                   ó   — e Zd ZdZdZdZy)ÚRateControlStater   r   r   N)r   r   r   ÚHOLDÚINCREASEÚDECREASEr   r   r   r   r      s   „ Ø€DØ€HØ�Hr   r   c            	       ó´   — e Zd Zdd„Zdefd„Zdededdfd„Zded	ee   dedee   fd
„Z	dededefd„Z
ded	edefd„Zdedededefd„Zdefd„Zdeddfd„Zy)ÚAimdRateControlÚreturnNc                 ó¬   — d | _         d| _        d| _        d| _        d | _        d | _        d| _        d| _        d| _        t        j                  | _        y )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©Úselfs    r   Ú__init__zAimdRateControl.__init__$   sU   € Ø59ˆÔ!Ø$'ˆÔ!Ø'ˆÔØ+0ˆÔ(Ø>BˆÔ,Ø-1ˆÔØˆŒØ+3ˆÔ(ØˆŒÜ%×*Ñ*ˆ�
r   c                  ó   — y)Niô  r   r0   s    r   Úfeedback_intervalz!AimdRateControl.feedback_interval0   s   € Ør   ÚbitrateÚnow_msc                 óN   — | j                  ||«      | _        d| _        || _        y)z'
        For testing purposes.
        TN)Ú_clamp_bitrater(   r)   r+   )r1   r5   r6   s      r   Úset_estimatezAimdRateControl.set_estimate3   s)   € ð  $×2Ñ2°7¸GÓDˆÔØ+/ˆÔ(Ø$ˆÕr   Úbandwidth_usageÚestimated_throughputc                 ó”  — | j                   s6|�4| j                  €|| _        n || j                  z
  dkD  r|| _        d| _         | j                   s|t        j                  k7  ry |t        j
                  k(  r:| j                  t        j                  k(  r|| _	        t        j                  | _        nQ|t        j                  k(  rt        j                  | _        n(|t        j                  k(  rt        j                  | _        | j                  }|�|| _        n| j                  }|dz  }| j                  t        j                  k(  r¯| j                  �Ot        j                   | j"                  | j                  z  «      }|| j                  d|z  z   k\  rd| _        d | _        | j$                  r || j'                  | j                  |«      z  }n || j)                  || j                  |«      z  }|| _	        n³| j                  t        j                  k(  r–| j                  �Ht        j                   | j"                  | j                  z  «      }|| j                  d|z  z
  k  rd | _        | j+                  |«       d| _        t-        d|z  «      }|| _	        t        j                  | _        | 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Úroundr8   )r1   r:   r;   r6   Únew_bitrateÚestimated_throughput_kbpsÚ
sigma_kbpss          r   ÚupdatezAimdRateControl.update;   s•  € ð ×/Ò/Ð4HÐ4TØ×3Ñ3Ð;Ø7=�Õ4Ø˜$×>Ñ>Ñ>ÀÒEØ';�Ô$Ø37�Ô0ð ×0Ò0Ø¤>×#;Ñ#;Ò;àð œ~×4Ñ4Ò4Ø—
‘
Ô.×3Ñ3Ò3à"(ˆDÔÜ)×2Ñ2ˆD�JØ¤× 8Ñ 8Ò8Ü)×2Ñ2ˆD�JØ¤× 9Ñ 9Ò9Ü)×.Ñ.ˆDŒJð ×*Ñ*ˆØÐ+Ø/CˆDÕ,à#'×#CÑ#CÐ Ø$8¸4Ñ$?Ð!ð �:‰:Ô)×2Ñ2Ò2ð ×(Ñ(Ð4Ü!ŸY™YØ×-Ñ-°×0IÑ0IÑIó�
ð .Ø×0Ñ0°1°z±>ÑAòBð %*�D”MØ04�DÔ-ð �}Š}Ø˜t×;Ñ;¸D×<OÑ<OÐQWÓXÑX‘à˜t×AÑAØ ×!4Ñ!4°fó ñ �ð #)ˆDÕØ�Z‰ZÔ+×4Ñ4Ò4ð ×(Ñ(Ð4Ü!ŸY™YØ×-Ñ-°×0IÑ0IÑIó�
ð .Ø×/Ñ/°!°j±.Ñ@òAð 15�DÔ-Ø×0Ñ0Ð1JÔKà ˆDŒMÜ Ð';Ñ ;Ó<ˆKØ"(ˆDÔÜ)×.Ñ.ˆDŒJà#×2Ñ2°;Ð@TÓUˆÔØ×#Ñ#Ð#r   Úlast_msc                 óF   — t        ||z
  | j                  «       z  dz  «      S )Nr   )ÚintÚ_near_max_rate_increase)r1   rH   r6   s      r   r@   z'AimdRateControl._additive_rate_increase‘   s%   € Ü�F˜WÑ$¨×(DÑ(DÓ(FÑFÈÑMÓNÐNr   rD   c                 ód   — t        t        d|z  «      dz   | j                  «      }t        ||«      S )Ng      ø?i'  )ÚmaxrJ   r(   Úmin)r1   rD   r;   Úmax_bitrates       r   r8   zAimdRateControl._clamp_bitrate”   s1   € Üœ#˜cÐ$8Ñ8Ó9¸EÑAÀ4×CWÑCWÓXˆÜ�; Ó,Ð,r   c                 ó|   — d}|�t        ||z
  d«      }t        ||dz  «      }t        t        |dz
  |z  d«      «      S )NgHáz®Gñ?r   r   )rN   ÚpowrJ   rM   )r1   rD   rH   r6   ÚalphaÚ
elapsed_mss         r   rA   z-AimdRateControl._multiplicative_rate_increase˜   sL   € ð ˆØÐÜ˜V gÑ-¨tÓ4ˆJÜ˜˜z¨DÑ0Ó1ˆEÜ”3˜ ™	 [Ñ0°$Ó7Ó8Ð8r   c                 ó®   — | j                   dz  }t        j                  |dz  «      }||z  }| j                  dz   }t	        dt        |dz  |z  «      «      S )Né   i€%  éd   i   r   )r(   r>   Úceilr.   rM   rJ   )r1   Úbits_per_frameÚpackets_per_frameÚavg_packet_size_bitsÚresponse_times        r   rK   z'AimdRateControl._near_max_rate_increase¡   s\   € Ø×-Ñ-°Ñ2ˆÜ ŸI™I n¸Ñ&AÓBÐØ-Ð0AÑAÐàŸ™ 3™ˆÜ�4œÐ2°TÑ9¸]ÑJÓKÓLÐLr   rE   c                 ó@  — d}| j                   €|| _         nd|z
  | j                   z  ||z  z   | _         t        d| j                   «      }d|z
  | j                  z  || j                   |z
  dz  z  |z  z   | _        t        dt        | j                  d«      «      | _        y )Ngš™™™™™©?r   r   r$   g      @)r&   rM   r'   rN   )r1   rE   rR   Únorms       r   rB   z/AimdRateControl._update_max_throughput_estimate©   s¹   € ØˆØ×$Ñ$Ð,Ø(AˆDÕ%ð �E‘	Ø×)Ñ)ñ)*à,1Ð4MÑ,Mñ)NˆDÔ%ô �1�d×/Ñ/Ó0ˆØ%&¨¡Y°$×2KÑ2KÑ$KÈeØ×&Ñ&Ð)BÑBÀqÑHñO
àñOñ %ˆÔ!ô %(¨¬S°×1JÑ1JÈCÓ-PÓ$QˆÕ!r   ©r"   N)r   r   r   r2   rJ   r4   r9   r   r   rG   r@   r8   rA   rK   ÚfloatrB   r   r   r   r!   r!   #   sè   „ ó
+ð 3ó ð% Cð %°ð %¸ó %ðT$à'ðT$ð ' s™mðT$ð ð	T$ð
 
�#‰óT$ðlO¨sð O¸Cð OÀCó Oð-¨#ð -ÀSð -ÈSó -ð9Øð9Ø),ð9Ø69ð9à	ó9ðM¨ó MðRÈð RÐSWô Rr   r!   c                   ó$   — e Zd Zddee   ddfd„Zy)ÚTimestampGroupNÚ	timestampr"   c                 ó<   — d | _         || _        || _        d| _        y ©Nr   )Úarrival_timeÚfirst_timestampÚlast_timestampÚsize)r1   rb   s     r   r2   zTimestampGroup.__init__º   s!   € Ø+/ˆÔØ(ˆÔØ'ˆÔØˆ�	r   ©N)r   r   r   r   rJ   r2   r   r   r   ra   ra   ¹   s   „ ñ (¨3¡-ð ¸4ô r   ra   c                   ó$   — e Zd Zdedededdfd„Zy)ÚInterArrivalDeltarb   re   rh   r"   Nc                 ó.   — || _         || _        || _        y ri   ©rb   re   rh   )r1   rb   re   rh   s       r   r2   zInterArrivalDelta.__init__Â   s   € Ø"ˆŒØ(ˆÔØˆ�	r   )r   r   r   rJ   r2   r   r   r   rk   rk   Á   s#   „ ð #ð °Sð Àð Èô r   rk   c            	       óz   — e Zd ZdZdededdfd„Zdeded	edee   fd
„Z	dedede
fd„Zdedede
fd„Zdede
fd„Zy)ÚInterArrivalzX
    Inter-arrival time and size filter.

    Adapted from the webrtc.org codebase.
    Úgroup_lengthÚtimestamp_to_msr"   Nc                 ó<   — || _         || _        d | _        d | _        y ri   )rp   rq   Úcurrent_groupÚprevious_group)r1   rp   rq   s      r   r2   zInterArrival.__init__Ï   s"   € Ø(ˆÔØ.ˆÔØ7;ˆÔØ8<ˆÕr   rb   re   Úpacket_sizec                 óÞ  — d }| j                   €t        |«      | _         �n| j                  |«      r|S | j                  ||«      rÆ| j                  �—t        t        | j                   j                  | j                  j                   «      | j                   j                  | j                  j                  z
  | j                   j                  | j                  j                  z
  ¬«      }| j                   | _        t        |¬«      | _         n1t        || j                   j                  «      r|| j                   _        | j                   xj                  |z  c_	        || j                   _        |S )Nrm   )rb   )rs   ra   Úpacket_out_of_orderÚnew_timestamp_grouprt   rk   r   rg   re   rh   r   )r1   rb   re   ru   Údeltass        r   Úcompute_deltaszInterArrival.compute_deltasÕ   s6  € ð ˆØ×ÑÐ%Ü!/°	Ó!:ˆDÖØ×%Ñ% iÔ0ØˆMØ×%Ñ% i°Ô>Ø×"Ñ"Ð.Ü*Ü(Ø×*Ñ*×9Ñ9Ø×,Ñ,×;Ñ;Ð;óð
 ×*Ñ*×7Ñ7Ø×-Ñ-×:Ñ:ñ;ð ×+Ñ+×0Ñ0°4×3FÑ3F×3KÑ3KÑKô
�ð #'×"4Ñ"4ˆDÔÜ!/¸)Ô!DˆDÕÜ�y $×"4Ñ"4×"CÑ"CÔDØ09ˆD×ÑÔ-à×Ñ×Ò ;Ñ.ÕØ*6ˆ×ÑÔ'àˆr   c                 óÚ   — t        || j                  j                   «      }t        | j                  |z  «      }|| j                  j
                  z
  }|dk(  xs ||z
  dk  xr	 |t        k  S rd   )r   rs   rg   rC   rq   re   ÚBURST_DELTA_THRESHOLD_MS)r1   rb   re   Útimestamp_deltaÚtimestamp_delta_msÚarrival_time_deltas         r   Úbelongs_to_burstzInterArrival.belongs_to_burstö   sx   € Ü$ Y°×1CÑ1C×1RÑ1RÐ0RÓSˆÜ" 4×#7Ñ#7¸/Ñ#IÓJÐØ)¨D×,>Ñ,>×,KÑ,KÑKÐØ! QÑ&ò 
ØÐ"4Ñ4¸Ñ9ò ?Ø"Ô&>Ñ>ð	
r   c                 óˆ   — | j                  ||«      ryt        || j                  j                   «      }|| j                  kD  S )NF)r€   r   rs   rf   rp   )r1   rb   re   r}   s       r   rx   z InterArrival.new_timestamp_groupÿ   sA   € Ø× Ñ  ¨LÔ9Øä(¨°T×5GÑ5G×5WÑ5WÐ4WÓXˆOØ" T×%6Ñ%6Ñ6Ð6r   c                 óN   — t        || j                  j                   «      }|dk\  S )Nl        )r   rs   rf   )r1   rb   r}   s      r   rw   z InterArrival.packet_out_of_order  s(   € Ü$ Y°×1CÑ1C×1SÑ1SÐ0SÓTˆØ *Ñ,Ð,r   )r   r   r   Ú__doc__rJ   r_   r2   r   rk   rz   Úboolr€   rx   rw   r   r   r   ro   ro   È   s”   „ ñð= Sð =¸5ð =ÀTó =ðØðØ,/ðØ>Aðà	Ð#Ñ	$óðB
¨#ð 
¸Sð 
ÀTó 
ð7¨Sð 7Àð 7Èó 7ð-¨Sð -°Tô -r   ro   c            
       óT   — e Zd ZdZdd„Zdededededef
d	„Zdefd
„Z	dededdfd„Z
y)ÚOveruseDetectorzP
    Bandwidth overuse detector.

    Adapted from the webrtc.org codebase.
    r"   Nc                 óž   — t         j                  | _        d | _        d| _        d| _        d| _        d | _        d| _        d| _	        d| _
        y )Ng¨5Í;NÑ�?g+‡ÙÎ÷£?r   é
   ç        g      )@)r   r   Ú
hypothesisÚlast_update_msÚk_upÚk_downÚoveruse_counterÚoveruse_timeÚoveruse_time_thresholdÚprevious_offsetÚ	thresholdr0   s    r   r2   zOveruseDetector.__init__  sL   € Ü(×/Ñ/ˆŒØ-1ˆÔØˆŒ	ØˆŒØ ˆÔØ-1ˆÔØ&(ˆÔ#Ø"ˆÔØˆ�r   Úoffsetr~   Únum_of_deltasr6   c                 ó   — |dk  rt         j                  S t        |t        «      |z  }|| j                  kD  rœ| j
                  €|dz  | _        n| xj
                  |z  c_        | xj                  dz  c_        | j
                  | j                  kD  r™| j                  dkD  rŠ|| j                  k\  r{d| _        d| _        t         j                  | _
        nW|| j                   k  r$d| _        d | _        t         j                  | _
        n#d| _        d | _        t         j                  | _
        || _        | j                  ||«       | j                  S )Nr   r   r   )r   r   rN   ÚMIN_NUM_DELTASr’   r�   rŽ   r�   r‘   r   rŠ   r   Úupdate_threshold)r1   r“   r~   r”   r6   ÚTs         r   ÚdetectzOveruseDetector.detect  s*  € ð ˜1ÒÜ!×(Ñ(Ð(ä�œ~Ó.°Ñ7ˆØˆt�~‰~ÒØ× Ñ Ð(Ø$6¸Ñ$:�Õ!à×!Ò!Ð%7Ñ7Õ!Ø× Ò  AÑ%Õ ð ×!Ñ! D×$?Ñ$?Ò?Ø×(Ñ(¨1Ò,Ø˜d×2Ñ2Ò2à'(�Ô$Ø$%�Ô!Ü"0×":Ñ":�•Ø�$—.‘.�Ò Ø#$ˆDÔ Ø $ˆDÔÜ,×7Ñ7ˆD�Oà#$ˆDÔ Ø $ˆDÔÜ,×3Ñ3ˆDŒOà%ˆÔØ×Ñ˜a Ô(Ø�‰Ðr   c                 ó   — | j                   S ri   )rŠ   r0   s    r   r/   zOveruseDetector.state@  s   € Ø�‰Ðr   Úmodified_offsetc                 óÄ  — | j                   €|| _         t        |«      | j                  t        z   kD  r|| _         y t        |«      | j                  k  r| j                  n| j
                  }t        || j                   z
  d«      }| xj                  |t        |«      | j                  z
  z  |z  z  c_        t        dt        | j                  d«      «      | _        || _         y )NrV   é   iX  )r‹   Úabsr’   ÚMAX_ADAPT_OFFSET_MSr�   rŒ   rN   rM   )r1   r›   r6   ÚkÚtime_delta_mss        r   r—   z OveruseDetector.update_thresholdC  sµ   € Ø×ÑÐ&Ø"(ˆDÔäˆÓ $§.¡.Ô3FÑ"FÒFØ"(ˆDÔØä˜Ó/°$·.±.Ò@ˆD�KŠKÀdÇiÁiˆÜ˜F T×%8Ñ%8Ñ8¸#Ó>ˆØ�Š˜!œs ?Ó3°d·n±nÑDÑEÈÑUÑU�Ü˜Q¤ D§N¡N°CÓ 8Ó9ˆŒØ$ˆÕr   r^   )r   r   r   rƒ   r2   r_   rJ   r   r™   r/   r—   r   r   r   r†   r†     s`   „ ñó	ð!Øð!Ø16ð!ØGJð!ØTWð!à	ó!ðF�~ó ð%°ð %¸sð %Àtô %r   r†   c                   ót   — e Zd ZdZdd„Zdefd„Zdefd„Zdeded	ed
e	deddfd„Z
dedefd„Zdededdfd„Zy)ÚOveruseEstimatorzQ
    Bandwidth overuse estimator.

    Adapted from the webrtc.org codebase.
    r"   Nc                 ó’   — ddgddgg| _         d| _        d| _        d| _        d| _        g | _        d| _        d| _        ddg| _        y )	Ng      Y@r‰   gš™™™™™¹?r   g      �?g      I@g‚vIhÂ%<=gü©ñÒMbP?)	ÚEÚ_num_of_deltasÚ_offsetr‘   ÚslopeÚts_delta_histÚ	avg_noiseÚ	var_noiseÚprocess_noiser0   s    r   r2   zOveruseEstimator.__init__Y  sV   € Ø˜#�,  c 
Ð+ˆŒØˆÔØˆŒØ"ˆÔØˆŒ
Ø*,ˆÔàˆŒØˆŒØ# T˜]ˆÕr   c                 ó   — | j                   S ri   )r¦   r0   s    r   r”   zOveruseEstimator.num_of_deltase  s   € Ø×"Ñ"Ð"r   c                 ó   — | j                   S ri   )r§   r0   s    r   r“   zOveruseEstimator.offseth  s   € Ø�|‰|Ðr   r¡   r~   Ú
size_deltaÚcurrent_hypothesisr6   c                 óf  — | j                  |«      }||z
  }|}t        | j                  dz   t        «      | _        | j                  d   dxx   | j
                  d   z  cc<   | j                  d   dxx   | j
                  d   z  cc<   |t        j                  k(  r| j                  | j                  k  s,|t        j                  k(  rC| j                  | j                  kD  r*| j                  d   dxx   d| j
                  d   z  z  cc<   |dg}	| j                  d   d   |	d   z  | j                  d   d   |	d   z  z   | j                  d   d   |	d   z  | j                  d   d   |	d   z  z   g}
|| j                  |	d   z  z
  | j                  z
  }|t        j                  k(  r]dt        j                  | j                  «      z  }t!        |«      |k  r| j#                  ||«       n| j#                  |dk  r| n||«       | j                  |	d   |
d   z  z   |	d   |
d   z  z   }|
d   |z  |
d   |z  g}d|d   |	d   z  z
  |d    |	d   z  g|d    |	d   z  d|d   |	d   z  z
  gg}| j                  d   d   }| j                  d   d   }||d   d   z  | j                  d   d   |d   d   z  z   | j                  d   d<   ||d   d   z  | j                  d   d   |d   d   z  z   | j                  d   d<   ||d   d   z  | j                  d   d   |d   d   z  z   | j                  d   d<   ||d   d   z  | j                  d   d   |d   d   z  z   | j                  d   d<   | j                  | _	        | xj                  |d   |z  z  c_        | xj                  |d   |z  z  c_        y )Nr   r   rˆ   g      ð?g      @)Úupdate_min_frame_periodrN   r¦   ÚDELTA_COUNTER_MAXr¥   r¬   r   r   r§   r‘   r   r¨   r   r>   r?   r«   rž   Úupdate_noise_estimate)r1   r¡   r~   r¯   r°   r6   Úmin_frame_periodÚ
t_ts_deltaÚfs_deltaÚhÚEhÚresidualÚmax_residualÚdenomÚKÚIKhÚe00Úe01s                     r   rG   zOveruseEstimator.updatek  sÃ  € ð  ×7Ñ7Ð8JÓKÐØ"Ð%7Ñ7ˆ
Øˆä! $×"5Ñ"5¸Ñ"9Ô;LÓMˆÔð 	�‰ˆq‰	�!‹˜×*Ñ*¨1Ñ-Ñ-‹Ø�‰ˆq‰	�!‹˜×*Ñ*¨1Ñ-Ñ-‹à¤.×":Ñ":Ò:Ø—‘˜t×3Ñ3Ò3à¤.×";Ñ";Ò;Ø—‘˜t×3Ñ3Ò3à�F‰F�1‰I�a‹L˜B ×!3Ñ!3°AÑ!6Ñ6Ñ6‹Là�sˆOˆà�F‰F�1‰I�a‰L˜1˜Q™4Ñ $§&¡&¨¡)¨A¡,°°1±Ñ"5Ñ5Ø�F‰F�1‰I�a‰L˜1˜Q™4Ñ $§&¡&¨¡)¨A¡,°°1±Ñ"5Ñ5ð
ˆð  §
¡
¨Q¨q©TÑ 1Ñ1°D·L±LÑ@ˆØ¤×!6Ñ!6Ò6Ø¤§¡¨4¯>©>Ó!:Ñ:ˆLÜ�8‹}˜|Ò+Ø×*Ñ*¨8Ð5EÕFà×*Ñ*Ø%-°¢\�\‘M°|ÐEUôð —‘  1¡¨¨1©¡Ñ-°°!±°r¸!±u±Ñ<ˆØ�‰U�U‰]˜B˜q™E E™MÐ*ˆà�a˜‘d˜Q˜q™T‘kÑ! A a¡D 5¨1¨Q©4¡<Ð0°A°a±D°5¸1¸Q¹4±<ÀÀqÈÁtÈaÐPQÉdÁ{ÑARÐ2SÐTˆØ�f‰f�Q‰i˜‰lˆØ�f‰f�Q‰i˜‰lˆð ˜S ™V A™Y‘¨¯©°©°1©¸¸A¹¸q¹	Ñ)AÑAˆ�‰ˆq‰	�!‰Ø˜S ™V A™Y‘¨¯©°©°1©¸¸A¹¸q¹	Ñ)AÑAˆ�‰ˆq‰	�!‰Ø˜S ™V A™Y‘¨¯©°©°1©¸¸A¹¸q¹	Ñ)AÑAˆ�‰ˆq‰	�!‰Ø˜S ™V A™Y‘¨¯©°©°1©¸¸A¹¸q¹	Ñ)AÑAˆ�‰ˆq‰	�!‰à#Ÿ|™|ˆÔØ�
Š
�a˜‘d˜X‘oÑ%�
Ø�Š˜˜!™˜x™Ñ'Žr   Úts_deltac                 óè   — |}t        | j                  «      t        k\  r| j                  j                  d«       | j                  D ]  }t	        ||«      }Œ | j                  j                  |«       |S rd   )Úlenr©   ÚMIN_FRAME_PERIOD_HISTORY_LENGTHÚpoprN   Úappend)r1   rÁ   rµ   Úold_ts_deltas       r   r²   z(OveruseEstimator.update_min_frame_period§  sq   € Ø#ÐÜˆt×!Ñ!Ó"Ô&EÒEØ×Ñ×"Ñ" 1Ô%à ×.Ñ.ò 	CˆLÜ" <Ð1AÓBÑð	Cð 	×Ñ×!Ñ! (Ô+ØÐr   rº   c                 ó  — d}| j                   dkD  rd}t        d|z
  |dz  dz  «      }|| j                  z  d|z
  |z  z   | _        || j                  z  d|z
  | j                  |z
  dz  z  z   | _        | j                  dk  rd| _        y y )Ng{®Gáz„?i,  gü©ñÒMb`?r   g      >@r   r   )r¦   rQ   rª   r«   )r1   rº   rÁ   rR   Úbetas        r   r´   z&OveruseEstimator.update_noise_estimate²  s›   € ØˆØ×Ñ Ò(ØˆEä�1�u‘9˜h¨™o°Ñ6Ó7ˆØ §¡Ñ.°!°d±(¸hÑ1FÑFˆŒà�4—>‘>Ñ! Q¨¡X°$·.±.À8Ñ2KÐPQÑ1QÑ$QÑQð 	Œð �>‰>˜AÒØˆD�Nð r   r^   )r   r   r   rƒ   r2   rJ   r”   r_   r“   r   rG   r²   r´   r   r   r   r£   r£   R  s‘   „ ñó
+ð#˜só #ð˜ó ð:(àð:(ð "ð:(ð ð	:(ð
 +ð:(ð ð:(ð 
ó:(ðx	 °ð 	 ¸%ó 	 ð¨eð ¸uð Èô r   r£   c                   ó2   — e Zd Zddededdfd„Zdedefd„Zy)	Ú
RateBucketÚcountÚvaluer"   Nc                 ó    — || _         || _        y ri   ©rÌ   rÍ   )r1   rÌ   rÍ   s      r   r2   zRateBucket.__init__Â  s   € ØˆŒ
Øˆ�
r   Úotherc                 ój   — | j                   |j                   k(  xr | j                  |j                  k(  S ri   rÏ   )r1   rÐ   s     r   Ú__eq__zRateBucket.__eq__Æ  s'   € Ø�z‰z˜UŸ[™[Ñ(ÒF¨T¯Z©Z¸5¿;¹;Ñ-FÐFr   )r   r   )r   r   r   rJ   r2   r   r„   rÒ   r   r   r   rË   rË   Á  s2   „ ñ˜cð ¨cð ¸$ó ðG˜Cð G Dô Gr   rË   c                   óh   — e Zd ZdZddededdfd„Zdededdfd	„Zdedee   fd
„Zdd„Z	deddfd„Z
y)ÚRateCounterzH
    Rate counter, which stores the amount received in 1ms buckets.
    Úwindow_sizeÚscaler"   Nc                 ó\   — d| _         d | _        || _        || _        | j	                  «        y rd   )Ú_origin_indexÚ
_origin_msÚ_scaleÚ_window_sizeÚreset)r1   rÕ   rÖ   s      r   r2   zRateCounter.__init__Ï  s)   € ØˆÔØ)-ˆŒØˆŒØ'ˆÔØ�
‰
�r   rÍ   r6   c                 ó¤  — | j                   €|| _         n| j                  |«       | j                  |z   | j                   z
  | j                  z  }| j                  |   xj
                  dz  c_        | j                  |   xj                  |z  c_        | j                  xj
                  dz  c_        | j                  xj                  |z  c_        y )Nr   )rÙ   Ú
_erase_oldrØ   rÛ   Ú_bucketsrÌ   rÍ   Ú_total)r1   rÍ   r6   Úindexs       r   ÚaddzRateCounter.addÖ  s¡   € Ø�?‰?Ð"Ø$ˆD�Oà�O‰O˜FÔ#à×#Ñ# fÑ,¨t¯©Ñ>À$×BSÑBSÑSˆØ�‰�eÑ×"Ò" aÑ'Õ"Ø�‰�eÑ×"Ò" eÑ+Õ"Ø�‰×Ò˜QÑÕØ�‰×Ò˜UÑ"Ör   c                 óü   — | j                   �p| j                  |«       || j                   z
  dz   }| j                  j                  dkD  r4|dkD  r/t	        | j
                  | j                  j                  z  |z  «      S y ©Nr   r   )rÙ   rÞ   rà   rÌ   rC   rÚ   rÍ   )r1   r6   Úactive_window_sizes      r   ÚratezRateCounter.rateâ  sm   € Ø�?‰?Ð&Ø�O‰O˜FÔ#Ø!'¨$¯/©/Ñ!9¸AÑ!=ÐØ�{‰{× Ñ  1Ò$Ð);¸aÒ)?Ü˜TŸ[™[¨4¯;©;×+<Ñ+<Ñ<Ð?QÑQÓRÐRØr   c                 ó¨   — t        | j                  «      D �cg c]  }t        «       ‘Œ c}| _        d| _        d | _        t        «       | _        y c c}w rd   )ÚrangerÛ   rË   rß   rØ   rÙ   rà   )r1   Úis     r   rÜ   zRateCounter.resetê  s?   € Ü/4°T×5FÑ5FÓ/GÖH¨!œ�ÒHˆŒØˆÔØˆŒÜ “lˆ�ùò Is   ˜Ac                 óÆ  — || j                   z
  dz   }| j                  |k  rÀ| j                  | j                     }| j                  xj
                  |j
                  z  c_        | j                  xj                  |j                  z  c_        d|_        d|_        | j                  dz   | j                   z  | _        | xj                  dz  c_        | j                  |k  rŒ¿y y rä   )rÛ   rÙ   rß   rØ   rà   rÌ   rÍ   )r1   r6   Únew_origin_msÚbuckets       r   rÞ   zRateCounter._erase_oldð  s±   € Ø ×!2Ñ!2Ñ2°QÑ6ˆØ�o‰o Ò-Ø—]‘] 4×#5Ñ#5Ñ6ˆFØ�K‰K×Ò §¡Ñ-ÕØ�K‰K×Ò §¡Ñ-ÕØˆFŒLØˆFŒLà"&×"4Ñ"4°qÑ"8¸D×<MÑ<MÑ!MˆDÔØ�OŠO˜qÑ �Oð �o‰o Õ-r   )é@  r^   )r   r   r   rƒ   rJ   r2   râ   r   ræ   rÜ   rÞ   r   r   r   rÔ   rÔ   Ê  sj   „ ññ Cð °ð ¸tó ð
#˜ð 
# cð 
#¨dó 
#ð˜3ð  8¨C¡=ó ó#ð
! ð 
!¨ô 
!r   rÔ   c                   óF   — e Zd Zd	d„Zdededededeeeee   f      f
d„Zy)
ÚRemoteBitrateEstimatorr"   Nc                 óð   — t        dd«      | _        d| _        t        t        t
        z  dz  t        «      | _        t        «       | _	        t        «       | _        t        «       | _        d | _        i | _        y )Nr   rí   T)rÔ   Úincoming_bitrateÚincoming_bitrate_initializedro   ÚTIMESTAMP_GROUP_LENGTH_MSÚINTER_ARRIVAL_SHIFTÚTIMESTAMP_TO_MSÚinter_arrivalr£   Ú	estimatorr†   Údetectorr!   Úrate_controlr‹   Ússrcsr0   s    r   r2   zRemoteBitrateEstimator.__init__þ  sf   € Ü +¨D°$Ó 7ˆÔØ,0ˆÔ)Ü)Ü&Ô*=Ñ=À$ÑFÌó
ˆÔô *Ó+ˆŒÜ'Ó)ˆŒÜ+Ó-ˆÔØ-1ˆÔØ%'ˆ�
r   Úarrival_time_msÚabs_send_timeÚpayload_sizeÚssrcc                 ój  — |dz  }d}|| j                   |<   | j                  j                  |«      �d| _        n-| j                  r!| j                  j	                  «        d| _        | j                  j                  ||«       | j                  j                  |||«      }|�¬|j                  t        z  }| j                  j                  |j                  ||j                  | j                  j                  «       |«       | j                  j!                  | j                  j#                  «       || j                  j%                  «       |«       |sf| j&                  �*|| j&                  z
  | j(                  j+                  «       kD  rd}n-| j                  j                  «       t,        j.                  k(  rd}|r|| j(                  j                  | j                  j                  «       | j                  j                  |«      |«      }	|	�,|| _        |	t1        | j                   j3                  «       «      fS y )Né   FT)rú   rñ   ræ   rò   rÜ   râ   rö   rz   rb   rõ   r÷   rG   re   rh   rø   r/   r™   r“   r”   r‹   rù   r4   r   r   ÚlistÚkeys)
r1   rû   rü   rý   rþ   rb   Úupdate_estimatery   r~   Útarget_bitrates
             r   râ   zRemoteBitrateEstimator.add
  sò  € ð " QÑ&ˆ	Øˆð +ˆ�
‰
�4Ñð × Ñ ×%Ñ% oÓ6ÐBØ04ˆDÕ-Ø×.Ò.Ø×!Ñ!×'Ñ'Ô)Ø05ˆDÔ-Ø×Ñ×!Ñ! ,°Ô@ð ×#Ñ#×2Ñ2Ø�¨ó
ˆð ÐØ!'×!1Ñ!1´OÑ!CÐØ�N‰N×!Ñ!Ø×#Ñ#Ø"Ø—‘Ø—‘×#Ñ#Ó%Øôð �M‰M× Ñ Ø—‘×%Ñ%Ó'Ø"Ø—‘×,Ñ,Ó.Øô	ñ à×#Ñ#Ð+Ø# d×&9Ñ&9Ñ9Ø×#Ñ#×5Ñ5Ó7ò8ð #'‘Ø—‘×$Ñ$Ó&¬.×*BÑ*BÒBØ"&�áØ!×.Ñ.×5Ñ5Ø—‘×#Ñ#Ó%Ø×%Ñ%×*Ñ*¨?Ó;ØóˆNð
 Ð)Ø&5�Ô#Ø%¤t¨D¯J©J¯O©OÓ,=Ó'>Ð>Ð>àr   r^   )	r   r   r   r2   rJ   r   Útupler  râ   r   r   r   rï   rï   ý  sF   „ ó
(ð9Ø"ð9Ø36ð9ØFIð9ØQTð9à	�%˜˜T #™Y˜Ñ'Ñ	(ô9r   rï   )r>   Úenumr   Útypingr   r   Úaiortc.utilsr   r   r|   rŸ   r–   r³   rÄ   rô   ró   rõ   r   r   r!   ra   rk   ro   r†   r£   rË   rÔ   rï   r   r   r   ú<module>r	     sÕ   ðÛ Ý ß  ç .àÐ ð Ð Ø€ð Ð Ø"$Ð ð Ð ØÐ Ø˜AÐ!4Ñ4Ñ5€ô�Tô ô�tô ÷SRñ SR÷lñ ÷ñ ÷@-ñ @-÷FD%ñ D%÷Nlñ l÷^Gñ G÷0!ñ 0!÷fFò Fr   