xref: /aosp_15_r20/hardware/interfaces/camera/device/3.2/default/CameraDevice.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "[email protected]"
18*4d7e907cSAndroid Build Coastguard Worker #include <log/log.h>
19*4d7e907cSAndroid Build Coastguard Worker 
20*4d7e907cSAndroid Build Coastguard Worker #include <utils/Vector.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <utils/Trace.h>
22*4d7e907cSAndroid Build Coastguard Worker #include "CameraDevice_3_2.h"
23*4d7e907cSAndroid Build Coastguard Worker #include <include/convert.h>
24*4d7e907cSAndroid Build Coastguard Worker 
25*4d7e907cSAndroid Build Coastguard Worker namespace android {
26*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
27*4d7e907cSAndroid Build Coastguard Worker namespace camera {
28*4d7e907cSAndroid Build Coastguard Worker namespace device {
29*4d7e907cSAndroid Build Coastguard Worker namespace V3_2 {
30*4d7e907cSAndroid Build Coastguard Worker namespace implementation {
31*4d7e907cSAndroid Build Coastguard Worker 
32*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::camera::common::V1_0::Status;
33*4d7e907cSAndroid Build Coastguard Worker 
CameraDevice(sp<CameraModule> module,const std::string & cameraId,const SortedVector<std::pair<std::string,std::string>> & cameraDeviceNames)34*4d7e907cSAndroid Build Coastguard Worker CameraDevice::CameraDevice(
35*4d7e907cSAndroid Build Coastguard Worker     sp<CameraModule> module, const std::string& cameraId,
36*4d7e907cSAndroid Build Coastguard Worker     const SortedVector<std::pair<std::string, std::string>>& cameraDeviceNames) :
37*4d7e907cSAndroid Build Coastguard Worker         mModule(module),
38*4d7e907cSAndroid Build Coastguard Worker         mCameraId(cameraId),
39*4d7e907cSAndroid Build Coastguard Worker         mDisconnected(false),
40*4d7e907cSAndroid Build Coastguard Worker         mCameraDeviceNames(cameraDeviceNames) {
41*4d7e907cSAndroid Build Coastguard Worker     mCameraIdInt = atoi(mCameraId.c_str());
42*4d7e907cSAndroid Build Coastguard Worker     // Should not reach here as provider also validate ID
43*4d7e907cSAndroid Build Coastguard Worker     if (mCameraIdInt < 0) {
44*4d7e907cSAndroid Build Coastguard Worker         ALOGE("%s: Invalid camera id: %s", __FUNCTION__, mCameraId.c_str());
45*4d7e907cSAndroid Build Coastguard Worker         mInitFail = true;
46*4d7e907cSAndroid Build Coastguard Worker     } else if (mCameraIdInt >= mModule->getNumberOfCameras()) {
47*4d7e907cSAndroid Build Coastguard Worker         ALOGI("%s: Adding a new camera id: %s", __FUNCTION__, mCameraId.c_str());
48*4d7e907cSAndroid Build Coastguard Worker     }
49*4d7e907cSAndroid Build Coastguard Worker 
50*4d7e907cSAndroid Build Coastguard Worker     mDeviceVersion = mModule->getDeviceVersion(mCameraIdInt);
51*4d7e907cSAndroid Build Coastguard Worker     if (mDeviceVersion < CAMERA_DEVICE_API_VERSION_3_2) {
52*4d7e907cSAndroid Build Coastguard Worker         ALOGE("%s: Camera id %s does not support HAL3.2+",
53*4d7e907cSAndroid Build Coastguard Worker                 __FUNCTION__, mCameraId.c_str());
54*4d7e907cSAndroid Build Coastguard Worker         mInitFail = true;
55*4d7e907cSAndroid Build Coastguard Worker     }
56*4d7e907cSAndroid Build Coastguard Worker }
57*4d7e907cSAndroid Build Coastguard Worker 
~CameraDevice()58*4d7e907cSAndroid Build Coastguard Worker CameraDevice::~CameraDevice() {}
59*4d7e907cSAndroid Build Coastguard Worker 
initStatus() const60*4d7e907cSAndroid Build Coastguard Worker Status CameraDevice::initStatus() const {
61*4d7e907cSAndroid Build Coastguard Worker     Mutex::Autolock _l(mLock);
62*4d7e907cSAndroid Build Coastguard Worker     Status status = Status::OK;
63*4d7e907cSAndroid Build Coastguard Worker     if (mInitFail) {
64*4d7e907cSAndroid Build Coastguard Worker         status = Status::INTERNAL_ERROR;
65*4d7e907cSAndroid Build Coastguard Worker     } else if (mDisconnected) {
66*4d7e907cSAndroid Build Coastguard Worker         status = Status::CAMERA_DISCONNECTED;
67*4d7e907cSAndroid Build Coastguard Worker     }
68*4d7e907cSAndroid Build Coastguard Worker     return status;
69*4d7e907cSAndroid Build Coastguard Worker }
70*4d7e907cSAndroid Build Coastguard Worker 
setConnectionStatus(bool connected)71*4d7e907cSAndroid Build Coastguard Worker void CameraDevice::setConnectionStatus(bool connected) {
72*4d7e907cSAndroid Build Coastguard Worker     Mutex::Autolock _l(mLock);
73*4d7e907cSAndroid Build Coastguard Worker     mDisconnected = !connected;
74*4d7e907cSAndroid Build Coastguard Worker     if (mSession == nullptr) {
75*4d7e907cSAndroid Build Coastguard Worker         return;
76*4d7e907cSAndroid Build Coastguard Worker     }
77*4d7e907cSAndroid Build Coastguard Worker     sp<CameraDeviceSession> session = mSession.promote();
78*4d7e907cSAndroid Build Coastguard Worker     if (session == nullptr) {
79*4d7e907cSAndroid Build Coastguard Worker         return;
80*4d7e907cSAndroid Build Coastguard Worker     }
81*4d7e907cSAndroid Build Coastguard Worker     // Only notify active session disconnect events.
82*4d7e907cSAndroid Build Coastguard Worker     // Users will need to re-open camera after disconnect event
83*4d7e907cSAndroid Build Coastguard Worker     if (!connected) {
84*4d7e907cSAndroid Build Coastguard Worker         session->disconnect();
85*4d7e907cSAndroid Build Coastguard Worker     }
86*4d7e907cSAndroid Build Coastguard Worker     return;
87*4d7e907cSAndroid Build Coastguard Worker }
88*4d7e907cSAndroid Build Coastguard Worker 
getHidlStatus(int status)89*4d7e907cSAndroid Build Coastguard Worker Status CameraDevice::getHidlStatus(int status) {
90*4d7e907cSAndroid Build Coastguard Worker     switch (status) {
91*4d7e907cSAndroid Build Coastguard Worker         case 0: return Status::OK;
92*4d7e907cSAndroid Build Coastguard Worker         case -ENOSYS: return Status::OPERATION_NOT_SUPPORTED;
93*4d7e907cSAndroid Build Coastguard Worker         case -EBUSY : return Status::CAMERA_IN_USE;
94*4d7e907cSAndroid Build Coastguard Worker         case -EUSERS: return Status::MAX_CAMERAS_IN_USE;
95*4d7e907cSAndroid Build Coastguard Worker         case -ENODEV: return Status::INTERNAL_ERROR;
96*4d7e907cSAndroid Build Coastguard Worker         case -EINVAL: return Status::ILLEGAL_ARGUMENT;
97*4d7e907cSAndroid Build Coastguard Worker         default:
98*4d7e907cSAndroid Build Coastguard Worker             ALOGE("%s: unknown HAL status code %d", __FUNCTION__, status);
99*4d7e907cSAndroid Build Coastguard Worker             return Status::INTERNAL_ERROR;
100*4d7e907cSAndroid Build Coastguard Worker     }
101*4d7e907cSAndroid Build Coastguard Worker }
102*4d7e907cSAndroid Build Coastguard Worker 
103*4d7e907cSAndroid Build Coastguard Worker // Methods from ::android::hardware::camera::device::V3_2::ICameraDevice follow.
getResourceCost(ICameraDevice::getResourceCost_cb _hidl_cb)104*4d7e907cSAndroid Build Coastguard Worker Return<void> CameraDevice::getResourceCost(ICameraDevice::getResourceCost_cb _hidl_cb)  {
105*4d7e907cSAndroid Build Coastguard Worker     Status status = initStatus();
106*4d7e907cSAndroid Build Coastguard Worker     CameraResourceCost resCost;
107*4d7e907cSAndroid Build Coastguard Worker     if (status == Status::OK) {
108*4d7e907cSAndroid Build Coastguard Worker         int cost = 100;
109*4d7e907cSAndroid Build Coastguard Worker         std::vector<std::string> conflicting_devices;
110*4d7e907cSAndroid Build Coastguard Worker         struct camera_info info;
111*4d7e907cSAndroid Build Coastguard Worker 
112*4d7e907cSAndroid Build Coastguard Worker         // If using post-2.4 module version, query the cost + conflicting devices from the HAL
113*4d7e907cSAndroid Build Coastguard Worker         if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_4) {
114*4d7e907cSAndroid Build Coastguard Worker             int ret = mModule->getCameraInfo(mCameraIdInt, &info);
115*4d7e907cSAndroid Build Coastguard Worker             if (ret == OK) {
116*4d7e907cSAndroid Build Coastguard Worker                 cost = info.resource_cost;
117*4d7e907cSAndroid Build Coastguard Worker                 for (size_t i = 0; i < info.conflicting_devices_length; i++) {
118*4d7e907cSAndroid Build Coastguard Worker                     std::string cameraId(info.conflicting_devices[i]);
119*4d7e907cSAndroid Build Coastguard Worker                     for (const auto& pair : mCameraDeviceNames) {
120*4d7e907cSAndroid Build Coastguard Worker                         if (cameraId == pair.first) {
121*4d7e907cSAndroid Build Coastguard Worker                             conflicting_devices.push_back(pair.second);
122*4d7e907cSAndroid Build Coastguard Worker                         }
123*4d7e907cSAndroid Build Coastguard Worker                     }
124*4d7e907cSAndroid Build Coastguard Worker                 }
125*4d7e907cSAndroid Build Coastguard Worker             } else {
126*4d7e907cSAndroid Build Coastguard Worker                 status = Status::INTERNAL_ERROR;
127*4d7e907cSAndroid Build Coastguard Worker             }
128*4d7e907cSAndroid Build Coastguard Worker         }
129*4d7e907cSAndroid Build Coastguard Worker 
130*4d7e907cSAndroid Build Coastguard Worker         if (status == Status::OK) {
131*4d7e907cSAndroid Build Coastguard Worker             resCost.resourceCost = cost;
132*4d7e907cSAndroid Build Coastguard Worker             resCost.conflictingDevices.resize(conflicting_devices.size());
133*4d7e907cSAndroid Build Coastguard Worker             for (size_t i = 0; i < conflicting_devices.size(); i++) {
134*4d7e907cSAndroid Build Coastguard Worker                 resCost.conflictingDevices[i] = conflicting_devices[i];
135*4d7e907cSAndroid Build Coastguard Worker                 ALOGV("CamDevice %s is conflicting with camDevice %s",
136*4d7e907cSAndroid Build Coastguard Worker                         mCameraId.c_str(), resCost.conflictingDevices[i].c_str());
137*4d7e907cSAndroid Build Coastguard Worker             }
138*4d7e907cSAndroid Build Coastguard Worker         }
139*4d7e907cSAndroid Build Coastguard Worker     }
140*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(status, resCost);
141*4d7e907cSAndroid Build Coastguard Worker     return Void();
142*4d7e907cSAndroid Build Coastguard Worker }
143*4d7e907cSAndroid Build Coastguard Worker 
getCameraCharacteristics(ICameraDevice::getCameraCharacteristics_cb _hidl_cb)144*4d7e907cSAndroid Build Coastguard Worker Return<void> CameraDevice::getCameraCharacteristics(
145*4d7e907cSAndroid Build Coastguard Worker         ICameraDevice::getCameraCharacteristics_cb _hidl_cb)  {
146*4d7e907cSAndroid Build Coastguard Worker     Status status = initStatus();
147*4d7e907cSAndroid Build Coastguard Worker     CameraMetadata cameraCharacteristics;
148*4d7e907cSAndroid Build Coastguard Worker     if (status == Status::OK) {
149*4d7e907cSAndroid Build Coastguard Worker         //Module 2.1+ codepath.
150*4d7e907cSAndroid Build Coastguard Worker         struct camera_info info;
151*4d7e907cSAndroid Build Coastguard Worker         int ret = mModule->getCameraInfo(mCameraIdInt, &info);
152*4d7e907cSAndroid Build Coastguard Worker         if (ret == OK) {
153*4d7e907cSAndroid Build Coastguard Worker             convertToHidl(info.static_camera_characteristics, &cameraCharacteristics);
154*4d7e907cSAndroid Build Coastguard Worker         } else {
155*4d7e907cSAndroid Build Coastguard Worker             ALOGE("%s: get camera info failed!", __FUNCTION__);
156*4d7e907cSAndroid Build Coastguard Worker             status = Status::INTERNAL_ERROR;
157*4d7e907cSAndroid Build Coastguard Worker         }
158*4d7e907cSAndroid Build Coastguard Worker     }
159*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(status, cameraCharacteristics);
160*4d7e907cSAndroid Build Coastguard Worker     return Void();
161*4d7e907cSAndroid Build Coastguard Worker }
162*4d7e907cSAndroid Build Coastguard Worker 
setTorchMode(TorchMode mode)163*4d7e907cSAndroid Build Coastguard Worker Return<Status> CameraDevice::setTorchMode(TorchMode mode)  {
164*4d7e907cSAndroid Build Coastguard Worker     if (!mModule->isSetTorchModeSupported()) {
165*4d7e907cSAndroid Build Coastguard Worker         return Status::METHOD_NOT_SUPPORTED;
166*4d7e907cSAndroid Build Coastguard Worker     }
167*4d7e907cSAndroid Build Coastguard Worker 
168*4d7e907cSAndroid Build Coastguard Worker     Status status = initStatus();
169*4d7e907cSAndroid Build Coastguard Worker     if (status == Status::OK) {
170*4d7e907cSAndroid Build Coastguard Worker         bool enable = (mode == TorchMode::ON) ? true : false;
171*4d7e907cSAndroid Build Coastguard Worker         status = getHidlStatus(mModule->setTorchMode(mCameraId.c_str(), enable));
172*4d7e907cSAndroid Build Coastguard Worker     }
173*4d7e907cSAndroid Build Coastguard Worker     return status;
174*4d7e907cSAndroid Build Coastguard Worker }
175*4d7e907cSAndroid Build Coastguard Worker 
open(const sp<ICameraDeviceCallback> & callback,ICameraDevice::open_cb _hidl_cb)176*4d7e907cSAndroid Build Coastguard Worker Return<void> CameraDevice::open(const sp<ICameraDeviceCallback>& callback,
177*4d7e907cSAndroid Build Coastguard Worker         ICameraDevice::open_cb _hidl_cb)  {
178*4d7e907cSAndroid Build Coastguard Worker     Status status = initStatus();
179*4d7e907cSAndroid Build Coastguard Worker     sp<CameraDeviceSession> session = nullptr;
180*4d7e907cSAndroid Build Coastguard Worker 
181*4d7e907cSAndroid Build Coastguard Worker     if (callback == nullptr) {
182*4d7e907cSAndroid Build Coastguard Worker         ALOGE("%s: cannot open camera %s. callback is null!",
183*4d7e907cSAndroid Build Coastguard Worker                 __FUNCTION__, mCameraId.c_str());
184*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);
185*4d7e907cSAndroid Build Coastguard Worker         return Void();
186*4d7e907cSAndroid Build Coastguard Worker     }
187*4d7e907cSAndroid Build Coastguard Worker 
188*4d7e907cSAndroid Build Coastguard Worker     if (status != Status::OK) {
189*4d7e907cSAndroid Build Coastguard Worker         // Provider will never pass initFailed device to client, so
190*4d7e907cSAndroid Build Coastguard Worker         // this must be a disconnected camera
191*4d7e907cSAndroid Build Coastguard Worker         ALOGE("%s: cannot open camera %s. camera is disconnected!",
192*4d7e907cSAndroid Build Coastguard Worker                 __FUNCTION__, mCameraId.c_str());
193*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(Status::CAMERA_DISCONNECTED, nullptr);
194*4d7e907cSAndroid Build Coastguard Worker         return Void();
195*4d7e907cSAndroid Build Coastguard Worker     } else {
196*4d7e907cSAndroid Build Coastguard Worker         mLock.lock();
197*4d7e907cSAndroid Build Coastguard Worker 
198*4d7e907cSAndroid Build Coastguard Worker         ALOGV("%s: Initializing device for camera %d", __FUNCTION__, mCameraIdInt);
199*4d7e907cSAndroid Build Coastguard Worker         session = mSession.promote();
200*4d7e907cSAndroid Build Coastguard Worker         if (session != nullptr && !session->isClosed()) {
201*4d7e907cSAndroid Build Coastguard Worker             ALOGE("%s: cannot open an already opened camera!", __FUNCTION__);
202*4d7e907cSAndroid Build Coastguard Worker             mLock.unlock();
203*4d7e907cSAndroid Build Coastguard Worker             _hidl_cb(Status::CAMERA_IN_USE, nullptr);
204*4d7e907cSAndroid Build Coastguard Worker             return Void();
205*4d7e907cSAndroid Build Coastguard Worker         }
206*4d7e907cSAndroid Build Coastguard Worker 
207*4d7e907cSAndroid Build Coastguard Worker         /** Open HAL device */
208*4d7e907cSAndroid Build Coastguard Worker         status_t res;
209*4d7e907cSAndroid Build Coastguard Worker         camera3_device_t *device;
210*4d7e907cSAndroid Build Coastguard Worker 
211*4d7e907cSAndroid Build Coastguard Worker         ATRACE_BEGIN("camera3->open");
212*4d7e907cSAndroid Build Coastguard Worker         res = mModule->open(mCameraId.c_str(),
213*4d7e907cSAndroid Build Coastguard Worker                 reinterpret_cast<hw_device_t**>(&device));
214*4d7e907cSAndroid Build Coastguard Worker         ATRACE_END();
215*4d7e907cSAndroid Build Coastguard Worker 
216*4d7e907cSAndroid Build Coastguard Worker         if (res != OK) {
217*4d7e907cSAndroid Build Coastguard Worker             ALOGE("%s: cannot open camera %s!", __FUNCTION__, mCameraId.c_str());
218*4d7e907cSAndroid Build Coastguard Worker             mLock.unlock();
219*4d7e907cSAndroid Build Coastguard Worker             _hidl_cb(getHidlStatus(res), nullptr);
220*4d7e907cSAndroid Build Coastguard Worker             return Void();
221*4d7e907cSAndroid Build Coastguard Worker         }
222*4d7e907cSAndroid Build Coastguard Worker 
223*4d7e907cSAndroid Build Coastguard Worker         /** Cross-check device version */
224*4d7e907cSAndroid Build Coastguard Worker         if (device->common.version < CAMERA_DEVICE_API_VERSION_3_2) {
225*4d7e907cSAndroid Build Coastguard Worker             ALOGE("%s: Could not open camera: "
226*4d7e907cSAndroid Build Coastguard Worker                     "Camera device should be at least %x, reports %x instead",
227*4d7e907cSAndroid Build Coastguard Worker                     __FUNCTION__,
228*4d7e907cSAndroid Build Coastguard Worker                     CAMERA_DEVICE_API_VERSION_3_2,
229*4d7e907cSAndroid Build Coastguard Worker                     device->common.version);
230*4d7e907cSAndroid Build Coastguard Worker             device->common.close(&device->common);
231*4d7e907cSAndroid Build Coastguard Worker             mLock.unlock();
232*4d7e907cSAndroid Build Coastguard Worker             _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);
233*4d7e907cSAndroid Build Coastguard Worker             return Void();
234*4d7e907cSAndroid Build Coastguard Worker         }
235*4d7e907cSAndroid Build Coastguard Worker 
236*4d7e907cSAndroid Build Coastguard Worker         struct camera_info info;
237*4d7e907cSAndroid Build Coastguard Worker         res = mModule->getCameraInfo(mCameraIdInt, &info);
238*4d7e907cSAndroid Build Coastguard Worker         if (res != OK) {
239*4d7e907cSAndroid Build Coastguard Worker             ALOGE("%s: Could not open camera: getCameraInfo failed", __FUNCTION__);
240*4d7e907cSAndroid Build Coastguard Worker             device->common.close(&device->common);
241*4d7e907cSAndroid Build Coastguard Worker             mLock.unlock();
242*4d7e907cSAndroid Build Coastguard Worker             _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);
243*4d7e907cSAndroid Build Coastguard Worker             return Void();
244*4d7e907cSAndroid Build Coastguard Worker         }
245*4d7e907cSAndroid Build Coastguard Worker 
246*4d7e907cSAndroid Build Coastguard Worker         session = createSession(
247*4d7e907cSAndroid Build Coastguard Worker                 device, info.static_camera_characteristics, callback);
248*4d7e907cSAndroid Build Coastguard Worker         if (session == nullptr) {
249*4d7e907cSAndroid Build Coastguard Worker             ALOGE("%s: camera device session allocation failed", __FUNCTION__);
250*4d7e907cSAndroid Build Coastguard Worker             mLock.unlock();
251*4d7e907cSAndroid Build Coastguard Worker             _hidl_cb(Status::INTERNAL_ERROR, nullptr);
252*4d7e907cSAndroid Build Coastguard Worker             return Void();
253*4d7e907cSAndroid Build Coastguard Worker         }
254*4d7e907cSAndroid Build Coastguard Worker         if (session->isInitFailed()) {
255*4d7e907cSAndroid Build Coastguard Worker             ALOGE("%s: camera device session init failed", __FUNCTION__);
256*4d7e907cSAndroid Build Coastguard Worker             session = nullptr;
257*4d7e907cSAndroid Build Coastguard Worker             mLock.unlock();
258*4d7e907cSAndroid Build Coastguard Worker             _hidl_cb(Status::INTERNAL_ERROR, nullptr);
259*4d7e907cSAndroid Build Coastguard Worker             return Void();
260*4d7e907cSAndroid Build Coastguard Worker         }
261*4d7e907cSAndroid Build Coastguard Worker         mSession = session;
262*4d7e907cSAndroid Build Coastguard Worker 
263*4d7e907cSAndroid Build Coastguard Worker         IF_ALOGV() {
264*4d7e907cSAndroid Build Coastguard Worker             session->getInterface()->interfaceChain([](
265*4d7e907cSAndroid Build Coastguard Worker                 ::android::hardware::hidl_vec<::android::hardware::hidl_string> interfaceChain) {
266*4d7e907cSAndroid Build Coastguard Worker                     ALOGV("Session interface chain:");
267*4d7e907cSAndroid Build Coastguard Worker                     for (const auto& iface : interfaceChain) {
268*4d7e907cSAndroid Build Coastguard Worker                         ALOGV("  %s", iface.c_str());
269*4d7e907cSAndroid Build Coastguard Worker                     }
270*4d7e907cSAndroid Build Coastguard Worker                 });
271*4d7e907cSAndroid Build Coastguard Worker         }
272*4d7e907cSAndroid Build Coastguard Worker         mLock.unlock();
273*4d7e907cSAndroid Build Coastguard Worker     }
274*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(status, session->getInterface());
275*4d7e907cSAndroid Build Coastguard Worker     return Void();
276*4d7e907cSAndroid Build Coastguard Worker }
277*4d7e907cSAndroid Build Coastguard Worker 
dumpState(const::android::hardware::hidl_handle & handle)278*4d7e907cSAndroid Build Coastguard Worker Return<void> CameraDevice::dumpState(const ::android::hardware::hidl_handle& handle)  {
279*4d7e907cSAndroid Build Coastguard Worker     Mutex::Autolock _l(mLock);
280*4d7e907cSAndroid Build Coastguard Worker     if (handle.getNativeHandle() == nullptr) {
281*4d7e907cSAndroid Build Coastguard Worker         ALOGE("%s: handle must not be null", __FUNCTION__);
282*4d7e907cSAndroid Build Coastguard Worker         return Void();
283*4d7e907cSAndroid Build Coastguard Worker     }
284*4d7e907cSAndroid Build Coastguard Worker     if (handle->numFds != 1 || handle->numInts != 0) {
285*4d7e907cSAndroid Build Coastguard Worker         ALOGE("%s: handle must contain 1 FD and 0 integers! Got %d FDs and %d ints",
286*4d7e907cSAndroid Build Coastguard Worker                 __FUNCTION__, handle->numFds, handle->numInts);
287*4d7e907cSAndroid Build Coastguard Worker         return Void();
288*4d7e907cSAndroid Build Coastguard Worker     }
289*4d7e907cSAndroid Build Coastguard Worker     int fd = handle->data[0];
290*4d7e907cSAndroid Build Coastguard Worker     if (mSession == nullptr) {
291*4d7e907cSAndroid Build Coastguard Worker         dprintf(fd, "No active camera device session instance\n");
292*4d7e907cSAndroid Build Coastguard Worker         return Void();
293*4d7e907cSAndroid Build Coastguard Worker     }
294*4d7e907cSAndroid Build Coastguard Worker     sp<CameraDeviceSession> session = mSession.promote();
295*4d7e907cSAndroid Build Coastguard Worker     if (session == nullptr) {
296*4d7e907cSAndroid Build Coastguard Worker         dprintf(fd, "No active camera device session instance\n");
297*4d7e907cSAndroid Build Coastguard Worker         return Void();
298*4d7e907cSAndroid Build Coastguard Worker     }
299*4d7e907cSAndroid Build Coastguard Worker     // Call into active session to dump states
300*4d7e907cSAndroid Build Coastguard Worker     session->dumpState(handle);
301*4d7e907cSAndroid Build Coastguard Worker     return Void();
302*4d7e907cSAndroid Build Coastguard Worker }
303*4d7e907cSAndroid Build Coastguard Worker 
createSession(camera3_device_t * device,const camera_metadata_t * deviceInfo,const sp<ICameraDeviceCallback> & callback)304*4d7e907cSAndroid Build Coastguard Worker sp<CameraDeviceSession> CameraDevice::createSession(camera3_device_t* device,
305*4d7e907cSAndroid Build Coastguard Worker         const camera_metadata_t* deviceInfo,
306*4d7e907cSAndroid Build Coastguard Worker         const sp<ICameraDeviceCallback>& callback) {
307*4d7e907cSAndroid Build Coastguard Worker     return new CameraDeviceSession(device, deviceInfo, callback);
308*4d7e907cSAndroid Build Coastguard Worker }
309*4d7e907cSAndroid Build Coastguard Worker 
310*4d7e907cSAndroid Build Coastguard Worker // End of methods from ::android::hardware::camera::device::V3_2::ICameraDevice.
311*4d7e907cSAndroid Build Coastguard Worker 
312*4d7e907cSAndroid Build Coastguard Worker } // namespace implementation
313*4d7e907cSAndroid Build Coastguard Worker }  // namespace V3_2
314*4d7e907cSAndroid Build Coastguard Worker }  // namespace device
315*4d7e907cSAndroid Build Coastguard Worker }  // namespace camera
316*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
317*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
318