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 int64_t usSinceEpoch()
const;
76 void processCustomMetadataPacket(
82 bool checkVideoFramePlane(
87 void dumpSomeFrameBytes(
93 void stopFetchingMetadata();
97 void processPluginDiagnosticEvents();
99 void setObjectCount(
int objectCount);
101 void cleanUpTimestampQueue();
103 void parseSettings();
105 template<
typename ObjectType>
106 void setIsObjectTypeGenerationNeeded(
bool isObjectTypeGenerationNeeded)
108 if (isObjectTypeGenerationNeeded)
110 m_objectGenerator.registerObjectFactory<ObjectType>(
111 []() {
return std::make_unique<ObjectType>(); });
115 m_objectGenerator.unregisterObjectFactory<ObjectType>();
119 void updateObjectGenerationParameters();
121 void updateEventGenerationParameters();
123 void processFrameMotion(
126 std::string capabilities()
const;
131 std::atomic<bool> m_terminated{
false};
133 std::unique_ptr<std::thread> m_pluginDiagnosticEventThread;
134 std::mutex m_pluginDiagnosticEventGenerationLoopMutex;
135 std::condition_variable m_pluginDiagnosticEventGenerationLoopCondition;
136 std::atomic<bool> m_needToThrowPluginDiagnosticEvents{
false};
138 std::unique_ptr<std::thread> m_eventThread;
139 std::mutex m_eventGenerationLoopMutex;
140 std::condition_variable m_eventGenerationLoopCondition;
141 std::atomic<bool> m_eventsNeeded{
false};
143 int m_frameCounter = 0;
144 std::string m_eventTypeId;
146 std::deque<int64_t> m_frameTimestampUsQueue;
147 int64_t m_lastVideoFrameTimestampUs = 0;
148 int64_t m_lastBlinkingObjectTimestampUs = 0;
150 struct DeviceAgentSettings
152 bool needToGenerateObjects()
const 154 return !ini().visualizeMotion
157 || generatePedestrians
158 || generateHumanFaces
161 || generateFixedObject
162 || blinkingObjectPeriodMs.load() != std::chrono::milliseconds::zero());
165 std::atomic<bool> generateEvents{
true};
166 std::atomic<bool> generateCars{
true};
167 std::atomic<bool> generateTrucks{
true};
168 std::atomic<bool> generatePedestrians{
true};
169 std::atomic<bool> generateHumanFaces{
true};
170 std::atomic<bool> generateBicycles{
true};
171 std::atomic<bool> generateStones{
false};
172 std::atomic<bool> generateFixedObject{
false};
174 std::atomic<std::chrono::milliseconds> blinkingObjectPeriodMs{
175 std::chrono::milliseconds::zero()};
177 std::atomic<bool> blinkingObjectInDedicatedPacket{
false};
179 std::atomic<int> numberOfObjectsToGenerate{1};
180 std::atomic<int> generateObjectsEveryNFrames{1};
182 std::atomic<bool> generatePreviews{
true};
184 std::atomic<bool> throwPluginDiagnosticEvents{
false};
185 std::atomic<bool> leakFrames{
false};
187 std::atomic<std::chrono::milliseconds> additionalFrameProcessingDelayMs{
188 std::chrono::milliseconds::zero()};
190 std::atomic<std::chrono::milliseconds> overallMetadataDelayMs{
191 std::chrono::milliseconds::zero()};
193 std::atomic<int> numberOfFramesBeforePreviewGeneration{30};
196 DeviceAgentSettings m_deviceAgentSettings;
200 int currentEventTypeIndex = 0;
201 bool isCurrentEventActive =
false;
204 EventContext m_eventContext;
208 ObjectContext() =
default;
209 ObjectContext(std::unique_ptr<AbstractObject>
object): object(std::move(
object)) {}
211 ObjectContext& operator=(std::unique_ptr<AbstractObject>&& otherObject)
214 object = std::move(otherObject);
221 isPreviewGenerated =
false;
225 bool operator!()
const {
return !object; }
227 std::unique_ptr<AbstractObject> object;
228 bool isPreviewGenerated =
false;
229 int frameCounter = 0;
232 std::mutex m_objectGenerationMutex;
234 std::vector<ObjectContext> m_objectContexts;
237 const std::string kLineCrossingEventType =
"nx.stub.lineCrossing";
238 const std::string kObjectInTheAreaEventType =
"nx.stub.objectInTheArea";
239 const std::string kLoiteringEventType =
"nx.stub.loitering";
240 const std::string kIntrusionEventType =
"nx.stub.intrusion";
241 const std::string kGunshotEventType =
"nx.stub.gunshot";
242 const std::string kSuspiciousNoiseEventType =
"nx.stub.suspiciousNoise";
243 const std::string kSoundRelatedEventGroup =
"nx.stub.soundRelatedEvent";
244 const std::string kBlinkingObjectType =
"nx.stub.blinkingObject";
245 const std::string kFixedObjectType =
"nx.stub.fixedObject";
virtual bool pushCompressedVideoFrame(const nx::sdk::analytics::ICompressedVideoPacket *videoFrame) override
Definition: device_agent.cpp:276
virtual nx::sdk::Result< const nx::sdk::IStringMap * > settingsReceived() override
Definition: device_agent.cpp:225
virtual bool pushUncompressedVideoFrame(const nx::sdk::analytics::IUncompressedVideoFrame *videoFrame) override
Definition: device_agent.cpp:292
Definition: i_compressed_video_packet.h:35
virtual bool pushCustomMetadataPacket(const nx::sdk::analytics::ICustomMetadataPacket *customMetadataPacket) override
Definition: device_agent.cpp:308
virtual std::string manifestString() const override
Definition: device_agent.cpp:139
Definition: consuming_device_agent.h:38
Definition: i_device_info.h:14
Definition: apple_utils.h:6
Definition: i_uncompressed_video_frame.h:71
Definition: i_data_packet.h:16
Definition: device_agent.h:26