27 #ifndef __GSTNVINFERSERVER_IMPL_H__
28 #define __GSTNVINFERSERVER_IMPL_H__
35 #include <condition_variable>
42 #include <nvbufsurface.h>
43 #include <nvbufsurftransform.h>
45 #include "infer_icontext.h"
46 #include "infer_utils.h"
49 #include "nvtx3/nvToolsExt.h"
52 #include "infer_datatypes.h"
53 #include "infer_post_datatypes.h"
54 #include "nvdsinferserver_config.pb.h"
55 #include "nvdsinferserver_plugin.pb.h"
62 const char* log_message,
void* user_ctx);
65 namespace ic = nvdsinferserver::config;
70 class BatchSurfaceBuffer;
79 struct GstNvInferServerObjectHistory {
96 using WeakObjHistory = std::weak_ptr<GstNvInferServerObjectHistory>;
101 typedef std::unordered_map<uint64_t, SharedObjHistory>
111 gulong last_cleanup_frame_num = 0;
113 gulong last_seen_frame_num = 0;
114 } GstNvInferServerSourceInfo;
119 struct GstNvInferServerProperties {
142 struct RequestBuffer;
147 class GstNvInferServerImpl {
154 class ObjTrackingData {
166 bool initSource(uint32_t
id) {
167 m_SourceInfo.emplace(
id, GstNvInferServerSourceInfo{});
176 void removeSource(uint32_t
id) { m_SourceInfo.erase(
id); }
185 GstNvInferServerSourceInfo* findSource(
int id);
194 bool hasSource(uint32_t
id)
const {
195 return m_SourceInfo.find(
id) != m_SourceInfo.end();
207 uint32_t sourceId, uint64_t objId);
218 uint32_t sourceId, uint64_t objId);
224 void clear() { m_SourceInfo.clear(); }
236 void clearUpHistory(uint64_t seqId);
241 std::unordered_map<uint32_t, GstNvInferServerSourceInfo> m_SourceInfo;
245 gulong m_LastMapCleanupSeqId = 0;
248 using FuncItem = std::function<void()>;
357 return m_NvtxDomain.get();
362 const ic::PluginControl&
config()
const {
return m_PluginConfig; }
363 void updateInterval(guint interval) {m_PluginConfig.mutable_input_control()->set_interval(interval);}
429 std::shared_ptr<RequestBuffer> reqBuf, std::vector<dsis::SharedBatchBuf> batchBuf);
442 void InferenceDone(std::shared_ptr<RequestBuffer> req);
486 ic::PluginControl& mutableConfig() {
return m_PluginConfig; }
487 bool isClassify()
const;
488 bool isDetection()
const;
489 bool isSegmentation()
const;
490 bool isOtherNetowrk()
const;
491 bool isFullFrame()
const;
492 bool maintainAspectRatio()
const;
493 bool symmetricPadding()
const;
494 bool needOutputTensorMeta()
const;
495 bool hasCustomProcess()
const;
496 uint32_t inferInterval()
const {
return m_PluginConfig.input_control().interval(); }
497 bool inputTensorFromMeta()
const
499 return m_PluginConfig.infer_config().has_input_tensor_from_meta();
511 bool validatePluginConfig(
512 ic::PluginControl&
config,
const std::string& path,
513 const GstNvInferServerProperties& update);
539 bool shouldInferObject(
NvDsObjectMeta* obj_meta, uint32_t frameNum,
540 GstNvInferServerObjectHistory* history);
551 bool outputLoop(FuncItem func);
557 using OutputThread = dsis::QueueThread<std::list<FuncItem>>;
564 mutable std::mutex m_ProcessMutex;
566 ic::PluginControl m_PluginConfig;
568 ObjTrackingData m_ObjTrackingData;
571 std::unique_ptr<OutputThread> m_OutputThread;
574 std::unique_ptr<nvtxDomainRegistration, std::function<void(nvtxDomainRegistration*)>>
578 bool m_Stopped =
false;
587 uint32_t m_IntervalCounter = 0;
589 uint64_t m_UntrackedObjectWarnPts = UINT64_C(-1);
592 bool m_1stInferDone =
false;