Ë
    ÖÉ�jLR  ã                   óf  — d dl Z d dlZd dlZd dlZd dlZd dlZd dl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 ddlmZmZmZm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"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7m8Z8 ddl9m:Z:m;Z;  ejx                  e=«      Z>de j~                  dej€                  de j€                  ddfd„ZA G d„ d«      ZB G d„ d«      ZC G d„ de«      ZD G d„ d«      ZEe
 G d„ d «      «       ZFe
 G d!„ d"«      «       ZG G d#„ d$«      ZHy)%é    N)ÚCallable)Ú	dataclass)ÚOptional)ÚFrameé   )Úclock)Ú	depayloadÚget_capabilitiesÚget_decoderÚis_rtx)ÚInvalidStateError)ÚJitterBuffer)ÚMediaStreamErrorÚMediaStreamTrack)ÚRemoteBitrateEstimator)ÚRTCDtlsTransport)ÚRTCRtpCapabilitiesÚRTCRtpCodecParametersÚRTCRtpReceiveParameters)ÚRTCP_PSFB_APPÚRTCP_PSFB_PLIÚRTCP_RTPFB_NACKÚRTP_HISTORY_SIZEÚAnyRtcpPacketÚRtcpByePacketÚRtcpPsfbPacketÚRtcpReceiverInfoÚRtcpRrPacketÚRtcpRtpfbPacketÚRtcpSrPacketÚ	RtpPacketÚclamp_packets_lostÚpack_remb_fciÚ
unwrap_rtx)ÚRTCInboundRtpStreamStatsÚRTCRemoteOutboundRtpStreamStatsÚRTCStatsReport)Ú
uint16_addÚ	uint16_gtÚloopÚinput_qÚoutput_qÚreturnc                 óT  — d }d }	 |j                  «       }|€&t        j                  |j                  d «      | «       ng|\  }}|j                  |k7  rt        |«      }|j                  }|j                  |«      D ]'  }t        j                  |j                  |«      | «       Œ) ŒŸ|�~y y ©N)ÚgetÚasyncioÚrun_coroutine_threadsafeÚputÚnamer   Údecode)	r*   r+   r,   Ú
codec_nameÚdecoderÚtaskÚcodecÚencoded_frameÚframes	            úV/home/uftp/webrtc-recorder/.venv/lib/python3.12/site-packages/aiortc/rtcrtpreceiver.pyÚdecoder_workerr=   5   s®   € ð €JØ€Gà
Ø�{‰{‹}ˆØˆ<ä×,Ñ,¨X¯\©\¸$Ó-?ÀÔFØØ#Ñˆˆ}à�:‰:˜Ò#Ü! %Ó(ˆGØŸ™ˆJà—^‘^ MÓ2ò 	HˆEä×,Ñ,¨X¯\©\¸%Ó-@À$ÕGð	Hð ð  ÐÙð ó    c                   ó,   — e Zd Zdd„Zdedefd„Zdd„Zy)ÚNackGeneratorr-   Nc                 ó0   — d | _         t        «       | _        y r/   )Úmax_seqÚsetÚmissing©Úselfs    r<   Ú__init__zNackGenerator.__init__P   s   € Ø&*ˆŒÜ!$£ˆ�r>   Úpacketc                 óî  — d}| j                   €|j                  | _         |S t        |j                  | j                   «      r~t        | j                   d«      }t        |j                  |«      r@| j                  j                  |«       d}t        |d«      }t        |j                  |«      rŒ@|j                  | _         n%| j                  j                  |j                  «       | j                  «        |S )zL
        Mark a new packet as received, and deduce missing packets.
        Fr   T)rB   Úsequence_numberr)   r(   rD   ÚaddÚdiscardÚtruncate)rF   rH   ÚmissedÚseqs       r<   rK   zNackGenerator.addT   sÇ   € ð ˆà�<‰<ÐØ!×1Ñ1ˆDŒLØˆMô �V×+Ñ+¨T¯\©\Ô:Ü˜TŸ\™\¨1Ó-ˆCÜ˜F×2Ñ2°CÔ8Ø—‘× Ñ  Ô%Ø�Ü   aÓ(�ô ˜F×2Ñ2°CÕ8ð "×1Ñ1ˆD�Là�L‰L× Ñ  ×!7Ñ!7Ô8ð 	�‰Œàˆr>   c                 óØ   — | j                   �^t        | j                   t         «      }t        | j                  «      D ]*  }t        ||«      sŒ| j                  j                  |«       Œ, yy)z„
        Limit the number of missing packets we track.

        Otherwise, the size of RTCP FB messages grows indefinitely.
        N)rB   r(   r   ÚlistrD   r)   rL   )rF   Úmin_seqrO   s      r<   rM   zNackGenerator.truncaten   s[   € ð �<‰<Ð#Ü  §¡Ô0@Ð/@ÓAˆGÜ˜DŸL™LÓ)ò .�Ü˜W cÕ*Ø—L‘L×(Ñ(¨Õ-ñ.ð $r>   ©r-   N)Ú__name__Ú
__module__Ú__qualname__rG   r!   ÚboolrK   rM   © r>   r<   r@   r@   O   s   „ ó'ð˜)ð ¨ó ô4
.r>   r@   c                   ó„   — e Zd Zdeddfd„Zdeddfd„Zedefd„«       Zedefd„«       Z	edefd	„«       Z
edefd
„«       Zy)ÚStreamStatisticsÚ	clockrater-   Nc                 ó�   — d | _         d | _        d| _        d| _        || _        d| _        d | _        d | _        d| _        d| _	        y )Nr   )
Úbase_seqrB   ÚcyclesÚpackets_receivedÚ
_clockrateÚ
_jitter_q4Ú_last_arrivalÚ_last_timestampÚ_expected_priorÚ_received_prior)rF   r[   s     r<   rG   zStreamStatistics.__init__|   sQ   € Ø'+ˆŒØ&*ˆŒØˆŒØ !ˆÔð $ˆŒØˆŒØ,0ˆÔØ.2ˆÔð  !ˆÔØ ˆÕr>   rH   c                 óî  — | j                   d u xs  t        |j                  | j                   «      }| xj                  dz  c_        | j                  €|j                  | _        |�rt        t        j                  «       | j                  z  «      }| j                   �.|j                  | j                   k  r| xj                  dz  c_        |j                  | _         |j                  | j                  k7  ri| j                  dkD  rZt        || j                  z
  |j                  | j                  z
  z
  «      }| xj                  || j                  dz   dz	  z
  z  c_        || _        |j                  | _
        y y )Nr   é   é   é   )rB   r)   rJ   r_   r]   ÚintÚtimer`   r^   Ú	timestamprc   Úabsrb   ra   )rF   rH   Úin_orderÚarrivalÚdiffs        r<   rK   zStreamStatistics.addŒ   s9  € Ø—<‘< 4Ð'ò 
¬9Ø×"Ñ" D§L¡Ló,
ˆð 	×Ò Ñ"Õà�=‰=Ð Ø"×2Ñ2ˆDŒMâÜœ$Ÿ)™)›+¨¯©Ñ7Ó8ˆGà�|‰|Ð'¨F×,BÑ,BÀTÇ\Á\Ò,QØ—’˜wÑ&•Ø!×1Ñ1ˆDŒLà×Ñ 4×#7Ñ#7Ò7¸D×<QÑ<QÐTUÒ<UÜØ˜t×1Ñ1Ñ1Ø×'Ñ'¨$×*>Ñ*>Ñ>ñ@ó�ð —’ 4¨D¯O©O¸aÑ,?ÀAÑ+EÑ#FÑF•à!(ˆDÔØ#)×#3Ñ#3ˆDÕ ð r>   c                 óÚ   — | j                   | j                  z
  }| j                   | _        | j                  | j                  z
  }| j                  | _        ||z
  }|dk(  s|dk  ry|dz  |z  S )Nr   rh   )Úpackets_expectedrd   r_   re   )rF   Úexpected_intervalÚreceived_intervalÚlost_intervals       r<   Úfraction_lostzStreamStatistics.fraction_lost¦   sz   € à ×1Ñ1°D×4HÑ4HÑHÐØ#×4Ñ4ˆÔØ ×1Ñ1°D×4HÑ4HÑHÐØ#×4Ñ4ˆÔØ)Ð,=Ñ=ˆØ Ò! ]°aÒ%7Øà! QÑ&Ð+<Ñ<Ð<r>   c                 ó    — | j                   dz	  S )Nri   )ra   rE   s    r<   ÚjitterzStreamStatistics.jitter²   s   € à�‰ !Ñ#Ð#r>   c                 óT   — | j                   | j                  z   | j                  z
  dz   S )Nr   )r^   rB   r]   rE   s    r<   rr   z!StreamStatistics.packets_expected¶   s#   € à�{‰{˜TŸ\™\Ñ)¨D¯M©MÑ9¸AÑ=Ð=r>   c                 óF   — t        | j                  | j                  z
  «      S r/   )r"   rr   r_   rE   s    r<   Úpackets_lostzStreamStatistics.packets_lostº   s   € ä! $×"7Ñ"7¸$×:OÑ:OÑ"OÓPÐPr>   )rT   rU   rV   rj   rG   r!   rK   Úpropertyrv   rx   rr   r{   rX   r>   r<   rZ   rZ   {   s—   „ ð! #ð !¨$ó !ð 4˜)ð 4¨ó 4ð4 ð	=˜sò 	=ó ð	=ð ð$˜ò $ó ð$ð ð> #ò >ó ð>ð ðQ˜cò Qó ñQr>   rZ   c                   ó@   ‡ — e Zd Zddedee   ddfˆ fd„Zdefd„Zˆ xZS )ÚRemoteStreamTrackNÚkindÚidr-   c                 ót   •— t         ‰| �  «        || _        |�|| _        t	        j
                  «       | _        y r/   )ÚsuperrG   r   Ú_idr1   ÚQueueÚ_queue)rF   r   r€   Ú	__class__s      €r<   rG   zRemoteStreamTrack.__init__À   s.   ø€ Ü‰ÑÔØˆŒ	Øˆ>ØˆDŒHÜ%,§]¡]£_ˆ�r>   c              ƒ   ó°   K  — | j                   dk7  rt        ‚| j                  j                  «       ƒ d{  –—† }|€| j	                  «        t        ‚|S 7 Œ­w)z)
        Receive the next frame.
        ÚliveN)Ú
readyStater   r…   r0   Ústop)rF   r;   s     r<   ÚrecvzRemoteStreamTrack.recvÇ   sK   è ø€ ð �?‰?˜fÒ$Ü"Ð"à—k‘k—o‘oÓ'×'ˆØˆ=Ø�I‰IŒKÜ"Ð"Øˆð	 (ús   ‚3AµA¶Ar/   )	rT   rU   rV   Ústrr   rG   r   r‹   Ú__classcell__)r†   s   @r<   r~   r~   ¿   s-   ø„ ñ5˜Sð 5 h¨s¡mð 5¸tõ 5ð˜E÷ r>   r~   c                   ó$   — e Zd Zdd„Zdedefd„Zy)ÚTimestampMapperr-   Nc                 ó    — d | _         d | _        y r/   )Ú_lastÚ_originrE   s    r<   rG   zTimestampMapper.__init__Ö   s   € Ø$(ˆŒ
Ø&*ˆ�r>   rl   c                 óž   — | j                   €|| _         n$|| j                  k  r| xj                   dz  c_         || _        || j                   z
  S )Nl        )r’   r‘   )rF   rl   s     r<   ÚmapzTimestampMapper.mapÚ   sC   € Ø�<‰<Ðà$ˆD�LØ˜Ÿ™Ò#à�LŠL˜GÑ#�LàˆŒ
Ø˜4Ÿ<™<Ñ'Ð'r>   rS   )rT   rU   rV   rG   rj   r”   rX   r>   r<   r�   r�   Õ   s   „ ó+ð	(˜Sð 	( Sô 	(r>   r�   c                   ó<   — e Zd ZU dZej                  ed<   	 eed<   y)ÚRTCRtpContributingSourcezw
    The :class:`RTCRtpContributingSource` dictionary contains information about
    a contributing source (CSRC).
    rl   ÚsourceN©rT   rU   rV   Ú__doc__ÚdatetimeÚ__annotations__rj   rX   r>   r<   r–   r–   æ   ó    … ñð
 × Ñ Ó Ø0ØƒKØ6r>   r–   c                   ó<   — e Zd ZU dZej                  ed<   	 eed<   y)ÚRTCRtpSynchronizationSourcez}
    The :class:`RTCRtpSynchronizationSource` dictionary contains information about
    a synchronization source (SSRC).
    rl   r—   Nr˜   rX   r>   r<   rž   rž   ó   rœ   r>   rž   c                   ó<  — e Zd ZdZdededdfd„Zedefd„«       Z	edefd„«       Z
ededee   fd	„«       Zdefd
„Zdee   fd„Zdeddfd„Zdeddfd„Zdd„Zdd„Zdeddfd„Zdededdfd„Zdd„Zdeddfd„Zdedee   ddfd„Z deddfd„Z!deddfd„Z"dd„Z#y)ÚRTCRtpReceiverzñ
    The :class:`RTCRtpReceiver` interface manages the reception and decoding
    of data for a :class:`MediaStreamTrack`.

    :param kind: The kind of media (`'audio'` or `'video'`).
    :param transport: An :class:`RTCDtlsTransport`.
    r   Ú	transportr-   Nc                 óÞ  ‡ — |j                   dk(  rt        ‚d‰ _        i ‰ _        i ‰ _        t        j                  «       ‰ _        d ‰ _        |‰ _	        |dk(  r!t        dd¬«      ‰ _        d ‰ _        d ‰ _        n0t        dd¬«      ‰ _        t        «       ‰ _        t        «       ‰ _        d ‰ _        t#        j$                  «       ‰ _        t#        j$                  «       ‰ _        d ‰ _        i ‰ _        d	‰ _        t1        «       ‰ _        t5        «       ‰ _        |‰ _        i ‰ _        i ‰ _        i ‰ _        d ‰ _         d
„ ‰ _!        tD        jG                  tH        jJ                  «      rˆ fd„‰ _!        y y )NÚclosedTÚaudioé   ri   )ÚcapacityÚprefetché€   )r¦   Úis_videoFc                   ó   — y r/   rX   )Úargss    r<   ú<lambda>z)RTCRtpReceiver.__init__.<locals>.<lambda>,  s   � r>   c                 óL   •— t        j                  d| › �‰j                  g|¢­Ž S )NzRTCRtpReceiver(%s) )ÚloggerÚdebugÚ_RTCRtpReceiver__kind)Úmsgr«   rF   s     €r<   r¬   z)RTCRtpReceiver.__init__.<locals>.<lambda>.  s(   ø€ ´&·,±,Ø% c UÐ+¨T¯[©[ð3Ø;?ò3€ r>   )&Ústater   Ú_enabledÚ_RTCRtpReceiver__active_ssrcÚ_RTCRtpReceiver__codecsÚqueuer„   Ú_RTCRtpReceiver__decoder_queueÚ_RTCRtpReceiver__decoder_threadr°   r   Ú_RTCRtpReceiver__jitter_bufferÚ_RTCRtpReceiver__nack_generatorÚ)_RTCRtpReceiver__remote_bitrate_estimatorr@   r   Ú_trackr1   ÚEventÚ_RTCRtpReceiver__rtcp_exitedÚ_RTCRtpReceiver__rtcp_startedÚ_RTCRtpReceiver__rtcp_taskÚ_RTCRtpReceiver__rtx_ssrcÚ_RTCRtpReceiver__startedr'   Ú_RTCRtpReceiver__statsr�   Ú!_RTCRtpReceiver__timestamp_mapperÚ_RTCRtpReceiver__transportÚ_RTCRtpReceiver__lsrÚ_RTCRtpReceiver__lsr_timeÚ_RTCRtpReceiver__remote_streamsÚ_RTCRtpReceiver__rtcp_ssrcÚ_RTCRtpReceiver__log_debugr®   ÚisEnabledForÚloggingÚDEBUG)rF   r   r¡   s   `  r<   rG   zRTCRtpReceiver.__init__	  s4  ø€ Ø�?‰?˜hÒ&Ü#Ð#àˆŒØ;=ˆÔØ:<ˆŒÜ,1¯K©K«MˆÔØ<@ˆÔØˆŒØ�7Š?Ü#/¸ÀaÔ#HˆDÔ Ø$(ˆDÔ!Ø.2ˆDÕ+ä#/¸ÀtÔ#LˆDÔ Ü$1£OˆDÔ!Ü.DÓ.FˆDÔ+Ø37ˆŒÜ$Ÿ]™]›_ˆÔÜ%Ÿm™m›oˆÔØ;?ˆÔØ*,ˆŒØˆŒÜ%Ó'ˆŒÜ"1Ó"3ˆÔØ$ˆÔð &(ˆŒ
Ø,.ˆŒØ=?ˆÔØ*.ˆÔñ 1CˆÔÜ×ÑœwŸ}™}Ô-ó ˆDÕð .r>   c                 ó   — | j                   S )zW
        The :class:`MediaStreamTrack` which is being handled by the receiver.
        )r¼   rE   s    r<   ÚtrackzRTCRtpReceiver.track2  s   € ð
 �{‰{Ðr>   c                 ó   — | j                   S )zr
        The :class:`RTCDtlsTransport` over which the media for the receiver's
        track is received.
        ©rÅ   rE   s    r<   r¡   zRTCRtpReceiver.transport9  s   € ð ×ÑÐr>   c                 ó   — t        |«      S )z­
        Returns the most optimistic view of the system's capabilities for
        receiving media of the given `kind`.

        :rtype: :class:`RTCRtpCapabilities`
        )r
   )rF   r   s     r<   ÚgetCapabilitieszRTCRtpReceiver.getCapabilitiesA  s   € ô   Ó%Ð%r>   c              ƒ   óì  K  — | j                   j                  «       D ]•  \  }}| j                  j                  t	        t        j                  «       ddt        t        | «      «      z   || j                  | j                  j                  |j                  |j                  |j                  ¬«	      «       Œ— | j                  j                  | j                  j!                  «       «       | j                  S ­w)ze
        Returns statistics about the RTP receiver.

        :rtype: :class:`RTCStatsReport`
        zinbound-rtpzinbound-rtp_)	rl   Útyper€   Ússrcr   ÚtransportIdÚpacketsReceivedÚpacketsLostrx   )rÈ   ÚitemsrÃ   rK   r%   r   Úcurrent_datetimerŒ   r€   r°   r¡   Ú	_stats_idr_   r{   rx   ÚupdateÚ
_get_stats)rF   rÖ   Ústreams      r<   ÚgetStatszRTCRtpReceiver.getStatsK  s¾   è ø€ ð !×1Ñ1×7Ñ7Ó9ò 	‰LˆD�&Ø�L‰L×ÑÜ(ä#×4Ñ4Ó6Ø&Ø%¬¬B¨t«H«Ñ5àØŸ™Ø $§¡× 8Ñ 8à$*×$;Ñ$;Ø &× 3Ñ 3Ø!Ÿ=™=ôõð	ð$ 	�‰×Ñ˜DŸN™N×5Ñ5Ó7Ô8à�|‰|Ðùs   ‚C2C4c                 óè   — t        j                  «       t        j                  d¬«      z
  }g }| j                  j                  «       D ]'  \  }}||k\  sŒ|j                  t        ||¬«      «       Œ) |S )z‰
        Returns a :class:`RTCRtpSynchronizationSource` for each unique SSRC identifier
        received in the last 10 seconds.
        é
   )Úseconds)r—   rl   )r   rÛ   rš   Ú	timedeltar´   rÚ   Úappendrž   )rF   ÚcutoffÚsourcesr—   rl   s        r<   ÚgetSynchronizationSourcesz(RTCRtpReceiver.getSynchronizationSourcesg  so   € ô
 ×'Ñ'Ó)¬H×,>Ñ,>ÀrÔ,JÑJˆØˆØ!%×!3Ñ!3×!9Ñ!9Ó!;ò 	ÑˆF�IØ˜FÓ"Ø—‘Ü/°vÈÔSõð	ð
 ˆr>   Ú
parametersc              ƒ   óž  K  — | j                   �s<|j                  D ]  }|| j                  |j                  <   Œ |j                  D ]<  }|j
                  sŒ|j                  | j                  |j
                  j                  <   Œ> t        j                  t        | j                  dz   t        j                  «       | j                  | j                  j                   f¬«      | _        | j"                  j%                  «        | j&                  j)                  | |«       t        j*                  | j-                  «       «      | _        d| _         yy­w)zŸ
        Attempt to set the parameters controlling the receiving of media.

        :param parameters: The :class:`RTCRtpParameters` for the receiver.
        z-decoder)Útargetr4   r«   TN)rÂ   Úcodecsrµ   ÚpayloadTypeÚ	encodingsÚrtxrÖ   rÁ   Ú	threadingÚThreadr=   r°   r1   Úget_event_loopr·   r¼   r…   r¸   ÚstartrÅ   Ú_register_rtp_receiverÚensure_futureÚ	_run_rtcprÀ   )rF   ré   r9   Úencodings       r<   ÚreceivezRTCRtpReceiver.receiveu  s  è ø€ ð �~‹~Ø#×*Ñ*ò 9�Ø38�—‘˜e×/Ñ/Ò0ð9à&×0Ñ0ò G�Ø—<“<Ø9A¿¹�D—O‘O H§L¡L×$5Ñ$5Ò6ðGô
 %.×$4Ñ$4Ü%Ø—[‘[ :Ñ-ä×*Ñ*Ó,Ø×(Ñ(Ø—K‘K×&Ñ&ðô%ˆDÔ!ð ×!Ñ!×'Ñ'Ô)à×Ñ×3Ñ3°D¸*ÔEÜ&×4Ñ4°T·^±^Ó5EÓFˆDÔØ!ˆD�Nð+ ùs   ‚AEÁC7Ec                 ó   — || _         y r/   rÑ   )rF   r¡   s     r<   ÚsetTransportzRTCRtpReceiver.setTransport’  s
   € Ø$ˆÕr>   c              ƒ   ó@  K  — | j                   rŠ| j                  j                  | «       | j                  «        | j                  j                  «       ƒ d{  –—†  | j                  j                  «        | j                  j                  «       ƒ d{  –—†  yy7 ŒB7 Œ­w)z1
        Irreversibly stop the receiver.
        N)	rÂ   rÅ   Ú_unregister_rtp_receiverÚ_RTCRtpReceiver__stop_decoderr¿   ÚwaitrÀ   Úcancelr¾   rE   s    r<   rŠ   zRTCRtpReceiver.stop•  s�   è ø€ ð �>Š>Ø×Ñ×5Ñ5°dÔ;Ø×ÑÔ!ð ×%Ñ%×*Ñ*Ó,×,Ð,Ø×Ñ×#Ñ#Ô%Ø×$Ñ$×)Ñ)Ó+×+Ñ+ð ð
 -øà+ús$   ‚ABÁBÁ;BÂBÂBÂBc                 ó$   — | j                  «        y r/   )rý   rE   s    r<   Ú_handle_disconnectz!RTCRtpReceiver._handle_disconnect¢  s   € Ø×ÑÕr>   rH   c              ƒ   óÖ  K  — | j                  d|«       t        |t        «      �r!| j                  j	                  t        t        j                  «       ddt        | «      › �|j                  | j                  | j                  j                  |j                  j                  |j                  j                  t        j                   |j                  j"                  «      ¬«	      «       |j                  j"                  dz	  dz  | j$                  |j                  <   t'        j&                  «       | j(                  |j                  <   y t        |t*        «      r| j-                  «        y y ­w)Nú< %szremote-outbound-rtpzremote-outbound-rtp_)	rl   rÕ   r€   rÖ   r   r×   ÚpacketsSentÚ	bytesSentÚremoteTimestampr¥   l   ÿÿ )rÊ   Ú
isinstancer    rÃ   rK   r&   r   rÛ   r€   rÖ   r°   r¡   rÜ   Úsender_infoÚpacket_countÚoctet_countÚdatetime_from_ntpÚntp_timestamprÆ   rk   rÇ   r   rý   ©rF   rH   s     r<   Ú_handle_rtcp_packetz"RTCRtpReceiver._handle_rtcp_packet¥  s  è ø€ Ø×Ñ˜ Ô(ä�fœlÕ+Ø�L‰L×ÑÜ/ä#×4Ñ4Ó6Ø.Ø-¬b°«h¨ZÐ8àŸ™ØŸ™Ø $§¡× 8Ñ 8à &× 2Ñ 2× ?Ñ ?Ø$×0Ñ0×<Ñ<ä$)×$;Ñ$;Ø×*Ñ*×8Ñ8ó%ôôð( ×#Ñ#×1Ñ1°bÑ8Øñ'ˆD�J‰J�v—{‘{Ñ#ô ,0¯9©9«;ˆD�O‰O˜FŸK™KÒ(Ü˜¤Ô.Ø×ÑÕ!ð /ùs   ‚E'E)Úarrival_time_msc              ƒ   óÐ  K  — | j                  d|«       | j                  sy| j                  �½|j                  j                  �§| j                  j                  |j                  j                  |t        |j                  «      |j                  z   |j                  ¬«      }| j                  �>|�<t        t        | j                  dt        |Ž ¬«      }| j                  |«      ƒ d{  –—†  t        j                   «       | j"                  |j                  <   | j$                  j'                  |j(                  «      }|€| j                  d|j(                  «       y|j                  | j*                  vr,t-        |j.                  «      | j*                  |j                  <   | j*                  |j                     j                  |«       t1        |«      r³| j2                  j'                  |j                  «      }|€| j                  d|j                  «       y|j4                  j'                  d«      }t        |j                  «      d	k  st7        |t8        «      r|| j$                  vryt;        |||¬
«      }| j$                  |   }| j<                  �\| j<                  j                  |«      rA| j?                  |j                  tA        | j<                  jB                  «      «      ƒ d{  –—†  	 |j                  rtE        ||j                  «      |_#        nd|_#        | jJ                  j                  |«      \  }	}
|	r#| jM                  |j                  «      ƒ d{  –—†  |
�U| jN                  rH| jP                  jS                  |
jT                  «      |
_*        | jV                  jY                  ||
f«       yyy7 �ŒÑ7 ŒÒ# tH        $ r}| j                  d|«       Y d}~yd}~ww xY w7 Œ‰­w)z0
        Handle an incoming RTP packet.
        r  N)Úabs_send_timer  Úpayload_sizerÖ   r   )ÚfmtrÖ   Ú
media_ssrcÚfciz)x RTP packet with unknown payload type %dz!x RTX packet from unknown SSRC %dÚapté   )Úpayload_typerÖ   r>   z x RTP payload parsing failed: %s)-rÊ   r³   r»   Ú
extensionsr  rK   ÚlenÚpayloadÚpadding_sizerÖ   rÉ   r   r   r#   Ú
_send_rtcpr   rÛ   r´   rµ   r0   r  rÈ   rZ   Ú	clockRater   rÁ   ré   r  rj   r$   rº   Ú_send_rtcp_nackÚsortedrD   r	   Ú_dataÚ
ValueErrorr¹   Ú_send_rtcp_plir¸   rÄ   r”   rl   r·   r3   )rF   rH   r  ÚrembÚrtcp_packetr9   Úoriginal_ssrcr  ÚexcÚpli_flagr:   s              r<   Ú_handle_rtp_packetz!RTCRtpReceiver._handle_rtp_packetÃ  s[  è ø€ ð 	×Ñ˜ Ô(ð �}Š}Øð ×*Ñ*Ð6Ø× Ñ ×.Ñ.Ð:Ø×6Ñ6×:Ñ:Ø"(×"3Ñ"3×"AÑ"AØ$3Ü!$ V§^¡^Ó!4°v×7JÑ7JÑ!JØŸ™ð	 ;ó �ð ×#Ñ#Ð/°DÐ4Dä"0Ü)Ø!×-Ñ-Ø#$Ü)¨4Ð0ô	#�Kð Ÿ/™/¨+Ó6×6Ð6ô +0×*@Ñ*@Ó*Bˆ×Ñ˜6Ÿ;™;Ñ'ð —‘×!Ñ! &×"5Ñ"5Ó6ˆØˆ=Ø×ÑØ;¸V×=PÑ=Pôð ð �;‰;˜d×3Ñ3Ñ3Ü1AÀ%Ç/Á/Ó1RˆD×!Ñ! &§+¡+Ñ.Ø×Ñ˜fŸk™kÑ*×.Ñ.¨vÔ6ô �%Œ=Ø ŸO™O×/Ñ/°·±Ó<ˆMØÐ$Ø× Ñ Ð!DÀfÇkÁkÔRØà×"Ñ"×&Ñ& uÓ-ˆCä�F—N‘NÓ# aÒ'Ü! #¤sÔ+Ø˜dŸm™mÑ+àä °S¸}ÔMˆFØ—M‘M #Ñ&ˆEð × Ñ Ð,°×1FÑ1F×1JÑ1JÈ6Ô1RØ×&Ñ&Ø—‘œV D×$9Ñ$9×$AÑ$AÓBó÷ ð ð
	Ø�~Š~Ü(¨°·±Ó?�•à"�”ð #'×"6Ñ"6×":Ñ":¸6Ó"BÑˆ�-áØ×%Ñ% f§k¡kÓ2×2Ð2ð Ð$¨×)>Ò)>Ø&*×&=Ñ&=×&AÑ&AØ×'Ñ'ó'ˆMÔ#ð × Ñ ×$Ñ$ e¨]Ð%;Õ<ð	 *?Ð$ðw 7ùðLùô ò 	Ø×ÑÐ?ÀÔEÜûð	úð 3ús\   ‚C$O&Ã&N7Ã'H O&Ë'N:Ë(O&Ë-/N< Ì>O&ÍO$ÍAO&Î:O&Î<	O!ÏOÏO&ÏO!Ï!O&c              ƒ   óp  K  — | j                  d«       | j                  j                  «        	 	 t        j                  dt        j
                  «       z   «      ƒ d {  –—†  g }| j                  j                  «       D ]«  \  }}d}d}|| j                  v rK| j                  |   }t        j                  «       | j                  |   z
  }|dkD  r|dk  rt        |dz  «      }|j                  t        ||j                  |j                  |j                   |j"                  ||¬«      «       Œ­ | j$                  �2|r0t'        | j$                  |¬«      }| j)                  |«      ƒ d {  –—†  �Œ<7 �Œ7 Œ	# t        j*                  $ r Y nw xY w| j                  d«       | j,                  j                  «        y ­w)Nz- RTCP startedg      à?r   rg   )rÖ   rv   r{   Úhighest_sequencerx   ÚlsrÚdlsr)rÖ   Úreportsz- RTCP finished)rÊ   r¿   rC   r1   ÚsleepÚrandomrÈ   rÚ   rÆ   rk   rÇ   rj   rå   r   rv   r{   rB   rx   rÉ   r   r  ÚCancelledErrorr¾   )rF   r.  rÖ   rß   r,  r-  ÚdelayrH   s           r<   rö   zRTCRtpReceiver._run_rtcp  s‹  è ø€ Ø×ÑÐ)Ô*Ø×Ñ×ÑÔ!ð"	Øô —m‘m C¬&¯-©-«/Ñ$9Ó:×:Ð:ð �Ø$(×$9Ñ$9×$?Ñ$?Ó$Aò ‘L�D˜&Ø�CØ�DØ˜tŸz™zÑ)Ø"Ÿj™j¨Ñ.˜Ü $§	¡	£¨d¯o©o¸dÑ.CÑ C˜Ø  1š9¨°ªÜ#& u¨u¡}Ó#5˜Dà—N‘NÜ(Ø!%Ø*0×*>Ñ*>Ø)/×)<Ñ)<Ø-3¯^©^Ø#)§=¡=Ø #Ø!%ôõ
ðð* ×#Ñ#Ð/±GÜ)¨t×/?Ñ/?ÈÔQ�FØŸ/™/¨&Ó1×1Ð1ñ= ð ;ùð6 2ùä×%Ñ%ò 	Ùð	úð 	×ÑÐ*Ô+Ø×Ñ×ÑÕ ùsA   ‚,F6¯.E1 ÁE,ÁDE1 Å%E/Å&E1 Å/E1 Å1FÆF6ÆFÆ/F6c              ƒ   ó¬   K  — | j                  d|«       	 | j                  j                  t        |«      «      ƒ d {  –—†  y 7 Œ# t        $ r Y y w xY w­w)Nz> %s)rÊ   r¡   Ú	_send_rtpÚbytesÚConnectionErrorr  s     r<   r  zRTCRtpReceiver._send_rtcpJ  sH   è ø€ Ø×Ñ˜ Ô(ð	Ø—.‘.×*Ñ*¬5°«=Ó9×9Ò9ùÜò 	Ùð	üs8   ‚A–'A ½A¾A ÁAÁA Á	AÁAÁAÁAr  Úlostc              ƒ   ó¢   K  — | j                   �=t        t        | j                   |¬«      }||_        | j	                  |«      ƒ d{  –—†  yy7 Œ­w)zD
        Send an RTCP packet to report missing RTP packets.
        N©r  rÖ   r  )rÉ   r   r   r7  r  )rF   r  r7  rH   s       r<   r  zRTCRtpReceiver._send_rtcp_nackQ  sP   è ø€ ð ×ÑÐ'Ü$Ü#¨$×*:Ñ*:ÀzôˆFð ˆFŒKØ—/‘/ &Ó)×)Ñ)ð (ð
 *ús   ‚AAÁAÁAc              ƒ   ó”   K  — | j                   �6t        t        | j                   |¬«      }| j                  |«      ƒ d{  –—†  yy7 Œ­w)z=
        Send an RTCP packet to report picture loss.
        Nr9  )rÉ   r   r   r  )rF   r  rH   s      r<   r#  zRTCRtpReceiver._send_rtcp_pli\  sI   è ø€ ð ×ÑÐ'Ü#Ü!¨×(8Ñ(8ÀZôˆFð —/‘/ &Ó)×)Ñ)ð	 (ð *ús   ‚=A¿AÁ ArÖ   c                 ó   — || _         y r/   )rÉ   )rF   rÖ   s     r<   Ú_set_rtcp_ssrczRTCRtpReceiver._set_rtcp_ssrcf  s
   € ØˆÕr>   c                 ó–   — | j                   r=| j                  j                  d«       | j                   j                  «        d| _         yy)zM
        Stop the decoder thread, which will in turn stop the track.
        N)r¸   r·   r3   ÚjoinrE   s    r<   Ú__stop_decoderzRTCRtpReceiver.__stop_decoderi  s@   € ð × Ò Ø× Ñ ×$Ñ$ TÔ*Ø×!Ñ!×&Ñ&Ô(Ø$(ˆDÕ!ð !r>   rS   )$rT   rU   rV   r™   rŒ   r   rG   r|   r   rÏ   r¡   Úclassmethodr   r   rÓ   r'   rà   rQ   rž   rè   r   rø   rú   rŠ   r  r   r  r!   rj   r)  rö   r  r  r#  r<  rý   rX   r>   r<   r    r       sh  „ ñð'˜Sð 'Ð-=ð 'À$ó 'ðR ðÐ'ò ó ðð ð Ð+ò  ó ð ð ð& Cð &¨HÐ5GÑ,Hò &ó ð&ð ó ð8¨4Ð0KÑ+Ló ð"Ð(?ð "ÀDó "ð:%Ð&6ð %¸4ó %ó,óð"°ð "À$ó "ð<Z=¨yð Z=È3ð Z=ÐSWó Z=óx)!ðV }ð ¸ó ð	*°ð 	*¸4À¹9ð 	*Èó 	*ð*¨sð *°tó *ð  3ð  ¨4ó  ô)r>   r    )Ir1   rš   rÌ   r¶   r0  rð   rk   Úcollections.abcr   Údataclassesr   Útypingr   Úav.framer   Ú r   rì   r	   r
   r   r   Ú
exceptionsr   Újitterbufferr   Úmediastreamsr   r   Úrater   Úrtcdtlstransportr   Úrtcrtpparametersr   r   r   Úrtpr   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   Ústatsr%   r&   r'   Úutilsr(   r)   Ú	getLoggerrT   r®   ÚAbstractEventLoopr„   r=   r@   rZ   r~   r�   r–   rž   r    rX   r>   r<   ú<module>rQ     s$  ðÛ Û Û Û Û Û Û Ý $Ý !Ý å å ß DÓ DÝ )Ý &ß <Ý (Ý .÷ñ ÷
÷ ÷ ÷ ñ ÷"ñ ÷
 )à	ˆ×	Ñ	˜8Ó	$€ðØ
×
#Ñ
#ðØ.3¯k©kðØELÇ]Á]ðà	ó÷4).ñ ).÷XAQñ AQôHÐ(ô ÷,(ñ (ð" ÷	7ð 	7ó ð	7ð ÷	7ð 	7ó ð	7÷p)ò p)r>   