o
    tVgN                     @   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)index
device_idxfailedmax_gapsvcap r   I/home/ubuntu/.local/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)

subprocess	xml.etreer   PopenPIPEcommunicate
fromstringiterfindr   text)r   r   flout_	last_text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'   YUVHSVzNot a supported modeF)_device_index_sizeapi_preferencesysplatformr   	CAP_DSHOWCOLOR_BGR2RGB_fmtCOLOR_BGR2YUV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)r6   r   r   r+   r-   _camisOpenedr5   setCAP_PROP_FRAME_WIDTHr,   CAP_PROP_FRAME_HEIGHTgetint_flipx_flipy_brightnessCAP_PROP_FPS
_frametime_last_frame_time)r7   whr   r   r   start[   s    

zCamera.startc                 C   s$   | j r| j  d | _d| _ d S d S )NF)r6   r<   r	   r7   r   r   r   stopt   s
   

zCamera.stopc                 C   s   | j stdd S )NzCamera must be started)r6   pygameerrorrL   r   r   r   _check_openz   s   
zCamera._check_openc                 C   s   |    | jS N)rP   r,   rL   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 rQ   )	rP   boolrC   rD   r<   r>   r   CAP_PROP_BRIGHTNESSget_controls)r7   hflipvflip
brightnessr   r   r   set_controls   s   

zCamera.set_controlsc                 C   s    |    | j| j| jtjfS rQ   )rP   rC   rD   r<   rA   r   rT   rL   r   r   r   rU      s   zCamera.get_controlsc                 C   s(   |    t }|| j | jkrdS dS )NTF)rP   timerH   rG   )r7   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   )rP   rZ   rH   r<   r   r   cvtColorr2   rC   rD   flipnumpyfliplrrot90rN   	surfarraymake_surfaceblit)r7   	dest_surfr    image	flip_codesurfr   r   r   	get_image   s(   


zCamera.get_imagec                 C   s(   |    t | _| j \}}| S rQ   )rP   rZ   rH   r<   r   tobytes)r7   r    rg   r   r   r   get_raw   s   
zCamera.get_rawr   r&   r'   N)NNNrQ   )__name__
__module____qualname__r;   rK   rM   rP   rR   rY   rU   r\   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 )	
isinstancerB   strr$   r
   	TypeErrortypesuperr;   )r7   r8   r9   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.   rZ   r`   r   rN   r   r$   r%   rq   r   r   r   r   <module>   s     	