NVIDIA DeepStream SDK API Reference

6.4 Release
infer_surface_bufs.h
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2019-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3  * SPDX-License-Identifier: LicenseRef-NvidiaProprietary
4  *
5  * NVIDIA CORPORATION, its affiliates and licensors retain all intellectual
6  * property and proprietary rights in and to this material, related
7  * documentation and any modifications thereto. Any use, reproduction,
8  * disclosure or distribution of this material and related documentation
9  * without an express license agreement from NVIDIA CORPORATION or
10  * its affiliates is strictly prohibited.
11  */
12 
17 #ifndef __NVDSINFERSERVER_SURFACE_BUFS_H__
18 #define __NVDSINFERSERVER_SURFACE_BUFS_H__
19 
20 #include <stdarg.h>
21 #include <condition_variable>
22 #include <functional>
23 #include <list>
24 #include <memory>
25 #include <mutex>
26 #include <queue>
27 
28 #ifdef IS_TEGRA
29 #include "cudaEGL.h"
30 #endif
31 
32 #include <nvbufsurface.h>
33 #include <nvbufsurftransform.h>
34 
35 #include "infer_batch_buffer.h"
36 #include "infer_cuda_utils.h"
37 #include "infer_datatypes.h"
39 #include "infer_utils.h"
40 
41 namespace nvdsinferserver {
42 
43 class SurfaceBuffer;
44 using UniqSurfaceBuf = std::unique_ptr<SurfaceBuffer>;
45 
47 public:
48  ImageAlignBuffer(int batchSize) : BaseBatchBuffer(batchSize) {}
49  virtual InferMediaFormat getColorFormat() const = 0;
50  virtual const BatchSurfaceInfo& getSurfaceAlignInfo() const = 0;
51 };
52 
54  friend UniqSurfaceBuf createNvBufSurface(int width, int height,
55  InferMediaFormat format, int batchSize, int gpuId);
56 
57 protected:
58  explicit SurfaceBuffer(int batchSize);
59  bool init(int width, int height, InferMediaFormat format, int gpuId);
60 
61 public:
62  ~SurfaceBuffer() override;
63  void* getBufPtr(uint32_t batchIdx) const override {
64  assert(batchIdx < getBatchSize());
65  return m_BufPtrs[batchIdx];
66  }
67 
73  size_t getBufOffset(uint32_t batchIdx) const override {
74  assert(batchIdx < getBatchSize());
75  if (batchIdx >= getBatchSize())
76  return (size_t) -1;
77  if (m_Surf->isContiguous) {
78  return (char*)m_BufPtrs[batchIdx] - (char*)m_BufPtrs[0];
79  } else {
80  return 0;
81  }
82  }
83 
84  uint32_t getReservedSize() { return m_ReservedSize; }
85  NvBufSurface* getBufSurface() { return m_Surf; }
86  InferMediaFormat getColorFormat() const override { return m_ColorFormat; }
87 
88  // only for dGPU
89  const BatchSurfaceInfo& getSurfaceAlignInfo() const override;
90 
91  // reuse for bufPool
92  void reuse() { setBatchSize(m_ReservedSize); }
93 
94 private:
95  uint32_t m_ReservedSize{0};
96  NvBufSurface* m_Surf{nullptr};
97  std::vector<void*> m_BufPtrs;
98 
99  // only for dGPU
100  BatchSurfaceInfo m_AlignInfo{0, 0, 0};
102 
103 #ifdef IS_TEGRA
104  std::vector<CUgraphicsResource> m_CudaResources;
105  std::vector<CUeglFrame> m_EglFrames;
106 #endif
107 };
108 
109 SharedBufPool<UniqSurfaceBuf> createSurfaceBufPool(int width, int height,
110  InferMediaFormat color, int batchSize, int gpuId, int poolSize);
111 
113 public:
114  BatchSurfaceBuffer(int devId, uint32_t maxBatchSize,
115  NvBufSurfaceMemType memType) : BaseBatchBuffer(0) {
116  mutableBufDesc().devId = devId;
117  mutableBufDesc().memType = InferMemType::kNvSurface;
118  mutableBufDesc().dataType = InferDataType::kUint8;
119  mutableBufDesc().elementSize = 1;
120  m_BufSurface.gpuId = devId;
121  m_BufSurface.batchSize = maxBatchSize;
122  m_BufSurface.memType = memType;
123  }
124  void* getBufPtr(uint32_t batchIdx) const override {
125  assert(batchIdx < m_BufSurface.numFilled);
126  if (batchIdx >= m_BufSurface.numFilled)
127  return nullptr;
128  return m_BufSurface.surfaceList[batchIdx].dataPtr;
129  }
130 
136  size_t getBufOffset(uint32_t batchIdx) const override {
137  assert(batchIdx < m_BufSurface.numFilled);
138  if (batchIdx >= m_BufSurface.numFilled)
139  return (size_t) -1;
140  if (m_BufSurface.isContiguous) {
141  return (char *)m_BufSurface.surfaceList[batchIdx].dataPtr -
142  (char *)m_BufSurface.surfaceList[0].dataPtr;
143  } else {
144  return 0;
145  }
146  }
147 
148  void append(
149  const NvBufSurfaceParams& params, const NvBufSurfTransformRect& crop) {
150  m_Params.push_back(params);
151  m_CropRects.push_back(crop);
152  m_ScaleRatios.emplace_back(0, 0);
153  m_Offsets.emplace_back(0, 0);
154  m_BufSurface.surfaceList = &m_Params[0];
155  m_BufSurface.numFilled = (uint32_t)m_Params.size();
156  assert(m_BufSurface.numFilled <= m_BufSurface.batchSize);
157  setBatchSize(m_BufSurface.numFilled);
158  }
160  assert(batchIdx < (int)m_Params.size());
161  return m_Params.at(batchIdx);
162  }
164  assert(batchIdx < (int)m_CropRects.size());
165  return m_CropRects.at(batchIdx);
166  }
167  NvBufSurface* getBufSurface() { return &m_BufSurface; }
168 
169  void getScaleRatio(uint32_t batchIdx, double& ratioX, double& ratioY) {
170  assert(batchIdx < (uint32_t)m_ScaleRatios.size());
171  std::tie(ratioX, ratioY) = m_ScaleRatios.at(batchIdx);
172  }
173 
174  void setScaleRatio(uint32_t batchIdx, double ratioX, double ratioY) {
175  assert(batchIdx < (uint32_t)m_ScaleRatios.size());
176  m_ScaleRatios.at(batchIdx) = std::tie(ratioX, ratioY);
177  }
178 
179  void getOffsets(uint32_t batchIdx, uint32_t& offsetLeft,
180  uint32_t& offsetTop) {
181  assert(batchIdx < (uint32_t)m_Offsets.size());
182  std::tie(offsetLeft, offsetTop) = m_Offsets.at(batchIdx);
183  }
184 
185  void setOffsets(uint32_t batchIdx, uint32_t offsetLeft, uint32_t offsetTop) {
186  assert(batchIdx < (uint32_t)m_Offsets.size());
187  m_Offsets.at(batchIdx) = std::tie(offsetLeft, offsetTop);
188  }
189 
190 private:
191  NvBufSurface m_BufSurface{0, 0, 0, 0};
192  std::vector<NvBufSurfaceParams> m_Params;
193  std::vector<NvBufSurfTransformRect> m_CropRects;
194  std::vector<std::tuple<double, double>> m_ScaleRatios;
195  std::vector<std::tuple<uint32_t, uint32_t>> m_Offsets;
196 };
197 
198 using SharedBatchSurface = std::shared_ptr<BatchSurfaceBuffer>;
199 
200 } // namespace nvdsinferserver
201 
202 #endif
nvdsinferserver::BatchSurfaceBuffer::BatchSurfaceBuffer
BatchSurfaceBuffer(int devId, uint32_t maxBatchSize, NvBufSurfaceMemType memType)
Definition: infer_surface_bufs.h:114
nvdsinferserver
Copyright (c) 2021, NVIDIA CORPORATION.
Definition: infer_custom_process.h:28
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:179
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:124
nvdsinferserver::BatchSurfaceBuffer::setOffsets
void setOffsets(uint32_t batchIdx, uint32_t offsetLeft, uint32_t offsetTop)
Definition: infer_surface_bufs.h:185
nvdsinferserver::SurfaceBuffer::getReservedSize
uint32_t getReservedSize()
Definition: infer_surface_bufs.h:84
infer_datatypes.h
Header file for the data types used in the inference processing.
NvBufSurface
Holds information about batched buffers.
Definition: nvbufsurface.h:503
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::SurfaceBuffer::getBufOffset
size_t getBufOffset(uint32_t batchIdx) const override
Get the offset from start of the memory allocation to the buffer pointer.
Definition: infer_surface_bufs.h:73
nvdsinferserver::InferDataType::kUint8
@ kUint8
NvBufSurfTransformRect
Holds the coordinates of a rectangle.
Definition: nvbufsurftransform.h:152
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
NvBufSurface::isContiguous
bool isContiguous
Holds an "is contiguous" flag.
Definition: nvbufsurface.h:513
nvdsinferserver::BatchSurfaceBuffer::getBufSurface
NvBufSurface * getBufSurface()
Definition: infer_surface_bufs.h:167
NvBufSurfaceParams
Hold the information of single buffer in the batch.
Definition: nvbufsurface.h:470
nvdsinferserver::SurfaceBuffer
Definition: infer_surface_bufs.h:53
nvdsinferserver::SurfaceBuffer::reuse
void reuse()
Definition: infer_surface_bufs.h:92
nvdsinferserver::UniqSurfaceBuf
std::unique_ptr< SurfaceBuffer > UniqSurfaceBuf
Definition: infer_surface_bufs.h:44
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:300
nvdsinferserver::InferMemType::kNvSurface
@ kNvSurface
NVRM surface memory.
nvdsinferserver::BatchSurfaceBuffer::getBufOffset
size_t getBufOffset(uint32_t batchIdx) const override
Get the offset from start of the memory allocation to the buffer pointer.
Definition: infer_surface_bufs.h:136
nvdsinferserver::ImageAlignBuffer
Definition: infer_surface_bufs.h:46
nvdsinferserver::ImageAlignBuffer::ImageAlignBuffer
ImageAlignBuffer(int batchSize)
Definition: infer_surface_bufs.h:48
nvdsinferserver::BatchSurfaceBuffer::append
void append(const NvBufSurfaceParams &params, const NvBufSurfTransformRect &crop)
Definition: infer_surface_bufs.h:148
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:169
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:63
nvdsinferserver::BatchSurfaceBuffer::getSurfaceParams
NvBufSurfaceParams & getSurfaceParams(int batchIdx)
Definition: infer_surface_bufs.h:159
nvdsinferserver::SurfaceBuffer::getColorFormat
InferMediaFormat getColorFormat() const override
Definition: infer_surface_bufs.h:86
nvdsinferserver::BatchSurfaceBuffer::getCropArea
NvBufSurfTransformRect getCropArea(int batchIdx)
Definition: infer_surface_bufs.h:163
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:85
nvbufsurftransform.h
nvdsinferserver::BatchSurfaceBuffer
Definition: infer_surface_bufs.h:112
nvdsinferserver::BatchSurfaceBuffer::setScaleRatio
void setScaleRatio(uint32_t batchIdx, double ratioX, double ratioY)
Definition: infer_surface_bufs.h:174
nvbufsurface.h
nvdsinferserver::SharedBatchSurface
std::shared_ptr< BatchSurfaceBuffer > SharedBatchSurface
Definition: infer_surface_bufs.h:198