NVIDIA DeepStream SDK API Reference

7.0 Release
deepstream_lidar_infer_context.hpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 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 #ifndef DEEPSTREAM_LIDAR_INFER_CONTEXT_APP_H
14 #define DEEPSTREAM_LIDAR_INFER_CONTEXT_APP_H
15 
16 #include "gstnvdsmeta.h"
17 
18 // inlcude all ds3d hpp header files
23 
24 // inlucde nvds3d Gst header files
27 #include <ds3d/gst/nvds3d_meta.h>
28 #include <gst/gst.h>
29 
30 namespace ds3d { namespace lidarinfer {
31 
33 public:
36 
37  void setMainloop(GMainLoop* loop) { _mainLoop.reset(loop); }
38 
39  ErrCode init(const std::string& name)
40  {
43  _pipeline.reset(gst_pipeline_new(name.c_str()));
44  DS3D_FAILED_RETURN(pipeline(), ErrCode::kGst, "create pipeline: %s failed", name.c_str());
45  _pipeline.setName(name);
46  _bus.reset(gst_pipeline_get_bus(pipeline()));
47  DS3D_FAILED_RETURN(bus(), ErrCode::kGst, "get bus from pipeline: %s failed", name.c_str());
48  _busWatchId = gst_bus_add_watch(bus(), sBusCall, this);
49  return ErrCode::kGood;
50  }
51 
53  {
56  gst_bin_add(GST_BIN(pipeline()), ele.copy()), ErrCode::kGst, "add element failed");
57  _elementList.emplace_back(ele);
58  return *this;
59  }
60 
62  {
64  return setPipelineState(GST_STATE_PLAYING);
65  }
66 
67  virtual ErrCode stop()
68  {
70  ErrCode c = setPipelineState(GST_STATE_NULL);
71  if (!isGood(c)) {
72  LOG_WARNING("set pipeline state to GST_STATE_NULL failed");
73  }
74  if (!isGood(c)) {
75  LOG_WARNING("set pipeline state to GST_STATE_NULL failed");
76  }
77  GstState end = GST_STATE_NULL;
78  c = getState(_pipeline.get(), &end, nullptr, 3000);
79  if (!isGood(c) || end != GST_STATE_NULL) {
80  LOG_WARNING("waiting for pipeline state to null failed, force to quit");
81  }
82  for (auto& each : _elementList) {
83  if (each) {
84  c = setState(each.get(), GST_STATE_NULL);
85  }
86  }
87  return c;
88  }
89 
90  /* timeout: milliseconds, 0 means never timeout */
91  bool isRunning(size_t timeout = 0)
92  {
94  GstState state = GST_STATE_NULL;
95  GstState pending = GST_STATE_NULL;
96  if (gst_element_get_state(
97  GST_ELEMENT(pipeline()), &state, &pending,
98  (timeout ? timeout * 1000000 : GST_CLOCK_TIME_NONE)) == GST_STATE_CHANGE_FAILURE) {
99  return false;
100  }
101  if (state == GST_STATE_PLAYING || pending == GST_STATE_PLAYING) {
102  return true;
103  }
104  return false;
105  }
106 
108  {
109  if (mainLoop()) {
110  g_main_loop_quit(mainLoop());
111  }
112  }
113 
114  void runMainLoop()
115  {
116  if (mainLoop()) {
117  g_main_loop_run(mainLoop());
118  }
119  }
120 
121  virtual void deinit()
122  {
123  if (bus()) {
124  gst_bus_remove_watch(bus());
125  }
126  _bus.reset();
127  _pipeline.reset();
128  _elementList.clear();
129  _mainLoop.reset();
130  }
131 
133  {
135  gst_element_send_event(GST_ELEMENT(pipeline()), gst_event_new_eos()), ErrCode::kGst,
136  "send EOS failed");
137  return ErrCode::kGood;
138  }
139 
140  GstPipeline* pipeline() const { return GST_PIPELINE_CAST(_pipeline.get()); }
141  GstBus* bus() const { return _bus.get(); }
142  GMainLoop* mainLoop() const { return _mainLoop.get(); }
143 
144 private:
145  // no need to free msg
146  virtual bool busCall(GstMessage* msg) = 0;
147 
148 protected:
149  ErrCode setPipelineState(GstState state)
150  {
152  return setState(_pipeline.get(), state);
153  }
154 
155  ErrCode setState(GstElement* ele, GstState state)
156  {
157  DS_ASSERT(ele);
159  gst_element_set_state(ele, state) != GST_STATE_CHANGE_FAILURE, ErrCode::kGst,
160  "element set state: %d failed", state);
161  return ErrCode::kGood;
162  }
163  /* get element states. timeout in milliseconds.
164  */
166  GstElement* ele, GstState* state, GstState* pending = nullptr, size_t timeout = 0)
167  {
168  DS_ASSERT(ele);
169  GstStateChangeReturn ret = gst_element_get_state(
170  ele, state, pending, (timeout ? timeout * 1000000 : GST_CLOCK_TIME_NONE));
171  switch (ret) {
172  case GST_STATE_CHANGE_FAILURE:
173  return ErrCode::kGst;
174  case GST_STATE_CHANGE_SUCCESS:
175  case GST_STATE_CHANGE_NO_PREROLL:
176  return ErrCode::kGood;
177  default:
178  return ErrCode::kUnknown;
179  }
180  return ErrCode::kGood;
181  }
182 
183  static gboolean sBusCall(GstBus* bus, GstMessage* msg, gpointer data)
184  {
185  DsLidarInferAppContext* ctx = static_cast<DsLidarInferAppContext*>(data);
186  DS_ASSERT(ctx->bus() == bus);
187  return ctx->busCall(msg);
188  }
189 
190  // members
193  uint32_t _busWatchId = 0;
194  std::vector<gst::ElePtr> _elementList;
195  ds3d::UniqPtr<GMainLoop> _mainLoop{nullptr, g_main_loop_unref};
197 };
198 
199 }} // namespace ds3d::app
200 
201 #endif // DEEPSTREAM_LIDAR_INFER_CONTEXT_APP_H
ds3d::isGood
bool isGood(ErrCode c)
Definition: func_utils.h:28
ds3d::lidarinfer::DsLidarInferAppContext::runMainLoop
void runMainLoop()
Definition: deepstream_lidar_infer_context.hpp:114
yaml_config.hpp
nvds3d_gst_plugin.h
ds3d::lidarinfer::DsLidarInferAppContext::mainLoop
GMainLoop * mainLoop() const
Definition: deepstream_lidar_infer_context.hpp:142
ds3d::UniqPtr
std::unique_ptr< T, std::function< void(T *)> > UniqPtr
Definition: obj.hpp:31
DS_ASSERT
#define DS_ASSERT(...)
Definition: defines.h:31
ds3d::lidarinfer::DsLidarInferAppContext::_bus
gst::BusPtr _bus
Definition: deepstream_lidar_infer_context.hpp:192
ds3d::lidarinfer::DsLidarInferAppContext::setPipelineState
ErrCode setPipelineState(GstState state)
Definition: deepstream_lidar_infer_context.hpp:149
LOG_WARNING
#define LOG_WARNING
Definition: logging.h:17
ds3d::ErrCode::kGst
@ kGst
ds3d::gst::GstPtr
Definition: nvds3d_gst_ptr.h:54
ds3d::lidarinfer::DsLidarInferAppContext::init
ErrCode init(const std::string &name)
Definition: deepstream_lidar_infer_context.hpp:39
ds3d::ErrCode::kGood
@ kGood
ds3d::lidarinfer::DsLidarInferAppContext::_pipeline
gst::ElePtr _pipeline
Definition: deepstream_lidar_infer_context.hpp:191
ds3d::lidarinfer::DsLidarInferAppContext::sendEOS
ErrCode sendEOS()
Definition: deepstream_lidar_infer_context.hpp:132
ds3d::lidarinfer::DsLidarInferAppContext::DS3D_DISABLE_CLASS_COPY
DS3D_DISABLE_CLASS_COPY(DsLidarInferAppContext)
dataloader.hpp
ds3d::gst::ElePtr
Definition: nvds3d_gst_ptr.h:150
ds3d::lidarinfer::DsLidarInferAppContext::setState
ErrCode setState(GstElement *ele, GstState state)
Definition: deepstream_lidar_infer_context.hpp:155
ds3d::lidarinfer::DsLidarInferAppContext::add
DsLidarInferAppContext & add(const gst::ElePtr &ele)
Definition: deepstream_lidar_infer_context.hpp:52
ds3d::ErrCode
ErrCode
Definition: common.h:43
nvds3d_gst_ptr.h
ds3d::lidarinfer::DsLidarInferAppContext::getState
ErrCode getState(GstElement *ele, GstState *state, GstState *pending=nullptr, size_t timeout=0)
Definition: deepstream_lidar_infer_context.hpp:165
datamap.hpp
ds3d::gst::GstPtr::setName
void setName(const std::string &name)
Definition: nvds3d_gst_ptr.h:68
ds3d::lidarinfer::DsLidarInferAppContext::play
ErrCode play()
Definition: deepstream_lidar_infer_context.hpp:61
frame.hpp
ds3d::lidarinfer::DsLidarInferAppContext::pipeline
GstPipeline * pipeline() const
Definition: deepstream_lidar_infer_context.hpp:140
ds3d::lidarinfer::DsLidarInferAppContext::stop
virtual ErrCode stop()
Definition: deepstream_lidar_infer_context.hpp:67
ds3d::lidarinfer::DsLidarInferAppContext::~DsLidarInferAppContext
virtual ~DsLidarInferAppContext()
Definition: deepstream_lidar_infer_context.hpp:35
gstnvdsmeta.h
ds3d::gst::GstPtr::copy
GstObjT * copy() const
Definition: nvds3d_gst_ptr.h:98
ds3d::lidarinfer::DsLidarInferAppContext::bus
GstBus * bus() const
Definition: deepstream_lidar_infer_context.hpp:141
ds3d::lidarinfer::DsLidarInferAppContext::setMainloop
void setMainloop(GMainLoop *loop)
Definition: deepstream_lidar_infer_context.hpp:37
ds3d::gst::GstPtr::get
GstObjT * get() const
Definition: nvds3d_gst_ptr.h:110
ds3d::lidarinfer::DsLidarInferAppContext::deinit
virtual void deinit()
Definition: deepstream_lidar_infer_context.hpp:121
nvds3d_meta.h
DS3D_THROW_ERROR
#define DS3D_THROW_ERROR(statement, code, msg)
Definition: defines.h:78
ds3d::lidarinfer::DsLidarInferAppContext::_busWatchId
uint32_t _busWatchId
Definition: deepstream_lidar_infer_context.hpp:193
ds3d::lidarinfer::DsLidarInferAppContext::isRunning
bool isRunning(size_t timeout=0)
Definition: deepstream_lidar_infer_context.hpp:91
ds3d::lidarinfer::DsLidarInferAppContext::sBusCall
static gboolean sBusCall(GstBus *bus, GstMessage *msg, gpointer data)
Definition: deepstream_lidar_infer_context.hpp:183
ds3d::ErrCode::kUnknown
@ kUnknown
ds3d::lidarinfer::DsLidarInferAppContext
Definition: deepstream_lidar_infer_context.hpp:32
DS3D_FAILED_RETURN
#define DS3D_FAILED_RETURN(condition, ret, fmt,...)
Definition: defines.h:64
ds3d::lidarinfer::DsLidarInferAppContext::quitMainLoop
void quitMainLoop()
Definition: deepstream_lidar_infer_context.hpp:107
ds3d::lidarinfer::DsLidarInferAppContext::_elementList
std::vector< gst::ElePtr > _elementList
Definition: deepstream_lidar_infer_context.hpp:194
ds3d
Definition: lidar_3d_datatype.h:35
ds3d::gst::GstPtr::reset
void reset(GstObjT *obj=nullptr, bool takeOwner=true)
Definition: nvds3d_gst_ptr.h:89
ds3d::lidarinfer::DsLidarInferAppContext::DsLidarInferAppContext
DsLidarInferAppContext()
Definition: deepstream_lidar_infer_context.hpp:34
ds3d::lidarinfer::DsLidarInferAppContext::_mainLoop
ds3d::UniqPtr< GMainLoop > _mainLoop
Definition: deepstream_lidar_infer_context.hpp:195