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" 22 namespace vms_server_plugins {
33 virtual void getPluginSideSettings(
36 virtual void doSetNeededMetadataTypes(
53 virtual bool pullMetadataPackets(
54 std::vector<nx::sdk::analytics::IMetadataPacket*>* metadataPackets)
override;
59 std::vector<nx::sdk::analytics::IMetadataPacket*> cookSomeObjects();
62 int64_t metadataTimestampUs);
64 void addBlinkingObjectIfNeeded(
65 int64_t metadataTimestampUs,
66 std::vector<nx::sdk::analytics::IMetadataPacket*>* metadataPackets,
69 void addFixedObjectIfNeeded(
72 void addCounterIfNeeded(
75 int64_t usSinceEpoch()
const;
79 void processCustomMetadataPacket(
85 bool checkVideoFramePlane(
90 void dumpSomeFrameBytes(
96 void stopFetchingMetadata();
100 void processPluginDiagnosticEvents();
102 void setObjectCount(
int objectCount);
104 void cleanUpTimestampQueue();
106 void parseSettings();
108 template<
typename ObjectType>
109 void setIsObjectTypeGenerationNeeded(
bool isObjectTypeGenerationNeeded)
111 if (isObjectTypeGenerationNeeded)
113 m_objectGenerator.registerObjectFactory<ObjectType>(
114 []() {
return std::make_unique<ObjectType>(); });
118 m_objectGenerator.unregisterObjectFactory<ObjectType>();
122 void updateObjectGenerationParameters();
124 void updateEventGenerationParameters();
126 void updateManifest();
128 void processFrameMotion(
131 std::string capabilities()
const;
136 std::atomic<bool> m_terminated{
false};
138 std::unique_ptr<std::thread> m_pluginDiagnosticEventThread;
139 std::mutex m_pluginDiagnosticEventGenerationLoopMutex;
140 std::condition_variable m_pluginDiagnosticEventGenerationLoopCondition;
141 std::atomic<bool> m_needToThrowPluginDiagnosticEvents{
false};
143 std::unique_ptr<std::thread> m_eventThread;
144 std::mutex m_eventGenerationLoopMutex;
145 std::condition_variable m_eventGenerationLoopCondition;
146 std::atomic<bool> m_eventsNeeded{
false};
148 int m_frameCounter = 0;
149 std::string m_eventTypeId;
151 std::deque<int64_t> m_frameTimestampUsQueue;
152 int64_t m_lastVideoFrameTimestampUs = 0;
153 int64_t m_lastBlinkingObjectTimestampUs = 0;
155 struct DeviceAgentSettings
157 bool needToGenerateObjects()
const 159 return !
ini().visualizeMotion
162 || generatePedestrians
163 || generateHumanFaces
166 || generateFixedObject
168 || blinkingObjectPeriodMs.load() != std::chrono::milliseconds::zero());
171 std::atomic<bool> generateEvents{
true};
172 std::atomic<bool> generateCars{
true};
173 std::atomic<bool> generateTrucks{
true};
174 std::atomic<bool> generatePedestrians{
true};
175 std::atomic<bool> generateHumanFaces{
true};
176 std::atomic<bool> generateBicycles{
true};
177 std::atomic<bool> generateStones{
false};
178 std::atomic<bool> generateFixedObject{
false};
180 std::mutex fixedObjectColorMutex;
181 std::string fixedObjectColor;
183 std::atomic<bool> generateCounter{
false};
185 std::atomic<std::chrono::milliseconds> blinkingObjectPeriodMs{
186 std::chrono::milliseconds::zero()};
188 std::atomic<bool> blinkingObjectInDedicatedPacket{
false};
190 std::atomic<int> numberOfObjectsToGenerate{1};
191 std::atomic<int> generateObjectsEveryNFrames{1};
193 std::atomic<bool> generatePreviews{
true};
195 std::atomic<bool> throwPluginDiagnosticEvents{
false};
196 std::atomic<bool> leakFrames{
false};
198 std::atomic<std::chrono::milliseconds> additionalFrameProcessingDelayMs{
199 std::chrono::milliseconds::zero()};
201 std::atomic<std::chrono::milliseconds> overallMetadataDelayMs{
202 std::chrono::milliseconds::zero()};
204 std::atomic<int> numberOfFramesBeforePreviewGeneration{30};
206 std::atomic<float> counterBoundingBoxSideSize{0};
207 std::atomic<float> counterBoundingBoxXOffset{0};
208 std::atomic<float> counterBoundingBoxYOffset{0};
210 std::atomic<bool> declareAdditionalEventTypes{
false};
212 std::vector<char> previewImage;
213 std::string previewImageFormat;
214 std::string previewImageUrl;
217 DeviceAgentSettings m_deviceAgentSettings;
221 int currentEventTypeIndex = 0;
224 EventContext m_eventContext;
228 ObjectContext() =
default;
229 ObjectContext(std::unique_ptr<AbstractObject>
object): object(std::move(
object)) {}
231 ObjectContext& operator=(std::unique_ptr<AbstractObject>&& otherObject)
234 object = std::move(otherObject);
241 isPreviewGenerated =
false;
245 bool operator!()
const {
return !object; }
247 std::unique_ptr<AbstractObject> object;
248 bool isPreviewGenerated =
false;
249 int frameCounter = 0;
252 std::mutex m_objectGenerationMutex;
254 std::vector<ObjectContext> m_objectContexts;
255 int m_counterObjectAttributeValue = 0;
258 const std::string kLineCrossingEventType =
"nx.stub.lineCrossing";
259 const std::string kObjectInTheAreaEventType =
"nx.stub.objectInTheArea";
260 const std::string kLoiteringEventType =
"nx.stub.loitering";
261 const std::string kIntrusionEventType =
"nx.stub.intrusion";
262 const std::string kGunshotEventType =
"nx.stub.gunshot";
263 const std::string kSuspiciousNoiseEventType =
"nx.stub.suspiciousNoise";
264 const std::string kSoundRelatedEventGroup =
"nx.stub.soundRelated";
265 const std::string kBlinkingObjectType =
"nx.stub.blinkingObject";
266 const std::string kFixedObjectType =
"nx.stub.fixedObject";
267 const std::string kCounterObjectType =
"nx.stub.counter";
268 const std::string kAdditionalEventType =
"nx.stub.additionalEvent1";
virtual bool pushCompressedVideoFrame(const nx::sdk::analytics::ICompressedVideoPacket *videoFrame) override
Definition: device_agent.cpp:335
virtual bool pushUncompressedVideoFrame(const nx::sdk::analytics::IUncompressedVideoFrame *videoFrame) override
Definition: device_agent.cpp:351
Definition: i_compressed_video_packet.h:34
virtual nx::sdk::Result< const nx::sdk::ISettingsResponse * > settingsReceived() override
Definition: device_agent.cpp:261
virtual bool pushCustomMetadataPacket(const nx::sdk::analytics::ICustomMetadataPacket *customMetadataPacket) override
Definition: device_agent.cpp:367
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:43
Definition: apple_utils.h:6
Definition: i_uncompressed_video_frame.h:73
Definition: i_data_packet.h:17
Definition: device_agent.h:26