o
    dia                  
   @   s  d dl Z d dlZd dlZd dlmZmZ d dlmZmZmZ d dl	m
Z
mZmZ d dlmZ ddlmZ dZed	d
ZeddZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$eG dd dZ%G dd dZ&de'de'fdd Z(de'de)fd!d"Z*d#e)de'fd$d%Z+d&e'de'd'e)de)fd(d)Z,d*e'd+e-e' de)fd,d-Z.d.e)de/e'e-e' f fd/d0Z0d1e)de1fd2d3Z2d4e'de'fd5d6Z3d7e'd8e)de-e/e'e)f  fd9d:Z4d;e-e/e'e)f  de/e'e)f fd<d=Z5d>ede'fd?d@Z6eG dAdB dBZ7eG dCdD dDZ8eG dEdF dFZ9eG dGdH dHZ:eG dIdJ dJZ;eG dKdL dLZ<eG dMdN dNZ=eG dOdP dPZ>eG dQdR dRZ?ee:e;e<e=e>e?f Z@G dSdT dTZAG dUdV dVZBdWeBdXe'dYe'deBfdZd[ZCd\eBdXe'd]e'dYe'deBf
d^d_ZDdS )`    N)	dataclassfield)packunpackunpack_from)AnyOptionalUnion)
AudioFrame   )RTCRtpParameters   H   M   `         i  i                            c                   @   sn   e Zd ZU dZee ed< dZeed< dZ	eed< dZ
eed< dZeed< dZee ed< dZee ed< dS )	HeaderExtensionsNabs_send_timeaudio_levelmidrepaired_rtp_stream_idrtp_stream_idtransmission_offsettransport_sequence_number)__name__
__module____qualname__r   r   int__annotations__r   r   r   r    r!   r"   r#    r)   r)   >/home/ubuntu/.local/lib/python3.10/site-packages/aiortc/rtp.pyr   )   s   
 r   c                   @   sX   e Zd ZdddZdeddfddZded	edefd
dZ	dede
eef fddZdS )HeaderExtensionsMapreturnNc                 C   s   t  | _d S N)r   _HeaderExtensionsMap__idsselfr)   r)   r*   __init__5   s   zHeaderExtensionsMap.__init__
parametersc                 C   s   |j D ]N}|jdkr|j| j_q|jdkr|j| j_q|jdkr&|j| j_q|jdkr1|j| j_q|jdkr<|j| j_q|jdkrG|j| j_	q|jdkrQ|j| j_
qd S )Nz#urn:ietf:params:rtp-hdrext:sdes:midz6urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-idz-urn:ietf:params:rtp-hdrext:sdes:rtp-stream-idz:http://www.webrtc.org/experiments/rtp-hdrext/abs-send-timez"urn:ietf:params:rtp-hdrext:toffsetz+urn:ietf:params:rtp-hdrext:ssrc-audio-levelzIhttp://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01)headerExtensionsuriidr.   r   r    r!   r   r"   r   r#   )r0   r2   extr)   r)   r*   	configure8   s&   







zHeaderExtensionsMap.configureextension_profileextension_valuec                 C   s  t  }t||D ]v\}}|| jjkr|d|_q|| jjkr&|d|_q|| jjkr3|d|_q|| jjkrDtdd| d |_q|| jj	krWtd|d d d? |_	q|| jj
krptd|d }|d	@ d	k|d
@ f|_
q|| jjkr~td|d |_q|S )Nutf8ascii!L    r   !l   !Br      !H)r   unpack_header_extensionsr.   r   decoder    r!   r   r   r"   r   r#   )r0   r8   r9   valuesx_idx_value	vad_levelr)   r)   r*   getN   s*   zHeaderExtensionsMap.getrE   c                 C   sn  g }|j d ur| jj r|| jj |j df |jd ur.| jjr.|| jj|jdf |jd urD| jjrD|| jj|jdf |jd ur^| jjr^|| jjtd|jdd  f |jd urz| jjrz|| jjtd|jd> dd f |j	d ur| jj	r|| jj	td	|j	d rd
nd|j	d d@ B f |j
d ur| jj
r|| jj
td|j
f t|S )Nr:   r;   r<   r   r>   r?   r   r   r@   r   rA   rB   )r   r.   appendencoder    r!   r   r   r"   r   r#   pack_header_extensions)r0   rE   
extensionsr)   r)   r*   setd   sZ   



zHeaderExtensionsMap.set)r,   N)r$   r%   r&   r1   r   r7   r'   bytesr   rI   tuplerN   r)   r)   r)   r*   r+   4   s
    
r+   countr,   c                 C   s   t tt| tS r-   )maxPACKETS_LOST_MINminPACKETS_LOST_MAXrQ   r)   r)   r*   clamp_packets_lost   s   rW   c                 C   s   t d| dd  S )Nr>   r   r   rV   r)   r)   r*   pack_packets_lost   s   rY   dc                 C   s,   | d d@ rd|  } nd|  } t d| d S )Nr   r      r=   r>   r   )rZ   r)   r)   r*   unpack_packets_lost   s   
r]   packet_typepayloadc                 C   s2   t |d dks
J tdd|B | t |d | S )Nr   r   !BBHr   )lenr   )r^   rQ   r_   r)   r)   r*   pack_rtcp_packet   s   rb   bitratessrcsc                 C   sn   d}d}| }|dkr|dL }|d7 }|dks
|t dt||d> |d? B |d@ 7 }|D ]	}|t d	|7 }q+|S )
z
    Pack the FCI for a Receiver Estimated Maximum Bitrate report.

    https://tools.ietf.org/html/draft-alvestrand-rmcat-remb-03
       REMBr   i r   r`   r      i  r<   )r   ra   )rc   rd   dataexponentmantissassrcr)   r)   r*   pack_remb_fci   s   rk   rg   c                 C   s   t | dk s| dd dkrtd| d d@ d? }| d d	@ d
> | d d> B | d B }||> }d}g }t| d D ]}|td| |d  |d7 }q:||fS )z
    Unpack the FCI for a Receiver Estimated Maximum Bitrate report.

    https://tools.ietf.org/html/draft-alvestrand-rmcat-remb-03
    r?   r   r   re   zInvalid REMB prefix      r   r   rf         r<   )ra   
ValueErrorrangerJ   r   )rg   rh   ri   rc   posrd   rr)   r)   r*   unpack_remb_fci   s   $
rt   msgc                 C   s$   t | dko| d dko| d dkS )Nr   r         )ra   )ru   r)   r)   r*   is_rtcp   s   $rx   lengthc                 C   s   d| d d  |  S )z@
    Return amount of padding needed for a 4-byte multiple.
    r   r   r)   )ry   r)   r)   r*   padl   s   rz   r8   r9   c                 C   sP  g }d}| dkrT|t |k rR|| dkr|d7 }q|| d@ d? }|| d@ d }|d7 }t ||| k r9td||||  }|||f ||7 }|t |k s|S | dkr|t |k r|| dkri|d7 }qXt ||d	 k rutd
td||\}}|d	7 }t ||| k rtd||||  }|||f ||7 }|t |k s^|S )z8
    Parse header extensions according to RFC 5285.
    r   ޾  r      r   r   z0RTP one-byte header extension value is truncated   r   z*RTP two-byte header extension is truncated!BBz0RTP two-byte header extension value is truncated)ra   rp   rJ   r   )r8   r9   rM   rr   rF   x_lengthrG   r)   r)   r*   rC      sB   "rC   rM   c                 C   s
  d}d}| s
||fS d}| D ]*\}}t |}|dkr|dk s J |dkr(|dk s*J |dks6|dks6|dkr8d}q|r\d}d}| D ]\}}t |}|td	|d
> |d B 7 }||7 }qAnd}d}| D ]\}}t |}|td||7 }||7 }qb|dtt | 7 }||fS )z<
    Serialize header extensions according to RFC 5285.
    r       T      rf   Fr{   r@   r   r   r}   r~   r=   )ra   r   rz   )rM   r8   r9   one_byterF   rG   r   r)   r)   r*   rL     s8   

rL   framec           
      C   s   d}d}d}d}t | jd }td}||D ]}|d }||| 7 }qt|| j| |  }|dkrKdt| }	t	|	|}	t
|	|}	t|	S |}	t|	S )zJ
    Compute the energy level as spelled out in RFC 6465, Appendix A.
    i  r   ig        h   )rO   planesstructStructiter_unpackmathsqrtsampleslog10rR   rT   round)
r   MAX_SAMPLE_VALUEMAX_AUDIO_LEVELMIN_AUDIO_LEVELrmsbufsunpackedsampledbr)   r)   r*   compute_audio_level_dbov:  s"   


r   c                   @   sj   e Zd ZU eed< eed< eed< eed< eed< eed< eed< defd	d
Zededd fddZdS )RtcpReceiverInforj   fraction_lostpackets_losthighest_sequencejitterlsrdlsrr,   c                 C   s>   t d| j| j}|t| j7 }|t d| j| j| j| j7 }|S )N!LB!LLLL)	r   rj   r   rY   r   r   r   r   r   )r0   rg   r)   r)   r*   	__bytes__[  s   zRtcpReceiverInfo.__bytes__rg   c           	   	   C   sV   t d|dd \}}t|dd }t d|dd  \}}}}| |||||||dS )Nr   r   rl   r?   r   )rj   r   r   r   r   r   r   )r   r]   )	clsrg   rj   r   r   r   r   r   r   r)   r)   r*   parsea  s   zRtcpReceiverInfo.parseN	r$   r%   r&   r'   r(   rO   r   classmethodr   r)   r)   r)   r*   r   Q  s   
 r   c                   @   sR   e Zd ZU eed< eed< eed< eed< defddZededd fd	d
ZdS )RtcpSenderInfontp_timestamprtp_timestamppacket_countoctet_countr,   c                 C   s   t d| j| j| j| jS )N!QLLL)r   r   r   r   r   r/   r)   r)   r*   r   x  s   zRtcpSenderInfo.__bytes__rg   c                 C   s"   t d|\}}}}| ||||dS )Nr   )r   r   r   r   r\   )r   rg   r   r   r   r   r)   r)   r*   r     s   zRtcpSenderInfo.parseNr   r)   r)   r)   r*   r   q  s   
 	r   c                   @   s*   e Zd ZU eed< eeeef  ed< dS )RtcpSourceInforj   itemsN)	r$   r%   r&   r'   r(   listrP   r   rO   r)   r)   r)   r*   r     s   
 r   c                   @   sB   e Zd ZU ee ed< defddZedededd fddZ	d	S )
RtcpByePacketsourcesr,   c                 C   s(   d dd | jD }ttt| j|S )Nr   c                 S   s   g | ]}t d |qS )r<   rX   ).0rj   r)   r)   r*   
<listcomp>  s    z+RtcpByePacket.__bytes__.<locals>.<listcomp>)joinr   rb   RTCP_BYEra   r0   r_   r)   r)   r*   r     s   zRtcpByePacket.__bytes__rg   rQ   c                 C   sH   t |d| k rtd|dkrttdd|  |d}ng }| |dS )Nr   zRTCP bye length is invalidr   !L)r   )ra   rp   r   r   )r   rg   rQ   r   r)   r)   r*   r     s   
zRtcpByePacket.parseN)
r$   r%   r&   r   r'   r(   rO   r   r   r   r)   r)   r)   r*   r     s
   
 r   c                   @   s^   e Zd ZU dZeed< eed< eed< dZeed< defdd	Ze	d
ededd fddZ
dS )RtcpPsfbPacketz7
    Payload-Specific Feedback Message (RFC 4585).
    fmtrj   
media_ssrcr   fcir,   c                 C   s$   t d| j| j| j }tt| j|S )N!LL)r   rj   r   r   rb   	RTCP_PSFBr   r   r)   r)   r*   r     s   zRtcpPsfbPacket.__bytes__rg   c                 C   sF   t |dk r
tdtd|dd \}}|dd  }| ||||dS )Nr?   z0RTCP payload-specific feedback length is invalidr   r   )r   rj   r   r   )ra   rp   r   )r   rg   r   rj   r   r   r)   r)   r*   r     s
   zRtcpPsfbPacket.parseN)r$   r%   r&   __doc__r'   r(   r   rO   r   r   r   r)   r)   r)   r*   r     s   
 r   c                   @   sT   e Zd ZU eed< eedZee ed< de	fddZ
ede	dedd fd	d
ZdS )RtcpRrPacketrj   default_factoryreportsr,   c                 C   s6   t d| j}| jD ]}|t|7 }q	ttt| j|S Nr<   )r   rj   r   rO   rb   RTCP_RRra   r0   r_   reportr)   r)   r*   r     s   
zRtcpRrPacket.__bytes__rg   rQ   c              	   C   sx   t |dd|  krtdtd|dd d }d}g }t|D ]}|t|||d   |d7 }q!| ||dS )Nr      z&RTCP receiver report length is invalidr<   r   )rj   r   )ra   rp   r   rq   rJ   r   r   )r   rg   rQ   rj   rr   r   rs   r)   r)   r*   r     s   
zRtcpRrPacket.parseN)r$   r%   r&   r'   r(   r   r   r   r   rO   r   r   r   r)   r)   r)   r*   r     s   
 r   c                   @   sh   e Zd ZU dZeed< eed< eed< eedZee ed< de	fdd	Z
ed
e	dedd fddZdS )RtcpRtpfbPacketz2
    Generic RTP Feedback Message (RFC 4585).
    r   rj   r   r   lostr,   c                 C   s   t d| j| j}| jrA| jd }d}| jdd  D ]}|| d }|dk r,|d|> O }q|t d||7 }|}d}q|t d||7 }tt| j|S )Nr   r   r   rf   !HH)r   rj   r   r   rb   
RTCP_RTPFBr   )r0   r_   pidblpprZ   r)   r)   r*   r     s   
zRtcpRtpfbPacket.__bytes__rg   c           
      C   s   t |dk st |d rtdtd|dd \}}g }tdt |dD ]+}td|||d  \}}|| tddD ]}	||	? d@ rO|||	 d  q>q%| ||||d	S )
Nr?   r   z#RTCP RTP feedback length is invalidr   r   r   rf   r   )r   rj   r   r   )ra   rp   r   rq   rJ   )
r   rg   r   rj   r   r   rr   r   r   rZ   r)   r)   r*   r     s   
zRtcpRtpfbPacket.parseN)r$   r%   r&   r   r'   r(   r   r   r   rO   r   r   r   r)   r)   r)   r*   r     s   
 r   c                   @   sL   e Zd ZU eedZee ed< defddZ	e
dededd fdd	Zd
S )RtcpSdesPacketr   chunksr,   c                 C   s   d}| j D ]"}|td|j7 }|jD ]\}}|td|t|| 7 }q|d7 }qt|d r8|d7 }t|d s.ttt| j |S )Nr   r<   r~   s     r   r=   )r   r   rj   r   ra   rb   	RTCP_SDES)r0   r_   chunkd_typed_valuer)   r)   r*   r     s   

zRtcpSdesPacket.__bytes__rg   rQ   c                 C   s   d}g }t |D ]e}t||d k rtdtd||d }|d7 }g }|t|d k rdtd||\}}	|d7 }t|||	 k rDtd||||	  }
||	7 }|dkrUn|||
f |t|d k s,|t||d	 q| |d
S )Nr   r   zRTCP SDES source is truncatedr<   r   r~   r   zRTCP SDES item is truncated)rj   r   )r   )rq   ra   rp   r   rJ   r   )r   rg   rQ   rr   r   rs   rj   r   r   d_lengthr   r)   r)   r*   r     s*   
zRtcpSdesPacket.parseN)r$   r%   r&   r   r   r   r   r(   rO   r   r   r'   r   r)   r)   r)   r*   r     s
   
 r   c                   @   s\   e Zd ZU eed< eed< eedZee	 ed< de
fddZede
d	edd fd
dZdS )RtcpSrPacketrj   sender_infor   r   r,   c                 C   sD   t d| j}|t| j7 }| jD ]}|t|7 }qttt| j|S r   )r   rj   rO   r   r   rb   RTCP_SRra   r   r)   r)   r*   r   4  s
   
zRtcpSrPacket.__bytes__rg   rQ   c              	   C   s   t |dd|  krtdtd|d }t|dd }d}g }t|D ]}|t|||d   |d7 }q&t|||dS )Nr   z$RTCP sender report length is invalidr<   r   r   )rj   r   r   )	ra   rp   r   r   r   rq   rJ   r   r   )r   rg   rQ   rj   r   rr   r   rs   r)   r)   r*   r   ;  s   
zRtcpSrPacket.parseN)r$   r%   r&   r'   r(   r   r   r   r   r   rO   r   r   r   r)   r)   r)   r*   r   .  s   
 r   c                   @   s&   e Zd Zededee fddZdS )
RtcpPacketrg   r,   c                 C   s  d}g }|t |k rt ||t k rtdt dtd|||d  \}}}|d? }|d? d@ }|d	@ }	|d
kr>td|d7 }||d  }
t ||
k rRtd|||
 }|
}|rw|rj|d rj|d t |krntd|d|d   }|tkr|t||	 nE|tkr|t	||	 n7|t
kr|t||	 n)|tkr|t||	 n|tkr|t||	 n|tkr|t||	 |t |k s
|S )Nr   z RTCP packet length is less than  bytesr`   r   rn   rl   r      r   zRTCP packet has invalid versionzRTCP packet is truncatedz%RTCP packet padding length is invalid)ra   RTCP_HEADER_LENGTHrp   r   r   rJ   r   r   r   r   r   r   r   r   r   r   r   r   )r   rg   rr   packets	v_p_countr^   ry   versionpaddingrQ   endr_   r)   r)   r*   r   U  sJ   
&zRtcpPacket.parseN)r$   r%   r&   r   rO   r   AnyRtcpPacketr   r)   r)   r)   r*   r   T  s    r   c                   @   s   e Zd Z						ddedededededed	d
fddZd	efddZee	 fdede	d	d fddZ
e	 fde	d	efddZd
S )	RtpPacketr   r   payload_typemarkersequence_number	timestamprj   r_   r,   Nc                 C   sB   d| _ || _|| _|| _|| _|| _g | _t | _|| _	d| _
d S )Nr   r   )r   r   r   r   r   rj   csrcr   rM   r_   padding_size)r0   r   r   r   r   rj   r_   r)   r)   r*   r1     s   	
zRtpPacket.__init__c                 C   s2   d| j  d| j d| j d| j dt| j dS )NzRtpPacket(seq=z, ts=z	, marker=z
, payload=z, z bytes))r   r   r   r   ra   r_   r/   r)   r)   r*   __repr__  s   zRtpPacket.__repr__rg   extensions_mapc                 C   s  t |tk rtdt dtd|dd \}}}}}|d? }|d? d@ }	|d	? d@ }
|d
@ }|dkr8tdt |td	|  k rFtd| |d? |d@ |||d}t}td|D ]}|jtd||d  |d	7 }qZ|
rt ||d	 k r{tdtd||\}}|d	9 }|d	7 }t ||| k rtd||||  }||7 }||||_	|	r|d }|r|t || krtd||_
|||  |_|S ||d  |_|S )NzRTP packet length is less than r   !BBHLLr   r   rn   rl   r   r   r   r   zRTP packet has invalid versionzRTP packet has truncated CSRCro   rA   )r   r   r   r   rj   r<   z3RTP packet has truncated extension profile / lengthr   z(RTP packet has truncated extension valuer   z$RTP packet padding length is invalid)ra   RTP_HEADER_LENGTHrp   r   rq   r   rJ   r   rI   rM   r   r_   )r   rg   r   v_p_x_ccm_ptr   r   rj   r   r   	extensionccpacketrr   ir8   extension_lengthr9   padding_lenr)   r)   r*   r     sX   

zRtpPacket.parsec                 C   s   | | j\}}t|}| jdk}td| jd> |d> B |d> B t| jB | jd> | j	B | j
| j| j}| jD ]	}|td|7 }q6|rR|td|t|d	? 7 }||7 }|| j7 }|rk|t| jd
 7 }|t| jg7 }|S )Nr   r   rn   rl   r   ro   r<   r   r   r   )rN   rM   boolr   r   r   ra   r   r   r   r   r   rj   r_   osurandomrO   )r0   r   r8   r9   has_extensionr   rg   r   r)   r)   r*   	serialize  s6   


zRtpPacket.serialize)r   r   r   r   r   r   )r$   r%   r&   r'   rO   r1   strr   r   r+   r   r   r)   r)   r)   r*   r     sL    
8r   rtxr   rj   c              	   C   sJ   t || jtd| jdd d | j|| jdd d}| j|_| j|_|S )z>
    Recover initial packet from a retransmission packet.
    rB   r   r   Nr   r   r   r   rj   r_   )r   r   r   r_   r   r   rM   )r   r   rj   r   r)   r)   r*   
unwrap_rtx  s   r  r   r   c              	   C   s:   t || j|| j|td| j| j d}| j|_| j|_|S )z<
    Create a retransmission packet from a lost packet.
    rB   r   )r   r   r   r   r   r_   r   rM   )r   r   r   rj   r   r)   r)   r*   wrap_rtx  s   r  )Er   r   r   dataclassesr   r   r   r   r   typingr   r   r	   avr
   rtcrtpparametersr   RTP_HISTORY_SIZErq   FORBIDDEN_PAYLOAD_TYPESDYNAMIC_PAYLOAD_TYPESr   r   rS   rU   r   r   r   r   r   r   RTCP_RTPFB_NACKRTCP_PSFB_PLIRTCP_PSFB_SLIRTCP_PSFB_RPSIRTCP_PSFB_FIRRTCP_PSFB_APPr   r+   r'   rW   rO   rY   r]   rb   r   rk   rP   rt   r   rx   rz   rC   rL   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r)   r)   r)   r*   <module>   s    


e
&0',)
/r