o
    2j6                  	   @   sV  d dl mZmZm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 d dlmZmZ d dlmZmZ d d	lmZ d d
lmZ ed ZdejdefddZdedejfddZejejG dd de	Z ej!dej"ej# dejde fddZ$ej!ej%ej&dddej'dej"e dej(fddZ)ejejG dd de	Z*dS )    )IteratorLiteralget_argsN)libav)Buffer
ByteSource
bytesource)	err_check)opaque_container)avrational_to_fractionto_avrational)	Py_DECREF	Py_INCREF)uint8_t)memcpy)(palettenew_extradataparam_changeh263_mb_inforeplay_gaindisplay_matrix	stereo_3daudio_service_typequality_statsfallback_trackcpb_propertiesskip_samplesjp_dual_monostrings_metadatasubtitle_positionmatroska_block_additionalwebvtt_identifierwebvtt_settingsmetadata_updatempegts_stream_idmastering_display_metadata	sphericalcontent_light_levela53_ccencryption_init_infoencryption_infoafdprfticc_profile	dovi_confs12m_timecodedynamic_hdr10_plusiamf_mix_gain_paramiamf_info_paramiamf_recon_gain_info_paramambient_viewing_environmentframe_croppinglcevc3d_reference_displaysrtcp_srdtypereturnc                 C   s   t ttt|  S N)r   PktSideDataTcythoncastintr9    rA   D/var/www/html/whisper/venv/lib/python3.10/site-packages/av/packet.pypacket_sidedata_type_to_literal<   s   rC   c                 C   s   t t| S r;   )r   r<   indexr@   rA   rA   rB   !packet_sidedata_type_from_literal@   s   rE   c                   @   s   e Zd ZedededefddZdej	de
jfdd	Zd
d Zddede
jfddZedefddZedefddZedefddZe
jde
jfddZe
jde
jfddZe
jde
jfddZdefddZdS ) PacketSideDatapacket	data_typer:   c                 C   s   t |}t| j|S )a  create new PacketSideData by copying an existing packet's side data

        :param packet: Source packet
        :type packet: :class:`~av.packet.Packet`
        :param data_type: side data type
        :return: newly created copy of the side data if the side data of the
                 requested type is found in the packet, else an empty object
        :rtype: :class:`~av.packet.PacketSideData`
        )rE   _packet_sidedata_from_packetptr)rG   rH   r9   rA   rA   rB   from_packetG   s   zPacketSideData.from_packetr9   sizec                 C   sn   || _ tj$ |rttjt|| _| jtjkrt	dntj| _W d    n1 s-w   Y  || _
d S )NFailed to allocate memory)r9   r=   nogilr>   p_ucharlib	av_mallocdataNULLMemoryErrorrL   )selfr9   rL   rA   rA   rB   	__cinit__V   s   
zPacketSideData.__cinit__c                 C   >   t j tt | j W d    d S 1 sw   Y  d S r;   )r=   rN   rP   av_freepaddressrR   rU   rA   rA   rB   __dealloc__a      "zPacketSideData.__dealloc__Fmovec                 C   s   | j dkrdS | j}tj1 |s,ttjt| j }|tjkr$t	dt
|| j| j  t|j| j|| j }W d   n1 sAw   Y  t| |rUtj| _d| _ dS dS )a  copy or move side data to the specified packet

        :param packet: Target packet
        :type packet: :class:`~av.packet.Packet`
        :param move: True to move the data from this object to the packet,
                     defaults to False.
        :type move: bool
        r   NrM   )rL   rR   r=   rN   r>   rO   rP   rQ   rS   rT   r   av_packet_add_side_datarJ   r9   r	   )rU   rG   r]   rR   resrA   rA   rB   	to_packete   s    
	

zPacketSideData.to_packetc                 C   s
   t | jS )zH
        The type of this packet side data.

        :type: str
        )rC   r9   rZ   rA   rA   rB   rH      s   
zPacketSideData.data_typec                 C   s   t | jS )zT
        The description of this packet side data type.

        :type: str
        )rP   av_packet_side_data_namer9   rZ   rA   rA   rB   	data_desc   s   zPacketSideData.data_descc                 C      | j S )zQ
        The size in bytes of this packet side data.

        :type: int
        rL   rZ   rA   rA   rB   	data_size   s   zPacketSideData.data_sizec                 C   rc   r;   rd   rZ   rA   rA   rB   _buffer_size      zPacketSideData._buffer_sizec                 C   rc   r;   )rR   rZ   rA   rA   rB   _buffer_ptr   rg   zPacketSideData._buffer_ptrc                 C   s   dS )NTrA   rZ   rA   rA   rB   _buffer_writable   s   zPacketSideData._buffer_writablec                 C   s   | j tjkS )zK
        True if this object holds side data.

        :type: bool
        )rR   r=   rS   rZ   rA   rA   rB   __bool__   s   zPacketSideData.__bool__NF)__name__
__module____qualname__staticmethodPacketr<   rF   rK   rP   AVPacketSideDataTyper=   size_trV   r[   bintr`   propertystrrH   rb   r?   re   cfuncrf   p_voidrh   ri   boolrj   rA   rA   rA   rB   rF   D   s&    		rF   rG   c                 C   s   t j t| j| j|}|t jk}W d    n1 sw   Y  t||r(|jnd}t j |rBt	|j
|j
|j W d    |S W d    |S 1 sMw   Y  |S )Nr   )r=   rN   rP   av_packet_side_data_get	side_dataside_data_elemsrS   rF   rL   r   rR   )rG   r9   c_ptrfoundsdatarA   rA   rB   rI      s"   


rI   F)checkopaquerR   c                 C   sJ   | t jkr#t j tt t|  W d    d S 1 sw   Y  d S d S r;   )r=   rS   gilr   r>   object)r   rR   rA   rA   rB   _python_free   s
   
"r   c                   @   s  e Zd ZdZdFddZdd ZdFddZd	d
 Zej	dej
fddZej	dejfddZej	dejfddZdd Zedd Zedd ZejdefddZedd Zejdd Zedd Zejd d Zed!d" Zejd#d" Zed$d% Zed&d' Zed(d) Zejd*d) Zed+d, Zejd-d, Zed.d/ Zejd0d/ Zed1d2 Zed3d4 Z ed5d6 Z!ed7d8 Z"e"jd9d8 Z"d:e#de$fd;d<Z%d:e#de&fd=d>Z'dGd@e&dAej(fdBdCZ)de*e& fdDdEZ+dS )Hrp   zA packet of encoded data within a :class:`~av.format.Stream`.

    This may, or may not include a complete object within a stream.
    :meth:`decode` must be called to extract encoded data.
    Nc                 C   s6   t j t | _W d    d S 1 sw   Y  d S r;   )r=   rN   rP   av_packet_allocrJ   )rU   inputrA   rA   rB   rV      s   "zPacket.__cinit__c                 C   rW   r;   )r=   rN   rP   av_packet_freerY   rJ   rZ   rA   rA   rB   r[      r\   zPacket.__dealloc__c              	   C   s   d}d }|d u r
d S t |tr |}|rtt| j| d S d S t|}|j}|rXt| t	|j|t
ttj|d}|tjkrIt| td|| j_|j| j_|| j_d S d S )Nr   zCould not allocate AVBufferRef)
isinstancer?   r	   rP   av_new_packetrJ   r   lengthr   av_buffer_creater   r=   r>   rw   rS   r   rT   bufrR   rL   )rU   r   rL   sourcer   rA   rA   rB   __init__   s6   


zPacket.__init__c                 C   sN   | j r| j jnd}d| jj d| d| j d| j d| jj dt| dd	S )
Nr   zav.z of #z, dts=z, pts=z; z bytes at 0xx>)	_streamrD   	__class__rl   dtsptsrJ   rL   idrU   streamrA   rA   rB   __repr__  s   zPacket.__repr__r:   c                 C      | j jS r;   rJ   rL   rZ   rA   rA   rB   rf        zPacket._buffer_sizec                 C   r   r;   )rJ   rR   rZ   rA   rA   rB   rh     r   zPacket._buffer_ptrdstc                 C   sh   |j std| jjj s|| j_d S | jjj |j kr$| jjj|jkr$d S t| j| jj| || j_d S )NzCannot rebase to zero time.)num
ValueErrorrJ   	time_basedenrP   av_packet_rescale_ts)rU   r   rA   rA   rB   _rebase_time  s   
 zPacket._rebase_timec                 C   s   | j | S )z
        Send the packet's data to the decoder and return a list of
        :class:`.AudioFrame`, :class:`.VideoFrame` or :class:`.SubtitleSet`.
        )r   decoderZ   rA   rA   rB   r   #  s   zPacket.decodec                 C   r   r;   )rJ   stream_indexrZ   rA   rA   rB   r   *  r   zPacket.stream_indexc                 C   rc   )zC
        The :class:`Stream` this packet was demuxed from.
        )r   rZ   rA   rA   rB   r   .  s   zPacket.streamr   c                 C   s   || _ |jj| j_d S r;   )r   rJ   rD   r   r   rA   rA   rB   r   5  s   c                 C   s   t t| jjS )z
        The unit of time (in fractional seconds) in which timestamps are expressed.

        :type: fractions.Fraction
        )r   r=   rY   rJ   r   rZ   rA   rA   rB   r   :  s   zPacket.time_basec                 C   s   t |t| jj d S r;   )r   r=   rY   rJ   r   )rU   valuerA   rA   rB   r   C  s   c                 C      | j jtjkr| j jS dS )z
        The presentation timestamp in :attr:`time_base` units for this packet.

        This is the time at which the packet should be shown to the user.

        :type: int | None
        N)rJ   r   rP   AV_NOPTS_VALUErZ   rA   rA   rB   r   G     	z
Packet.ptsc                 C   "   |d u rt j| j_d S || j_d S r;   )rP   r   rJ   r   rU   vrA   rA   rB   r   S     c                 C   r   )zo
        The decoding timestamp in :attr:`time_base` units for this packet.

        :type: int | None
        N)rJ   r   rP   r   rZ   rA   rA   rB   r   Z  s   z
Packet.dtsc                 C   r   r;   )rP   r   rJ   r   r   rA   rA   rB   r   d  r   c                 C   s   | j jdkr
| j jS dS )z
        The byte position of this packet within the :class:`.Stream`.

        Returns `None` if it is not known.

        :type: int | None
        N)rJ   posrZ   rA   rA   rB   r   k  s   	z
Packet.posc                 C   r   )zN
        The size in bytes of this packet's data.

        :type: int
        r   rZ   rA   rA   rB   rL   w  s   zPacket.sizec                 C   r   )z
        The duration in :attr:`time_base` units for this packet.

        Returns `None` if it is not known.

        :type: int
        N)rJ   durationrP   r   rZ   rA   rA   rB   r     r   zPacket.durationc                 C   r   r;   )rP   r   rJ   r   r   rA   rA   rB   r     r   c                 C      t | jjtj@ S r;   )rx   rJ   flagsrP   AV_PKT_FLAG_KEYrZ   rA   rA   rB   is_keyframe     zPacket.is_keyframec                 C   2   |r| j  jtjO  _d S | j  jtj M  _d S r;   )rJ   r   rP   r   r   rA   rA   rB   r        c                 C   r   r;   )rx   rJ   r   rP   AV_PKT_FLAG_CORRUPTrZ   rA   rA   rB   
is_corrupt  r   zPacket.is_corruptc                 C   r   r;   )rJ   r   rP   r   r   rA   rA   rB   r     r   c                 C   r   r;   )rx   rJ   r   rP   AV_PKT_FLAG_DISCARDrZ   rA   rA   rB   
is_discard  r   zPacket.is_discardc                 C   r   r;   )rx   rJ   r   rP   AV_PKT_FLAG_TRUSTEDrZ   rA   rA   rB   
is_trusted  r   zPacket.is_trustedc                 C   r   r;   )rx   rJ   r   rP   AV_PKT_FLAG_DISPOSABLErZ   rA   rA   rB   is_disposable  r   zPacket.is_disposablec                 C   s,   | j jtjurtttj| j jjS d S r;   )	rJ   
opaque_refr=   rS   r
   getr>   p_charrR   rZ   rA   rA   rB   r     s
   zPacket.opaquec                 C   s2   t t| jj |d u rd S t|| j_d S r;   )rP   av_buffer_unrefr=   rY   rJ   r   r
   addr   rA   rA   rB   r     s   r9   c                 C   s$   t |}t| jj| jj|tjkS )zwTrue if this packet has the specified side data

        :param dtype: side data type
        :type dtype: str
        )rE   rP   ry   rJ   rz   r{   r=   rS   )rU   r9   dtype2rA   rA   rB   has_sidedata  s   zPacket.has_sidedatac                 C   s   t | |S )a  get a copy of the side data

        :param dtype: side data type (:meth:`~av.packet.PacketSideData.sidedata_types` for the full list of options)
        :type dtype: str
        :return: newly created copy of the side data if the side data of the
                 requested type is found in the packet, else an empty object
        :rtype: :class:`~av.packet.PacketSideData`
        )rF   rK   )rU   r9   rA   rA   rB   get_sidedata  s   	zPacket.get_sidedataFsidedatar]   c                 C   s   | | | dS )a
  copy or move side data to this packet

        :param sidedata: Source packet side data
        :type sidedata: :class:`~av.packet.PacketSideData`
        :param move: If True, move the data from `sidedata` object, defaults to False
        :type move: bool
        N)r`   )rU   r   r]   rA   rA   rB   set_sidedata  s   zPacket.set_sidedatac                 c   s0    t | jjD ]}t| j| jj| jV  qdS )zjiterate over side data of this packet.

        :yield: :class:`~av.packet.PacketSideData` object
        N)rangerJ   r{   rI   rz   type)rU   irA   rA   rB   iter_sidedata  s   zPacket.iter_sidedatar;   rk   ),rl   rm   rn   __doc__rV   r[   r   r   r=   rv   rr   rf   rw   rh   rP   
AVRationalr   r   rt   r   r   setterStreamr   r   r   r   rL   r   r   r   r   r   r   r   ru   rx   r   rF   r   rs   r   r   r   rA   rA   rA   rB   rp      sz    

 






	














rp   )+typingr   r   r   r=   cython.cimportsr   rP   cython.cimports.av.bufferr   r   r   cython.cimports.av.errorr	   cython.cimports.av.opaquer
   cython.cimports.av.utilsr   r   cython.cimports.cpython.refr   r   cython.cimports.libc.stdintr   cython.cimports.libc.stringr   r<   rq   rC   rE   finalcclassrF   rv   pointerAVPacketrI   rN   	exceptvalrw   voidr   rp   rA   rA   rA   rB   <module>   sN    ,n

	