content: {-# language GeneralizedNewtypeDeriving #-}
  {-# language CPP #-}
  
  #ifndef ENABLE_INTERNAL_DOCUMENTATION
  {-# OPTIONS_HADDOCK hide #-}
  #endif
  
  module OpenCV.Internal.VideoIO.Types
      ( -- * VideoCodecs
        FourCC(..)
      , VideoCaptureProperties(..)
      , marshalCaptureProperties
      , VideoCaptureAPI(..)
      , marshalVideoCaptureAPI
      ) where
  
  import "base" Data.Char ( ord )
  import "base" Data.Int ( Int32 )
  import "base" Data.Word ( Word32 )
  import "base" Data.String ( IsString (..) )
  import "base" Data.List( unfoldr )
  import "this" OpenCV.Internal.VideoIO.Constants
  
  --------------------------------------------------------------------------------
  -- FourCC
  --------------------------------------------------------------------------------
  
  newtype FourCC = FourCC { unFourCC :: Int32 }
  
  instance IsString FourCC where
    fromString "ask" = FourCC (-1)
    fromString fcc =
        FourCC $ foldr (\x acc -> acc * 256 + fromIntegral (ord x))
                       0
                       (take 4 fcc)
  
  instance Show FourCC where
    show (FourCC (-1)) = "ask"
    show (FourCC fcc) = take 4 $ unfoldr worker (fromIntegral fcc :: Word32)
      where
        worker 0 = Nothing
        worker b = Just (toEnum . fromEnum $ b `mod` 256, b `div` 256)
  
  --------------------------------------------------------------------------------
  -- VideoCaptureProperties
  -- more at https://github.com/opencv/opencv/blob/master/modules/videoio/include/opencv2/videoio.hpp
  --------------------------------------------------------------------------------
  
  data VideoCaptureProperties
     = VideoCapPropPosMsec
            -- ^ Current position of the video file in milliseconds.
     | VideoCapPropPosFrames
            -- ^ 0-based index of the frame to be decoded/captured next.
     | VideoCapPropPosAviRatio
            -- ^ Relative position of the video file: 0=start of the film,
            --   1=end of the film.
     | VideoCapPropFrameWidth     -- ^ Width of the frames in the video stream.
     | VideoCapPropFrameHeight    -- ^ Height of the frames in the video stream.
     | VideoCapPropFps            -- ^ Frame rate.
     | VideoCapPropFourCc         -- ^ 4-character code of codec.
     | VideoCapPropFrameCount     -- ^ Number of frames in the video file.
     | VideoCapPropFormat
            -- ^ Format of the Mat objects returned by VideoCapture::retrieve().
     | VideoCapPropMode
            -- ^ Backend-specific value indicating the current capture mode.
     | VideoCapPropBrightness     -- ^ Brightness of the image (only for cameras).
     | VideoCapPropContrast       -- ^ Contrast of the image (only for cameras).
     | VideoCapPropSaturation     -- ^ Saturation of the image (only for cameras).
     | VideoCapPropHue            -- ^ Hue of the image (only for cameras).
     | VideoCapPropGain           -- ^ Gain of the image (only for cameras).
     | VideoCapPropExposure       -- ^ Exposure (only for cameras).
     | VideoCapPropConvertRgb
          -- ^ Boolean flags indicating whether images should be converted to RGB.
     | VideoCapPropWhiteBalanceBlueU -- ^ Currently unsupported.
     | VideoCapPropRectification
          -- ^ Rectification flag for stereo cameras
          --  (note: only supported by DC1394 v 2.x backend currently).
     | VideoCapPropMonochrome        -- ^
     | VideoCapPropSharpness         -- ^
     | VideoCapPropAutoExposure
          -- ^ DC1394: exposure control done by camera, user can adjust reference
          -- level using this feature.
     | VideoCapPropGamma             -- ^
     | VideoCapPropTemperature       -- ^
     | VideoCapPropTrigger           -- ^
     | VideoCapPropTriggerDelay      -- ^
     | VideoCapPropWhiteBalanceRedV  -- ^
     | VideoCapPropZoom              -- ^
     | VideoCapPropFocus             -- ^
     | VideoCapPropGuid              -- ^
     | VideoCapPropIsoSpeed          -- ^
     | VideoCapPropBacklight         -- ^
     | VideoCapPropPan               -- ^
     | VideoCapPropTilt              -- ^
     | VideoCapPropRoll              -- ^
     | VideoCapPropIris              -- ^
     | VideoCapPropSettings
          -- ^ Pop up video/camera filter dialog (note: only supported by DSHOW
          --  backend currently. Property value is ignored)
     | VideoCapPropBuffersize        -- ^
     | VideoCapPropAutofocus         -- ^
     | VideoCapPropInt !Int32
         -- ^ Any property we need. Meaning of this property depends on
         -- the backend.
  
  marshalCaptureProperties :: VideoCaptureProperties -> Int32
  marshalCaptureProperties = \case
     VideoCapPropPosMsec           -> c'CAP_PROP_POS_MSEC
     VideoCapPropPosFrames         -> c'CAP_PROP_POS_FRAMES
     VideoCapPropPosAviRatio       -> c'CAP_PROP_POS_AVI_RATIO
     VideoCapPropFrameWidth        -> c'CAP_PROP_FRAME_WIDTH
     VideoCapPropFrameHeight       -> c'CAP_PROP_FRAME_HEIGHT
     VideoCapPropFps               -> c'CAP_PROP_FPS
     VideoCapPropFourCc            -> c'CAP_PROP_FOURCC
     VideoCapPropFrameCount        -> c'CAP_PROP_FRAME_COUNT
     VideoCapPropFormat            -> c'CAP_PROP_FORMAT
     VideoCapPropMode              -> c'CAP_PROP_MODE
     VideoCapPropBrightness        -> c'CAP_PROP_BRIGHTNESS
     VideoCapPropContrast          -> c'CAP_PROP_CONTRAST
     VideoCapPropSaturation        -> c'CAP_PROP_SATURATION
     VideoCapPropHue               -> c'CAP_PROP_HUE
     VideoCapPropGain              -> c'CAP_PROP_GAIN
     VideoCapPropExposure          -> c'CAP_PROP_EXPOSURE
     VideoCapPropConvertRgb        -> c'CAP_PROP_CONVERT_RGB
     VideoCapPropWhiteBalanceBlueU -> c'CAP_PROP_WHITE_BALANCE_BLUE_U
     VideoCapPropRectification     -> c'CAP_PROP_RECTIFICATION
     VideoCapPropMonochrome        -> c'CAP_PROP_MONOCHROME
     VideoCapPropSharpness         -> c'CAP_PROP_SHARPNESS
     VideoCapPropAutoExposure      -> c'CAP_PROP_AUTO_EXPOSURE
     VideoCapPropGamma             -> c'CAP_PROP_GAMMA
     VideoCapPropTemperature       -> c'CAP_PROP_TEMPERATURE
     VideoCapPropTrigger           -> c'CAP_PROP_TRIGGER
     VideoCapPropTriggerDelay      -> c'CAP_PROP_TRIGGER_DELAY
     VideoCapPropWhiteBalanceRedV  -> c'CAP_PROP_WHITE_BALANCE_RED_V
     VideoCapPropZoom              -> c'CAP_PROP_ZOOM
     VideoCapPropFocus             -> c'CAP_PROP_FOCUS
     VideoCapPropGuid              -> c'CAP_PROP_GUID
     VideoCapPropIsoSpeed          -> c'CAP_PROP_ISO_SPEED
     VideoCapPropBacklight         -> c'CAP_PROP_BACKLIGHT
     VideoCapPropPan               -> c'CAP_PROP_PAN
     VideoCapPropTilt              -> c'CAP_PROP_TILT
     VideoCapPropRoll              -> c'CAP_PROP_ROLL
     VideoCapPropIris              -> c'CAP_PROP_IRIS
     VideoCapPropSettings          -> c'CAP_PROP_SETTINGS
     VideoCapPropBuffersize        -> c'CAP_PROP_BUFFERSIZE
     VideoCapPropAutofocus         -> c'CAP_PROP_AUTOFOCUS
     VideoCapPropInt a             -> a
  
  --------------------------------------------------------------------------------
  -- VideoCaptureProperties
  -- more at https://github.com/opencv/opencv/blob/master/modules/videoio/include/opencv2/videoio.hpp
  --------------------------------------------------------------------------------
  data VideoCaptureAPI
     = VideoCapAny          -- ^ Auto detect == 0
     | VideoCapVfw          -- ^ Video For Windows (platform native)
     | VideoCapV4l          -- ^ V4L/V4L2 capturing support via libv4l
     | VideoCapV4l2         -- ^ Same as CAP_V4L
     | VideoCapFirewire     -- ^ IEEE 1394 drivers
     | VideoCapFireware     -- ^ Same as CAP_FIREWIRE
     | VideoCapIeee1394     -- ^ Same as CAP_FIREWIRE
     | VideoCapDc1394       -- ^ Same as CAP_FIREWIRE
     | VideoCapCmu1394      -- ^ Same as CAP_FIREWIRE
     | VideoCapQt           -- ^ QuickTime
     | VideoCapUnicap       -- ^ Unicap drivers
     | VideoCapDshow        -- ^ DirectShow (via videoInput)
     | VideoCapPvapi        -- ^ PvAPI, Prosilica GigE SDK
     | VideoCapOpenni       -- ^ OpenNI (for Kinect)
     | VideoCapOpenniAsus   -- ^ OpenNI (for Asus Xtion)
     | VideoCapAndroid      -- ^ Android - not used
     | VideoCapXiapi        -- ^ XIMEA Camera API
     | VideoCapAvfoundation
          -- ^ AVFoundation framework for iOS (OS X Lion will have the same API)
     | VideoCapGiganetix    -- ^ Smartek Giganetix GigEVisionSDK
     | VideoCapMsmf         -- ^ Microsoft Media Foundation (via videoInput)
     | VideoCapWinrt        -- ^ Microsoft Windows Runtime using Media Foundation
     | VideoCapIntelperc    -- ^ Intel Perceptual Computing SDK
     | VideoCapOpenni2      -- ^ OpenNI2 (for Kinect)
     | VideoCapOpenni2Asus
          -- ^ OpenNI2 (for Asus Xtion and Occipital Structure sensors)
     | VideoCapGphoto2      -- ^ gPhoto2 connection
     | VideoCapGstreamer    -- ^ GStreamer
     | VideoCapFfmpeg
          -- ^ Open and record video file or stream using the FFMPEG library
     | VideoCapImages       -- ^ Image Sequence (e.g. img_%02d.jpg)
  
  marshalVideoCaptureAPI :: VideoCaptureAPI -> Int32
  marshalVideoCaptureAPI = \case
     VideoCapAny           -> c'CAP_ANY
     VideoCapVfw           -> c'CAP_VFW
     VideoCapV4l           -> c'CAP_V4L
     VideoCapV4l2          -> c'CAP_V4L2
     VideoCapFirewire      -> c'CAP_FIREWIRE
     VideoCapFireware      -> c'CAP_FIREWARE
     VideoCapIeee1394      -> c'CAP_IEEE1394
     VideoCapDc1394        -> c'CAP_DC1394
     VideoCapCmu1394       -> c'CAP_CMU1394
     VideoCapQt            -> c'CAP_QT
     VideoCapUnicap        -> c'CAP_UNICAP
     VideoCapDshow         -> c'CAP_DSHOW
     VideoCapPvapi         -> c'CAP_PVAPI
     VideoCapOpenni        -> c'CAP_OPENNI
     VideoCapOpenniAsus    -> c'CAP_OPENNI_ASUS
     VideoCapAndroid       -> c'CAP_ANDROID
     VideoCapXiapi         -> c'CAP_XIAPI
     VideoCapAvfoundation  -> c'CAP_AVFOUNDATION
     VideoCapGiganetix     -> c'CAP_GIGANETIX
     VideoCapMsmf          -> c'CAP_MSMF
     VideoCapWinrt         -> c'CAP_WINRT
     VideoCapIntelperc     -> c'CAP_INTELPERC
     VideoCapOpenni2       -> c'CAP_OPENNI2
     VideoCapOpenni2Asus   -> c'CAP_OPENNI2_ASUS
     VideoCapGphoto2       -> c'CAP_GPHOTO2
     VideoCapGstreamer     -> c'CAP_GSTREAMER
     VideoCapFfmpeg        -> c'CAP_FFMPEG
     VideoCapImages        -> c'CAP_IMAGES
  