o
    2j)                     @   s   d dl Z d dlm  m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mZ d dlmZ d dlmZmZmZ d dlmZmZ e je jG d	d
 d
eZe je je jddde j e! de j"fddZ#e je jddde$de j"fddZ%dS )    N)	err_check)VideoFormatComponentget_pix_fmtget_video_format)
VideoFrame)PyBUF_WRITABLEPyBuffer_FillInfo)	Py_buffer)PyCapsule_GetPointerPyCapsule_IsValidPyCapsule_New)freemallocc                   @   s   e Zd ZdedejfddZejdejfddZ	e
dd	 Zejdejfd
dZdeje dejfddZdd ZdddedB fddZdS )
VideoPlaneframeindexc                 C   s   |j }|jjrttjtj |jjj}t	|j
|jj|jj}|dkr3|jdkr3d| _d| _d| _d S t|jjD ]}|jj| j|krSt||}|j| _|j| _ nq9td| d|t| jjj| j | j | _d S )N   pal8   i   zcould not find plane z of )formatptrhw_frames_ctxcythoncastpointerlibAVHWFramesContextdatar   	sw_formatwidthheightnamebuffer_sizerangenb_componentscompplaner   RuntimeErrorabsr   linesizer   )selfr   r   fmt
frames_ctxi	component r/   I/var/www/html/whisper/venv/lib/python3.10/site-packages/av/video/plane.py	__cinit__   s,   
 zVideoPlane.__cinit__returnc                 C   s   | j S )N)r"   r*   r/   r/   r0   _buffer_size6   s   zVideoPlane._buffer_sizec                 C   s   | j jj| j S )zN
        Bytes per horizontal line in this plane.

        :type: int
        )r   r   r)   r   r3   r/   r/   r0   	line_size:   s   zVideoPlane.line_sizec                 C   s   | j jjrdS dS )NFT)r   r   r   r3   r/   r/   r0   _buffer_writableC   s   
zVideoPlane._buffer_writableviewflagsc                 C   s   | j jjr	td|t@ r|  std|  }| j jj| j	 }|dk r5| j
}ttj||d |  }t|| ||  d| d S )NzyHardware frame planes do not support the Python buffer protocol. Use DLPack (__dlpack__) or download to a software frame.zbuffer is not writabler   r   )r   r   r   	TypeErrorr   r6   
ValueError_buffer_ptrr)   r   r    r   r   p_charr   r4   )r*   r7   r8   r   r5   r    r/   r/   r0   __getbuffer__I   s   
zVideoPlane.__getbuffer__c                 C   sB   | j jjrttj| j jjtdkrt	dt
| j jfS tdfS )N   cuda4DLPack export is only implemented for CUDA hw framesr   )r   r   r   r   r   r   AVPixelFormatr   r   NotImplementedErrorkCuda
_device_idkCPUr3   r/   r/   r0   __dlpack_device__Z   s   
zVideoPlane.__dlpack_device__N)streamrF   c                C   s  | j jjd tjkrtd| j jjrEttj	| j jj
tdkr%td|d ur-tdttjtj | j jjj}|j}t}| j j}nttj	| j jj
}t}d}| j}|dk r^tdtd}td}td	}	ttj\}
}}tt\}}}tt\}}}||krd
}d}| jdkrd}
| j jj}| j jj}|}d
}nx| jd
krd}
| j jjd }| j jjd }d}|}d}d
}nZtd||ks||	krd}d}|| rtd| jdkrd}
| j jj}| j jj}|| }d
}n)| jd
krd}
| j jjd }| j jjd }d}|| }d}d
}ntdtdt }|tjkr'tdtt|| j j ttjt t |
t!t }ttjt t |
t!t }|tjks]|tjkr}|tjkrgt"| |tjkrqt"| t#t$| td|
dkr||d< ||d
< ||d< ||d
< n||d< ||d
< ||d< ||d< ||d
< ||d< ttjtj% t dt!tj% }|tjkrt"| t"| t#t$| tdttj%||d< ttj%||d
< ttj%||d< ttjt& t t!t&}|tjkrt"| t"| t"| t#t$| tdttj%|j| j |j'_||j'_(||j'_)|
|j'_*t+d
|d
d|j'_,||j'_-||j'_.d|j'_/ttj%||_0t1|_2zt3ttj%|dt4}W |S  t5yr   t1|  w )Nr   zBDLPack export requires a refcounted AVFrame (frame.buf[0] is NULL)r>   r?   ziCUDA stream synchronization is not supported. Pass stream=None and synchronize before calling __dlpack__.z4negative linesize is not supported for DLPack exports   nv12s   p010les   p016ler            zinvalid plane index for NV12   z linesize is not aligned to dtypez!invalid plane index for P010/P016z'unsupported sw_format for DLPack exportzav_frame_alloc() failedzmalloc() failed)codebitslanes   dltensor)6r   r   bufr   NULLr9   r   r   r   r@   r   r   rA   r   r   r   r   rB   rC   rD   r5   declareintint64_tr   r    r   r:   av_frame_allocMemoryErrorr   av_frame_refr   sizeofr   av_frame_freeaddressp_voidDLManagedTensor	dl_tensordevice_type	device_idndim
DLDataTypedtypeshapestridesbyte_offsetmanager_ctx_dlpack_managed_tensor_deleterdeleterr   _dlpack_capsule_destructor	Exception)r*   rF   r,   sw_fmtr]   r^   r5   nv12p010lep016ler_   rL   itemsizes0s1s2st0st1st2	frame_refrb   rc   ctxmanagedcapsuler/   r/   r0   
__dlpack__e   s  










	zVideoPlane.__dlpack__)__name__
__module____qualname__r   r   rR   r1   cfuncsize_tr4   propertyr5   bintr6   r   r	   r=   rE   ry   r/   r/   r/   r0   r      s    
r   F)checkrw   r2   c                 C   s   | t jkrd S t t jt j | j}|t jkr\t t jtj |d }t t jt |d }t t jt |d }|t jkrFt	t 
| |t jkrOt| |t jkrXt| t| t|  d S )Nr   r   rH   )r   rP   r   r   rZ   re   r   AVFramerS   rX   rY   r   )rw   rv   ru   rb   rc   r/   r/   r0   rf     s   




rf   rx   c                 C   sB   t | drttjt t| d}|tjkr|| d S d S d S )NrN   )r   r   r   r   r[   r
   rP   rg   )rx   rw   r/   r/   r0   rh   (  s   

rh   )&r   cython.cimports.libavcimportslibavr   cython.cimports.av.errorr   cython.cimports.av.video.formatr   r   r   cython.cimports.av.video.framer   cython.cimports.cpythonr   r   cython.cimports.cpython.bufferr	   !cython.cimports.cpython.pycapsuler
   r   r   cython.cimports.libc.stdlibr   r   finalcclassPlaner   r}   nogil	exceptvalr   r[   voidrf   objectrh   r/   r/   r/   r0   <module>   s0     z

