/*********************************************************************** * * Description of file: * Definition of FFF fileformat * ***********************************************************************/ #ifndef FFF_H #define FFF_H /*=====================================================================*/ #define FLIR_FILE_FORMAT 0x46464600 // FFF\0 #define FILE_FORMAT_VERSION 100 // 1.00 #define FFF_EXT "FFF" // Default file name extension #define SYSIMG_NAMELEN 15 enum {FFF_HDR_SWAP_PATTERN = 0x0001}; // Bit mask for trig types #define FPGA_TRIG_TYPE_MARK 0x01 #define FPGA_TRIG_TYPE_MARK_START 0x02 #define FPGA_TRIG_TYPE_MARK_STOP 0x04 #define FPGA_TRIG_TYPE_MARK_ENABLE 0x08 // Enable image flow #define FPGA_TRIG_TYPE_MARK_DISABLE 0x10 // Disable image flow #define FPGA_TRIG_STATE_DEASSERTED 0 #define FPGA_TRIG_STATE_ASSERTED 1 struct _fpgaheader_t { BYTE major; BYTE minor; BYTE dp1_trig_type; // Digital port 1, trig type BYTE dp2_trig_type; // Digital port 2, trig type BYTE dp1_frame_ts; // Digital port 1, frame time stamp BYTE dp1_line_ts_MSB; // Digital port 1, line time stamp (MSB) BYTE dp1_line_ts_LSB; // Digital port 1, line time stamp (LSB) BYTE dp2_frame_ts; // Digital port 2, frame time stamp BYTE dp2_line_ts_MSB; // Digital port 2, line time stamp (MSB) BYTE dp2_line_ts_LSB; // Digital port 2, line time stamp (LSB) BYTE dp1_trig_state; // Digital port 1, trig state BYTE dp2_trig_state; // Digital port 2, trig state BYTE frame_cnt_MSB; BYTE frame_cnt_LSB; BYTE reserved[18]; }; typedef struct _fpgaheader_t FPGA_HEADER; // main types typedef enum { /* General tags */ FFF_TAGID_FREE = 0, /* Marks unused tag descriptor */ FFF_TAGID_Pixels = 1, FFF_TAGID_GainMap = 2, FFF_TAGID_OffsMap = 3, FFF_TAGID_DeadMap = 4, FFF_TAGID_GainDeadMap = 5, FFF_TAGID_CoarseMap = 6, FFF_TAGID_ImageMap = 7, FFF_TAGID_SubFlirFileHead = 0x1e, FFF_general_high = 0x1f, /* Reserve space for other general tags */ /* FLIR TAGs */ FFF_TAGID_BasicData = 0x20, FFF_TAGID_Measure, FFF_TAGID_ColorPal, FFF_TAGID_TextComment, FFF_TAGID_VoiceComment, FFF_TAGID_matrix_high = 0x3f, /* reserve space for other system image blocks */ /* FLIR Boston reserved TAG number series */ FFF_TAGID_Boston_reserved = 0x40, FFF_TAGID_Boston_reserved_high = 0x5f, FFF_highnum = 0x100 /* Guarantee 2 bytes enum */ } TAG_MAIN_T; /* Sub Tags for FFF_TAGID_Pixels */ enum {FFF_Pixels_BE = 1, /* Big endian pixel data block */ FFF_Pixels_LE = 2, /* Little endian pixel data block */ FFF_Pixels_PNG = 3 /* PNG compressed pixel data block (BE or LE) */ }; /* When appropriate, add subID enums for other TAG_MAIN_T too */ /* When subtype isn't used, fill subtype with FFF_SubID_default */ enum {FFF_SubID_default = 1}; #pragma pack(push,1) typedef struct tagFLIRFILEHEAD { char szFormatID[4]; /* Fileformat ID 'FFF\0' 4 4 */ char szOrigin[16]; /* File origin 16 20 */ unsigned long dwVersion; /* File format version 4 24 */ unsigned long dwIndexOff; /* Pointer to indexes 4 28 */ unsigned long dwNumUsedIndex;/* Number of indexes 4 32 */ unsigned long dwNextID; /* Next free index ID 4 36 */ unsigned short usSwapPattern;/* Swap pattern (0=MSBF) 2 38 */ unsigned short usSpare[7]; /* Spare 14 52 */ unsigned long reserved[2]; /* reserved 8 60 */ unsigned long dwChecksum; /* Head & index checksum 4 64 bytes */ } FLIRFILEHEAD; typedef struct _geometric_info_t { /** Size of one pixel in bytes. Normal size is 2 bytes (16 bit pixels) or 3 (for colorized YCbCr pixels) */ unsigned short pixelSize; unsigned short imageWidth; //!< Image width in pixels unsigned short imageHeight; //!< Image height in pixels /** @name Upper left coordinates X and Y coordinates for upper left corner relative original in case this image is a cutout, normally 0 */ /*@{*/ unsigned short upperLeftX; unsigned short upperLeftY; /*@}*/ /** @name Valid pixels The following four number identifies the valid pixels area within the image. Sometimes the first row and column only contains calibration pixels that should not be considered as real pixels */ /*@{*/ unsigned short firstValidX; //!< Normally 0 unsigned short lastValidX; //!< Normally imageWidth - 1 unsigned short firstValidY; //!< Normally 0 unsigned short lastValidY; //!< Normally imageHeight - 1 /*@}*/ unsigned short detectorDeep; //!< Number of bits from detector A/D /** Type of detector to be able to differ between technologies if necessary. Defined in AppCore/core_imgflow/imgflow_state.hpp */ unsigned short detectorID; /** Type of upsampling from Detector to IR pixels. Defined in AppCore/core_imgflow/imgflow_state.hpp */ unsigned short upSampling; unsigned short frameCtr; //!< Image number from frame buffer unsigned short minMeasRadius; //!< See AppCore/core_imgflow/imgflow_state.hpp for reference unsigned char stripeFields; //!< Number of striped fields this image consists of unsigned char reserved; //!< For future use - should be set to 0 unsigned short reserved1; //!< For future use - should be set to 0 } GEOMETRIC_INFO_T; //!< sizeof struct == 32 bytes struct IMAGEINFO_T { unsigned long imageTime; //!< Time in seconds since 1970-01-01 00:00 (UTC) unsigned long imageMilliTime; //!< Milliseconds since last second short timeZoneBias; //!< Time zone bias in minutes //! UTC = local time + bias short swReserved1; //!< filler == 0 long focusPos; //!< Focus position as counter value float fTSTemp[7]; //!< Temp sensor values converted to Kelvin float fTSTempExt[4]; //!< Lens temp sensors et.c. Converted to Kelvin unsigned short trigInfoType; //!< 0 = No info, 1 = THV 900 type info unsigned short trigHit; //!< hit count - microsecs from trig //! reference unsigned short trigFlags; //!< trig flags, type dependent unsigned short reserved1; unsigned long trigCount; //!< trig counter short manipulType; //!< defines how to interpret manipFactors short manipFactors[5]; //!< Used average factors /** Detecor settings - camera type dependent */ long detectorPars[20]; //!< Currently used detector parameters like //! used bias, offsets. Usage is camera //! dependent long reserved[5]; //!< For future use }; //!< sizeof struct == 184 bytes /** Distribution information */ struct DISTR_DATA_T { /** Framegrab independent distribution data */ char imgName[16]; /* (4 longs) */ unsigned short distrLive; //!< TRUE (1) when image distribution is //! 'LIVE'. FALSE (0) otherwise unsigned short distrRecalled; //!< TRUE (1) when image distribution is //! recalled. FALSE (0) otherwise. //!< TRUE also implies that distrLive == //! FALSE long curGlobalOffset; float curGlobalGain; //!< globalOffset/Gain to generate LUT from //! updated continously when live only #define regulationOn 1 unsigned short regulMethodMask; //!< Method used for o/g calculation unsigned short visualImage; //!< TRUE (1) for TV (visual) //! FALSE (0) for IR image float focusDistance; //!< focusDistance in meters. //! 0 means not defined. //! NOT calculated by image source unsigned short StripeHeight; //!< 0 = not striped unsigned short StripeStart; //!< Striping start line if striped unsigned short imageFreq; //!< Image frequency, defines the nominal //! image frequency in Hz unsigned short typePixStreamCtrlData; //!< 0 = no such data, //! other types TBD unsigned short PixStreamDataLine; //!< At which line to find //! PixStreamCtrlData if any #define IMGSMSK_INVALID 0x1 // Bit set means that image is non-measurable. Possibly because of a ongoing NUC. #define IMGSMSK_ILL_LENS 0x2 // Measurement functions etc should be invalidated. #define IMGSMSK_NONLINEAR 0x4 // Bit set means that (live) image is nonlinear (and therefore non-measurable). #define IMGSMSK_LSLOCKED 0x8 // Bit set means that (live) image should be locked for level/span/distr updates, but not palette changes #define IMGSMSK_BMP_RECALL 0x10 // Bit set means that a CSI bmp image is recalled. (Lut shall be updated even if image is non-measurable) short errStatus; //!< bit field, mask definitions above unsigned short imageMilliFreq; //!< Image frequency, milliHz part of imageFreq short reserved; //!< For future use long reserved2[3]; }; //!< sizeof struct == 64 bytes typedef struct _pres_par_t { signed long level; /* Level as normalized pixel value (apix), Level is defined as middle of span (in pixel units) */ signed long span; /* Span as normalized pixel value (apix) */ BYTE reserved[40]; } PRES_PAR_T; /* sizeof struct == 48 bytes */ /** * FFF tag index */ typedef struct tagFLIRFILEINDEX { USHORT wMainType; /**< Main type of index 2 2 Should be one of TAG_MAIN_T */ USHORT wSubType; /**< Sub type of index 2 4 */ ULONG dwVersion; /**< Version for data 4 8 */ ULONG dwIndexID; /**< Index ID 4 12 */ ULONG dwDataPtr; /**< Pointer to data 4 16 */ ULONG dwDataSize; /**< Size of data 4 20 */ ULONG dwParent; /**< Parentnr 4 24 may be set to 0 when not used */ ULONG dwObjectNr; /**< This object nr 4 28 may be set to 0 when not used */ ULONG dwChecksum; /**< Data checksum 4 32 bytes dwChecksum is a checksum of the tag data block. It may be set to 0 when not used. The algorithm is CRC32 with the Ethernet polynom. */ } FLIRFILEINDEX; /** * Object parameters * */ struct OBJECT_PAR_T { float emissivity; //!< 0 - 1 float objectDistance; //!< Meters float ambTemp; //!< degrees Kelvin float atmTemp; /**< degrees Kelvin - should be set == ambTemp for basic S/W */ float extOptTemp; /**< degrees Kelvin - should be set = ambTemp for basic S/W */ float extOptTransm; //!< 0 - 1: should be set = 1.0 for basic S/W float estAtmTransm; //!< 0 - 1: should be set = 0.0 for basic S/W float relHum; //!< relative humidity long reserved[4]; //!< For future use - should be set to 0 }; //!< sizeof struct == 48 bytes struct TEMP_CALIB_T { long Reserved1[2]; float R; //!< Calibration constant R float B; //!< Calibration constant B float F; //!< Calibration constant F long Reserved2[3]; float alpha1; /* Attenuation for atmosphere without water vapor. */ float alpha2; /* Attenuation for atmosphere without water vapor */ float beta1; /* Attenuation for water vapor */ float beta2; /* Attenuation for water vapor */ float X; /* Scaling factor for attenuation. */ long Reserved3[3]; float tmax; //!< Upper temp limit [K] when calibrated for //!< current temp range float tmin; //!< Lower temp limit [K] when calibrated for //!< current temp range float tmaxClip; //!< Upper temp limit [K] over which the //!< calibration becomes invalid float tminClip; //!< Lower temp limit [K] under which the //!< calibration becomes invalid float tmaxWarn; //!< Upper temp limit [K] over which the //!< calibration soon will become invalid float tminWarn; //!< Lower temp limit [K] under which the //!< calibration soon will become invalid float tmaxSaturated; //!< Upper temp limit [K] over which pixels //!< should be presented with overflow color float tminSaturated; //!< Lower temp limit [K] for saturation //!< (see also ADJUST_PAR_T:ipixOverflow). //!< ipix over/under flow should be calculated //!< by imgsrc from tmin/maxSaturated. //!< LUT handler should look at ipix //!< over/underflow. long Reserved4[9]; }; //!< sizeof struct == 132 bytes /* Adjust parameters ----------------- */ typedef struct _adjust_par_t { long normOffset; /* Temperature compensation offset (globalOffset) */ float normGain; /* Temperature compensation gain (globalGain) */ unsigned short ipixUnderflow; /* Image pixel underflow limit */ unsigned short ipixOverflow; /* Image pixel overflow limit */ long Reserved2[9]; } ADJUST_PAR_T; /* sizeof struct == 48 bytes */ /** Temp sensor data struct */ struct TEMPSENSOR_DATA_T { float fTSTemp; //!< Converted to Kelvin char pzTSName[SYSIMG_NAMELEN+1]; ULONG captureTime; //!< TS updated; time in seconds since 1970-01-01 00:00 ULONG captureMilliTime; //!< TS updated; Milliseconds since last second }; //!< sizeof struct == 28 bytes /** Detector parameter struct */ struct DETECTOR_PARAM_T { float fData; char pzDPName[SYSIMG_NAMELEN+1]; }; //!< sizeof struct == 20 bytes /** Extended image info (more tempsensor and detector data) */ struct EXTENDED_IMAGEINFO_T { TEMPSENSOR_DATA_T tsData[20]; //!< Temp sensor data DETECTOR_PARAM_T detectorPars[20]; //!< Currently used detector parameters like //! used bias, offsets. Usage is camera //! dependent }; //!< sizeof struct == 960 bytes struct _bidata_t { GEOMETRIC_INFO_T GeometricInfo; // 32 bytes OBJECT_PAR_T ObjectParameters; TEMP_CALIB_T CalibParameters; BYTE CalibInfo[564]; ADJUST_PAR_T AdjustParameters; PRES_PAR_T PresentParameters; BYTE DisplayParameters[28]; IMAGEINFO_T ImageInfo; DISTR_DATA_T DistributionData; EXTENDED_IMAGEINFO_T ExtendedImageInfo; }; typedef struct _bidata_t BI_DATA_T; struct _fff_header_t { FLIRFILEHEAD header; FLIRFILEINDEX itag; FLIRFILEINDEX btag; }; typedef struct _fff_header_t FFF_FILE_HEADER; #define BASICDATAREV 102 #define IMAGEPIXELREV 100L #pragma pack(pop) /*---------------------------------------------------------------------*/ /* #endif for fff.h include */ /*---------------------------------------------------------------------*/ #endif