o
    OZhN                     @   s^   d Z ddlZddlZddlZddlZddlZdd Zdd ZG dd dZG d	d
 d
eZ	dS )zpygame.camera backend that uses OpenCV.

Uses the cv2 module opencv for python.
See https://pypi.org/project/opencv-python/ for wheels version.

python3 -m pip install opencv-python --user
    Nc                  C   s^   d} g }d}d}||k r-t | }| d s|d7 }n||  |  | d7 } ||k s|S ) r         )cv2VideoCapturereadappendrelease)indexZ
device_idxfailedZmax_gapsZvcap r   D/var/www/auris/lib/python3.10/site-packages/pygame/_camera_opencv.pylist_cameras   s   


r   c                  C   sn   dd l } ddlm} | jdd| j| jd \}}d }g }||dD ]}|dkr1||j	 |j	}q%|S )Nr   )ElementTreez%system_profiler -xml SPCameraDataTypeT)shellstdoutstderrz./array/dict/array/dict/*_name)

subprocessZ	xml.etreer   PopenPIPEcommunicateZ
fromstringZiterfindr   text)r   r   Zflout_Z	last_textZcamerasnoder   r   r   list_cameras_darwin'   s"   r   c                   @   sb   e Zd ZdddZdd Zd	d
 Zdd Zdd ZdddZdd Z	dd Z
dddZdd ZdS )Camerar   i  i  RGBNc                 C   st   || _ || _|| _|durtjdkrtj| _|dkrtj| _n|dkr(tj	| _n|dkr1tj
| _ntdd| _dS )z
        api_preference - cv2.CAP_DSHOW cv2.CAP_V4L2 cv2.CAP_MSMF and others

        # See https://docs.opencv.org/3.4/d4/d15/group__videoio__flags__base.html
        Nwin32r   ZYUVZHSVzNot a supported modeF)_device_index_sizeapi_preferencesysplatformr   Z	CAP_DSHOWZCOLOR_BGR2RGB_fmtZCOLOR_BGR2YUVZCOLOR_BGR2HSV
ValueError_open)selfdevicesizemoder"   r   r   r   __init__?   s   



zCamera.__init__c                 C   s   | j rd S t| j| j| _| j std| jtj	| j
d  | jtj| j
d  | jtj	}| jtj}t|t|f| _
d| _d| _d| _d| jtj | _d| _d| _ d S )NzCould not open camera.r   r   FT)r'   r   r   r    r"   _camZisOpenedr&   setZCAP_PROP_FRAME_WIDTHr!   ZCAP_PROP_FRAME_HEIGHTgetint_flipx_flipyZ_brightnessZCAP_PROP_FPS
_frametime_last_frame_time)r(   whr   r   r   start[   s    

zCamera.startc                 C   s$   | j r| j  d | _d| _ d S d S )NF)r'   r-   r	   r(   r   r   r   stopt   s
   

zCamera.stopc                 C   s   | j stdd S )NzCamera must be started)r'   pygameerrorr8   r   r   r   _check_openz   s   
zCamera._check_openc                 C   s   |    | jS N)r<   r!   r8   r   r   r   get_size~   s   zCamera.get_sizec                 C   sL   |    |d urt|| _|d urt|| _|d ur"| jtj| |  S r=   )	r<   boolr1   r2   r-   r.   r   CAP_PROP_BRIGHTNESSget_controls)r(   ZhflipZvflipZ
brightnessr   r   r   set_controls   s   

zCamera.set_controlsc                 C   s    |    | j| j| jtjfS r=   )r<   r1   r2   r-   r/   r   r@   r8   r   r   r   rA      s   zCamera.get_controlsc                 C   s(   |    t }|| j | jkrdS dS )NTF)r<   timer4   r3   )r(   current_timer   r   r   query_image   s
   zCamera.query_imagec                 C   s   |    t | _| j \}}t|| j}d }| jr%| j	r"d}nd}n| j	r*d}|d ur4t
||}t|}t|}tj|}|rN||d |S |S )Nr   r   )r   r   )r<   rC   r4   r-   r   r   ZcvtColorr%   r1   r2   flipnumpyZfliplrZrot90r:   Z	surfarrayZmake_surfaceZblit)r(   Z	dest_surfr   imageZ	flip_codeZsurfr   r   r   	get_image   s(   


zCamera.get_imagec                 C   s(   |    t | _| j \}}| S r=   )r<   rC   r4   r-   r   tobytes)r(   r   rI   r   r   r   get_raw   s   
zCamera.get_rawr   r   r   N)NNNr=   )__name__
__module____qualname__r,   r7   r9   r<   r>   rB   rA   rE   rJ   rL   r   r   r   r   r   >   s    


 r   c                       s   e Zd Zd fdd	Z  ZS )	CameraMacr   r   r   Nc                    sP   t |tr|}nt |trt |}n	tdtt|t |||| d S )NzJOpenCV-Mac backend can take device indices or names, ints or strings, not )	
isinstancer0   strr   r
   	TypeErrortypesuperr,   )r(   r)   r*   r+   r"   _dev	__class__r   r   r,      s   


zCameraMac.__init__rM   )rN   rO   rP   r,   __classcell__r   r   rX   r   rQ      s    rQ   )
__doc__r#   rC   rH   r   r:   r   r   r   rQ   r   r   r   r   <module>   s     	