NVIDIA DeepStream SDK API Reference

9.1 Release
sources/libs/nvdsinferserver/infer_iprocess.h
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2018-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3  * SPDX-License-Identifier: Apache-2.0
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
25 #ifndef __NVDSINFERSERVER_IPROCESS_H__
26 #define __NVDSINFERSERVER_IPROCESS_H__
27 
28 #include <stdarg.h>
29 #include <condition_variable>
30 #include <functional>
31 #include <list>
32 #include <memory>
33 #include <mutex>
34 #include <queue>
35 #include <tuple>
36 
37 #include "infer_common.h"
38 #include "infer_datatypes.h"
39 #include "infer_utils.h"
40 
41 namespace nvdsinferserver {
42 
47 public:
48  using PreprocessDone =
49  std::function<void(NvDsInferStatus, SharedBatchArray)>;
50 
51  IPreprocessor() = default;
52  virtual ~IPreprocessor() = default;
53 
55  SharedCuStream mainStream, PreprocessDone done) = 0;
56 
57 private:
58  DISABLE_CLASS_COPY(IPreprocessor);
59 };
60 
65 public:
66  using PostprocessDone =
67  std::function<void(NvDsInferStatus, SharedBatchArray)>;
68  IPostprocessor() = default;
69  virtual ~IPostprocessor() = default;
70 
72  SharedCuStream mainStream, PostprocessDone done) = 0;
73 
75  SharedCuStream mainStream, PostprocessDone done) = 0;
76 
77 private:
78  DISABLE_CLASS_COPY(IPostprocessor);
79 };
80 
85 public:
89  ~BasePreprocessor() override = default;
90 
91  /*
92  * @brief Helper functions to access member variables.
93  */
95  void setUniqueId(int id) { m_UniqueId = id; }
96  int uniqueId() const { return m_UniqueId; }
97  void setTransformIdx(int idx) { m_TransformIdx = idx; }
109  PreprocessDone done) override {
110  assert(src && (int)src->getSize() > m_TransformIdx);
111  SharedBatchBuf& from = src->buf(m_TransformIdx);
112  SharedBatchBuf to = requestOutBuffer(from);
113  if (!to) {
115  }
116  to->setBufId(src->bufId());
117  NvDsInferStatus status = transformImpl(from, to, mainStream);
118  src->buf(m_TransformIdx) = to;
119  mainStream.reset();
120  if (status == NVDSINFER_SUCCESS) {
121  done(status, std::move(src));
122  }
123  return status;
124  }
125 
132  const std::vector<int>& devIds) = 0;
133 
134 private:
141  virtual SharedBatchBuf requestOutBuffer(SharedBatchBuf& inBuf) = 0;
149  virtual NvDsInferStatus transformImpl(SharedBatchBuf& src,
150  SharedBatchBuf& dst, SharedCuStream& mainStream) = 0;
151 
152 private:
157  int m_TransformIdx = 0;
161  int m_UniqueId = 0;
162 };
163 
168 public:
173  : m_UniqueId(uid), m_ProcessType(type) {}
177  ~BasePostprocessor() override = default;
178 
179  /*
180  * @brief Helper functions to access member variables.
181  */
183  void setUniqueId(int id) { m_UniqueId = id; }
184  int uniqueId() const { return m_UniqueId; }
185  InferPostprocessType networkType() const { return m_ProcessType; }
196  SharedCuStream mainStream, PostprocessDone done) override {
197  return genericPostProcess_(std::move(inBuf), std::move(mainStream),
198  std::move(done), &BasePostprocessor::requestCudaOutBufs,
199  &BasePostprocessor::postCudaImpl);
200  }
201 
210  SharedCuStream mainStream, PostprocessDone done) override {
211  return genericPostProcess_(std::move(inBuf), std::move(mainStream),
212  std::move(done), &BasePostprocessor::requestHostOutBufs,
213  &BasePostprocessor::postHostImpl);
214  }
215 
222  const std::vector<int>& devIds) = 0;
223 
224 private:
232  virtual NvDsInferStatus postCudaImpl(SharedBatchArray& inBuf,
233  SharedBatchArray& outbuf, SharedCuStream& mainStream) = 0;
241  virtual NvDsInferStatus postHostImpl(SharedBatchArray& inBuf,
242  SharedBatchArray& outbuf, SharedCuStream& mainStream) = 0;
243 
250  virtual SharedBatchArray requestCudaOutBufs(const SharedBatchArray& inBuf) = 0;
257  virtual SharedBatchArray requestHostOutBufs(const SharedBatchArray& inBuf) = 0;
258 
268  template <typename RequestBuf, typename Impl>
269  NvDsInferStatus genericPostProcess_(SharedBatchArray inBuf,
270  SharedCuStream mainStream, PostprocessDone done, RequestBuf reqBuf,
271  Impl impl) {
272  assert(inBuf);
273  SharedBatchArray outBuf = (this->*reqBuf)(inBuf);
274  if (!outBuf) {
276  }
277  outBuf->setBufId(inBuf->bufId());
278  NvDsInferStatus status = (this->*impl)(inBuf, outBuf, mainStream);
279  inBuf.reset();
280  mainStream.reset();
281  if (status == NVDSINFER_SUCCESS) {
282  done(status, std::move(outBuf));
283  }
284  return status;
285  }
286 
287 private:
291  int m_UniqueId = 0;
296 };
297 
302 template <class BasePreprocessorT>
303 class ThreadPreprocessor : public BasePreprocessorT {
304 private:
305  using Item = std::tuple<SharedBatchArray, SharedCuStream,
307  enum { kBuf, kStream, kDone };
308 
309 public:
310  template <typename... Args>
311  ThreadPreprocessor(Args&&... args)
312  : BasePreprocessorT(std::forward<Args>(args)...),
313  m_Worker(
314  [this](Item i) -> bool {
316  std::move(std::get<kDone>(i));
317  NvDsInferStatus s = BasePreprocessorT::transform(
318  std::move(std::get<kBuf>(i)),
319  std::move(std::get<kStream>(i)), done);
320  if (s != NVDSINFER_SUCCESS) {
321  done(s, nullptr);
322  }
323  return true;
324  },
325  "Preproc")
326  {
327  }
328  ~ThreadPreprocessor() override { m_Worker.join(); }
329  void setThreadName(const std::string &name) {
330  m_Worker.setThreadName(name);
331  }
333  IPreprocessor::PreprocessDone done) final {
334  Item item = std::make_tuple(
335  std::move(src), std::move(mainStream), std::move(done));
336  if (m_Worker.queueItem(std::move(item))) {
337  return NVDSINFER_SUCCESS;
338  }
340  }
341 
342 private:
343  QueueThread<std::vector<Item>> m_Worker;
344 };
345 
350 template <class BasePostprocessorT>
351 class ThreadCudaPostprocessor : public BasePostprocessorT {
352  using ItemCuda = std::tuple<SharedBatchArray, SharedCuStream,
354  enum { kBuf, kStream, kDone };
355 
356 public:
357  template <typename... Args>
358  ThreadCudaPostprocessor(Args&&... args)
359  : BasePostprocessorT(std::forward<Args>(args)...),
360  m_CudaWorker(
361  [this](ItemCuda i) -> bool {
363  std::move(std::get<kDone>(i));
364  NvDsInferStatus s = BasePostprocessorT::postCudaProcess(
365  std::move(std::get<kBuf>(i)),
366  std::move(std::get<kStream>(i)), done);
367  if (s != NVDSINFER_SUCCESS) {
368  done(s, nullptr);
369  }
370  return true;
371  },
372  "PostCuda")
373  {}
374  ~ThreadCudaPostprocessor() { m_CudaWorker.join(); }
376  SharedCuStream mainStream, IPostprocessor::PostprocessDone done) final {
377  ItemCuda item = std::make_tuple(
378  std::move(inBuf), std::move(mainStream), std::move(done));
379  if (m_CudaWorker.queueItem(std::move(item))) {
380  return NVDSINFER_SUCCESS;
381  }
383  }
384 
385 private:
386  QueueThread<std::vector<ItemCuda>> m_CudaWorker;
387 };
388 
393 template <typename BasePostprocessorT>
394 class ThreadHostPostprocessor : public BasePostprocessorT {
395  using ItemHost = std::tuple<SharedBatchArray, SharedCuStream,
397  enum { kBuf, kStream, kDone };
398 
399 public:
400  template <typename... Args>
401  ThreadHostPostprocessor(Args&&... args)
402  : BasePostprocessorT(std::forward<Args>(args)...),
403  m_HostWorker(
404  [this](ItemHost i) -> bool {
406  std::move(std::get<kDone>(i));
407  NvDsInferStatus s = BasePostprocessorT::postHostProcess(
408  std::move(std::get<kBuf>(i)),
409  std::move(std::get<kStream>(i)), done);
410  if (s != NVDSINFER_SUCCESS) {
411  done(s, nullptr);
412  }
413  return true;
414  },
415  "PostHost")
416  {
417  }
418 
419  ~ThreadHostPostprocessor() { m_HostWorker.join(); }
420 
422  SharedCuStream mainStream, IPostprocessor::PostprocessDone done) final {
423  ItemHost item = std::make_tuple(
424  std::move(inBuf), std::move(mainStream), std::move(done));
425  if (m_HostWorker.queueItem(std::move(item))) {
426  return NVDSINFER_SUCCESS;
427  }
429  }
430 
431 private:
432  QueueThread<std::vector<ItemHost>> m_HostWorker;
433 };
434 
435 } // namespace nvdsinferserver
436 
437 #endif
nvdsinferserver
This is a header file for pre-processing cuda kernels with normalization and mean subtraction require...
Definition: sources/gst-plugins/gst-nvinferserver/gstnvinferserver_impl.h:69
nvdsinferserver::IPostprocessor::IPostprocessor
IPostprocessor()=default
nvdsinferserver::BasePostprocessor::allocateResource
virtual NvDsInferStatus allocateResource(const std::vector< int > &devIds)=0
Allocate resource like output buffer pool.
nvdsinferserver::BasePreprocessor::transform
NvDsInferStatus transform(SharedBatchArray src, SharedCuStream mainStream, PreprocessDone done) override
Perform the transformation on the input buffer from the buffer array, indexed using m_TransformIdx.
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:108
nvdsinferserver::BasePostprocessor::~BasePostprocessor
~BasePostprocessor() override=default
Destructor default.
nvdsinferserver::ThreadCudaPostprocessor::~ThreadCudaPostprocessor
~ThreadCudaPostprocessor()
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:374
nvdsinferserver::BasePostprocessor::postHostProcess
NvDsInferStatus postHostProcess(SharedBatchArray inBuf, SharedCuStream mainStream, PostprocessDone done) override
Acquire an output buffer array and call host side processing steps.
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:209
nvdsinferserver::IPostprocessor::postCudaProcess
virtual NvDsInferStatus postCudaProcess(SharedBatchArray inBuf, SharedCuStream mainStream, PostprocessDone done)=0
nvdsinferserver::ThreadPreprocessor::~ThreadPreprocessor
~ThreadPreprocessor() override
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:328
nvdsinferserver::IPostprocessor::PostprocessDone
std::function< void(NvDsInferStatus, SharedBatchArray)> PostprocessDone
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:67
nvdsinferserver::InferPostprocessType
InferPostprocessType
Inference post processing types.
Definition: sources/includes/nvdsinferserver/infer_datatypes.h:108
nvdsinferserver::BasePostprocessor
Base post-processor class.
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:167
nvdsinferserver::IPreprocessor::PreprocessDone
std::function< void(NvDsInferStatus, SharedBatchArray)> PreprocessDone
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:49
nvdsinferserver::ThreadPreprocessor::transform
NvDsInferStatus transform(SharedBatchArray src, SharedCuStream mainStream, IPreprocessor::PreprocessDone done) final
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:332
nvdsinferserver::IPostprocessor
Post-processor interface class.
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:64
nvdsinferserver::SharedBatchBuf
std::shared_ptr< BaseBatchBuffer > SharedBatchBuf
Common buffer interfaces (internal).
Definition: sources/libs/nvdsinferserver/infer_common.h:76
nvdsinferserver::BasePostprocessor::BasePostprocessor
BasePostprocessor(InferPostprocessType type, int uid)
Constructor, save process type and ID.
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:172
nvdsinferserver::IPreprocessor::~IPreprocessor
virtual ~IPreprocessor()=default
nvdsinferserver::SharedBatchArray
std::shared_ptr< BaseBatchArray > SharedBatchArray
Definition: sources/libs/nvdsinferserver/infer_common.h:80
NVDSINFER_SUCCESS
@ NVDSINFER_SUCCESS
NvDsInferContext operation succeeded.
Definition: sources/includes/nvdsinfer.h:233
nvdsinferserver::ThreadCudaPostprocessor::postCudaProcess
NvDsInferStatus postCudaProcess(SharedBatchArray inBuf, SharedCuStream mainStream, IPostprocessor::PostprocessDone done) final
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:375
nvdsinferserver::BasePreprocessor::uniqueId
int uniqueId() const
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:96
nvdsinferserver::IPostprocessor::postHostProcess
virtual NvDsInferStatus postHostProcess(SharedBatchArray inBuf, SharedCuStream mainStream, PostprocessDone done)=0
nvdsinferserver::IPreprocessor::IPreprocessor
IPreprocessor()=default
nvdsinferserver::BasePreprocessor
Base preprocessor class.
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:84
nvdsinferserver::IPostprocessor::~IPostprocessor
virtual ~IPostprocessor()=default
nvdsinferserver::BasePostprocessor::postCudaProcess
NvDsInferStatus postCudaProcess(SharedBatchArray inBuf, SharedCuStream mainStream, PostprocessDone done) override
Acquire an output buffer array and call CUDA post processing steps.
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:195
nvdsinferserver::BasePostprocessor::setUniqueId
void setUniqueId(int id)
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:183
NVDSINFER_UNKNOWN_ERROR
@ NVDSINFER_UNKNOWN_ERROR
Unknown error was encountered.
Definition: sources/includes/nvdsinfer.h:256
nvdsinferserver::ThreadHostPostprocessor::ThreadHostPostprocessor
ThreadHostPostprocessor(Args &&... args)
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:401
infer_common.h
Header file of the common declarations for the nvinferserver library.
nvdsinferserver::InferPostprocessType::kOther
@ kOther
Custom post processing.
nvdsinferserver::SharedCuStream
std::shared_ptr< CudaStream > SharedCuStream
Cuda based pointers.
Definition: sources/libs/nvdsinferserver/infer_common.h:89
nvdsinferserver::BasePreprocessor::setTransformIdx
void setTransformIdx(int idx)
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:97
nvdsinferserver::BasePreprocessor::setUniqueId
void setUniqueId(int id)
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:95
nvdsinferserver::ThreadPreprocessor
Preprocessor thread queue class template.
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:303
nvdsinferserver::ThreadPreprocessor::ThreadPreprocessor
ThreadPreprocessor(Args &&... args)
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:311
nvdsinferserver::BasePostprocessor::networkType
InferPostprocessType networkType() const
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:185
nvdsinferserver::ThreadCudaPostprocessor
A CUDA post processor thread queue template class.
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:351
nvdsinferserver::ThreadPreprocessor::setThreadName
void setThreadName(const std::string &name)
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:329
nvdsinferserver::BasePostprocessor::uniqueId
int uniqueId() const
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:184
nvdsinferserver::BasePreprocessor::~BasePreprocessor
~BasePreprocessor() override=default
Destructor default.
infer_utils.h
Header file containing utility functions and classes used by the nvinferserver low level library.
nvdsinferserver::ThreadCudaPostprocessor::ThreadCudaPostprocessor
ThreadCudaPostprocessor(Args &&... args)
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:358
nvdsinferserver::ThreadHostPostprocessor
A host post processor thread queue template class.
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:394
nvdsinferserver::BasePreprocessor::allocateResource
virtual NvDsInferStatus allocateResource(const std::vector< int > &devIds)=0
Allocate resource like output buffer pool.
nvdsinferserver::IPreprocessor
Preprocessor interface class.
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:46
nvdsinferserver::ThreadHostPostprocessor::~ThreadHostPostprocessor
~ThreadHostPostprocessor()
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:419
nvdsinferserver::IPreprocessor::transform
virtual NvDsInferStatus transform(SharedBatchArray src, SharedCuStream mainStream, PreprocessDone done)=0
NVDSINFER_RESOURCE_ERROR
@ NVDSINFER_RESOURCE_ERROR
Resource error was encountered.
Definition: sources/includes/nvdsinfer.h:248
nvdsinferserver::ThreadHostPostprocessor::postHostProcess
NvDsInferStatus postHostProcess(SharedBatchArray inBuf, SharedCuStream mainStream, IPostprocessor::PostprocessDone done) final
Definition: sources/libs/nvdsinferserver/infer_iprocess.h:421
NvDsInferStatus
NvDsInferStatus
Enum for the status codes returned by NvDsInferContext.
Definition: sources/includes/nvdsinfer.h:231