24 #ifndef __NVDSINFERSERVER_BATCH_BUFFER_H__
25 #define __NVDSINFERSERVER_BATCH_BUFFER_H__
29 #include <unordered_map>
30 #include "nvbufsurftransform.h"
32 #include "infer_datatypes.h"
50 assert(m_Desc.elementSize >= 0);
51 uint32_t b = getBatchSize();
52 return m_Desc.elementSize * m_Desc.dims.numElements * (b ? b : 1);
74 m_Attaches.emplace_back(std::move(buf));
75 assert(!hasAttachLoop());
77 void detach() { m_Attaches.clear(); }
86 std::set<BaseBatchBuffer*> allAttached;
87 for (
auto const& buf : m_Attaches) {
89 if (allAttached.count(buf.get())) {
92 allAttached.emplace(buf.get());
98 uint64_t
bufId()
const {
return m_BufId; }
107 assert(getBufPtr(0) && getBufPtr(batchIdx));
108 if (getBufPtr(0) ==
nullptr || getBufPtr(batchIdx) ==
nullptr) {
111 return (uint8_t*)getBufPtr(batchIdx) - (uint8_t*)getBufPtr(0);
118 uint32_t m_BatchSize = 0;
120 std::vector<SharedBatchBuf> m_Attaches;
121 uint64_t m_BufId = UINT64_C(0);
130 class BaseBatchArray :
public IBatchArray {
133 uint32_t
getSize() const final {
return m_Bufs.size(); }
136 assert(arrayIdx < (uint32_t)m_Bufs.size());
137 assert(m_Bufs.at(arrayIdx).get());
138 return m_Bufs.at(arrayIdx).get();
142 assert(arrayIdx < (uint32_t)m_Bufs.size());
143 assert(m_Bufs.at(arrayIdx).get());
144 return buf(arrayIdx);
149 std::dynamic_pointer_cast<BaseBatchBuffer>(
buf);
157 const std::vector<SharedBatchBuf>&
bufs()
const {
return m_Bufs; }
162 assert(idx < (uint32_t)m_Bufs.size());
163 return m_Bufs.at(idx);
167 assert(idx < (uint32_t)m_Bufs.size());
168 return m_Bufs.at(idx);
174 auto iter = std::find_if(m_Bufs.cbegin(), m_Bufs.cend(),
177 const InferBufferDescription& desc = buf->getBufDesc();
178 if (desc.memType == InferMemType::kGpuCuda) {
186 assert((iter != m_Bufs.cend() && gpuId >= 0) ||
187 (iter == m_Bufs.cend() && gpuId == -1));
192 uint64_t
bufId()
const {
return m_BufId; }
198 std::vector<SharedBatchBuf> m_Bufs;
200 uint64_t m_BufId = UINT64_C(0);
210 class RefBatchBuffer :
public BaseBatchBuffer {
213 void* bufBase,
size_t offset,
size_t bufBytes,
216 m_BufBytes(bufBytes), m_BufOffset(offset)
222 assert(batchIdx == 0 || batchIdx < getBatchSize());
224 assert(batchIdx <= 0 || desc.
dataType != InferDataType::kString);
225 batchIdx = std::max(batchIdx, 0U);
226 return (
void*)((uint8_t*)m_BufBase +
238 assert(batchIdx == 0 || batchIdx < getBatchSize());
240 assert(batchIdx <= 0 || desc.
dataType != InferDataType::kString);
241 batchIdx = std::max(batchIdx, 0U);
246 mutable void* m_BufBase =
nullptr;
247 size_t m_BufBytes = 0;
251 size_t m_BufOffset = 0;
254 class WrapCBatchBuffer : IBatchBuffer {
256 template <
typename BufPtr>
263 return m_Impl->getBufDesc();
266 return m_Impl->getBufPtr(batchIdx);