Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02a18250 authored by Hao Chen's avatar Hao Chen
Browse files

Add EVS Camera Device Type to the Default Implementation

Test: Build
Bug: 277861838
Change-Id: I8f9c076e0d03f541587015c71aeb8a9335d37733
parent 3fd7e5c1
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -25,8 +25,10 @@

#include <tinyxml2.h>

#include <limits>
#include <string>
#include <string_view>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#include <vector>
@@ -54,6 +56,15 @@ class ConfigManager final {
    /* Camera device's capabilities and metadata */
    class CameraInfo {
      public:
        enum class DeviceType : std::int32_t {
            NONE = 0,
            MOCK = 1,
            V4L2 = 2,
            VIDEO = 3,

            UNKNOWN = std::numeric_limits<std::underlying_type_t<DeviceType>>::max(),
        };

        CameraInfo() : characteristics(nullptr) {}

        virtual ~CameraInfo();
@@ -69,6 +80,10 @@ class ConfigManager final {
            return characteristics != nullptr;
        }

        static DeviceType deviceTypeFromSV(const std::string_view sv);

        DeviceType deviceType{DeviceType::NONE};

        /*
         * List of supported controls that the primary client can program.
         * Paraemters are stored with its valid range
+16 −0
Original line number Diff line number Diff line
@@ -40,6 +40,18 @@ std::string_view ConfigManager::sConfigDefaultPath =
std::string_view ConfigManager::sConfigOverridePath =
        "/vendor/etc/automotive/evs/evs_configuration_override.xml";

ConfigManager::CameraInfo::DeviceType ConfigManager::CameraInfo::deviceTypeFromSV(
        const std::string_view sv) {
    using namespace std::string_view_literals;
    static const std::unordered_map<std::string_view, DeviceType> nameToType = {
            {"mock"sv, DeviceType::MOCK},
            {"v4l2"sv, DeviceType::V4L2},
            {"video"sv, DeviceType::VIDEO},
    };
    const auto search = nameToType.find(sv);
    return search == nameToType.end() ? DeviceType::UNKNOWN : search->second;
}

void ConfigManager::printElementNames(const XMLElement* rootElem, const std::string& prefix) const {
    const XMLElement* curElem = rootElem;

@@ -128,6 +140,10 @@ bool ConfigManager::readCameraDeviceInfo(CameraInfo* aCamera, const XMLElement*
        return false;
    }

    if (const auto typeAttr = aDeviceElem->FindAttribute("type")) {
        aCamera->deviceType = CameraInfo::deviceTypeFromSV(typeAttr->Value());
    }

    /* size information to allocate camera_metadata_t */
    size_t totalEntries = 0;
    size_t totalDataSize = 0;
+16 −1
Original line number Diff line number Diff line
@@ -253,7 +253,22 @@ ScopedAStatus EvsEnumerator::openCamera(const std::string& id, const Stream& cfg
    if (!sConfigManager) {
        pActiveCamera = EvsMockCamera::Create(id.data());
    } else {
        pActiveCamera = EvsMockCamera::Create(id.data(), sConfigManager->getCameraInfo(id), &cfg);
        auto& cameraInfo = sConfigManager->getCameraInfo(id);
        switch (cameraInfo->deviceType) {
            using DeviceType = ConfigManager::CameraInfo::DeviceType;

            // Default to MOCK for backward compatibility.
            case DeviceType::NONE:
            case DeviceType::MOCK:
                pActiveCamera = EvsMockCamera::Create(id.data(), cameraInfo, &cfg);
                break;

            default:
                LOG(ERROR) << __func__ << ": camera device type "
                           << static_cast<std::int32_t>(cameraInfo->deviceType)
                           << " is not supported.";
                break;
        }
    }

    pRecord->activeInstance = pActiveCamera;