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