1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #ifndef CONFIG_MANAGER_H
17 #define CONFIG_MANAGER_H
18 
19 #include <vector>
20 #include <string>
21 #include <unordered_map>
22 #include <unordered_set>
23 
24 #include <tinyxml2.h>
25 
26 #include <system/camera_metadata.h>
27 #include <log/log.h>
28 #include <android/hardware/automotive/evs/1.1/types.h>
29 
30 #include "ConfigManagerUtil.h"
31 
32 using namespace std;
33 using namespace tinyxml2;
34 
35 using ::android::hardware::hidl_vec;
36 using ::android::hardware::camera::device::V3_2::Stream;
37 using ::android::hardware::automotive::evs::V1_1::CameraParam;
38 
39 /*
40  * Plese note that this is different from what is defined in
41  * libhardware/modules/camera/3_4/metadata/types.h; this has one additional
42  * field to store a framerate.
43  */
44 const size_t kStreamCfgSz = 6;
45 typedef std::array<int32_t, kStreamCfgSz> RawStreamConfiguration;
46 
47 class ConfigManager {
48 public:
49     static std::unique_ptr<ConfigManager> Create(const char *path = "");
50     ConfigManager(const ConfigManager&) = delete;
51     ConfigManager& operator=(const ConfigManager&) = delete;
52 
53     virtual ~ConfigManager();
54 
55     /* Camera device's capabilities and metadata */
56     class CameraInfo {
57     public:
CameraInfo()58         CameraInfo() :
59             characteristics(nullptr) {
60             /* Nothing to do */
61         }
62 
~CameraInfo()63         virtual ~CameraInfo() {
64             free_camera_metadata(characteristics);
65         }
66 
67         /* Allocate memory for camera_metadata_t */
allocate(size_t entry_cap,size_t data_cap)68         bool allocate(size_t entry_cap, size_t data_cap) {
69             if (characteristics != nullptr) {
70                 ALOGE("Camera metadata is already allocated");
71                 return false;
72             }
73 
74             characteristics = allocate_camera_metadata(entry_cap, data_cap);
75             return characteristics != nullptr;
76         }
77 
78         /*
79          * List of supported controls that the primary client can program.
80          * Paraemters are stored with its valid range
81          */
82         unordered_map<CameraParam,
83                       tuple<int32_t, int32_t, int32_t>> controls;
84 
85         /*
86          * List of supported output stream configurations; each array stores
87          * format, width, height, and direction values in the order.
88          */
89         unordered_map<int32_t, RawStreamConfiguration> streamConfigurations;
90 
91         /*
92          * Internal storage for camera metadata.  Each entry holds a pointer to
93          * data and number of elements
94          */
95         unordered_map<camera_metadata_tag_t,
96                       pair<unique_ptr<void *>, size_t>> cameraMetadata;
97 
98         /* Camera module characteristics */
99         camera_metadata_t *characteristics;
100     };
101 
102     class CameraGroupInfo : public CameraInfo {
103     public:
CameraGroupInfo()104         CameraGroupInfo() {}
105 
106         /* ID of member camera devices */
107         unordered_set<string> devices;
108 
109         /* The capture operation of member camera devices are synchronized */
110         bool synchronized = false;
111     };
112 
113     class SystemInfo {
114     public:
115         /* number of available cameras */
116         int32_t numCameras = 0;
117     };
118 
119     class DisplayInfo {
120     public:
121         /*
122          * List of supported input stream configurations; each array stores
123          * format, width, height, and direction values in the order.
124          */
125         unordered_map<int32_t, RawStreamConfiguration> streamConfigurations;
126     };
127 
128     /*
129      * Return system information
130      *
131      * @return SystemInfo
132      *         Constant reference of SystemInfo.
133      */
getSystemInfo()134     const SystemInfo &getSystemInfo() {
135         return mSystemInfo;
136     }
137 
138     /*
139      * Return a list of cameras
140      *
141      * This function assumes that it is not being called frequently.
142      *
143      * @return vector<string>
144      *         A vector that contains unique camera device identifiers.
145      */
getCameraList()146     vector<string> getCameraList() {
147         vector<string> aList;
148         for (auto &v : mCameraInfo) {
149             aList.emplace_back(v.first);
150         }
151 
152         return aList;
153     }
154 
155 
156     /*
157      * Return a list of cameras
158      *
159      * @return CameraGroupInfo
160      *         A pointer to a camera group identified by a given id.
161      */
getCameraGroupInfo(const string & gid)162     unique_ptr<CameraGroupInfo>& getCameraGroupInfo(const string& gid) {
163         return mCameraGroupInfos[gid];
164     }
165 
166 
167     /*
168      * Return a camera metadata
169      *
170      * @param  cameraId
171      *         Unique camera node identifier in string
172      *
173      * @return unique_ptr<CameraInfo>
174      *         A pointer to CameraInfo that is associated with a given camera
175      *         ID.  This returns a null pointer if this does not recognize a
176      *         given camera identifier.
177      */
getCameraInfo(const string cameraId)178     unique_ptr<CameraInfo>& getCameraInfo(const string cameraId) noexcept {
179         return mCameraInfo[cameraId];
180     }
181 
182 private:
183     /* Constructors */
ConfigManager(const char * xmlPath)184     ConfigManager(const char *xmlPath) :
185         mConfigFilePath(xmlPath) {
186     }
187 
188     /* System configuration */
189     SystemInfo mSystemInfo;
190 
191     /* Internal data structure for camera device information */
192     unordered_map<string, unique_ptr<CameraInfo>> mCameraInfo;
193 
194     /* Internal data structure for camera device information */
195     unordered_map<string, unique_ptr<DisplayInfo>> mDisplayInfo;
196 
197     /* Camera groups are stored in <groud id, CameraGroupInfo> hash map */
198     unordered_map<string, unique_ptr<CameraGroupInfo>> mCameraGroupInfos;
199 
200     /*
201      * Camera positions are stored in <position, camera id set> hash map.
202      * The position must be one of front, rear, left, and right.
203      */
204     unordered_map<string, unordered_set<string>>  mCameraPosition;
205 
206     /* A path to XML configuration file */
207     const char *mConfigFilePath;
208 
209     /*
210      * Parse a given EVS configuration file and store the information
211      * internally.
212      *
213      * @return bool
214      *         True if it completes parsing a file successfully.
215      */
216     bool readConfigDataFromXML() noexcept;
217 
218     /*
219      * read the information of the vehicle
220      *
221      * @param  aSysElem
222      *         A pointer to "system" XML element.
223      */
224     void readSystemInfo(const XMLElement * const aSysElem);
225 
226     /*
227      * read the information of camera devices
228      *
229      * @param  aCameraElem
230      *         A pointer to "camera" XML element that may contain multiple
231      *         "device" elements.
232      */
233     void readCameraInfo(const XMLElement * const aCameraElem);
234 
235     /*
236      * read display device information
237      *
238      * @param  aDisplayElem
239      *         A pointer to "display" XML element that may contain multiple
240      *         "device" elements.
241      */
242     void readDisplayInfo(const XMLElement * const aDisplayElem);
243 
244     /*
245      * read camera device information
246      *
247      * @param  aCamera
248      *         A pointer to CameraInfo that will be completed by this
249      *         method.
250      *         aDeviceElem
251      *         A pointer to "device" XML element that contains camera module
252      *         capability info and its characteristics.
253      *
254      * @return bool
255      *         Return false upon any failure in reading and processing camera
256      *         device information.
257      */
258     bool readCameraDeviceInfo(CameraInfo *aCamera,
259                               const XMLElement *aDeviceElem);
260 
261     /*
262      * read camera metadata
263      *
264      * @param  aCapElem
265      *         A pointer to "cap" XML element.
266      * @param  aCamera
267      *         A pointer to CameraInfo that is being filled by this method.
268      * @param  dataSize
269      *         Required size of memory to store camera metadata found in this
270      *         method.  This is calculated in this method and returned to the
271      *         caller for camera_metadata allocation.
272      *
273      * @return size_t
274      *         Number of camera metadata entries
275      */
276     size_t readCameraCapabilities(const XMLElement * const aCapElem,
277                                   CameraInfo *aCamera,
278                                   size_t &dataSize);
279 
280     /*
281      * read camera metadata
282      *
283      * @param  aParamElem
284      *         A pointer to "characteristics" XML element.
285      * @param  aCamera
286      *         A pointer to CameraInfo that is being filled by this method.
287      * @param  dataSize
288      *         Required size of memory to store camera metadata found in this
289      *         method.
290      *
291      * @return size_t
292      *         Number of camera metadata entries
293      */
294     size_t readCameraMetadata(const XMLElement * const aParamElem,
295                               CameraInfo *aCamera,
296                               size_t &dataSize);
297 
298     /*
299      * construct camera_metadata_t from camera capabilities and metadata
300      *
301      * @param  aCamera
302      *         A pointer to CameraInfo that is being filled by this method.
303      * @param  totalEntries
304      *         Number of camera metadata entries to be added.
305      * @param  totalDataSize
306      *         Sum of sizes of camera metadata entries to be added.
307      *
308      * @return bool
309      *         False if either it fails to allocate memory for camera metadata
310      *         or its size is not large enough to add all found camera metadata
311      *         entries.
312      */
313     bool constructCameraMetadata(CameraInfo *aCamera,
314                                  const size_t totalEntries,
315                                  const size_t totalDataSize);
316 };
317 #endif // CONFIG_MANAGER_H
318 
319