
    Hui                     r    d dl Z d dlmZ d dlmZ d dlmZmZ d dlm	Z	 e j                   G d d             Zy)    N)	err_check)opaque_container)avrational_to_fractionto_avrational)SideDataContainerc                   6   e Zd ZdZd Zd Zd Zej                  dde	dej                  fd       Zej                  d        Zej                  d	ej                  fd
       Zed        Zej$                  d        Zed        Zej$                  d        Zed        Zej$                  d        Zed        Zed        Zej$                  d        Zed        Zed        Zej$                  d        Zed        Zd Zed        Zej$                  d        Zy)Framez
    Base class for audio and video frames.

    See also :class:`~av.audio.frame.AudioFrame` and :class:`~av.video.frame.VideoFrame`.
    c                     t         j                  5  t        j                         | _        d d d        y # 1 sw Y   y xY wN)cythonnogillibav_frame_allocptr)selfargskwargss      :/opt/pipecat/venv/lib/python3.12/site-packages/av/frame.py	__cinit__zFrame.__cinit__   s.    \\ 	,))+DH	, 	, 	,s   4=c                     t         j                  5  t        j                  t        j                  | j
                               d d d        y # 1 sw Y   y xY wr   )r   r   r   av_frame_freeaddressr   r   s    r   __dealloc__zFrame.__dealloc__   s9    \\ 	8fnnTXX67	8 	8 	8s   3AAc                 j    d| j                   j                   d| j                   dt        |       ddS )Nz<av.z pts=z at 0xx>)	__class____name__ptsidr   s    r   __repr__zFrame.__repr__   s2    dnn--.eDHH:VBtHQ<qQQ    sourcedata_layoutc                    |j                   | _         t        j                  | j                  |j                         |r|j                  j                  | j                  _        |j                  j
                  | j                  _        |j                  j                  | j                  _        |j                  j                  | j                  _        y y r   )
_time_baser   av_frame_copy_propsr   formatwidthheight	ch_layout)r   r$   r%   s      r   _copy_internal_attributeszFrame._copy_internal_attributes   s     !++&**5$jj//DHHO#ZZ--DHHN$jj//DHHO!'!5!5DHH r#   c                      y r    r   s    r   _init_user_attributeszFrame._init_user_attributes(   s    r#   dstc                    |j                   st        d      | j                  j                   s|| _        y | j                  j                   |j                   k(  r$| j                  j                  |j                  k(  ry | j                  j
                  t        j                  k7  rDt        j                  | j                  j
                  | j                  |      | j                  _        | j                  j                  dk7  rDt        j                  | j                  j                  | j                  |      | j                  _	        || _        y )NzCannot rebase to zero time.r   )
num
ValueErrorr'   denr   r    r   AV_NOPTS_VALUEav_rescale_qduration)r   r1   s     r   _rebase_timezFrame._rebase_time,   s    ww:;;""!DO??#'')doo.A.ASWW.L88<<3---++DHHLL$//3ODHHL88! # 0 0!!4??C!DHH r#   c                 ~    | j                   j                  t        j                  k(  ry| j                   j                  S )aL  
        The decoding timestamp copied from the :class:`~av.packet.Packet` that triggered returning this frame in :attr:`time_base` units.

        (if frame threading isn't used) This is also the Presentation time of this frame calculated from only :attr:`.Packet.dts` values without pts values.

        :type: int | None
        N)r   pkt_dtsr   r6   r   s    r   dtsz	Frame.dtsB   s/     88s111xxr#   c                 j    | t         j                  | j                  _        y || j                  _        y r   )r   r6   r   r;   r   values     r   r<   z	Frame.dtsO   s%    ="11DHH$DHHr#   c                 ~    | j                   j                  t        j                  k(  ry| j                   j                  S )z
        The presentation timestamp in :attr:`time_base` units for this frame.

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

        :type: int | None
        N)r   r    r   r6   r   s    r   r    z	Frame.ptsV   s+     88<<3---xx||r#   c                 j    | t         j                  | j                  _        y || j                  _        y r   )r   r6   r   r    r>   s     r   r    z	Frame.ptsc   s#    =--DHHL DHHLr#   c                 .    | j                   j                  S )zZ
        The duration of the frame in :attr:`time_base` units

        :type: int
        r   r8   r   s    r   r8   zFrame.durationj   s     xx   r#   c                 &    || j                   _        y r   rC   r>   s     r   r8   zFrame.durations   s    !r#   c                     | j                   j                  t        j                  k(  ryt	        | j                   j                        | j
                  j                  z  | j
                  j                  z  S )z
        The presentation time in seconds for this frame.

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

        :type: float | None
        N)r   r    r   r6   floatr'   r3   r5   r   s    r   timez
Frame.timew   sN     88<<3---TXX\\"T__%8%884??;N;NNNr#   c                     | j                   j                  r(t        t        j                  | j                               S y)z
        The unit of time (in fractional seconds) in which timestamps are expressed.

        :type: fractions.Fraction | None
        N)r'   r3   r   r   r   r   s    r   	time_basezFrame.time_base   s.     ??)&..*IJJ r#   c                 V    t        |t        j                  | j                               y r   )r   r   r   r'   r>   s     r   rI   zFrame.time_base   s    eV^^DOO<=r#   c                     | j                   j                  dk7  xs0 t        | j                   j                  t        j
                  z        S )z=
        Is this frame corrupt?

        :type: bool
        r   )r   decode_error_flagsboolflagsr   AV_FRAME_FLAG_CORRUPTr   s    r   
is_corruptzFrame.is_corrupt   s=     xx**a/ 
4HHNNS6664
 	
r#   c                 b    t        | j                  j                  t        j                  z        S )zPIs this frame a key frame?

        Wraps :ffmpeg:`AVFrame.key_frame`.

        )rM   r   rN   r   AV_FRAME_FLAG_KEYr   s    r   	key_framezFrame.key_frame   s"     DHHNNS%:%::;;r#   c                     |r.| j                   xj                  t        j                  z  c_        y | j                   xj                  t        j                   z  c_        y r   )r   rN   r   rR   r   vs     r   rS   zFrame.key_frame   s:     HHNNc333NHHNNs4444Nr#   c                 R    | j                   t        |       | _         | j                   S r   )
_side_datar   r   s    r   	side_datazFrame.side_data   s"    ??"/5DOr#   c                 X    t         j                  | j                        }t        |       y)z
        Ensures that the frame data is writable. Copy the data to new buffer if it is not.
        This is a wrapper around :ffmpeg:`av_frame_make_writable`.
        N)r   av_frame_make_writabler   r   )r   rets     r   make_writablezFrame.make_writable   s    
 44TXX>#r#   c                     | j                   j                  t        j                  urUt	        j
                  t        j                  t        j                  | j                   j                  j                              S y r   )	r   
opaque_refr   NULLr   getcastp_chardatar   s    r   opaquezFrame.opaque   sR    88fkk1#''FMM488+>+>+C+CD  2r#   c                     t         j                  t        j                  | j                  j
                               |%t        j                  |      | j                  _        y y r   )r   av_buffer_unrefr   r   r   r_   r   addrU   s     r   re   zFrame.opaque   sD    FNN488+>+>?@="2"6"6q"9DHH r#   N)T)r   
__module____qualname____doc__r   r   r"   r   cfuncr	   bintr-   r0   r   
AVRationalr9   propertyr<   setterr    r8   rG   rI   rP   rS   rY   r]   re   r/   r#   r   r	   r	   	   s   ,8R \\	6 	6FKK 	6 	6 \\  \\  * 
  
  	ZZ% % 
 
 	ZZ! ! ! ! __" " 
O 
O K K > > 
 
 < < 5 5  
   ]]: :r#   r	   )r   cython.cimports.av.errorr   cython.cimports.av.opaquer   cython.cimports.av.utilsr   r   av.sidedata.sidedatar   cclassr	   r/   r#   r   <module>rv      s4     . 6 J 2 ~: ~: ~:r#   