diff options
Diffstat (limited to 'camera/provider/2.4/default/CameraProvider.cpp')
| -rw-r--r-- | camera/provider/2.4/default/CameraProvider.cpp | 61 |
1 files changed, 53 insertions, 8 deletions
diff --git a/camera/provider/2.4/default/CameraProvider.cpp b/camera/provider/2.4/default/CameraProvider.cpp index 5714f835b..ad9f0b862 100644 --- a/camera/provider/2.4/default/CameraProvider.cpp +++ b/camera/provider/2.4/default/CameraProvider.cpp @@ -18,7 +18,8 @@ #include <android/log.h> #include "CameraProvider.h" -#include "CameraDevice.h" +#include "CameraDevice_1_0.h" +#include "CameraDevice_3_2.h" #include <string.h> #include <utils/Trace.h> @@ -59,8 +60,6 @@ void CameraProvider::sCameraDeviceStatusChange( return; } - ALOGI("%s resolved provider %p", __FUNCTION__, cp); - Mutex::Autolock _l(cp->mCbLock); char cameraId[kMaxCameraIdLen]; snprintf(cameraId, sizeof(cameraId), "%d", camera_id); @@ -89,8 +88,6 @@ void CameraProvider::sTorchModeStatusChange( return; } - ALOGI("%s resolved provider %p", __FUNCTION__, cp); - Mutex::Autolock _l(cp->mCbLock); if (cp->mCallbacks != nullptr) { std::string cameraIdStr(camera_id); @@ -323,9 +320,57 @@ Return<void> CameraProvider::isSetTorchModeSupported(isSetTorchModeSupported_cb } Return<void> CameraProvider::getCameraDeviceInterface_V1_x( - const hidl_string& /*cameraDeviceName*/, getCameraDeviceInterface_V1_x_cb _hidl_cb) { - // TODO implement after device 1.0 is implemented - _hidl_cb(Status::INTERNAL_ERROR, nullptr); + const hidl_string& cameraDeviceName, getCameraDeviceInterface_V1_x_cb _hidl_cb) { + std::smatch sm; + bool match = matchDeviceName(cameraDeviceName, sm); + if (!match) { + _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr); + return Void(); + } + + std::string cameraId = sm[2]; + std::string deviceVersion = sm[1]; + std::string deviceName(cameraDeviceName.c_str()); + ssize_t index = mCameraDeviceNames.indexOf(std::make_pair(cameraId, deviceName)); + if (index == NAME_NOT_FOUND) { // Either an illegal name or a device version mismatch + Status status = Status::OK; + ssize_t idx = mCameraIds.indexOf(cameraId); + if (idx == NAME_NOT_FOUND) { + ALOGE("%s: cannot find camera %s!", __FUNCTION__, cameraId.c_str()); + status = Status::ILLEGAL_ARGUMENT; + } else { // invalid version + ALOGE("%s: camera device %s does not support version %s!", + __FUNCTION__, cameraId.c_str(), deviceVersion.c_str()); + status = Status::OPERATION_NOT_SUPPORTED; + } + _hidl_cb(status, nullptr); + return Void(); + } + + if (mCameraStatusMap.count(cameraId) == 0 || + mCameraStatusMap[cameraId] != CAMERA_DEVICE_STATUS_PRESENT) { + _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr); + return Void(); + } + + sp<android::hardware::camera::device::V1_0::implementation::CameraDevice> device = + new android::hardware::camera::device::V1_0::implementation::CameraDevice( + mModule, cameraId, mCameraDeviceNames); + + if (device == nullptr) { + ALOGE("%s: cannot allocate camera device for id %s", __FUNCTION__, cameraId.c_str()); + _hidl_cb(Status::INTERNAL_ERROR, nullptr); + return Void(); + } + + if (device->isInitFailed()) { + ALOGE("%s: camera device %s init failed!", __FUNCTION__, cameraId.c_str()); + device = nullptr; + _hidl_cb(Status::INTERNAL_ERROR, nullptr); + return Void(); + } + + _hidl_cb (Status::OK, device); return Void(); } |
