NVIDIA DeepStream SDK API Reference

9.1 Release
sources/libs/nvdsinferserver/infer_surface_bufs.h
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2019-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 
22 #ifndef __NVDSINFERSERVER_SURFACE_BUFS_H__
23 #define __NVDSINFERSERVER_SURFACE_BUFS_H__
24 
25 #include <stdarg.h>
26 #include <condition_variable>
27 #include <functional>
28 #include <list>
29 #include <memory>
30 #include <mutex>
31 #include <queue>
32 
33 #ifdef IS_TEGRA
34 #include "cudaEGL.h"
35 #endif
36 
37 #include <nvbufsurface.h>
38 #include <nvbufsurftransform.h>
39 
40 #include "infer_batch_buffer.h"
41 #include "infer_cuda_utils.h"
42 #include "infer_datatypes.h"
44 #include "infer_utils.h"
45 
46 namespace nvdsinferserver {
47 
48 class SurfaceBuffer;
49 using UniqSurfaceBuf = std::unique_ptr<SurfaceBuffer>;
50 
52 public:
53  ImageAlignBuffer(int batchSize) : BaseBatchBuffer(batchSize) {}
54  virtual InferMediaFormat getColorFormat() const = 0;
55  virtual const BatchSurfaceInfo& getSurfaceAlignInfo() const = 0;
56 };
57 
59  friend UniqSurfaceBuf createNvBufSurface(int width, int height,
60  InferMediaFormat format, int batchSize, int gpuId);
61 
62 protected:
63  explicit SurfaceBuffer(int batchSize);
64  bool init(int width, int height, InferMediaFormat format, int gpuId);
65 
66 public:
67  ~SurfaceBuffer() override;
68  void* getBufPtr(uint32_t batchIdx) const override {
69  assert(batchIdx < getBatchSize());
70  return m_BufPtrs[batchIdx];
71  }
72 
78  size_t getBufOffset(uint32_t batchIdx) const override {
79  assert(batchIdx < getBatchSize());
80  if (batchIdx >= getBatchSize())
81  return (size_t) -1;
82  if (m_Surf->isContiguous) {
83  return (char*)m_BufPtrs[batchIdx] - (char*)m_BufPtrs[0];
84  } else {
85  return 0;
86  }
87  }
88 
89  uint32_t getReservedSize() { return m_ReservedSize; }
90  NvBufSurface* getBufSurface() { return m_Surf; }
91  InferMediaFormat getColorFormat() const override { return m_ColorFormat; }
92 
93  // only for dGPU
94  const BatchSurfaceInfo& getSurfaceAlignInfo() const override;
95 
96  // reuse for bufPool
97  void reuse() { setBatchSize(m_ReservedSize); }
98 
99 private:
100  uint32_t m_ReservedSize{0};
101  NvBufSurface* m_Surf{nullptr};
102  std::vector<void*> m_BufPtrs;
103 
104  // only for dGPU
105  BatchSurfaceInfo m_AlignInfo{0, 0, 0};
107 
108 #ifdef IS_TEGRA
109  std::vector<CUgraphicsResource> m_CudaResources;
110  std::vector<CUeglFrame> m_EglFrames;
111 #endif
112 };
113 
114 SharedBufPool<UniqSurfaceBuf> createSurfaceBufPool(int width, int height,
115  InferMediaFormat color, int batchSize, int gpuId, int poolSize);
116 
118 public:
119  BatchSurfaceBuffer(int devId, uint32_t maxBatchSize,
120  NvBufSurfaceMemType memType) : BaseBatchBuffer(0) {
121  mutableBufDesc().devId = devId;
122  mutableBufDesc().memType = InferMemType::kNvSurface;
123  mutableBufDesc().dataType = InferDataType::kUint8;
124  mutableBufDesc().elementSize = 1;
125  m_BufSurface.gpuId = devId;
126  m_BufSurface.batchSize = maxBatchSize;
127  m_BufSurface.memType = memType;
128  }
129  void* getBufPtr(uint32_t batchIdx) const override {
130  assert(batchIdx < m_BufSurface.numFilled);
131  if (batchIdx >= m_BufSurface.numFilled)
132  return nullptr;
133  return m_BufSurface.surfaceList[batchIdx].dataPtr;
134  }
135 
141  size_t getBufOffset(uint32_t batchIdx) const override {
142  assert(batchIdx < m_BufSurface.numFilled);
143  if (batchIdx >= m_BufSurface.numFilled)
144  return (size_t) -1;
145  if (m_BufSurface.isContiguous) {
146  return (char *)m_BufSurface.surfaceList[batchIdx].dataPtr -
147  (char *)m_BufSurface.surfaceList[0].dataPtr;
148  } else {
149  return 0;
150  }
151  }
152 
153  void append(
154  const NvBufSurfaceParams& params, const NvBufSurfTransformRect& crop) {
155  m_Params.push_back(params);
156  m_CropRects.push_back(crop);
157  m_ScaleRatios.emplace_back(0, 0);
158  m_Offsets.emplace_back(0, 0);
159  m_BufSurface.surfaceList = &m_Params[0];
160  m_BufSurface.numFilled = (uint32_t)m_Params.size();
161  assert(m_BufSurface.numFilled <= m_BufSurface.batchSize);
162  setBatchSize(m_BufSurface.numFilled);
163  }
165  assert(batchIdx < (int)m_Params.size());
166  return m_Params.at(batchIdx);
167  }
169  assert(batchIdx < (int)m_CropRects.size());
170  return m_CropRects.at(batchIdx);
171  }
172  NvBufSurface* getBufSurface() { return &m_BufSurface; }
173 
174  void getScaleRatio(uint32_t batchIdx, double& ratioX, double& ratioY) {
175  assert(batchIdx < (uint32_t)m_ScaleRatios.size());
176  std::tie(ratioX, ratioY) = m_ScaleRatios.at(batchIdx);
177  }
178 
179  void setScaleRatio(uint32_t batchIdx, double ratioX, double ratioY) {
180  assert(batchIdx < (uint32_t)m_ScaleRatios.size());
181  m_ScaleRatios.at(batchIdx) = std::tie(ratioX, ratioY);
182  }
183 
184  void getOffsets(uint32_t batchIdx, uint32_t& offsetLeft,
185  uint32_t& offsetTop) {
186  assert(batchIdx < (uint32_t)m_Offsets.size());
187  std::tie(offsetLeft, offsetTop) = m_Offsets.at(batchIdx);
188  }
189 
190  void setOffsets(uint32_t batchIdx, uint32_t offsetLeft, uint32_t offsetTop) {
191  assert(batchIdx < (uint32_t)m_Offsets.size());
192  m_Offsets.at(batchIdx) = std::tie(offsetLeft, offsetTop);
193  }
194 
195 private:
196  NvBufSurface m_BufSurface{0, 0, 0, 0};
197  std::vector<NvBufSurfaceParams> m_Params;
198  std::vector<NvBufSurfTransformRect> m_CropRects;
199  std::vector<std::tuple<double, double>> m_ScaleRatios;
200  std::vector<std::tuple<uint32_t, uint32_t>> m_Offsets;
201 };
202 
203 using SharedBatchSurface = std::shared_ptr<BatchSurfaceBuffer>;
204 
205 } // namespace nvdsinferserver
206 
207 #endif
nvdsinferserver::BatchSurfaceBuffer::BatchSurfaceBuffer
BatchSurfaceBuffer(int devId, uint32_t maxBatchSize, NvBufSurfaceMemType memType)
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:119
nvdsinferserver::SharedBatchSurface
std::shared_ptr< BatchSurfaceBuffer > SharedBatchSurface
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:203
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::SurfaceBuffer::init
bool init(int width, int height, InferMediaFormat format, int gpuId)
nvdsinferserver::BaseBatchBuffer::getBatchSize
uint32_t getBatchSize() const final
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:46
nvdsinferserver::createSurfaceBufPool
SharedBufPool< UniqSurfaceBuf > createSurfaceBufPool(int width, int height, InferMediaFormat color, int batchSize, int gpuId, int poolSize)
nvdsinferserver::BatchSurfaceBuffer::getOffsets
void getOffsets(uint32_t batchIdx, uint32_t &offsetLeft, uint32_t &offsetTop)
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:184
NvBufSurface::isContiguous
bool isContiguous
Holds an "is contiguous" flag.
Definition: sources/includes/nvbufsurface.h:607
BatchSurfaceInfo
Definition: sources/libs/nvdsinferserver/infer_preprocess_kernel.h:32
nvdsinferserver::InferMediaFormat
InferMediaFormat
Image formats.
Definition: sources/includes/nvdsinferserver/infer_datatypes.h:134
nvdsinferserver::BatchSurfaceBuffer::getBufPtr
void * getBufPtr(uint32_t batchIdx) const override
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:129
nvdsinferserver::BatchSurfaceBuffer::setOffsets
void setOffsets(uint32_t batchIdx, uint32_t offsetLeft, uint32_t offsetTop)
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:190
nvdsinferserver::SurfaceBuffer::getReservedSize
uint32_t getReservedSize()
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:89
NvBufSurface
Holds information about batched buffers.
Definition: sources/includes/nvbufsurface.h:597
nvdsinferserver::UniqSurfaceBuf
std::unique_ptr< SurfaceBuffer > UniqSurfaceBuf
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:49
nvdsinferserver::SurfaceBuffer::SurfaceBuffer
SurfaceBuffer(int batchSize)
nvdsinferserver::SurfaceBuffer::~SurfaceBuffer
~SurfaceBuffer() override
nvdsinferserver::ImageAlignBuffer::getColorFormat
virtual InferMediaFormat getColorFormat() const =0
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: sources/libs/nvdsinferserver/infer_surface_bufs.h:78
nvdsinferserver::InferDataType::kUint8
@ kUint8
NvBufSurfTransformRect
Holds the coordinates of a rectangle.
Definition: sources/includes/nvbufsurftransform.h:158
nvdsinferserver::SurfaceBuffer::getSurfaceAlignInfo
const BatchSurfaceInfo & getSurfaceAlignInfo() const override
nvdsinferserver::BaseBatchBuffer::setBatchSize
virtual void setBatchSize(uint32_t size)
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:56
nvdsinferserver::InferMediaFormat::kRGB
@ kRGB
24-bit interleaved R-G-B
nvdsinferserver::BatchSurfaceBuffer::getBufSurface
NvBufSurface * getBufSurface()
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:172
NvBufSurfaceParams
Hold the information of single buffer in the batch.
Definition: sources/includes/nvbufsurface.h:562
nvdsinferserver::SurfaceBuffer
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:58
infer_preprocess_kernel.h
infer_batch_buffer.h
Header file of batch buffer related class declarations.
nvdsinferserver::SurfaceBuffer::reuse
void reuse()
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:97
nvdsinferserver::ImageAlignBuffer::getSurfaceAlignInfo
virtual const BatchSurfaceInfo & getSurfaceAlignInfo() const =0
NvBufSurfaceMemType
NvBufSurfaceMemType
Specifies memory types for NvBufSurface.
Definition: sources/includes/nvbufsurface.h:350
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: sources/libs/nvdsinferserver/infer_surface_bufs.h:141
nvdsinferserver::ImageAlignBuffer
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:51
nvdsinferserver::ImageAlignBuffer::ImageAlignBuffer
ImageAlignBuffer(int batchSize)
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:53
nvdsinferserver::BatchSurfaceBuffer::append
void append(const NvBufSurfaceParams &params, const NvBufSurfTransformRect &crop)
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:153
INFER_EXPORT_API
Definition: sources/libs/nvdsinferserver/infer_utils.h:38
nvdsinferserver::BatchSurfaceBuffer::getScaleRatio
void getScaleRatio(uint32_t batchIdx, double &ratioX, double &ratioY)
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:174
infer_utils.h
Header file containing utility functions and classes used by the nvinferserver low level library.
nvdsinferserver::SurfaceBuffer::getBufPtr
void * getBufPtr(uint32_t batchIdx) const override
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:68
nvdsinferserver::BatchSurfaceBuffer::getSurfaceParams
NvBufSurfaceParams & getSurfaceParams(int batchIdx)
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:164
nvdsinferserver::SurfaceBuffer::getColorFormat
InferMediaFormat getColorFormat() const override
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:91
nvdsinferserver::BatchSurfaceBuffer::getCropArea
NvBufSurfTransformRect getCropArea(int batchIdx)
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:168
nvdsinferserver::BaseBatchBuffer
The base class for batch buffers.
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:39
nvdsinferserver::SurfaceBuffer::createNvBufSurface
friend UniqSurfaceBuf createNvBufSurface(int width, int height, InferMediaFormat format, int batchSize, int gpuId)
nvdsinferserver::SurfaceBuffer::getBufSurface
NvBufSurface * getBufSurface()
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:90
nvdsinferserver::BatchSurfaceBuffer
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:117
nvdsinferserver::BatchSurfaceBuffer::setScaleRatio
void setScaleRatio(uint32_t batchIdx, double ratioX, double ratioY)
Definition: sources/libs/nvdsinferserver/infer_surface_bufs.h:179
infer_cuda_utils.h
Header file declaring utility classes for CUDA memory management, CIDA streams and events.
ds3d::v2xinfer::format
static std::string format(const char *fmt,...)
Definition: sources/libs/ds3d/inference_custom_lib/ds3d_v2x_infer_custom_preprocess/tensor.hpp:31