o
    diuR                     @   s  d dl Z d dlZd dlZd dlmZ d dlmZmZmZ ddl	m
Z
 ddlmZmZ ddlmZmZ ddlmZmZmZmZmZ dd	lmZ g d
ZddddZedd e D Zg dZG dd dZG dd de j Z!G dd de j"Z#dede!j$fdede!j$fdede!j$fdede!j%fdede!j%fded e!j&fd!ed"e!j'fd!ed#e!j(fd$ed"e!j)fg	Z*d%e+d&efd'd(Z,d)ed&e+fd*d+Z-d%e+d&e.e/e+ e/e/e+  f fd,d-Z0d%e+d&e+fd.d/Z1d0e+d&e+fd1d2Z2d%e+d&efd3d4Z3d5ed&e+fd6d7Z4d8e+d&e.e+ee+ f fd9d:Z5d;e+d&e.e!e#f fd<d=Z6eG d>d? d?Z7e+fd@e/e7 dAe+dBee8e+ e8e9 f d&dfdCdDZ:eG dEdF dFZ;g dGZ<G dHdI dIZ=G dJdK dKZ>dS )L    N)	dataclass)AnyOptionalUnion   )rtp)RTCDtlsFingerprintRTCDtlsParameters)RTCIceCandidateRTCIceParameters)ParametersDictRTCRtcpFeedbackRTCRtpCodecParametersRTCRtpHeaderExtensionParametersRTCRtpParameters)RTCSctpCapabilities)inactivesendonlyrecvonlysendrecvactpassactivepassive)autoclientserverc                 C   s   g | ]\}}||fqS  r   ).0kvr   r   >/home/ubuntu/.local/lib/python3.10/site-packages/aiortc/sdp.py
<listcomp>   s    r!   )aptzmax-frzmax-fsmaxplaybackrateminptimestereouseinbandfecc                   @   sF   e Zd ZdeddfddZdedefddZded	edefd
dZdS )
BitPatternr   returnNc                 C   s"   |  d| | _|  d|| _d S )Nx1)_bytemaskstring_mask_masked_valueselfr   r   r   r    __init__$   s   zBitPattern.__init__c                 C   s   || j @ | jkS N)r,   r-   r.   r   r   r    matches(   s   zBitPattern.matchescsc                 C   s   |d |kd> |d |kd> B |d |kd> B |d |kd> B |d |kd> B |d |kd> B |d |kd> B |d |kd> B S )	Nr      r                  r   )r/   r3   r4   r   r   r    r+   +   s    zBitPattern._bytemaskstring)	__name__
__module____qualname__strr0   intboolr2   r+   r   r   r   r    r'   #   s    r'   c                   @   s$   e Zd ZdZdZdZdZdZdZdS )H264Profiler   r   r7   r9   r:   r8   N)	r;   r<   r=   PROFILE_CONSTRAINED_BASELINEPROFILE_BASELINEPROFILE_MAINPROFILE_CONSTRAINED_HIGHPROFILE_HIGHPROFILE_PREDICTIVE_HIGH_444r   r   r   r    rA   8   s    rA   c                   @   sP   e 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dZdZdS )	H264Level
                               (   )   *   2   3   4   N)r;   r<   r=   LEVEL1_BLEVEL1LEVEL1_1LEVEL1_2LEVEL1_3LEVEL2LEVEL2_1LEVEL2_2LEVEL3LEVEL3_1LEVEL3_2LEVEL4LEVEL4_1LEVEL4_2LEVEL5LEVEL5_1LEVEL5_2r   r   r   r    rH   A   s$    rH   B   x1xx0000M   1xxx0000X   11xx0000x0xx000010xx00000x0x0000d   0000000000001100   sdpr(   c              	   C   s   |   }t|dksJ tt|d |d |d t|d t|d |d |d d	}tdt|d dD ]-}|| d
krE||d  |_q5|| dkrUt||d  |_q5|| dkrb||d  |_q5|S )N   r   r   r:   r8   r9   r7   r5   )	component
foundationipportpriorityprotocoltyperaddrrporttcptype)splitlenr
   r?   rangerelatedAddressrelatedPorttcpType)rx   bits	candidateir   r   r    candidate_from_sdpb   s(   



r   r   c                 C   s   | j  d| j d| j d| j d| j d| j d| j }| jd ur*|d| j 7 }| jd ur7|d| j 7 }| j	d urD|d| j	 7 }|S )N z typ z raddr z rport z	 tcptype )
r{   rz   r   r~   r|   r}   r   r   r   r   )r   rx   r   r   r    candidate_to_sdp{   s"   


r   c                 C   sX   g }g }|   D ]}|dr||g qt|r"|d | q|| q||fS )Nm=rI   )
splitlines
startswithappendr   )rx   sessionmedialiner   r   r    
grouplines   s   
r   c                 C   s   t d| }|s
J |dS )Nz^IN (IP4|IP6) ([^ ]+)$r7   )rematchgroup)rx   mr   r   r    ipaddress_from_sdp   s   
r   addrc                 C   s   t | j}d| d|  S )NzIN IPr   )	ipaddress
ip_addressversion)r   r   r   r   r    ipaddress_to_sdp   s   r   c                 C   sX   i }|  dD ]"}d|v r%| dd\}}|tv r t|||< q|||< qd ||< q|S )N;=r   )r   FMTP_INT_PARAMETERSr?   )rx   
parametersparamr   r   r   r   r    parameters_from_sdp   s   

r   r   c                 C   sH   g }|   D ]\}}|d ur|| d|  q|| qd|S )Nr   r   )itemsr   join)r   paramsparam_kparam_vr   r   r    parameters_to_sdp   s   
r   r   c                 C   s<   d| v r| dd   dd}|d |d fS | dd  d fS )N:r7   r   r   )r   )r   r   r   r   r    
parse_attr   s   r   profile_strc                 C   s   t | trtd| tjstdt| dd d}t| dd d}t| dd d}|tjkr<|d@ r8tj	ntj}nt|}t
D ]\}}}||krV||rV||f  S qBtd| d	| )
Nz[0-9a-f]{6}z)Expected a 6 character hexadecimal stringr:   r6      r7   r   zUnrecognized profile_iop = z, profile_idc = )
isinstancer>   r   r   I
ValueErrorr?   rH   r\   rZ   H264_PROFILE_PATTERNSr2   )r   	level_idcprofile_iopprofile_idclevelidcpatternprofiler   r   r    parse_h264_profile_level_id   s"   
r   c                   @   s8   e Zd ZU eed< eeeef  ed< defddZdS )GroupDescriptionsemanticr   r(   c                 C   s   | j  ddtt| j S )Nr   )r   r   mapr>   r   r/   r   r   r    __str__   s   zGroupDescription.__str__N)	r;   r<   r=   r>   __annotations__listr   r?   r   r   r   r   r    r      s   
 r   destvaluer   c              
   C   s<   |  }|r| t|d tt||dd  d d S d S )Nr   r   )r   r   )r   r   r   r   r   )r   r   r   r   r   r   r    parse_group   s   ,r   c                   @   sV   e Zd ZU eed< dZee ed< dZee ed< dZ	ee ed< dZ
ee ed< dS )SsrcDescriptionssrcNcnamemsidmslabellabel)r;   r<   r=   r?   r   r   r   r>   r   r   r   r   r   r   r    r      s   
 r   )r   r   r   r   c                
   @   s<   e Zd Zdedededee ddf
ddZdefd	d
ZdS )MediaDescriptionkindr}   r   fmtr(   Nc                 C   s   || _ || _d | _|| _d | _d | _d | _d | _d| _g | _	g | _
|| _t | _d | _i | _d | _d | _d | _g | _d| _d | _d S )NF)r   r}   hostr   	directionr   	rtcp_port	rtcp_hostrtcp_muxr   
ssrc_groupr   r   r   sctpCapabilitiessctpmap	sctp_portdtlsiceice_candidatesice_candidates_completeice_options)r/   r   r}   r   r   r   r   r    r0      s*   
zMediaDescription.__init__c                 C   sf  g }| d| j d| j d| j ddtt| j  | jd ur-| dt	| j  | j
d ur;| d| j
  | jjD ]}| d|j d|j  q?| jjr]| d| jj  | jri| d| j  | jd urd| j }| jd ur|dt	| j 7 }| | | jr| d	 | jD ]
}| d
|  q| jD ]}tD ]}t||}|d ur| d|j d| d|  qq| jjD ]B}| d|j d|  |jD ]}	|	j}
|	jr|
d|	j 7 }
| d|j d|
  qt|j}|r| d|j d|  q| j  D ]\}}| d| d|  q| j!d ur-| d| j!  | j"d ur=| d| j"j#  | j$D ]}| dt%|  q@| j&rV| d | j'j(d urg| d| j'j(  | j'j)d urx| d| j'j)  | j*d ur| d| j*  | j+r| j+j,D ]}| d|j- d|j.  q| dt/| j+j0   d|d S )Nr   r   c=a=z	a=extmap:za=mid:za=msid:za=rtcp:z
a=rtcp-muxza=ssrc-group:za=ssrc:r   z	a=rtpmap:z
a=rtcp-fb:za=fmtp:z
a=sctpmap:za=sctp-port:za=max-message-size:za=candidate:za=end-of-candidatesza=ice-ufrag:z
a=ice-pwd:za=ice-options:za=fingerprint:za=setup:
)1r   r   r}   r   r   r   r>   r   r   r   r   r   headerExtensionsidurimuxIdr   r   r   r   r   r   SSRC_INFO_ATTRSgetattrcodecspayloadTypertcpFeedbackr   	parameterr   r   r   r   r   r   maxMessageSizer   r   r   r   usernameFragmentpasswordr   r   fingerprints	algorithmr   DTLS_ROLE_SETUProle)r/   linesheaderr   r   	ssrc_info	ssrc_attr
ssrc_valuecodecfeedbackr   r   r   r   r   fingerprintr   r   r    r     s   .












zMediaDescription.__str__)	r;   r<   r=   r>   r?   r   r   r0   r   r   r   r   r    r      s    "$r   c                   @   sP   e Zd ZdddZededd fddZdedee fd	d
Z	defddZ
dS )SessionDescriptionr(   Nc                 C   s:   d| _ d | _d| _d| _d | _g | _g | _g | _d | _d S )Nr   -z0 0)	r   originnametimer   r   msid_semanticr   r   r   r   r   r    r0   n  s   
zSessionDescription.__init__rx   c           %   
      s  d  g }d }d}d }d }d }dt dtf fdd}t|\}	}
|  }|	D ]}|dr7t | dd  |_q$|drF| dd  |_q$|d	rU| dd  |_q$|d
rdt|dd  |_	q$|drs| dd  |_
q$|drt|\}}|dkr| \}}|t||d q$|dkrd}q$|dkr|}q$|dkr|}q$|dkr|}q$|dkrt|j| q$|dkrt|j| q$|dkrt| }q$|
D ]}td|d }|sJ |d}|d }d }|dv rdd |D }|D ]}|dkr|dk sJ |tjvsJ qt|t |d|d|p!|d  t|d d  |d! _t|||d" _| _|j  |dd  D ]}|d
rZt|dd   _	qF|dr
t|\}}|d#kru jt| qF|d$krd _ qF|d%kr| \}}d&|v r|d&\}}t!t ||d'} jj"| qF|dkr| \}} jj#t||d qF|dkr| _qF|dkr| j_$qF|dkr| j_%qF|d(krt&t |d) _'qF|d*kr| j_(qF|d+kr| _)qF|d,kr%|d-d}t |d  _*t+|dkr#t|d  _,qF|d.kr/d _-qF|dkr<t|  j_.qF|t/v rF| _0qF|d/kr|d-d\}}|d&} j1d0krot+|dkrlt |d }nd}nd }t j1d& |d  |t |d t |d1} jj2| qF|d2kr|d-d\}}|t3 |t |< qF|d3krt | _4qF|d4krt j5|t d5 qF|d6kr
|d-d\} }!t | |!d7d\}"}#zt6fd8d9 j7D }$W n t8y   t9d:}$ j7|$ Y nw |"t:v r
t;|$|"|# qF jj.d u rd  _|dd  D ]_}|drzt|\}}|d;krD|d-d\}}|t |}t<||_=q|d<krz|d-d} jj2D ]&}|d d=t>|j?fv rx|j@tA|d t+|dkrs|d nd d> qSqq|S )?NFptr(   c                    s   t t fddjjS )Nc                    s
   | j  kS r1   )r   )r)   r  r   r    <lambda>  s   
 z>SessionDescription.parse.<locals>.find_codec.<locals>.<lambda>)nextfilterr   r   r  )current_mediar  r    
find_codec  s   z,SessionDescription.parse.<locals>.find_codecv=r7   o=s=r   t=r   r   )r   r   zice-liteTzice-optionszice-pwdz	ice-ufragr   zmsid-semanticsetupz#^m=([^ ]+) ([0-9]+) ([A-Z/]+) (.+)$r   r   r:   )audiovideoc                 S      g | ]}t |qS r   )r?   r   r)   r   r   r    r!         z,SessionDescription.parse.<locals>.<listcomp>   r9   )r   r}   r   r   )r   r   )iceLiter   r   r   zend-of-candidatesextmap/)r   r   zmax-message-size)r   midr   rtcpr   zrtcp-muxrtpmapr  )mimeTypechannels	clockRater   r   z	sctp-portz
ssrc-group)r   r   r   c                 3   s    | ]
}|j  kr|V  qd S r1   r   r  r  r   r    	<genexpr>  s    z+SessionDescription.parse.<locals>.<genexpr>r  fmtpzrtcp-fb*)r   r   )Br?   r   r   r   stripr   r   r   r   r   r   r   r   r   r   r   r   r   DTLS_SETUP_ROLEr   r   r   FORBIDDEN_PAYLOAD_TYPESr   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
DIRECTIONSr   r   r   r   r   r   r  r   StopIterationr   r   setattrr   r   r>   r   r   r   )%clsrx   dtls_fingerprints	dtls_roleice_liter   ice_passwordice_usernameFragmentr  session_linesmedia_groupsr   r   attrr   r   r   media_linesr   r   r   fmt_intr  ext_idext_uriext_direction	extensionr   	format_idformat_descr  r   ssrc_str	ssrc_descr   r   r   r   )r  r   r    parsey  s\  









































zSessionDescription.parser   c                 C   sj   || j v sJ |jd ur3d|jv r3|j }| jD ]}|jdkr2|d |jv s,d|jv r2|d   S qd S )Nr   WMSr   r  r   )r   r   r   r   r   r   )r/   r   r   r   r   r   r    webrtc_track_id6  s   


z"SessionDescription.webrtc_track_idc                 C   s   d| j  d| j d| j g}| jd ur!|dt| j g7 }|d| j g7 }tdd | jD r9|dg7 }| jD ]
}|d	| g7 }q<| j	D ]
}|d
| g7 }qJd
|d d
dd | jD  S )Nr  r	  r
  r   r  c                 s   s    | ]}|j jV  qd S r1   )r   r  r   r   r   r   r    r  F  s    z-SessionDescription.__str__.<locals>.<genexpr>z
a=ice-liteza=group:za=msid-semantic:r    c                 S   r  r   )r>   r<  r   r   r    r!   L  r  z.SessionDescription.__str__.<locals>.<listcomp>)r   r   r   r   r   r   anyr   r   r   r   )r/   r   r   r   r   r    r   A  s   "



$zSessionDescription.__str__)r(   N)r;   r<   r=   r0   classmethodr>   r9  r   r   r;  r   r   r   r   r    r   m  s    
 =r   )?enumr   r   dataclassesr   typingr   r   r   r=  r   rtcdtlstransportr   r	   rtcicetransportr
   r   rtcrtpparametersr   r   r   r   r   rtcsctptransportr   r#  r   dictr   r!  r   r'   EnumrA   IntEnumrH   rB   rC   rD   rF   rE   rG   r   r>   r   r   tupler   r   r   r   r   r   r   r   r   r   r?   r   r   r   r   r   r   r   r   r    <module>   sj    	&
	
u