NVIDIA DeepStream SDK API Reference

6.4 Release
impl_dataprocess.h
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2021-2022 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 
13 
14 #ifndef _DS3D_COMMON_IMPL_BASE_DATA_PROCESS_H
15 #define _DS3D_COMMON_IMPL_BASE_DATA_PROCESS_H
16 
19 #include "ds3d/common/hpp/obj.hpp"
20 
21 namespace ds3d { namespace impl {
22 
26 template <class abiDataProcessorT, _EnableIfBaseOf<abiProcess, abiDataProcessorT> = true>
27 class BaseImplDataProcessor : public abiDataProcessorT {
28 public:
29  using OnGuardDataCBImpl = std::function<void(ErrCode, GuardDataMap)>;
30  using OnGuardBridgeDataCBImpl = std::function<void(ErrCode, const struct VideoBridge2dInput*)>;
31  using ImplMutex = std::recursive_mutex;
32 
35  {
36  _errCB.reset();
37  _userData.reset();
38  }
39 
40  void setUserData_i(const abiRefAny* userdata) final
41  {
42  if (userdata) {
43  _userData = GuardDataT<void>(*userdata);
44  } else {
45  _userData.reset();
46  }
47  }
48  const abiRefAny* getUserData_i() const final { return _userData.abiRef(); }
49  void setErrorCallback_i(const abiErrorCB& cb) final { _errCB = GuardCB<abiErrorCB>(cb); }
50  ErrCode start_i(const char* configStr, uint32_t strLen, const char* path) override
51  {
52  if (getStateSafe() == State::kRunning) {
53  return ErrCode::kGood;
54  }
56  ErrCode c = startImpl(cppString(configStr, strLen), cppString(path));
57  if (isGood(c)) {
59  }
60  return c;
61  }
62  const char* getCaps_i(CapsPort p) const final
63  {
64  std::unique_lock<ImplMutex> lock(_mutex);
65  auto i = _caps_txt.find(p);
66  if (i != _caps_txt.cend()) {
67  return i->second.c_str();
68  } else {
69  return "";
70  }
71  }
72  ErrCode flush_i() override
73  {
76  "flush failed since dataloader was not started");
77  return flushImpl();
78  }
79 
80  ErrCode stop_i() override
81  {
82  State s = getStateSafe();
83  if (s == State::kStopped || s == State::kNone) {
84  return ErrCode::kGood;
85  }
86  ErrCode ret = stopImpl();
87  _errCB.reset();
89  return ret;
90  }
91 
92  State state_i() const final { return getStateSafe(); }
93 
94 protected:
95  // cplusplus virtual interface, user need to derive from
96  virtual ErrCode startImpl(const std::string& content, const std::string& path) = 0;
97  virtual ErrCode stopImpl() = 0;
98  virtual ErrCode flushImpl() = 0;
99 
100  // internal calls
101  void setOutputCaps(const std::string& caps) { return setCaps(CapsPort::kOutput, caps); }
102 
103  void setInputCaps(const std::string& caps) { return setCaps(CapsPort::kInput, caps); }
104 
105  void emitError(ErrCode code, const std::string& msg)
106  {
107  if (_errCB) {
108  _errCB(code, msg.c_str());
109  }
110  }
111 
113  {
114  std::unique_lock<ImplMutex> lock(_mutex);
115  return _state;
116  }
117 
118  void setStateSafe(State flag)
119  {
120  std::unique_lock<ImplMutex> lock(_mutex);
121  _state = flag;
122  }
123 
124 protected:
125  ImplMutex& mutex() const { return _mutex; }
126 
127 private:
128  void setCaps(CapsPort p, const std::string& caps)
129  {
130  std::unique_lock<ImplMutex> lock(_mutex);
131  _caps_txt[p] = caps;
132  }
133 
134  GuardCB<abiErrorCB> _errCB;
135  std::unordered_map<CapsPort, std::string> _caps_txt{
136  {CapsPort::kInput, ""}, {CapsPort::kOutput, ""}};
137  GuardDataT<void> _userData;
138 
139  mutable ImplMutex _mutex;
140  State _state = State::kNone;
141 };
142 
143 }} // namespace ds3d::impl
144 
145 #endif // _DS3D_COMMON_IMPL_BASE_DATA_PROCESS_H
ds3d::isGood
bool isGood(ErrCode c)
Definition: func_utils.h:28
ds3d::CapsPort
CapsPort
Definition: abi_dataprocess.h:61
ds3d::impl::BaseImplDataProcessor::stopImpl
virtual ErrCode stopImpl()=0
ds3d::impl::BaseImplDataProcessor::flushImpl
virtual ErrCode flushImpl()=0
ds3d::impl::BaseImplDataProcessor::mutex
ImplMutex & mutex() const
Definition: impl_dataprocess.h:125
ds3d::impl::BaseImplDataProcessor< abiDataBridge >::OnGuardBridgeDataCBImpl
std::function< void(ErrCode, const struct VideoBridge2dInput *)> OnGuardBridgeDataCBImpl
Definition: impl_dataprocess.h:30
ds3d::VideoBridge2dInput
Definition: idatatype.h:152
ds3d::impl::BaseImplDataProcessor::~BaseImplDataProcessor
~BaseImplDataProcessor() override
Definition: impl_dataprocess.h:34
ds3d::CapsPort::kInput
@ kInput
ds3d::GuardRef::abiRef
ref * abiRef() const
Definition: obj.hpp:269
ds3d::ErrCode::kGood
@ kGood
ds3d::impl::BaseImplDataProcessor< abiDataBridge >::OnGuardDataCBImpl
std::function< void(ErrCode, GuardDataMap)> OnGuardDataCBImpl
Definition: impl_dataprocess.h:29
ds3d::impl::BaseImplDataProcessor::emitError
void emitError(ErrCode code, const std::string &msg)
Definition: impl_dataprocess.h:105
ds3d::State::kStopped
@ kStopped
ds3d::abiRefT< void >
ds3d::impl::BaseImplDataProcessor::getCaps_i
const char * getCaps_i(CapsPort p) const final
Definition: impl_dataprocess.h:62
ds3d::ErrCode
ErrCode
Definition: common.h:43
ds3d::impl::BaseImplDataProcessor::getUserData_i
const abiRefAny * getUserData_i() const final
Definition: impl_dataprocess.h:48
datamap.hpp
obj.hpp
ds3d::GuardDataT< void >
ds3d::State::kStarting
@ kStarting
ds3d::impl::BaseImplDataProcessor::setErrorCallback_i
void setErrorCallback_i(const abiErrorCB &cb) final
Definition: impl_dataprocess.h:49
ds3d::impl::BaseImplDataProcessor::setOutputCaps
void setOutputCaps(const std::string &caps)
Definition: impl_dataprocess.h:101
ds3d::impl::BaseImplDataProcessor::stop_i
ErrCode stop_i() override
Definition: impl_dataprocess.h:80
ds3d::GuardRef::reset
void reset(ref *abiref=nullptr)
Definition: obj.hpp:260
abi_dataprocess.h
ds3d::impl::BaseImplDataProcessor::setStateSafe
void setStateSafe(State flag)
Definition: impl_dataprocess.h:118
ds3d::impl::BaseImplDataProcessor::getStateSafe
State getStateSafe() const
Definition: impl_dataprocess.h:112
ds3d::impl::BaseImplDataProcessor::state_i
State state_i() const final
Definition: impl_dataprocess.h:92
ds3d::State
State
All custom-libs need create the abi reference for DataLoader, DataRender, and DataFilter.
Definition: abi_dataprocess.h:51
ds3d::impl::BaseImplDataProcessor::start_i
ErrCode start_i(const char *configStr, uint32_t strLen, const char *path) override
Definition: impl_dataprocess.h:50
ds3d::impl::BaseImplDataProcessor< abiDataBridge >::ImplMutex
std::recursive_mutex ImplMutex
Definition: impl_dataprocess.h:31
ds3d::impl::BaseImplDataProcessor
BaseProcessIF could be abiDataLoader/abiDataRender/abiDataFilter or any others abi interface that der...
Definition: impl_dataprocess.h:27
ds3d::CapsPort::kOutput
@ kOutput
ds3d::State::kNone
@ kNone
ds3d::impl::BaseImplDataProcessor::startImpl
virtual ErrCode startImpl(const std::string &content, const std::string &path)=0
ds3d::GuardDataMap
Definition: datamap.hpp:21
DS3D_FAILED_RETURN
#define DS3D_FAILED_RETURN(condition, ret, fmt,...)
Definition: defines.h:64
ds3d::cppString
std::string cppString(const char *str, size_t len=0)
Definition: func_utils.h:108
ds3d::State::kRunning
@ kRunning
ds3d::impl::BaseImplDataProcessor::BaseImplDataProcessor
BaseImplDataProcessor()
Definition: impl_dataprocess.h:33
ds3d
Definition: lidar_3d_datatype.h:33
ds3d::impl::BaseImplDataProcessor::flush_i
ErrCode flush_i() override
Definition: impl_dataprocess.h:72
ds3d::abiCallBackT
Definition: abi_obj.h:71
ds3d::ErrCode::kState
@ kState
ds3d::impl::BaseImplDataProcessor::setUserData_i
void setUserData_i(const abiRefAny *userdata) final
Definition: impl_dataprocess.h:40
ds3d::impl::BaseImplDataProcessor::setInputCaps
void setInputCaps(const std::string &caps)
Definition: impl_dataprocess.h:103
ds3d::GuardCB
Definition: obj.hpp:285