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 processFrameMotion(
129 std::string capabilities()
const;
134 std::atomic<bool> m_terminated{
false};
136 std::unique_ptr<std::thread> m_pluginDiagnosticEventThread;
137 std::mutex m_pluginDiagnosticEventGenerationLoopMutex;
138 std::condition_variable m_pluginDiagnosticEventGenerationLoopCondition;
139 std::atomic<bool> m_needToThrowPluginDiagnosticEvents{
false};
141 std::unique_ptr<std::thread> m_eventThread;
142 std::mutex m_eventGenerationLoopMutex;
143 std::condition_variable m_eventGenerationLoopCondition;
144 std::atomic<bool> m_eventsNeeded{
false};
146 int m_frameCounter = 0;
147 std::string m_eventTypeId;
149 std::deque<int64_t> m_frameTimestampUsQueue;
150 int64_t m_lastVideoFrameTimestampUs = 0;
151 int64_t m_lastBlinkingObjectTimestampUs = 0;
153 struct DeviceAgentSettings
155 bool needToGenerateObjects()
const 157 return !
ini().visualizeMotion
160 || generatePedestrians
161 || generateHumanFaces
164 || generateFixedObject
166 || blinkingObjectPeriodMs.load() != std::chrono::milliseconds::zero());
169 std::atomic<bool> generateEvents{
true};
170 std::atomic<bool> generateCars{
true};
171 std::atomic<bool> generateTrucks{
true};
172 std::atomic<bool> generatePedestrians{
true};
173 std::atomic<bool> generateHumanFaces{
true};
174 std::atomic<bool> generateBicycles{
true};
175 std::atomic<bool> generateStones{
false};
176 std::atomic<bool> generateFixedObject{
false};
177 std::atomic<bool> generateCounter{
false};
179 std::atomic<std::chrono::milliseconds> blinkingObjectPeriodMs{
180 std::chrono::milliseconds::zero()};
182 std::atomic<bool> blinkingObjectInDedicatedPacket{
false};
184 std::atomic<int> numberOfObjectsToGenerate{1};
185 std::atomic<int> generateObjectsEveryNFrames{1};
187 std::atomic<bool> generatePreviews{
true};
189 std::atomic<bool> throwPluginDiagnosticEvents{
false};
190 std::atomic<bool> leakFrames{
false};
192 std::atomic<std::chrono::milliseconds> additionalFrameProcessingDelayMs{
193 std::chrono::milliseconds::zero()};
195 std::atomic<std::chrono::milliseconds> overallMetadataDelayMs{
196 std::chrono::milliseconds::zero()};
198 std::atomic<int> numberOfFramesBeforePreviewGeneration{30};
200 std::atomic<float> counterBoundingBoxSideSize{0};
201 std::atomic<float> counterBoundingBoxXOffset{0};
202 std::atomic<float> counterBoundingBoxYOffset{0};
205 DeviceAgentSettings m_deviceAgentSettings;
209 int currentEventTypeIndex = 0;
210 bool isCurrentEventActive =
false;
213 EventContext m_eventContext;
217 ObjectContext() =
default;
218 ObjectContext(std::unique_ptr<AbstractObject>
object): object(std::move(
object)) {}
220 ObjectContext& operator=(std::unique_ptr<AbstractObject>&& otherObject)
223 object = std::move(otherObject);
230 isPreviewGenerated =
false;
234 bool operator!()
const {
return !object; }
236 std::unique_ptr<AbstractObject> object;
237 bool isPreviewGenerated =
false;
238 int frameCounter = 0;
241 std::mutex m_objectGenerationMutex;
243 std::vector<ObjectContext> m_objectContexts;
244 int m_counterObjectAttributeValue = 0;
247 const std::string kLineCrossingEventType =
"nx.stub.lineCrossing";
248 const std::string kObjectInTheAreaEventType =
"nx.stub.objectInTheArea";
249 const std::string kLoiteringEventType =
"nx.stub.loitering";
250 const std::string kIntrusionEventType =
"nx.stub.intrusion";
251 const std::string kGunshotEventType =
"nx.stub.gunshot";
252 const std::string kSuspiciousNoiseEventType =
"nx.stub.suspiciousNoise";
253 const std::string kSoundRelatedEventGroup =
"nx.stub.soundRelatedEvent";
254 const std::string kBlinkingObjectType =
"nx.stub.blinkingObject";
255 const std::string kFixedObjectType =
"nx.stub.fixedObject";
256 const std::string kCounterObjectType =
"nx.stub.counter";
virtual bool pushCompressedVideoFrame(const nx::sdk::analytics::ICompressedVideoPacket *videoFrame) override
Definition: device_agent.cpp:304
virtual bool pushUncompressedVideoFrame(const nx::sdk::analytics::IUncompressedVideoFrame *videoFrame) override
Definition: device_agent.cpp:320
Definition: i_compressed_video_packet.h:35
virtual nx::sdk::Result< const nx::sdk::ISettingsResponse * > settingsReceived() override
Definition: device_agent.cpp:235
virtual bool pushCustomMetadataPacket(const nx::sdk::analytics::ICustomMetadataPacket *customMetadataPacket) override
Definition: device_agent.cpp:336
virtual std::string manifestString() const override
Definition: device_agent.cpp:145
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:71
Definition: i_data_packet.h:16
Definition: device_agent.h:26