o
    ]i3                     @   s   d dl 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 d dlmZ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G dd de	Zejdejej dejdefddZejG dd de	ZdS )    )IteratorLiteralget_argsN)libav)Buffer)
bytesource)	err_check)opaque_container)avrational_to_fractionto_avrational)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r5    r=   =/home/ubuntu/.local/lib/python3.10/site-packages/av/packet.pypacket_sidedata_type_to_literal;   s   r?   c                 C   s   t t| S r7   )r   r8   indexr<   r=   r=   r>   !packet_sidedata_type_from_literal?   s   rA   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_typer6   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`
        )rA   _packet_sidedata_from_packetptr)rC   rD   r5   r=   r=   r>   from_packetE   s   zPacketSideData.from_packetr5   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)r5   r9   nogilr:   p_ucharlib	av_mallocdataNULLMemoryErrorrH   )selfr5   rH   r=   r=   r>   	__cinit__T   s   
zPacketSideData.__cinit__c                 C   >   t j tt | j W d    d S 1 sw   Y  d S r7   )r9   rJ   rL   av_freepaddressrN   rQ   r=   r=   r>   __dealloc___      "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   NrI   )rH   rN   r9   rJ   r:   rK   rL   rM   rO   rP   r   av_packet_add_side_datarF   r5   r   )rQ   rC   rY   rN   resr=   r=   r>   	to_packetc   s    
	

zPacketSideData.to_packetc                 C   s
   t | jS )zH
        The type of this packet side data.

        :type: str
        )r?   r5   rV   r=   r=   r>   rD      s   
zPacketSideData.data_typec                 C   s   t | jS )zT
        The description of this packet side data type.

        :type: str
        )rL   av_packet_side_data_namer5   rV   r=   r=   r>   	data_desc   s   zPacketSideData.data_descc                 C      | j S )zQ
        The size in bytes of this packet side data.

        :type: int
        rH   rV   r=   r=   r>   	data_size   s   zPacketSideData.data_sizec                 C   r_   r7   r`   rV   r=   r=   r>   _buffer_size      zPacketSideData._buffer_sizec                 C   r_   r7   )rN   rV   r=   r=   r>   _buffer_ptr   rc   zPacketSideData._buffer_ptrc                 C   s   dS )NTr=   rV   r=   r=   r>   _buffer_writable   s   zPacketSideData._buffer_writablec                 C   s   | j tjkS )zK
        True if this object holds side data.

        :type: bool
        )rN   r9   rO   rV   r=   r=   r>   __bool__   s   zPacketSideData.__bool__NF)__name__
__module____qualname__staticmethodPacketr8   rB   rG   rL   AVPacketSideDataTyper9   size_trR   rW   bintr\   propertystrrD   r^   r;   ra   cfuncrb   p_voidrd   re   boolrf   r=   r=   r=   r>   rB   C   s&    		rB   rC   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   )r9   rJ   rL   av_packet_side_data_get	side_dataside_data_elemsrO   rB   rH   r   rN   )rC   r5   c_ptrfoundsdatar=   r=   r>   rE      s"   


rE   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 )Hrl   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 r7   )r9   rJ   rL   av_packet_allocrF   )rQ   inputr=   r=   r>   rR      s   "zPacket.__cinit__c                 C   rS   r7   )r9   rJ   rL   av_packet_freerU   rF   rV   r=   r=   r>   rW      rX   zPacket.__dealloc__c                 C   sb   d}d }|d u r
d S t |tr|}nt|}|j}|r$tt| j| |d ur/| | d S d S ru   )	
isinstancer;   r   lengthr   rL   av_new_packetrF   update)rQ   r}   rH   sourcer=   r=   r>   __init__   s   
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>)	_streamr@   	__class__rh   dtsptsrF   rH   idrQ   streamr=   r=   r>   __repr__   s   zPacket.__repr__r6   c                 C      | j jS r7   rF   rH   rV   r=   r=   r>   rb         zPacket._buffer_sizec                 C   r   r7   )rF   rN   rV   r=   r=   r>   rd      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
ValueErrorrF   	time_basedenrL   av_packet_rescale_ts)rQ   r   r=   r=   r>   _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   decoderV   r=   r=   r>   r   
  s   zPacket.decodec                 C   r   r7   )rF   stream_indexrV   r=   r=   r>   r     r   zPacket.stream_indexc                 C   r_   )zC
        The :class:`Stream` this packet was demuxed from.
        )r   rV   r=   r=   r>   r     s   zPacket.streamr   c                 C   s   || _ |jj| j_d S r7   )r   rF   r@   r   r   r=   r=   r>   r     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
   r9   rU   rF   r   rV   r=   r=   r>   r   !  s   zPacket.time_basec                 C   s   t |t| jj d S r7   )r   r9   rU   rF   r   )rQ   valuer=   r=   r>   r   *  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)rF   r   rL   AV_NOPTS_VALUErV   r=   r=   r>   r   .     	z
Packet.ptsc                 C   "   |d u rt j| j_d S || j_d S r7   )rL   r   rF   r   rQ   vr=   r=   r>   r   :     c                 C   r   )zo
        The decoding timestamp in :attr:`time_base` units for this packet.

        :type: int | None
        N)rF   r   rL   r   rV   r=   r=   r>   r   A  s   z
Packet.dtsc                 C   r   r7   )rL   r   rF   r   r   r=   r=   r>   r   K  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)rF   posrV   r=   r=   r>   r   R  s   	z
Packet.posc                 C   r   )zN
        The size in bytes of this packet's data.

        :type: int
        r   rV   r=   r=   r>   rH   ^  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)rF   durationrL   r   rV   r=   r=   r>   r   g  r   zPacket.durationc                 C   r   r7   )rL   r   rF   r   r   r=   r=   r>   r   s  r   c                 C      t | jjtj@ S r7   )rt   rF   flagsrL   AV_PKT_FLAG_KEYrV   r=   r=   r>   is_keyframez     zPacket.is_keyframec                 C   2   |r| j  jtjO  _d S | j  jtj M  _d S r7   )rF   r   rL   r   r   r=   r=   r>   r   ~     c                 C   r   r7   )rt   rF   r   rL   AV_PKT_FLAG_CORRUPTrV   r=   r=   r>   
is_corrupt  r   zPacket.is_corruptc                 C   r   r7   )rF   r   rL   r   r   r=   r=   r>   r     r   c                 C   r   r7   )rt   rF   r   rL   AV_PKT_FLAG_DISCARDrV   r=   r=   r>   
is_discard  r   zPacket.is_discardc                 C   r   r7   )rt   rF   r   rL   AV_PKT_FLAG_TRUSTEDrV   r=   r=   r>   
is_trusted  r   zPacket.is_trustedc                 C   r   r7   )rt   rF   r   rL   AV_PKT_FLAG_DISPOSABLErV   r=   r=   r>   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 r7   )	rF   
opaque_refr9   rO   r	   getr:   p_charrN   rV   r=   r=   r>   opaque  s
   zPacket.opaquec                 C   s2   t t| jj |d u rd S t|| j_d S r7   )rL   av_buffer_unrefr9   rU   rF   r   r	   addr   r=   r=   r>   r     s   r5   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
        )rA   rL   rv   rF   rw   rx   r9   rO   )rQ   r5   dtype2r=   r=   r>   has_sidedata  s   zPacket.has_sidedatac                 C   s   t | |S )a  get a copy of the side data

        :param dtype: side data type (:method:`~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`
        )rB   rG   )rQ   r5   r=   r=   r>   get_sidedata  s   	zPacket.get_sidedataFsidedatarY   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\   )rQ   r   rY   r=   r=   r>   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)rangerF   rx   rE   rw   type)rQ   ir=   r=   r>   iter_sidedata  s   zPacket.iter_sidedatar7   rg   ),rh   ri   rj   __doc__rR   rW   r   r   r9   rr   rn   rb   rs   rd   rL   
AVRationalr   r   rp   r   r   setterStreamr   r   r   r   rH   r   r   r   r   r   r   r   rq   rt   r   rB   r   ro   r   r   r   r=   r=   r=   r>   rl      sz    








	














rl   ) typingr   r   r   r9   cython.cimportsr   rL   cython.cimports.av.bufferr   cython.cimports.av.bytesourcer   cython.cimports.av.errorr   cython.cimports.av.opaquer	   cython.cimports.av.utilsr
   r   cython.cimports.libc.stringr   r8   rm   r?   rA   cclassrB   rr   pointerAVPacketrE   rl   r=   r=   r=   r>   <module>   s4    ,n
