o
    di)                     @   sl  d dl Z d dlZd dl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mZm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mZ ddlmZmZ e e!Z"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*d	Z+d	Z,e*e, Z-edddZ.edZ/dee/ dee0e/e/f  fddZ1G dd dZ2G dd deZ3G d d! d!eZ4d"e5de5fd#d$Z6dS )%    N)IterableIteratorSequence)tee)packunpack_from)OptionalTypeTypeVarcast)Frame)Packet)VideoCodecContext   )JitterFrame)VIDEO_TIME_BASEconvert_timebase   )DecoderEncoderi@B i  i-    i        DESCRIPTOR_TH264PayloadDescriptor)boundTiterablereturnc                 C   s    t | \}}t|d  t||S N)r   nextzip)r   ab r$   F/home/ubuntu/.local/lib/python3.10/site-packages/aiortc/codecs/h264.pypairwise'   s   

r&   c                	   @   sR   e Zd Zdedd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   first_fragmentr   Nc                 C   s
   || _ d S r   r'   )selfr'   r$   r$   r%   __init__.   s   
zH264PayloadDescriptor.__init__c                 C   s   d| j  dS )NzH264PayloadDescriptor(FF=)r(   r)   r$   r$   r%   __repr__1   s   zH264PayloadDescriptor.__repr__clsdatac                 C   s  t  }t|dk rtd|d d@ }|d d@ }t}|tddv r3t g d| }| d	d
}||fS |tkro|| d@ }t|| d@ }|d7 }|r^t ||B g}	|t g d7 }||	7 }|||d  7 }| |d
}||fS |tkrg }
|t|k rt||t k rtdt	d||d }|t7 }|

| ||7 }t||k rtd|t|k s{|

t|t  t|
D ]\}}|t8 }|t g d7 }|||| 7 }q| d	d
}||fS td| d)Nr   zNAL unit is too shortr         r   r   )r   r   r   r   Tr(      z STAP-A length field is truncated!HzSTAP-A data is truncatedzNAL unit type z is not supported)byteslen
ValueErrorNAL_HEADER_SIZErangeNAL_TYPE_FU_AboolNAL_TYPE_STAP_ALENGTH_FIELD_SIZEr   appendr&   )r.   r/   outputnal_typef_nriposobjoriginal_nal_typer'   original_nal_headeroffsets	nalu_sizestartendr$   r$   r%   parse4   sR   
&


zH264PayloadDescriptor.parse)__name__
__module____qualname__r:   r*   strr-   classmethodr	   r   r4   tuplerI   r$   r$   r$   r%   r   -   s
    (c                   @   s,   e Zd ZdddZdedee fddZdS )	H264Decoderr   Nc                 C   s   t jdd| _d S )Nh264r)avCodecContextcreatecodecr,   r$   r$   r%   r*   l   s   zH264Decoder.__init__encoded_framec              
   C   sp   zt |j}|j|_t|_ttt	 | j
|W S  t jy7 } ztdt|  g W  Y d }~S d }~ww )Nz2H264Decoder() failed to decode, skipping package: )rS   r   r/   	timestampptsr   	time_baser   listr   rV   decodeFFmpegErrorloggerwarningrM   )r)   rW   packeter$   r$   r%   r\   o   s   
zH264Decoder.decoder   N)rJ   rK   rL   r*   r   r[   r   r\   r$   r$   r$   r%   rP   k   s    
rP   c                	   @   s  e Zd ZdddZededee fddZededee de	eef fd	d
Z
ededee fddZedee dee fddZdejdedee f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dS )!H264Encoderr   Nc                 C   s   d| _ d | _d | _t| _d S )N    )buffer_data
buffer_ptsrV   DEFAULT_BITRATE_H264Encoder__target_bitrater,   r$   r$   r%   r*   }   s   
zH264Encoder.__init__r/   c                 C   s&  t t }t| t }t|| }|| }|| }| d d@ }| d d@ }|tB }t||dB g}	t||g}
t||dB g}|}g }t}|t| k r|dkrd|d8 }| ||| d  }||d 7 }n| |||  }||7 }|t| krx|	}|||  |
}|t| k sK|t| ksJ d|S )Nr   r1   r0   @   r2   r   zincorrect fragment data)	
PACKET_MAXFU_A_HEADER_SIZEr5   r7   mathceilr9   r4   r=   )r/   available_sizepayload_sizenum_packetsnum_larger_packetspackage_sizer@   nalfu_indicatorfu_header_endfu_header_middlefu_header_start	fu_headerpackagesoffsetpayloadr$   r$   r%   _packetize_fu_a   s8   zH264Encoder._packetize_fu_apackages_iteratorc                 C   s  d}t t }t| d d@ B }t }zU| }t||kr]|dk r]||d d@ O }|d d@ }|d@ |k r8|d@ |B }|tt| 8 }|d7 }|tdt|| 7 }t|}t||kr]|dk s|dkret|}W n tyq   d }Y nw |dkrz| |fS t|g| |fS )	Nr   r1   	   r2   `      r   r3   )	rj   STAP_A_HEADER_SIZEr;   r4   r5   r<   r   r    StopIteration)r/   r}   counterrn   stap_headerr{   nalunrir$   r$   r%   _packetize_stap_a   s2   zH264Encoder._packetize_stap_abufc                 c   s    d}	 |  d|}|dkrd S |d7 }|}|  d|}|dkr+| |t|  V  d S | |d  dkr=| ||d  V  n| || V  q)Nr   Ts        r   )findr5   )r   i	nal_startr$   r$   r%   _split_bitstream   s    zH264Encoder._split_bitstreamry   c                 C   sl   g }t |}t|d }|d ur4t|tkr#|| | t|d }n| ||\}}|| |d us|S r   )iterr    r5   rj   extendr|   r   r=   )r.   ry   packetized_packagesr}   package
packetizedr$   r$   r%   
_packetize   s   

zH264Encoder._packetizeframeforce_keyframec                 c   s*   | j r*|j| j jks!|j| j jks!t| j| j j | j j dkr*d| _d | _d | _ |r4tj	j
jj|_ntj	j
jj|_| j d u rvtjdd| _ |j| j _|j| j _| j| j _d| j _ttd| j _tdt| j _ddd	| j _d
| j _d}| j |D ]}|t|7 }q~|r| |E d H  d S d S )Ng?rd   libx264wyuv420pr   31zerolatency)leveltuneBaseline)rV   widthheightabstarget_bitratebit_ratere   rf   rS   videor   PictureTypeI	pict_typeNONErT   rU   pix_fmt	fractionsFractionMAX_FRAME_RATE	frameraterZ   optionsprofileencoder4   r   )r)   r   r   data_to_sendr   r$   r$   r%   _encode_frame   s>   




zH264Encoder._encode_frameFc                 C   s:   t |tjsJ | ||}t|j|jt}| ||fS r   )	
isinstancerS   
VideoFramer   r   rY   rZ   r   r   )r)   r   r   ry   rX   r$   r$   r%   r   "  s   zH264Encoder.encoder`   c                 C   s<   t |tjsJ | t|}t|j|jt}| 	||fS r   )
r   rS   r   r   r4   r   rY   rZ   r   r   )r)   r`   ry   rX   r$   r$   r%   r   *  s   zH264Encoder.packc                 C   s   | j S )z4
        Target bitrate in bits per second.
        )rh   r,   r$   r$   r%   r   0  s   zH264Encoder.target_bitratebitratec                 C   s   t tt|t}|| _d S r   )maxMIN_BITRATEminMAX_BITRATErh   )r)   r   r$   r$   r%   r   7  s   
rb   )F)rJ   rK   rL   r*   staticmethodr4   r[   r|   r   rO   r   r   rN   r   r   rS   r   r:   r   r   intr   r   r   propertyr   setterr$   r$   r$   r%   rc   |   sH    
&
!
+
rc   r{   c                 C   s   t | \}}|S r   )r   rI   )r{   
descriptorr/   r$   r$   r%   h264_depayload=  s   r   )7r   loggingrl   collections.abcr   r   r   	itertoolsr   structr   r   typingr   r	   r
   r   rS   av.framer   	av.packetr   av.video.codeccontextr   jitterbufferr   mediastreamsr   r   baser   r   	getLoggerrJ   r^   rg   r   r   r   rj   r9   r;   r7   rk   r<   r   r   r   rO   r&   r   rP   rc   r4   r   r$   r$   r$   r%   <module>   sD    
"> B