8 #include <condition_variable> 13 #include <nx/sdk/analytics/helpers/consuming_device_agent.h> 14 #include <nx/sdk/analytics/helpers/pixel_format.h> 15 #include <nx/sdk/analytics/helpers/object_metadata_packet.h> 18 #include "objects/random.h" 19 #include "stub_analytics_plugin_ini.h" 20 #include "modules/standard_taxonomy/module.h" 23 namespace vms_server_plugins {
34 virtual void getPluginSideSettings(
37 virtual void doSetNeededMetadataTypes(
54 virtual bool pullMetadataPackets(
55 std::vector<nx::sdk::analytics::IMetadataPacket*>* metadataPackets)
override;
60 std::vector<nx::sdk::analytics::IMetadataPacket*> cookSomeObjects();
63 int64_t metadataTimestampUs);
65 void addBlinkingObjectIfNeeded(
66 int64_t metadataTimestampUs,
67 std::vector<nx::sdk::analytics::IMetadataPacket*>* metadataPackets,
70 void addFixedObjectIfNeeded(
73 void addCounterIfNeeded(
76 int64_t usSinceEpoch()
const;
80 void processCustomMetadataPacket(
86 bool checkVideoFramePlane(
91 void dumpSomeFrameBytes(
97 void stopFetchingMetadata();
101 void processPluginDiagnosticEvents();
103 void setObjectCount(
int objectCount);
105 void cleanUpTimestampQueue();
107 void parseSettings();
109 template<
typename ObjectType>
110 void setIsObjectTypeGenerationNeeded(
bool isObjectTypeGenerationNeeded)
112 if (isObjectTypeGenerationNeeded)
114 m_objectGenerator.registerObjectFactory<ObjectType>(
115 []() {
return std::make_unique<ObjectType>(); });
119 m_objectGenerator.unregisterObjectFactory<ObjectType>();
123 void updateObjectGenerationParameters();
125 void updateEventGenerationParameters();
127 void updateManifest();
129 void processFrameMotion(
132 std::string capabilities()
const;
137 std::atomic<bool> m_terminated{
false};
139 std::unique_ptr<std::thread> m_pluginDiagnosticEventThread;
140 std::mutex m_pluginDiagnosticEventGenerationLoopMutex;
141 std::condition_variable m_pluginDiagnosticEventGenerationLoopCondition;
142 std::atomic<bool> m_needToThrowPluginDiagnosticEvents{
false};
144 std::unique_ptr<std::thread> m_eventThread;
145 std::mutex m_eventGenerationLoopMutex;
146 std::condition_variable m_eventGenerationLoopCondition;
147 std::atomic<bool> m_eventsNeeded{
false};
149 int m_frameCounter = 0;
150 std::string m_eventTypeId;
152 std::deque<int64_t> m_frameTimestampUsQueue;
153 int64_t m_lastVideoFrameTimestampUs = 0;
154 int64_t m_lastBlinkingObjectTimestampUs = 0;
156 struct DeviceAgentSettings
158 bool needToGenerateObjects()
const 160 return !
ini().visualizeMotion
163 || generatePedestrians
164 || generateHumanFaces
167 || generateFixedObject
169 || blinkingObjectPeriodMs.load() != std::chrono::milliseconds::zero());
172 std::atomic<bool> generateEvents{
true};
173 std::atomic<bool> generateCars{
true};
174 std::atomic<bool> generateTrucks{
true};
175 std::atomic<bool> generatePedestrians{
true};
176 std::atomic<bool> generateHumanFaces{
true};
177 std::atomic<bool> generateBicycles{
true};
178 std::atomic<bool> generateStones{
false};
179 std::atomic<bool> generateFixedObject{
false};
181 std::mutex fixedObjectColorMutex;
182 std::string fixedObjectColor;
184 std::atomic<bool> generateCounter{
false};
186 std::atomic<std::chrono::milliseconds> blinkingObjectPeriodMs{
187 std::chrono::milliseconds::zero()};
189 std::atomic<bool> blinkingObjectInDedicatedPacket{
false};
191 std::atomic<int> numberOfObjectsToGenerate{1};
192 std::atomic<int> generateObjectsEveryNFrames{1};
194 std::atomic<bool> generatePreviews{
true};
196 std::atomic<bool> throwPluginDiagnosticEvents{
false};
197 std::atomic<bool> leakFrames{
false};
199 std::atomic<std::chrono::milliseconds> additionalFrameProcessingDelayMs{
200 std::chrono::milliseconds::zero()};
202 std::atomic<std::chrono::milliseconds> overallMetadataDelayMs{
203 std::chrono::milliseconds::zero()};
205 std::atomic<int> numberOfFramesBeforePreviewGeneration{30};
207 std::atomic<float> counterBoundingBoxSideSize{0};
208 std::atomic<float> counterBoundingBoxXOffset{0};
209 std::atomic<float> counterBoundingBoxYOffset{0};
211 std::atomic<bool> declareAdditionalEventTypes{
false};
213 std::vector<char> previewImage;
214 std::string previewImageFormat;
215 std::string previewImageUrl;
218 DeviceAgentSettings m_deviceAgentSettings;
222 int currentEventTypeIndex = 0;
225 EventContext m_eventContext;
229 ObjectContext() =
default;
230 ObjectContext(std::unique_ptr<AbstractObject>
object): object(std::move(
object)) {}
232 ObjectContext& operator=(std::unique_ptr<AbstractObject>&& otherObject)
235 object = std::move(otherObject);
242 isPreviewGenerated =
false;
246 bool operator!()
const {
return !object; }
248 std::unique_ptr<AbstractObject> object;
249 bool isPreviewGenerated =
false;
250 int frameCounter = 0;
253 std::mutex m_objectGenerationMutex;
255 std::vector<ObjectContext> m_objectContexts;
256 int m_counterObjectAttributeValue = 0;
261 const std::string kLineCrossingEventType =
"nx.stub.lineCrossing";
262 const std::string kObjectInTheAreaEventType =
"nx.stub.objectInTheArea";
263 const std::string kLoiteringEventType =
"nx.stub.loitering";
264 const std::string kIntrusionEventType =
"nx.stub.intrusion";
265 const std::string kGunshotEventType =
"nx.stub.gunshot";
266 const std::string kSuspiciousNoiseEventType =
"nx.stub.suspiciousNoise";
267 const std::string kSoundRelatedEventGroup =
"nx.stub.soundRelated";
268 const std::string kBlinkingObjectType =
"nx.stub.blinkingObject";
269 const std::string kFixedObjectType =
"nx.stub.fixedObject";
270 const std::string kCounterObjectType =
"nx.stub.counter";
271 const std::string kAdditionalEventType =
"nx.stub.additionalEvent1";
272 const std::string kAdditionalEventType2 =
"nx.stub.additionalEvent2";
virtual bool pushCompressedVideoFrame(const nx::sdk::analytics::ICompressedVideoPacket *videoFrame) override
Definition: device_agent.cpp:383
virtual bool pushUncompressedVideoFrame(const nx::sdk::analytics::IUncompressedVideoFrame *videoFrame) override
Definition: device_agent.cpp:399
Definition: i_compressed_video_packet.h:34
virtual nx::sdk::Result< const nx::sdk::ISettingsResponse * > settingsReceived() override
Definition: device_agent.cpp:303
virtual bool pushCustomMetadataPacket(const nx::sdk::analytics::ICustomMetadataPacket *customMetadataPacket) override
Definition: device_agent.cpp:415
virtual std::string manifestString() const override
Definition: device_agent.cpp:194
Definition: consuming_device_agent.h:38
Definition: i_device_info.h:14
static TestIni & ini()
Definition: ini_config_ut.cpp:72
Definition: apple_utils.h:6
Definition: i_uncompressed_video_frame.h:73
Definition: i_data_packet.h:17
Definition: device_agent.h:27