
    &hN                     f    S r SSKrSSKrSSKrSSKrSSKrS rS r " S S5      r " S S\5      r	g)	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                      Sn / nSnSnX#:  aa  [         R                  " U 5      nUR                  5       S   (       d  US-  nOUR                  U 5        UR	                  5         U S-  n X#:  a  Ma  U$ ) r         )cv2VideoCapturereadappendrelease)index
device_idxfailedmax_gapsvcaps        M/var/www/auris/envauris/lib/python3.13/site-packages/pygame/_camera_opencv.pylist_camerasr      st    EJF H

&yy{1~aKFe$
 
     c                  6   SS K n SSKJn  U R                  SSU R                  U R                  S9R                  5       u  p#S n/ nUR                  U5      R                  S5       H0  nUS:X  a  UR                  UR                  5        UR                  nM2     U$ )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nodes          r   list_cameras_darwinr'   '   s    % /	   
 km E IG&&u-667RSNN499%II	 T
 Nr   c                   \    \ rS rSrSS jrS rS rS rS rSS jr	S	 r
S
 rSS jrS rSrg)Camera>   Nc                 L   Xl         X l        X@l        Ub)  [        R                  S:X  a  [
        R                  U l        US:X  a  [
        R                  U l        OCUS:X  a  [
        R                  U l        O'US:X  a  [
        R                  U l        O[        S5      eSU l        g)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win32RGB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moder2   s        r   __init__Camera.__init__?   s     $
,%#,,'*A"%--D5=))DIU]))DIU]))DI344
r   c                 :   U R                   (       a  g [        R                  " U R                  U R                  5      U l        U R
                  R                  5       (       d  [        S5      eU R
                  R                  [        R                  U R                  S   5        U R
                  R                  [        R                  U R                  S   5        U R
                  R                  [        R                  5      nU R
                  R                  [        R                  5      n[        U5      [        U5      4U l
        SU l        SU l        SU l        SU R
                  R                  [        R"                  5      -  U l        SU l        SU l         g )NzCould not open camera.r   r   FT)r;   r   r   r0   r2   _camisOpenedr:   setCAP_PROP_FRAME_WIDTHr1   CAP_PROP_FRAME_HEIGHTgetint_flipx_flipy_brightnessCAP_PROP_FPS
_frametime_last_frame_time)r<   whs      r   startCamera.start[   s   ::$$T%7%79L9LM	yy!!##566		c..

1>		c//A?IIMM#223IIMM#334!fc!f%
diimmC,<,<== !
r   c                 x    U R                   (       a)  U R                  R                  5         S U l        SU l         g g )NF)r;   rC   r   r<   s    r   stopCamera.stopt   s,    ::IIDIDJ r   c                 R    U R                   (       d  [        R                  " S5      eg )NzCamera must be started)r;   pygameerrorrU   s    r   _check_openCamera._check_openz   s    zz,,788 r   c                 :    U R                  5         U R                  $ N)r[   r1   rU   s    r   get_sizeCamera.get_size~   s    zzr   c                     U R                  5         Ub  [        U5      U l        Ub  [        U5      U l        Ub*  U R                  R                  [        R                  U5        U R                  5       $ r^   )	r[   boolrJ   rK   rC   rE   r   CAP_PROP_BRIGHTNESSget_controls)r<   hflipvflip
brightnesss       r   set_controlsCamera.set_controls   s]    u+DKu+DK!IIMM#11:>  ""r   c                     U R                  5         U R                  U R                  U R                  R	                  [
        R                  5      4$ r^   )r[   rJ   rK   rC   rH   r   rc   rU   s    r   rd   Camera.get_controls   s6    T[[$))--8O8O*PQQr   c                     U R                  5         [        R                  " 5       nXR                  -
  U R                  :  a  gg)NTF)r[   timerO   rN   )r<   current_times     r   query_imageCamera.query_image   s4    yy{///$//Ar   c                 J   U R                  5         [        R                  " 5       U l        U R                  R	                  5       u  p#[
        R                  " X0R                  5      nS nU R                  (       a  U R                  (       a  SnOSnOU R                  (       a  SnUb  [
        R                  " X45      n[        R                  " U5      n[        R                  " U5      n[        R                  R!                  U5      nU(       a  UR#                  US5        U$ U$ )Nr   r   )r   r   )r[   rm   rO   rC   r	   r   cvtColorr7   rJ   rK   flipnumpyfliplrrot90rY   	surfarraymake_surfaceblit)r<   	dest_surfr#   image	flip_codesurfs         r   	get_imageCamera.get_image   s     $		99>>#UII.	;;{{		[[I HHU.EU#E",,U3NN4(r   c                     U R                  5         [        R                  " 5       U l        U R                  R	                  5       u  pUR                  5       $ r^   )r[   rm   rO   rC   r	   tobytes)r<   r#   r|   s      r   get_rawCamera.get_raw   s:     $		99>>#}}r   )rL   rC   r0   rJ   rK   r7   rN   rO   r;   r1   r2   r   )i  i  r-   N)NNNr^   )__name__
__module____qualname____firstlineno__r@   rR   rV   r[   r_   rh   rd   ro   r   r   __static_attributes__ r   r   r)   r)   >   s6    829

#R
@r   r)   c                   ,   ^  \ rS rSrSU 4S jjrSrU =r$ )	CameraMac   c                    > [        U[        5      (       a  UnOM[        U[        5      (       a  [        5       R	                  U5      nO[        S[        [        U5      5      5      e[        TU ]!  XRX45        g )NzJOpenCV-Mac backend can take device indices or names, ints or strings, not )	
isinstancerI   strr'   r   	TypeErrortypesuperr@   )r<   r=   r>   r?   r2   _dev	__class__s         r   r@   CameraMac.__init__   sb    fc""D$$&(..v6D\DL! 
 	T:r   r   r   )r   r   r   r   r@   r   __classcell__)r   s   @r   r   r      s    ; ;r   r   )
__doc__r3   rm   ru   r   rY   r   r'   r)   r   r   r   r   <module>r      s>       
 *.E EP; ;r   