NVIDIA DeepStream SDK API Reference

6.2 Release
infer_surface_bufs.h
Go to the documentation of this file.
1 
16 #ifndef __NVDSINFERSERVER_SURFACE_BUFS_H__
17 #define __NVDSINFERSERVER_SURFACE_BUFS_H__
18 
19 #include <stdarg.h>
20 #include <condition_variable>
21 #include <functional>
22 #include <list>
23 #include <memory>
24 #include <mutex>
25 #include <queue>
26 
27 #ifdef IS_TEGRA
28 #include "cudaEGL.h"
29 #endif
30 
31 #include <nvbufsurface.h>
32 #include <nvbufsurftransform.h>
33 
34 #include "infer_batch_buffer.h"
35 #include "infer_cuda_utils.h"
36 #include "infer_datatypes.h"
38 #include "infer_utils.h"
39 
40 namespace nvdsinferserver {
41 
42 class SurfaceBuffer;
43 using UniqSurfaceBuf = std::unique_ptr<SurfaceBuffer>;
44 
46 public:
47  ImageAlignBuffer(int batchSize) : BaseBatchBuffer(batchSize) {}
48  virtual InferMediaFormat getColorFormat() const = 0;
49  virtual const BatchSurfaceInfo& getSurfaceAlignInfo() const = 0;
50 };
51 
53  friend UniqSurfaceBuf createNvBufSurface(int width, int height,
54  InferMediaFormat format, int batchSize, int gpuId);
55 
56 protected:
57  explicit SurfaceBuffer(int batchSize);
58  bool init(int width, int height, InferMediaFormat format, int gpuId);
59 
60 public:
61  ~SurfaceBuffer() override;
62  void* getBufPtr(uint32_t batchIdx) const override {
63  assert(batchIdx < getBatchSize());
64  return m_BufPtrs[batchIdx];
65  }
66 
67  uint32_t getReservedSize() { return m_ReservedSize; }
68  NvBufSurface* getBufSurface() { return m_Surf; }
69  InferMediaFormat getColorFormat() const override { return m_ColorFormat; }
70 
71  // only for dGPU
72  const BatchSurfaceInfo& getSurfaceAlignInfo() const override;
73 
74  // reuse for bufPool
75  void reuse() { setBatchSize(m_ReservedSize); }
76 
77 private:
78  uint32_t m_ReservedSize{0};
79  NvBufSurface* m_Surf{nullptr};
80  std::vector<void*> m_BufPtrs;
81 
82  // only for dGPU
83  BatchSurfaceInfo m_AlignInfo{0, 0, 0};
85 
86 #ifdef IS_TEGRA
87  std::vector<CUgraphicsResource> m_CudaResources;
88  std::vector<CUeglFrame> m_EglFrames;
89 #endif
90 };
91 
92 SharedBufPool<UniqSurfaceBuf> createSurfaceBufPool(int width, int height,
93  InferMediaFormat color, int batchSize, int gpuId, int poolSize);
94 
96 public:
97  BatchSurfaceBuffer(int devId, uint32_t maxBatchSize,
98  NvBufSurfaceMemType memType) : BaseBatchBuffer(0) {
99  mutableBufDesc().devId = devId;
100  mutableBufDesc().memType = InferMemType::kNvSurface;
101  mutableBufDesc().dataType = InferDataType::kUint8;
102  mutableBufDesc().elementSize = 1;
103  m_BufSurface.gpuId = devId;
104  m_BufSurface.batchSize = maxBatchSize;
105  m_BufSurface.memType = memType;
106  }
107  void* getBufPtr(uint32_t batchIdx) const override {
108  assert(batchIdx < m_BufSurface.numFilled);
109  if (batchIdx >= m_BufSurface.numFilled)
110  return nullptr;
111  return m_BufSurface.surfaceList[batchIdx].dataPtr;
112  }
113 
114  void append(
115  const NvBufSurfaceParams& params, const NvBufSurfTransformRect& crop) {
116  m_Params.push_back(params);
117  m_CropRects.push_back(crop);
118  m_ScaleRatios.emplace_back(0, 0);
119  m_Offsets.emplace_back(0, 0);
120  m_BufSurface.surfaceList = &m_Params[0];
121  m_BufSurface.numFilled = (uint32_t)m_Params.size();
122  assert(m_BufSurface.numFilled <= m_BufSurface.batchSize);
123  setBatchSize(m_BufSurface.numFilled);
124  }
126  assert(batchIdx < (int)m_Params.size());
127  return m_Params.at(batchIdx);
128  }
130  assert(batchIdx < (int)m_CropRects.size());
131  return m_CropRects.at(batchIdx);
132  }
133  NvBufSurface* getBufSurface() { return &m_BufSurface; }
134 
135  void getScaleRatio(uint32_t batchIdx, double& ratioX, double& ratioY) {
136  assert(batchIdx < (uint32_t)m_ScaleRatios.size());
137  std::tie(ratioX, ratioY) = m_ScaleRatios.at(batchIdx);
138  }
139 
140  void setScaleRatio(uint32_t batchIdx, double ratioX, double ratioY) {
141  assert(batchIdx < (uint32_t)m_ScaleRatios.size());
142  m_ScaleRatios.at(batchIdx) = std::tie(ratioX, ratioY);
143  }
144 
145  void getOffsets(uint32_t batchIdx, uint32_t& offsetLeft,
146  uint32_t& offsetTop) {
147  assert(batchIdx < (uint32_t)m_Offsets.size());
148  std::tie(offsetLeft, offsetTop) = m_Offsets.at(batchIdx);
149  }
150 
151  void setOffsets(uint32_t batchIdx, uint32_t offsetLeft, uint32_t offsetTop) {
152  assert(batchIdx < (uint32_t)m_Offsets.size());
153  m_Offsets.at(batchIdx) = std::tie(offsetLeft, offsetTop);
154  }
155 
156 private:
157  NvBufSurface m_BufSurface{0, 0, 0, 0};
158  std::vector<NvBufSurfaceParams> m_Params;
159  std::vector<NvBufSurfTransformRect> m_CropRects;
160  std::vector<std::tuple<double, double>> m_ScaleRatios;
161  std::vector<std::tuple<uint32_t, uint32_t>> m_Offsets;
162 };
163 
164 using SharedBatchSurface = std::shared_ptr<BatchSurfaceBuffer>;
165 
166 } // namespace nvdsinferserver
167 
168 #endif
nvdsinferserver::BatchSurfaceBuffer::BatchSurfaceBuffer
BatchSurfaceBuffer(int devId, uint32_t maxBatchSize, NvBufSurfaceMemType memType)
Definition: infer_surface_bufs.h:97
nvdsinferserver
Copyright (c) 2021, NVIDIA CORPORATION.
Definition: infer_custom_process.h:23
nvdsinferserver::SurfaceBuffer::init
bool init(int width, int height, InferMediaFormat format, int gpuId)
nvdsinferserver::BaseBatchBuffer::getBatchSize
uint32_t getBatchSize() const final
Definition: infer_batch_buffer.h:41
nvdsinferserver::BatchSurfaceBuffer::getOffsets
void getOffsets(uint32_t batchIdx, uint32_t &offsetLeft, uint32_t &offsetTop)
Definition: infer_surface_bufs.h:145
BatchSurfaceInfo
Definition: infer_preprocess_kernel.h:27
nvdsinferserver::InferMediaFormat
InferMediaFormat
Image formats.
Definition: infer_datatypes.h:129
nvdsinferserver::BatchSurfaceBuffer::getBufPtr
void * getBufPtr(uint32_t batchIdx) const override
Definition: infer_surface_bufs.h:107
nvdsinferserver::BatchSurfaceBuffer::setOffsets
void setOffsets(uint32_t batchIdx, uint32_t offsetLeft, uint32_t offsetTop)
Definition: infer_surface_bufs.h:151
nvdsinferserver::SurfaceBuffer::getReservedSize
uint32_t getReservedSize()
Definition: infer_surface_bufs.h:67
infer_datatypes.h
Header file for the data types used in the inference processing.
NvBufSurface
Holds information about batched buffers.
Definition: nvbufsurface.h:460
nvdsinferserver::SurfaceBuffer::SurfaceBuffer
SurfaceBuffer(int batchSize)
nvdsinferserver::SurfaceBuffer::~SurfaceBuffer
~SurfaceBuffer() override
nvdsinferserver::ImageAlignBuffer::getColorFormat
virtual InferMediaFormat getColorFormat() const =0
infer_batch_buffer.h
Header file of batch buffer related class declarations.
nvdsinferserver::InferDataType::kUint8
@ kUint8
NvBufSurfTransformRect
Holds the coordinates of a rectangle.
Definition: nvbufsurftransform.h:144
infer_preprocess_kernel.h
infer_utils.h
Header file containing utility functions and classes used by the nvinferserver low level library.
nvdsinferserver::SurfaceBuffer::getSurfaceAlignInfo
const BatchSurfaceInfo & getSurfaceAlignInfo() const override
nvdsinferserver::BaseBatchBuffer::setBatchSize
virtual void setBatchSize(uint32_t size)
Definition: infer_batch_buffer.h:51
nvdsinferserver::InferMediaFormat::kRGB
@ kRGB
24-bit interleaved R-G-B
nvdsinferserver::BatchSurfaceBuffer::getBufSurface
NvBufSurface * getBufSurface()
Definition: infer_surface_bufs.h:133
NvBufSurfaceParams
Hold the information of single buffer in the batch.
Definition: nvbufsurface.h:427
nvdsinferserver::SurfaceBuffer
Definition: infer_surface_bufs.h:52
nvdsinferserver::SurfaceBuffer::reuse
void reuse()
Definition: infer_surface_bufs.h:75
nvdsinferserver::UniqSurfaceBuf
std::unique_ptr< SurfaceBuffer > UniqSurfaceBuf
Definition: infer_surface_bufs.h:43
infer_cuda_utils.h
Header file declaring utility classes for CUDA memory management, CIDA streams and events.
nvdsinferserver::ImageAlignBuffer::getSurfaceAlignInfo
virtual const BatchSurfaceInfo & getSurfaceAlignInfo() const =0
NvBufSurfaceMemType
NvBufSurfaceMemType
Specifies memory types for NvBufSurface.
Definition: nvbufsurface.h:265
nvdsinferserver::InferMemType::kNvSurface
@ kNvSurface
NVRM surface memory.
nvdsinferserver::ImageAlignBuffer
Definition: infer_surface_bufs.h:45
nvdsinferserver::ImageAlignBuffer::ImageAlignBuffer
ImageAlignBuffer(int batchSize)
Definition: infer_surface_bufs.h:47
nvdsinferserver::BatchSurfaceBuffer::append
void append(const NvBufSurfaceParams &params, const NvBufSurfTransformRect &crop)
Definition: infer_surface_bufs.h:114
INFER_EXPORT_API
Definition: infer_utils.h:33
nvdsinferserver::BatchSurfaceBuffer::getScaleRatio
void getScaleRatio(uint32_t batchIdx, double &ratioX, double &ratioY)
Definition: infer_surface_bufs.h:135
nvdsinferserver::createSurfaceBufPool
SharedBufPool< UniqSurfaceBuf > createSurfaceBufPool(int width, int height, InferMediaFormat color, int batchSize, int gpuId, int poolSize)
nvdsinferserver::SurfaceBuffer::getBufPtr
void * getBufPtr(uint32_t batchIdx) const override
Definition: infer_surface_bufs.h:62
nvdsinferserver::BatchSurfaceBuffer::getSurfaceParams
NvBufSurfaceParams & getSurfaceParams(int batchIdx)
Definition: infer_surface_bufs.h:125
nvdsinferserver::SurfaceBuffer::getColorFormat
InferMediaFormat getColorFormat() const override
Definition: infer_surface_bufs.h:69
nvdsinferserver::BatchSurfaceBuffer::getCropArea
NvBufSurfTransformRect getCropArea(int batchIdx)
Definition: infer_surface_bufs.h:129
nvdsinferserver::BaseBatchBuffer
The base class for batch buffers.
Definition: infer_batch_buffer.h:34
nvdsinferserver::SurfaceBuffer::createNvBufSurface
friend UniqSurfaceBuf createNvBufSurface(int width, int height, InferMediaFormat format, int batchSize, int gpuId)
nvdsinferserver::SurfaceBuffer::getBufSurface
NvBufSurface * getBufSurface()
Definition: infer_surface_bufs.h:68
nvbufsurftransform.h
nvdsinferserver::BatchSurfaceBuffer
Definition: infer_surface_bufs.h:95
nvdsinferserver::BatchSurfaceBuffer::setScaleRatio
void setScaleRatio(uint32_t batchIdx, double ratioX, double ratioY)
Definition: infer_surface_bufs.h:140
nvbufsurface.h
nvdsinferserver::SharedBatchSurface
std::shared_ptr< BatchSurfaceBuffer > SharedBatchSurface
Definition: infer_surface_bufs.h:164