diff --git a/automotive/evs/aidl/impl/default/Android.bp b/automotive/evs/aidl/impl/default/Android.bp
index bf6c0be236..dbe0314118 100644
--- a/automotive/evs/aidl/impl/default/Android.bp
+++ b/automotive/evs/aidl/impl/default/Android.bp
@@ -24,56 +24,13 @@ package {
cc_binary {
name: "android.hardware.automotive.evs-aidl-default-service",
defaults: ["EvsHalDefaults"],
- vintf_fragments: ["manifest_evs-default-service.xml"],
+ local_include_dirs: ["include"],
+ vintf_fragments: ["evs-default-service.xml"],
init_rc: ["evs-default-service.rc"],
vendor: true,
relative_install_path: "hw",
- cflags: [
- "-DGL_GLEXT_PROTOTYPES",
- "-DEGL_EGLEXT_PROTOTYPES",
- "-Wall",
- "-Wextra",
- "-Werror",
- "-Wthread-safety",
- ],
- srcs: [
- ":libgui_frame_event_aidl",
- "src/*.cpp"
- ],
+ srcs: ["src/*.cpp"],
shared_libs: [
- "android.hardware.graphics.bufferqueue@1.0",
- "android.hardware.graphics.bufferqueue@2.0",
- "android.hidl.token@1.0-utils",
- "libEGL",
- "libGLESv2",
- "libbase",
"libbinder_ndk",
- "libbufferqueueconverter",
- "libcamera_metadata",
- "libhardware_legacy",
- "libhidlbase",
- "liblog",
- "libnativewindow",
- "libtinyxml2",
- "libui",
- "libutils",
- "libyuv",
],
- static_libs: [
- "android.frameworks.automotive.display-V1-ndk",
- "android.hardware.automotive.evs-V1-ndk",
- "android.hardware.common-V2-ndk",
- "libaidlcommonsupport",
- "libcutils",
- ],
- local_include_dirs: ["include"],
- include_dirs: ["frameworks/native/include/"],
- required: ["evs_mock_hal_configuration.xml"],
-}
-
-prebuilt_etc {
- name: "evs_mock_hal_configuration.xml",
- soc_specific: true,
- src: "resources/evs_mock_configuration.xml",
- sub_dir: "automotive/evs",
}
diff --git a/automotive/evs/aidl/impl/default/evs-default-service.rc b/automotive/evs/aidl/impl/default/evs-default-service.rc
index 3da41ff787..ea8e6892dc 100644
--- a/automotive/evs/aidl/impl/default/evs-default-service.rc
+++ b/automotive/evs/aidl/impl/default/evs-default-service.rc
@@ -1,8 +1,5 @@
service vendor.evs-hal-default /vendor/bin/hw/android.hardware.automotive.evs-aidl-default-service
class early_hal
- priority -20
- user graphics
- group automotive_evs camera
- onrestart restart cardisplayproxyd
- onrestart restart evsmanagerd
+ user automotive_evs
+ group automotive_evs
disabled
diff --git a/automotive/evs/aidl/impl/default/evs-default-service.xml b/automotive/evs/aidl/impl/default/evs-default-service.xml
new file mode 100644
index 0000000000..96ff9f6576
--- /dev/null
+++ b/automotive/evs/aidl/impl/default/evs-default-service.xml
@@ -0,0 +1,11 @@
+
+
+ android.hardware.automotive.evs
+ hwbinder
+ 1
+
+ IEvsEnumerator
+ hw/0
+
+
+
diff --git a/automotive/evs/aidl/impl/default/include/ConfigManager.h b/automotive/evs/aidl/impl/default/include/ConfigManager.h
deleted file mode 100644
index 1d5fe772b2..0000000000
--- a/automotive/evs/aidl/impl/default/include/ConfigManager.h
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "ConfigManagerUtil.h"
-
-#include
-#include
-#include
-#include
-
-#include
-
-#include
-#include
-#include
-#include
-#include
-
-/*
- * Please note that this is different from what is defined in
- * libhardware/modules/camera/3_4/metadata/types.h; this has one additional
- * field to store a framerate.
- */
-typedef struct {
- int id;
- int width;
- int height;
- ::aidl::android::hardware::graphics::common::PixelFormat format;
- int type;
- int framerate;
-} StreamConfiguration;
-
-class ConfigManager final {
- public:
- static std::unique_ptr Create();
- ConfigManager(const ConfigManager&) = delete;
- ConfigManager& operator=(const ConfigManager&) = delete;
-
- /* Camera device's capabilities and metadata */
- class CameraInfo {
- public:
- CameraInfo() : characteristics(nullptr) {}
-
- virtual ~CameraInfo();
-
- /* Allocate memory for camera_metadata_t */
- bool allocate(size_t entry_cap, size_t data_cap) {
- if (characteristics != nullptr) {
- LOG(ERROR) << "Camera metadata is already allocated";
- return false;
- }
-
- characteristics = allocate_camera_metadata(entry_cap, data_cap);
- return characteristics != nullptr;
- }
-
- /*
- * List of supported controls that the primary client can program.
- * Paraemters are stored with its valid range
- */
- std::unordered_map<::aidl::android::hardware::automotive::evs::CameraParam,
- std::tuple>
- controls;
-
- /*
- * List of supported output stream configurations.
- */
- std::unordered_map streamConfigurations;
-
- /*
- * Internal storage for camera metadata. Each entry holds a pointer to
- * data and number of elements
- */
- std::unordered_map> cameraMetadata;
-
- /* Camera module characteristics */
- camera_metadata_t* characteristics;
- };
-
- class CameraGroupInfo : public CameraInfo {
- public:
- CameraGroupInfo() {}
-
- /* ID of member camera devices */
- std::unordered_set devices;
-
- /* The capture operation of member camera devices are synchronized */
- int32_t synchronized = 0;
- };
-
- class SystemInfo {
- public:
- /* number of available cameras */
- int32_t numCameras = 0;
- };
-
- class DisplayInfo {
- public:
- /*
- * List of supported input stream configurations.
- */
- std::unordered_map streamConfigurations;
- };
-
- /*
- * Return system information
- *
- * @return SystemInfo
- * Constant reference of SystemInfo.
- */
- const SystemInfo& getSystemInfo() {
- std::unique_lock lock(mConfigLock);
- mConfigCond.wait(lock, [this] { return mIsReady; });
- return mSystemInfo;
- }
-
- /*
- * Return a list of camera identifiers
- *
- * This function assumes that it is not being called frequently.
- *
- * @return std::vector
- * A vector that contains unique camera device identifiers.
- */
- std::vector getCameraIdList() {
- std::unique_lock lock(mConfigLock);
- mConfigCond.wait(lock, [this] { return mIsReady; });
-
- std::vector aList;
- aList.reserve(mCameraInfo.size());
- for (auto&& v : mCameraInfo) {
- aList.push_back(v.first);
- }
-
- return aList;
- }
-
- /*
- * Return a list of camera group identifiers
- *
- * This function assumes that it is not being called frequently.
- *
- * @return std::vector
- * A vector that contains unique camera device identifiers.
- */
- std::vector getCameraGroupIdList() {
- std::unique_lock lock(mConfigLock);
- mConfigCond.wait(lock, [this] { return mIsReady; });
-
- std::vector aList;
- aList.reserve(mCameraGroups.size());
- for (auto&& v : mCameraGroups) {
- aList.push_back(v.first);
- }
-
- return aList;
- }
-
- /*
- * Return a pointer to the camera group
- *
- * @return CameraGroup
- * A pointer to a camera group identified by a given id.
- */
- std::unique_ptr& getCameraGroupInfo(const std::string& gid) {
- std::unique_lock lock(mConfigLock);
- mConfigCond.wait(lock, [this] { return mIsReady; });
-
- return mCameraGroups[gid];
- }
-
- /*
- * Return a camera metadata
- *
- * @param cameraId
- * Unique camera node identifier in string
- *
- * @return unique_ptr
- * A pointer to CameraInfo that is associated with a given camera
- * ID. This returns a null pointer if this does not recognize a
- * given camera identifier.
- */
- std::unique_ptr& getCameraInfo(const std::string& cameraId) noexcept {
- std::unique_lock lock(mConfigLock);
- mConfigCond.wait(lock, [this] { return mIsReady; });
-
- return mCameraInfo[cameraId];
- }
-
- /*
- * Tell whether the configuration data is ready to be used
- *
- * @return bool
- * True if configuration data is ready to be consumed.
- */
- bool isReady() const { return mIsReady; }
-
- private:
- /* Constructors */
- ConfigManager() : mBinaryFilePath("") {}
-
- static std::string_view sConfigDefaultPath;
- static std::string_view sConfigOverridePath;
-
- /* System configuration */
- SystemInfo mSystemInfo;
-
- /* Internal data structure for camera device information */
- std::unordered_map> mCameraInfo;
-
- /* Internal data structure for camera device information */
- std::unordered_map> mDisplayInfo;
-
- /* Camera groups are stored in hash map */
- std::unordered_map> mCameraGroups;
-
- /*
- * Camera positions are stored in hash map.
- * The position must be one of front, rear, left, and right.
- */
- std::unordered_map> mCameraPosition;
-
- /* Configuration data lock */
- mutable std::mutex mConfigLock;
-
- /*
- * This condition is signalled when it completes a configuration data
- * preparation.
- */
- std::condition_variable mConfigCond;
-
- /* A path to a binary configuration file */
- const char* mBinaryFilePath;
-
- /* Configuration data readiness */
- bool mIsReady = false;
-
- /*
- * Parse a given EVS configuration file and store the information
- * internally.
- *
- * @return bool
- * True if it completes parsing a file successfully.
- */
- bool readConfigDataFromXML() noexcept;
-
- /*
- * read the information of the vehicle
- *
- * @param aSysElem
- * A pointer to "system" XML element.
- */
- void readSystemInfo(const tinyxml2::XMLElement* const aSysElem);
-
- /*
- * read the information of camera devices
- *
- * @param aCameraElem
- * A pointer to "camera" XML element that may contain multiple
- * "device" elements.
- */
- void readCameraInfo(const tinyxml2::XMLElement* const aCameraElem);
-
- /*
- * read display device information
- *
- * @param aDisplayElem
- * A pointer to "display" XML element that may contain multiple
- * "device" elements.
- */
- void readDisplayInfo(const tinyxml2::XMLElement* const aDisplayElem);
-
- /*
- * read camera device information
- *
- * @param aCamera
- * A pointer to CameraInfo that will be completed by this
- * method.
- * aDeviceElem
- * A pointer to "device" XML element that contains camera module
- * capability info and its characteristics.
- *
- * @return bool
- * Return false upon any failure in reading and processing camera
- * device information.
- */
- bool readCameraDeviceInfo(CameraInfo* aCamera, const tinyxml2::XMLElement* aDeviceElem);
-
- /*
- * read camera metadata
- *
- * @param aCapElem
- * A pointer to "cap" XML element.
- * @param aCamera
- * A pointer to CameraInfo that is being filled by this method.
- * @param dataSize
- * Required size of memory to store camera metadata found in this
- * method. This is calculated in this method and returned to the
- * caller for camera_metadata allocation.
- *
- * @return size_t
- * Number of camera metadata entries
- */
- size_t readCameraCapabilities(const tinyxml2::XMLElement* const aCapElem, CameraInfo* aCamera,
- size_t& dataSize);
-
- /*
- * read camera metadata
- *
- * @param aParamElem
- * A pointer to "characteristics" XML element.
- * @param aCamera
- * A pointer to CameraInfo that is being filled by this method.
- * @param dataSize
- * Required size of memory to store camera metadata found in this
- * method.
- *
- * @return size_t
- * Number of camera metadata entries
- */
- size_t readCameraMetadata(const tinyxml2::XMLElement* const aParamElem, CameraInfo* aCamera,
- size_t& dataSize);
-
- /*
- * construct camera_metadata_t from camera capabilities and metadata
- *
- * @param aCamera
- * A pointer to CameraInfo that is being filled by this method.
- * @param totalEntries
- * Number of camera metadata entries to be added.
- * @param totalDataSize
- * Sum of sizes of camera metadata entries to be added.
- *
- * @return bool
- * False if either it fails to allocate memory for camera metadata
- * or its size is not large enough to add all found camera metadata
- * entries.
- */
- bool constructCameraMetadata(CameraInfo* aCamera, const size_t totalEntries,
- const size_t totalDataSize);
-
- /*
- * Read configuration data from the binary file
- *
- * @return bool
- * True if it succeeds to read configuration data from a binary
- * file.
- */
- bool readConfigDataFromBinary();
-
- /*
- * Store configuration data to the file
- *
- * @return bool
- * True if it succeeds to serialize mCameraInfo to the file.
- */
- bool writeConfigDataToBinary();
-
- /*
- * debugging method to print out all XML elements and their attributes in
- * logcat message.
- *
- * @param aNode
- * A pointer to the root XML element to navigate.
- * @param prefix
- * A prefix to XML string.
- */
- void printElementNames(const tinyxml2::XMLElement* aNode, const std::string& prefix = "") const;
-};
diff --git a/automotive/evs/aidl/impl/default/include/ConfigManagerUtil.h b/automotive/evs/aidl/impl/default/include/ConfigManagerUtil.h
deleted file mode 100644
index 32b50d3332..0000000000
--- a/automotive/evs/aidl/impl/default/include/ConfigManagerUtil.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include
-#include
-#include
-#include
-
-#include
-#include
-
-class ConfigManagerUtil final {
- public:
- /**
- * Convert a given string into V4L2_CID_*
- */
- static bool convertToEvsCameraParam(
- const std::string& id,
- ::aidl::android::hardware::automotive::evs::CameraParam& camParam);
- /**
- * Convert a given string into android.hardware.graphics.common.PixelFormat
- */
- static bool convertToPixelFormat(const std::string& in,
- ::aidl::android::hardware::graphics::common::PixelFormat& out);
- /**
- * Convert a given string into corresponding camera metadata data tag defined in
- * system/media/camera/include/system/camera_metadata_tags.h
- */
- static bool convertToMetadataTag(const char* name, camera_metadata_tag& aTag);
- /**
- * Convert a given string into a floating value array
- */
- static float* convertFloatArray(const char* sz, const char* vals, size_t& count,
- const char delimiter = ',');
- /**
- * Trim a string
- */
- static std::string trimString(const std::string& src, const std::string& ws = " \n\r\t\f\v");
-
- /**
- * Convert a given string to corresponding camera capabilities
- */
- static bool convertToCameraCapability(
- const char* name, camera_metadata_enum_android_request_available_capabilities_t& cap);
-
- DISALLOW_IMPLICIT_CONSTRUCTORS(ConfigManagerUtil);
-};
diff --git a/automotive/evs/aidl/impl/default/include/DefaultEvsEnumerator.h b/automotive/evs/aidl/impl/default/include/DefaultEvsEnumerator.h
new file mode 100644
index 0000000000..03a578d954
--- /dev/null
+++ b/automotive/evs/aidl/impl/default/include/DefaultEvsEnumerator.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef android_hardware_automotive_evs_aidl_impl_evshal_include_DefaultEvsHal_H_
+#define android_hardware_automotive_evs_aidl_impl_evshal_include_DefaultEvsHal_H_
+
+#include
+
+namespace aidl::android::hardware::automotive::evs::implementation {
+
+class DefaultEvsEnumerator final
+ : public ::aidl::android::hardware::automotive::evs::BnEvsEnumerator {
+ ::ndk::ScopedAStatus isHardware(bool* flag) override;
+ ::ndk::ScopedAStatus openCamera(
+ const std::string& cameraId,
+ const ::aidl::android::hardware::automotive::evs::Stream& streamConfig,
+ std::shared_ptr<::aidl::android::hardware::automotive::evs::IEvsCamera>* obj) override;
+ ::ndk::ScopedAStatus closeCamera(
+ const std::shared_ptr<::aidl::android::hardware::automotive::evs::IEvsCamera>& obj)
+ override;
+ ::ndk::ScopedAStatus getCameraList(
+ std::vector<::aidl::android::hardware::automotive::evs::CameraDesc>* list) override;
+ ::ndk::ScopedAStatus getStreamList(
+ const ::aidl::android::hardware::automotive::evs::CameraDesc& desc,
+ std::vector<::aidl::android::hardware::automotive::evs::Stream>* _aidl_return) override;
+ ::ndk::ScopedAStatus openDisplay(
+ int32_t displayId,
+ std::shared_ptr<::aidl::android::hardware::automotive::evs::IEvsDisplay>* obj) override;
+ ::ndk::ScopedAStatus closeDisplay(
+ const std::shared_ptr<::aidl::android::hardware::automotive::evs::IEvsDisplay>& obj)
+ override;
+ ::ndk::ScopedAStatus getDisplayIdList(std::vector* list) override;
+ ::ndk::ScopedAStatus getDisplayState(
+ ::aidl::android::hardware::automotive::evs::DisplayState* state) override;
+ ::ndk::ScopedAStatus registerStatusCallback(
+ const std::shared_ptr<
+ ::aidl::android::hardware::automotive::evs::IEvsEnumeratorStatusCallback>&
+ callback) override;
+ ::ndk::ScopedAStatus openUltrasonicsArray(
+ const std::string& id,
+ std::shared_ptr<::aidl::android::hardware::automotive::evs::IEvsUltrasonicsArray>* obj)
+ override;
+ ::ndk::ScopedAStatus closeUltrasonicsArray(
+ const std::shared_ptr<::aidl::android::hardware::automotive::evs::IEvsUltrasonicsArray>&
+ arr) override;
+ ::ndk::ScopedAStatus getUltrasonicsArrayList(
+ std::vector<::aidl::android::hardware::automotive::evs::UltrasonicsArrayDesc>* list)
+ override;
+};
+
+} // namespace aidl::android::hardware::automotive::evs::implementation
+
+#endif // android_hardware_automotive_evs_aidl_impl_evshal_include_DefaultEvsHal_H_
diff --git a/automotive/evs/aidl/impl/default/include/EvsEnumerator.h b/automotive/evs/aidl/impl/default/include/EvsEnumerator.h
deleted file mode 100644
index b11dd3ee80..0000000000
--- a/automotive/evs/aidl/impl/default/include/EvsEnumerator.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "ConfigManager.h"
-#include "EvsGlDisplay.h"
-#include "EvsMockCamera.h"
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-#include
-#include
-
-namespace aidl::android::hardware::automotive::evs::implementation {
-
-class EvsEnumerator final : public ::aidl::android::hardware::automotive::evs::BnEvsEnumerator {
- public:
- // Methods from ::aidl::android::hardware::automotive::evs::IEvsEnumerator
- ndk::ScopedAStatus isHardware(bool* flag) override;
- ndk::ScopedAStatus openCamera(const std::string& cameraId, const evs::Stream& streamConfig,
- std::shared_ptr* obj) override;
- ndk::ScopedAStatus closeCamera(const std::shared_ptr& obj) override;
- ndk::ScopedAStatus getCameraList(std::vector* _aidl_return) override;
- ndk::ScopedAStatus getStreamList(const evs::CameraDesc& desc,
- std::vector* _aidl_return) override;
- ndk::ScopedAStatus openDisplay(int32_t displayId,
- std::shared_ptr* obj) override;
- ndk::ScopedAStatus closeDisplay(const std::shared_ptr& obj) override;
- ndk::ScopedAStatus getDisplayIdList(std::vector* list) override;
- ndk::ScopedAStatus getDisplayState(evs::DisplayState* state) override;
- ndk::ScopedAStatus registerStatusCallback(
- const std::shared_ptr& callback) override;
- ndk::ScopedAStatus openUltrasonicsArray(
- const std::string& id, std::shared_ptr* obj) override;
- ndk::ScopedAStatus closeUltrasonicsArray(
- const std::shared_ptr& obj) override;
- ndk::ScopedAStatus getUltrasonicsArrayList(
- std::vector* list) override;
-
- // Implementation details
- EvsEnumerator(const std::shared_ptr<
- ::aidl::android::frameworks::automotive::display::ICarDisplayProxy>&
- proxyService);
-
- void notifyDeviceStatusChange(const std::string_view& deviceName, evs::DeviceStatusType type);
-
- private:
- struct CameraRecord {
- evs::CameraDesc desc;
- std::weak_ptr activeInstance;
-
- CameraRecord(const char* cameraId) : desc() { desc.id = cameraId; }
- };
-
- class ActiveDisplays {
- public:
- struct DisplayInfo {
- int32_t id{-1};
- std::weak_ptr displayWeak;
- uintptr_t internalDisplayRawAddr;
- };
-
- std::optional popDisplay(int32_t id);
-
- std::optional popDisplay(const std::shared_ptr& display);
-
- std::unordered_map getAllDisplays();
-
- bool tryInsert(int32_t id, const std::shared_ptr& display);
-
- private:
- std::mutex mMutex;
- std::unordered_map mIdToDisplay GUARDED_BY(mMutex);
- std::unordered_map mDisplayToId GUARDED_BY(mMutex);
- };
-
- bool checkPermission();
- void closeCamera_impl(const std::shared_ptr& pCamera,
- const std::string& cameraId);
-
- static bool qualifyCaptureDevice(const char* deviceName);
- static CameraRecord* findCameraById(const std::string& cameraId);
- static void enumerateCameras();
- static bool addCaptureDevice(const std::string& deviceName);
- static bool removeCaptureDevice(const std::string& deviceName);
- // Enumerate available displays and return an id of the internal display
- static uint64_t enumerateDisplays();
-
- static ActiveDisplays& mutableActiveDisplays();
-
- // NOTE: All members values are static so that all clients operate on the same state
- // That is to say, this is effectively a singleton despite the fact that HIDL
- // constructs a new instance for each client.
- // Because our server has a single thread in the thread pool, these values are
- // never accessed concurrently despite potentially having multiple instance objects
- // using them.
- static std::unordered_map sCameraList;
- // Object destructs if client dies.
- static std::mutex sLock; // Mutex on shared camera device list.
- static std::condition_variable sCameraSignal; // Signal on camera device addition.
- static std::unique_ptr sConfigManager; // ConfigManager
- static std::shared_ptr<::aidl::android::frameworks::automotive::display::ICarDisplayProxy>
- sDisplayProxy;
- static std::unordered_map sDisplayPortList;
-
- uint64_t mInternalDisplayId;
- std::shared_ptr mCallback;
-};
-
-} // namespace aidl::android::hardware::automotive::evs::implementation
diff --git a/automotive/evs/aidl/impl/default/include/EvsGlDisplay.h b/automotive/evs/aidl/impl/default/include/EvsGlDisplay.h
deleted file mode 100644
index ceabd9e863..0000000000
--- a/automotive/evs/aidl/impl/default/include/EvsGlDisplay.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "GlWrapper.h"
-
-#include
-#include
-#include
-#include
-#include
-
-#include
-
-namespace aidl::android::hardware::automotive::evs::implementation {
-
-class EvsGlDisplay final : public BnEvsDisplay {
- public:
- // Methods from ::aidl::android::hardware::automotive::evs::IEvsDisplay
- // follow.
- ndk::ScopedAStatus getDisplayInfo(evs::DisplayDesc* _aidl_return) override;
- ndk::ScopedAStatus getDisplayState(evs::DisplayState* _aidl_return) override;
- ndk::ScopedAStatus getTargetBuffer(evs::BufferDesc* _aidl_return) override;
- ndk::ScopedAStatus returnTargetBufferForDisplay(const evs::BufferDesc& buffer) override;
- ndk::ScopedAStatus setDisplayState(evs::DisplayState state) override;
-
- // Implementation details
- EvsGlDisplay(const std::shared_ptr& service,
- uint64_t displayId);
- virtual ~EvsGlDisplay() override;
-
- // This gets called if another caller "steals" ownership of the display
- void forceShutdown();
-
- private:
- // A graphics buffer into which we'll store images. This member variable
- // will be protected by semaphores.
- struct BufferRecord {
- ::aidl::android::hardware::graphics::common::HardwareBufferDescription description;
- buffer_handle_t handle;
- int fingerprint;
- } mBuffer;
-
- // State of a rendering thread
- enum RenderThreadStates {
- STOPPED = 0,
- STOPPING = 1,
- RUN = 2,
- };
-
- uint64_t mDisplayId;
- evs::DisplayDesc mInfo;
- evs::DisplayState mRequestedState GUARDED_BY(mLock) = evs::DisplayState::NOT_VISIBLE;
- std::shared_ptr mDisplayProxy;
-
- GlWrapper mGlWrapper;
- mutable std::mutex mLock;
-
- // This tells us whether or not our buffer is in use. Protected by
- // semaphores.
- bool mBufferBusy = false;
-
- // Variables to synchronize a rendering thread w/ main and binder threads
- std::thread mRenderThread;
- RenderThreadStates mState GUARDED_BY(mLock) = STOPPED;
- bool mBufferReady = false;
- void renderFrames();
- bool initializeGlContextLocked() REQUIRES(mLock);
-
- std::condition_variable mBufferReadyToUse;
- std::condition_variable mBufferReadyToRender;
- std::condition_variable mBufferDone;
-};
-
-} // namespace aidl::android::hardware::automotive::evs::implementation
diff --git a/automotive/evs/aidl/impl/default/include/EvsMockCamera.h b/automotive/evs/aidl/impl/default/include/EvsMockCamera.h
deleted file mode 100644
index 46d47e77a2..0000000000
--- a/automotive/evs/aidl/impl/default/include/EvsMockCamera.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "ConfigManager.h"
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-// #include
-#include
-#include
-
-#include
-#include
-
-namespace aidl::android::hardware::automotive::evs::implementation {
-
-class EvsMockCamera : public evs::BnEvsCamera {
- // This prevents constructors from direct access while it allows this class to
- // be instantiated via ndk::SharedRefBase::make<>.
- private:
- struct Sigil {
- explicit Sigil() = default;
- };
-
- public:
- // Methods from ::android::hardware::automotive::evs::IEvsCamera follow.
- ndk::ScopedAStatus doneWithFrame(const std::vector& buffers) override;
- ndk::ScopedAStatus forcePrimaryClient(
- const std::shared_ptr& display) override;
- ndk::ScopedAStatus getCameraInfo(evs::CameraDesc* _aidl_return) override;
- ndk::ScopedAStatus getExtendedInfo(int32_t opaqueIdentifier,
- std::vector* value) override;
- ndk::ScopedAStatus getIntParameter(evs::CameraParam id, std::vector* value) override;
- ndk::ScopedAStatus getIntParameterRange(evs::CameraParam id,
- evs::ParameterRange* _aidl_return) override;
- ndk::ScopedAStatus getParameterList(std::vector* _aidl_return) override;
- ndk::ScopedAStatus getPhysicalCameraInfo(const std::string& deviceId,
- evs::CameraDesc* _aidl_return) override;
- ndk::ScopedAStatus importExternalBuffers(const std::vector& buffers,
- int32_t* _aidl_return) override;
- ndk::ScopedAStatus pauseVideoStream() override;
- ndk::ScopedAStatus resumeVideoStream() override;
- ndk::ScopedAStatus setExtendedInfo(int32_t opaqueIdentifier,
- const std::vector& opaqueValue) override;
- ndk::ScopedAStatus setIntParameter(evs::CameraParam id, int32_t value,
- std::vector* effectiveValue) override;
- ndk::ScopedAStatus setPrimaryClient() override;
- ndk::ScopedAStatus setMaxFramesInFlight(int32_t bufferCount) override;
- ndk::ScopedAStatus startVideoStream(
- const std::shared_ptr& receiver) override;
- ndk::ScopedAStatus stopVideoStream() override;
- ndk::ScopedAStatus unsetPrimaryClient() override;
-
- static std::shared_ptr Create(const char* deviceName);
- static std::shared_ptr Create(
- const char* deviceName, std::unique_ptr& camInfo,
- const evs::Stream* streamCfg = nullptr);
- EvsMockCamera(const EvsMockCamera&) = delete;
- EvsMockCamera& operator=(const EvsMockCamera&) = delete;
-
- virtual ~EvsMockCamera() override;
- void shutdown();
-
- const evs::CameraDesc& getDesc() { return mDescription; }
-
- // Constructors
- EvsMockCamera(Sigil sigil, const char* deviceName,
- std::unique_ptr& camInfo);
-
- private:
- // These three functions are expected to be called while mAccessLock is held
- bool setAvailableFrames_Locked(unsigned bufferCount);
- unsigned increaseAvailableFrames_Locked(unsigned numToAdd);
- unsigned decreaseAvailableFrames_Locked(unsigned numToRemove);
-
- void generateFrames();
- void fillMockFrame(buffer_handle_t handle, const AHardwareBuffer_Desc* pDesc);
- void returnBufferLocked(const uint32_t bufferId);
- ndk::ScopedAStatus stopVideoStream_impl();
-
- CameraDesc mDescription = {}; // The properties of this camera
-
- std::thread mCaptureThread; // The thread we'll use to synthesize frames
-
- // The callback used to deliver each frame
- std::shared_ptr mStream;
-
- // Horizontal pixel count in the buffers
- uint32_t mWidth = 0;
- // Vertical pixel count in the buffers
- uint32_t mHeight = 0;
- // Values from android_pixel_format_t
- uint32_t mFormat = HAL_PIXEL_FORMAT_RGBA_8888;
- // Values from from Gralloc.h
- uint64_t mUsage =
- GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_SW_READ_RARELY | GRALLOC_USAGE_SW_WRITE_OFTEN;
- // Bytes per line in the buffers
- uint32_t mStride = 0;
-
- struct BufferRecord {
- buffer_handle_t handle;
- bool inUse;
-
- explicit BufferRecord(buffer_handle_t h) : handle(h), inUse(false){};
- };
-
- std::vector mBuffers; // Graphics buffers to transfer images
- unsigned mFramesAllowed; // How many buffers are we currently using
- unsigned mFramesInUse; // How many buffers are currently outstanding
-
- enum StreamStateValues {
- STOPPED,
- RUNNING,
- STOPPING,
- DEAD,
- };
- StreamStateValues mStreamState;
-
- // Synchronization necessary to deconflict mCaptureThread from the main service thread
- std::mutex mAccessLock;
-
- // Static camera module information
- std::unique_ptr& mCameraInfo;
-
- // For the extended info
- std::unordered_map> mExtInfo;
- std::unordered_map mParams;
-};
-
-} // namespace aidl::android::hardware::automotive::evs::implementation
diff --git a/automotive/evs/aidl/impl/default/include/GlWrapper.h b/automotive/evs/aidl/impl/default/include/GlWrapper.h
deleted file mode 100644
index adb250c8e1..0000000000
--- a/automotive/evs/aidl/impl/default/include/GlWrapper.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-namespace aidl::android::hardware::automotive::evs::implementation {
-
-namespace automotivedisplay = ::aidl::android::frameworks::automotive::display;
-
-class GlWrapper {
- public:
- GlWrapper() : mSurfaceHolder(::android::SurfaceHolderUniquePtr(nullptr, nullptr)) {}
- bool initialize(const std::shared_ptr& svc,
- uint64_t displayId);
- void shutdown();
-
- bool updateImageTexture(
- buffer_handle_t handle,
- const ::aidl::android::hardware::graphics::common::HardwareBufferDescription&
- description);
- void renderImageToScreen();
-
- void showWindow(const std::shared_ptr& svc,
- uint64_t displayId);
- void hideWindow(const std::shared_ptr& svc,
- uint64_t displayId);
-
- unsigned getWidth() { return mWidth; };
- unsigned getHeight() { return mHeight; };
-
- private:
- ::android::sp<::android::hardware::graphics::bufferqueue::V2_0::IGraphicBufferProducer>
- mGfxBufferProducer;
-
- EGLDisplay mDisplay;
- EGLSurface mSurface;
- EGLContext mContext;
-
- unsigned mWidth = 0;
- unsigned mHeight = 0;
-
- EGLImageKHR mKHRimage = EGL_NO_IMAGE_KHR;
-
- GLuint mTextureMap = 0;
- GLuint mShaderProgram = 0;
-
- // Opaque handle for a native hardware buffer defined in
- // frameworks/native/opengl/include/EGL/eglplatform.h
- ANativeWindow* mWindow;
-
- // Pointer to a Surface wrapper.
- ::android::SurfaceHolderUniquePtr mSurfaceHolder;
-};
-
-} // namespace aidl::android::hardware::automotive::evs::implementation
diff --git a/automotive/evs/aidl/impl/default/manifest_evs-default-service.xml b/automotive/evs/aidl/impl/default/manifest_evs-default-service.xml
deleted file mode 100644
index 8480651e77..0000000000
--- a/automotive/evs/aidl/impl/default/manifest_evs-default-service.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
- android.hardware.automotive.evs
- IEvsEnumerator/hw/0
-
-
diff --git a/automotive/evs/aidl/impl/default/resources/evs_mock_configuration.xml b/automotive/evs/aidl/impl/default/resources/evs_mock_configuration.xml
deleted file mode 100644
index 6cbc18eacf..0000000000
--- a/automotive/evs/aidl/impl/default/resources/evs_mock_configuration.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/automotive/evs/aidl/impl/default/src/ConfigManager.cpp b/automotive/evs/aidl/impl/default/src/ConfigManager.cpp
deleted file mode 100644
index da791ed0b9..0000000000
--- a/automotive/evs/aidl/impl/default/src/ConfigManager.cpp
+++ /dev/null
@@ -1,992 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ConfigManager.h"
-
-#include
-#include
-#include
-
-#include
-#include
-#include
-#include
-
-namespace {
-
-using ::aidl::android::hardware::automotive::evs::CameraParam;
-using ::aidl::android::hardware::graphics::common::PixelFormat;
-using ::tinyxml2::XMLAttribute;
-using ::tinyxml2::XMLDocument;
-using ::tinyxml2::XMLElement;
-
-} // namespace
-
-std::string_view ConfigManager::sConfigDefaultPath =
- "/vendor/etc/automotive/evs/evs_mock_hal_configuration.xml";
-std::string_view ConfigManager::sConfigOverridePath =
- "/vendor/etc/automotive/evs/evs_configuration_override.xml";
-
-void ConfigManager::printElementNames(const XMLElement* rootElem, const std::string& prefix) const {
- const XMLElement* curElem = rootElem;
-
- while (curElem != nullptr) {
- LOG(VERBOSE) << "[ELEM] " << prefix << curElem->Name();
- const XMLAttribute* curAttr = curElem->FirstAttribute();
- while (curAttr) {
- LOG(VERBOSE) << "[ATTR] " << prefix << curAttr->Name() << ": " << curAttr->Value();
- curAttr = curAttr->Next();
- }
-
- /* recursively go down to descendants */
- printElementNames(curElem->FirstChildElement(), prefix + "\t");
-
- curElem = curElem->NextSiblingElement();
- }
-}
-
-void ConfigManager::readCameraInfo(const XMLElement* const aCameraElem) {
- if (aCameraElem == nullptr) {
- LOG(WARNING) << "XML file does not have required camera element";
- return;
- }
-
- const XMLElement* curElem = aCameraElem->FirstChildElement();
- while (curElem != nullptr) {
- if (!strcmp(curElem->Name(), "group")) {
- /* camera group identifier */
- const char* id = curElem->FindAttribute("id")->Value();
-
- /* create a camera group to be filled */
- CameraGroupInfo* aCamera = new CameraGroupInfo();
-
- /* read camera device information */
- if (!readCameraDeviceInfo(aCamera, curElem)) {
- LOG(WARNING) << "Failed to read a camera information of " << id;
- delete aCamera;
- continue;
- }
-
- /* camera group synchronization */
- const char* sync = curElem->FindAttribute("synchronized")->Value();
- if (!strcmp(sync, "CALIBRATED")) {
- aCamera->synchronized = ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED;
- } else if (!strcmp(sync, "APPROXIMATE")) {
- aCamera->synchronized = ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE;
- } else {
- aCamera->synchronized = 0; // Not synchronized
- }
-
- /* add a group to hash map */
- mCameraGroups.insert_or_assign(id, std::unique_ptr(aCamera));
- } else if (!std::strcmp(curElem->Name(), "device")) {
- /* camera unique identifier */
- const char* id = curElem->FindAttribute("id")->Value();
-
- /* camera mount location */
- const char* pos = curElem->FindAttribute("position")->Value();
-
- /* create a camera device to be filled */
- CameraInfo* aCamera = new CameraInfo();
-
- /* read camera device information */
- if (!readCameraDeviceInfo(aCamera, curElem)) {
- LOG(WARNING) << "Failed to read a camera information of " << id;
- delete aCamera;
- continue;
- }
-
- /* store read camera module information */
- mCameraInfo.insert_or_assign(id, std::unique_ptr(aCamera));
-
- /* assign a camera device to a position group */
- mCameraPosition[pos].insert(id);
- } else {
- /* ignore other device types */
- LOG(DEBUG) << "Unknown element " << curElem->Name() << " is ignored";
- }
-
- curElem = curElem->NextSiblingElement();
- }
-}
-
-bool ConfigManager::readCameraDeviceInfo(CameraInfo* aCamera, const XMLElement* aDeviceElem) {
- if (aCamera == nullptr || aDeviceElem == nullptr) {
- return false;
- }
-
- /* size information to allocate camera_metadata_t */
- size_t totalEntries = 0;
- size_t totalDataSize = 0;
-
- /* read device capabilities */
- totalEntries +=
- readCameraCapabilities(aDeviceElem->FirstChildElement("caps"), aCamera, totalDataSize);
-
- /* read camera metadata */
- totalEntries += readCameraMetadata(aDeviceElem->FirstChildElement("characteristics"), aCamera,
- totalDataSize);
-
- /* construct camera_metadata_t */
- if (!constructCameraMetadata(aCamera, totalEntries, totalDataSize)) {
- LOG(WARNING) << "Either failed to allocate memory or "
- << "allocated memory was not large enough";
- }
-
- return true;
-}
-
-size_t ConfigManager::readCameraCapabilities(const XMLElement* const aCapElem, CameraInfo* aCamera,
- size_t& dataSize) {
- if (aCapElem == nullptr || aCamera == nullptr) {
- return 0;
- }
-
- std::string token;
- const XMLElement* curElem = nullptr;
-
- /* a list of supported camera parameters/controls */
- curElem = aCapElem->FirstChildElement("supported_controls");
- if (curElem != nullptr) {
- const XMLElement* ctrlElem = curElem->FirstChildElement("control");
- while (ctrlElem != nullptr) {
- const char* nameAttr = ctrlElem->FindAttribute("name")->Value();
- int32_t minVal = INT32_MIN, maxVal = INT32_MAX;
- if (!android::base::ParseInt(ctrlElem->FindAttribute("min")->Value(), &minVal)) {
- LOG(WARNING) << "Failed to parse " << ctrlElem->FindAttribute("min")->Value();
- }
-
- if (!android::base::ParseInt(ctrlElem->FindAttribute("max")->Value(), &maxVal)) {
- LOG(WARNING) << "Failed to parse " << ctrlElem->FindAttribute("max")->Value();
- }
-
- int32_t stepVal = 1;
- const XMLAttribute* stepAttr = ctrlElem->FindAttribute("step");
- if (stepAttr != nullptr) {
- if (!android::base::ParseInt(stepAttr->Value(), &stepVal)) {
- LOG(WARNING) << "Failed to parse " << stepAttr->Value();
- }
- }
-
- CameraParam aParam;
- if (ConfigManagerUtil::convertToEvsCameraParam(nameAttr, aParam)) {
- aCamera->controls.insert_or_assign(
- aParam, std::move(std::make_tuple(minVal, maxVal, stepVal)));
- }
-
- ctrlElem = ctrlElem->NextSiblingElement("control");
- }
- }
-
- /* a list of camera stream configurations */
- curElem = aCapElem->FirstChildElement("stream");
- while (curElem != nullptr) {
- /* read 5 attributes */
- const XMLAttribute* idAttr = curElem->FindAttribute("id");
- const XMLAttribute* widthAttr = curElem->FindAttribute("width");
- const XMLAttribute* heightAttr = curElem->FindAttribute("height");
- const XMLAttribute* fmtAttr = curElem->FindAttribute("format");
- const XMLAttribute* fpsAttr = curElem->FindAttribute("framerate");
-
- int32_t id = -1;
- int32_t framerate = 0;
- if (!android::base::ParseInt(idAttr->Value(), &id)) {
- LOG(WARNING) << "Failed to parse " << idAttr->Value();
- }
- if (fpsAttr != nullptr) {
- if (!android::base::ParseInt(fpsAttr->Value(), &framerate)) {
- LOG(WARNING) << "Failed to parse " << fpsAttr->Value();
- }
- }
-
- PixelFormat format = PixelFormat::UNSPECIFIED;
- if (ConfigManagerUtil::convertToPixelFormat(fmtAttr->Value(), format)) {
- StreamConfiguration cfg = {
- .id = id,
- .format = format,
- .type = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
- .framerate = framerate,
- };
-
- if (!android::base::ParseInt(widthAttr->Value(), &cfg.width) ||
- !android::base::ParseInt(heightAttr->Value(), &cfg.height)) {
- LOG(WARNING) << "Failed to parse " << widthAttr->Value() << " and "
- << heightAttr->Value();
- }
- aCamera->streamConfigurations.insert_or_assign(id, cfg);
- }
-
- curElem = curElem->NextSiblingElement("stream");
- }
-
- dataSize = calculate_camera_metadata_entry_data_size(
- get_camera_metadata_tag_type(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS),
- aCamera->streamConfigurations.size() * sizeof(StreamConfiguration));
-
- /* a single camera metadata entry contains multiple stream configurations */
- return dataSize > 0 ? 1 : 0;
-}
-
-size_t ConfigManager::readCameraMetadata(const XMLElement* const aParamElem, CameraInfo* aCamera,
- size_t& dataSize) {
- if (aParamElem == nullptr || aCamera == nullptr) {
- return 0;
- }
-
- const XMLElement* curElem = aParamElem->FirstChildElement("parameter");
- size_t numEntries = 0;
- camera_metadata_tag_t tag;
- while (curElem != nullptr) {
- if (ConfigManagerUtil::convertToMetadataTag(curElem->FindAttribute("name")->Value(), tag)) {
- switch (tag) {
- case ANDROID_LENS_DISTORTION:
- case ANDROID_LENS_POSE_ROTATION:
- case ANDROID_LENS_POSE_TRANSLATION:
- case ANDROID_LENS_INTRINSIC_CALIBRATION: {
- /* float[] */
- size_t count = 0;
- void* data = ConfigManagerUtil::convertFloatArray(
- curElem->FindAttribute("size")->Value(),
- curElem->FindAttribute("value")->Value(), count);
-
- aCamera->cameraMetadata.insert_or_assign(tag, std::make_pair(data, count));
-
- ++numEntries;
- dataSize += calculate_camera_metadata_entry_data_size(
- get_camera_metadata_tag_type(tag), count);
-
- break;
- }
-
- case ANDROID_REQUEST_AVAILABLE_CAPABILITIES: {
- camera_metadata_enum_android_request_available_capabilities_t* data =
- new camera_metadata_enum_android_request_available_capabilities_t[1];
- if (ConfigManagerUtil::convertToCameraCapability(
- curElem->FindAttribute("value")->Value(), *data)) {
- aCamera->cameraMetadata.insert_or_assign(tag,
- std::make_pair((void*)data, 1));
-
- ++numEntries;
- dataSize += calculate_camera_metadata_entry_data_size(
- get_camera_metadata_tag_type(tag), 1);
- }
- break;
- }
-
- case ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS: {
- /* a comma-separated list of physical camera devices */
- size_t len = strlen(curElem->FindAttribute("value")->Value());
- char* data = new char[len + 1];
- memcpy(data, curElem->FindAttribute("value")->Value(), len * sizeof(char));
-
- /* replace commas with null char */
- char* p = data;
- while (*p != '\0') {
- if (*p == ',') {
- *p = '\0';
- }
- ++p;
- }
-
- aCamera->cameraMetadata.insert_or_assign(tag,
- std::make_pair((void*)data, len + 1));
-
- ++numEntries;
- dataSize += calculate_camera_metadata_entry_data_size(
- get_camera_metadata_tag_type(tag), len);
- break;
- }
-
- /* TODO(b/140416878): add vendor-defined/custom tag support */
- default:
- LOG(WARNING) << "Parameter " << curElem->FindAttribute("name")->Value()
- << " is not supported";
- break;
- }
- } else {
- LOG(WARNING) << "Unsupported metadata tag " << curElem->FindAttribute("name")->Value()
- << " is found.";
- }
-
- curElem = curElem->NextSiblingElement("parameter");
- }
-
- return numEntries;
-}
-
-bool ConfigManager::constructCameraMetadata(CameraInfo* aCamera, size_t totalEntries,
- size_t totalDataSize) {
- if (aCamera == nullptr || !aCamera->allocate(totalEntries, totalDataSize)) {
- LOG(ERROR) << "Failed to allocate memory for camera metadata";
- return false;
- }
-
- const size_t numStreamConfigs = aCamera->streamConfigurations.size();
- std::unique_ptr data(new int32_t[sizeof(StreamConfiguration) * numStreamConfigs]);
- int32_t* ptr = data.get();
- for (auto& cfg : aCamera->streamConfigurations) {
- memcpy(ptr, &cfg.second, sizeof(StreamConfiguration));
- ptr += sizeof(StreamConfiguration);
- }
- int32_t err = add_camera_metadata_entry(
- aCamera->characteristics, ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, data.get(),
- numStreamConfigs * sizeof(StreamConfiguration));
-
- if (err) {
- LOG(ERROR) << "Failed to add stream configurations to metadata, ignored";
- return false;
- }
-
- bool success = true;
- for (auto& [tag, entry] : aCamera->cameraMetadata) {
- /* try to add new camera metadata entry */
- int32_t err =
- add_camera_metadata_entry(aCamera->characteristics, tag, entry.first, entry.second);
- if (err) {
- LOG(ERROR) << "Failed to add an entry with a tag, " << std::hex << tag;
-
- /* may exceed preallocated capacity */
- LOG(ERROR) << "Camera metadata has "
- << get_camera_metadata_entry_count(aCamera->characteristics) << " / "
- << get_camera_metadata_entry_capacity(aCamera->characteristics)
- << " entries and "
- << get_camera_metadata_data_count(aCamera->characteristics) << " / "
- << get_camera_metadata_data_capacity(aCamera->characteristics)
- << " bytes are filled.";
- LOG(ERROR) << "\tCurrent metadata entry requires "
- << calculate_camera_metadata_entry_data_size(tag, entry.second) << " bytes.";
-
- success = false;
- }
- }
-
- LOG(VERBOSE) << "Camera metadata has "
- << get_camera_metadata_entry_count(aCamera->characteristics) << " / "
- << get_camera_metadata_entry_capacity(aCamera->characteristics) << " entries and "
- << get_camera_metadata_data_count(aCamera->characteristics) << " / "
- << get_camera_metadata_data_capacity(aCamera->characteristics)
- << " bytes are filled.";
- return success;
-}
-
-void ConfigManager::readSystemInfo(const XMLElement* const aSysElem) {
- if (aSysElem == nullptr) {
- return;
- }
-
- /*
- * Please note that this function assumes that a given system XML element
- * and its child elements follow DTD. If it does not, it will cause a
- * segmentation fault due to the failure of finding expected attributes.
- */
-
- /* read number of cameras available in the system */
- const XMLElement* xmlElem = aSysElem->FirstChildElement("num_cameras");
- if (xmlElem != nullptr) {
- if (!android::base::ParseInt(xmlElem->FindAttribute("value")->Value(),
- &mSystemInfo.numCameras)) {
- LOG(WARNING) << "Failed to parse " << xmlElem->FindAttribute("value")->Value();
- }
- }
-}
-
-void ConfigManager::readDisplayInfo(const XMLElement* const aDisplayElem) {
- if (aDisplayElem == nullptr) {
- LOG(WARNING) << "XML file does not have required camera element";
- return;
- }
-
- const XMLElement* curDev = aDisplayElem->FirstChildElement("device");
- while (curDev != nullptr) {
- const char* id = curDev->FindAttribute("id")->Value();
- std::unique_ptr dpy(new DisplayInfo());
- if (dpy == nullptr) {
- LOG(ERROR) << "Failed to allocate memory for DisplayInfo";
- return;
- }
-
- const XMLElement* cap = curDev->FirstChildElement("caps");
- if (cap != nullptr) {
- const XMLElement* curStream = cap->FirstChildElement("stream");
- while (curStream != nullptr) {
- /* read 4 attributes */
- const XMLAttribute* idAttr = curStream->FindAttribute("id");
- const XMLAttribute* widthAttr = curStream->FindAttribute("width");
- const XMLAttribute* heightAttr = curStream->FindAttribute("height");
- const XMLAttribute* fmtAttr = curStream->FindAttribute("format");
-
- int32_t id = -1;
- if (!android::base::ParseInt(idAttr->Value(), &id)) {
- LOG(WARNING) << "Failed to parse " << idAttr->Value();
- }
- PixelFormat format = PixelFormat::UNSPECIFIED;
- if (ConfigManagerUtil::convertToPixelFormat(fmtAttr->Value(), format)) {
- StreamConfiguration cfg = {
- .id = id,
- .format = format,
- .type = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT,
- };
- if (!android::base::ParseInt(widthAttr->Value(), &cfg.width) ||
- !android::base::ParseInt(heightAttr->Value(), &cfg.height)) {
- LOG(WARNING) << "Failed to parse " << widthAttr->Value() << " and "
- << heightAttr->Value();
- }
- dpy->streamConfigurations.insert_or_assign(id, cfg);
- }
-
- curStream = curStream->NextSiblingElement("stream");
- }
- }
-
- mDisplayInfo.insert_or_assign(id, std::move(dpy));
- curDev = curDev->NextSiblingElement("device");
- }
-
- return;
-}
-
-bool ConfigManager::readConfigDataFromXML() noexcept {
- XMLDocument xmlDoc;
-
- const int64_t parsingStart = android::elapsedRealtimeNano();
-
- /* load and parse a configuration file */
- xmlDoc.LoadFile(sConfigOverridePath.data());
- if (xmlDoc.ErrorID() != tinyxml2::XML_SUCCESS) {
- xmlDoc.LoadFile(sConfigDefaultPath.data());
- if (xmlDoc.ErrorID() != tinyxml2::XML_SUCCESS) {
- LOG(ERROR) << "Failed to load and/or parse a configuration file, " << xmlDoc.ErrorStr();
- return false;
- }
- }
-
- /* retrieve the root element */
- const XMLElement* rootElem = xmlDoc.RootElement();
- if (std::strcmp(rootElem->Name(), "configuration") != 0) {
- LOG(ERROR) << "A configuration file is not in the required format. "
- << "See /etc/automotive/evs/evs_configuration.dtd";
- return false;
- }
-
- std::unique_lock lock(mConfigLock);
-
- /*
- * parse camera information; this needs to be done before reading system
- * information
- */
- readCameraInfo(rootElem->FirstChildElement("camera"));
-
- /* parse system information */
- readSystemInfo(rootElem->FirstChildElement("system"));
-
- /* parse display information */
- readDisplayInfo(rootElem->FirstChildElement("display"));
-
- /* configuration data is ready to be consumed */
- mIsReady = true;
-
- /* notify that configuration data is ready */
- lock.unlock();
- mConfigCond.notify_all();
-
- const int64_t parsingEnd = android::elapsedRealtimeNano();
- LOG(INFO) << "Parsing configuration file takes " << std::scientific
- << (double)(parsingEnd - parsingStart) / 1000000.0 << " ms.";
-
- return true;
-}
-
-bool ConfigManager::readConfigDataFromBinary() {
- /* Temporary buffer to hold configuration data read from a binary file */
- char mBuffer[1024];
-
- std::fstream srcFile;
- const int64_t readStart = android::elapsedRealtimeNano();
-
- srcFile.open(mBinaryFilePath, std::fstream::in | std::fstream::binary);
- if (!srcFile) {
- LOG(ERROR) << "Failed to open a source binary file, " << mBinaryFilePath;
- return false;
- }
-
- std::unique_lock lock(mConfigLock);
- mIsReady = false;
-
- /* read configuration data into the internal buffer */
- srcFile.read(mBuffer, sizeof(mBuffer));
- LOG(VERBOSE) << __FUNCTION__ << ": " << srcFile.gcount() << " bytes are read.";
- char* p = mBuffer;
- size_t sz = 0;
-
- /* read number of camera group information entries */
- const size_t ngrps = *(reinterpret_cast(p));
- p += sizeof(size_t);
-
- /* read each camera information entry */
- for (size_t cidx = 0; cidx < ngrps; ++cidx) {
- /* read camera identifier */
- std::string cameraId = *(reinterpret_cast(p));
- p += sizeof(std::string);
-
- /* size of camera_metadata_t */
- const size_t num_entry = *(reinterpret_cast(p));
- p += sizeof(size_t);
- const size_t num_data = *(reinterpret_cast(p));
- p += sizeof(size_t);
-
- /* create CameraInfo and add it to hash map */
- std::unique_ptr aCamera;
- if (aCamera == nullptr || !aCamera->allocate(num_entry, num_data)) {
- LOG(ERROR) << "Failed to create new CameraInfo object";
- mCameraInfo.clear();
- return false;
- }
-
- /* controls */
- typedef struct {
- CameraParam cid;
- int32_t min;
- int32_t max;
- int32_t step;
- } CameraCtrl;
- sz = *(reinterpret_cast(p));
- p += sizeof(size_t);
- CameraCtrl* ptr = reinterpret_cast(p);
- for (size_t idx = 0; idx < sz; ++idx) {
- CameraCtrl temp = *ptr++;
- aCamera->controls.insert_or_assign(
- temp.cid, std::move(std::make_tuple(temp.min, temp.max, temp.step)));
- }
- p = reinterpret_cast(ptr);
-
- /* stream configurations */
- sz = *(reinterpret_cast(p));
- p += sizeof(size_t);
- int32_t* i32_ptr = reinterpret_cast(p);
- for (size_t idx = 0; idx < sz; ++idx) {
- const int32_t id = *i32_ptr++;
-
- StreamConfiguration temp;
- memcpy(&temp, i32_ptr, sizeof(StreamConfiguration));
- i32_ptr += sizeof(StreamConfiguration);
- aCamera->streamConfigurations.insert_or_assign(id, temp);
- }
- p = reinterpret_cast(i32_ptr);
-
- /* synchronization */
- aCamera->synchronized = *(reinterpret_cast(p));
- p += sizeof(int32_t);
-
- for (size_t idx = 0; idx < num_entry; ++idx) {
- /* Read camera metadata entries */
- camera_metadata_tag_t tag = *reinterpret_cast(p);
- p += sizeof(camera_metadata_tag_t);
- const size_t count = *reinterpret_cast(p);
- p += sizeof(size_t);
-
- const int32_t type = get_camera_metadata_tag_type(tag);
- switch (type) {
- case TYPE_BYTE: {
- add_camera_metadata_entry(aCamera->characteristics, tag, p, count);
- p += count * sizeof(uint8_t);
- break;
- }
- case TYPE_INT32: {
- add_camera_metadata_entry(aCamera->characteristics, tag, p, count);
- p += count * sizeof(int32_t);
- break;
- }
- case TYPE_FLOAT: {
- add_camera_metadata_entry(aCamera->characteristics, tag, p, count);
- p += count * sizeof(float);
- break;
- }
- case TYPE_INT64: {
- add_camera_metadata_entry(aCamera->characteristics, tag, p, count);
- p += count * sizeof(int64_t);
- break;
- }
- case TYPE_DOUBLE: {
- add_camera_metadata_entry(aCamera->characteristics, tag, p, count);
- p += count * sizeof(double);
- break;
- }
- case TYPE_RATIONAL:
- p += count * sizeof(camera_metadata_rational_t);
- break;
- default:
- LOG(WARNING) << "Type " << type << " is unknown; "
- << "data may be corrupted.";
- break;
- }
- }
-
- mCameraInfo.insert_or_assign(cameraId, std::move(aCamera));
- }
-
- /* read number of camera information entries */
- const size_t ncams = *(reinterpret_cast(p));
- p += sizeof(size_t);
-
- /* read each camera information entry */
- for (size_t cidx = 0; cidx < ncams; ++cidx) {
- /* read camera identifier */
- std::string cameraId = *(reinterpret_cast(p));
- p += sizeof(std::string);
-
- /* size of camera_metadata_t */
- const size_t num_entry = *(reinterpret_cast(p));
- p += sizeof(size_t);
- const size_t num_data = *(reinterpret_cast(p));
- p += sizeof(size_t);
-
- /* create CameraInfo and add it to hash map */
- std::unique_ptr aCamera;
- if (aCamera == nullptr || !aCamera->allocate(num_entry, num_data)) {
- LOG(ERROR) << "Failed to create new CameraInfo object";
- mCameraInfo.clear();
- return false;
- }
-
- /* controls */
- typedef struct {
- CameraParam cid;
- int32_t min;
- int32_t max;
- int32_t step;
- } CameraCtrl;
- sz = *(reinterpret_cast(p));
- p += sizeof(size_t);
- CameraCtrl* ptr = reinterpret_cast(p);
- for (size_t idx = 0; idx < sz; ++idx) {
- CameraCtrl temp = *ptr++;
- aCamera->controls.insert_or_assign(
- temp.cid, std::move(std::make_tuple(temp.min, temp.max, temp.step)));
- }
- p = reinterpret_cast(ptr);
-
- /* stream configurations */
- sz = *(reinterpret_cast(p));
- p += sizeof(size_t);
- int32_t* i32_ptr = reinterpret_cast(p);
- for (size_t idx = 0; idx < sz; ++idx) {
- const int32_t id = *i32_ptr++;
-
- StreamConfiguration temp;
- memcpy(&temp, i32_ptr, sizeof(StreamConfiguration));
- i32_ptr += sizeof(StreamConfiguration);
- aCamera->streamConfigurations.insert_or_assign(id, temp);
- }
- p = reinterpret_cast(i32_ptr);
-
- for (size_t idx = 0; idx < num_entry; ++idx) {
- /* Read camera metadata entries */
- camera_metadata_tag_t tag = *reinterpret_cast(p);
- p += sizeof(camera_metadata_tag_t);
- const size_t count = *reinterpret_cast(p);
- p += sizeof(size_t);
-
- const int32_t type = get_camera_metadata_tag_type(tag);
- switch (type) {
- case TYPE_BYTE: {
- add_camera_metadata_entry(aCamera->characteristics, tag, p, count);
- p += count * sizeof(uint8_t);
- break;
- }
- case TYPE_INT32: {
- add_camera_metadata_entry(aCamera->characteristics, tag, p, count);
- p += count * sizeof(int32_t);
- break;
- }
- case TYPE_FLOAT: {
- add_camera_metadata_entry(aCamera->characteristics, tag, p, count);
- p += count * sizeof(float);
- break;
- }
- case TYPE_INT64: {
- add_camera_metadata_entry(aCamera->characteristics, tag, p, count);
- p += count * sizeof(int64_t);
- break;
- }
- case TYPE_DOUBLE: {
- add_camera_metadata_entry(aCamera->characteristics, tag, p, count);
- p += count * sizeof(double);
- break;
- }
- case TYPE_RATIONAL:
- p += count * sizeof(camera_metadata_rational_t);
- break;
- default:
- LOG(WARNING) << "Type " << type << " is unknown; "
- << "data may be corrupted.";
- break;
- }
- }
-
- mCameraInfo.insert_or_assign(cameraId, std::move(aCamera));
- }
-
- mIsReady = true;
-
- /* notify that configuration data is ready */
- lock.unlock();
- mConfigCond.notify_all();
-
- int64_t readEnd = android::elapsedRealtimeNano();
- LOG(INFO) << __FUNCTION__ << " takes " << std::scientific
- << (double)(readEnd - readStart) / 1000000.0 << " ms.";
-
- return true;
-}
-
-bool ConfigManager::writeConfigDataToBinary() {
- std::fstream outFile;
-
- const int64_t writeStart = android::elapsedRealtimeNano();
-
- outFile.open(mBinaryFilePath, std::fstream::out | std::fstream::binary);
- if (!outFile) {
- LOG(ERROR) << "Failed to open a destination binary file, " << mBinaryFilePath;
- return false;
- }
-
- /* lock a configuration data while it's being written to the filesystem */
- std::lock_guard lock(mConfigLock);
-
- /* write camera group information */
- size_t sz = mCameraGroups.size();
- outFile.write(reinterpret_cast(&sz), sizeof(size_t));
- for (auto&& [camId, camInfo] : mCameraGroups) {
- LOG(INFO) << "Storing camera group " << camId;
-
- /* write a camera identifier string */
- outFile.write(reinterpret_cast(&camId), sizeof(std::string));
-
- /* controls */
- sz = camInfo->controls.size();
- outFile.write(reinterpret_cast(&sz), sizeof(size_t));
- for (auto&& [ctrl, range] : camInfo->controls) {
- outFile.write(reinterpret_cast(&ctrl), sizeof(CameraParam));
- outFile.write(reinterpret_cast(&std::get<0>(range)), sizeof(int32_t));
- outFile.write(reinterpret_cast(&std::get<1>(range)), sizeof(int32_t));
- outFile.write(reinterpret_cast(&std::get<2>(range)), sizeof(int32_t));
- }
-
- /* stream configurations */
- sz = camInfo->streamConfigurations.size();
- outFile.write(reinterpret_cast(&sz), sizeof(size_t));
- for (auto&& [sid, cfg] : camInfo->streamConfigurations) {
- outFile.write(reinterpret_cast(sid), sizeof(int32_t));
- outFile.write(reinterpret_cast(&cfg), sizeof(cfg));
- }
-
- /* synchronization */
- outFile.write(reinterpret_cast(&camInfo->synchronized), sizeof(int32_t));
-
- /* size of camera_metadata_t */
- size_t num_entry = 0;
- size_t num_data = 0;
- if (camInfo->characteristics != nullptr) {
- num_entry = get_camera_metadata_entry_count(camInfo->characteristics);
- num_data = get_camera_metadata_data_count(camInfo->characteristics);
- }
- outFile.write(reinterpret_cast(&num_entry), sizeof(size_t));
- outFile.write(reinterpret_cast(&num_data), sizeof(size_t));
-
- /* write each camera metadata entry */
- if (num_entry > 0) {
- camera_metadata_entry_t entry;
- for (size_t idx = 0; idx < num_entry; ++idx) {
- if (get_camera_metadata_entry(camInfo->characteristics, idx, &entry)) {
- LOG(ERROR) << "Failed to retrieve camera metadata entry " << idx;
- outFile.close();
- return false;
- }
-
- outFile.write(reinterpret_cast(&entry.tag), sizeof(entry.tag));
- outFile.write(reinterpret_cast(&entry.count), sizeof(entry.count));
-
- int32_t type = get_camera_metadata_tag_type(entry.tag);
- switch (type) {
- case TYPE_BYTE:
- outFile.write(reinterpret_cast(entry.data.u8),
- sizeof(uint8_t) * entry.count);
- break;
- case TYPE_INT32:
- outFile.write(reinterpret_cast(entry.data.i32),
- sizeof(int32_t) * entry.count);
- break;
- case TYPE_FLOAT:
- outFile.write(reinterpret_cast(entry.data.f),
- sizeof(float) * entry.count);
- break;
- case TYPE_INT64:
- outFile.write(reinterpret_cast(entry.data.i64),
- sizeof(int64_t) * entry.count);
- break;
- case TYPE_DOUBLE:
- outFile.write(reinterpret_cast(entry.data.d),
- sizeof(double) * entry.count);
- break;
- case TYPE_RATIONAL:
- [[fallthrough]];
- default:
- LOG(WARNING) << "Type " << type << " is not supported.";
- break;
- }
- }
- }
- }
-
- /* write camera device information */
- sz = mCameraInfo.size();
- outFile.write(reinterpret_cast(&sz), sizeof(size_t));
- for (auto&& [camId, camInfo] : mCameraInfo) {
- LOG(INFO) << "Storing camera " << camId;
-
- /* write a camera identifier string */
- outFile.write(reinterpret_cast(&camId), sizeof(std::string));
-
- /* controls */
- sz = camInfo->controls.size();
- outFile.write(reinterpret_cast(&sz), sizeof(size_t));
- for (auto& [ctrl, range] : camInfo->controls) {
- outFile.write(reinterpret_cast(&ctrl), sizeof(CameraParam));
- outFile.write(reinterpret_cast(&std::get<0>(range)), sizeof(int32_t));
- outFile.write(reinterpret_cast(&std::get<1>(range)), sizeof(int32_t));
- outFile.write(reinterpret_cast(&std::get<2>(range)), sizeof(int32_t));
- }
-
- /* stream configurations */
- sz = camInfo->streamConfigurations.size();
- outFile.write(reinterpret_cast(&sz), sizeof(size_t));
- for (auto&& [sid, cfg] : camInfo->streamConfigurations) {
- outFile.write(reinterpret_cast(sid), sizeof(int32_t));
- outFile.write(reinterpret_cast(&cfg), sizeof(cfg));
- }
-
- /* size of camera_metadata_t */
- size_t num_entry = 0;
- size_t num_data = 0;
- if (camInfo->characteristics != nullptr) {
- num_entry = get_camera_metadata_entry_count(camInfo->characteristics);
- num_data = get_camera_metadata_data_count(camInfo->characteristics);
- }
- outFile.write(reinterpret_cast(&num_entry), sizeof(size_t));
- outFile.write(reinterpret_cast(&num_data), sizeof(size_t));
-
- /* write each camera metadata entry */
- if (num_entry > 0) {
- camera_metadata_entry_t entry;
- for (size_t idx = 0; idx < num_entry; ++idx) {
- if (get_camera_metadata_entry(camInfo->characteristics, idx, &entry)) {
- LOG(ERROR) << "Failed to retrieve camera metadata entry " << idx;
- outFile.close();
- return false;
- }
-
- outFile.write(reinterpret_cast(&entry.tag), sizeof(entry.tag));
- outFile.write(reinterpret_cast(&entry.count), sizeof(entry.count));
-
- int32_t type = get_camera_metadata_tag_type(entry.tag);
- switch (type) {
- case TYPE_BYTE:
- outFile.write(reinterpret_cast(entry.data.u8),
- sizeof(uint8_t) * entry.count);
- break;
- case TYPE_INT32:
- outFile.write(reinterpret_cast(entry.data.i32),
- sizeof(int32_t) * entry.count);
- break;
- case TYPE_FLOAT:
- outFile.write(reinterpret_cast(entry.data.f),
- sizeof(float) * entry.count);
- break;
- case TYPE_INT64:
- outFile.write(reinterpret_cast(entry.data.i64),
- sizeof(int64_t) * entry.count);
- break;
- case TYPE_DOUBLE:
- outFile.write(reinterpret_cast(entry.data.d),
- sizeof(double) * entry.count);
- break;
- case TYPE_RATIONAL:
- [[fallthrough]];
- default:
- LOG(WARNING) << "Type " << type << " is not supported.";
- break;
- }
- }
- }
- }
-
- outFile.close();
- int64_t writeEnd = android::elapsedRealtimeNano();
- LOG(INFO) << __FUNCTION__ << " takes " << std::scientific
- << (double)(writeEnd - writeStart) / 1000000.0 << " ms.";
-
- return true;
-}
-
-std::unique_ptr ConfigManager::Create() {
- std::unique_ptr cfgMgr(new ConfigManager());
-
- /*
- * Read a configuration from XML file
- *
- * If this is too slow, ConfigManager::readConfigDataFromBinary() and
- * ConfigManager::writeConfigDataToBinary()can serialize CameraInfo object
- * to the filesystem and construct CameraInfo instead; this was
- * evaluated as 10x faster.
- */
- if (!cfgMgr->readConfigDataFromXML()) {
- return nullptr;
- } else {
- return cfgMgr;
- }
-}
-
-ConfigManager::CameraInfo::~CameraInfo() {
- free_camera_metadata(characteristics);
-
- for (auto&& [tag, val] : cameraMetadata) {
- switch (tag) {
- case ANDROID_LENS_DISTORTION:
- case ANDROID_LENS_POSE_ROTATION:
- case ANDROID_LENS_POSE_TRANSLATION:
- case ANDROID_LENS_INTRINSIC_CALIBRATION: {
- delete[] reinterpret_cast(val.first);
- break;
- }
-
- case ANDROID_REQUEST_AVAILABLE_CAPABILITIES: {
- delete[] reinterpret_cast<
- camera_metadata_enum_android_request_available_capabilities_t*>(val.first);
- break;
- }
-
- case ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS: {
- delete[] reinterpret_cast(val.first);
- break;
- }
-
- default:
- LOG(WARNING) << "Tag " << std::hex << tag << " is not supported. "
- << "Data may be corrupted?";
- break;
- }
- }
-}
diff --git a/automotive/evs/aidl/impl/default/src/ConfigManagerUtil.cpp b/automotive/evs/aidl/impl/default/src/ConfigManagerUtil.cpp
deleted file mode 100644
index e5fe6efa57..0000000000
--- a/automotive/evs/aidl/impl/default/src/ConfigManagerUtil.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ConfigManagerUtil.h"
-
-#include
-#include
-#include
-#include
-
-#include
-#include
-
-#include
-
-using ::aidl::android::hardware::automotive::evs::CameraParam;
-using ::aidl::android::hardware::graphics::common::PixelFormat;
-
-bool ConfigManagerUtil::convertToEvsCameraParam(const std::string& id, CameraParam& camParam) {
- std::string trimmed = ConfigManagerUtil::trimString(id);
- bool success = true;
-
- if (!trimmed.compare("BRIGHTNESS")) {
- camParam = CameraParam::BRIGHTNESS;
- } else if (!trimmed.compare("CONTRAST")) {
- camParam = CameraParam::CONTRAST;
- } else if (!trimmed.compare("AUTOGAIN")) {
- camParam = CameraParam::AUTOGAIN;
- } else if (!trimmed.compare("GAIN")) {
- camParam = CameraParam::GAIN;
- } else if (!trimmed.compare("AUTO_WHITE_BALANCE")) {
- camParam = CameraParam::AUTO_WHITE_BALANCE;
- } else if (!trimmed.compare("WHITE_BALANCE_TEMPERATURE")) {
- camParam = CameraParam::WHITE_BALANCE_TEMPERATURE;
- } else if (!trimmed.compare("SHARPNESS")) {
- camParam = CameraParam::SHARPNESS;
- } else if (!trimmed.compare("AUTO_EXPOSURE")) {
- camParam = CameraParam::AUTO_EXPOSURE;
- } else if (!trimmed.compare("ABSOLUTE_EXPOSURE")) {
- camParam = CameraParam::ABSOLUTE_EXPOSURE;
- } else if (!trimmed.compare("ABSOLUTE_FOCUS")) {
- camParam = CameraParam::ABSOLUTE_FOCUS;
- } else if (!trimmed.compare("AUTO_FOCUS")) {
- camParam = CameraParam::AUTO_FOCUS;
- } else if (!trimmed.compare("ABSOLUTE_ZOOM")) {
- camParam = CameraParam::ABSOLUTE_ZOOM;
- } else {
- success = false;
- }
-
- return success;
-}
-
-bool ConfigManagerUtil::convertToPixelFormat(const std::string& in, PixelFormat& out) {
- std::string trimmed = ConfigManagerUtil::trimString(in);
- bool success = true;
-
- if (!trimmed.compare("RGBA_8888")) {
- out = PixelFormat::RGBA_8888;
- } else if (!trimmed.compare("YCRCB_420_SP")) {
- out = PixelFormat::YCRCB_420_SP;
- } else if (!trimmed.compare("YCBCR_422_I")) {
- out = PixelFormat::YCBCR_422_I;
- } else {
- out = PixelFormat::UNSPECIFIED;
- success = false;
- }
-
- return success;
-}
-
-bool ConfigManagerUtil::convertToMetadataTag(const char* name, camera_metadata_tag& aTag) {
- if (!std::strcmp(name, "LENS_DISTORTION")) {
- aTag = ANDROID_LENS_DISTORTION;
- } else if (!std::strcmp(name, "LENS_INTRINSIC_CALIBRATION")) {
- aTag = ANDROID_LENS_INTRINSIC_CALIBRATION;
- } else if (!std::strcmp(name, "LENS_POSE_ROTATION")) {
- aTag = ANDROID_LENS_POSE_ROTATION;
- } else if (!std::strcmp(name, "LENS_POSE_TRANSLATION")) {
- aTag = ANDROID_LENS_POSE_TRANSLATION;
- } else if (!std::strcmp(name, "REQUEST_AVAILABLE_CAPABILITIES")) {
- aTag = ANDROID_REQUEST_AVAILABLE_CAPABILITIES;
- } else if (!std::strcmp(name, "LOGICAL_MULTI_CAMERA_PHYSICAL_IDS")) {
- aTag = ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS;
- } else {
- return false;
- }
-
- return true;
-}
-
-bool ConfigManagerUtil::convertToCameraCapability(
- const char* name, camera_metadata_enum_android_request_available_capabilities_t& cap) {
- if (!std::strcmp(name, "DEPTH_OUTPUT")) {
- cap = ANDROID_REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT;
- } else if (!std::strcmp(name, "LOGICAL_MULTI_CAMERA")) {
- cap = ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA;
- } else if (!std::strcmp(name, "MONOCHROME")) {
- cap = ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME;
- } else if (!std::strcmp(name, "SECURE_IMAGE_DATA")) {
- cap = ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA;
- } else {
- return false;
- }
-
- return true;
-}
-
-float* ConfigManagerUtil::convertFloatArray(const char* sz, const char* vals, size_t& count,
- const char delimiter) {
- std::string size_string(sz);
- std::string value_string(vals);
-
- if (!android::base::ParseUint(size_string, &count)) {
- LOG(ERROR) << "Failed to parse " << size_string;
- return nullptr;
- }
- float* result = new float[count];
- std::stringstream values(value_string);
-
- int32_t idx = 0;
- std::string token;
- while (getline(values, token, delimiter)) {
- if (!android::base::ParseFloat(token, &result[idx++])) {
- LOG(WARNING) << "Failed to parse " << token;
- }
- }
-
- return result;
-}
-
-std::string ConfigManagerUtil::trimString(const std::string& src, const std::string& ws) {
- const auto s = src.find_first_not_of(ws);
- if (s == std::string::npos) {
- return "";
- }
-
- const auto e = src.find_last_not_of(ws);
- const auto r = e - s + 1;
-
- return src.substr(s, r);
-}
diff --git a/automotive/evs/aidl/impl/default/src/DefaultEvsEnumerator.cpp b/automotive/evs/aidl/impl/default/src/DefaultEvsEnumerator.cpp
new file mode 100644
index 0000000000..5a81d05850
--- /dev/null
+++ b/automotive/evs/aidl/impl/default/src/DefaultEvsEnumerator.cpp
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// TODO(b/203661081): Remove below lines to disable compiler warnings.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunused-parameter"
+
+#define LOG_TAG "DefaultEvsEnumerator"
+
+#include
+
+namespace aidl::android::hardware::automotive::evs::implementation {
+
+using ::ndk::ScopedAStatus;
+
+ScopedAStatus DefaultEvsEnumerator::isHardware(bool* flag) {
+ // This returns true always.
+ *flag = true;
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus DefaultEvsEnumerator::openCamera(const std::string& cameraId,
+ const Stream& streamConfig,
+ std::shared_ptr* obj) {
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus DefaultEvsEnumerator::closeCamera(const std::shared_ptr& obj) {
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus DefaultEvsEnumerator::getCameraList(std::vector* list) {
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus DefaultEvsEnumerator::getStreamList(const CameraDesc& desc,
+ std::vector* _aidl_return) {
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus DefaultEvsEnumerator::openDisplay(int32_t displayId,
+ std::shared_ptr* obj) {
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus DefaultEvsEnumerator::closeDisplay(const std::shared_ptr& state) {
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus DefaultEvsEnumerator::getDisplayIdList(std::vector* list) {
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus DefaultEvsEnumerator::getDisplayState(DisplayState* state) {
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus DefaultEvsEnumerator::registerStatusCallback(
+ const std::shared_ptr& callback) {
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus DefaultEvsEnumerator::openUltrasonicsArray(
+ const std::string& id, std::shared_ptr* obj) {
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus DefaultEvsEnumerator::closeUltrasonicsArray(
+ const std::shared_ptr& obj) {
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus DefaultEvsEnumerator::getUltrasonicsArrayList(
+ std::vector* list) {
+ return ScopedAStatus::ok();
+}
+
+} // namespace aidl::android::hardware::automotive::evs::implementation
+
+#pragma clang diagnostic pop
diff --git a/automotive/evs/aidl/impl/default/src/EvsEnumerator.cpp b/automotive/evs/aidl/impl/default/src/EvsEnumerator.cpp
deleted file mode 100644
index 6e2405deb5..0000000000
--- a/automotive/evs/aidl/impl/default/src/EvsEnumerator.cpp
+++ /dev/null
@@ -1,552 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "EvsEnumerator.h"
-
-#include "ConfigManager.h"
-#include "EvsGlDisplay.h"
-#include "EvsMockCamera.h"
-
-#include
-#include
-#include
-#include
-
-#include
-#include
-
-namespace {
-
-using ::aidl::android::frameworks::automotive::display::ICarDisplayProxy;
-using ::aidl::android::hardware::graphics::common::BufferUsage;
-using ::ndk::ScopedAStatus;
-using std::chrono_literals::operator""s;
-
-// Constants
-constexpr std::chrono::seconds kEnumerationTimeout = 10s;
-constexpr uint64_t kInvalidDisplayId = std::numeric_limits::max();
-const std::set kAllowedUids = {AID_AUTOMOTIVE_EVS, AID_SYSTEM, AID_ROOT};
-
-} // namespace
-
-namespace aidl::android::hardware::automotive::evs::implementation {
-
-// NOTE: All members values are static so that all clients operate on the same state
-// That is to say, this is effectively a singleton despite the fact that HIDL
-// constructs a new instance for each client.
-std::unordered_map EvsEnumerator::sCameraList;
-std::mutex EvsEnumerator::sLock;
-std::condition_variable EvsEnumerator::sCameraSignal;
-std::unique_ptr EvsEnumerator::sConfigManager;
-std::shared_ptr EvsEnumerator::sDisplayProxy;
-std::unordered_map EvsEnumerator::sDisplayPortList;
-
-EvsEnumerator::ActiveDisplays& EvsEnumerator::mutableActiveDisplays() {
- static ActiveDisplays active_displays;
- return active_displays;
-}
-
-EvsEnumerator::EvsEnumerator(const std::shared_ptr& proxyService) {
- LOG(DEBUG) << "EvsEnumerator is created.";
-
- if (!sConfigManager) {
- /* loads and initializes ConfigManager in a separate thread */
- sConfigManager = ConfigManager::Create();
- }
-
- if (!sDisplayProxy) {
- /* sets a car-window service handle */
- sDisplayProxy = proxyService;
- }
-
- // Enumerate existing devices
- enumerateCameras();
- mInternalDisplayId = enumerateDisplays();
-}
-
-bool EvsEnumerator::checkPermission() {
- const auto uid = AIBinder_getCallingUid();
- if (kAllowedUids.find(uid) == kAllowedUids.end()) {
- LOG(ERROR) << "EVS access denied: "
- << "pid = " << AIBinder_getCallingPid() << ", uid = " << uid;
- return false;
- }
-
- return true;
-}
-
-void EvsEnumerator::enumerateCameras() {
- if (!sConfigManager) {
- return;
- }
-
- for (auto id : sConfigManager->getCameraIdList()) {
- CameraRecord rec(id.data());
- std::unique_ptr& pInfo = sConfigManager->getCameraInfo(id);
- if (pInfo) {
- uint8_t* ptr = reinterpret_cast(pInfo->characteristics);
- const size_t len = get_camera_metadata_size(pInfo->characteristics);
- rec.desc.metadata.insert(rec.desc.metadata.end(), ptr, ptr + len);
- }
- sCameraList.insert_or_assign(id, std::move(rec));
- }
-}
-
-uint64_t EvsEnumerator::enumerateDisplays() {
- LOG(INFO) << __FUNCTION__ << ": Starting display enumeration";
- uint64_t internalDisplayId = kInvalidDisplayId;
- if (!sDisplayProxy) {
- LOG(ERROR) << "ICarDisplayProxy is not available!";
- return internalDisplayId;
- }
-
- std::vector displayIds;
- if (auto status = sDisplayProxy->getDisplayIdList(&displayIds); !status.isOk()) {
- LOG(ERROR) << "Failed to retrieve a display id list"
- << ::android::statusToString(status.getStatus());
- return internalDisplayId;
- }
-
- if (displayIds.size() > 0) {
- // The first entry of the list is the internal display. See
- // SurfaceFlinger::getPhysicalDisplayIds() implementation.
- internalDisplayId = displayIds[0];
- for (const auto& id : displayIds) {
- const auto port = id & 0xFF;
- LOG(INFO) << "Display " << std::hex << id << " is detected on the port, " << port;
- sDisplayPortList.insert_or_assign(port, id);
- }
- }
-
- LOG(INFO) << "Found " << sDisplayPortList.size() << " displays";
- return internalDisplayId;
-}
-
-// Methods from ::android::hardware::automotive::evs::IEvsEnumerator follow.
-ScopedAStatus EvsEnumerator::getCameraList(std::vector