Skip to content

File SpinnakerDefs.h

File List > include > SpinnakerDefs.h

Go to the documentation of this file

//=============================================================================
// Copyright (c) 2026 FLIR Integrated Imaging Solutions, Inc. All Rights Reserved.
//
// This software is the confidential and proprietary information of FLIR
// Integrated Imaging Solutions, Inc. ("Confidential Information"). You
// shall not disclose such Confidential Information and shall use it only in
// accordance with the terms of the license agreement you entered into
// with FLIR Integrated Imaging Solutions, Inc. (FLIR).
//
// FLIR MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
// SOFTWARE, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE, OR NON-INFRINGEMENT. FLIR SHALL NOT BE LIABLE FOR ANY DAMAGES
// SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
// THIS SOFTWARE OR ITS DERIVATIVES.
//=============================================================================

#ifndef FLIR_SPINNAKER_DEFS_H
#define FLIR_SPINNAKER_DEFS_H
#include <memory.h>
#include <stdint.h>
#include <string>

#include "SpinnakerPlatform.h"

namespace Spinnaker
{
    const uint64_t EVENT_TIMEOUT_NONE = 0;                      // Do not wait.  GetNextImage will return immediately.
    const uint64_t EVENT_TIMEOUT_INFINITE = 0xFFFFFFFFFFFFFFFF; // Never timeout.  GetNextImage will wait indefinitely.

    enum Error
    {
        SPINNAKER_ERR_SUCCESS = 0,
        SPINNAKER_ERR_ERROR = -1001,
        SPINNAKER_ERR_NOT_INITIALIZED = -1002,
        SPINNAKER_ERR_NOT_IMPLEMENTED = -1003,
        SPINNAKER_ERR_RESOURCE_IN_USE = -1004,
        SPINNAKER_ERR_ACCESS_DENIED = -1005,
        SPINNAKER_ERR_INVALID_HANDLE = -1006,
        SPINNAKER_ERR_INVALID_ID = -1007,
        SPINNAKER_ERR_NO_DATA = -1008,
        SPINNAKER_ERR_INVALID_PARAMETER = -1009,
        SPINNAKER_ERR_IO = -1010,
        SPINNAKER_ERR_TIMEOUT = -1011,
        SPINNAKER_ERR_ABORT = -1012,
        SPINNAKER_ERR_INVALID_BUFFER = -1013,
        SPINNAKER_ERR_NOT_AVAILABLE = -1014,
        SPINNAKER_ERR_INVALID_ADDRESS = -1015,
        SPINNAKER_ERR_BUFFER_TOO_SMALL = -1016,
        SPINNAKER_ERR_INVALID_INDEX = -1017,
        SPINNAKER_ERR_PARSING_CHUNK_DATA = -1018,
        SPINNAKER_ERR_INVALID_VALUE = -1019,
        SPINNAKER_ERR_RESOURCE_EXHAUSTED = -1020,
        SPINNAKER_ERR_OUT_OF_MEMORY = -1021,
        SPINNAKER_ERR_BUSY = -1022,
        SPINNAKER_ERR_IP_CONFLICT = -1023,
        SPINNAKER_ERR_INVALID_CAMERA = -1024,

        SPINNAKER_ERR_GENICAM_INVALID_ARGUMENT = -2001,
        SPINNAKER_ERR_GENICAM_OUT_OF_RANGE = -2002,
        SPINNAKER_ERR_GENICAM_PROPERTY = -2003,
        SPINNAKER_ERR_GENICAM_RUN_TIME = -2004,
        SPINNAKER_ERR_GENICAM_LOGICAL = -2005,
        SPINNAKER_ERR_GENICAM_ACCESS = -2006,
        SPINNAKER_ERR_GENICAM_TIMEOUT = -2007,
        SPINNAKER_ERR_GENICAM_DYNAMIC_CAST = -2008,
        SPINNAKER_ERR_GENICAM_GENERIC = -2009,
        SPINNAKER_ERR_GENICAM_BAD_ALLOCATION = -2010,

        SPINNAKER_ERR_IM_CONVERT = -3001,
        SPINNAKER_ERR_IM_COPY = -3002,
        SPINNAKER_ERR_IM_MALLOC = -3003,
        SPINNAKER_ERR_IM_NOT_SUPPORTED = -3004,
        SPINNAKER_ERR_IM_HISTOGRAM_RANGE = -3005,
        SPINNAKER_ERR_IM_HISTOGRAM_MEAN = -3006,
        SPINNAKER_ERR_IM_MIN_MAX = -3007,
        SPINNAKER_ERR_IM_COLOR_CONVERSION = -3008,
        SPINNAKER_ERR_IM_DECOMPRESSION = -3009,
        SPINNAKER_ERR_IM_INVALID_IMAGE_TYPE = -3010,

        SPINNAKER_ERR_GPU_DECOMPRESSION = -3100,
        SPINNAKER_ERR_GPU_NOT_SUPPORTED = -3101,

        SPINNAKER_ERR_STEREO_INVALID_PIXEL_FORMAT = -3200,
        SPINNAKER_ERR_STEREO_RESOLUTION_MISMATCH = -3201,
        SPINNAKER_ERR_STEREO_INVALID_FILENAME = -3202,
        SPINNAKER_ERR_STEREO_INVALID_PLY_FILE = -3203,
        SPINNAKER_ERR_STEREO_MALLOC = -3104,
        SPINNAKER_ERR_STEREO_SPECKLE_FILTER = -3205,

        SPINNAKER_ERR_CUSTOM_ID = -10000
    };

    enum EventType
    {
        SPINNAKER_EVENT_ARRIVAL_REMOVAL, /* Specifically, the device arrival/removal event */
        SPINNAKER_EVENT_DEVICE,
        SPINNAKER_EVENT_DEVICE_SPECIFIC,
        SPINNAKER_EVENT_NEW_BUFFER,
        SPINNAKER_EVENT_NEW_BUFFER_LIST,
        SPINNAKER_EVENT_LOGGING_EVENT,
        SPINNAKER_EVENT_INTERFACE_ARRIVAL_REMOVAL,
        SPINNAKER_EVENT_MODULE,
        SPINNAKER_EVENT_UNKNOWN,
    };

    enum TLPixelFormatNamespace
    {
        SPINNAKER_TLPIXELFORMAT_NAMESPACE_UNKNOWN = 0,    /* GenTL v1.2 */
        SPINNAKER_TLPIXELFORMAT_NAMESPACE_GEV = 1,        /* GenTL v1.2 */
        SPINNAKER_TLPIXELFORMAT_NAMESPACE_IIDC = 2,       /* GenTL v1.2 */
        SPINNAKER_TLPIXELFORMAT_NAMESPACE_PFNC_16BIT = 3, /* GenTL v1.4 */
        SPINNAKER_TLPIXELFORMAT_NAMESPACE_PFNC_32BIT = 4, /* GenTL v1.4 */

        SPINNAKER_TLPIXELFORMAT_NAMESPACE_CUSTOM_ID = 1000
    };

    enum ColorProcessingAlgorithm
    {
        SPINNAKER_COLOR_PROCESSING_ALGORITHM_NONE,
        SPINNAKER_COLOR_PROCESSING_ALGORITHM_NEAREST_NEIGHBOR,
        SPINNAKER_COLOR_PROCESSING_ALGORITHM_NEAREST_NEIGHBOR_AVG,
        SPINNAKER_COLOR_PROCESSING_ALGORITHM_BILINEAR,
        SPINNAKER_COLOR_PROCESSING_ALGORITHM_EDGE_SENSING,
        SPINNAKER_COLOR_PROCESSING_ALGORITHM_HQ_LINEAR,
        SPINNAKER_COLOR_PROCESSING_ALGORITHM_IPP,
        SPINNAKER_COLOR_PROCESSING_ALGORITHM_DIRECTIONAL_FILTER,
        SPINNAKER_COLOR_PROCESSING_ALGORITHM_RIGOROUS,
        SPINNAKER_COLOR_PROCESSING_ALGORITHM_WEIGHTED_DIRECTIONAL_FILTER
    };

    enum ImageFileFormat
    {
        SPINNAKER_IMAGE_FILE_FORMAT_FROM_FILE_EXT = -1, 
        SPINNAKER_IMAGE_FILE_FORMAT_PGM,                
        SPINNAKER_IMAGE_FILE_FORMAT_PPM,                
        SPINNAKER_IMAGE_FILE_FORMAT_BMP,                
        SPINNAKER_IMAGE_FILE_FORMAT_JPEG,               
        SPINNAKER_IMAGE_FILE_FORMAT_JPEG2000,           
        SPINNAKER_IMAGE_FILE_FORMAT_TIFF,               
        SPINNAKER_IMAGE_FILE_FORMAT_PNG,                
        SPINNAKER_IMAGE_FILE_FORMAT_RAW,                
        SPINNAKER_IMAGE_FILE_FORMAT_JPEG12_C,           
        SPINNAKER_IMAGE_FILE_FORMAT_GENDC,              
        SPINNAKER_IMAGE_FILE_FORMAT_FORCE_32BITS = 0x7FFFFFFF
    };

    enum ImageStatus
    {
        SPINNAKER_IMAGE_STATUS_UNKNOWN_ERROR = -1, 
        SPINNAKER_IMAGE_STATUS_NO_ERROR =
            0, 
        SPINNAKER_IMAGE_STATUS_CRC_CHECK_FAILED = 1, 
        SPINNAKER_IMAGE_STATUS_DATA_OVERFLOW = 2,    
        SPINNAKER_IMAGE_STATUS_MISSING_PACKETS =
            3, 
        SPINNAKER_IMAGE_STATUS_LEADER_BUFFER_SIZE_INCONSISTENT =
            4, 
        SPINNAKER_IMAGE_STATUS_TRAILER_BUFFER_SIZE_INCONSISTENT =
            5, 
        SPINNAKER_IMAGE_STATUS_PACKETID_INCONSISTENT =
            6, 
        SPINNAKER_IMAGE_STATUS_MISSING_LEADER =
            7, 
        SPINNAKER_IMAGE_STATUS_MISSING_TRAILER =
            8, 
        SPINNAKER_IMAGE_STATUS_DATA_INCOMPLETE = 9, 
        SPINNAKER_IMAGE_STATUS_INFO_INCONSISTENT =
            10, 
        SPINNAKER_IMAGE_STATUS_CHUNK_DATA_INVALID = 11,  
        SPINNAKER_IMAGE_STATUS_NO_SYSTEM_RESOURCES = 12, 
        SPINNAKER_IMAGE_STATUS_GENDC_DATA_INVALID =
            13, 
        SPINNAKER_IMAGE_STATUS_GENDC_PART_DATA_INVALID = 14 
    };

    enum StatisticsChannel
    {
        SPINNAKER_STATISTICS_CHANNEL_GREY,
        SPINNAKER_STATISTICS_CHANNEL_RED,
        SPINNAKER_STATISTICS_CHANNEL_GREEN,
        SPINNAKER_STATISTICS_CHANNEL_BLUE,
        SPINNAKER_STATISTICS_CHANNEL_HUE,
        SPINNAKER_STATISTICS_CHANNEL_SATURATION,
        SPINNAKER_STATISTICS_CHANNEL_LIGHTNESS,
        SPINNAKER_STATISTICS_CHANNEL_NUM_CHANNELS
    };

    enum SpinnakerLogLevel
    {
        SPINNAKER_LOG_LEVEL_OFF = -1,    // Logging is off.
        SPINNAKER_LOG_LEVEL_FATAL = 0,   // Failures that are non-recoverable without user intervention.
        SPINNAKER_LOG_LEVEL_ALERT = 100, // Not used by Spinnaker.
        SPINNAKER_LOG_LEVEL_CRIT = 200,  // Not used by Spinnaker.
        SPINNAKER_LOG_LEVEL_ERROR = 300, // Failures that may or may not be recoverable without user
                                         // intervention (use case dependent).
        SPINNAKER_LOG_LEVEL_WARN = 400,  // Failures that are recoverable without user intervention.
        SPINNAKER_LOG_LEVEL_NOTICE =
            500, // Events such as camera arrival and removal, initialization and deinitialization,
                 // starting and stopping image acquisition, and feature modification.
        SPINNAKER_LOG_LEVEL_INFO = 600,  // Information about recurring events that are generated regularly such as
                                         // information on individual images.
        SPINNAKER_LOG_LEVEL_DEBUG = 700, // Information that can be used to troubleshoot the system.
        SPINNAKER_LOG_LEVEL_NOTSET = 800 // Logs everything.
    };

    /* Image payload types supported by the Spinnaker Image class*/
    enum ImagePayloadType
    {
        SPINNAKER_IMAGE_PAYLOAD_TYPE_UNKNOWN = -1,
        SPINNAKER_IMAGE_PAYLOAD_TYPE_IMAGE,
        SPINNAKER_IMAGE_PAYLOAD_TYPE_EXTENDED_CHUNK,
        SPINNAKER_IMAGE_PAYLOAD_TYPE_JPEG,
        SPINNAKER_IMAGE_PAYLOAD_TYPE_LOSSLESS_COMPRESSED,
        SPINNAKER_IMAGE_PAYLOAD_TYPE_LOSSY_COMPRESSED,
        SPINNAKER_IMAGE_PAYLOAD_TYPE_JPEG_LOSSLESS_COMPRESSED,
        SPINNAKER_IMAGE_PAYLOAD_TYPE_RAW_SENSOR1,
        SPINNAKER_IMAGE_PAYLOAD_TYPE_RAW_SENSOR2,
        SPINNAKER_IMAGE_PAYLOAD_TYPE_RECTIFIED_SENSOR1,
        SPINNAKER_IMAGE_PAYLOAD_TYPE_RECTIFIED_SENSOR2,
        SPINNAKER_IMAGE_PAYLOAD_TYPE_DISPARITY_SENSOR1,
        SPINNAKER_IMAGE_PAYLOAD_TYPE_GENDC_GENERIC, // GenDC generic payload type if no other types match
        SPINNAKER_IMAGE_PAYLOAD_TYPE_RANGE_SENSOR1,
        SPINNAKER_IMAGE_PAYLOAD_TYPE_RANGE_SENSOR2
    };

    /* Enumeration of generic transport layer dependent payload types */
    enum TLPayloadType
    {
        SPINNAKER_TLPAYLOAD_TYPE_UNKNOWN = 0,         /* GenTL v1.2 */
        SPINNAKER_TLPAYLOAD_TYPE_IMAGE = 1,           /* GenTL v1.2 */
        SPINNAKER_TLPAYLOAD_TYPE_RAW_DATA = 2,        /* GenTL v1.2 */
        SPINNAKER_TLPAYLOAD_TYPE_FILE = 3,            /* GenTL v1.2 */
        SPINNAKER_TLPAYLOAD_TYPE_CHUNK_DATA = 4,      /* GenTL v1.2, Deprecated in GenTL 1.5*/
        SPINNAKER_TLPAYLOAD_TYPE_JPEG = 5,            /* GenTL v1.4 */
        SPINNAKER_TLPAYLOAD_TYPE_JPEG2000 = 6,        /* GenTL v1.4 */
        SPINNAKER_TLPAYLOAD_TYPE_H264 = 7,            /* GenTL v1.4 */
        SPINNAKER_TLPAYLOAD_TYPE_CHUNK_ONLY = 8,      /* GenTL v1.4 */
        SPINNAKER_TLPAYLOAD_TYPE_DEVICE_SPECIFIC = 9, /* GenTL v1.4 */
        SPINNAKER_TLPAYLOAD_TYPE_MULTI_PART = 10,     /* GenTL v1.5 */
        SPINNAKER_TLPAYLOAD_TYPE_GENDC = 11,          /* GenTL v1.6 */

        SPINNAKER_TLPAYLOAD_TYPE_CUSTOM_ID = 1000, /* Starting value for GenTL Producer custom IDs*/
        SPINNAKER_TLPAYLOAD_TYPE_LOSSLESS_COMPRESSED = SPINNAKER_TLPAYLOAD_TYPE_CUSTOM_ID + 1,
        SPINNAKER_TLPAYLOAD_TYPE_LOSSY_COMPRESSED = SPINNAKER_TLPAYLOAD_TYPE_CUSTOM_ID + 2,
        SPINNAKER_TLPAYLOAD_TYPE_JPEG_LOSSLESS_COMPRESSED = SPINNAKER_TLPAYLOAD_TYPE_CUSTOM_ID + 3
    };

    enum ActionCommandStatus
    {
        SPINNAKER_ACTION_COMMAND_STATUS_OK = 0, /* The device acknowledged the command.*/
        SPINNAKER_ACTION_COMMAND_STATUS_NO_REF_TIME =
            0x8013, /* The device is not synchronized to a master clock to be used as time reference. Typically used
                    when scheduled action commands cannot be scheduled for a future time since the reference time
                    coming from IEEE 1588 is not locked. */
        SPINNAKER_ACTION_COMMAND_STATUS_OVERFLOW = 0x8015, /* Returned when the scheduled action commands queue is full
                                                           and the device cannot accept the additional request. */
        SPINNAKER_ACTION_COMMAND_STATUS_ACTION_LATE =
            0x8016, /* The requested scheduled action command was requested at a point in time that is in the past. */
        SPINNAKER_ACTION_COMMAND_STATUS_ERROR =
            0x8FFF /* Generic Error. Try enabling the Extended Status Code 2.0 bit on gvcp configuration register in
                   order to receive more meaningful/detailed acknowledge messages from the device. */
    };

    enum TIFFCompressionMethod
    {
        SPINNAKER_TIFF_COMPRESS_METHOD_NONE = 1,      
        SPINNAKER_TIFF_COMPRESS_METHOD_PACKBITS,      
        SPINNAKER_TIFF_COMPRESS_METHOD_DEFLATE,       
        SPINNAKER_TIFF_COMPRESS_METHOD_ADOBE_DEFLATE, 
        SPINNAKER_TIFF_COMPRESS_METHOD_CCITTFAX3,
        SPINNAKER_TIFF_COMPRESS_METHOD_CCITTFAX4,
        SPINNAKER_TIFF_COMPRESS_METHOD_LZW, 
        SPINNAKER_TIFF_COMPRESS_METHOD_JPEG
    };

    enum PixelFormatIntType
    {
        SPINNAKER_INT_TYPE_UINT8,   /* Unsigned 8-bit integer. */
        SPINNAKER_INT_TYPE_INT8,    /* Signed 8-bit integer. */
        SPINNAKER_INT_TYPE_UINT10,  /* Unsigned 10-bit integer. */
        SPINNAKER_INT_TYPE_UINT10p, /* LSB packed unsigned 10-bit integer. */
        SPINNAKER_INT_TYPE_UINT10P, /* MSB packed unsigned 10-bit integer. */
        SPINNAKER_INT_TYPE_UINT12,  /* Unsigned 12-bit integer (unpacked). */
        SPINNAKER_INT_TYPE_UINT12p, /* LSB packed unsigned 12-bit integer. */
        SPINNAKER_INT_TYPE_UINT12P, /* MSB packed unsigned 12-bit integer. */
        SPINNAKER_INT_TYPE_UINT14,  /* Unsigned 14-bit integer (unpacked). */
        SPINNAKER_INT_TYPE_UINT16,  /* Unsigned 16-bit integer (unpacked). */
        SPINNAKER_INT_TYPE_INT16,   /* Signed 16-bit integer (unpacked). */
        SPINNAKER_INT_TYPE_FLOAT32, /* 32-bit float. */
        SPINNAKER_INT_TYPE_UNKNOWN
    };

    enum BufferOwnership
    {
        SPINNAKER_BUFFER_OWNERSHIP_SYSTEM, /* Buffers are owned and managed by the library */
        SPINNAKER_BUFFER_OWNERSHIP_USER    /* Buffers are owned and managed by the user */
    };

    enum ImageScalingAlgorithm
    {
        /*
         * Uses copies of the nearest source pixels to compute a scaled image.
         * The scaling factor used with this algorithm will be rounded to the
         * nearest integer (upscaling) or inverse integer (downscaling).
         * eg. 1.3 will be rounded to 1 and 0.3 will be rounded to (1 / 3).
         */
        SPINNAKER_IMAGE_SCALING_ALGORITHM_NEAREST_NEIGHBOR
    };

    enum SourceDataRange
    {
        SPINNAKER_SOURCE_DATA_RANGE_IMAGE_DATA_RANGE,
        SPINNAKER_SOURCE_DATA_RANGE_ABSOLUTE_DATA_RANGE,
        SPINNAKER_SOURCE_DATA_RANGE_IMAGE_MIN_ABSOLUTE_MAX,
        SPINNAKER_SOURCE_DATA_RANGE_ABSOLUTE_MIN_IMAGE_MAX
    };

    enum HeatmapColor
    {
        SPINNAKER_HEATMAP_COLOR_BLACK = 1,
        SPINNAKER_HEATMAP_COLOR_BLUE = 2,
        SPINNAKER_HEATMAP_COLOR_CYAN = 3,
        SPINNAKER_HEATMAP_COLOR_GREEN = 4,
        SPINNAKER_HEATMAP_COLOR_YELLOW = 5,
        SPINNAKER_HEATMAP_COLOR_RED = 6,
        SPINNAKER_HEATMAP_COLOR_WHITE = 7
    };

    enum PolarizationQuadrant
    {
        SPINNAKER_POLARIZATION_QUADRANT_I0,
        SPINNAKER_POLARIZATION_QUADRANT_I45,
        SPINNAKER_POLARIZATION_QUADRANT_I90,
        SPINNAKER_POLARIZATION_QUADRANT_I135
    };

    enum CCMColorTemperature
    {
        SPINNAKER_CCM_COLOR_TEMP_INCANDESCENT_2765K,
        SPINNAKER_CCM_COLOR_TEMP_TUNGSTEN_2800K,
        SPINNAKER_CCM_COLOR_TEMP_WARM_FLUORESCENT_3000K,
        SPINNAKER_CCM_COLOR_TEMP_HALOGEN_3188K,
        SPINNAKER_CCM_COLOR_TEMP_COOL_FLUORESCENT_4000K,
        SPINNAKER_CCM_COLOR_TEMP_LED_4649K,
        SPINNAKER_CCM_COLOR_TEMP_LED_H_AND_E_4649K, /* for samples stained with H&E */
        SPINNAKER_CCM_COLOR_TEMP_FLUORESCENT_4665K,
        SPINNAKER_CCM_COLOR_TEMP_SUNNY_5000K,
        SPINNAKER_CCM_COLOR_TEMP_DAYLIGHT_5034K,
        SPINNAKER_CCM_COLOR_TEMP_DAYLIGHT_H_AND_E_5034K, /* for samples stained with H&E */
        SPINNAKER_CCM_COLOR_TEMP_CLOUDY_6500K,
        SPINNAKER_CCM_COLOR_TEMP_SHADE_8000K,
        SPINNAKER_CCM_COLOR_TEMP_GENERAL,
    };

    enum CCMType
    {
        SPINNAKER_CCM_TYPE_LINEAR,
        SPINNAKER_CCM_TYPE_ADVANCED
    };

    enum CCMSensor
    {
        /* Pregius Gen 2 */
        SPINNAKER_CCM_SENSOR_IMX226,
        SPINNAKER_CCM_SENSOR_IMX249,
        SPINNAKER_CCM_SENSOR_IMX250,
        SPINNAKER_CCM_SENSOR_IMX252,
        SPINNAKER_CCM_SENSOR_IMX253,
        SPINNAKER_CCM_SENSOR_IMX255,
        SPINNAKER_CCM_SENSOR_IMX264,
        SPINNAKER_CCM_SENSOR_IMX265,
        SPINNAKER_CCM_SENSOR_IMX267,
        SPINNAKER_CCM_SENSOR_IMX273,
        SPINNAKER_CCM_SENSOR_IMX287,
        SPINNAKER_CCM_SENSOR_IMX296,
        SPINNAKER_CCM_SENSOR_IMX297,
        SPINNAKER_CCM_SENSOR_IMX304,
        SPINNAKER_CCM_SENSOR_IMX327,
        SPINNAKER_CCM_SENSOR_IMX334,
        SPINNAKER_CCM_SENSOR_IMX342,
        SPINNAKER_CCM_SENSOR_IMX367,
        SPINNAKER_CCM_SENSOR_IMX387,
        SPINNAKER_CCM_SENSOR_IMX392,
        /* Pregius Gen 3 */
        SPINNAKER_CCM_SENSOR_IMX420,
        SPINNAKER_CCM_SENSOR_IMX421,
        SPINNAKER_CCM_SENSOR_IMX422,
        SPINNAKER_CCM_SENSOR_IMX425,
        SPINNAKER_CCM_SENSOR_IMX428,
        SPINNAKER_CCM_SENSOR_IMX429,
        SPINNAKER_CCM_SENSOR_IMX430,
        /* Onsemi */
        SPINNAKER_CCM_SENSOR_AR0521
    };

    enum CCMColorSpace
    {
        SPINNAKER_CCM_COLOR_SPACE_OFF,
        SPINNAKER_CCM_COLOR_SPACE_SRGB
    };

    enum CCMApplication
    {
        SPINNAKER_CCM_APPLICATION_GENERIC,
        SPINNAKER_CCM_APPLICATION_MICROSCOPY
    };

    enum SpinGenApiChunkAdapterType
    {
        SPIN_GENAPI_CHUNK_ADAPTER_GENERIC,
        SPIN_GENAPI_CHUNK_ADAPTER_GENDC
    };

    enum DisparityProcessingMethod
    {
        SPINNAKER_DISPARITY_PROCESSING_METHOD_NONE = 0,

        SPINNAKER_DISPARITY_PROCESSING_METHOD_HIGH_DENSITY,

        SPINNAKER_DISPARITY_PROCESSING_METHOD_BALANCED,

        SPINNAKER_DISPARITY_PROCESSING_METHOD_HIGH_PERFORMANCE
    };

    struct PNGOption
    {
        bool interlaced;
        unsigned int compressionLevel;
        unsigned int reserved[16];

        PNGOption()
        {
            interlaced = false;
            compressionLevel = 6;
            memset(reserved, 0, sizeof(reserved));
        }
    };

    struct PPMOption
    {
        bool binaryFile;
        unsigned int reserved[16];

        PPMOption()
        {
            binaryFile = true;
            memset(reserved, 0, sizeof(reserved));
        }
    };

    struct PGMOption
    {
        bool binaryFile;
        unsigned int reserved[16];

        PGMOption()
        {
            binaryFile = true;
            memset(reserved, 0, sizeof(reserved));
        }
    };

    struct TIFFOption
    {
        TIFFCompressionMethod compression;
        unsigned int reserved[16];

        TIFFOption()
        {
            compression = SPINNAKER_TIFF_COMPRESS_METHOD_LZW;
            memset(reserved, 0, sizeof(reserved));
        }
    };

    struct JPEGOption
    {
        bool progressive;
        unsigned int quality;
        unsigned int reserved[16];

        JPEGOption()
        {
            progressive = false;
            quality = 75;
            memset(reserved, 0, sizeof(reserved));
        }
    };

    struct JPG2Option
    {
        unsigned int quality;
        unsigned int reserved[16];

        JPG2Option()
        {
            quality = 16;
            memset(reserved, 0, sizeof(reserved));
        }
    };

    struct BMPOption
    {
        bool indexedColor_8bit;
        unsigned int reserved[16];

        BMPOption()
        {
            indexedColor_8bit = false;
            memset(reserved, 0, sizeof(reserved));
        }
    };

    struct SIOption
    {
        unsigned int reserved[16];

        SIOption()
        {
            memset(reserved, 0, sizeof(reserved));
        }
    };

    struct GenDCOption
    {
        unsigned int reserved[16];

        GenDCOption()
        {
            memset(reserved, 0, sizeof(reserved));
        }
    };

    struct LibraryVersion
    {
        unsigned int major;

        unsigned int minor;

        unsigned int type;

        unsigned int build;
    };

    struct ActionCommandResult
    {
        unsigned int DeviceAddress; /* IP Address of device that responded to Action Command. */
        ActionCommandStatus Status; /* Action Command status return from device. */
    };

    struct CCMSettings
    {
        CCMApplication Application;           /* Informs Spinnaker to use the CCM optimized for specific application.
                                                 Ignored when CustomCCMCode is not empty. */
        CCMType Type;                         /* The type of CCM affects the color accuracy and conversion speed.
                                                 Ignored when CustomCCMCode is not empty. */
        CCMSensor Sensor;                     /* Informs Spinnaker to use the CCM calibrated for this sensor.
                                                 Ignored when CustomCCMCode is not empty. */
        CCMColorTemperature ColorTemperature; /* Determines the tone of the color correction to be applied.
                                                 Ignored when CustomCCMCode is not empty. */
        CCMColorSpace ColorSpace;             /* Informs Spinnaker whether to apply gamma transformation. */
        std::string CustomCCMCode;            /* Custom encrypted CCM provided by FLIR. */

        CCMSettings()
        {
            Application = SPINNAKER_CCM_APPLICATION_MICROSCOPY;
            Type = SPINNAKER_CCM_TYPE_LINEAR;
            Sensor = SPINNAKER_CCM_SENSOR_IMX250;
            ColorTemperature = SPINNAKER_CCM_COLOR_TEMP_LED_4649K;
            ColorSpace = SPINNAKER_CCM_COLOR_SPACE_SRGB;

            CustomCCMCode = "";
        }
    };

    struct DeviceEventInferenceData
    {
        uint32_t result;  /* inference classification result of the Inference Event */
        float confidence; /* inference confidence result of the Inference Event */
        uint64_t frameID; /* frame ID associated with the inference result of the Inference Event */
    };

    struct DeviceEventExposureEndData
    {
        uint64_t frameID; /* frame ID associated with the Exposure End Event */
    };

    struct ImagePixel
    {
        // u represents horizontal position (analogous to x in Cartesian coordinates, and j in image coordinates (i.e.
        // col, width))
        unsigned int u; // u image coordinate
        // v represents vertical position (analogous to y in Cartesian coordinates, and i in image coordinates (i.e.
        // row, height))
        unsigned int v; // v image coordinate
    };

    struct Stereo3DPoint
    {
        float x;          // x world coordinate
        float y;          // y world coordinate
        float z;          // z world coordinate
        unsigned char r;  // r color component
        unsigned char g;  // g color component
        unsigned char b;  // b color component
        ImagePixel pixel; // Image coordinates
    };

    struct PointCloudParameters
    {
        // Factor by which to reduce the resolution of the point cloud.
        // A decimation factor of 1 means no decimation (full resolution).
        unsigned int decimationFactor;
        // The left boundary of the Region of Interest (ROI) in image coordinates.
        // This represents the minimum U-coordinate in the image (horizontal).
        unsigned int ROIImageLeft;

        // The top boundary of the Region of Interest (ROI) in image coordinates.
        // This represents the minimum V-coordinate in the image (vertical).
        unsigned int ROIImageTop;
        // The right boundary of the Region of Interest (ROI) in image coordinates.
        // This represents the maximum U-coordinate in the image (horizontal).
        unsigned int ROIImageRight;
        // The bottom boundary of the Region of Interest (ROI) in image coordinates.
        // This represents the maximum V-coordinate in the image (vertical).
        unsigned int ROIImageBottom;

        // The minimum X coordinate of the ROI in world space, representing the left boundary (in meters),
        // relative to Sensor 1's image center as the origin.
        float ROIWorldCoordinatesXMin;
        // The maximum X coordinate of the ROI in world space, representing the right boundary (in meters),
        // relative to Sensor 1's image center as the origin.
        float ROIWorldCoordinatesXMax;
        // The minimum Y coordinate of the ROI in world space, representing the bottom boundary (in meters),
        // relative to Sensor 1's image center as the origin.
        float ROIWorldCoordinatesYMin;
        // The maximum Y coordinate of the ROI in world space, representing the top boundary (in meters),
        // relative to Sensor 1's image center as the origin.
        float ROIWorldCoordinatesYMax;
        // The minimum Z coordinate of the ROI in world space, representing the near boundary (in meters),
        // relative to Sensor 1's image center as the origin.
        float ROIWorldCoordinatesZMin;
        // The maximum Z coordinate of the ROI in world space, representing the far boundary (in meters),
        // relative to Sensor 1's image center as the origin.
        float ROIWorldCoordinatesZMax;

        PointCloudParameters()
        {
            decimationFactor = 1;
            ROIImageLeft = 0;
            ROIImageTop = 0;
            ROIImageRight = 2048;
            ROIImageBottom = 1536;
            // Defines a 1km x 1km x 0.5km arbitrary region of interest to ensure sufficient coverage for a single-shot
            // point cloud.
            ROIWorldCoordinatesXMin = -500.0f;
            ROIWorldCoordinatesXMax = 500.0f;
            ROIWorldCoordinatesYMin = -500.0f;
            ROIWorldCoordinatesYMax = 500.0f;
            ROIWorldCoordinatesZMin = 0.0f;
            ROIWorldCoordinatesZMax = 500.0f;
        }
    };

    // Parameters related to the stereo camera's geometry and disparity calculations, such as baseline, focal length,
    // and principal point
    struct StereoCameraParameters
    {
        float coordinateOffset;
        float baseline;
        float focalLength;
        float principalPointU;
        float principalPointV;
        float disparityScaleFactor;
        float invalidDataValue;
        bool invalidDataFlag;
        unsigned int totalDisparity;

        StereoCameraParameters()
        {
            coordinateOffset = 0.0f;
            baseline = 0.24f;
            focalLength = 1300.0f;
            principalPointU = 1024.0f;
            principalPointV = 768.0f;
            disparityScaleFactor = 1 / 64.0f;
            invalidDataValue = 0;
            invalidDataFlag = true;
            totalDisparity = 256;
        }
    };

} // namespace Spinnaker

#endif // FLIR_SPINNAKER_DEFS_H