o
    dif%                     @   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	m
Z
 d dlZd dlmZ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 ddlmZmZ e eZdZdZ dZ!dZ"dZ#e	dddZ$de%de%de%fddZ&G dd dZ'G dd deZ(G dd deZ)de*de*fd d!Z+dS )"    N)packunpack_from)OptionalTypeTypeVarcast)CodecContext
VideoFrame)Frame)Packet)VideoCodecContext   )JitterFrame)VIDEO_TIME_BASEconvert_timebase   )DecoderEncoderi  i i`    i  DESCRIPTOR_TVpxPayloadDescriptor)boundpixelscpusreturnc                 C   s@   | dkr
|dkr
dS | dkr|dkrdS | dkr|dkrdS dS )	Ni     i        i  r   r    )r   r   r   r   E/home/ubuntu/.local/lib/python3.10/site-packages/aiortc/codecs/vpx.pynumber_of_threads   s   r    c                   @   s   e Zd Z				ddededee dee deeeef  dee ddfd	d
ZdefddZde	fddZ
edee dedeeef fddZdS )r   Npartition_startpartition_id
picture_id	tl0picidxtidkeyidxr   c                 C   s(   || _ || _|| _|| _|| _|| _d S Nr!   r"   r#   r$   r%   r&   )selfr!   r"   r#   r$   r%   r&   r   r   r   __init__)   s   	
zVpxPayloadDescriptor.__init__c                 C   s:  | j d> | jB }d}| jd ur|dO }| jd ur|dO }| jd ur%|dO }| jd ur.|dO }|rtdd|B |}| jd urU| jdk rK|td| j7 }n
|td	d
| jB 7 }| jd urb|td| j7 }| jd usl| jd urd}| jd ur|| jd d> | jd d> B O }| jd ur|| jO }|td|7 }|S td|}|S )N   r      @          z!BBz!B!H   r   r      )r!   r"   r#   r$   r%   r&   r   )r)   octet	ext_octetdatat_kr   r   r   	__bytes__9   s8   







 


zVpxPayloadDescriptor.__bytes__c                 C   s   d| j  d| j d| j dS )NzVpxPayloadDescriptor(S=z, PID=z	, pic_id=)r!   r"   r#   r)   r   r   r   __repr__[   s   
zVpxPayloadDescriptor.__repr__clsr5   c                 C   s  t |dk r
td|d }|d? }|d? d@ }|d@ }d }d }d }d }	d}
|rt ||
d k r4td||
 }|d? d@ }|d? d@ }|d	? d@ }|d? d@ }|
d7 }
|rt ||
d k rbtd
||
 d@ rt ||
d k rttdtd||
d d@ }|
d7 }
n||
 }|
d7 }
|rt ||
d k rtd||
 }|
d7 }
|s|rt ||
d k rtd||
 }|r|d? d@ |d	? d@ f}|r|d@ }	|
d7 }
| ||||||	d}|||
d  fS )Nr   zVPX descriptor is too shortr      r+      z*VPX descriptor has truncated extended bitsr   r2   z&VPX descriptor has truncated PictureIDr,   r   z+VPX descriptor has truncated long PictureIDr0     z&VPX descriptor has truncated TL0PICIDXz VPX descriptor has truncated T/Kr      r(   )len
ValueErrorr   )r<   r5   r3   extendedr!   r"   r#   r$   r%   r&   posext_Iext_Lext_Text_Kr6   objr   r   r   parsea   sj   
zVpxPayloadDescriptor.parse)NNNN)__name__
__module____qualname__intr   tupler*   bytesr7   strr;   classmethodr   r   rJ   r   r   r   r   r   (   s0    
"(c                   @   s,   e Zd ZdddZdedee fddZdS )	
Vp8Decoderr   Nc                 C   s   t dd| _d S )Nlibvpxr)r   createcodecr:   r   r   r   r*      s   zVp8Decoder.__init__encoded_framec              
   C   sn   zt |j}|j|_t|_ttt | j	
|W S  tjy6 } ztdt|  g W  Y d }~S d }~ww )Nz1Vp8Decoder() failed to decode, skipping package: )r   r5   	timestampptsr   	time_baser   listr
   rW   decodeavFFmpegErrorloggerwarningrQ   )r)   rX   packeter   r   r   r]      s   
zVp8Decoder.decoder   N)rK   rL   rM   r*   r   r\   r
   r]   r   r   r   r   rS      s    
rS   c                	   @   s   e Zd ZdddZ	ddededeee e	f fdd	Z
d
edeee e	f fddZede	fddZejde	ddfddZedede	dee fddZdS )
Vp8Encoderr   Nc                 C   s   d | _ tdd| _t| _d S )Nr   r?   )rW   randomrandintr#   DEFAULT_BITRATE_Vp8Encoder__target_bitrater:   r   r   r   r*      s   
zVp8Encoder.__init__Fframeforce_keyframec                 C   sz  t |tsJ |jjdkr|jdd}| jr6|j| jjks3|j| jjks3t| j	| jj
 | jj
 dkr6d | _|r?tjjjj|_| jd u rtjdd| _|j| j_|j| j_| j	| j_
d| j_d| j_d| j_d| j_t| jd	d
dt| j	t| j	dddddd| j_t|j|j t | j_d}| j|D ]}|t|7 }q|  || j!}t"|j#|j$t%}| j!d d | _!||fS )Nyuv420p)formatg?rT   wi  r   8   z-6realtime04151100)bufsizezcpu-useddeadlinezlag-in-framesminratemaxrateznoise-sensitivityzovershoot-pct
partitionszstatic-threshzundershoot-pct    r   r1   )&
isinstancer	   rm   namereformatrW   widthheightabstarget_bitratebit_rater^   videorj   PictureTypeI	pict_typer   rV   pix_fmtgop_sizeqminqmaxrQ   ri   optionsr    multiprocessing	cpu_countthread_countencoderP   
_packetizer#   r   rZ   r[   r   )r)   rj   rk   data_to_sendpackagepayloadsrY   r   r   r   r      sV   




zVp8Encoder.encoderb   c                 C   s:   |  t|| j}t|j|jt}| jd d | _||fS )Nr   r1   )r   rP   r#   r   rZ   r[   r   )r)   rb   r   rY   r   r   r   r      s   zVp8Encoder.packc                 C   s   | j S )z4
        Target bitrate in bits per second.
        )ri   r:   r   r   r   r      s   zVp8Encoder.target_bitratebitratec                 C   s   t tt|t}|| _d S r'   )maxMIN_BITRATEminMAX_BITRATEri   )r)   r   r   r   r   r     s   
bufferr#   c           	      C   sx   g }t dd|d}t|}d}||k r:t|}t|| tt| }||||||    d|_||7 }||k s|S )Nr   r   r9   )r   rA   rP   r   
PACKET_MAXappendr!   )	r<   r   r#   r   descrlengthrD   descr_bytessizer   r   r   r     s   zVp8Encoder._packetizerd   )F)rK   rL   rM   r*   r
   boolrO   r\   rP   rN   r   r   r   propertyr   setterrR   r   r   r   r   r   re      s"    

; re   payloadc                 C   s   t | \}}|S r'   )r   rJ   )r   
descriptorr5   r   r   r   vp8_depayload  s   r   ),loggingr   rf   structr   r   typingr   r   r   r   r^   r   r	   av.framer
   	av.packetr   av.video.codeccontextr   jitterbufferr   mediastreamsr   r   baser   r   	getLoggerrK   r`   rh   r   r   MAX_FRAME_RATEr   r   rN   r    r   rS   re   rP   r   r   r   r   r   <module>   s4    
 d