Ë
    ÖÉ�jÉD  ã                   ó¨  — 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	m
Z
 d dlmZ d dlmZ ddlmZmZ ddl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 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,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6m7Z7 ddl8m9Z9m:Z:m;Z;m<Z<  ejz                  e>«      Z?dZ@deAfd„ZB G d„ d«      ZC G d„ d«      ZDy)é    N)ÚCallable)ÚOptionalÚUnion)Ú
AudioFrame)ÚFrameé   )ÚclockÚrtp)Úget_capabilitiesÚget_encoderÚis_rtx)ÚEncoder)ÚInvalidStateError)ÚMediaStreamErrorÚMediaStreamTrack)ÚRTCDtlsTransport)ÚRTCRtpCapabilitiesÚRTCRtpCodecParametersÚRTCRtpSendParameters)ÚRTCP_PSFB_APPÚRTCP_PSFB_FIRÚRTCP_PSFB_PLIÚRTCP_RTPFB_NACKÚRTP_HISTORY_SIZEÚAnyRtcpPacketÚRtcpByePacketÚRtcpPsfbPacketÚRtcpRrPacketÚRtcpRtpfbPacketÚRtcpSdesPacketÚRtcpSenderInfoÚRtcpSourceInfoÚRtcpSrPacketÚ	RtpPacketÚunpack_remb_fciÚwrap_rtx)ÚRTCOutboundRtpStreamStatsÚRTCRemoteInboundRtpStreamStatsÚRTCStatsReport)Úrandom16Úrandom32Ú
uint16_addÚ
uint32_addg333333ë?Úreturnc                  ó   — t        «       dz  S )a  
    Generate a random RTP sequence number.

    The sequence number is chosen in the lower half of the allowed range in
    order to avoid wraparounds which break SRTP decryption.

    See:
    https://chromiumdash.appspot.com/commit/13b327b05fa3788b4daa9c3463e13282824cb320
    i €  )r*   © ó    úT/home/uftp/webrtc-recorder/.venv/lib/python3.12/site-packages/aiortc/rtcrtpsender.pyÚrandom_sequence_numberr3   7   s   € ô ‹:˜ÑÐr1   c                   ó&   — e Zd Zdee   dedefd„Zy)ÚRTCEncodedFrameÚpayloadsÚ	timestampÚaudio_levelc                 ó.   — || _         || _        || _        y ©N)r6   r7   r8   )Úselfr6   r7   r8   s       r2   Ú__init__zRTCEncodedFrame.__init__E   s   € Ø ˆŒØ"ˆŒØ&ˆÕr1   N)Ú__name__Ú
__module__Ú__qualname__ÚlistÚbytesÚintr<   r0   r1   r2   r5   r5   D   s    „ ð'  e¡ð '¸ð 'È3ô 'r1   r5   c                   óT  — e Zd ZdZdeeef   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defd„«       Zdefd„Z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deddfd„Zdedee   fd„Zdeddfd„Zd!d„Zdeddfd„Z d!d„Z!de"e   ddfd„Z#dede$ddfd „Z%y)"ÚRTCRtpSendera{  
    The :class:`RTCRtpSender` interface provides the ability to control and
    obtain details about how a particular :class:`MediaStreamTrack` is encoded
    and sent to a remote peer.

    :param trackOrKind: Either a :class:`MediaStreamTrack` instance or a
                         media kind (`'audio'` or `'video'`).
    :param transport: An :class:`RTCDtlsTransport`.
    ÚtrackOrKindÚ	transportr.   Nc                 ó  ‡ — |j                   dk(  rt        ‚t        |t        «      r#|j                  ‰ _        ‰ j                  |«       n|‰ _        ‰ j                  d «       d ‰ _        t        «       ‰ _	        t        «       ‰ _
        t        t        j                  «       «      ‰ _        d‰ _        d ‰ _        d‰ _        t%        j&                  «       ‰ _        d ‰ _        t%        j,                  «       ‰ _        t1        j2                  «       ‰ _        t%        j,                  «       ‰ _        d ‰ _        i ‰ _        t%        j,                  «       ‰ _        t%        j,                  «       ‰ _        d ‰ _         d ‰ _!        tE        «       ‰ _#        d‰ _$        tK        «       ‰ _&        |‰ _'        d ‰ _(        d ‰ _)        d‰ _*        d‰ _+        d‰ _,        d‰ _-        d ‰ _.        d„ ‰ _/        t`        jc                  td        jf                  «      rˆ fd„‰ _/        y y )NÚclosedTFr   c                   ó   — y r:   r0   )Úargss    r2   ú<lambda>z'RTCRtpSender.__init__.<locals>.<lambda>„   s   � r1   c                 óL   •— t        j                  d| › �‰j                  g|¢­Ž S )NzRTCRtpSender(%s) )ÚloggerÚdebugÚ_RTCRtpSender__kind)ÚmsgrJ   r;   s     €r2   rK   z'RTCRtpSender.__init__.<locals>.<lambda>†   s(   ø€ ´&·,±,Ø# C 5Ð)¨4¯;©;ð3Ø9=ò3€ r1   )4Ústater   Ú
isinstancer   ÚkindrO   ÚreplaceTrackÚ_RTCRtpSender__cnamer+   Ú_ssrcÚ	_rtx_ssrcÚstrÚuuidÚuuid4Ú
_stream_idÚ_enabledÚ_RTCRtpSender__encoderÚ_RTCRtpSender__force_keyframeÚasyncioÚget_event_loopÚ_RTCRtpSender__loopÚ_RTCRtpSender__midÚEventÚ_RTCRtpSender__rtp_exitedr
   ÚHeaderExtensionsMapÚ(_RTCRtpSender__rtp_header_extensions_mapÚ_RTCRtpSender__rtp_startedÚ_RTCRtpSender__rtp_taskÚ_RTCRtpSender__rtp_historyÚ_RTCRtpSender__rtcp_exitedÚ_RTCRtpSender__rtcp_startedÚ_RTCRtpSender__rtcp_taskÚ_RTCRtpSender__rtx_payload_typer3   Ú"_RTCRtpSender__rtx_sequence_numberÚ_RTCRtpSender__startedr)   Ú_RTCRtpSender__statsÚ_RTCRtpSender__transportÚ_RTCRtpSender__lsrÚ_RTCRtpSender__lsr_timeÚ_RTCRtpSender__ntp_timestampÚ_RTCRtpSender__rtp_timestampÚ_RTCRtpSender__octet_countÚ_RTCRtpSender__packet_countÚ_RTCRtpSender__rttÚ_RTCRtpSender__log_debugrM   ÚisEnabledForÚloggingÚDEBUG)r;   rE   rF   s   `  r2   r<   zRTCRtpSender.__init__V   s™  ø€ ð �?‰?˜hÒ&Ü#Ð#ä�kÔ#3Ô4Ø%×*Ñ*ˆDŒKØ×Ñ˜kÕ*à%ˆDŒKØ×Ñ˜dÔ#Ø&*ˆŒÜ“ZˆŒ
Ü!›ˆŒäœdŸj™j›lÓ+ˆŒØˆŒØ,0ˆŒØ %ˆÔÜ×,Ñ,Ó.ˆŒØ$(ˆŒ
Ü#ŸM™M›OˆÔÜ+.×+BÑ+BÓ+DˆÔ(Ü$Ÿ]™]›_ˆÔØ:>ˆŒØ35ˆÔÜ$Ÿ]™]›_ˆÔÜ%Ÿm™m›oˆÔØ;?ˆÔØ15ˆÔÜ%;Ó%=ˆÔ"ØˆŒÜ%Ó'ˆŒØ$ˆÔð %)ˆŒ
Ø+/ˆŒØ ˆÔØ ˆÔØˆÔØˆÔØ&*ˆŒ
ñ 1CˆÔÜ×ÑœwŸ}™}Ô-ó ˆDÕð .r1   c                 ó   — | j                   S r:   )rO   ©r;   s    r2   rS   zRTCRtpSender.kindŠ   s   € à�{‰{Ðr1   c                 ó   — | j                   S )zU
        The :class:`MediaStreamTrack` which is being handled by the sender.
        )Ú_RTCRtpSender__trackr~   s    r2   ÚtrackzRTCRtpSender.trackŽ   s   € ð
 �|‰|Ðr1   c                 ó   — | j                   S )zk
        The :class:`RTCDtlsTransport` over which media data for the track is
        transmitted.
        ©rq   r~   s    r2   rF   zRTCRtpSender.transport•   s   € ð ×ÑÐr1   rS   c                 ó   — t        |«      S )z«
        Returns the most optimistic view of the system's capabilities for
        sending media of the given `kind`.

        :rtype: :class:`RTCRtpCapabilities`
        )r   )r;   rS   s     r2   ÚgetCapabilitieszRTCRtpSender.getCapabilities�   s   € ô   Ó%Ð%r1   c              ƒ   óà  K  — | j                   j                  t        t        j                  «       ddt        t        | «      «      z   | j                  | j                  | j                  j                  | j                  | j                  t        t        | j                  «      «      ¬«	      «       | j                   j                  | j                  j                  «       «       | j                   S ­w)zc
        Returns statistics about the RTP sender.

        :rtype: :class:`RTCStatsReport`
        zoutbound-rtpzoutbound-rtp_)	r7   ÚtypeÚidÚssrcrS   ÚtransportIdÚpacketsSentÚ	bytesSentÚtrackId)rp   Úaddr'   r	   Úcurrent_datetimerX   rˆ   rV   rO   rF   Ú	_stats_idrw   rv   r�   ÚupdateÚ
_get_statsr~   s    r2   ÚgetStatszRTCRtpSender.getStats§   s©   è ø€ ð 	�‰×ÑÜ%ä×0Ñ0Ó2Ø#Ø"¤S¬¨D«£]Ñ2à—Z‘ZØ—[‘[Ø ŸN™N×4Ñ4à ×/Ñ/Ø×,Ñ,äœB˜tŸz™z›NÓ+ôô	
ð" 	�‰×Ñ˜DŸN™N×5Ñ5Ó7Ô8à�|‰|Ðùs   ‚C,C.r�   c                 ó~   — || _         |�|j                  | _        y t        t	        j
                  «       «      | _        y r:   )r€   rˆ   Ú	_track_idrX   rY   rZ   )r;   r�   s     r2   rT   zRTCRtpSender.replaceTrackÂ   s,   € ØˆŒØÐØ"ŸX™XˆD�Nä ¤§¡£Ó.ˆD�Nr1   c                 ó   — || _         y r:   rƒ   )r;   rF   s     r2   ÚsetTransportzRTCRtpSender.setTransportÉ   s
   € Ø$ˆÕr1   Ú
parametersc              ƒ   ój  K  — | j                   �s"|j                  j                  | _        |j                  | _        | j                  j                  | |«       | j                  j                  |«       |j                  D ]J  }t        |«      sŒ|j                  d   |j                  d   j                  k(  sŒ9|j                  | _         n t        j                   | j#                  |j                  d   «      «      | _        t        j                   | j'                  «       «      | _        d| _         yy­w)zŸ
        Attempt to set the parameters controlling the sending of media.

        :param parameters: The :class:`RTCRtpSendParameters` for the sender.
        Úaptr   TN)ro   ÚrtcpÚcnamerU   ÚmuxIdrb   rq   Ú_register_rtp_senderrf   Ú	configureÚcodecsr   r˜   ÚpayloadTyperm   r_   Úensure_futureÚ_run_rtprh   Ú	_run_rtcprl   )r;   r˜   Úcodecs      r2   ÚsendzRTCRtpSender.sendÌ   sû   è ø€ ð �~‹~Ø%Ÿ?™?×0Ñ0ˆDŒLØ#×)Ñ)ˆDŒJð ×Ñ×1Ñ1°$¸
ÔCØ×,Ñ,×6Ñ6°zÔBð $×*Ñ*ò �ä˜5•MØ×(Ñ(¨Ñ/°:×3DÑ3DÀQÑ3G×3SÑ3SÓSà.3×.?Ñ.?�DÔ+Ùðô &×3Ñ3°D·M±MÀ*×BSÑBSÐTUÑBVÓ4WÓXˆDŒOÜ&×4Ñ4°T·^±^Ó5EÓFˆDÔØ!ˆD�Nð' ùs   ‚BD3Â)D3Â8A;D3c              ƒ   ó  K  — | j                   rì| j                  j                  | «       t        j                  | j
                  j                  «       | j                  j                  «       «      ƒ d{  –—†  | j                  j                  «        | j                  j                  «        t        j                  | j                  j                  «       | j                  j                  «       «      ƒ d{  –—†  yy7 Œˆ7 Œ­w)z/
        Irreversibly stop the sender.
        N)ro   rq   Ú_unregister_rtp_senderr_   Úgatherrg   Úwaitrk   rh   Úcancelrl   rd   rj   r~   s    r2   ÚstopzRTCRtpSender.stopç   s½   è ø€ ð �>Š>Ø×Ñ×3Ñ3°DÔ9ô —.‘. ×!3Ñ!3×!8Ñ!8Ó!:¸D×<OÑ<O×<TÑ<TÓ<VÓW×WÐWØ�O‰O×"Ñ"Ô$Ø×Ñ×#Ñ#Ô%Ü—.‘. ×!2Ñ!2×!7Ñ!7Ó!9¸4×;MÑ;M×;RÑ;RÓ;TÓU×UÑUð ð Xøð Vús%   ‚A1D Á3C<Á4BD Ã5C>Ã6D Ã>D Úpacketc              ƒ   ón  ‡ K  — t        |t        t        f«      �rmt        ˆ fd„|j                  «      D �]O  }‰ j
                  |j                  k(  rv|j                  rjt        j                  «       ‰ j                  z
  |j                  dz  z
  }‰ j                  €|‰ _
        n%t        ‰ j                  z  dt        z
  |z  z   ‰ _
        ‰ j                  j                  t        t        j                   «       ddt#        t%        ‰ «      «      z   |j&                  ‰ j(                  ‰ j*                  j,                  ‰ j.                  |j0                  z
  |j0                  |j2                  ‰ j                  |j4                  ¬«      «       �ŒR y t        |t6        «      r>|j8                  t:        k(  r+|j<                  D ]  }‰ j?                  |«      ƒ d {  –—†  Œ y t        |t@        «      r)|j8                  tB        tD        fv r‰ jG                  «        y t        |t@        «      r„|j8                  tH        k(  rp	 tK        |jL                  «      \  }}‰ jN                  |v rH‰ jQ                  d|«       ‰ jR                  r)tU        ‰ jR                  d«      r|‰ jR                  _+        y y y y y y 7 ŒÕ# tX        $ r Y y w xY w­w)	Nc                 ó6   •— | j                   ‰j                  k(  S r:   )r‰   rV   )Úxr;   s    €r2   rK   z2RTCRtpSender._handle_rtcp_packet.<locals>.<lambda>ö   s   ø€ ¨1¯6©6°T·Z±ZÑ+?€ r1   i   r   zremote-inbound-rtpzremote-inbound-rtp_)r7   r‡   rˆ   r‰   rS   rŠ   ÚpacketsReceivedÚpacketsLostÚjitterÚroundTripTimeÚfractionLostz+- receiver estimated maximum bitrate %d bpsÚtarget_bitrate)-rR   r   r#   ÚfilterÚreportsrr   ÚlsrÚdlsrÚtimers   rx   Ú	RTT_ALPHArp   rŽ   r(   r	   r�   rX   rˆ   r‰   rO   rF   r�   rw   Úpackets_lostr³   Úfraction_lostr   Úfmtr   ÚlostÚ_retransmitr   r   r   Ú_send_keyframer   r%   ÚfcirV   ry   r]   Úhasattrr¶   Ú
ValueError)r;   r­   ÚreportÚrttÚseqÚbitrateÚssrcss   `      r2   Ú_handle_rtcp_packetz RTCRtpSender._handle_rtcp_packetô   s*  øè ø€ Ü�fœ|¬\Ð:Õ;Ü Ó!?ÀÇÁÓPó �à—:‘: §¡Ò+°·²ÜŸ)™)›+¨¯©Ñ7¸6¿;¹;ÈÑ;NÑO�CØ—z‘zÐ)Ø%(˜�
ä%.°·±Ñ%;¸qÄ9¹}ÐPSÑ>SÑ%S˜œ
à—‘× Ñ Ü2ä"'×"8Ñ"8Ó":Ø1Ø0´3´r¸$³x³=Ñ@à#Ÿ[™[Ø!Ÿ[™[Ø$(§N¡N×$<Ñ$<à(,×(;Ñ(;¸f×>QÑ>QÑ(QØ$*×$7Ñ$7Ø%Ÿ}™}à&*§j¡jØ%+×%9Ñ%9ôöñô8 ˜¤Ô0°V·Z±ZÄ?Ò5RØ—{‘{ò ,�Ø×&Ñ& sÓ+×+Ñ+ñ,ä˜¤Ô/°F·J±JÜÜðC
ñ 5
ð ×ÑÕ!Ü˜¤Ô/°F·J±JÄ-Ò4Oð	Ü!0°·±Ó!<‘�˜Ø—:‘: Ñ&Ø×$Ñ$ØEÀwôð —~’~¬'°$·.±.ÐBRÔ*SØ8?˜Ÿ™Õ5ð +T�~ð	 'ð 5PÐ/ð ,ùô ò Ùðüs8   ƒGJ5ÇJ$ÇA#J5È3A+J& ÊJ5Ê&	J2Ê/J5Ê1J2Ê2J5r¥   c              ƒ   ó  K  — | j                   j                  «       ƒ d {  –—† }| j                  sy d }| j                  €t	        |«      | _        t        |t        «      rvt        |t        «      rt        j                  |«      }| j                  }d| _
        | j                  j                  d | j                  j                  ||«      ƒ d {  –—† \  }}n| j                  j                  |«      \  }}|sy t        |||«      S 7 Œã7 Œ8­w)NF)r€   Úrecvr\   r]   r   rR   r   r   r
   Úcompute_audio_level_dbovr^   ra   Úrun_in_executorÚencodeÚpackr5   )r;   r¥   Údatar8   Úforce_keyframer6   r7   s          r2   Ú_next_encoded_framez RTCRtpSender._next_encoded_frame&  sê   è ø€ ð —\‘\×&Ñ&Ó(×(ˆð
 �}Š}Øàˆà�>‰>Ð!Ü(¨Ó/ˆDŒNä�dœEÔ"ä˜$¤
Ô+Ü!×:Ñ:¸4Ó@�à!×2Ñ2ˆNØ$)ˆDÔ!Ø(,¯©×(CÑ(CØ�d—n‘n×+Ñ+¨T°>ó)÷ #ÑˆH‘ið
 #'§.¡.×"5Ñ"5°dÓ";ÑˆH�iñ Øä˜x¨°KÓ@Ð@ðA )øð(#ús"   ‚D D¡B,DÃDÃ7DÄDÚsequence_numberc              ƒ   óÂ  K  — | j                   j                  |t        z  «      }|rµ|j                  |k(  r¥| j                  �Ht        || j                  | j                  | j                  ¬«      }t        | j                  d«      | _        | j                  d|«       |j                  | j                  «      }| j                  j                  |«      ƒ d{  –—†  yyy7 Œ­w)zF
        Retransmit an RTP packet which was reported as lost.
        N)Úpayload_typerÕ   r‰   r   ú> %s)ri   Úgetr   rÕ   rm   r&   rn   rW   r,   ry   Ú	serializerf   rF   Ú	_send_rtp)r;   rÕ   r­   Úpacket_bytess       r2   rÁ   zRTCRtpSender._retransmitL  sÉ   è ø€ ð ×#Ñ#×'Ñ'¨Ô:JÑ(JÓKˆÙ�f×,Ñ,°Ò?Ø×&Ñ&Ð2Ü!ØØ!%×!8Ñ!8Ø$(×$>Ñ$>ØŸ™ô	�ô .8¸×8RÑ8RÐTUÓ-V�Ô*à×Ñ˜V VÔ,Ø!×+Ñ+¨D×,LÑ,LÓMˆLØ—.‘.×*Ñ*¨<Ó8×8Ñ8ð @ˆ6ð 9ús   ‚CCÃCÃCc                 ó   — d| _         y)z:
        Request the next frame to be a keyframe.
        TN)r^   r~   s    r2   rÂ   zRTCRtpSender._send_keyframe_  s   € ð !%ˆÕr1   c              ƒ   ó6  K  — | j                  d«       | j                  j                  «        t        «       }t	        «       }	 	 | j
                  st        j                  d«      ƒ d {  –—†  Œ+| j                  |«      ƒ d {  –—† }|€ŒGt        ||j                  «      }t        |j                  «      D �]¥  \  }}t        |j                  ||¬«      }| j                  |_        ||_        |t%        |j                  «      dz
  k(  xr dxs d|_        t)        j*                  «       dz	  dz  |j,                  _        | j0                  |j,                  _        |j4                  �d|j4                   f|j,                  _        | j                  d	|«       || j6                  |j8                  t:        z  <   |j=                  | j>                  «      }	| j@                  jC                  |	«      ƒ d {  –—†  t)        j*                  «       | _"        |j                  | _#        | xjH                  t%        |«      z  c_$        | xjJ                  dz  c_%        tM        |d«      }�Œ¨ �Œ7 �Œø7 �Œá7 Œx# t        jN                  tP        tR        f$ r Y n1tT        $ r& | jW                  tY        jZ                  «       «       Y nw xY w| j
                  r!| j
                  j]                  «        d | _        d | _/        | j                  d
«       | j`                  j                  «        y ­w)Nz- RTP startedg{®Gáz”?)r×   rÕ   r7   r   r   é   iÿÿÿ FrØ   z- RTP finished)1ry   rg   Úsetr3   r+   r€   r_   ÚsleeprÔ   r-   r7   Ú	enumerater6   r$   r¡   rV   r‰   ÚpayloadÚlenÚmarkerr	   Úcurrent_ntp_timeÚ
extensionsÚabs_send_timerb   Úmidr8   ri   rÕ   r   rÚ   rf   rF   rÛ   rt   ru   rv   rw   r,   ÚCancelledErrorÚConnectionErrorr   Ú	ExceptionÚ_RTCRtpSender__log_warningÚ	tracebackÚ
format_excr¬   r]   rd   )
r;   r¥   rÕ   Útimestamp_originÚ	enc_framer7   Úirã   r­   rÜ   s
             r2   r£   zRTCRtpSender._run_rtpe  s¶  è ø€ Ø×Ñ˜Ô)Ø×Ñ×ÑÔ ä0Ó2ˆÜ#›:Ðð2	7ØØ—|’|Ü!Ÿ-™-¨Ó-×-Ð-Øð #'×":Ñ":¸5Ó"A×A�	ØÐ$Øä&Ð'7¸×9LÑ9LÓM�	ä"+¨I×,>Ñ,>Ó"?ó E‘J�A�wÜ&Ø%*×%6Ñ%6Ø(7Ø"+ô�Fð
 #'§*¡*�F”KØ%,�F”NØ%&¬#¨i×.@Ñ.@Ó*AÀAÑ*EÑ%EÒ$LÈ1Ò$QÐPQ�F”Mô ×.Ñ.Ó0°BÑ6Ø"ñ7#�F×%Ñ%Ô3ð -1¯J©J�F×%Ñ%Ô)Ø ×,Ñ,Ð8Ø9>À×AVÑAVÐ@VÐ8W˜×)Ñ)Ô5ð ×$Ñ$ V¨VÔ4àð ×&Ñ& v×'=Ñ'=Ô@PÑ'PÑQð $*×#3Ñ#3°D×4TÑ4TÓ#U�LØŸ.™.×2Ñ2°<Ó@×@Ð@ä+0×+AÑ+AÓ+C�DÔ(Ø+1×+;Ñ+;�DÔ(Ø×&Ò&¬#¨g«,Ñ6Õ&Ø×'Ò'¨1Ñ,Õ'Ü&0°À!Ó&D’Oð=Eñ à-ùð
 Bùð< Aùô ×&Ñ&¬Ô9IÐJò 	ÙÜò 	7ð ×Ñœy×3Ñ3Ó5Ö6ð	7úð �<Š<Ø�L‰L×ÑÔØˆDŒLð ˆŒà×ÑÐ)Ô*Ø×Ñ×ÑÕùsc   ‚A LÁ%I( Á(I Á)I( ÂI#ÂE*I( Ç-I&Ç.A3I( É#I( É&I( É(J6ÊLÊ+J6Ê3LÊ5J6Ê6A#Lc              ƒ   ó¬  K  — | j                  d«       | j                  j                  «        	 	 t        j                  dt        j
                  «       z   «      ƒ d {  –—†  t        | j                  t        | j                  | j                  | j                  dz  | j                  dz  ¬«      ¬«      g}| j                  dz	  dz  | _        t        j                  «       | _        | j                   �M|j#                  t%        t'        | j                  d| j                   j)                  d«      fg¬	«      g¬
«      «       | j+                  |«      ƒ d {  –—†  �Œ)7 Œû7 Œ# t        j,                  $ r Y nw xY wt/        | j                  g¬«      }| j+                  |g«      ƒ d {  –—†7   | j                  d«       | j0                  j                  «        y ­w)Nz- RTCP startedg      à?l   ÿÿ )Úntp_timestampÚrtp_timestampÚpacket_countÚoctet_count)r‰   Úsender_infoé   r   Úutf8)r‰   Úitems)Úchunks)Úsourcesz- RTCP finished)ry   rk   rà   r_   rá   Úrandomr#   rV   r!   rt   ru   rw   rv   rr   r»   rs   rU   Úappendr    r"   rÐ   Ú
_send_rtcprê   r   rj   )r;   Úpacketsr­   s      r2   r¤   zRTCRtpSender._run_rtcpª  s”  è ø€ Ø×ÑÐ)Ô*Ø×Ñ×ÑÔ!ð$	Øô —m‘m C¬&¯-©-«/Ñ$9Ó:×:Ð:ô !Ø!ŸZ™ZÜ$2Ø*.×*>Ñ*>Ø*.×*>Ñ*>Ø)-×)<Ñ)<¸zÑ)IØ(,×(:Ñ(:¸ZÑ(Gô	%ôð
0�ð  $×3Ñ3¸Ñ:¸jÑH�”
Ü"&§)¡)£+�”ð —<‘<Ð+Ø—N‘NÜ&ä .Ø)-¯©Ø,-¨t¯|©|×/BÑ/BÀ6Ó/JÐ+KÐ*Lô!"ð$ôô	ð —o‘o gÓ.×.Ð.ñC ð ;øð< /ùÜ×%Ñ%ò 	Ùð	úô ¨¯
©
 |Ô4ˆØ�o‰o˜v˜hÓ'×'Ñ'à×ÑÐ*Ô+Ø×Ñ×ÑÕ ùsM   ‚,G¯.E ÁEÁC4E ÅEÅE ÅE ÅE3Å0GÅ2E3Å3/GÆ"F%Æ#1Gr  c              ƒ   óÈ   K  — d}|D ]"  }| j                  d|«       |t        |«      z  }Œ$ 	 | j                  j                  |«      ƒ d {  –—†  y 7 Œ# t        $ r Y y w xY w­w)Nr1   rØ   )ry   rA   rF   rÛ   rë   )r;   r  rã   r­   s       r2   r   zRTCRtpSender._send_rtcpÛ  sf   è ø€ ØˆØò 	%ˆFØ×Ñ˜V VÔ,Ø”u˜V“}Ñ$‰Gð	%ð	Ø—.‘.×*Ñ*¨7Ó3×3Ò3ùÜò 	Ùð	üs:   ‚*A"­A ÁAÁA ÁA"ÁA Á	AÁA"ÁAÁA"rP   rJ   c                 óL   — t        j                  d|› �| j                  g|¢­Ž  y )NzRTCRtpsender(%s) )rM   ÚwarningrO   )r;   rP   rJ   s      r2   Ú__log_warningzRTCRtpSender.__log_warningæ  s!   € Ü�‰Ð*¨3¨%Ð0°$·+±+ÐEÀÔEr1   )r.   N)&r=   r>   r?   Ú__doc__r   r   rX   r   r<   ÚpropertyrS   r�   rF   Úclassmethodr   r…   r)   r“   r   rT   r—   r   r¦   r¬   r   rË   r   r5   rÔ   rB   rÁ   rÂ   r£   r¤   r@   r   Úobjectrí   r0   r1   r2   rD   rD   K   s—  „ ñð2Ø Ð!1°3Ð!6Ñ7ð2ØDTð2à	ó2ðh ð�cò ó ðð ðÐ'ò ó ðð ð Ð+ò  ó ð ð ð& Cð &Ð,>ò &ó ð&ð ó ð6/ (Ð+;Ñ"<ð /Àó /ð%Ð&6ð %¸4ó %ð"Ð%9ð "¸dó "ó6Vð0°ð 0À$ó 0ðd$AØ*ð$Aà	�/Ñ	"ó$AðL9°ð 9¸ó 9ó&%ðC Ð$9ð C ¸dó C óJ/!ðb	¨¨]Ñ(;ð 	Àó 	ðF ð F¨Vð F¸ô Fr1   rD   )Er_   r{   rþ   r»   rî   rY   Úcollections.abcr   Útypingr   r   Úavr   Úav.framer   Ú r	   r
   r    r   r   r   Úcodecs.baser   Ú
exceptionsr   Úmediastreamsr   r   Úrtcdtlstransportr   Úrtcrtpparametersr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   Ústatsr'   r(   r)   Úutilsr*   r+   r,   r-   Ú	getLoggerr=   rM   r¼   rB   r3   r5   rD   r0   r1   r2   ú<module>r     s¨   ðÛ Û Û Û Û Û Ý $ß "å Ý ç ß 9Ñ 9Ý  Ý )ß <Ý .÷ñ ÷
÷ ÷ ÷ õ ÷&ñ ÷
 >Ó =à	ˆ×	Ñ	˜8Ó	$€à€	ð
 ó 
÷'ñ '÷\Fò \Fr1   