nx_metadata_sdk  1.0
Metadata SDK
device_agent.h
1 // Copyright 2018-present Network Optix, Inc. Licensed under MPL 2.0: www.mozilla.org/MPL/2.0/
2 
3 #pragma once
4 
5 #include <thread>
6 #include <atomic>
7 #include <memory>
8 #include <condition_variable>
9 #include <vector>
10 #include <string>
11 
12 #include <nx/sdk/analytics/helpers/video_frame_processing_device_agent.h>
13 #include <nx/sdk/analytics/helpers/pixel_format.h>
14 
15 #include "engine.h"
16 #include "objects/random.h"
17 
18 namespace nx {
19 namespace vms_server_plugins {
20 namespace analytics {
21 namespace stub {
22 
24 {
25 public:
26  DeviceAgent(Engine* engine, const nx::sdk::IDeviceInfo* deviceInfo);
27  virtual ~DeviceAgent() override;
28 
29 protected:
30  virtual void getPluginSideSettings(
31  nx::sdk::Result<const nx::sdk::ISettingsResponse*>* outResult) const override;
32 
33  virtual void doSetNeededMetadataTypes(
34  nx::sdk::Result<void>* outValue,
35  const nx::sdk::analytics::IMetadataTypes* neededMetadataTypes) override;
36 
37  virtual std::string manifestString() const override;
38 
40 
41  virtual bool pushCompressedVideoFrame(
42  const nx::sdk::analytics::ICompressedVideoPacket* videoFrame) override;
43 
44  virtual bool pushUncompressedVideoFrame(
45  const nx::sdk::analytics::IUncompressedVideoFrame* videoFrame) override;
46 
47  virtual bool pullMetadataPackets(
48  std::vector<nx::sdk::analytics::IMetadataPacket*>* metadataPackets) override;
49 
50 private:
51  nx::sdk::analytics::IMetadataPacket* cookSomeEvents();
52  std::vector<nx::sdk::analytics::IMetadataPacket*> cookSomeObjects();
53 
54  int64_t usSinceEpoch() const;
55 
56  void processVideoFrame(const nx::sdk::analytics::IDataPacket* videoFrame, const char* func);
57 
58  bool checkVideoFrame(const nx::sdk::analytics::IUncompressedVideoFrame* frame) const;
59 
60  bool checkVideoFramePlane(
62  const nx::sdk::analytics::PixelFormatDescriptor* pixelFormatDescriptor,
63  int plane) const;
64 
65  void dumpSomeFrameBytes(
67  int plane) const;
68 
69  void startFetchingMetadata(const nx::sdk::analytics::IMetadataTypes* metadataTypes);
70 
71  void stopFetchingMetadata();
72 
73  void processEvents();
74 
75  void processPluginDiagnosticEvents();
76 
77  void setObjectCount(int objectCount);
78 
79  void parseSettings();
80 
81  template<typename ObjectType>
82  void setIsObjectTypeGenerationNeeded(bool isObjectTypeGenerationNeeded)
83  {
84  if (isObjectTypeGenerationNeeded)
85  {
86  m_objectGenerator.registerObjectFactory<ObjectType>(
87  []() { return std::make_unique<ObjectType>(); });
88  }
89  else
90  {
91  m_objectGenerator.unregisterObjectFactory<ObjectType>();
92  }
93  }
94 
95  void updateObjectGenerationParameters();
96 
97  void updateEventGenerationParameters();
98 
99 private:
100  Engine* const m_engine;
101 
102  std::atomic<bool> m_terminated{false};
103 
104  std::unique_ptr<std::thread> m_pluginDiagnosticEventThread;
105  std::mutex m_pluginDiagnosticEventGenerationLoopMutex;
106  std::condition_variable m_pluginDiagnosticEventGenerationLoopCondition;
107  std::atomic<bool> m_needToThrowPluginDiagnosticEvents{false};
108 
109  std::unique_ptr<std::thread> m_eventThread;
110  std::mutex m_eventGenerationLoopMutex;
111  std::condition_variable m_eventGenerationLoopCondition;
112  std::atomic<bool> m_eventsNeeded{false};
113 
114  int m_frameCounter = 0;
115  std::string m_eventTypeId;
116  int64_t m_lastVideoFrameTimestampUs = 0;
117 
118  struct DeviceAgentSettings
119  {
120  bool needToGenerateObjects()
121  {
122  return generateCars
123  || generateTrucks
124  || generatePedestrians
125  || generateHumanFaces
126  || generateBicycles;
127  }
128 
129  std::atomic<bool> generateEvents{true};
130 
131  std::atomic<bool> generateCars{true};
132  std::atomic<bool> generateTrucks{true};
133  std::atomic<bool> generatePedestrians{true};
134  std::atomic<bool> generateHumanFaces{true};
135  std::atomic<bool> generateBicycles{true};
136 
137  std::atomic<int> generateObjectsEveryNFrames{1};
138  std::atomic<int> numberOfObjectsToGenerate{1};
139 
140  std::atomic<bool> generatePreviews{true};
141 
142  std::atomic<bool> throwPluginDiagnosticEvents{false};
143  std::atomic<bool> leakFrames{false};
144  std::atomic<std::chrono::milliseconds> additionalFrameProcessingDelay{
145  std::chrono::milliseconds::zero()};
146 
147  std::atomic<int> numberOfFramesBeforePreviewGeneration{30};
148  };
149 
150  DeviceAgentSettings m_deviceAgentSettings;
151 
152  struct EventContext
153  {
154  int currentEventTypeIndex = 0;
155  bool isCurrentEventActive = false;
156  };
157 
158  EventContext m_eventContext;
159 
160  struct ObjectContext
161  {
162  ObjectContext() = default;
163  ObjectContext(std::unique_ptr<AbstractObject> object): object(std::move(object)) {}
164 
165  ObjectContext& operator=(std::unique_ptr<AbstractObject>&& otherObject)
166  {
167  reset();
168  object = std::move(otherObject);
169  return *this;
170  }
171 
172  void reset()
173  {
174  object.reset();
175  isPreviewGenerated = false;
176  frameCounter = 0;
177  }
178 
179  bool operator!() const { return !object; }
180 
181  std::unique_ptr<AbstractObject> object;
182  bool isPreviewGenerated = false;
183  int frameCounter = 0;
184  };
185 
186  std::mutex m_objectGenerationMutex;
187  RandomObjectGenerator m_objectGenerator;
188  std::vector<ObjectContext> m_objectContexts;
189 };
190 
191 const std::string kLineCrossingEventType = "nx.stub.lineCrossing";
192 const std::string kObjectInTheAreaEventType = "nx.stub.objectInTheArea";
193 const std::string kLoiteringEventType = "nx.stub.loitering";
194 const std::string kIntrusionEventType = "nx.stub.intrusion";
195 const std::string kGunshotEventType = "nx.stub.gunshot";
196 const std::string kSuspiciousNoiseEventType = "nx.stub.suspiciousNoise";
197 const std::string kSoundRelatedEventGroup = "nx.stub.soundRelatedEvent";
198 
199 } // namespace stub
200 } // namespace analytics
201 } // namespace vms_server_plugins
202 } // namespace nx
virtual bool pushCompressedVideoFrame(const nx::sdk::analytics::ICompressedVideoPacket *videoFrame) override
Definition: device_agent.cpp:221
virtual nx::sdk::Result< const nx::sdk::IStringMap * > settingsReceived() override
Definition: device_agent.cpp:181
Definition: i_metadata_packet.h:16
virtual bool pushUncompressedVideoFrame(const nx::sdk::analytics::IUncompressedVideoFrame *videoFrame) override
Definition: device_agent.cpp:233
Definition: i_compressed_video_packet.h:16
virtual std::string manifestString() const override
Definition: device_agent.cpp:135
Definition: i_metadata_types.h:13
Definition: result.h:81
Definition: i_device_info.h:14
Definition: result.h:47
Definition: apple_utils.h:6
Definition: video_frame_processing_device_agent.h:37
Definition: pixel_format.h:26
Definition: i_uncompressed_video_frame.h:13
Definition: i_data_packet.h:16