quadEM  7-0
NDArray.h
Go to the documentation of this file.
1 
12 #ifndef NDArray_H
13 #define NDArray_H
14 
15 #include <set>
16 
17 #include <epicsMutex.h>
18 #include <epicsTime.h>
19 #include <ellLib.h>
20 
21 #include "NDAttribute.h"
22 #include "NDAttributeList.h"
23 #include "Codec.h"
24 
26 #define ND_ARRAY_MAX_DIMS 10
27 
29 typedef enum
30 {
40 
45 typedef enum
46 {
52 
54 typedef struct NDDimension {
55  size_t size;
56  size_t offset;
61  int binning;
65  int reverse;
70 
72 typedef struct NDArrayInfo {
73  size_t nElements;
75  size_t totalBytes;
79  int xDim;
80  int yDim;
81  int colorDim;
82  size_t xSize;
83  size_t ySize;
84  size_t colorSize;
85  size_t xStride;
86  size_t yStride;
87  size_t colorStride;
89 
94 public:
95  /* Methods */
96  NDArray();
97  NDArray(int ndims, size_t *dims, NDDataType_t dataType, size_t dataSize, void *pData);
98  virtual ~NDArray();
99  int initDimension (NDDimension_t *pDimension, size_t size);
100  static int computeArrayInfo(int ndims, size_t *dims, NDDataType_t dataType, NDArrayInfo *pInfo);
101  int getInfo (NDArrayInfo_t *pInfo);
102  int reserve();
103  int release();
104  int getReferenceCount() const {return referenceCount;}
105  int report(FILE *fp, int details);
106  friend class NDArrayPool;
107 
108 private:
109  ELLNODE node;
110  int referenceCount;
112 public:
115  int uniqueId;
116  double timeStamp;
118  epicsTimeStamp epicsTS;
120  int ndims;
123  size_t dataSize;
125  void *pData;
130  size_t compressedSize;
131 };
132 
133 // This class defines the object that is contained in the std::multilist for sorting NDArrays in the freeList_.
134 // It defines the < operator to use the NDArray::dataSize field as the sort key
135 
136 // We would like to hide this class definition in NDArrayPool.cpp and just forward reference it here.
137 // That works on Visual Studio, and on gcc if instantiating plugins as heap variables with "new", but fails on gcc
138 // if instantiating plugins as automatic variables.
139 //class sortedListElement;
140 
142  public:
143  freeListElement(NDArray *pArray, size_t dataSize) {
144  pArray_ = pArray;
145  dataSize_ = dataSize;}
146  friend bool operator<(const freeListElement& lhs, const freeListElement& rhs) {
147  return (lhs.dataSize_ < rhs.dataSize_);
148  }
150  size_t dataSize_;
151  private:
152  freeListElement(); // Default constructor is private so objects cannot be constructed without arguments
153 };
154 
163 public:
164  NDArrayPool (class asynNDArrayDriver *pDriver, size_t maxMemory);
165  virtual ~NDArrayPool() {}
166  NDArray* alloc(int ndims, size_t *dims, NDDataType_t dataType, size_t dataSize, void *pData);
167  NDArray* copy(NDArray *pIn, NDArray *pOut, bool copyData, bool copyDimensions=true, bool copyDataType=true);
168 
169  int reserve(NDArray *pArray);
170  int release(NDArray *pArray);
171  int convert(NDArray *pIn,
172  NDArray **ppOut,
173  NDDataType_t dataTypeOut,
174  NDDimension_t *outDims);
175  int convert(NDArray *pIn,
176  NDArray **ppOut,
177  NDDataType_t dataTypeOut);
178  int report(FILE *fp, int details);
179  int getNumBuffers();
180  size_t getMaxMemory();
181  size_t getMemorySize();
182  int getNumFree();
183  void emptyFreeList();
184 
185 protected:
189  virtual NDArray* createArray();
190  virtual void onAllocateArray(NDArray *pArray);
191  virtual void onReserveArray(NDArray *pArray);
192  virtual void onReleaseArray(NDArray *pArray);
193 
194 private:
195  std::multiset<freeListElement> freeList_;
196  epicsMutexId listLock_;
197  int numBuffers_;
198  size_t maxMemory_;
199  size_t memorySize_;
200  class asynNDArrayDriver *pDriver_;
201 };
202 
203 #endif
RGB image with row color interleave, data array is [NX, 3, NY].
Definition: NDArray.h:34
size_t colorSize
The color size of the array.
Definition: NDArray.h:84
NDDataType_t
Enumeration of NDArray data types.
Definition: NDAttribute.h:29
struct NDDimension NDDimension_t
Structure defining a dimension of an NDArray.
size_t colorStride
The number of array elements between color values.
Definition: NDArray.h:87
YUV image, 6 bytes encodes 4 RGB pixels.
Definition: NDArray.h:38
The NDArrayPool class manages a free list (pool) of NDArray objects.
Definition: NDArray.h:162
First line GBGB, second line RGRG...
Definition: NDArray.h:48
epicsTimeStamp epicsTS
The epicsTimeStamp; this is set with pasynManager-&gt;updateTimeStamp(), and can come from a user-define...
Definition: NDArray.h:118
size_t dataSize
Data size for this array; actual amount of memory allocated for *pData, may be more than required to ...
Definition: NDArray.h:123
#define ND_ARRAY_MAX_DIMS
NDArray.h.
Definition: NDArray.h:26
NDColorMode_t colorMode
The color mode.
Definition: NDArray.h:78
size_t xSize
The X size of the array.
Definition: NDArray.h:82
First line RGRG, second line GBGB...
Definition: NDArray.h:47
Structure returned by NDArray::getInfo.
Definition: NDArray.h:72
size_t ySize
The Y size of the array.
Definition: NDArray.h:83
size_t offset
The offset relative to the origin of the original data source (detector, for example).
Definition: NDArray.h:56
RGB image with pixel color interleave, data array is [3, NX, NY].
Definition: NDArray.h:33
int bytesPerElement
The number of bytes per element in the array.
Definition: NDArray.h:74
RGB image with plane color interleave, data array is [NX, NY, 3].
Definition: NDArray.h:35
Codec_t codec
Definition of codec used to compress the data.
Definition: NDArray.h:129
NDDataType_t dataType
Data type for this array.
Definition: NDArray.h:122
friend bool operator<(const freeListElement &lhs, const freeListElement &rhs)
Definition: NDArray.h:146
Structure defining a dimension of an NDArray.
Definition: NDArray.h:54
int uniqueId
A number that must be unique for all NDArrays produced by a driver after is has started.
Definition: NDArray.h:115
size_t size
The number of elements in this dimension of the array.
Definition: NDArray.h:55
int xDim
The array index which is the X dimension.
Definition: NDArray.h:79
struct NDArrayInfo NDArrayInfo_t
Structure returned by NDArray::getInfo.
int ndims
The number of dimensions in this array; minimum=1.
Definition: NDArray.h:120
This is the class from which NDArray drivers are derived; implements the asynGenericPointer functions...
Definition: asynNDArrayDriver.h:132
NDArray * pArray_
Definition: NDArray.h:149
int getReferenceCount() const
Definition: NDArray.h:104
class asynNDArrayDriver * pDriver
The asynNDArrayDriver that created this array.
Definition: NDArray.h:114
Definition: Codec.h:20
NDAttributeList.h.
Definition: NDAttributeList.h:21
NDBayerPattern_t
Enumeration of Bayer patterns for NDArray attribute &quot;bayerPattern&quot;.
Definition: NDArray.h:45
NDColorMode_t
Enumeration of color modes for NDArray attribute &quot;colorMode&quot;.
Definition: NDArray.h:29
size_t xStride
The number of array elements between X values.
Definition: NDArray.h:85
Bayer pattern image, 1 value per pixel but with color filter on detector.
Definition: NDArray.h:32
size_t nElements
The total number of elements in the array.
Definition: NDArray.h:73
First line GRGR, second line BGBG...
Definition: NDArray.h:49
int binning
The binning (pixel summation, 1=no binning) relative to original data source (detector, for example) The offset value is cumulative, so if a plugin such as NDPluginROI performs binning, the binning is expressed relative to the pixels in the detector and not to the possibly binned pixels passed to NDPluginROI.
Definition: NDArray.h:61
void * pData
Pointer to the array data.
Definition: NDArray.h:125
virtual ~NDArrayPool()
Definition: NDArray.h:165
int reverse
The orientation (0=normal, 1=reversed) relative to the original data source (detector, for example) This value is cumulative, so if a plugin such as NDPluginROI reverses the data, the value must reflect the orientation relative to the original detector, and not to the possibly reversed data passed to NDPluginROI.
Definition: NDArray.h:65
Definition: NDArray.h:141
size_t dataSize_
Definition: NDArray.h:150
size_t yStride
The number of array elements between Y values.
Definition: NDArray.h:86
YUV image, 3 bytes encodes 1 RGB pixel.
Definition: NDArray.h:36
First line BGBG, second line GRGR...
Definition: NDArray.h:50
size_t totalBytes
The total number of bytes required to hold the array; this may be less than NDArray::dataSize.
Definition: NDArray.h:75
N-dimensional array class; each array has a set of dimensions, a data type, pointer to data...
Definition: NDArray.h:93
#define ADCORE_API
Definition: ADCoreAPI.h:41
class NDArrayPool * pNDArrayPool
The NDArrayPool object that created this array.
Definition: NDArray.h:113
NDAttributeList * pAttributeList
Linked list of attributes.
Definition: NDArray.h:128
double timeStamp
The time stamp in seconds for this array; seconds since EPICS epoch (00:00:00 UTC, January 1, 1990) is recommended, but some drivers may use a different start time.
Definition: NDArray.h:116
freeListElement(NDArray *pArray, size_t dataSize)
Definition: NDArray.h:143
YUV image, 4 bytes encodes 2 RGB pixel.
Definition: NDArray.h:37
int yDim
The array index which is the Y dimension.
Definition: NDArray.h:80
Monochromatic image.
Definition: NDArray.h:31
int colorDim
The array index which is the color dimension.
Definition: NDArray.h:81
size_t compressedSize
Size of the compressed data.
Definition: NDArray.h:130