1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_HARDWARE_CAMERA_DEVICE_V3_2_CAMERADEVICE_H 18 #define ANDROID_HARDWARE_CAMERA_DEVICE_V3_2_CAMERADEVICE_H 19 20 #include "utils/Mutex.h" 21 #include "CameraModule.h" 22 #include "CameraMetadata.h" 23 #include "CameraDeviceSession.h" 24 25 #include <android/hardware/camera/device/3.2/ICameraDevice.h> 26 #include <hidl/Status.h> 27 #include <hidl/MQDescriptor.h> 28 29 namespace android { 30 namespace hardware { 31 namespace camera { 32 namespace device { 33 namespace V3_2 { 34 namespace implementation { 35 36 using ::android::hardware::camera::device::V3_2::RequestTemplate; 37 using ::android::hardware::camera::device::V3_2::ICameraDevice; 38 using ::android::hardware::camera::device::V3_2::ICameraDeviceCallback; 39 using ::android::hardware::camera::device::V3_2::ICameraDeviceSession; 40 using ::android::hardware::camera::common::V1_0::CameraResourceCost; 41 using ::android::hardware::camera::common::V1_0::Status; 42 using ::android::hardware::camera::common::V1_0::TorchMode; 43 using ::android::hardware::camera::common::V1_0::helper::CameraModule; 44 using ::android::hardware::Return; 45 using ::android::hardware::Void; 46 using ::android::hardware::hidl_vec; 47 using ::android::hardware::hidl_string; 48 using ::android::sp; 49 using ::android::Mutex; 50 51 /* 52 * The camera device HAL implementation is opened lazily (via the open call) 53 */ 54 struct CameraDevice : public ICameraDevice { 55 // Called by provider HAL. Provider HAL must ensure the uniqueness of 56 // CameraDevice object per cameraId, or there could be multiple CameraDevice 57 // trying to access the same physical camera. 58 // Also, provider will have to keep track of all CameraDevice objects in 59 // order to notify CameraDevice when the underlying camera is detached 60 CameraDevice(sp<CameraModule> module, 61 const std::string& cameraId, 62 const SortedVector<std::pair<std::string, std::string>>& cameraDeviceNames); 63 ~CameraDevice(); 64 // Caller must use this method to check if CameraDevice ctor failed 65 bool isInitFailed() { return mInitFail; } 66 // Used by provider HAL to signal external camera disconnected 67 void setConnectionStatus(bool connected); 68 69 /* Methods from ::android::hardware::camera::device::V3_2::ICameraDevice follow. */ 70 // The following method can be called without opening the actual camera device 71 Return<void> getResourceCost(getResourceCost_cb _hidl_cb) override; 72 Return<void> getCameraCharacteristics(getCameraCharacteristics_cb _hidl_cb) override; 73 Return<Status> setTorchMode(TorchMode mode) override; 74 75 // Open the device HAL and also return a default capture session 76 Return<void> open(const sp<ICameraDeviceCallback>& callback, open_cb _hidl_cb) override; 77 78 79 // Forward the dump call to the opened session, or do nothing 80 Return<void> dumpState(const ::android::hardware::hidl_handle& fd) override; 81 /* End of Methods from ::android::hardware::camera::device::V3_2::ICameraDevice */ 82 83 private: 84 const sp<CameraModule> mModule; 85 const std::string mCameraId; 86 // const after ctor 87 int mCameraIdInt; 88 int mDeviceVersion; 89 bool mInitFail = false; 90 // Set by provider (when external camera is connected/disconnected) 91 bool mDisconnected; 92 wp<CameraDeviceSession> mSession = nullptr; 93 94 const SortedVector<std::pair<std::string, std::string>>& mCameraDeviceNames; 95 96 // gating access to mSession and mDisconnected 97 mutable Mutex mLock; 98 99 // convert conventional HAL status to HIDL Status 100 static Status getHidlStatus(int); 101 102 Status initStatus() const; 103 }; 104 105 } // namespace implementation 106 } // namespace V3_2 107 } // namespace device 108 } // namespace camera 109 } // namespace hardware 110 } // namespace android 111 112 #endif // ANDROID_HARDWARE_CAMERA_DEVICE_V3_2_CAMERADEVICE_H 113