22 #ifndef __GSTNVINFERSERVER_IMPL_H__
23 #define __GSTNVINFERSERVER_IMPL_H__
30 #include <condition_variable>
37 #include <nvbufsurface.h>
38 #include <nvbufsurftransform.h>
40 #include "infer_icontext.h"
41 #include "infer_utils.h"
44 #include "nvtx3/nvToolsExt.h"
47 #include "infer_datatypes.h"
48 #include "infer_post_datatypes.h"
49 #include "nvdsinferserver_config.pb.h"
50 #include "nvdsinferserver_plugin.pb.h"
57 const char* log_message,
void* user_ctx);
60 namespace ic = nvdsinferserver::config;
65 class BatchSurfaceBuffer;
74 struct GstNvInferServerObjectHistory {
91 using WeakObjHistory = std::weak_ptr<GstNvInferServerObjectHistory>;
96 typedef std::unordered_map<uint64_t, SharedObjHistory>
106 gulong last_cleanup_frame_num = 0;
108 gulong last_seen_frame_num = 0;
109 } GstNvInferServerSourceInfo;
114 struct GstNvInferServerProperties {
137 struct RequestBuffer;
142 class GstNvInferServerImpl {
149 class ObjTrackingData {
161 bool initSource(uint32_t
id) {
162 m_SourceInfo.emplace(
id, GstNvInferServerSourceInfo{});
171 void removeSource(uint32_t
id) { m_SourceInfo.erase(
id); }
180 GstNvInferServerSourceInfo* findSource(
int id);
189 bool hasSource(uint32_t
id)
const {
190 return m_SourceInfo.find(
id) != m_SourceInfo.end();
202 uint32_t sourceId, uint64_t objId);
213 uint32_t sourceId, uint64_t objId);
219 void clear() { m_SourceInfo.clear(); }
231 void clearUpHistory(uint64_t seqId);
236 std::unordered_map<uint32_t, GstNvInferServerSourceInfo> m_SourceInfo;
240 gulong m_LastMapCleanupSeqId = 0;
243 using FuncItem = std::function<void()>;
352 return m_NvtxDomain.get();
357 const ic::PluginControl&
config()
const {
return m_PluginConfig; }
358 void updateInterval(guint interval) {m_PluginConfig.mutable_input_control()->set_interval(interval);}
424 std::shared_ptr<RequestBuffer> reqBuf, std::vector<dsis::SharedBatchBuf> batchBuf);
437 void InferenceDone(std::shared_ptr<RequestBuffer> req);
481 ic::PluginControl& mutableConfig() {
return m_PluginConfig; }
482 bool isClassify()
const;
483 bool isDetection()
const;
484 bool isSegmentation()
const;
485 bool isOtherNetowrk()
const;
486 bool isFullFrame()
const;
487 bool maintainAspectRatio()
const;
488 bool symmetricPadding()
const;
489 bool needOutputTensorMeta()
const;
490 bool hasCustomProcess()
const;
491 uint32_t inferInterval()
const {
return m_PluginConfig.input_control().interval(); }
492 bool inputTensorFromMeta()
const
494 return m_PluginConfig.infer_config().has_input_tensor_from_meta();
506 bool validatePluginConfig(
507 ic::PluginControl&
config,
const std::string& path,
508 const GstNvInferServerProperties& update);
534 bool shouldInferObject(
NvDsObjectMeta* obj_meta, uint32_t frameNum,
535 GstNvInferServerObjectHistory* history);
546 bool outputLoop(FuncItem func);
552 using OutputThread = dsis::QueueThread<std::list<FuncItem>>;
559 mutable std::mutex m_ProcessMutex;
561 ic::PluginControl m_PluginConfig;
563 ObjTrackingData m_ObjTrackingData;
566 std::unique_ptr<OutputThread> m_OutputThread;
569 std::unique_ptr<nvtxDomainRegistration, std::function<void(nvtxDomainRegistration*)>>
573 bool m_Stopped =
false;
582 uint32_t m_IntervalCounter = 0;
584 uint64_t m_UntrackedObjectWarnPts = UINT64_C(-1);
587 bool m_1stInferDone =
false;