31#ifndef DWFRAMEWORK_DWNODES_COMMON_CHANNELPACKETIMPL_HPP_
32#define DWFRAMEWORK_DWNODES_COMMON_CHANNELPACKETIMPL_HPP_
34#include <dw/egomotion/EgomotionState.h>
35#include <dw/image/Image.h>
36#include <dw/imageprocessing/features/FeatureList.h>
37#include <dw/imageprocessing/pyramid/Pyramid.h>
38#include <dw/interop/streamer/ImageStreamer.h>
39#include <dw/pointcloudprocessing/pointcloud/PointCloud.h>
40#include <dw/roadcast/base_types/RoadCastBaseTypes.h>
41#include <dw/sensors/Codec.h>
42#include <dw/sensors/lidar/Lidar.h>
63 auto* props = specimen.
getData<dwImageProperties>();
72 throw Exception(DW_INVALID_ARGUMENT,
"Invalid reference data provided.");
100 if (m_prop.type != DW_IMAGE_CPU)
104 FRWK_CHECK_DW_ERROR(dwImageStreamer_initialize(&m_streamerToCPU, &m_prop, DW_IMAGE_CPU, ctx));
108 dwImageProperties cpuProp = m_prop;
109 cpuProp.type = DW_IMAGE_CPU;
111 if (m_prop.type != DW_IMAGE_CPU)
113 FRWK_CHECK_DW_ERROR(dwImageStreamer_initialize(&m_streamerFromCPU, &cpuProp, m_prop.type, ctx));
117 FRWK_CHECK_DW_ERROR(dwImage_getDataLayout(&m_elementSize, &m_planeCount, m_planeChannelCount, m_planeSize, &cpuProp));
120 size_t bufferSize =
sizeof(dwImageCPU);
121 for (
size_t i = 0; i < m_planeCount; i++)
123 size_t planeRowBytes = m_elementSize * m_planeSize[i].x * m_planeChannelCount[i];
124 bufferSize += planeRowBytes * m_planeSize[i].y;
127 initBuffer(bufferSize);
132 if (m_prop.type != DW_IMAGE_CPU)
134 dwImage_destroy(m_imageHandleCPU);
135 dwImageStreamer_release(m_streamerToCPU);
136 dwImageStreamer_release(m_streamerFromCPU);
141 static size_t serializeImage(dwImageCPU* cpuImage,
unsigned char* buffer_start,
size_t bufferSize,
142 size_t planeCount,
size_t elementSize, uint32_t planeChannelCount[],
143 dwVector2ui planeSize[])
146 memcpy(buffer_start, cpuImage,
sizeof(dwImageCPU));
148 size_t bufferOffset =
sizeof(dwImageCPU);
149 for (
size_t i = 0; i < planeCount; i++)
151 size_t planeOffset = 0U;
152 size_t pitch = cpuImage->pitch[i];
153 size_t planeRowBytes = elementSize * planeSize[i].x * planeChannelCount[i];
154 for (
size_t j = 0; j < planeSize[i].y; j++)
156 if (bufferOffset + planeRowBytes > bufferSize)
158 throw Exception(DW_OUT_OF_BOUNDS,
"ChannelPacket<dwImageHandle_t>: serialize: send packet size, buffer size mismatch.");
160 memcpy(buffer_start + bufferOffset, cpuImage->data[i] + planeOffset, planeRowBytes);
161 planeOffset += pitch;
162 bufferOffset += planeRowBytes;
168 static void deserializeImage(dwImageHandle_t copyToImage,
unsigned char* buffer_start,
size_t bufferSize,
169 size_t planeCount,
size_t elementSize, uint32_t planeChannelCount[],
170 dwVector2ui planeSize[])
174 dwImageCPU* cpuImage =
nullptr;
177 size_t bufferOffset =
sizeof(dwImageCPU);
178 for (
size_t i = 0; i < planeCount; i++)
180 size_t planeOffset = 0U;
181 size_t pitch = cpuImage->pitch[i];
182 size_t planeRowBytes = elementSize * planeSize[i].x * planeChannelCount[i];
183 for (
size_t j = 0; j < planeSize[i].y; j++)
185 if (bufferOffset + planeRowBytes > bufferSize)
187 throw Exception(DW_OUT_OF_BOUNDS,
"ChannelPacket<dwImageHandle_t>: deserialize: recieve packet size, buffer size mismatch.");
189 memcpy(cpuImage->data[i] + planeOffset, buffer_start + bufferOffset, planeRowBytes);
190 planeOffset += pitch;
191 bufferOffset += planeRowBytes;
199 dwImageCPU* cpuImage =
nullptr;
200 dwImageHandle_t recvImage =
nullptr;
201 dwImageHandle_t* returnedImage =
nullptr;
203 if (m_prop.type != DW_IMAGE_CPU)
215 serializeImage(cpuImage, m_buffer.get(), m_bufferSize, m_planeCount, m_elementSize, m_planeChannelCount, m_planeSize);
217 if (m_prop.type != DW_IMAGE_CPU)
227 dwImageHandle_t copyToImage = m_dispatchImage;
228 if (m_prop.type != DW_IMAGE_CPU)
230 copyToImage = m_imageHandleCPU;
234 dwImageCPU recvImage{};
235 memcpy(&recvImage, m_buffer.get(),
sizeof(dwImageCPU));
237 deserializeImage(copyToImage, m_buffer.get(), m_bufferSize, m_planeCount, m_elementSize, m_planeChannelCount, m_planeSize);
239 if (m_prop.type != DW_IMAGE_CPU)
241 dwImageHandle_t recvImageHandle =
nullptr;
242 dwImageHandle_t* returnedImage =
nullptr;
245 FRWK_CHECK_DW_ERROR(dwImageStreamer_consumerReceive(&recvImageHandle, 0, m_streamerFromCPU));
247 dwImage_copyConvert(m_dispatchImage, recvImageHandle, m_ctx);
248 dwImage_setMetaData(&recvImage.prop.meta, m_dispatchImage);
249 dwImage_setTimestamp(recvImage.timestamp_us, m_dispatchImage);
257 dwImageHandle_t m_imageHandleCPU = DW_NULL_HANDLE;
259 size_t m_elementSize = 0;
260 size_t m_planeCount = 0;
261 uint32_t m_planeChannelCount[DW_MAX_IMAGE_PLANES]{};
262 dwVector2ui m_planeSize[DW_MAX_IMAGE_PLANES]{};
264 dwImageStreamerHandle_t m_streamerToCPU = DW_NULL_HANDLE;
265 dwImageStreamerHandle_t m_streamerFromCPU = DW_NULL_HANDLE;
267 dwContextHandle_t m_ctx = DW_NULL_HANDLE;
281 m_allocation = std::make_unique<uint8_t[]>(props->size);
287 throw Exception(DW_INVALID_ARGUMENT,
"Invalid reference data provided.");
310 m_objectSize =
sizeof(uint8_t);
311 m_maxCount = m_data.size;
317 initBuffer(m_headerSize + m_maxCount * m_objectSize);
324 memcpy(m_buffer.get(), &m_data, m_headerSize);
327 memcpy(m_buffer.get() + m_headerSize, m_data.data, m_data.size * m_objectSize);
334 memcpy(&m_data, m_buffer.get(), m_headerSize);
338 m_data.data = m_buffer.get() + m_headerSize;
353 auto* props = specimen.
getData<dwPyramidImageProperties>();
362 throw Exception(DW_INVALID_ARGUMENT,
"Invalid reference data provided.");
390 size_t bufferSize =
sizeof(dwImageCPU) * m_props.levelCount;
392 for (uint32_t level = 0; level < m_props.levelCount; ++level)
394 dwImageProperties& prop = m_props.levelProps[level];
396 dwImageProperties cpuProp = prop;
397 cpuProp.type = DW_IMAGE_CPU;
400 FRWK_CHECK_DW_ERROR(dwImageStreamer_initialize(&m_streamerToCPU[level], &prop, DW_IMAGE_CPU, ctx));
401 FRWK_CHECK_DW_ERROR(dwImageStreamer_initialize(&m_streamerFromCPU[level], &cpuProp, prop.type, ctx));
403 size_t elementSize = 0;
404 uint32_t planeChannelCount[DW_MAX_IMAGE_PLANES]{};
405 dwVector2ui planeSize[DW_MAX_IMAGE_PLANES]{};
407 FRWK_CHECK_DW_ERROR(dwImage_getDataLayout(&elementSize, &m_planeCount[level], planeChannelCount, planeSize, &cpuProp));
410 for (
size_t i = 0; i < m_planeCount[level]; i++)
412 bufferSize += (elementSize * planeSize[i].x * planeChannelCount[i]) * planeSize[i].y;
416 m_pyramidImage.levelCount = m_props.levelCount;
417 initBuffer(bufferSize);
422 for (uint32_t level = 0; level < m_pyramidImage.levelCount; ++level)
424 dwImage_destroy(m_imageHandleCPU[level]);
425 dwImageStreamer_release(m_streamerToCPU[level]);
426 dwImageStreamer_release(m_streamerFromCPU[level]);
435 for (uint32_t i = 0; i < m_pyramidImage.levelCount; i++)
437 dwImageHandle_t recvImage =
nullptr;
438 dwImageHandle_t* returnedImage =
nullptr;
440 FRWK_CHECK_DW_ERROR(dwImageStreamer_producerSend(m_pyramidImage.levelImages[i], m_streamerToCPU[i]));
443 dwImageCPU* cpuImage =
nullptr;
446 memcpy(m_buffer.get() + written, cpuImage,
sizeof(dwImageCPU));
447 written +=
sizeof(dwImageCPU);
449 for (
size_t j = 0; j < m_planeCount[i]; j++)
451 size_t planeSize = cpuImage->pitch[j] * cpuImage->prop.height;
452 memcpy(m_buffer.get() + written, cpuImage->data[j], planeSize);
453 written += planeSize;
466 for (uint32_t i = 0; i < m_pyramidImage.levelCount; i++)
468 dwImageCPU recvImage{};
469 memcpy(&recvImage, m_buffer.get() + read,
sizeof(dwImageCPU));
470 read +=
sizeof(dwImageCPU);
472 dwImageCPU* cpuImage =
nullptr;
475 for (
size_t j = 0; j < m_planeCount[i]; j++)
477 size_t planeSize = cpuImage->pitch[j] * cpuImage->prop.height;
478 memcpy(cpuImage->data[j], m_buffer.get() + read, planeSize);
482 dwImageHandle_t recvImageHandle =
nullptr;
483 dwImageHandle_t* returnedImage =
nullptr;
485 FRWK_CHECK_DW_ERROR(dwImageStreamer_producerSend(m_imageHandleCPU[i], m_streamerFromCPU[i]));
486 FRWK_CHECK_DW_ERROR(dwImageStreamer_consumerReceive(&recvImageHandle, 0, m_streamerFromCPU[i]));
488 dwImage_copyConvert(m_pyramidImage.levelImages[i], recvImageHandle, m_ctx);
489 dwImage_setMetaData(&recvImage.prop.meta, m_pyramidImage.levelImages[i]);
490 dwImage_setTimestamp(recvImage.timestamp_us, m_pyramidImage.levelImages[i]);
492 FRWK_CHECK_DW_ERROR(dwImageStreamer_consumerReturn(&recvImageHandle, m_streamerFromCPU[i]));
493 FRWK_CHECK_DW_ERROR(dwImageStreamer_producerReturn(returnedImage, 0, m_streamerFromCPU[i]));
498 size_t m_planeCount[DW_PYRAMID_LEVEL_MAX_COUNT]{0};
499 dwImageStreamerHandle_t m_streamerToCPU[DW_PYRAMID_LEVEL_MAX_COUNT]{};
500 dwImageStreamerHandle_t m_streamerFromCPU[DW_PYRAMID_LEVEL_MAX_COUNT]{};
501 dwImageHandle_t m_imageHandleCPU[DW_PYRAMID_LEVEL_MAX_COUNT]{};
502 dwContextHandle_t m_ctx = DW_NULL_HANDLE;
520 throw Exception(DW_INVALID_ARGUMENT,
"Invalid reference data provided.");
546 initBuffer(m_ncc.size);
552 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_buffer.get(), m_ncc.d_nccScores, m_ncc.size, cudaMemcpyDeviceToHost, cudaStream_t(0)));
559 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_ncc.d_nccScores, m_buffer.get(), m_bufferSize, cudaMemcpyHostToDevice, cudaStream_t(0)));
569 auto* props = specimen.
getData<dwFeatureArray>();
576 if (ret != DW_SUCCESS)
578 throw Exception(DW_BAD_ALLOC,
"FeatureArrayPacket: cannot allocate packet");
584 throw Exception(DW_INVALID_ARGUMENT,
"Invalid reference data provided.");
611 m_propIndex[0] =
sizeof(dwFeatureArray);
612 m_propIndex[1] = m_propIndex[0] +
sizeof(dwFeature2DStatus) * m_featureArray.maxFeatures;
613 m_propIndex[2] = m_propIndex[1] +
sizeof(uint32_t) * m_featureArray.maxFeatures;
614 m_propIndex[3] = m_propIndex[2] +
sizeof(float32_t) * m_featureArray.maxFeatures;
615 m_propIndex[4] = m_propIndex[3] +
sizeof(uint32_t) * m_featureArray.maxFeatures;
616 m_propIndex[5] = m_propIndex[4] +
sizeof(uint32_t) * m_featureArray.maxFeatures;
617 m_propIndex[6] = m_propIndex[5] +
sizeof(dwVector2f) * m_featureArray.maxFeatures;
618 m_propIndex[7] = m_propIndex[6] +
sizeof(uint32_t);
619 m_propIndex[8] = m_propIndex[7] +
sizeof(uint32_t);
621 initBuffer(m_propIndex[8]);
627 static_assert(
sizeof(dwFeatureArray) == 80,
"dwFeatureArray size has changed, update serialization");
629 memcpy(m_buffer.get(), &m_featureArray, m_propIndex[0]);
631 if (m_featureArray.memoryType == DW_MEMORY_TYPE_CUDA)
633 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_buffer.get() + m_propIndex[0], m_featureArray.statuses, m_propIndex[1] - m_propIndex[0], cudaMemcpyDeviceToHost, m_stream));
634 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_buffer.get() + m_propIndex[1], m_featureArray.ages, m_propIndex[2] - m_propIndex[1], cudaMemcpyDeviceToHost, m_stream));
635 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_buffer.get() + m_propIndex[2], m_featureArray.scales, m_propIndex[3] - m_propIndex[2], cudaMemcpyDeviceToHost, m_stream));
636 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_buffer.get() + m_propIndex[3], m_featureArray.ids, m_propIndex[4] - m_propIndex[3], cudaMemcpyDeviceToHost, m_stream));
637 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_buffer.get() + m_propIndex[4], m_featureArray.newToOldMap, m_propIndex[5] - m_propIndex[4], cudaMemcpyDeviceToHost, m_stream));
638 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_buffer.get() + m_propIndex[5], m_featureArray.locations, m_propIndex[6] - m_propIndex[5], cudaMemcpyDeviceToHost, m_stream));
639 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_buffer.get() + m_propIndex[6], m_featureArray.featureCount, m_propIndex[7] - m_propIndex[6], cudaMemcpyDeviceToHost, m_stream));
640 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_buffer.get() + m_propIndex[7], m_featureArray.validTrackedCount, m_propIndex[8] - m_propIndex[7], cudaMemcpyDeviceToHost, m_stream));
643 else if (m_featureArray.memoryType == DW_MEMORY_TYPE_CPU ||
644 m_featureArray.memoryType == DW_MEMORY_TYPE_PINNED)
646 memcpy(m_buffer.get() + m_propIndex[0], m_featureArray.statuses, m_propIndex[1] - m_propIndex[0]);
647 memcpy(m_buffer.get() + m_propIndex[1], m_featureArray.ages, m_propIndex[2] - m_propIndex[1]);
648 memcpy(m_buffer.get() + m_propIndex[2], m_featureArray.scales, m_propIndex[3] - m_propIndex[2]);
649 memcpy(m_buffer.get() + m_propIndex[3], m_featureArray.ids, m_propIndex[4] - m_propIndex[3]);
650 memcpy(m_buffer.get() + m_propIndex[4], m_featureArray.newToOldMap, m_propIndex[5] - m_propIndex[4]);
651 memcpy(m_buffer.get() + m_propIndex[5], m_featureArray.locations, m_propIndex[6] - m_propIndex[5]);
652 memcpy(m_buffer.get() + m_propIndex[6], m_featureArray.featureCount, m_propIndex[7] - m_propIndex[6]);
653 memcpy(m_buffer.get() + m_propIndex[7], m_featureArray.validTrackedCount, m_propIndex[8] - m_propIndex[7]);
660 static_assert(
sizeof(dwFeatureArray) == 80,
"dwFeatureArray size has changed, update deserialization");
662 auto array =
reinterpret_cast<dwFeatureArray*
>(m_buffer.get());
663 if (m_featureArray.maxFeatures != array->maxFeatures)
665 throw Exception(DW_INVALID_ARGUMENT,
"ChannelPacket<dwFeatureArray>: deserialize: maxFeatures does not match");
668 if (m_featureArray.memoryType == DW_MEMORY_TYPE_CUDA)
670 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_featureArray.statuses, m_buffer.get() + m_propIndex[0], m_propIndex[1] - m_propIndex[0], cudaMemcpyHostToDevice, m_stream));
671 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_featureArray.ages, m_buffer.get() + m_propIndex[1], m_propIndex[2] - m_propIndex[1], cudaMemcpyHostToDevice, m_stream));
672 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_featureArray.scales, m_buffer.get() + m_propIndex[2], m_propIndex[3] - m_propIndex[2], cudaMemcpyHostToDevice, m_stream));
673 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_featureArray.ids, m_buffer.get() + m_propIndex[3], m_propIndex[4] - m_propIndex[3], cudaMemcpyHostToDevice, m_stream));
674 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_featureArray.newToOldMap, m_buffer.get() + m_propIndex[4], m_propIndex[5] - m_propIndex[4], cudaMemcpyHostToDevice, m_stream));
675 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_featureArray.locations, m_buffer.get() + m_propIndex[5], m_propIndex[6] - m_propIndex[5], cudaMemcpyHostToDevice, m_stream));
676 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_featureArray.featureCount, m_buffer.get() + m_propIndex[6], m_propIndex[7] - m_propIndex[6], cudaMemcpyHostToDevice, m_stream));
677 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_featureArray.validTrackedCount, m_buffer.get() + m_propIndex[7], m_propIndex[8] - m_propIndex[7], cudaMemcpyHostToDevice, m_stream));
680 else if (m_featureArray.memoryType == DW_MEMORY_TYPE_CPU ||
681 m_featureArray.memoryType == DW_MEMORY_TYPE_PINNED)
683 memcpy(m_featureArray.statuses, m_buffer.get() + m_propIndex[0], m_propIndex[1] - m_propIndex[0]);
684 memcpy(m_featureArray.ages, m_buffer.get() + m_propIndex[1], m_propIndex[2] - m_propIndex[1]);
685 memcpy(m_featureArray.scales, m_buffer.get() + m_propIndex[2], m_propIndex[3] - m_propIndex[2]);
686 memcpy(m_featureArray.ids, m_buffer.get() + m_propIndex[3], m_propIndex[4] - m_propIndex[3]);
687 memcpy(m_featureArray.newToOldMap, m_buffer.get() + m_propIndex[4], m_propIndex[5] - m_propIndex[4]);
688 memcpy(m_featureArray.locations, m_buffer.get() + m_propIndex[5], m_propIndex[6] - m_propIndex[5]);
689 memcpy(m_featureArray.featureCount, m_buffer.get() + m_propIndex[6], m_propIndex[7] - m_propIndex[6]);
690 memcpy(m_featureArray.validTrackedCount, m_buffer.get() + m_propIndex[7], m_propIndex[8] - m_propIndex[7]);
693 m_featureArray.timeIdx = array->timeIdx;
697 size_t m_propIndex[9] = {};
698 cudaStream_t m_stream = cudaStream_t{
nullptr};
707 auto* props = specimen.
getData<dwFeatureHistoryArray>();
715 if (ret != DW_SUCCESS)
717 throw Exception(DW_BAD_ALLOC,
"FeatureHistoryArrayPacket: cannot allocate packet");
723 throw Exception(DW_INVALID_ARGUMENT,
"Invalid reference data provided.");
749 initBuffer(
sizeof(dwFeatureHistoryArray) + m_featureHistoryArray.bytes);
755 static_assert(
sizeof(dwFeatureHistoryArray) == 104,
"dwFeatureHistoryArray size has changed, update serialization");
757 uint8_t* ptr = m_buffer.get() +
sizeof(dwFeatureHistoryArray);
758 memcpy(m_buffer.get(), &m_featureHistoryArray,
sizeof(dwFeatureHistoryArray));
760 if (m_featureHistoryArray.memoryType == DW_MEMORY_TYPE_CUDA)
762 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(ptr, m_featureHistoryArray.data, m_featureHistoryArray.bytes, cudaMemcpyDeviceToHost, cudaStream_t(0)));
765 else if (m_featureHistoryArray.memoryType == DW_MEMORY_TYPE_CPU ||
766 m_featureHistoryArray.memoryType == DW_MEMORY_TYPE_PINNED)
768 memcpy(ptr, m_featureHistoryArray.data, m_featureHistoryArray.bytes);
775 static_assert(
sizeof(dwFeatureHistoryArray) == 104,
"dwFeatureHistoryArray size has changed, update deserialization");
777 auto array =
reinterpret_cast<dwFeatureHistoryArray*
>(m_buffer.get());
778 if (m_featureHistoryArray.maxFeatures != array->maxFeatures || m_featureHistoryArray.maxHistory != array->maxHistory)
780 throw Exception(DW_INVALID_ARGUMENT,
"ChannelPacket<dwFeatureHistoryArray>: deserialize: maxFeatures or maxHistory does not match");
783 uint8_t* ptr = m_buffer.get() +
sizeof(dwFeatureHistoryArray);
784 if (m_featureHistoryArray.memoryType == DW_MEMORY_TYPE_CUDA)
786 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_featureHistoryArray.data, ptr, m_featureHistoryArray.bytes, cudaMemcpyHostToDevice, cudaStream_t(0)));
789 else if (m_featureHistoryArray.memoryType == DW_MEMORY_TYPE_CPU ||
790 m_featureHistoryArray.memoryType == DW_MEMORY_TYPE_PINNED)
792 memcpy(m_featureHistoryArray.data, ptr, m_featureHistoryArray.bytes);
795 m_featureHistoryArray.currentTimeIdx = array->currentTimeIdx;
808 auto* frame = getFrame();
825 m_bufferSize = bufferSize;
832 memcpy(m_buffer.get(), &m_data, m_bufferSize);
839 memcpy(&m_data, m_buffer.get(), m_bufferSize);
853 :
ChannelPacket(*specimen.getData<dwLidarDecodedPacket>(), ctx)
855 auto* frame = getFrame();
862 size_t bufferSize =
sizeof(dwLidarDecodedPacket) +
sizeof(dwLidarPointRTHI) * ref.maxPoints +
sizeof(dwLidarPointXYZI) * ref.maxPoints;
864 m_pointsRTHI = std::make_unique<uint8_t[]>(
sizeof(dwLidarPointRTHI) * ref.maxPoints);
865 m_pointsXYZI = std::make_unique<uint8_t[]>(
sizeof(dwLidarPointXYZI) * ref.maxPoints);
867 m_data.pointsRTHI =
reinterpret_cast<const dwLidarPointRTHI*
>(m_pointsRTHI.get());
868 m_data.pointsXYZI =
reinterpret_cast<const dwLidarPointXYZI*
>(m_pointsXYZI.get());
870 initBuffer(bufferSize);
880 m_bufferSize = bufferSize;
887 size_t header =
sizeof(dwLidarDecodedPacket);
888 memcpy(m_buffer.get(), &m_data, header);
889 memcpy(m_buffer.get() + header, m_data.pointsRTHI,
sizeof(dwLidarPointRTHI) * m_data.nPoints);
890 header +=
sizeof(dwLidarPointRTHI) * m_data.nPoints;
891 memcpy(m_buffer.get() + header, m_data.pointsXYZI,
sizeof(dwLidarPointXYZI) * m_data.nPoints);
898 memcpy(&m_data, m_buffer.get(),
sizeof(dwLidarDecodedPacket));
899 m_data.pointsRTHI =
reinterpret_cast<const dwLidarPointRTHI*
>(m_buffer.get() +
900 sizeof(dwLidarDecodedPacket));
901 m_data.pointsXYZI =
reinterpret_cast<const dwLidarPointXYZI*
>(m_buffer.get() +
sizeof(dwLidarDecodedPacket) +
902 sizeof(dwLidarPointRTHI) * m_data.nPoints);
906 dwLidarDecodedPacket m_data{};
907 std::unique_ptr<uint8_t[]> m_pointsRTHI;
908 std::unique_ptr<uint8_t[]> m_pointsXYZI;
917 auto* props = specimen.
getData<dwEgomotionStateParams>();
925 throw Exception(DW_INVALID_ARGUMENT,
"Invalid reference data provided.");
951 dwEgomotionState_getMaxNumBytes(&m_numBytes, m_egomotionState);
952 m_bufferSize = m_numBytes +
sizeof(m_numBytes);
953 initBuffer(m_bufferSize);
963 return &m_dispatchEgomotionState;
969 memcpy(&numBytes, m_buffer.get(),
sizeof(numBytes));
976 dwEgomotionState_serialize(&m_numBytes,
977 m_buffer.get() +
sizeof(m_numBytes),
978 m_bufferSize -
sizeof(m_numBytes),
979 m_dispatchEgomotionState);
980 memcpy(m_buffer.get(), &m_numBytes,
sizeof(m_numBytes));
985 memcpy(&m_numBytes, m_buffer.get(),
sizeof(m_numBytes));
986 if (m_numBytes > m_bufferSize -
sizeof(m_numBytes))
988 throw Exception(DW_OUT_OF_BOUNDS,
"ChannelPacket<dwEgomotionStateHandle_t>: deserialize: recv packet size mismatch available buffer size.");
991 dwEgomotionState_deserialize(m_buffer.get() +
sizeof(m_numBytes),
993 m_dispatchEgomotionState);
997 size_t m_numBytes = 0;
1006 auto* props = specimen.
getData<dwPointCloud>();
1007 if (props !=
nullptr)
1011 dwStatus ret = dwPointCloud_createBuffer(&
m_data);
1012 if (ret != DW_SUCCESS)
1014 throw Exception(DW_BAD_ALLOC,
"PointCloudChannelPacket: cannot allocate packet");
1021 throw Exception(DW_INVALID_ARGUMENT,
"Invalid reference data provided.");
1048 if (m_data.numAuxChannels > 0)
1050 throw Exception(DW_NOT_IMPLEMENTED,
"ChannelPacket<dwPointCloud>: time to add support for aux data: DRIV-8273");
1053 m_objectSize = getFormatSize(m_data.format);
1054 m_maxCount = m_data.capacity;
1055 m_headerSize =
sizeof(dwPointCloud);
1057 initBuffer(m_headerSize + m_maxCount * m_objectSize);
1063 uint8_t* ptr = m_buffer.get() + m_headerSize;
1064 memcpy(m_buffer.get(), &m_data, m_headerSize);
1065 if (m_data.type == DW_MEMORY_TYPE_CUDA)
1067 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(ptr, m_data.points, m_data.size * m_objectSize, cudaMemcpyDeviceToHost, cudaStream_t(0)));
1070 else if (m_data.type == DW_MEMORY_TYPE_CPU ||
1071 m_data.type == DW_MEMORY_TYPE_PINNED)
1073 memcpy(ptr, m_data.points, m_data.size * m_objectSize);
1079 uint8_t* ptr = m_buffer.get() + m_headerSize;
1080 memcpy(&m_data, m_buffer.get(), m_headerSize);
1082 if (m_data.type == DW_MEMORY_TYPE_CUDA)
1084 m_data.points = m_dataOri.points;
1085 FRWK_CHECK_CUDA_ERROR(cudaMemcpyAsync(m_data.points, ptr, m_data.size * m_objectSize, cudaMemcpyHostToDevice, cudaStream_t(0)));
1088 else if (m_data.type == DW_MEMORY_TYPE_CPU ||
1089 m_data.type == DW_MEMORY_TYPE_PINNED)
1091 m_data.points =
static_cast<void*
>(m_buffer.get() + m_headerSize);
1097 uint32_t formatSize = 0;
1100 case DW_POINTCLOUD_FORMAT_XYZI:
1101 formatSize =
sizeof(dwLidarPointXYZI);
1103 case DW_POINTCLOUD_FORMAT_RTHI:
1104 formatSize =
sizeof(dwLidarPointRTHI);
1107 throw std::runtime_error(
"ChannelPacket<dwPointCloud>: unknown dwPointCloudFormat");
1113 size_t m_headerSize{};
1114 size_t m_objectSize{};
1115 size_t m_maxCount{};
1127 auto* frame = getFrame();
1135 size_t lidarDecodedPacketsSize = m_data.maxPacketsPerSpin *
sizeof(dwLidarDecodedPacket);
1136 size_t pointsXYZISize = m_data.maxPacketsPerSpin * m_data.maxPointsPerPacket *
sizeof(dwLidarPointXYZI);
1137 size_t pointsRTHISize = m_data.maxPacketsPerSpin * m_data.maxPointsPerPacket *
sizeof(dwLidarPointRTHI);
1139 initBuffer(m_headerSize + lidarDecodedPacketsSize + pointsXYZISize + pointsRTHISize);
1141 m_lidarPacketsPtr =
reinterpret_cast<dwLidarDecodedPacket*
>(m_buffer.get() + m_headerSize);
1142 m_pointsXYZIPtr =
reinterpret_cast<dwLidarPointXYZI*
>(m_buffer.get() + m_headerSize + lidarDecodedPacketsSize);
1143 m_pointsRTHIPtr =
reinterpret_cast<dwLidarPointRTHI*
>(m_buffer.get() + m_headerSize + lidarDecodedPacketsSize + pointsXYZISize);
1145 m_data.packets = m_lidarPacketsPtr;
1146 m_data.pointsXYZIArray = m_pointsXYZIPtr;
1147 m_data.pointsRTHIArray = m_pointsRTHIPtr;
1158 size_t lidarDecodedPacketsSize = m_data.packetSize *
sizeof(dwLidarDecodedPacket);
1159 size_t pointsXYZISize = m_data.packetSize * m_data.maxPointsPerPacket *
sizeof(dwLidarPointXYZI);
1160 size_t pointsRTHISize = m_data.packetSize * m_data.maxPointsPerPacket *
sizeof(dwLidarPointRTHI);
1162 memcpy(m_buffer.get(), &m_data, m_headerSize);
1164 if (m_data.packets != m_lidarPacketsPtr)
1166 memcpy(m_lidarPacketsPtr, m_data.packets, lidarDecodedPacketsSize);
1168 if (m_data.pointsXYZIArray != m_pointsXYZIPtr)
1170 memcpy(m_pointsXYZIPtr, m_data.pointsXYZIArray, pointsXYZISize);
1172 if (m_data.pointsRTHIArray != m_pointsRTHIPtr)
1174 memcpy(m_pointsRTHIPtr, m_data.pointsRTHIArray, pointsRTHISize);
1180 memcpy(&m_data, m_buffer.get(), m_headerSize);
1181 m_data.packets = m_lidarPacketsPtr;
1182 m_data.pointsXYZIArray = m_pointsXYZIPtr;
1183 m_data.pointsRTHIArray = m_pointsRTHIPtr;
1184 for (
size_t packetsIndex = 0; packetsIndex < m_data.packetSize; ++packetsIndex)
1186 m_data.packets[packetsIndex].pointsXYZI = &(m_data.pointsXYZIArray[packetsIndex * m_data.maxPointsPerPacket]);
1187 m_data.packets[packetsIndex].pointsRTHI = &(m_data.pointsRTHIArray[packetsIndex * m_data.maxPointsPerPacket]);
1194 size_t m_headerSize{};
1196 dwLidarDecodedPacket* m_lidarPacketsPtr{};
1197 dwLidarPointXYZI* m_pointsXYZIPtr{};
1198 dwLidarPointRTHI* m_pointsRTHIPtr{};
1209 auto* frame = getFrame();
1214 : m_data(ref), m_headerSize(sizeof(
dwTraceNodeData)), m_maxDataSize(ref.maxDataSize)
1216 initBuffer(m_headerSize + m_maxDataSize);
1217 m_TraceData = m_buffer.get() + m_headerSize;
1218 m_data.data = m_TraceData;
1232 if (m_data.dataSize > m_maxDataSize)
1234 throw Exception(DW_OUT_OF_BOUNDS,
"ChannelPacket<dwTraceNodeData>: serializeImpl: send packet size mismatch buffer size.");
1236 memcpy(m_buffer.get(), &m_data, m_headerSize);
1237 if (m_data.data != m_TraceData && m_data.dataSize <= m_maxDataSize)
1239 memcpy(m_TraceData, m_data.data, m_data.dataSize *
sizeof(uint8_t));
1246 memcpy(&m_data, m_buffer.get(), m_headerSize);
1248 if (m_data.dataSize > m_maxDataSize)
1250 throw Exception(DW_OUT_OF_BOUNDS,
"ChannelPacket<dwTraceNodeData>: deserialize: recv packet size mismatch buffer size.");
1252 m_data.data = m_buffer.get() + m_headerSize;
1257 size_t m_headerSize{};
1258 size_t m_maxDataSize{};
1259 uint8_t* m_TraceData;
1269 auto* size = specimen.
getData<
size_t>();
1270 if (size !=
nullptr)
1277 throw Exception(DW_INVALID_ARGUMENT,
"Invalid codec packet buffer size.");
1300 m_headerSize =
sizeof(dwCodecPacket);
1301 initBuffer(m_headerSize + m_maxDataSize);
1308 if (m_packet.dataSizeBytes > m_maxDataSize)
1310 throw Exception(DW_OUT_OF_BOUNDS,
"ChannelPacket<dwCodecPacket>: serializeImpl: send packet size mismatch buffer size.");
1312 memcpy(m_buffer.get(), &m_packet, m_headerSize);
1314 memcpy(m_buffer.get() + m_headerSize, m_packet.data, m_packet.dataSizeBytes);
1320 memcpy(&m_packet, m_buffer.get(), m_headerSize);
1322 if (m_packet.dataSizeBytes > m_maxDataSize)
1324 throw Exception(DW_OUT_OF_BOUNDS,
"ChannelPacket<dwCodecPacket>: deserialize: recv packet size mismatch buffer size.");
1327 memcpy(m_dataBuffer.get(), m_buffer.get() + m_headerSize, m_packet.dataSizeBytes);
1328 m_packet.data =
static_cast<uint8_t*
>(m_dataBuffer.get());
1332 size_t m_headerSize;
1342 auto* size = specimen.
getData<
size_t>();
1343 if (size !=
nullptr)
1350 throw Exception(DW_INVALID_ARGUMENT,
"Invalid maximum buffer size.");
1374 initBuffer(m_headerSize + m_maxDataSize);
1381 if (m_packet.size > m_maxDataSize)
1383 throw Exception(DW_OUT_OF_BOUNDS,
"ChannelPacket<SensorServiceNodeRawData>: serializeImpl: send packet size mismatch buffer size.");
1385 memcpy(m_buffer.get(), &m_packet, m_headerSize);
1387 memcpy(m_buffer.get() + m_headerSize, m_packet.data, m_packet.size);
1393 memcpy(&m_packet, m_buffer.get(), m_headerSize);
1395 if (m_packet.size > m_maxDataSize)
1397 throw Exception(DW_OUT_OF_BOUNDS,
"ChannelPacket<SensorServiceNodeRawData>: deserialize: recv packet size mismatch buffer size.");
1400 memcpy(m_dataBuffer.get(), m_buffer.get() + m_headerSize, m_packet.size);
1401 m_packet.data =
static_cast<uint8_t*
>(m_dataBuffer.get());
1405 size_t m_headerSize;
#define FRWK_CHECK_CUDA_ERROR(x)
#define FRWK_CHECK_DW_ERROR(x)
void deserialize(size_t) final
ChannelPacket(const GenericData &specimen, dwContextHandle_t)
void serializeImpl() final
ChannelPacket(const GenericData &specimen, dwContextHandle_t)
void serializeImpl() final
void deserialize(size_t) final
dwEgomotionStateHandle_t * getFrame()
void serializeImpl() final
void deserialize(size_t) final
ChannelPacket(dwEgomotionStateParams ¶ms, dwContextHandle_t ctx)
ChannelPacket(const GenericData &specimen, dwContextHandle_t ctx)
ChannelPacket(const GenericData &specimen, dwContextHandle_t ctx)
void serializeImpl() override
void deserialize(size_t) override
ChannelPacket(const GenericData &specimen, dwContextHandle_t ctx)
void deserialize(size_t) override
void serializeImpl() override
void deserialize(size_t) override
void serializeImpl() override
ChannelPacket(const GenericData &specimen, dwContextHandle_t)
~ChannelPacket() override
void deserialize(size_t) final
static size_t serializeImage(dwImageCPU *cpuImage, unsigned char *buffer_start, size_t bufferSize, size_t planeCount, size_t elementSize, uint32_t planeChannelCount[], dwVector2ui planeSize[])
static void deserializeImage(dwImageHandle_t copyToImage, unsigned char *buffer_start, size_t bufferSize, size_t planeCount, size_t elementSize, uint32_t planeChannelCount[], dwVector2ui planeSize[])
void serializeImpl() final
ChannelPacket(const GenericData &specimen, dwContextHandle_t ctx)
void deserialize(size_t) final
ChannelPacket(const GenericData &specimen, dwContextHandle_t)
void serializeImpl() final
void serializeImpl() final
void deserialize(size_t) final
ChannelPacket(const GenericData &specimen, dwContextHandle_t ctx)
void setBufferSize(size_t bufferSize)
ChannelPacket(dwLidarDecodedPacket &ref, dwContextHandle_t)
dwLidarDecodedPacket * getFrame()
ChannelPacket(dwLidarPacketsArray &ref, dwContextHandle_t)
ChannelPacket(const GenericData &specimen, dwContextHandle_t ctx)
void serializeImpl() final
dwLidarPacketsArray * getFrame()
void deserialize(size_t) final
void deserialize(size_t) final
ChannelPacket(const GenericData &specimen, dwContextHandle_t)
void serializeImpl() final
static size_t getFormatSize(dwPointCloudFormat format)
ChannelPacket(const GenericData &specimen, dwContextHandle_t ctx)
void deserialize(size_t) override
~ChannelPacket() override
void serializeImpl() override
dwSensorNodeRawData * getFrame()
ChannelPacket(const GenericData &specimen, dwContextHandle_t ctx)
void setBufferSize(size_t bufferSize)
void serializeImpl() final
void deserialize(size_t) final
ChannelPacket(dwSensorNodeRawData &ref, dwContextHandle_t)
ChannelPacket(const GenericData &specimen, dwContextHandle_t ctx)
void deserialize(size_t) final
ChannelPacket(dwTraceNodeData &ref, dwContextHandle_t)
dwTraceNodeData * getFrame()
~ChannelPacket() override=default
void serializeImpl() final
CodecPacket(const GenericData &specimen)
GenericData getGenericData() final
std::unique_ptr< uint8_t[]> m_dataBuffer
dwEgomotionStateHandle_t m_egomotionState
dwEgomotionStateHandle_t m_dispatchEgomotionState
~EgomotionStateHandlePacket()
GenericData getGenericData() final
EgomotionStateHandlePacket(const GenericData &specimen, dwContextHandle_t ctx)
FeatureArrayPacket(const GenericData &specimen, dwContextHandle_t ctx)
dwFeatureArray m_featureArrayOrig
GenericData getGenericData() override
~FeatureArrayPacket() override
dwFeatureArray m_featureArray
dwFeatureHistoryArray m_featureHistoryArrayOrig
~FeatureHistoryArrayPacket() override
dwFeatureHistoryArray m_featureHistoryArray
GenericData getGenericData() final
FeatureHistoryArrayPacket(const GenericData &specimen, dwContextHandle_t ctx)
~FeatureNccScoresPacket() override
GenericData getGenericData() override
dwFeatureNccScores m_dispatchNcc
FeatureNccScoresPacket(const GenericData &specimen)
dwImageHandle_t m_imageHandle
dwImageHandle_t m_dispatchImage
ImageHandlePacket(const GenericData &specimen, dwContextHandle_t ctx)
GenericData getGenericData() override
std::unique_ptr< uint8_t[]> m_allocation
LatencyPacket(const GenericData &specimen)
GenericData getGenericData() override
PointCloudChannelPacket(const GenericData &specimen)
GenericData getGenericData() final
~PointCloudChannelPacket() override
dwPyramidImageProperties m_props
GenericData getGenericData() override
dwPyramidImage m_dispatchPyramid
dwPyramidImage m_pyramidImage
PyramidImagePacket(const GenericData &specimen, dwContextHandle_t ctx)
std::unique_ptr< uint8_t[]> m_dataBuffer
SensorServiceNodeRawData m_packet
GenericData getGenericData() final
SensorServiceNodeRawDataPacket(const GenericData &specimen)