8 #include <condition_variable> 13 #include <nx/sdk/analytics/helpers/video_frame_processing_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" 21 namespace vms_server_plugins {
32 virtual void getPluginSideSettings(
35 virtual void doSetNeededMetadataTypes(
49 virtual bool pullMetadataPackets(
50 std::vector<nx::sdk::analytics::IMetadataPacket*>* metadataPackets)
override;
55 std::vector<nx::sdk::analytics::IMetadataPacket*> cookSomeObjects();
58 int64_t metadataTimestampUs);
60 void addBlinkingObjectIfNeeded(
61 int64_t metadataTimestampUs,
62 std::vector<nx::sdk::analytics::IMetadataPacket*>* metadataPackets,
65 int64_t usSinceEpoch()
const;
71 bool checkVideoFramePlane(
76 void dumpSomeFrameBytes(
82 void stopFetchingMetadata();
86 void processPluginDiagnosticEvents();
88 void setObjectCount(
int objectCount);
90 void cleanUpTimestampQueue();
94 template<
typename ObjectType>
95 void setIsObjectTypeGenerationNeeded(
bool isObjectTypeGenerationNeeded)
97 if (isObjectTypeGenerationNeeded)
99 m_objectGenerator.registerObjectFactory<ObjectType>(
100 []() {
return std::make_unique<ObjectType>(); });
104 m_objectGenerator.unregisterObjectFactory<ObjectType>();
108 void updateObjectGenerationParameters();
110 void updateEventGenerationParameters();
115 std::atomic<bool> m_terminated{
false};
117 std::unique_ptr<std::thread> m_pluginDiagnosticEventThread;
118 std::mutex m_pluginDiagnosticEventGenerationLoopMutex;
119 std::condition_variable m_pluginDiagnosticEventGenerationLoopCondition;
120 std::atomic<bool> m_needToThrowPluginDiagnosticEvents{
false};
122 std::unique_ptr<std::thread> m_eventThread;
123 std::mutex m_eventGenerationLoopMutex;
124 std::condition_variable m_eventGenerationLoopCondition;
125 std::atomic<bool> m_eventsNeeded{
false};
127 int m_frameCounter = 0;
128 std::string m_eventTypeId;
130 std::deque<int64_t> m_frameTimestampUsQueue;
131 int64_t m_lastVideoFrameTimestampUs = 0;
132 int64_t m_lastBlinkingObjectTimestampUs = 0;
134 struct DeviceAgentSettings
136 bool needToGenerateObjects()
const 140 || generatePedestrians
141 || generateHumanFaces
143 || blinkingObjectPeriodMs.load() != std::chrono::milliseconds::zero();
146 std::atomic<bool> generateEvents{
true};
148 std::atomic<bool> generateCars{
true};
149 std::atomic<bool> generateTrucks{
true};
150 std::atomic<bool> generatePedestrians{
true};
151 std::atomic<bool> generateHumanFaces{
true};
152 std::atomic<bool> generateBicycles{
true};
154 std::atomic<std::chrono::milliseconds> blinkingObjectPeriodMs{
155 std::chrono::milliseconds::zero()};
157 std::atomic<bool> blinkingObjectInDedicatedPacket{
false};
159 std::atomic<int> numberOfObjectsToGenerate{1};
160 std::atomic<int> generateObjectsEveryNFrames{1};
162 std::atomic<bool> generatePreviews{
true};
164 std::atomic<bool> throwPluginDiagnosticEvents{
false};
165 std::atomic<bool> leakFrames{
false};
167 std::atomic<std::chrono::milliseconds> additionalFrameProcessingDelayMs{
168 std::chrono::milliseconds::zero()};
170 std::atomic<std::chrono::milliseconds> overallMetadataDelayMs{
171 std::chrono::milliseconds::zero()};
173 std::atomic<int> numberOfFramesBeforePreviewGeneration{30};
176 DeviceAgentSettings m_deviceAgentSettings;
180 int currentEventTypeIndex = 0;
181 bool isCurrentEventActive =
false;
184 EventContext m_eventContext;
188 ObjectContext() =
default;
189 ObjectContext(std::unique_ptr<AbstractObject>
object): object(std::move(
object)) {}
191 ObjectContext& operator=(std::unique_ptr<AbstractObject>&& otherObject)
194 object = std::move(otherObject);
201 isPreviewGenerated =
false;
205 bool operator!()
const {
return !object; }
207 std::unique_ptr<AbstractObject> object;
208 bool isPreviewGenerated =
false;
209 int frameCounter = 0;
212 std::mutex m_objectGenerationMutex;
214 std::vector<ObjectContext> m_objectContexts;
217 const std::string kLineCrossingEventType =
"nx.stub.lineCrossing";
218 const std::string kObjectInTheAreaEventType =
"nx.stub.objectInTheArea";
219 const std::string kLoiteringEventType =
"nx.stub.loitering";
220 const std::string kIntrusionEventType =
"nx.stub.intrusion";
221 const std::string kGunshotEventType =
"nx.stub.gunshot";
222 const std::string kSuspiciousNoiseEventType =
"nx.stub.suspiciousNoise";
223 const std::string kSoundRelatedEventGroup =
"nx.stub.soundRelatedEvent";
224 const std::string kBlinkingObjectType =
"nx.stub.blinkingObject";
virtual bool pushCompressedVideoFrame(const nx::sdk::analytics::ICompressedVideoPacket *videoFrame) override
Definition: device_agent.cpp:230
virtual nx::sdk::Result< const nx::sdk::IStringMap * > settingsReceived() override
Definition: device_agent.cpp:186
virtual bool pushUncompressedVideoFrame(const nx::sdk::analytics::IUncompressedVideoFrame *videoFrame) override
Definition: device_agent.cpp:242
Definition: i_compressed_video_packet.h:16
virtual std::string manifestString() const override
Definition: device_agent.cpp:136
Definition: i_device_info.h:14
Definition: apple_utils.h:6
Definition: video_frame_processing_device_agent.h:37
Definition: i_uncompressed_video_frame.h:13
Definition: i_data_packet.h:16
Definition: device_agent.h:25