NVIDIA DeepStream SDK API Reference

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