1f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh/*
2f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh * Copyright (C) 2016 The Android Open Source Project
3f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh *
4f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh * Licensed under the Apache License, Version 2.0 (the "License");
5f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh * you may not use this file except in compliance with the License.
6f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh * You may obtain a copy of the License at
7f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh *
8f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh *      http://www.apache.org/licenses/LICENSE-2.0
9f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh *
10f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh * Unless required by applicable law or agreed to in writing, software
11f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh * distributed under the License is distributed on an "AS IS" BASIS,
12f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh * See the License for the specific language governing permissions and
14f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh * limitations under the License.
15f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh */
16f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
17f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh#define LOG_TAG "CamProvider@2.4-impl"
1850fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala//#define LOG_NDEBUG 0
19f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh#include <android/log.h>
20f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
21f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh#include "CameraProvider.h"
221903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh#include "ExternalCameraProvider.h"
23248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh#include "CameraDevice_1_0.h"
2450fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala#include "CameraDevice_3_3.h"
25e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev#include "CameraDevice_3_4.h"
2650fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala#include <cutils/properties.h>
27f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh#include <string.h>
28f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh#include <utils/Trace.h>
29f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
30f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
31f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehnamespace android {
32f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehnamespace hardware {
33f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehnamespace camera {
34f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehnamespace provider {
35f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehnamespace V2_4 {
36f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehnamespace implementation {
37f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
38f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehnamespace {
39f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehconst char *kLegacyProviderName = "legacy/0";
401903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yehconst char *kExternalProviderName = "external/0";
41f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh// "device@<version>/legacy/<id>"
42f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehconst std::regex kDeviceNameRE("device@([0-9]+\\.[0-9]+)/legacy/(.+)");
43f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehconst char *kHAL3_2 = "3.2";
4450fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvalaconst char *kHAL3_3 = "3.3";
45e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peevconst char *kHAL3_4 = "3.4";
46f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehconst char *kHAL1_0 = "1.0";
47f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehconst int kMaxCameraDeviceNameLen = 128;
48f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehconst int kMaxCameraIdLen = 16;
49f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
500b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampebool matchDeviceName(const hidl_string& deviceName, std::string* deviceVersion,
510b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe                     std::string* cameraId) {
520b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe    std::string deviceNameStd(deviceName.c_str());
530b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe    std::smatch sm;
540b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe    if (std::regex_match(deviceNameStd, sm, kDeviceNameRE)) {
550b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe        if (deviceVersion != nullptr) {
560b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe            *deviceVersion = sm[1];
570b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe        }
580b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe        if (cameraId != nullptr) {
590b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe            *cameraId = sm[2];
600b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe        }
610b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe        return true;
620b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe    }
630b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe    return false;
640b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe}
650b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe
66f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh} // anonymous namespace
67f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
68f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehusing ::android::hardware::camera::common::V1_0::CameraMetadataType;
69f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehusing ::android::hardware::camera::common::V1_0::Status;
70f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
717b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetskivoid CameraProvider::addDeviceNames(int camera_id, CameraDeviceStatus status, bool cam_new)
727b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski{
737b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski    char cameraId[kMaxCameraIdLen];
747b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski    snprintf(cameraId, sizeof(cameraId), "%d", camera_id);
757b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski    std::string cameraIdStr(cameraId);
767b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski
777b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski    mCameraIds.add(cameraIdStr);
787b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski
797b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski    // initialize mCameraDeviceNames and mOpenLegacySupported
807b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski    mOpenLegacySupported[cameraIdStr] = false;
817b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski    int deviceVersion = mModule->getDeviceVersion(camera_id);
827b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski    auto deviceNamePair = std::make_pair(cameraIdStr,
837b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski                                         getHidlDeviceName(cameraIdStr, deviceVersion));
847b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski    mCameraDeviceNames.add(deviceNamePair);
857b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski    if (cam_new) {
867b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski        mCallbacks->cameraDeviceStatusChange(deviceNamePair.second, status);
877b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski    }
887b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski    if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_2 &&
897b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski            mModule->isOpenLegacyDefined()) {
907b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski        // try open_legacy to see if it actually works
917b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski        struct hw_device_t* halDev = nullptr;
927b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski        int ret = mModule->openLegacy(cameraId, CAMERA_DEVICE_API_VERSION_1_0, &halDev);
937b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski        if (ret == 0) {
947b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski            mOpenLegacySupported[cameraIdStr] = true;
957b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski            halDev->close(halDev);
967b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski            deviceNamePair = std::make_pair(cameraIdStr,
977b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski                            getHidlDeviceName(cameraIdStr, CAMERA_DEVICE_API_VERSION_1_0));
987b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski            mCameraDeviceNames.add(deviceNamePair);
997b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski            if (cam_new) {
1007b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski                mCallbacks->cameraDeviceStatusChange(deviceNamePair.second, status);
1017b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski            }
1027b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski        } else if (ret == -EBUSY || ret == -EUSERS) {
1037b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski            // Looks like this provider instance is not initialized during
1047b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski            // system startup and there are other camera users already.
1057b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski            // Not a good sign but not fatal.
1067b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski            ALOGW("%s: open_legacy try failed!", __FUNCTION__);
1077b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski        }
1087b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski    }
1097b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski}
1107b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski
111eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetskivoid CameraProvider::removeDeviceNames(int camera_id)
112eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski{
113eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski    std::string cameraIdStr = std::to_string(camera_id);
114eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski
115eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski    mCameraIds.remove(cameraIdStr);
116eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski
117eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski    int deviceVersion = mModule->getDeviceVersion(camera_id);
118eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski    auto deviceNamePair = std::make_pair(cameraIdStr,
119eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski                                         getHidlDeviceName(cameraIdStr, deviceVersion));
120eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski    mCameraDeviceNames.remove(deviceNamePair);
121eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski    mCallbacks->cameraDeviceStatusChange(deviceNamePair.second, CameraDeviceStatus::NOT_PRESENT);
122eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski    if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_2 &&
123eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski        mModule->isOpenLegacyDefined() && mOpenLegacySupported[cameraIdStr]) {
124eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski
125eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski        deviceNamePair = std::make_pair(cameraIdStr,
126eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski                            getHidlDeviceName(cameraIdStr, CAMERA_DEVICE_API_VERSION_1_0));
127eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski        mCameraDeviceNames.remove(deviceNamePair);
128eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski        mCallbacks->cameraDeviceStatusChange(deviceNamePair.second,
129eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski                                             CameraDeviceStatus::NOT_PRESENT);
130eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski    }
131eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski
132eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski    mModule->removeCamera(camera_id);
133eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski}
134eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski
135f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh/**
136f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh * static callback forwarding methods from HAL to instance
137f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh */
138f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehvoid CameraProvider::sCameraDeviceStatusChange(
139f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        const struct camera_module_callbacks* callbacks,
140f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        int camera_id,
141f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        int new_status) {
1426dc9b53abebd02ca2bf6e2deb59a90c8520a30efYin-Chia Yeh    CameraProvider* cp = const_cast<CameraProvider*>(
143f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            static_cast<const CameraProvider*>(callbacks));
1447b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski    bool found = false;
145f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
146f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    if (cp == nullptr) {
147f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        ALOGE("%s: callback ops is null", __FUNCTION__);
148f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        return;
149f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
150f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
151f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    Mutex::Autolock _l(cp->mCbLock);
152f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    char cameraId[kMaxCameraIdLen];
153f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    snprintf(cameraId, sizeof(cameraId), "%d", camera_id);
154f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    std::string cameraIdStr(cameraId);
155f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    cp->mCameraStatusMap[cameraIdStr] = (camera_device_status_t) new_status;
156f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    if (cp->mCallbacks != nullptr) {
157f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        CameraDeviceStatus status = (CameraDeviceStatus) new_status;
158f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        for (auto const& deviceNamePair : cp->mCameraDeviceNames) {
159f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            if (cameraIdStr.compare(deviceNamePair.first) == 0) {
160f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh                cp->mCallbacks->cameraDeviceStatusChange(
161f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh                        deviceNamePair.second, status);
1627b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski                found = true;
163f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            }
164f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        }
1657b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski
166eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski        switch (status) {
167eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski        case CameraDeviceStatus::PRESENT:
168eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski        case CameraDeviceStatus::ENUMERATING:
169eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski            if (!found) {
170eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski                cp->addDeviceNames(camera_id, status, true);
171eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski            }
172eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski            break;
173eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski        case CameraDeviceStatus::NOT_PRESENT:
174eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski            if (found) {
175eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski                cp->removeDeviceNames(camera_id);
176eca1d45ba7f978a00e90dedc566578956a3d4dc9Guennadi Liakhovetski            }
1777b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski        }
178f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
179f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}
180f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
181f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehvoid CameraProvider::sTorchModeStatusChange(
182f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        const struct camera_module_callbacks* callbacks,
183f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        const char* camera_id,
184f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        int new_status) {
1856dc9b53abebd02ca2bf6e2deb59a90c8520a30efYin-Chia Yeh    CameraProvider* cp = const_cast<CameraProvider*>(
186f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            static_cast<const CameraProvider*>(callbacks));
187f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
188f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    if (cp == nullptr) {
189f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        ALOGE("%s: callback ops is null", __FUNCTION__);
190f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        return;
191f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
192f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
193f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    Mutex::Autolock _l(cp->mCbLock);
194f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    if (cp->mCallbacks != nullptr) {
195f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        std::string cameraIdStr(camera_id);
196f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        TorchModeStatus status = (TorchModeStatus) new_status;
197f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        for (auto const& deviceNamePair : cp->mCameraDeviceNames) {
1989c6dbd5979398ae62ef14a5b872474835f5fcaa3Yin-Chia Yeh            if (cameraIdStr.compare(deviceNamePair.first) == 0) {
199f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh                cp->mCallbacks->torchModeStatusChange(
200f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh                        deviceNamePair.second, status);
201f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            }
202f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        }
203f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
204f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}
205f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
206f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia YehStatus CameraProvider::getHidlStatus(int status) {
207f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    switch (status) {
208f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        case 0: return Status::OK;
209f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        case -ENODEV: return Status::INTERNAL_ERROR;
210f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        case -EINVAL: return Status::ILLEGAL_ARGUMENT;
211f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        default:
212f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            ALOGE("%s: unknown HAL status code %d", __FUNCTION__, status);
213f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            return Status::INTERNAL_ERROR;
214f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
215f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}
216f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
217f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehstd::string CameraProvider::getLegacyCameraId(const hidl_string& deviceName) {
2180b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe    std::string cameraId;
2190b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe    matchDeviceName(deviceName, nullptr, &cameraId);
2200b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe    return cameraId;
221f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}
222f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
223f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehint CameraProvider::getCameraDeviceVersion(const hidl_string& deviceName) {
2240b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe    std::string deviceVersion;
2250b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe    bool match = matchDeviceName(deviceName, &deviceVersion, nullptr);
226f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    if (!match) {
227f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        return -1;
228f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
22950fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala    if (deviceVersion == kHAL3_3) {
23050fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala        return CAMERA_DEVICE_API_VERSION_3_3;
23150fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala    } else if (deviceVersion == kHAL3_2) {
232f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        return CAMERA_DEVICE_API_VERSION_3_2;
2330b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe    } else if (deviceVersion == kHAL1_0) {
234f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        return CAMERA_DEVICE_API_VERSION_1_0;
235f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
236f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    return 0;
237f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}
238f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
239f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehstd::string CameraProvider::getHidlDeviceName(
240f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        std::string cameraId, int deviceVersion) {
241f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    // Maybe consider create a version check method and SortedVec to speed up?
242f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    if (deviceVersion != CAMERA_DEVICE_API_VERSION_1_0 &&
243f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            deviceVersion != CAMERA_DEVICE_API_VERSION_3_2 &&
244f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            deviceVersion != CAMERA_DEVICE_API_VERSION_3_3 &&
245e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev            deviceVersion != CAMERA_DEVICE_API_VERSION_3_4 &&
246e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev            deviceVersion != CAMERA_DEVICE_API_VERSION_3_5) {
247f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        return hidl_string("");
248f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
24950fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala    bool isV1 = deviceVersion == CAMERA_DEVICE_API_VERSION_1_0;
25050fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala    int versionMajor = isV1 ? 1 : 3;
25150fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala    int versionMinor = isV1 ? 0 : mPreferredHal3MinorVersion;
252e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev    if (deviceVersion == CAMERA_DEVICE_API_VERSION_3_5) {
253e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev        versionMinor = 4;
254e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev    }
255f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    char deviceName[kMaxCameraDeviceNameLen];
25650fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala    snprintf(deviceName, sizeof(deviceName), "device@%d.%d/legacy/%s",
25750fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            versionMajor, versionMinor, cameraId.c_str());
258f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    return deviceName;
259f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}
260f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
261f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia YehCameraProvider::CameraProvider() :
262f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        camera_module_callbacks_t({sCameraDeviceStatusChange,
263f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh                                   sTorchModeStatusChange}) {
264f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    mInitFailed = initialize();
265f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}
266f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
267f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia YehCameraProvider::~CameraProvider() {}
268f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
269f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehbool CameraProvider::initialize() {
270f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    camera_module_t *rawModule;
271f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    int err = hw_get_module(CAMERA_HARDWARE_MODULE_ID,
272f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            (const hw_module_t **)&rawModule);
273f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    if (err < 0) {
274f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        ALOGE("Could not load camera HAL module: %d (%s)", err, strerror(-err));
275f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        return true;
276f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
277f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
278f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    mModule = new CameraModule(rawModule);
279f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    err = mModule->init();
280f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    if (err != OK) {
281fca2e7420997f0738435420c5363d96001467af1Yin-Chia Yeh        ALOGE("Could not initialize camera HAL module: %d (%s)", err, strerror(-err));
282f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        mModule.clear();
283f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        return true;
284f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
285f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    ALOGI("Loaded \"%s\" camera module", mModule->getModuleName());
286f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
287efb7bfa9934a25ece6844aadbcb6df7a9aa5625aShuzhen Wang    // Setup vendor tags here so HAL can setup vendor keys in camera characteristics
288efb7bfa9934a25ece6844aadbcb6df7a9aa5625aShuzhen Wang    VendorTagDescriptor::clearGlobalVendorTagDescriptor();
289efb7bfa9934a25ece6844aadbcb6df7a9aa5625aShuzhen Wang    if (!setUpVendorTags()) {
290efb7bfa9934a25ece6844aadbcb6df7a9aa5625aShuzhen Wang        ALOGE("%s: Vendor tag setup failed, will not be available.", __FUNCTION__);
291efb7bfa9934a25ece6844aadbcb6df7a9aa5625aShuzhen Wang    }
292efb7bfa9934a25ece6844aadbcb6df7a9aa5625aShuzhen Wang
293fca2e7420997f0738435420c5363d96001467af1Yin-Chia Yeh    // Setup callback now because we are going to try openLegacy next
294fca2e7420997f0738435420c5363d96001467af1Yin-Chia Yeh    err = mModule->setCallbacks(this);
295fca2e7420997f0738435420c5363d96001467af1Yin-Chia Yeh    if (err != OK) {
296fca2e7420997f0738435420c5363d96001467af1Yin-Chia Yeh        ALOGE("Could not set camera module callback: %d (%s)", err, strerror(-err));
297fca2e7420997f0738435420c5363d96001467af1Yin-Chia Yeh        mModule.clear();
298fca2e7420997f0738435420c5363d96001467af1Yin-Chia Yeh        return true;
299fca2e7420997f0738435420c5363d96001467af1Yin-Chia Yeh    }
300fca2e7420997f0738435420c5363d96001467af1Yin-Chia Yeh
3010fb4577a35832653e009f1ba92a7b735e381c421Jaekyun Seok    mPreferredHal3MinorVersion =
3020fb4577a35832653e009f1ba92a7b735e381c421Jaekyun Seok        property_get_int32("ro.vendor.camera.wrapper.hal3TrebleMinorVersion", 3);
30350fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala    ALOGV("Preferred HAL 3 minor version is %d", mPreferredHal3MinorVersion);
30450fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala    switch(mPreferredHal3MinorVersion) {
30550fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala        case 2:
30650fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala        case 3:
30750fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            // OK
30850fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            break;
30950fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala        default:
31050fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            ALOGW("Unknown minor camera device HAL version %d in property "
311e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev                    "'camera.wrapper.hal3TrebleMinorVersion', defaulting to 3",
312e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev                    mPreferredHal3MinorVersion);
31350fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            mPreferredHal3MinorVersion = 3;
31450fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala    }
31550fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala
316f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    mNumberOfLegacyCameras = mModule->getNumberOfCameras();
317f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    for (int i = 0; i < mNumberOfLegacyCameras; i++) {
318c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev        struct camera_info info;
319c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev        auto rc = mModule->getCameraInfo(i, &info);
320c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev        if (rc != NO_ERROR) {
321c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev            ALOGE("%s: Camera info query failed!", __func__);
322c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev            mModule.clear();
323c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev            return true;
324c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev        }
325c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev
326c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev        if (checkCameraVersion(i, info) != OK) {
327c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev            ALOGE("%s: Camera version check failed!", __func__);
328c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev            mModule.clear();
329c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev            return true;
330c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev        }
331c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev
332f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        char cameraId[kMaxCameraIdLen];
333f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        snprintf(cameraId, sizeof(cameraId), "%d", i);
334f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        std::string cameraIdStr(cameraId);
335f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        mCameraStatusMap[cameraIdStr] = CAMERA_DEVICE_STATUS_PRESENT;
3367b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski
3377b7ede7ebde2698472276e2962a0f77c9d07f3e7Guennadi Liakhovetski        addDeviceNames(i);
338f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
339f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
3400f5eb837fe84053f4845e19157d81e0ce7da6372Eino-Ville Talvala    return false; // mInitFailed
341f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}
342f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
343c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev/**
344c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev * Check that the device HAL version is still in supported.
345c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev */
346c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peevint CameraProvider::checkCameraVersion(int id, camera_info info) {
347c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev    if (mModule == nullptr) {
348c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev        return NO_INIT;
349c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev    }
350c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev
351c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev    // device_version undefined in CAMERA_MODULE_API_VERSION_1_0,
352c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev    // All CAMERA_MODULE_API_VERSION_1_0 devices are backward-compatible
353c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev    if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_0) {
354c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev        // Verify the device version is in the supported range
355c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev        switch (info.device_version) {
356c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev            case CAMERA_DEVICE_API_VERSION_1_0:
357c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev            case CAMERA_DEVICE_API_VERSION_3_2:
358c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev            case CAMERA_DEVICE_API_VERSION_3_3:
359c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev            case CAMERA_DEVICE_API_VERSION_3_4:
360e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev            case CAMERA_DEVICE_API_VERSION_3_5:
361c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev                // in support
362c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev                break;
363c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev            case CAMERA_DEVICE_API_VERSION_2_0:
364c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev            case CAMERA_DEVICE_API_VERSION_2_1:
365c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev            case CAMERA_DEVICE_API_VERSION_3_0:
366c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev            case CAMERA_DEVICE_API_VERSION_3_1:
367c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev                // no longer supported
368c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev            default:
369c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev                ALOGE("%s: Device %d has HAL version %x, which is not supported",
370c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev                        __FUNCTION__, id, info.device_version);
371c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev                return NO_INIT;
372c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev        }
373c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev    }
374c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev
375c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev    return OK;
376c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev}
377c9ded518486e02ced10ebdf2491d11fc3680433dEmilian Peev
378f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yehbool CameraProvider::setUpVendorTags() {
379f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    ATRACE_CALL();
380f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    vendor_tag_ops_t vOps = vendor_tag_ops_t();
381f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
382f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    // Check if vendor operations have been implemented
383f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    if (!mModule->isVendorTagDefined()) {
384f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        ALOGI("%s: No vendor tags defined for this device.", __FUNCTION__);
3850f5eb837fe84053f4845e19157d81e0ce7da6372Eino-Ville Talvala        return true;
386f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
387f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
388f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    mModule->getVendorTagOps(&vOps);
389f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
390f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    // Ensure all vendor operations are present
391f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    if (vOps.get_tag_count == nullptr || vOps.get_all_tags == nullptr ||
392f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            vOps.get_section_name == nullptr || vOps.get_tag_name == nullptr ||
393f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            vOps.get_tag_type == nullptr) {
394f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        ALOGE("%s: Vendor tag operations not fully defined. Ignoring definitions."
395f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh               , __FUNCTION__);
396f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        return false;
397f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
398f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
399f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    // Read all vendor tag definitions into a descriptor
400f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    sp<VendorTagDescriptor> desc;
401f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    status_t res;
402f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    if ((res = VendorTagDescriptor::createDescriptorFromOps(&vOps, /*out*/desc))
403f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            != OK) {
404f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        ALOGE("%s: Could not generate descriptor from vendor tag operations,"
405f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh              "received error %s (%d). Camera clients will not be able to use"
406f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh              "vendor tags", __FUNCTION__, strerror(res), res);
407f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        return false;
408f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
409f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
410f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    // Set the global descriptor to use with camera metadata
411f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc);
412f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    const SortedVector<String8>* sectionNames = desc->getAllSectionNames();
413f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    size_t numSections = sectionNames->size();
414f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    std::vector<std::vector<VendorTag>> tagsBySection(numSections);
415f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    int tagCount = desc->getTagCount();
416f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    std::vector<uint32_t> tags(tagCount);
417f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    desc->getTagArray(tags.data());
418f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    for (int i = 0; i < tagCount; i++) {
419f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        VendorTag vt;
420f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        vt.tagId = tags[i];
421f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        vt.tagName = desc->getTagName(tags[i]);
422f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        vt.tagType = (CameraMetadataType) desc->getTagType(tags[i]);
423f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        ssize_t sectionIdx = desc->getSectionIndex(tags[i]);
424f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        tagsBySection[sectionIdx].push_back(vt);
425f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
426f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    mVendorTagSections.resize(numSections);
427f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    for (size_t s = 0; s < numSections; s++) {
428f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        mVendorTagSections[s].sectionName = (*sectionNames)[s].string();
429f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        mVendorTagSections[s].tags = tagsBySection[s];
430f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
431f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    return true;
432f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}
433f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
434f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh// Methods from ::android::hardware::camera::provider::V2_4::ICameraProvider follow.
435f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia YehReturn<Status> CameraProvider::setCallback(const sp<ICameraProviderCallback>& callback)  {
436fca2e7420997f0738435420c5363d96001467af1Yin-Chia Yeh    Mutex::Autolock _l(mCbLock);
437fca2e7420997f0738435420c5363d96001467af1Yin-Chia Yeh    mCallbacks = callback;
438fca2e7420997f0738435420c5363d96001467af1Yin-Chia Yeh    return Status::OK;
439f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}
440f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
441f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia YehReturn<void> CameraProvider::getVendorTags(getVendorTags_cb _hidl_cb)  {
442f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    _hidl_cb(Status::OK, mVendorTagSections);
443f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    return Void();
444f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}
445f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
446f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia YehReturn<void> CameraProvider::getCameraIdList(getCameraIdList_cb _hidl_cb)  {
447f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    std::vector<hidl_string> deviceNameList;
448f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    for (auto const& deviceNamePair : mCameraDeviceNames) {
449f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        if (mCameraStatusMap[deviceNamePair.first] == CAMERA_DEVICE_STATUS_PRESENT) {
450f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            deviceNameList.push_back(deviceNamePair.second);
451f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        }
452f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
453f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    hidl_vec<hidl_string> hidlDeviceNameList(deviceNameList);
4549c6dbd5979398ae62ef14a5b872474835f5fcaa3Yin-Chia Yeh    _hidl_cb(Status::OK, hidlDeviceNameList);
455f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    return Void();
456f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}
457f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
458f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia YehReturn<void> CameraProvider::isSetTorchModeSupported(isSetTorchModeSupported_cb _hidl_cb) {
459f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    bool support = mModule->isSetTorchModeSupported();
460f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    _hidl_cb (Status::OK, support);
461f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    return Void();
462f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}
463f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
4649c6dbd5979398ae62ef14a5b872474835f5fcaa3Yin-Chia YehReturn<void> CameraProvider::getCameraDeviceInterface_V1_x(
465248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        const hidl_string& cameraDeviceName, getCameraDeviceInterface_V1_x_cb _hidl_cb)  {
4660b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe    std::string cameraId, deviceVersion;
4670b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe    bool match = matchDeviceName(cameraDeviceName, &deviceVersion, &cameraId);
468248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh    if (!match) {
469248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);
470248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        return Void();
471248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh    }
472248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh
473248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh    std::string deviceName(cameraDeviceName.c_str());
474248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh    ssize_t index = mCameraDeviceNames.indexOf(std::make_pair(cameraId, deviceName));
475248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh    if (index == NAME_NOT_FOUND) { // Either an illegal name or a device version mismatch
476248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        Status status = Status::OK;
477248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        ssize_t idx = mCameraIds.indexOf(cameraId);
478248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        if (idx == NAME_NOT_FOUND) {
479248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh            ALOGE("%s: cannot find camera %s!", __FUNCTION__, cameraId.c_str());
480248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh            status = Status::ILLEGAL_ARGUMENT;
481248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        } else { // invalid version
482248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh            ALOGE("%s: camera device %s does not support version %s!",
483248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh                    __FUNCTION__, cameraId.c_str(), deviceVersion.c_str());
484248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh            status = Status::OPERATION_NOT_SUPPORTED;
485248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        }
486248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        _hidl_cb(status, nullptr);
487248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        return Void();
488248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh    }
489248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh
490248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh    if (mCameraStatusMap.count(cameraId) == 0 ||
491248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh            mCameraStatusMap[cameraId] != CAMERA_DEVICE_STATUS_PRESENT) {
492248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);
493248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        return Void();
494248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh    }
495248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh
496248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh    sp<android::hardware::camera::device::V1_0::implementation::CameraDevice> device =
497248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh            new android::hardware::camera::device::V1_0::implementation::CameraDevice(
498248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh                    mModule, cameraId, mCameraDeviceNames);
499248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh
500248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh    if (device == nullptr) {
501248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        ALOGE("%s: cannot allocate camera device for id %s", __FUNCTION__, cameraId.c_str());
502248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        _hidl_cb(Status::INTERNAL_ERROR, nullptr);
503248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        return Void();
504248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh    }
505248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh
506248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh    if (device->isInitFailed()) {
507248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        ALOGE("%s: camera device %s init failed!", __FUNCTION__, cameraId.c_str());
508248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        device = nullptr;
509248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        _hidl_cb(Status::INTERNAL_ERROR, nullptr);
510248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh        return Void();
511248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh    }
512248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh
513248ed700fed7e682eddf3d0607592eb5f3a3fb1aYin-Chia Yeh    _hidl_cb (Status::OK, device);
514f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    return Void();
515f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}
516f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
5179c6dbd5979398ae62ef14a5b872474835f5fcaa3Yin-Chia YehReturn<void> CameraProvider::getCameraDeviceInterface_V3_x(
5189c6dbd5979398ae62ef14a5b872474835f5fcaa3Yin-Chia Yeh        const hidl_string& cameraDeviceName, getCameraDeviceInterface_V3_x_cb _hidl_cb)  {
5190b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe    std::string cameraId, deviceVersion;
5200b171f1ff2a98b5d972c7a7cfa2dac250991b3a5Andreas Gampe    bool match = matchDeviceName(cameraDeviceName, &deviceVersion, &cameraId);
521f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    if (!match) {
522f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);
523f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        return Void();
524f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
525f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
526f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    std::string deviceName(cameraDeviceName.c_str());
527f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    ssize_t index = mCameraDeviceNames.indexOf(std::make_pair(cameraId, deviceName));
528f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    if (index == NAME_NOT_FOUND) { // Either an illegal name or a device version mismatch
529f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        Status status = Status::OK;
530f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        ssize_t idx = mCameraIds.indexOf(cameraId);
531f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        if (idx == NAME_NOT_FOUND) {
5329c6dbd5979398ae62ef14a5b872474835f5fcaa3Yin-Chia Yeh            ALOGE("%s: cannot find camera %s!", __FUNCTION__, cameraId.c_str());
533f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            status = Status::ILLEGAL_ARGUMENT;
534f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        } else { // invalid version
5359c6dbd5979398ae62ef14a5b872474835f5fcaa3Yin-Chia Yeh            ALOGE("%s: camera device %s does not support version %s!",
5369c6dbd5979398ae62ef14a5b872474835f5fcaa3Yin-Chia Yeh                    __FUNCTION__, cameraId.c_str(), deviceVersion.c_str());
537f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            status = Status::OPERATION_NOT_SUPPORTED;
538f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        }
539f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        _hidl_cb(status, nullptr);
540f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        return Void();
541f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
542f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
543f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    if (mCameraStatusMap.count(cameraId) == 0 ||
544f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh            mCameraStatusMap[cameraId] != CAMERA_DEVICE_STATUS_PRESENT) {
545f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);
546f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh        return Void();
547f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
548f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
549e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev    sp<android::hardware::camera::device::V3_2::ICameraDevice> device;
550e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev    if (deviceVersion == kHAL3_4) {
551e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev        ALOGV("Constructing v3.4 camera device");
552e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev        sp<android::hardware::camera::device::V3_2::implementation::CameraDevice> deviceImpl =
553e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev            new android::hardware::camera::device::V3_4::implementation::CameraDevice(
554e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev                    mModule, cameraId, mCameraDeviceNames);
555e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev        if (deviceImpl == nullptr || deviceImpl->isInitFailed()) {
556e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev            ALOGE("%s: camera device %s init failed!", __FUNCTION__, cameraId.c_str());
557e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev            device = nullptr;
558e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev            _hidl_cb(Status::INTERNAL_ERROR, nullptr);
559e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev            return Void();
560e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev        }
561e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev
562e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev        device = deviceImpl;
563e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev        _hidl_cb (Status::OK, device);
564e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev        return Void();
565e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev    }
566e18057b42f1698f33f34d14e86a53934bd337bb8Emilian Peev
56750fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala    // Since some Treble HAL revisions can map to the same legacy HAL version(s), we default
56850fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala    // to the newest possible Treble HAL revision, but allow for override if needed via
56950fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala    // system property.
57050fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala    switch (mPreferredHal3MinorVersion) {
57150fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala        case 2: { // Map legacy camera device v3 HAL to Treble camera device HAL v3.2
57250fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            ALOGV("Constructing v3.2 camera device");
57350fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            sp<android::hardware::camera::device::V3_2::implementation::CameraDevice> deviceImpl =
57450fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala                    new android::hardware::camera::device::V3_2::implementation::CameraDevice(
575f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh                    mModule, cameraId, mCameraDeviceNames);
57650fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            if (deviceImpl == nullptr || deviceImpl->isInitFailed()) {
57750fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala                ALOGE("%s: camera device %s init failed!", __FUNCTION__, cameraId.c_str());
57850fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala                device = nullptr;
57950fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala                _hidl_cb(Status::INTERNAL_ERROR, nullptr);
58050fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala                return Void();
58150fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            }
58250fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            device = deviceImpl;
58350fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            break;
58450fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala        }
58550fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala        case 3: { // Map legacy camera device v3 HAL to Treble camera device HAL v3.3
58650fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            ALOGV("Constructing v3.3 camera device");
58750fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            sp<android::hardware::camera::device::V3_2::implementation::CameraDevice> deviceImpl =
58850fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala                    new android::hardware::camera::device::V3_3::implementation::CameraDevice(
58950fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala                    mModule, cameraId, mCameraDeviceNames);
59050fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            if (deviceImpl == nullptr || deviceImpl->isInitFailed()) {
59150fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala                ALOGE("%s: camera device %s init failed!", __FUNCTION__, cameraId.c_str());
59250fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala                device = nullptr;
59350fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala                _hidl_cb(Status::INTERNAL_ERROR, nullptr);
59450fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala                return Void();
59550fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            }
59650fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            device = deviceImpl;
59750fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            break;
59850fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala        }
59950fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala        default:
60050fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            ALOGE("%s: Unknown HAL minor version %d!", __FUNCTION__, mPreferredHal3MinorVersion);
60150fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            device = nullptr;
60250fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            _hidl_cb(Status::INTERNAL_ERROR, nullptr);
60350fe43099495dcb388fdd7eb1ff78609aaa0cf88Eino-Ville Talvala            return Void();
604f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
605f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    _hidl_cb (Status::OK, device);
606f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    return Void();
607f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}
608f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
609f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia YehICameraProvider* HIDL_FETCH_ICameraProvider(const char* name) {
6101903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh    if (strcmp(name, kLegacyProviderName) == 0) {
6111903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh        CameraProvider* provider = new CameraProvider();
6121903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh        if (provider == nullptr) {
6131903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh            ALOGE("%s: cannot allocate camera provider!", __FUNCTION__);
6141903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh            return nullptr;
6151903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh        }
6161903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh        if (provider->isInitFailed()) {
6171903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh            ALOGE("%s: camera provider init failed!", __FUNCTION__);
6181903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh            delete provider;
6191903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh            return nullptr;
6201903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh        }
6211903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh        return provider;
6221903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh    } else if (strcmp(name, kExternalProviderName) == 0) {
6231903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh        ExternalCameraProvider* provider = new ExternalCameraProvider();
6241903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh        return provider;
625f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh    }
6261903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh    ALOGE("%s: unknown instance name: %s", __FUNCTION__, name);
6271903059507815cc89e9cf268f73d86b2bb3feef7Yin-Chia Yeh    return nullptr;
628f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}
629f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh
630f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh} // namespace implementation
631f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}  // namespace V2_4
632f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}  // namespace provider
633f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}  // namespace camera
634f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}  // namespace hardware
635f906b3bbbb9b0251e563e3de20d124c41ad238bbYin-Chia Yeh}  // namespace android
636