buffer.cc
Go to the documentation of this file.
1 /*
2  * This file is part of the rc_genicam_api package.
3  *
4  * Copyright (c) 2017 Roboception GmbH
5  * All rights reserved
6  *
7  * Author: Heiko Hirschmueller
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright notice,
13  * this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright notice,
16  * this list of conditions and the following disclaimer in the documentation
17  * and/or other materials provided with the distribution.
18  *
19  * 3. Neither the name of the copyright holder nor the names of its contributors
20  * may be used to endorse or promote products derived from this software without
21  * specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
27  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33  * POSSIBILITY OF SUCH DAMAGE.
34  */
35 
36 #include "buffer.h"
37 #include "stream.h"
38 #include "config.h"
39 
40 #include "gentl_wrapper.h"
41 #include "exception.h"
42 
43 #include <GenApi/ChunkAdapterGEV.h>
44 #include <GenApi/ChunkAdapterU3V.h>
46 
47 namespace rcg
48 {
49 
50 namespace
51 {
52 
53 template<class T> inline T getBufferValue(const std::shared_ptr<const GenTLWrapper> &gentl,
54  void *stream, void *buffer, GenTL::BUFFER_INFO_CMD cmd)
55 {
56  T ret=0;
57 
59  size_t size=sizeof(T);
60 
61  if (stream != 0 && buffer != 0)
62  {
63  gentl->DSGetBufferInfo(stream, buffer, cmd, &type, &ret, &size);
64  }
65 
66  return ret;
67 }
68 
69 inline bool getBufferBool(const std::shared_ptr<const GenTLWrapper> &gentl,
70  void *stream, void *buffer, GenTL::BUFFER_INFO_CMD cmd)
71 {
72  bool8_t ret=0;
73 
75  size_t size=sizeof(ret);
76 
77  if (stream != 0 && buffer != 0)
78  {
79  gentl->DSGetBufferInfo(stream, buffer, cmd, &type, &ret, &size);
80  }
81 
82  return ret != 0;
83 }
84 
85 inline std::string getBufferString(const std::shared_ptr<const GenTLWrapper> &gentl,
86  void *stream, void *buffer, GenTL::BUFFER_INFO_CMD cmd)
87 {
88  std::string ret;
89 
91  char tmp[1024]="";
92  size_t size=sizeof(tmp);
93 
94  if (stream != 0 && buffer != 0)
95  {
96  if (gentl->DSGetBufferInfo(stream, buffer, cmd, &type, &tmp, &size) == GenTL::GC_ERR_SUCCESS)
97  {
98  if (type == GenTL::INFO_DATATYPE_STRING)
99  {
100  ret=tmp;
101  }
102  }
103  }
104 
105  return ret;
106 }
107 
108 template<class T> inline T getBufferPartValue(const std::shared_ptr<const GenTLWrapper> &gentl,
109  void *stream, void *buffer, std::uint32_t part,
111 {
112  T ret=0;
113 
115  size_t size=sizeof(T);
116 
117  if (stream != 0 && buffer != 0)
118  {
119  gentl->DSGetBufferPartInfo(stream, buffer, part, cmd, &type, &ret, &size);
120  }
121 
122  return ret;
123 }
124 
125 }
126 
127 Buffer::Buffer(const std::shared_ptr<const GenTLWrapper> &_gentl, Stream *_parent)
128 {
129  parent=_parent;
130  gentl=_gentl;
131  buffer=0;
132  multipart=false;
133 }
134 
136 {
137  if (chunkadapter)
138  {
139  chunkadapter->DetachBuffer();
140  }
141 }
142 
143 void Buffer::setNodemap(const std::shared_ptr<GenApi::CNodeMapRef> _nodemap, const std::string &tltype)
144 {
145  nodemap=_nodemap;
146  chunkadapter.reset();
147 
148  if (nodemap != 0)
149  {
150  if (getBoolean(nodemap, "ChunkModeActive", false))
151  {
152  if (tltype == "GEV")
153  {
154  chunkadapter=std::shared_ptr<GenApi::CChunkAdapter>(new GenApi::CChunkAdapterGEV(nodemap->_Ptr));
155  }
156  else if (tltype == "U3V")
157  {
158  chunkadapter=std::shared_ptr<GenApi::CChunkAdapter>(new GenApi::CChunkAdapterU3V(nodemap->_Ptr));
159  }
160  else
161  {
162  chunkadapter=std::shared_ptr<GenApi::CChunkAdapter>(new GenApi::CChunkAdapterGeneric(nodemap->_Ptr));
163  }
164  }
165  }
166 }
167 
168 void Buffer::setHandle(void *handle)
169 {
170  buffer=handle;
171 
173  multipart=false;
174 
175  if (buffer != 0)
176  {
177  payload_type=getBufferValue<size_t>(gentl, parent->getHandle(), buffer,
179 
180  multipart=getBufferValue<size_t>(gentl, parent->getHandle(), buffer,
182 
183  if (chunkadapter)
184  {
185  chunkadapter->AttachBuffer(reinterpret_cast<std::uint8_t *>(
186  getBufferValue<void *>(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_BASE)),
187  static_cast<int64_t>(getBufferValue<size_t>(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_SIZE_FILLED)));
188  }
189  }
190  else
191  {
192  if (chunkadapter)
193  {
194  chunkadapter->DetachBuffer();
195  }
196  }
197 }
198 
199 uint32_t Buffer::getNumberOfParts() const
200 {
201  uint32_t ret=0;
202 
203  if (multipart)
204  {
205  gentl->DSGetNumBufferParts(parent->getHandle(), buffer, &ret);
206  }
207  else
208  {
209  size_t type=getBufferValue<size_t>(gentl, parent->getHandle(), buffer,
211 
212  if (type != PAYLOAD_TYPE_CHUNK_ONLY)
213  {
214  ret=1;
215  }
216  }
217 
218  return ret;
219 }
220 
222 {
223  return getBufferValue<void *>(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_BASE);
224 }
225 
226 size_t Buffer::getGlobalSize() const
227 {
228  return getBufferValue<size_t>(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_SIZE);
229 }
230 
231 void *Buffer::getBase(std::uint32_t part) const
232 {
233  if (multipart)
234  {
235  return getBufferPartValue<void *>(gentl, parent->getHandle(), buffer, part,
237  }
238  else
239  {
240  void *ret=getBufferValue<void *>(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_BASE);
241 
242  size_t offset=getBufferValue<size_t>(gentl, parent->getHandle(), buffer,
244 
245  if (offset > 0)
246  {
247  ret=reinterpret_cast<char *>(ret)+offset;
248  }
249 
250  return ret;
251  }
252 }
253 
254 size_t Buffer::getSize(std::uint32_t part) const
255 {
256  if (multipart)
257  {
258  return getBufferPartValue<size_t>(gentl, parent->getHandle(), buffer, part,
260  }
261  else
262  {
263  size_t size=getBufferValue<size_t>(gentl, parent->getHandle(), buffer,
265 
266  size_t offset=getBufferValue<size_t>(gentl, parent->getHandle(), buffer,
268 
269  return size-offset;
270  }
271 }
272 
273 void *Buffer::getUserPtr() const
274 {
275  return getBufferValue<void *>(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_USER_PTR);
276 }
277 
278 uint64_t Buffer::getTimestamp() const
279 {
281  {
282  return getInteger(nodemap, "ChunkTimestamp");
283  }
284 
285  return getBufferValue<uint64_t>(gentl, parent->getHandle(), buffer,
287 }
288 
289 bool Buffer::getNewData() const
290 {
291  return getBufferBool(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_NEW_DATA);
292 }
293 
295 {
296  return getBufferBool(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_IS_QUEUED);
297 }
298 
300 {
301  return getBufferBool(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_IS_ACQUIRING);
302 }
303 
305 {
306  return getBufferBool(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_IS_INCOMPLETE);
307 }
308 
309 std::string Buffer::getTLType() const
310 {
311  return getBufferString(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_TLTYPE);
312 }
313 
314 size_t Buffer::getSizeFilled() const
315 {
316  return getBufferValue<size_t>(gentl, parent->getHandle(), buffer,
318 }
319 
320 size_t Buffer::getPartDataType(uint32_t part) const
321 {
322  if (multipart)
323  {
324  return getBufferPartValue<size_t>(gentl, parent->getHandle(), buffer, part,
326  }
327  else
328  {
329  return 0;
330  }
331 }
332 
333 size_t Buffer::getWidth(std::uint32_t part) const
334 {
335  if (multipart)
336  {
337  return getBufferPartValue<size_t>(gentl, parent->getHandle(), buffer, part,
339  }
340  else
341  {
343  {
344  return getInteger(nodemap, "ChunkWidth");
345  }
346 
347  return getBufferValue<size_t>(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_WIDTH);
348  }
349 }
350 
351 size_t Buffer::getHeight(std::uint32_t part) const
352 {
353  if (multipart)
354  {
355  return getBufferPartValue<size_t>(gentl, parent->getHandle(), buffer, part,
357  }
358  else
359  {
361  {
362  return getInteger(nodemap, "ChunkHeight");
363  }
364 
365  return getBufferValue<size_t>(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_HEIGHT);
366  }
367 }
368 
369 size_t Buffer::getXOffset(std::uint32_t part) const
370 {
371  if (multipart)
372  {
373  return getBufferPartValue<size_t>(gentl, parent->getHandle(), buffer, part,
375  }
376  else
377  {
379  {
380  return getInteger(nodemap, "ChunkOffsetX");
381  }
382 
383  return getBufferValue<size_t>(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_XOFFSET);
384  }
385 }
386 
387 size_t Buffer::getYOffset(std::uint32_t part) const
388 {
389  if (multipart)
390  {
391  return getBufferPartValue<size_t>(gentl, parent->getHandle(), buffer, part,
393  }
394  else
395  {
397  {
398  return getInteger(nodemap, "ChunkOffsetY");
399  }
400 
401  return getBufferValue<size_t>(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_YOFFSET);
402  }
403 }
404 
405 size_t Buffer::getXPadding(std::uint32_t part) const
406 {
407  if (multipart)
408  {
409  return getBufferPartValue<size_t>(gentl, parent->getHandle(), buffer, part,
411  }
412  else
413  {
414  return getBufferValue<size_t>(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_XPADDING);
415  }
416 }
417 
418 size_t Buffer::getYPadding() const
419 {
420  if (multipart)
421  {
422  return 0;
423  }
424 
425  return getBufferValue<size_t>(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_YPADDING);
426 }
427 
428 uint64_t Buffer::getFrameID() const
429 {
430  return getBufferValue<uint64_t>(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_FRAMEID);
431 }
432 
433 bool Buffer::getImagePresent(uint32_t part) const
434 {
435  if (multipart)
436  {
437  size_t type=getBufferPartValue<size_t>(gentl, parent->getHandle(), buffer, part,
439 
440  bool ret;
441 
442  switch (type)
443  {
453  ret=true;
454  break;
455 
456  default:
457  ret=false;
458  break;
459  }
460 
461  return ret;
462  }
463  else
464  {
466  {
467  return true;
468  }
469 
470  return getBufferBool(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_IMAGEPRESENT);
471  }
472 }
473 
475 {
476  return getBufferValue<size_t>(gentl, parent->getHandle(), buffer,
478 }
479 
480 uint64_t Buffer::getPixelFormat(uint32_t part) const
481 {
482  if (multipart)
483  {
484  return getBufferPartValue<uint64_t>(gentl, parent->getHandle(), buffer, part,
486  }
487  else
488  {
490  {
491  return getInteger(nodemap, "ChunkPixelFormat");
492  }
493 
494  return getBufferValue<uint64_t>(gentl, parent->getHandle(), buffer,
496  }
497 }
498 
499 uint64_t Buffer::getPixelFormatNamespace(uint32_t part) const
500 {
501  if (multipart)
502  {
503  return getBufferPartValue<uint64_t>(gentl, parent->getHandle(), buffer, part,
505  }
506  else
507  {
508  return getBufferValue<uint64_t>(gentl, parent->getHandle(), buffer,
510  }
511 }
512 
513 uint64_t Buffer::getPartSourceID(std::uint32_t part) const
514 {
515  if (multipart)
516  {
517  return getBufferPartValue<uint64_t>(gentl, parent->getHandle(), buffer, part,
519  }
520  else
521  {
522  return 0;
523  }
524 }
525 
526 size_t Buffer::getDeliveredImageHeight(uint32_t part) const
527 {
528  if (multipart)
529  {
530  return getBufferPartValue<size_t>(gentl, parent->getHandle(), buffer, part,
532  }
533  else
534  {
536  {
537  return getInteger(nodemap, "ChunkHeight");
538  }
539 
540  return getBufferValue<size_t>(gentl, parent->getHandle(), buffer,
542  }
543 }
544 
546 {
547  return getBufferValue<size_t>(gentl, parent->getHandle(), buffer,
549 }
550 
551 uint64_t Buffer::getChunkLayoutID() const
552 {
553  return getBufferValue<uint64_t>(gentl, parent->getHandle(), buffer,
555 }
556 
557 std::string Buffer::getFilename() const
558 {
559  return getBufferString(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_FILENAME);
560 }
561 
563 {
564  bool ret=false;
565 
567  int32_t v;
568  size_t size=sizeof(v);
570 
571  if (parent->getHandle() != 0 && buffer != 0)
572  {
574  &type, &v, &size);
575 
576  if (err == GenTL::GC_ERR_SUCCESS && type == GenTL::INFO_DATATYPE_INT32 &&
578  {
579  ret=true;
580  }
581  }
582 
583  return ret;
584 }
585 
586 size_t Buffer::getDataSize() const
587 {
588  return getBufferValue<size_t>(gentl, parent->getHandle(), buffer, GenTL::BUFFER_INFO_DATA_SIZE);
589 }
590 
591 uint64_t Buffer::getTimestampNS() const
592 {
593  uint64_t ret=getBufferValue<uint64_t>(gentl, parent->getHandle(), buffer,
595 
596  // if timestamp in nano seconds is not available, then compute it from
597  // timestamp and device frequency
598 
599  if (ret == 0)
600  {
601  const uint64_t ns_freq=1000000000ul;
602  uint64_t freq=parent->getParent()->getTimestampFrequency();
603 
604  if (freq == 0)
605  {
606  freq=ns_freq;
607  }
608 
609  ret=getBufferValue<uint64_t>(gentl, parent->getHandle(), buffer,
611 
612  if (freq != ns_freq)
613  {
614  ret=ret/freq*ns_freq+(ns_freq*(ret%freq))/freq;
615  }
616  }
617 
618  return ret;
619 }
620 
622 {
623  return getBufferBool(gentl, parent->getHandle(), buffer,
625 }
626 
628 {
630  {
631  return true;
632  }
633 
634  return getBufferBool(gentl, parent->getHandle(), buffer,
636 }
637 
638 void *Buffer::getHandle() const
639 {
640  return buffer;
641 }
642 
644 {
645  int p=1;
646  char *c=reinterpret_cast<char *>(&p);
647 
648  if (c[0] == 1)
649  {
650  return false;
651  }
652 
653  return true;
654 }
655 
656 }
size_t getDeliveredImageHeight(std::uint32_t part) const
Returns the number of lines that are delivered in this buffer.
Definition: buffer.cc:526
size_t getDataSize() const
Returns the size of data intended to the written to the buffer the last time it has been filled...
Definition: buffer.cc:586
bool getBoolean(const std::shared_ptr< GenApi::CNodeMapRef > &nodemap, const char *name, bool exception, bool igncache)
Get the value of a boolean feature of the given nodemap.
Definition: config.cc:497
size_t getYPadding() const
Returns vertical padding of the data in the buffer in bytes.
Definition: buffer.cc:418
Connects a chunked DCAM buffer to a node map.
Stream * parent
Definition: buffer.h:473
bool multipart
Definition: buffer.h:477
size_t getSizeFilled() const
Returns the number of bytes written into the buffer last time it has been filled. ...
Definition: buffer.cc:314
std::shared_ptr< const GenTLWrapper > gentl
Definition: buffer.h:474
uint64_t getChunkLayoutID() const
Returns the chunk layout id, which serves as an indicator that the chunk layout has changed and the a...
Definition: buffer.cc:551
std::string getFilename() const
Returns the filename in case the payload contains a file.
Definition: buffer.cc:557
Declaration of the CChunkAdapterGeneric class.
void * getHandle() const
Get internal stream handle.
Definition: buffer.cc:638
int32_t BUFFER_INFO_CMD
Definition: GenTL_v1_5.h:434
size_t getXPadding(std::uint32_t part) const
Returns horizontal padding of the data in the buffer in bytes.
Definition: buffer.cc:405
__int64 int64_t
Definition: config-win32.h:21
int64_t getInteger(const std::shared_ptr< GenApi::CNodeMapRef > &nodemap, const char *name, int64_t *vmin, int64_t *vmax, bool exception, bool igncache)
Get the value of an integer feature of the given nodemap.
Definition: config.cc:542
int32_t BUFFER_PART_INFO_CMD
Definition: GenTL_v1_5.h:454
std::shared_ptr< GenApi::CNodeMapRef > nodemap
Definition: buffer.h:479
bool getIsQueued() const
Signals if the buffer is associated to the input or output queue.
Definition: buffer.cc:294
std::shared_ptr< Device > getParent() const
Returns the pointer to the parent device object.
Definition: stream.cc:83
size_t getWidth(std::uint32_t part) const
Returns the width of the image in pixel.
Definition: buffer.cc:333
uint64_t getPartSourceID(std::uint32_t part) const
Returns the source id of the specified part.
Definition: buffer.cc:513
int32_t GC_ERROR
Definition: GenTL_v1_5.h:181
size_t getPayloadType() const
Returns the payload type according to PAYLOADTYPE_INFO_IDS.
Definition: buffer.cc:474
uint64_t getTimestamp() const
Returns the timestamp of the buffer.
Definition: buffer.cc:278
void * getGlobalBase() const
Returns the global base address of the buffer memory.
Definition: buffer.cc:221
void * getBase(std::uint32_t part) const
Returns the base address of the specified part of the multi-part buffer.
Definition: buffer.cc:231
Declaration of the CChunkAdapterGEV class.
void * buffer
Definition: buffer.h:475
uint64_t getPixelFormat(std::uint32_t part) const
Returns the pixel format of the specified part as defined in the PFNC.
Definition: buffer.cc:480
std::shared_ptr< GenApi::CChunkAdapter > chunkadapter
Definition: buffer.h:480
uint8_t bool8_t
Definition: GenTL_v1_5.h:105
size_t getDeliveredChunkPayloadSize() const
Returnes the delivered chung payload size.
Definition: buffer.cc:545
void * getHandle() const
Get internal stream handle.
Definition: stream.cc:523
void setNodemap(const std::shared_ptr< GenApi::CNodeMapRef > nodemap, const std::string &tltype)
Set the device nodemap.
Definition: buffer.cc:143
size_t getPartDataType(uint32_t part) const
Returns the data type id of the specified part as defined in PARTDATATYPE_IDS.
Definition: buffer.cc:320
bool getContainsChunkdata() const
Returns if the buffer contains chunk data.
Definition: buffer.cc:627
uint64_t getTimestampNS() const
Returns the acquisition timestamp of the data in this buffer in ns.
Definition: buffer.cc:591
Buffer(const std::shared_ptr< const GenTLWrapper > &gentl, Stream *parent)
Constructs a buffer class as wrapper around a buffer handle.
Definition: buffer.cc:127
size_t payload_type
Definition: buffer.h:476
bool isBigEndian() const
Returns if the data is given as big or little endian.
Definition: buffer.cc:562
bool getDataLargerThanBuffer() const
Signals if the memory that was allocated for this buffer is too small.
Definition: buffer.cc:621
bool isHostBigEndian()
Definition: buffer.cc:643
size_t getGlobalSize() const
Returns the global size of the buffer.
Definition: buffer.cc:226
uint64_t getPixelFormatNamespace(std::uint32_t part) const
Returns the pixel format namespace, which preferably should be PIXELFORMAT_NAMESPACE_PFNC_32BIT.
Definition: buffer.cc:499
void * getUserPtr() const
Returns the private data pointer of the GenTL Consumer.
Definition: buffer.cc:273
Connects a generic chunked buffer to a node map.
Definition: buffer.cc:47
bool getIsAcquiring() const
Signals if the buffer is currently being filled with data.
Definition: buffer.cc:299
bool getImagePresent(std::uint32_t part) const
Returns if a 2D, 3D or confidence image is present in the specified part.
Definition: buffer.cc:433
bool getIsIncomplete() const
Signals if the buffer is incomplete due to an error.
Definition: buffer.cc:304
uint64_t getFrameID() const
Returns the sequentially incremented number of the frame.
Definition: buffer.cc:428
size_t getYOffset(std::uint32_t part) const
Returns the vertical offset of the data in the buffer in lines from the image origin to handle areas ...
Definition: buffer.cc:387
bool getNewData() const
Returns if the buffer contains new data.
Definition: buffer.cc:289
void setHandle(void *handle)
Set the buffer handle that this object should manage.
Definition: buffer.cc:168
size_t getXOffset(std::uint32_t part) const
Returns the horizontal offset of the data in the buffer in pixels from the image origin to handle are...
Definition: buffer.cc:369
size_t getHeight(std::uint32_t part) const
Returns the height of the image in pixel.
Definition: buffer.cc:351
int32_t INFO_DATATYPE
Definition: GenTL_v1_5.h:258
Connects a chunked U3V buffer to a node map.
The stream class encapsulates a Genicam stream.
Definition: stream.h:55
size_t getSize(std::uint32_t part) const
Returns the size of the specified part of the mult-part buffer.
Definition: buffer.cc:254
Declaration of the CChunkAdapterU3V class.
std::uint32_t getNumberOfParts() const
Returns the number of parts, excluding chunk data.
Definition: buffer.cc:199
std::string getTLType() const
Returns the type the used transport layer.
Definition: buffer.cc:309


rc_genicam_api
Author(s): Heiko Hirschmueller
autogenerated on Wed Mar 17 2021 02:48:40