o
    ]i                     @   s   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 d dlmZmZ e jG d	d
 d
eZdS )    N)libav)
ByteSource
bytesource)	err_check)Packet)SubtitleProxySubtitleSet)PyBytes_FromStringAndSize)memcpystrlenc                   @   s   e Zd ZededB fddZejdedB ddfddZdddZd	ede	fd
dZ
ejde	dB fddZejde	fddZdS )SubtitleCodecContextreturnNc                 C   s:   | j jtjks| j jdkrdS tttj| j j| j jS )zAGet the subtitle header data (ASS/SSA format for text subtitles).r   N)ptrsubtitle_headercythonNULLsubtitle_header_sizer	   castp_charself r   M/home/ubuntu/.local/lib/python3.10/site-packages/av/subtitles/codeccontext.pyr      s   z$SubtitleCodecContext.subtitle_headerdatac                 C   s   |du rt t| jj d| j_n.t|}ttj	t 
| jj|jt j | j_| jjs2tdt| jj|j|j |j| j_d| _dS )zSet the subtitle header data.Nr   zCannot allocate subtitle_headerT)libav_freepr   addressr   r   r   r   r   p_uchar
av_realloclengthAV_INPUT_BUFFER_PADDING_SIZEMemoryErrorr
   subtitle_header_set)r   r   sourcer   r   r   r      s    



c                 C   s,   | j r| jrtt| j j d S d S d S )N)r   r"   r   r   r   r   r   r   r   r   r   __dealloc__0   s   z SubtitleCodecContext.__dealloc__subtitlec                 C   s6  | j jstd| jdd d}t|jjjD ]#}|jjj| }|j	t
jkr-|t|j	7 }|jt
jkr:|t|j7 }q|d7 }t
t
jt|}|t
jkrRtdt| j||t
|jj}|dk rnt| t|d t|}t|jj|| t| |jjj|j_|jjj|j_|jjj|jjj |j_|S )z
        Encode a SubtitleSet into a Packet.

        Args:
            subtitle: The SubtitleSet to encode

        Returns:
            A Packet containing the encoded subtitle data
        z Cannot encode with unknown codecFstrictr   i   z)Failed to allocate subtitle encode bufferzavcodec_encode_subtitle())codecr   
ValueErroropenrangeproxystruct	num_rectsrectsassr   r   r   textr   r   r   	av_mallocr!   avcodec_encode_subtitler   av_freer   r   r
   r   ptsdtsend_display_timestart_display_timeduration)r   r%   buf_sizeirectbufretpacketr   r   r   encode_subtitle4   sD   




z$SubtitleCodecContext.encode_subtitler?   c                 C   sP   |d u rt dt }d}tt| jt|jt||j |r&t	|S g S )Nzpacket cannot be Noner   )
RuntimeErrorr   r   r   avcodec_decode_subtitle2r   r   r   r-   r   r   r?   r,   	got_framer   r   r   _send_packet_and_recvj   s   
	z*SubtitleCodecContext._send_packet_and_recvc                 C   s\   | j jstd| jdd t }d}tt| jt	|j
t	||j |r,t|S dS )z<
        Returns SubtitleSet if you really need it.
        zcannot decode unknown codecFr&   r   N)r(   r   r)   r*   r   r   r   rB   r   r   r-   r   rC   r   r   r   decode2   s    
	zSubtitleCodecContext.decode2)r   N)__name__
__module____qualname__propertybytesr   setterr$   r   r   r@   r   cfuncrE   ccallrF   r   r   r   r   r      s    
6r   )r   cython.cimportsr   r   cython.cimports.av.bytesourcer   r   cython.cimports.av.errorr   cython.cimports.av.packetr   %cython.cimports.av.subtitles.subtitler   r   cython.cimports.cpython.bytesr	   cython.cimports.libc.stringr
   r   cclassCodecContextr   r   r   r   r   <module>   s    