nx_cloud_storage_sdk  1.0
Cloud Storage SDK
data_manager.h
1 #pragma once
2 
3 #include <chrono>
4 #include <mutex>
5 #include <optional>
6 #include <string>
7 #include <vector>
8 
9 #include <camera/camera_plugin.h>
10 #include <nx/kit/json.h>
11 #include <nx/sdk/cloud_storage/helpers/data.h>
12 #include <nx/sdk/cloud_storage/i_device_agent.h>
13 #include <nx/sdk/cloud_storage/i_media_data_packet.h>
14 #include <nx/sdk/i_device_info.h>
15 
17 
18 class FileImpl;
19 
20 class File
21 {
22 public:
23  File(const std::string& path);
24  ~File();
25 
26  template<typename Container>
27  Container readAll() const;
28 
29  template<typename Container>
30  void writeAll(const Container& data, bool replaceContents);
31 
32 private:
33  std::unique_ptr<FileImpl> m_fileImpl;
34 };
35 
36 struct MediaFileHeader;
37 
39 {
40 public:
42  const std::shared_ptr<std::mutex>& mutex,
43  const std::string& path,
44  std::chrono::milliseconds startTime,
46  const char* opaqueMetadata);
47 
49 
50  void writeMediaPacket(const nx::sdk::cloud_storage::IMediaDataPacket* packet);
51  void close(std::chrono::milliseconds duration);
52  int size() const;
53 
54 private:
55  std::shared_ptr<std::mutex> m_mutex;
56  std::unique_ptr<File> m_file;
57  const std::string m_path;
58  std::chrono::milliseconds m_startTime{};
59  std::vector<uint8_t> m_buffer;
60 };
61 
63 {
64 public:
65  ReadableMediaFile(const std::string& path);
67 
68  std::vector<nx::sdk::cloud_storage::CodecInfoData> codecInfo() const;
69  std::string opaqueMetadata() const;
70  std::optional<nx::sdk::cloud_storage::MediaPacketData> getNextPacket() const;
71  std::string name() const;
72  void seek(
73  int64_t timestamp,
74  bool findKeyFrame,
75  int64_t* selectedPosition);
76 
77 private:
78  std::vector<uint8_t> m_fileData;
79  std::unique_ptr<MediaFileHeader> m_header;
80  int m_begin = 0;
81  mutable int m_current = 0;
82  std::string m_name;
83 };
84 
86 {
87  using TimePeriodList = nx::sdk::cloud_storage::TimePeriodList;
88 
89  std::map<int, TimePeriodList> timePeriodsPerStream;
91 };
92 
94 {
95  std::vector<DeviceArchiveIndex> deviceArchiveIndexList;
96 
97  void sort();
98 };
99 
101 {
102 public:
103  DataManager(const std::string& workDir);
104  ~DataManager();
105 
106  void saveBookmark(const nx::sdk::cloud_storage::Bookmark& data);
107  void deleteBookmark(const char* id);
108  std::string queryBookmarks(const nx::sdk::cloud_storage::BookmarkFilter& filter) const;
109 
110  void saveMotion(const nx::sdk::cloud_storage::Motion& data);
111  std::string queryMotion(const nx::sdk::cloud_storage::MotionFilter& filter) const;
112 
113  void saveObjectTrack(const nx::sdk::cloud_storage::ObjectTrack& data);
114  std::string queryAnalytics(const nx::sdk::cloud_storage::AnalyticsFilter& filter) const;
115  std::string queryAnalyticsPeriods(const nx::sdk::cloud_storage::AnalyticsFilter& filter) const;
116 
117  void addDevice(const nx::sdk::cloud_storage::DeviceDescription& deviceDescription);
118  std::unique_ptr<WritableMediaFile> writableMediaFile(
119  const std::string& deviceId,
120  int streamIndex,
121  std::chrono::milliseconds timestamp,
123  const char* opaqueMetadata) const;
124 
125  std::unique_ptr<ReadableMediaFile> readableMediaFile(
126  const std::string& deviceId,
127  int streamIndex,
128  int64_t startTimeMs,
129  int64_t durationMs) const;
130 
131  ArchiveIndex getArchive(std::optional<std::chrono::system_clock::time_point> startTime) const;
132  void saveBestShotImage(const char* data);
133  std::string fetchBestShotImage(const char* objectTrackId);
134 
135 private:
136  std::string m_workDir;
137  std::shared_ptr<std::mutex> m_mutex{std::make_shared<std::mutex>()};
138  std::vector<nx::sdk::cloud_storage::Motion> m_motion;
139  std::vector<nx::sdk::cloud_storage::ObjectTrack> m_analytics;
140 
141  std::string devicePath(const std::string& deviceId) const;
142 
143  template<typename Data>
144  void addListEntry(const Data& data, const std::string& fileName);
145 
146  template<typename Data>
147  void saveObject(const Data& data, const std::string& fileName);
148 
149  template<typename Data>
150  std::vector<Data> allObjects(const std::string& fileName) const;
151 
152  template<typename Data>
153  std::vector<Data> allObjectsNoLock(const std::string& fileName) const;
154 
155  template<typename Data>
156  std::optional<Data> oneObject(const std::string& fileName) const;
157 
158  template<typename DataList>
159  void flush(const DataList& data, const std::string& fileName);
160 
161  template<typename Data>
162  std::vector<Data> load(const std::string& fileName) const;
163 
164  std::vector<nx::kit::Json> loadListNoLock(const std::string& fileName) const;
165 
166  std::string mediaFilePath(
167  const std::string& deviceId, int streamIndex, std::chrono::milliseconds timestamp) const;
168 
169  std::string mediaFilePath(
170  const std::string& deviceId, int streamIndex, int64_t startTimeMs, int64_t durationMs) const;
171 };
172 
173 } //namespace nx::vms_server_plugins::cloud_storage::stub
Definition: data.h:276
Definition: i_media_data_packet.h:16
Definition: data_manager.cpp:33
Definition: data.h:184