blob: 1dae0f91dca2fb76b45b635b72b607aa0d2600fa [file] [log] [blame]
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001/*
2 * Copyright (C) 2015 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//#define LOG_NDEBUG 0
18#define LOG_TAG "ACameraDevice"
19
Yin-Chia Yehead91462016-01-06 16:45:08 -080020#include <vector>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080021#include <inttypes.h>
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080022#include <android/hardware/ICameraService.h>
Yin-Chia Yehead91462016-01-06 16:45:08 -080023#include <gui/Surface.h>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080024#include "ACameraDevice.h"
25#include "ACameraMetadata.h"
26#include "ACaptureRequest.h"
Yin-Chia Yehead91462016-01-06 16:45:08 -080027#include "ACameraCaptureSession.h"
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080028
Jayant Chowdharya8488c92019-06-21 12:45:34 -070029ACameraDevice::~ACameraDevice() {
Jayant Chowdharya8bf1c62019-09-26 08:50:17 -070030 mDevice->stopLooperAndDisconnect();
Jayant Chowdharya8488c92019-06-21 12:45:34 -070031}
32
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080033namespace android {
Jayant Chowdhary6df26072018-11-06 23:55:12 -080034namespace acam {
35
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080036// Static member definitions
Yin-Chia Yehead91462016-01-06 16:45:08 -080037const char* CameraDevice::kContextKey = "Context";
38const char* CameraDevice::kDeviceKey = "Device";
39const char* CameraDevice::kErrorCodeKey = "ErrorCode";
40const char* CameraDevice::kCallbackFpKey = "Callback";
41const char* CameraDevice::kSessionSpKey = "SessionSp";
42const char* CameraDevice::kCaptureRequestKey = "CaptureRequest";
43const char* CameraDevice::kTimeStampKey = "TimeStamp";
44const char* CameraDevice::kCaptureResultKey = "CaptureResult";
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080045const char* CameraDevice::kPhysicalCaptureResultKey = "PhysicalCaptureResult";
Yin-Chia Yehead91462016-01-06 16:45:08 -080046const char* CameraDevice::kCaptureFailureKey = "CaptureFailure";
47const char* CameraDevice::kSequenceIdKey = "SequenceId";
48const char* CameraDevice::kFrameNumberKey = "FrameNumber";
Yin-Chia Yehe081c592016-03-29 18:26:44 -070049const char* CameraDevice::kAnwKey = "Anw";
Emilian Peevedec62d2019-03-19 17:59:24 -070050const char* CameraDevice::kFailingPhysicalCameraId= "FailingPhysicalCameraId";
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080051
52/**
53 * CameraDevice Implementation
54 */
55CameraDevice::CameraDevice(
56 const char* id,
57 ACameraDevice_StateCallbacks* cb,
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -070058 sp<ACameraMetadata> chars,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080059 ACameraDevice* wrapper) :
60 mCameraId(id),
61 mAppCallbacks(*cb),
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -070062 mChars(chars),
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080063 mServiceCallback(new ServiceCallback(this)),
64 mWrapper(wrapper),
65 mInError(false),
66 mError(ACAMERA_OK),
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -070067 mIdle(true),
68 mCurrentSession(nullptr) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080069 mClosing = false;
70 // Setup looper thread to perfrom device callbacks to app
71 mCbLooper = new ALooper;
72 mCbLooper->setName("C2N-dev-looper");
Eino-Ville Talvala02bf0322016-02-18 12:41:10 -080073 status_t err = mCbLooper->start(
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080074 /*runOnCallingThread*/false,
75 /*canCallJava*/ true,
Yin-Chia Yehead91462016-01-06 16:45:08 -080076 PRIORITY_DEFAULT);
Eino-Ville Talvala02bf0322016-02-18 12:41:10 -080077 if (err != OK) {
78 ALOGE("%s: Unable to start camera device callback looper: %s (%d)",
79 __FUNCTION__, strerror(-err), err);
80 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
81 }
Shuzhen Wang6c17e212019-02-19 14:51:47 -080082 mHandler = new CallbackHandler(id);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080083 mCbLooper->registerHandler(mHandler);
Yin-Chia Yehead91462016-01-06 16:45:08 -080084
Yin-Chia Yeh8aac03f2016-03-03 15:45:23 -080085 const CameraMetadata& metadata = mChars->getInternalData();
86 camera_metadata_ro_entry entry = metadata.find(ANDROID_REQUEST_PARTIAL_RESULT_COUNT);
Yin-Chia Yehead91462016-01-06 16:45:08 -080087 if (entry.count != 1) {
88 ALOGW("%s: bad count %zu for partial result count", __FUNCTION__, entry.count);
89 mPartialResultCount = 1;
90 } else {
91 mPartialResultCount = entry.data.i32[0];
92 }
93
94 entry = metadata.find(ANDROID_LENS_INFO_SHADING_MAP_SIZE);
95 if (entry.count != 2) {
96 ALOGW("%s: bad count %zu for shading map size", __FUNCTION__, entry.count);
97 mShadingMapSize[0] = 0;
98 mShadingMapSize[1] = 0;
99 } else {
100 mShadingMapSize[0] = entry.data.i32[0];
101 mShadingMapSize[1] = entry.data.i32[1];
102 }
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800103
104 size_t physicalIdCnt = 0;
105 const char*const* physicalCameraIds;
106 if (mChars->isLogicalMultiCamera(&physicalIdCnt, &physicalCameraIds)) {
107 for (size_t i = 0; i < physicalIdCnt; i++) {
108 mPhysicalIds.push_back(physicalCameraIds[i]);
109 }
110 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800111}
112
Jayant Chowdharya8bf1c62019-09-26 08:50:17 -0700113CameraDevice::~CameraDevice() { }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800114
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700115void
116CameraDevice::postSessionMsgAndCleanup(sp<AMessage>& msg) {
117 msg->post();
118 msg.clear();
119 sp<AMessage> cleanupMsg = new AMessage(kWhatCleanUpSessions, mHandler);
120 cleanupMsg->post();
121}
122
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800123// TODO: cached created request?
124camera_status_t
125CameraDevice::createCaptureRequest(
126 ACameraDevice_request_template templateId,
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800127 const ACameraIdList* physicalIdList,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800128 ACaptureRequest** request) const {
129 Mutex::Autolock _l(mDeviceLock);
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800130
131 if (physicalIdList != nullptr) {
132 if (physicalIdList->numCameras > static_cast<int>(mPhysicalIds.size())) {
133 ALOGE("%s: physicalIdList size %d exceeds number of available physical cameras %zu",
134 __FUNCTION__, physicalIdList->numCameras, mPhysicalIds.size());
135 return ACAMERA_ERROR_INVALID_PARAMETER;
136 }
137 for (auto i = 0; i < physicalIdList->numCameras; i++) {
138 if (physicalIdList->cameraIds[i] == nullptr) {
139 ALOGE("%s: physicalId is null!", __FUNCTION__);
140 return ACAMERA_ERROR_INVALID_PARAMETER;
141 }
142 if (mPhysicalIds.end() == std::find(
143 mPhysicalIds.begin(), mPhysicalIds.end(), physicalIdList->cameraIds[i])) {
144 ALOGE("%s: Invalid physicalId %s!", __FUNCTION__, physicalIdList->cameraIds[i]);
145 return ACAMERA_ERROR_INVALID_PARAMETER;
146 }
147 }
148 }
149
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800150 camera_status_t ret = checkCameraClosedOrErrorLocked();
151 if (ret != ACAMERA_OK) {
152 return ret;
153 }
154 if (mRemote == nullptr) {
155 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
156 }
157 CameraMetadata rawRequest;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800158 binder::Status remoteRet = mRemote->createDefaultRequest(templateId, &rawRequest);
159 if (remoteRet.serviceSpecificErrorCode() ==
160 hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800161 ALOGW("Create capture request failed! template %d is not supported on this device",
162 templateId);
Yin-Chia Yeha22528a2016-05-12 14:03:11 -0700163 return ACAMERA_ERROR_INVALID_PARAMETER;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800164 } else if (!remoteRet.isOk()) {
165 ALOGE("Create capture request failed: %s", remoteRet.toString8().string());
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800166 return ACAMERA_ERROR_UNKNOWN;
167 }
168 ACaptureRequest* outReq = new ACaptureRequest();
169 outReq->settings = new ACameraMetadata(rawRequest.release(), ACameraMetadata::ACM_REQUEST);
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800170 if (physicalIdList != nullptr) {
171 for (auto i = 0; i < physicalIdList->numCameras; i++) {
172 outReq->physicalSettings.emplace(physicalIdList->cameraIds[i],
173 new ACameraMetadata(*(outReq->settings)));
174 }
175 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800176 outReq->targets = new ACameraOutputTargets();
177 *request = outReq;
178 return ACAMERA_OK;
179}
180
Yin-Chia Yehead91462016-01-06 16:45:08 -0800181camera_status_t
182CameraDevice::createCaptureSession(
183 const ACaptureSessionOutputContainer* outputs,
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100184 const ACaptureRequest* sessionParameters,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800185 const ACameraCaptureSession_stateCallbacks* callbacks,
186 /*out*/ACameraCaptureSession** session) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700187 nsecs_t startTimeNs = systemTime();
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700188 sp<ACameraCaptureSession> currentSession = mCurrentSession.promote();
Yin-Chia Yehead91462016-01-06 16:45:08 -0800189 Mutex::Autolock _l(mDeviceLock);
190 camera_status_t ret = checkCameraClosedOrErrorLocked();
191 if (ret != ACAMERA_OK) {
192 return ret;
193 }
194
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700195 if (currentSession != nullptr) {
196 currentSession->closeByDevice();
Yin-Chia Yehead91462016-01-06 16:45:08 -0800197 stopRepeatingLocked();
198 }
199
200 // Create new session
Shuzhen Wang316781a2020-08-18 18:11:01 -0700201 ret = configureStreamsLocked(outputs, sessionParameters, startTimeNs);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800202 if (ret != ACAMERA_OK) {
203 ALOGE("Fail to create new session. cannot configure streams");
204 return ret;
205 }
206
207 ACameraCaptureSession* newSession = new ACameraCaptureSession(
208 mNextSessionId++, outputs, callbacks, this);
209
Yin-Chia Yehead91462016-01-06 16:45:08 -0800210 // set new session as current session
211 newSession->incStrong((void *) ACameraDevice_createCaptureSession);
212 mCurrentSession = newSession;
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700213 mFlushing = false;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800214 *session = newSession;
215 return ACAMERA_OK;
216}
217
Shuzhen Wang24810e72019-03-18 10:55:01 -0700218camera_status_t CameraDevice::isSessionConfigurationSupported(
219 const ACaptureSessionOutputContainer* sessionOutputContainer) const {
220 Mutex::Autolock _l(mDeviceLock);
221 camera_status_t ret = checkCameraClosedOrErrorLocked();
222 if (ret != ACAMERA_OK) {
223 return ret;
224 }
225
226 SessionConfiguration sessionConfiguration(0 /*inputWidth*/, 0 /*inputHeight*/,
227 -1 /*inputFormat*/, CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE);
228 for (const auto& output : sessionOutputContainer->mOutputs) {
229 sp<IGraphicBufferProducer> iGBP(nullptr);
230 ret = getIGBPfromAnw(output.mWindow, iGBP);
231 if (ret != ACAMERA_OK) {
232 ALOGE("Camera device %s failed to extract graphic producer from native window",
233 getId());
234 return ret;
235 }
236
237 String16 physicalId16(output.mPhysicalCameraId.c_str());
238 OutputConfiguration outConfig(iGBP, output.mRotation, physicalId16,
239 OutputConfiguration::INVALID_SET_ID, true);
240
241 for (auto& anw : output.mSharedWindows) {
242 ret = getIGBPfromAnw(anw, iGBP);
243 if (ret != ACAMERA_OK) {
244 ALOGE("Camera device %s failed to extract graphic producer from native window",
245 getId());
246 return ret;
247 }
248 outConfig.addGraphicProducer(iGBP);
249 }
250
251 sessionConfiguration.addOutputConfiguration(outConfig);
252 }
253
254 bool supported = false;
255 binder::Status remoteRet = mRemote->isSessionConfigurationSupported(
256 sessionConfiguration, &supported);
257 if (remoteRet.serviceSpecificErrorCode() ==
258 hardware::ICameraService::ERROR_INVALID_OPERATION) {
259 return ACAMERA_ERROR_UNSUPPORTED_OPERATION;
260 } else if (!remoteRet.isOk()) {
261 return ACAMERA_ERROR_UNKNOWN;
262 } else {
263 return supported ? ACAMERA_OK : ACAMERA_ERROR_STREAM_CONFIGURE_FAIL;
264 }
265}
266
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800267camera_status_t CameraDevice::updateOutputConfigurationLocked(ACaptureSessionOutput *output) {
Emilian Peev40ead602017-09-26 15:46:36 +0100268 camera_status_t ret = checkCameraClosedOrErrorLocked();
269 if (ret != ACAMERA_OK) {
270 return ret;
271 }
272
273 if (output == nullptr) {
274 return ACAMERA_ERROR_INVALID_PARAMETER;
275 }
276
277 if (!output->mIsShared) {
278 ALOGE("Error output configuration is not shared");
279 return ACAMERA_ERROR_INVALID_OPERATION;
280 }
281
282 int32_t streamId = -1;
283 for (auto& kvPair : mConfiguredOutputs) {
284 if (kvPair.second.first == output->mWindow) {
285 streamId = kvPair.first;
286 break;
287 }
288 }
289 if (streamId < 0) {
290 ALOGE("Error: Invalid output configuration");
291 return ACAMERA_ERROR_INVALID_PARAMETER;
292 }
293
294 sp<IGraphicBufferProducer> iGBP(nullptr);
295 ret = getIGBPfromAnw(output->mWindow, iGBP);
296 if (ret != ACAMERA_OK) {
297 ALOGE("Camera device %s failed to extract graphic producer from native window",
298 getId());
299 return ret;
300 }
301
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800302 String16 physicalId16(output->mPhysicalCameraId.c_str());
303 OutputConfiguration outConfig(iGBP, output->mRotation, physicalId16,
304 OutputConfiguration::INVALID_SET_ID, true);
Emilian Peev40ead602017-09-26 15:46:36 +0100305
306 for (auto& anw : output->mSharedWindows) {
307 ret = getIGBPfromAnw(anw, iGBP);
308 if (ret != ACAMERA_OK) {
309 ALOGE("Camera device %s failed to extract graphic producer from native window",
310 getId());
311 return ret;
312 }
313 outConfig.addGraphicProducer(iGBP);
314 }
315
316 auto remoteRet = mRemote->updateOutputConfiguration(streamId, outConfig);
317 if (!remoteRet.isOk()) {
318 switch (remoteRet.serviceSpecificErrorCode()) {
319 case hardware::ICameraService::ERROR_INVALID_OPERATION:
320 ALOGE("Camera device %s invalid operation: %s", getId(),
321 remoteRet.toString8().string());
322 return ACAMERA_ERROR_INVALID_OPERATION;
323 break;
324 case hardware::ICameraService::ERROR_ALREADY_EXISTS:
325 ALOGE("Camera device %s output surface already exists: %s", getId(),
326 remoteRet.toString8().string());
327 return ACAMERA_ERROR_INVALID_PARAMETER;
328 break;
329 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
330 ALOGE("Camera device %s invalid input argument: %s", getId(),
331 remoteRet.toString8().string());
332 return ACAMERA_ERROR_INVALID_PARAMETER;
333 break;
334 default:
335 ALOGE("Camera device %s failed to add shared output: %s", getId(),
336 remoteRet.toString8().string());
337 return ACAMERA_ERROR_UNKNOWN;
338 }
339 }
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800340 mConfiguredOutputs[streamId] = std::make_pair(output->mWindow, outConfig);
Emilian Peev40ead602017-09-26 15:46:36 +0100341
342 return ACAMERA_OK;
343}
344
Jayant Chowdhary09b368b2023-02-13 06:53:05 +0000345camera_status_t CameraDevice::prepareLocked(ACameraWindowType *window) {
346 camera_status_t ret = checkCameraClosedOrErrorLocked();
347 if (ret != ACAMERA_OK) {
348 return ret;
349 }
350
351 if (window == nullptr) {
352 return ACAMERA_ERROR_INVALID_PARAMETER;
353 }
354
355 int32_t streamId = -1;
356 for (auto& kvPair : mConfiguredOutputs) {
357 if (window == kvPair.second.first) {
358 streamId = kvPair.first;
359 break;
360 }
361 }
362 if (streamId < 0) {
363 ALOGE("Error: Invalid output configuration");
364 return ACAMERA_ERROR_INVALID_PARAMETER;
365 }
366 auto remoteRet = mRemote->prepare(streamId);
367 if (!remoteRet.isOk()) {
368 // TODO:(b/259735869) Do this check for all other binder calls in the
369 // ndk as well.
370 if (remoteRet.exceptionCode() != EX_SERVICE_SPECIFIC) {
371 ALOGE("Camera device %s failed to prepare output window %p: %s", getId(), window,
372 remoteRet.toString8().string());
373 return ACAMERA_ERROR_UNKNOWN;
374
375 }
376 switch (remoteRet.serviceSpecificErrorCode()) {
377 case hardware::ICameraService::ERROR_INVALID_OPERATION:
378 ALOGE("Camera device %s invalid operation: %s", getId(),
379 remoteRet.toString8().string());
380 return ACAMERA_ERROR_INVALID_OPERATION;
381 break;
382 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
383 ALOGE("Camera device %s invalid input argument: %s", getId(),
384 remoteRet.toString8().string());
385 return ACAMERA_ERROR_INVALID_PARAMETER;
386 break;
387 default:
388 ALOGE("Camera device %s failed to prepare output window %p: %s", getId(), window,
389 remoteRet.toString8().string());
390 return ACAMERA_ERROR_UNKNOWN;
391 }
392 }
393
394 return ACAMERA_OK;
395}
396
Yin-Chia Yehead91462016-01-06 16:45:08 -0800397camera_status_t
398CameraDevice::allocateCaptureRequest(
399 const ACaptureRequest* request, /*out*/sp<CaptureRequest>& outReq) {
400 camera_status_t ret;
401 sp<CaptureRequest> req(new CaptureRequest());
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800402 req->mPhysicalCameraSettings.push_back({getId(),
Emilian Peevaebbe412018-01-15 13:53:24 +0000403 request->settings->getInternalData()});
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800404 for (auto& entry : request->physicalSettings) {
405 req->mPhysicalCameraSettings.push_back({entry.first,
406 entry.second->getInternalData()});
407 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800408 req->mIsReprocess = false; // NDK does not support reprocessing yet
Yin-Chia Yehd39b9e32017-10-30 17:39:23 -0700409 req->mContext = request->context;
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800410 req->mSurfaceConverted = true; // set to true, and fill in stream/surface idx to speed up IPC
Yin-Chia Yehead91462016-01-06 16:45:08 -0800411
412 for (auto outputTarget : request->targets->mOutputs) {
413 ANativeWindow* anw = outputTarget.mWindow;
414 sp<Surface> surface;
415 ret = getSurfaceFromANativeWindow(anw, surface);
416 if (ret != ACAMERA_OK) {
417 ALOGE("Bad output target in capture request! ret %d", ret);
418 return ret;
419 }
420 req->mSurfaceList.push_back(surface);
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800421
422 bool found = false;
423 // lookup stream/surface ID
424 for (const auto& kvPair : mConfiguredOutputs) {
425 int streamId = kvPair.first;
426 const OutputConfiguration& outConfig = kvPair.second.second;
427 const auto& gbps = outConfig.getGraphicBufferProducers();
428 for (int surfaceId = 0; surfaceId < (int) gbps.size(); surfaceId++) {
429 if (gbps[surfaceId] == surface->getIGraphicBufferProducer()) {
430 found = true;
431 req->mStreamIdxList.push_back(streamId);
432 req->mSurfaceIdxList.push_back(surfaceId);
433 break;
434 }
435 }
436 if (found) {
437 break;
438 }
439 }
440 if (!found) {
441 ALOGE("Unconfigured output target %p in capture request!", anw);
442 return ret;
443 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800444 }
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800445
Yin-Chia Yehead91462016-01-06 16:45:08 -0800446 outReq = req;
447 return ACAMERA_OK;
448}
449
450ACaptureRequest*
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800451CameraDevice::allocateACaptureRequest(sp<CaptureRequest>& req, const std::string& deviceId) {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800452 ACaptureRequest* pRequest = new ACaptureRequest();
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800453 for (auto& entry : req->mPhysicalCameraSettings) {
454 CameraMetadata clone = entry.settings;
455 if (entry.id == deviceId) {
456 pRequest->settings = new ACameraMetadata(clone.release(), ACameraMetadata::ACM_REQUEST);
457 } else {
458 pRequest->physicalSettings.emplace(entry.id,
459 new ACameraMetadata(clone.release(), ACameraMetadata::ACM_REQUEST));
460 }
461 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800462 pRequest->targets = new ACameraOutputTargets();
463 for (size_t i = 0; i < req->mSurfaceList.size(); i++) {
464 ANativeWindow* anw = static_cast<ANativeWindow*>(req->mSurfaceList[i].get());
465 ACameraOutputTarget outputTarget(anw);
466 pRequest->targets->mOutputs.insert(outputTarget);
467 }
Yin-Chia Yehd39b9e32017-10-30 17:39:23 -0700468 pRequest->context = req->mContext;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800469 return pRequest;
470}
471
472void
473CameraDevice::freeACaptureRequest(ACaptureRequest* req) {
474 if (req == nullptr) {
475 return;
476 }
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -0700477 req->settings.clear();
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800478 req->physicalSettings.clear();
Yin-Chia Yehead91462016-01-06 16:45:08 -0800479 delete req->targets;
480 delete req;
481}
482
483void
484CameraDevice::notifySessionEndOfLifeLocked(ACameraCaptureSession* session) {
485 if (isClosed()) {
486 // Device is closing already. do nothing
487 return;
488 }
489
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700490 if (mCurrentSession != session) {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800491 // Session has been replaced by other seesion or device is closed
492 return;
493 }
494 mCurrentSession = nullptr;
495
496 // Should not happen
497 if (!session->mIsClosed) {
498 ALOGE("Error: unclosed session %p reaches end of life!", session);
499 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
500 return;
501 }
502
503 // No new session, unconfigure now
Shuzhen Wang316781a2020-08-18 18:11:01 -0700504 // Note: The unconfiguration of session won't be accounted for session
505 // latency because a stream configuration with 0 streams won't ever become
506 // active.
507 nsecs_t startTimeNs = systemTime();
508 camera_status_t ret = configureStreamsLocked(nullptr, nullptr, startTimeNs);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800509 if (ret != ACAMERA_OK) {
510 ALOGE("Unconfigure stream failed. Device might still be configured! ret %d", ret);
511 }
512}
513
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800514void
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700515CameraDevice::disconnectLocked(sp<ACameraCaptureSession>& session) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800516 if (mClosing.exchange(true)) {
517 // Already closing, just return
518 ALOGW("Camera device %s is already closing.", getId());
519 return;
520 }
521
522 if (mRemote != nullptr) {
523 mRemote->disconnect();
524 }
525 mRemote = nullptr;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800526
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700527 if (session != nullptr) {
528 session->closeByDevice();
Yin-Chia Yehead91462016-01-06 16:45:08 -0800529 }
530}
531
532camera_status_t
533CameraDevice::stopRepeatingLocked() {
534 camera_status_t ret = checkCameraClosedOrErrorLocked();
535 if (ret != ACAMERA_OK) {
536 ALOGE("Camera %s stop repeating failed! ret %d", getId(), ret);
537 return ret;
538 }
539 if (mRepeatingSequenceId != REQUEST_ID_NONE) {
540 int repeatingSequenceId = mRepeatingSequenceId;
541 mRepeatingSequenceId = REQUEST_ID_NONE;
542
543 int64_t lastFrameNumber;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800544 binder::Status remoteRet = mRemote->cancelRequest(repeatingSequenceId, &lastFrameNumber);
Chien-Yu Chene8c535e2016-04-14 12:18:26 -0700545 if (remoteRet.serviceSpecificErrorCode() ==
546 hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) {
547 ALOGV("Repeating request is already stopped.");
548 return ACAMERA_OK;
549 } else if (!remoteRet.isOk()) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800550 ALOGE("Stop repeating request fails in remote: %s", remoteRet.toString8().string());
Yin-Chia Yehead91462016-01-06 16:45:08 -0800551 return ACAMERA_ERROR_UNKNOWN;
552 }
553 checkRepeatingSequenceCompleteLocked(repeatingSequenceId, lastFrameNumber);
554 }
555 return ACAMERA_OK;
556}
557
558camera_status_t
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700559CameraDevice::flushLocked(ACameraCaptureSession* session) {
560 camera_status_t ret = checkCameraClosedOrErrorLocked();
561 if (ret != ACAMERA_OK) {
562 ALOGE("Camera %s abort captures failed! ret %d", getId(), ret);
563 return ret;
564 }
565
566 // This should never happen because creating a new session will close
567 // previous one and thus reject any API call from previous session.
568 // But still good to check here in case something unexpected happen.
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700569 if (mCurrentSession != session) {
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700570 ALOGE("Camera %s session %p is not current active session!", getId(), session);
571 return ACAMERA_ERROR_INVALID_OPERATION;
572 }
573
574 if (mFlushing) {
575 ALOGW("Camera %s is already aborting captures", getId());
576 return ACAMERA_OK;
577 }
578
579 mFlushing = true;
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700580
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700581 // Send onActive callback to guarantee there is always active->ready transition
582 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
583 msg->setPointer(kContextKey, session->mUserSessionCallback.context);
584 msg->setObject(kSessionSpKey, session);
585 msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onActive);
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700586 postSessionMsgAndCleanup(msg);
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700587
588 // If device is already idling, send callback and exit early
589 if (mIdle) {
590 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
591 msg->setPointer(kContextKey, session->mUserSessionCallback.context);
592 msg->setObject(kSessionSpKey, session);
593 msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onReady);
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700594 postSessionMsgAndCleanup(msg);
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700595 mFlushing = false;
596 return ACAMERA_OK;
597 }
598
599 int64_t lastFrameNumber;
600 binder::Status remoteRet = mRemote->flush(&lastFrameNumber);
601 if (!remoteRet.isOk()) {
602 ALOGE("Abort captures fails in remote: %s", remoteRet.toString8().string());
603 return ACAMERA_ERROR_UNKNOWN;
604 }
605 if (mRepeatingSequenceId != REQUEST_ID_NONE) {
606 checkRepeatingSequenceCompleteLocked(mRepeatingSequenceId, lastFrameNumber);
607 }
608 return ACAMERA_OK;
609}
610
611camera_status_t
Yin-Chia Yehead91462016-01-06 16:45:08 -0800612CameraDevice::waitUntilIdleLocked() {
613 camera_status_t ret = checkCameraClosedOrErrorLocked();
614 if (ret != ACAMERA_OK) {
615 ALOGE("Wait until camera %s idle failed! ret %d", getId(), ret);
616 return ret;
617 }
618
619 if (mRepeatingSequenceId != REQUEST_ID_NONE) {
620 ALOGE("Camera device %s won't go to idle when there is repeating request!", getId());
621 return ACAMERA_ERROR_INVALID_OPERATION;
622 }
623
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800624 binder::Status remoteRet = mRemote->waitUntilIdle();
625 if (!remoteRet.isOk()) {
626 ALOGE("Camera device %s waitUntilIdle failed: %s", getId(), remoteRet.toString8().string());
Yin-Chia Yehead91462016-01-06 16:45:08 -0800627 // TODO: define a function to convert status_t -> camera_status_t
628 return ACAMERA_ERROR_UNKNOWN;
629 }
630
631 return ACAMERA_OK;
632}
633
634camera_status_t
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700635CameraDevice::getIGBPfromAnw(
636 ANativeWindow* anw,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800637 sp<IGraphicBufferProducer>& out) {
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800638 sp<Surface> surface;
639 camera_status_t ret = getSurfaceFromANativeWindow(anw, surface);
640 if (ret != ACAMERA_OK) {
641 return ret;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800642 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800643 out = surface->getIGraphicBufferProducer();
644 return ACAMERA_OK;
645}
646
647camera_status_t
648CameraDevice::getSurfaceFromANativeWindow(
649 ANativeWindow* anw, sp<Surface>& out) {
650 if (anw == nullptr) {
651 ALOGE("Error: output ANativeWindow is null");
652 return ACAMERA_ERROR_INVALID_PARAMETER;
653 }
654 int value;
655 int err = (*anw->query)(anw, NATIVE_WINDOW_CONCRETE_TYPE, &value);
Eino-Ville Talvala02bf0322016-02-18 12:41:10 -0800656 if (err != OK || value != NATIVE_WINDOW_SURFACE) {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800657 ALOGE("Error: ANativeWindow is not backed by Surface!");
658 return ACAMERA_ERROR_INVALID_PARAMETER;
659 }
660 sp<Surface> surface(static_cast<Surface*>(anw));
661 out = surface;
662 return ACAMERA_OK;
663}
664
665camera_status_t
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100666CameraDevice::configureStreamsLocked(const ACaptureSessionOutputContainer* outputs,
Shuzhen Wang316781a2020-08-18 18:11:01 -0700667 const ACaptureRequest* sessionParameters, nsecs_t startTimeNs) {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800668 ACaptureSessionOutputContainer emptyOutput;
669 if (outputs == nullptr) {
670 outputs = &emptyOutput;
671 }
672
Yin-Chia Yehead91462016-01-06 16:45:08 -0800673 camera_status_t ret = checkCameraClosedOrErrorLocked();
674 if (ret != ACAMERA_OK) {
675 return ret;
676 }
677
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700678 std::set<std::pair<ANativeWindow*, OutputConfiguration>> outputSet;
Chih-Hung Hsieh3ef324d2018-12-11 11:48:12 -0800679 for (const auto& outConfig : outputs->mOutputs) {
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700680 ANativeWindow* anw = outConfig.mWindow;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800681 sp<IGraphicBufferProducer> iGBP(nullptr);
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700682 ret = getIGBPfromAnw(anw, iGBP);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800683 if (ret != ACAMERA_OK) {
684 return ret;
685 }
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800686 String16 physicalId16(outConfig.mPhysicalCameraId.c_str());
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700687 outputSet.insert(std::make_pair(
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800688 anw, OutputConfiguration(iGBP, outConfig.mRotation, physicalId16,
Emilian Peev40ead602017-09-26 15:46:36 +0100689 OutputConfiguration::INVALID_SET_ID, outConfig.mIsShared)));
Yin-Chia Yehead91462016-01-06 16:45:08 -0800690 }
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700691 auto addSet = outputSet;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800692 std::vector<int> deleteList;
693
694 // Determine which streams need to be created, which to be deleted
695 for (auto& kvPair : mConfiguredOutputs) {
696 int streamId = kvPair.first;
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700697 auto& outputPair = kvPair.second;
698 if (outputSet.count(outputPair) == 0) {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800699 deleteList.push_back(streamId); // Need to delete a no longer needed stream
700 } else {
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700701 addSet.erase(outputPair); // No need to add already existing stream
Yin-Chia Yehead91462016-01-06 16:45:08 -0800702 }
703 }
704
705 ret = stopRepeatingLocked();
706 if (ret != ACAMERA_OK) {
707 ALOGE("Camera device %s stop repeating failed, ret %d", getId(), ret);
708 return ret;
709 }
710
711 ret = waitUntilIdleLocked();
712 if (ret != ACAMERA_OK) {
713 ALOGE("Camera device %s wait until idle failed, ret %d", getId(), ret);
714 return ret;
715 }
716
717 // Send onReady to previous session
718 // CurrentSession will be updated after configureStreamLocked, so here
719 // mCurrentSession is the session to be replaced by a new session
720 if (!mIdle && mCurrentSession != nullptr) {
721 if (mBusySession != mCurrentSession) {
722 ALOGE("Current session != busy session");
723 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
724 return ACAMERA_ERROR_CAMERA_DEVICE;
725 }
726 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
727 msg->setPointer(kContextKey, mBusySession->mUserSessionCallback.context);
728 msg->setObject(kSessionSpKey, mBusySession);
729 msg->setPointer(kCallbackFpKey, (void*) mBusySession->mUserSessionCallback.onReady);
730 mBusySession.clear();
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700731 postSessionMsgAndCleanup(msg);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800732 }
733 mIdle = true;
734
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800735 binder::Status remoteRet = mRemote->beginConfigure();
736 if (!remoteRet.isOk()) {
737 ALOGE("Camera device %s begin configure failed: %s", getId(), remoteRet.toString8().string());
Yin-Chia Yehead91462016-01-06 16:45:08 -0800738 return ACAMERA_ERROR_UNKNOWN;
739 }
740
741 // delete to-be-deleted streams
742 for (auto streamId : deleteList) {
743 remoteRet = mRemote->deleteStream(streamId);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800744 if (!remoteRet.isOk()) {
745 ALOGE("Camera device %s failed to remove stream %d: %s", getId(), streamId,
746 remoteRet.toString8().string());
Yin-Chia Yehead91462016-01-06 16:45:08 -0800747 return ACAMERA_ERROR_UNKNOWN;
748 }
749 mConfiguredOutputs.erase(streamId);
750 }
751
752 // add new streams
Chih-Hung Hsieh3ef324d2018-12-11 11:48:12 -0800753 for (const auto& outputPair : addSet) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800754 int streamId;
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700755 remoteRet = mRemote->createStream(outputPair.second, &streamId);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800756 if (!remoteRet.isOk()) {
757 ALOGE("Camera device %s failed to create stream: %s", getId(),
758 remoteRet.toString8().string());
Yin-Chia Yehead91462016-01-06 16:45:08 -0800759 return ACAMERA_ERROR_UNKNOWN;
760 }
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700761 mConfiguredOutputs.insert(std::make_pair(streamId, outputPair));
Yin-Chia Yehead91462016-01-06 16:45:08 -0800762 }
763
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100764 CameraMetadata params;
765 if ((sessionParameters != nullptr) && (sessionParameters->settings != nullptr)) {
766 params.append(sessionParameters->settings->getInternalData());
767 }
Emilian Peevcc0b7952020-01-07 13:54:47 -0800768 std::vector<int> offlineStreamIds;
Shuzhen Wang316781a2020-08-18 18:11:01 -0700769 remoteRet = mRemote->endConfigure(/*isConstrainedHighSpeed*/ false, params,
770 ns2ms(startTimeNs), &offlineStreamIds);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800771 if (remoteRet.serviceSpecificErrorCode() == hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) {
772 ALOGE("Camera device %s cannnot support app output configuration: %s", getId(),
773 remoteRet.toString8().string());
Yin-Chia Yehead91462016-01-06 16:45:08 -0800774 return ACAMERA_ERROR_STREAM_CONFIGURE_FAIL;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800775 } else if (!remoteRet.isOk()) {
776 ALOGE("Camera device %s end configure failed: %s", getId(), remoteRet.toString8().string());
Yin-Chia Yehead91462016-01-06 16:45:08 -0800777 return ACAMERA_ERROR_UNKNOWN;
778 }
779
780 return ACAMERA_OK;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800781}
782
783void
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800784CameraDevice::setRemoteDevice(sp<hardware::camera2::ICameraDeviceUser> remote) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800785 Mutex::Autolock _l(mDeviceLock);
786 mRemote = remote;
787}
788
789camera_status_t
790CameraDevice::checkCameraClosedOrErrorLocked() const {
791 if (mRemote == nullptr) {
792 ALOGE("%s: camera device already closed", __FUNCTION__);
793 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
794 }
795 if (mInError) {// triggered by onDeviceError
796 ALOGE("%s: camera device has encountered a serious error", __FUNCTION__);
797 return mError;
798 }
799 return ACAMERA_OK;
800}
801
802void
Yin-Chia Yehead91462016-01-06 16:45:08 -0800803CameraDevice::setCameraDeviceErrorLocked(camera_status_t error) {
804 mInError = true;
805 mError = error;
806 return;
807}
808
809void
810CameraDevice::FrameNumberTracker::updateTracker(int64_t frameNumber, bool isError) {
811 ALOGV("updateTracker frame %" PRId64 " isError %d", frameNumber, isError);
812 if (isError) {
813 mFutureErrorSet.insert(frameNumber);
814 } else if (frameNumber <= mCompletedFrameNumber) {
815 ALOGE("Frame number %" PRId64 " decreased! current fn %" PRId64,
816 frameNumber, mCompletedFrameNumber);
817 return;
818 } else {
819 if (frameNumber != mCompletedFrameNumber + 1) {
820 ALOGE("Frame number out of order. Expect %" PRId64 " but get %" PRId64,
821 mCompletedFrameNumber + 1, frameNumber);
822 // Do not assert as in java implementation
823 }
824 mCompletedFrameNumber = frameNumber;
825 }
826 update();
827}
828
829void
830CameraDevice::FrameNumberTracker::update() {
831 for (auto it = mFutureErrorSet.begin(); it != mFutureErrorSet.end();) {
832 int64_t errorFrameNumber = *it;
833 if (errorFrameNumber == mCompletedFrameNumber + 1) {
834 mCompletedFrameNumber++;
835 it = mFutureErrorSet.erase(it);
836 } else if (errorFrameNumber <= mCompletedFrameNumber) {
837 // This should not happen, but deal with it anyway
838 ALOGE("Completd frame number passed through current frame number!");
839 // erase the old error since it's no longer useful
840 it = mFutureErrorSet.erase(it);
841 } else {
842 // Normal requests hasn't catched up error frames, just break
843 break;
844 }
845 }
846 ALOGV("Update complete frame %" PRId64, mCompletedFrameNumber);
847}
848
849void
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800850CameraDevice::onCaptureErrorLocked(
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800851 int32_t errorCode,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800852 const CaptureResultExtras& resultExtras) {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800853 int sequenceId = resultExtras.requestId;
854 int64_t frameNumber = resultExtras.frameNumber;
855 int32_t burstId = resultExtras.burstId;
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700856 auto it = mSequenceCallbackMap.find(sequenceId);
857 if (it == mSequenceCallbackMap.end()) {
858 ALOGE("%s: Error: capture sequence index %d not found!",
859 __FUNCTION__, sequenceId);
860 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800861 return;
862 }
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700863
864 CallbackHolder cbh = (*it).second;
865 sp<ACameraCaptureSession> session = cbh.mSession;
866 if ((size_t) burstId >= cbh.mRequests.size()) {
867 ALOGE("%s: Error: request index %d out of bound (size %zu)",
868 __FUNCTION__, burstId, cbh.mRequests.size());
869 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
870 return;
871 }
872 sp<CaptureRequest> request = cbh.mRequests[burstId];
873
874 // Handle buffer error
875 if (errorCode == hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER) {
876 int32_t streamId = resultExtras.errorStreamId;
877 ACameraCaptureSession_captureCallback_bufferLost onBufferLost =
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800878 cbh.mOnCaptureBufferLost;
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700879 auto outputPairIt = mConfiguredOutputs.find(streamId);
880 if (outputPairIt == mConfiguredOutputs.end()) {
881 ALOGE("%s: Error: stream id %d does not exist", __FUNCTION__, streamId);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800882 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
883 return;
884 }
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700885
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800886 const auto& gbps = outputPairIt->second.second.getGraphicBufferProducers();
887 for (const auto& outGbp : gbps) {
Chih-Hung Hsieh3ef324d2018-12-11 11:48:12 -0800888 for (const auto& surface : request->mSurfaceList) {
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800889 if (surface->getIGraphicBufferProducer() == outGbp) {
890 ANativeWindow* anw = static_cast<ANativeWindow*>(surface.get());
891 ALOGV("Camera %s Lost output buffer for ANW %p frame %" PRId64,
892 getId(), anw, frameNumber);
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700893
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800894 sp<AMessage> msg = new AMessage(kWhatCaptureBufferLost, mHandler);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800895 msg->setPointer(kContextKey, cbh.mContext);
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800896 msg->setObject(kSessionSpKey, session);
897 msg->setPointer(kCallbackFpKey, (void*) onBufferLost);
898 msg->setObject(kCaptureRequestKey, request);
899 msg->setPointer(kAnwKey, (void*) anw);
900 msg->setInt64(kFrameNumberKey, frameNumber);
901 postSessionMsgAndCleanup(msg);
902 }
903 }
904 }
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700905 } else { // Handle other capture failures
906 // Fire capture failure callback if there is one registered
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800907 ACameraCaptureSession_captureCallback_failed onError = cbh.mOnCaptureFailed;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800908 sp<CameraCaptureFailure> failure(new CameraCaptureFailure());
909 failure->frameNumber = frameNumber;
910 // TODO: refine this when implementing flush
911 failure->reason = CAPTURE_FAILURE_REASON_ERROR;
912 failure->sequenceId = sequenceId;
913 failure->wasImageCaptured = (errorCode ==
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800914 hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800915
Emilian Peevedec62d2019-03-19 17:59:24 -0700916 sp<AMessage> msg = new AMessage(cbh.mIsLogicalCameraCallback ? kWhatLogicalCaptureFail :
917 kWhatCaptureFail, mHandler);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800918 msg->setPointer(kContextKey, cbh.mContext);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800919 msg->setObject(kSessionSpKey, session);
Emilian Peevedec62d2019-03-19 17:59:24 -0700920 if (cbh.mIsLogicalCameraCallback) {
921 if (resultExtras.errorPhysicalCameraId.size() > 0) {
922 String8 cameraId(resultExtras.errorPhysicalCameraId);
923 msg->setString(kFailingPhysicalCameraId, cameraId.string(), cameraId.size());
924 }
925 msg->setPointer(kCallbackFpKey, (void*) cbh.mOnLogicalCameraCaptureFailed);
926 } else {
927 msg->setPointer(kCallbackFpKey, (void*) onError);
928 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800929 msg->setObject(kCaptureRequestKey, request);
930 msg->setObject(kCaptureFailureKey, failure);
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700931 postSessionMsgAndCleanup(msg);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800932
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700933 // Update tracker
934 mFrameNumberTracker.updateTracker(frameNumber, /*isError*/true);
935 checkAndFireSequenceCompleteLocked();
936 }
937 return;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800938}
939
Jayant Chowdharya8bf1c62019-09-26 08:50:17 -0700940void CameraDevice::stopLooperAndDisconnect() {
Jayant Chowdharya8488c92019-06-21 12:45:34 -0700941 Mutex::Autolock _l(mDeviceLock);
Jayant Chowdharya8bf1c62019-09-26 08:50:17 -0700942 sp<ACameraCaptureSession> session = mCurrentSession.promote();
943 if (!isClosed()) {
944 disconnectLocked(session);
945 }
946 mCurrentSession = nullptr;
947
Jayant Chowdharya8488c92019-06-21 12:45:34 -0700948 if (mCbLooper != nullptr) {
949 mCbLooper->unregisterHandler(mHandler->id());
950 mCbLooper->stop();
951 }
952 mCbLooper.clear();
953 mHandler.clear();
954}
955
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800956CameraDevice::CallbackHandler::CallbackHandler(const char* id) : mId(id) {
957}
958
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800959void CameraDevice::CallbackHandler::onMessageReceived(
960 const sp<AMessage> &msg) {
961 switch (msg->what()) {
962 case kWhatOnDisconnected:
963 case kWhatOnError:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800964 case kWhatSessionStateCb:
965 case kWhatCaptureStart:
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +0000966 case kWhatCaptureStart2:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800967 case kWhatCaptureResult:
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800968 case kWhatLogicalCaptureResult:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800969 case kWhatCaptureFail:
Emilian Peevedec62d2019-03-19 17:59:24 -0700970 case kWhatLogicalCaptureFail:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800971 case kWhatCaptureSeqEnd:
972 case kWhatCaptureSeqAbort:
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700973 case kWhatCaptureBufferLost:
Jayant Chowdhary09b368b2023-02-13 06:53:05 +0000974 case kWhatPreparedCb:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800975 ALOGV("%s: Received msg %d", __FUNCTION__, msg->what());
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800976 break;
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700977 case kWhatCleanUpSessions:
978 mCachedSessions.clear();
979 return;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800980 default:
981 ALOGE("%s:Error: unknown device callback %d", __FUNCTION__, msg->what());
982 return;
983 }
984 // Check the common part of all message
985 void* context;
986 bool found = msg->findPointer(kContextKey, &context);
987 if (!found) {
988 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
989 return;
990 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800991 switch (msg->what()) {
992 case kWhatOnDisconnected:
993 {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800994 ACameraDevice* dev;
995 found = msg->findPointer(kDeviceKey, (void**) &dev);
996 if (!found || dev == nullptr) {
997 ALOGE("%s: Cannot find device pointer!", __FUNCTION__);
998 return;
999 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001000 ACameraDevice_StateCallback onDisconnected;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001001 found = msg->findPointer(kCallbackFpKey, (void**) &onDisconnected);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001002 if (!found) {
1003 ALOGE("%s: Cannot find onDisconnected!", __FUNCTION__);
1004 return;
1005 }
Yin-Chia Yehead91462016-01-06 16:45:08 -08001006 if (onDisconnected == nullptr) {
1007 return;
1008 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001009 (*onDisconnected)(context, dev);
1010 break;
1011 }
1012 case kWhatOnError:
1013 {
Yin-Chia Yehead91462016-01-06 16:45:08 -08001014 ACameraDevice* dev;
1015 found = msg->findPointer(kDeviceKey, (void**) &dev);
1016 if (!found || dev == nullptr) {
1017 ALOGE("%s: Cannot find device pointer!", __FUNCTION__);
1018 return;
1019 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001020 ACameraDevice_ErrorStateCallback onError;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001021 found = msg->findPointer(kCallbackFpKey, (void**) &onError);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001022 if (!found) {
1023 ALOGE("%s: Cannot find onError!", __FUNCTION__);
1024 return;
1025 }
1026 int errorCode;
1027 found = msg->findInt32(kErrorCodeKey, &errorCode);
1028 if (!found) {
1029 ALOGE("%s: Cannot find error code!", __FUNCTION__);
1030 return;
1031 }
Yin-Chia Yehead91462016-01-06 16:45:08 -08001032 if (onError == nullptr) {
1033 return;
1034 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001035 (*onError)(context, dev, errorCode);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001036 break;
1037 }
1038 case kWhatSessionStateCb:
1039 case kWhatCaptureStart:
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001040 case kWhatCaptureStart2:
Yin-Chia Yehead91462016-01-06 16:45:08 -08001041 case kWhatCaptureResult:
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001042 case kWhatLogicalCaptureResult:
Yin-Chia Yehead91462016-01-06 16:45:08 -08001043 case kWhatCaptureFail:
Emilian Peevedec62d2019-03-19 17:59:24 -07001044 case kWhatLogicalCaptureFail:
Yin-Chia Yehead91462016-01-06 16:45:08 -08001045 case kWhatCaptureSeqEnd:
1046 case kWhatCaptureSeqAbort:
Yin-Chia Yehe081c592016-03-29 18:26:44 -07001047 case kWhatCaptureBufferLost:
Jayant Chowdhary09b368b2023-02-13 06:53:05 +00001048 case kWhatPreparedCb:
Yin-Chia Yehead91462016-01-06 16:45:08 -08001049 {
1050 sp<RefBase> obj;
1051 found = msg->findObject(kSessionSpKey, &obj);
1052 if (!found || obj == nullptr) {
1053 ALOGE("%s: Cannot find session pointer!", __FUNCTION__);
1054 return;
1055 }
1056 sp<ACameraCaptureSession> session(static_cast<ACameraCaptureSession*>(obj.get()));
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001057 mCachedSessions.push(session);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001058 sp<CaptureRequest> requestSp = nullptr;
1059 switch (msg->what()) {
1060 case kWhatCaptureStart:
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001061 case kWhatCaptureStart2:
Yin-Chia Yehead91462016-01-06 16:45:08 -08001062 case kWhatCaptureResult:
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001063 case kWhatLogicalCaptureResult:
Yin-Chia Yehead91462016-01-06 16:45:08 -08001064 case kWhatCaptureFail:
Emilian Peevedec62d2019-03-19 17:59:24 -07001065 case kWhatLogicalCaptureFail:
Yin-Chia Yehe081c592016-03-29 18:26:44 -07001066 case kWhatCaptureBufferLost:
Yin-Chia Yehead91462016-01-06 16:45:08 -08001067 found = msg->findObject(kCaptureRequestKey, &obj);
1068 if (!found) {
1069 ALOGE("%s: Cannot find capture request!", __FUNCTION__);
1070 return;
1071 }
1072 requestSp = static_cast<CaptureRequest*>(obj.get());
1073 break;
1074 }
1075
1076 switch (msg->what()) {
1077 case kWhatSessionStateCb:
1078 {
1079 ACameraCaptureSession_stateCallback onState;
1080 found = msg->findPointer(kCallbackFpKey, (void**) &onState);
1081 if (!found) {
1082 ALOGE("%s: Cannot find state callback!", __FUNCTION__);
1083 return;
1084 }
1085 if (onState == nullptr) {
1086 return;
1087 }
1088 (*onState)(context, session.get());
1089 break;
1090 }
Jayant Chowdhary09b368b2023-02-13 06:53:05 +00001091 case kWhatPreparedCb:
1092 {
1093 ACameraCaptureSession_prepareCallback onWindowPrepared;
1094 found = msg->findPointer(kCallbackFpKey, (void**) &onWindowPrepared);
1095 if (!found) {
Jayant Chowdhary0f2cb992023-02-17 18:25:53 +00001096 ALOGE("%s: Cannot find window prepared callback!", __FUNCTION__);
Jayant Chowdhary09b368b2023-02-13 06:53:05 +00001097 return;
1098 }
1099 if (onWindowPrepared == nullptr) {
1100 return;
1101 }
1102 ACameraWindowType* anw;
1103 found = msg->findPointer(kAnwKey, (void**) &anw);
1104 if (!found) {
1105 ALOGE("%s: Cannot find ANativeWindow: %d!", __FUNCTION__, __LINE__);
1106 return;
1107 }
1108 (*onWindowPrepared)(context, anw, session.get());
1109 break;
1110 }
Yin-Chia Yehead91462016-01-06 16:45:08 -08001111 case kWhatCaptureStart:
1112 {
1113 ACameraCaptureSession_captureCallback_start onStart;
1114 found = msg->findPointer(kCallbackFpKey, (void**) &onStart);
1115 if (!found) {
1116 ALOGE("%s: Cannot find capture start callback!", __FUNCTION__);
1117 return;
1118 }
1119 if (onStart == nullptr) {
1120 return;
1121 }
1122 int64_t timestamp;
1123 found = msg->findInt64(kTimeStampKey, &timestamp);
1124 if (!found) {
1125 ALOGE("%s: Cannot find timestamp!", __FUNCTION__);
1126 return;
1127 }
Shuzhen Wang6c17e212019-02-19 14:51:47 -08001128 ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001129 (*onStart)(context, session.get(), request, timestamp);
1130 freeACaptureRequest(request);
1131 break;
1132 }
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001133 case kWhatCaptureStart2:
1134 {
1135 ACameraCaptureSession_captureCallback_startV2 onStart2;
1136 found = msg->findPointer(kCallbackFpKey, (void**) &onStart2);
1137 if (!found) {
1138 ALOGE("%s: Cannot find capture startV2 callback!", __FUNCTION__);
1139 return;
1140 }
1141 if (onStart2 == nullptr) {
1142 return;
1143 }
1144 int64_t timestamp;
1145 found = msg->findInt64(kTimeStampKey, &timestamp);
1146 if (!found) {
1147 ALOGE("%s: Cannot find timestamp!", __FUNCTION__);
1148 return;
1149 }
1150 int64_t frameNumber;
1151 found = msg->findInt64(kFrameNumberKey, &frameNumber);
1152 if (!found) {
1153 ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1154 return;
1155 }
1156
1157 ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
1158 (*onStart2)(context, session.get(), request, timestamp, frameNumber);
1159 freeACaptureRequest(request);
1160 break;
1161 }
Yin-Chia Yehead91462016-01-06 16:45:08 -08001162 case kWhatCaptureResult:
1163 {
1164 ACameraCaptureSession_captureCallback_result onResult;
1165 found = msg->findPointer(kCallbackFpKey, (void**) &onResult);
1166 if (!found) {
1167 ALOGE("%s: Cannot find capture result callback!", __FUNCTION__);
1168 return;
1169 }
1170 if (onResult == nullptr) {
1171 return;
1172 }
1173
1174 found = msg->findObject(kCaptureResultKey, &obj);
1175 if (!found) {
1176 ALOGE("%s: Cannot find capture result!", __FUNCTION__);
1177 return;
1178 }
1179 sp<ACameraMetadata> result(static_cast<ACameraMetadata*>(obj.get()));
Shuzhen Wang6c17e212019-02-19 14:51:47 -08001180 ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001181 (*onResult)(context, session.get(), request, result.get());
1182 freeACaptureRequest(request);
1183 break;
1184 }
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001185 case kWhatLogicalCaptureResult:
1186 {
1187 ACameraCaptureSession_logicalCamera_captureCallback_result onResult;
1188 found = msg->findPointer(kCallbackFpKey, (void**) &onResult);
1189 if (!found) {
1190 ALOGE("%s: Cannot find logicalCamera capture result callback!",
1191 __FUNCTION__);
1192 return;
1193 }
1194 if (onResult == nullptr) {
1195 return;
1196 }
1197
1198 found = msg->findObject(kCaptureResultKey, &obj);
1199 if (!found) {
1200 ALOGE("%s: Cannot find capture result!", __FUNCTION__);
1201 return;
1202 }
1203 sp<ACameraMetadata> result(static_cast<ACameraMetadata*>(obj.get()));
1204
1205 found = msg->findObject(kPhysicalCaptureResultKey, &obj);
1206 if (!found) {
1207 ALOGE("%s: Cannot find physical capture result!", __FUNCTION__);
1208 return;
1209 }
1210 sp<ACameraPhysicalCaptureResultInfo> physicalResult(
1211 static_cast<ACameraPhysicalCaptureResultInfo*>(obj.get()));
1212 std::vector<PhysicalCaptureResultInfo>& physicalResultInfo =
1213 physicalResult->mPhysicalResultInfo;
1214
1215 std::vector<std::string> physicalCameraIds;
1216 std::vector<sp<ACameraMetadata>> physicalMetadataCopy;
1217 for (size_t i = 0; i < physicalResultInfo.size(); i++) {
1218 String8 physicalId8(physicalResultInfo[i].mPhysicalCameraId);
1219 physicalCameraIds.push_back(physicalId8.c_str());
1220
1221 CameraMetadata clone = physicalResultInfo[i].mPhysicalCameraMetadata;
1222 clone.update(ANDROID_SYNC_FRAME_NUMBER,
1223 &physicalResult->mFrameNumber, /*data_count*/1);
1224 sp<ACameraMetadata> metadata =
1225 new ACameraMetadata(clone.release(), ACameraMetadata::ACM_RESULT);
1226 physicalMetadataCopy.push_back(metadata);
1227 }
1228
1229 std::vector<const char*> physicalCameraIdPtrs;
1230 std::vector<const ACameraMetadata*> physicalMetadataCopyPtrs;
1231 for (size_t i = 0; i < physicalResultInfo.size(); i++) {
1232 physicalCameraIdPtrs.push_back(physicalCameraIds[i].c_str());
1233 physicalMetadataCopyPtrs.push_back(physicalMetadataCopy[i].get());
1234 }
1235
Shuzhen Wang6c17e212019-02-19 14:51:47 -08001236 ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001237 (*onResult)(context, session.get(), request, result.get(),
1238 physicalResultInfo.size(), physicalCameraIdPtrs.data(),
1239 physicalMetadataCopyPtrs.data());
1240 freeACaptureRequest(request);
1241 break;
1242 }
Yin-Chia Yehead91462016-01-06 16:45:08 -08001243 case kWhatCaptureFail:
1244 {
1245 ACameraCaptureSession_captureCallback_failed onFail;
1246 found = msg->findPointer(kCallbackFpKey, (void**) &onFail);
1247 if (!found) {
1248 ALOGE("%s: Cannot find capture fail callback!", __FUNCTION__);
1249 return;
1250 }
1251 if (onFail == nullptr) {
1252 return;
1253 }
1254
1255 found = msg->findObject(kCaptureFailureKey, &obj);
1256 if (!found) {
1257 ALOGE("%s: Cannot find capture failure!", __FUNCTION__);
1258 return;
1259 }
1260 sp<CameraCaptureFailure> failureSp(
1261 static_cast<CameraCaptureFailure*>(obj.get()));
1262 ACameraCaptureFailure* failure =
1263 static_cast<ACameraCaptureFailure*>(failureSp.get());
Shuzhen Wang6c17e212019-02-19 14:51:47 -08001264 ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001265 (*onFail)(context, session.get(), request, failure);
1266 freeACaptureRequest(request);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001267 break;
1268 }
Emilian Peevedec62d2019-03-19 17:59:24 -07001269 case kWhatLogicalCaptureFail:
1270 {
1271 ACameraCaptureSession_logicalCamera_captureCallback_failed onFail;
1272 found = msg->findPointer(kCallbackFpKey, (void**) &onFail);
1273 if (!found) {
1274 ALOGE("%s: Cannot find capture fail callback!", __FUNCTION__);
1275 return;
1276 }
1277 if (onFail == nullptr) {
1278 return;
1279 }
1280
1281 found = msg->findObject(kCaptureFailureKey, &obj);
1282 if (!found) {
1283 ALOGE("%s: Cannot find capture failure!", __FUNCTION__);
1284 return;
1285 }
1286 sp<CameraCaptureFailure> failureSp(
1287 static_cast<CameraCaptureFailure*>(obj.get()));
1288 ALogicalCameraCaptureFailure failure;
1289 AString physicalCameraId;
1290 found = msg->findString(kFailingPhysicalCameraId, &physicalCameraId);
1291 if (found && !physicalCameraId.empty()) {
1292 failure.physicalCameraId = physicalCameraId.c_str();
1293 } else {
1294 failure.physicalCameraId = nullptr;
1295 }
1296 failure.captureFailure = *failureSp;
1297 ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
1298 (*onFail)(context, session.get(), request, &failure);
1299 freeACaptureRequest(request);
1300 break;
1301 }
Yin-Chia Yehead91462016-01-06 16:45:08 -08001302 case kWhatCaptureSeqEnd:
1303 {
1304 ACameraCaptureSession_captureCallback_sequenceEnd onSeqEnd;
1305 found = msg->findPointer(kCallbackFpKey, (void**) &onSeqEnd);
1306 if (!found) {
1307 ALOGE("%s: Cannot find sequence end callback!", __FUNCTION__);
1308 return;
1309 }
1310 if (onSeqEnd == nullptr) {
1311 return;
1312 }
1313 int seqId;
1314 found = msg->findInt32(kSequenceIdKey, &seqId);
1315 if (!found) {
1316 ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1317 return;
1318 }
1319 int64_t frameNumber;
1320 found = msg->findInt64(kFrameNumberKey, &frameNumber);
1321 if (!found) {
1322 ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1323 return;
1324 }
1325 (*onSeqEnd)(context, session.get(), seqId, frameNumber);
1326 break;
1327 }
1328 case kWhatCaptureSeqAbort:
1329 {
1330 ACameraCaptureSession_captureCallback_sequenceAbort onSeqAbort;
1331 found = msg->findPointer(kCallbackFpKey, (void**) &onSeqAbort);
1332 if (!found) {
1333 ALOGE("%s: Cannot find sequence end callback!", __FUNCTION__);
1334 return;
1335 }
1336 if (onSeqAbort == nullptr) {
1337 return;
1338 }
1339 int seqId;
1340 found = msg->findInt32(kSequenceIdKey, &seqId);
1341 if (!found) {
1342 ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1343 return;
1344 }
1345 (*onSeqAbort)(context, session.get(), seqId);
1346 break;
1347 }
Yin-Chia Yehe081c592016-03-29 18:26:44 -07001348 case kWhatCaptureBufferLost:
1349 {
1350 ACameraCaptureSession_captureCallback_bufferLost onBufferLost;
1351 found = msg->findPointer(kCallbackFpKey, (void**) &onBufferLost);
1352 if (!found) {
1353 ALOGE("%s: Cannot find buffer lost callback!", __FUNCTION__);
1354 return;
1355 }
1356 if (onBufferLost == nullptr) {
1357 return;
1358 }
1359
1360 ANativeWindow* anw;
1361 found = msg->findPointer(kAnwKey, (void**) &anw);
1362 if (!found) {
1363 ALOGE("%s: Cannot find ANativeWindow!", __FUNCTION__);
1364 return;
1365 }
1366
1367 int64_t frameNumber;
1368 found = msg->findInt64(kFrameNumberKey, &frameNumber);
1369 if (!found) {
1370 ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1371 return;
1372 }
1373
Shuzhen Wang6c17e212019-02-19 14:51:47 -08001374 ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
Yin-Chia Yehe081c592016-03-29 18:26:44 -07001375 (*onBufferLost)(context, session.get(), request, anw, frameNumber);
1376 freeACaptureRequest(request);
1377 break;
1378 }
Yin-Chia Yehead91462016-01-06 16:45:08 -08001379 }
1380 break;
1381 }
1382 }
1383}
1384
1385CameraDevice::CallbackHolder::CallbackHolder(
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001386 sp<ACameraCaptureSession> session,
1387 const Vector<sp<CaptureRequest> >& requests,
1388 bool isRepeating,
1389 ACameraCaptureSession_captureCallbacks* cbs) :
1390 mSession(session), mRequests(requests),
1391 mIsRepeating(isRepeating),
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001392 mIsLogicalCameraCallback(false),
1393 mIs2Callback(false) {
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001394 initCaptureCallbacks(cbs);
1395
1396 if (cbs != nullptr) {
1397 mOnCaptureCompleted = cbs->onCaptureCompleted;
Emilian Peevedec62d2019-03-19 17:59:24 -07001398 mOnCaptureFailed = cbs->onCaptureFailed;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001399 }
1400}
1401
1402CameraDevice::CallbackHolder::CallbackHolder(
1403 sp<ACameraCaptureSession> session,
1404 const Vector<sp<CaptureRequest> >& requests,
1405 bool isRepeating,
1406 ACameraCaptureSession_logicalCamera_captureCallbacks* lcbs) :
1407 mSession(session), mRequests(requests),
1408 mIsRepeating(isRepeating),
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001409 mIsLogicalCameraCallback(true),
1410 mIs2Callback(false) {
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001411 initCaptureCallbacks(lcbs);
1412
1413 if (lcbs != nullptr) {
1414 mOnLogicalCameraCaptureCompleted = lcbs->onLogicalCameraCaptureCompleted;
Emilian Peevedec62d2019-03-19 17:59:24 -07001415 mOnLogicalCameraCaptureFailed = lcbs->onLogicalCameraCaptureFailed;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001416 }
1417}
Yin-Chia Yehead91462016-01-06 16:45:08 -08001418
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001419CameraDevice::CallbackHolder::CallbackHolder(
1420 sp<ACameraCaptureSession> session,
1421 const Vector<sp<CaptureRequest> >& requests,
1422 bool isRepeating,
1423 ACameraCaptureSession_captureCallbacksV2* cbs) :
1424 mSession(session), mRequests(requests),
1425 mIsRepeating(isRepeating),
1426 mIsLogicalCameraCallback(false),
1427 mIs2Callback(true) {
1428 initCaptureCallbacksV2(cbs);
1429
1430 if (cbs != nullptr) {
1431 mOnCaptureCompleted = cbs->onCaptureCompleted;
1432 mOnCaptureFailed = cbs->onCaptureFailed;
1433 }
1434}
1435
1436CameraDevice::CallbackHolder::CallbackHolder(
1437 sp<ACameraCaptureSession> session,
1438 const Vector<sp<CaptureRequest> >& requests,
1439 bool isRepeating,
1440 ACameraCaptureSession_logicalCamera_captureCallbacksV2* lcbs) :
1441 mSession(session), mRequests(requests),
1442 mIsRepeating(isRepeating),
1443 mIsLogicalCameraCallback(true),
1444 mIs2Callback(true) {
1445 initCaptureCallbacksV2(lcbs);
1446
1447 if (lcbs != nullptr) {
1448 mOnLogicalCameraCaptureCompleted = lcbs->onLogicalCameraCaptureCompleted;
1449 mOnLogicalCameraCaptureFailed = lcbs->onLogicalCameraCaptureFailed;
1450 }
1451}
1452
Yin-Chia Yehead91462016-01-06 16:45:08 -08001453void
1454CameraDevice::checkRepeatingSequenceCompleteLocked(
1455 const int sequenceId, const int64_t lastFrameNumber) {
1456 ALOGV("Repeating seqId %d lastFrameNumer %" PRId64, sequenceId, lastFrameNumber);
1457 if (lastFrameNumber == NO_FRAMES_CAPTURED) {
1458 if (mSequenceCallbackMap.count(sequenceId) == 0) {
1459 ALOGW("No callback found for sequenceId %d", sequenceId);
1460 return;
1461 }
1462 // remove callback holder from callback map
1463 auto cbIt = mSequenceCallbackMap.find(sequenceId);
1464 CallbackHolder cbh = cbIt->second;
1465 mSequenceCallbackMap.erase(cbIt);
1466 // send seq aborted callback
1467 sp<AMessage> msg = new AMessage(kWhatCaptureSeqAbort, mHandler);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001468 msg->setPointer(kContextKey, cbh.mContext);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001469 msg->setObject(kSessionSpKey, cbh.mSession);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001470 msg->setPointer(kCallbackFpKey, (void*) cbh.mOnCaptureSequenceAborted);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001471 msg->setInt32(kSequenceIdKey, sequenceId);
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001472 postSessionMsgAndCleanup(msg);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001473 } else {
1474 // Use mSequenceLastFrameNumberMap to track
1475 mSequenceLastFrameNumberMap.insert(std::make_pair(sequenceId, lastFrameNumber));
1476
1477 // Last frame might have arrived. Check now
1478 checkAndFireSequenceCompleteLocked();
1479 }
1480}
1481
1482void
1483CameraDevice::checkAndFireSequenceCompleteLocked() {
1484 int64_t completedFrameNumber = mFrameNumberTracker.getCompletedFrameNumber();
Yin-Chia Yehead91462016-01-06 16:45:08 -08001485 auto it = mSequenceLastFrameNumberMap.begin();
1486 while (it != mSequenceLastFrameNumberMap.end()) {
1487 int sequenceId = it->first;
Shuzhen Wangb7b42652020-05-07 11:59:02 -07001488 int64_t lastFrameNumber = it->second.lastFrameNumber;
Shuzhen Wangb7b42652020-05-07 11:59:02 -07001489
1490 if (mRemote == nullptr) {
1491 ALOGW("Camera %s closed while checking sequence complete", getId());
1492 return;
1493 }
1494 ALOGV("%s: seq %d's last frame number %" PRId64 ", completed %" PRId64,
1495 __FUNCTION__, sequenceId, lastFrameNumber, completedFrameNumber);
1496 if (!it->second.isSequenceCompleted) {
1497 // Check if there is callback for this sequence
1498 // This should not happen because we always register callback (with nullptr inside)
1499 if (mSequenceCallbackMap.count(sequenceId) == 0) {
1500 ALOGW("No callback found for sequenceId %d", sequenceId);
Shuzhen Wangb7b42652020-05-07 11:59:02 -07001501 }
1502
1503 if (lastFrameNumber <= completedFrameNumber) {
1504 ALOGV("Mark sequenceId %d as sequence completed", sequenceId);
1505 it->second.isSequenceCompleted = true;
1506 }
1507
Shuzhen Wangb7b42652020-05-07 11:59:02 -07001508 }
1509
1510 if (it->second.isSequenceCompleted && it->second.isInflightCompleted) {
Shuzhen Wangacae2642020-12-21 17:11:37 -08001511 sendCaptureSequenceCompletedLocked(sequenceId, lastFrameNumber);
1512
Shuzhen Wangb7b42652020-05-07 11:59:02 -07001513 it = mSequenceLastFrameNumberMap.erase(it);
1514 ALOGV("%s: Remove holder for sequenceId %d", __FUNCTION__, sequenceId);
1515 } else {
1516 ++it;
1517 }
1518 }
1519}
1520
1521void
1522CameraDevice::removeCompletedCallbackHolderLocked(int64_t lastCompletedRegularFrameNumber) {
1523 auto it = mSequenceLastFrameNumberMap.begin();
1524 while (it != mSequenceLastFrameNumberMap.end()) {
1525 int sequenceId = it->first;
1526 int64_t lastFrameNumber = it->second.lastFrameNumber;
Shuzhen Wang730a7912020-05-07 11:59:02 -07001527
1528 if (mRemote == nullptr) {
1529 ALOGW("Camera %s closed while checking sequence complete", getId());
1530 return;
1531 }
Shuzhen Wang730a7912020-05-07 11:59:02 -07001532
Shuzhen Wangb7b42652020-05-07 11:59:02 -07001533 ALOGV("%s: seq %d's last frame number %" PRId64
1534 ", completed inflight frame number %" PRId64,
1535 __FUNCTION__, sequenceId, lastFrameNumber,
1536 lastCompletedRegularFrameNumber);
1537 if (lastFrameNumber <= lastCompletedRegularFrameNumber) {
1538 if (it->second.isSequenceCompleted) {
Shuzhen Wangacae2642020-12-21 17:11:37 -08001539 sendCaptureSequenceCompletedLocked(sequenceId, lastFrameNumber);
Shuzhen Wang730a7912020-05-07 11:59:02 -07001540
Shuzhen Wangb7b42652020-05-07 11:59:02 -07001541 it = mSequenceLastFrameNumberMap.erase(it);
1542 ALOGV("%s: Remove holder for sequenceId %d", __FUNCTION__, sequenceId);
1543 } else {
1544 ALOGV("Mark sequenceId %d as inflight completed", sequenceId);
1545 it->second.isInflightCompleted = true;
1546 ++it;
1547 }
Yin-Chia Yehead91462016-01-06 16:45:08 -08001548 } else {
1549 ++it;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001550 }
1551 }
1552}
1553
1554/**
1555 * Camera service callback implementation
1556 */
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001557binder::Status
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001558CameraDevice::ServiceCallback::onDeviceError(
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001559 int32_t errorCode,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001560 const CaptureResultExtras& resultExtras) {
1561 ALOGD("Device error received, code %d, frame number %" PRId64 ", request ID %d, subseq ID %d",
1562 errorCode, resultExtras.frameNumber, resultExtras.requestId, resultExtras.burstId);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001563 binder::Status ret = binder::Status::ok();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001564 sp<CameraDevice> dev = mDevice.promote();
1565 if (dev == nullptr) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001566 return ret; // device has been closed
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001567 }
1568
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001569 sp<ACameraCaptureSession> session = dev->mCurrentSession.promote();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001570 Mutex::Autolock _l(dev->mDeviceLock);
1571 if (dev->mRemote == nullptr) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001572 return ret; // device has been closed
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001573 }
1574 switch (errorCode) {
1575 case ERROR_CAMERA_DISCONNECTED:
1576 {
Yin-Chia Yehead91462016-01-06 16:45:08 -08001577 // Camera is disconnected, close the session and expect no more callbacks
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001578 if (session != nullptr) {
1579 session->closeByDevice();
Yin-Chia Yehead91462016-01-06 16:45:08 -08001580 }
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001581 dev->mCurrentSession = nullptr;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001582 sp<AMessage> msg = new AMessage(kWhatOnDisconnected, dev->mHandler);
1583 msg->setPointer(kContextKey, dev->mAppCallbacks.context);
1584 msg->setPointer(kDeviceKey, (void*) dev->getWrapper());
Yin-Chia Yehead91462016-01-06 16:45:08 -08001585 msg->setPointer(kCallbackFpKey, (void*) dev->mAppCallbacks.onDisconnected);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001586 msg->post();
1587 break;
1588 }
1589 default:
1590 ALOGE("Unknown error from camera device: %d", errorCode);
Chih-Hung Hsiehe6a2f212018-10-16 12:16:31 -07001591 [[fallthrough]];
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001592 case ERROR_CAMERA_DEVICE:
1593 case ERROR_CAMERA_SERVICE:
1594 {
Jayant Chowdhary694cd472018-10-16 12:44:58 -07001595 int32_t errorVal = ::ERROR_CAMERA_DEVICE;
1596 // We keep this switch since this block might be encountered with
1597 // more than just 2 states. The default fallthrough could have us
1598 // handling more unmatched error cases.
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001599 switch (errorCode) {
1600 case ERROR_CAMERA_DEVICE:
Yin-Chia Yehead91462016-01-06 16:45:08 -08001601 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001602 break;
1603 case ERROR_CAMERA_SERVICE:
Yin-Chia Yehead91462016-01-06 16:45:08 -08001604 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
Jayant Chowdhary694cd472018-10-16 12:44:58 -07001605 errorVal = ::ERROR_CAMERA_SERVICE;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001606 break;
1607 default:
Yin-Chia Yehead91462016-01-06 16:45:08 -08001608 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_UNKNOWN);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001609 break;
1610 }
1611 sp<AMessage> msg = new AMessage(kWhatOnError, dev->mHandler);
1612 msg->setPointer(kContextKey, dev->mAppCallbacks.context);
1613 msg->setPointer(kDeviceKey, (void*) dev->getWrapper());
Yin-Chia Yehead91462016-01-06 16:45:08 -08001614 msg->setPointer(kCallbackFpKey, (void*) dev->mAppCallbacks.onError);
Jayant Chowdhary694cd472018-10-16 12:44:58 -07001615 msg->setInt32(kErrorCodeKey, errorVal);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001616 msg->post();
1617 break;
1618 }
1619 case ERROR_CAMERA_REQUEST:
1620 case ERROR_CAMERA_RESULT:
1621 case ERROR_CAMERA_BUFFER:
1622 dev->onCaptureErrorLocked(errorCode, resultExtras);
1623 break;
1624 }
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001625 return ret;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001626}
1627
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001628binder::Status
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001629CameraDevice::ServiceCallback::onDeviceIdle() {
1630 ALOGV("Camera is now idle");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001631 binder::Status ret = binder::Status::ok();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001632 sp<CameraDevice> dev = mDevice.promote();
1633 if (dev == nullptr) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001634 return ret; // device has been closed
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001635 }
1636
1637 Mutex::Autolock _l(dev->mDeviceLock);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001638 if (dev->isClosed() || dev->mRemote == nullptr) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001639 return ret;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001640 }
Yin-Chia Yehead91462016-01-06 16:45:08 -08001641
Shuzhen Wangb7b42652020-05-07 11:59:02 -07001642 dev->removeCompletedCallbackHolderLocked(
1643 std::numeric_limits<int64_t>::max()/*lastCompletedRegularFrameNumber*/);
1644
Yin-Chia Yehead91462016-01-06 16:45:08 -08001645 if (dev->mIdle) {
1646 // Already in idle state. Possibly other thread did waitUntilIdle
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001647 return ret;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001648 }
1649
1650 if (dev->mCurrentSession != nullptr) {
1651 ALOGE("onDeviceIdle sending state cb");
1652 if (dev->mBusySession != dev->mCurrentSession) {
1653 ALOGE("Current session != busy session");
1654 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001655 return ret;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001656 }
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001657
Yin-Chia Yehead91462016-01-06 16:45:08 -08001658 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, dev->mHandler);
1659 msg->setPointer(kContextKey, dev->mBusySession->mUserSessionCallback.context);
1660 msg->setObject(kSessionSpKey, dev->mBusySession);
1661 msg->setPointer(kCallbackFpKey, (void*) dev->mBusySession->mUserSessionCallback.onReady);
1662 // Make sure we clear the sp first so the session destructor can
1663 // only happen on handler thread (where we don't hold device/session lock)
1664 dev->mBusySession.clear();
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001665 dev->postSessionMsgAndCleanup(msg);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001666 }
1667 dev->mIdle = true;
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -07001668 dev->mFlushing = false;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001669 return ret;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001670}
1671
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001672binder::Status
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001673CameraDevice::ServiceCallback::onCaptureStarted(
1674 const CaptureResultExtras& resultExtras,
1675 int64_t timestamp) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001676 binder::Status ret = binder::Status::ok();
Yin-Chia Yehead91462016-01-06 16:45:08 -08001677 sp<CameraDevice> dev = mDevice.promote();
1678 if (dev == nullptr) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001679 return ret; // device has been closed
Yin-Chia Yehead91462016-01-06 16:45:08 -08001680 }
1681 Mutex::Autolock _l(dev->mDeviceLock);
1682 if (dev->isClosed() || dev->mRemote == nullptr) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001683 return ret;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001684 }
1685
Shuzhen Wangb7b42652020-05-07 11:59:02 -07001686 dev->removeCompletedCallbackHolderLocked(
1687 resultExtras.lastCompletedRegularFrameNumber);
1688
Yin-Chia Yehead91462016-01-06 16:45:08 -08001689 int sequenceId = resultExtras.requestId;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001690 int32_t burstId = resultExtras.burstId;
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001691 int64_t frameNumber = resultExtras.frameNumber;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001692
1693 auto it = dev->mSequenceCallbackMap.find(sequenceId);
1694 if (it != dev->mSequenceCallbackMap.end()) {
1695 CallbackHolder cbh = (*it).second;
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001696 bool v2Callback = cbh.mIs2Callback;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001697 ACameraCaptureSession_captureCallback_start onStart = cbh.mOnCaptureStarted;
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001698 ACameraCaptureSession_captureCallback_startV2 onStart2 = cbh.mOnCaptureStarted2;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001699 sp<ACameraCaptureSession> session = cbh.mSession;
1700 if ((size_t) burstId >= cbh.mRequests.size()) {
1701 ALOGE("%s: Error: request index %d out of bound (size %zu)",
1702 __FUNCTION__, burstId, cbh.mRequests.size());
1703 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
1704 }
1705 sp<CaptureRequest> request = cbh.mRequests[burstId];
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001706 sp<AMessage> msg = nullptr;
1707 if (v2Callback) {
1708 msg = new AMessage(kWhatCaptureStart2, dev->mHandler);
1709 msg->setPointer(kCallbackFpKey, (void*) onStart2);
1710 } else {
1711 msg = new AMessage(kWhatCaptureStart, dev->mHandler);
1712 msg->setPointer(kCallbackFpKey, (void *)onStart);
1713 }
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001714 msg->setPointer(kContextKey, cbh.mContext);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001715 msg->setObject(kSessionSpKey, session);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001716 msg->setObject(kCaptureRequestKey, request);
1717 msg->setInt64(kTimeStampKey, timestamp);
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001718 msg->setInt64(kFrameNumberKey, frameNumber);
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001719 dev->postSessionMsgAndCleanup(msg);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001720 }
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001721 return ret;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001722}
1723
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001724binder::Status
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001725CameraDevice::ServiceCallback::onResultReceived(
1726 const CameraMetadata& metadata,
Shuzhen Wang5c22c152017-12-31 17:12:25 -08001727 const CaptureResultExtras& resultExtras,
1728 const std::vector<PhysicalCaptureResultInfo>& physicalResultInfos) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001729 binder::Status ret = binder::Status::ok();
1730
Yin-Chia Yehead91462016-01-06 16:45:08 -08001731 sp<CameraDevice> dev = mDevice.promote();
1732 if (dev == nullptr) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001733 return ret; // device has been closed
Yin-Chia Yehead91462016-01-06 16:45:08 -08001734 }
1735 int sequenceId = resultExtras.requestId;
1736 int64_t frameNumber = resultExtras.frameNumber;
1737 int32_t burstId = resultExtras.burstId;
1738 bool isPartialResult = (resultExtras.partialResultCount < dev->mPartialResultCount);
1739
1740 if (!isPartialResult) {
1741 ALOGV("SeqId %d frame %" PRId64 " result arrive.", sequenceId, frameNumber);
1742 }
1743
1744 Mutex::Autolock _l(dev->mDeviceLock);
1745 if (dev->mRemote == nullptr) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001746 return ret; // device has been disconnected
Yin-Chia Yehead91462016-01-06 16:45:08 -08001747 }
1748
1749 if (dev->isClosed()) {
1750 if (!isPartialResult) {
1751 dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false);
1752 }
1753 // early return to avoid callback sent to closed devices
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001754 return ret;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001755 }
1756
1757 CameraMetadata metadataCopy = metadata;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001758 metadataCopy.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, dev->mShadingMapSize, /*data_count*/2);
Yin-Chia Yehff2a4952016-04-02 16:31:57 -07001759 metadataCopy.update(ANDROID_SYNC_FRAME_NUMBER, &frameNumber, /*data_count*/1);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001760
1761 auto it = dev->mSequenceCallbackMap.find(sequenceId);
1762 if (it != dev->mSequenceCallbackMap.end()) {
1763 CallbackHolder cbh = (*it).second;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001764 sp<ACameraCaptureSession> session = cbh.mSession;
1765 if ((size_t) burstId >= cbh.mRequests.size()) {
1766 ALOGE("%s: Error: request index %d out of bound (size %zu)",
1767 __FUNCTION__, burstId, cbh.mRequests.size());
1768 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
1769 }
1770 sp<CaptureRequest> request = cbh.mRequests[burstId];
1771 sp<ACameraMetadata> result(new ACameraMetadata(
1772 metadataCopy.release(), ACameraMetadata::ACM_RESULT));
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001773 sp<ACameraPhysicalCaptureResultInfo> physicalResult(
1774 new ACameraPhysicalCaptureResultInfo(physicalResultInfos, frameNumber));
Yin-Chia Yehead91462016-01-06 16:45:08 -08001775
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001776 sp<AMessage> msg = new AMessage(
1777 cbh.mIsLogicalCameraCallback ? kWhatLogicalCaptureResult : kWhatCaptureResult,
1778 dev->mHandler);
1779 msg->setPointer(kContextKey, cbh.mContext);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001780 msg->setObject(kSessionSpKey, session);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001781 msg->setObject(kCaptureRequestKey, request);
1782 msg->setObject(kCaptureResultKey, result);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001783 if (isPartialResult) {
1784 msg->setPointer(kCallbackFpKey,
1785 (void *)cbh.mOnCaptureProgressed);
1786 } else if (cbh.mIsLogicalCameraCallback) {
1787 msg->setPointer(kCallbackFpKey,
1788 (void *)cbh.mOnLogicalCameraCaptureCompleted);
1789 msg->setObject(kPhysicalCaptureResultKey, physicalResult);
1790 } else {
1791 msg->setPointer(kCallbackFpKey,
1792 (void *)cbh.mOnCaptureCompleted);
1793 }
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001794 dev->postSessionMsgAndCleanup(msg);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001795 }
1796
1797 if (!isPartialResult) {
1798 dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false);
1799 dev->checkAndFireSequenceCompleteLocked();
1800 }
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001801
1802 return ret;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001803}
1804
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001805binder::Status
Jayant Chowdhary09b368b2023-02-13 06:53:05 +00001806CameraDevice::ServiceCallback::onPrepared(int streamId) {
1807 ALOGV("%s: callback for stream id %d", __FUNCTION__, streamId);
1808 binder::Status ret = binder::Status::ok();
1809 sp<CameraDevice> dev = mDevice.promote();
1810 if (dev == nullptr) {
1811 return ret; // device has been closed
1812 }
1813 Mutex::Autolock _l(dev->mDeviceLock);
1814 if (dev->isClosed() || dev->mRemote == nullptr) {
1815 return ret;
1816 }
1817 auto it = dev->mConfiguredOutputs.find(streamId);
1818 if (it == dev->mConfiguredOutputs.end()) {
1819 ALOGE("%s: stream id %d does not exist", __FUNCTION__ , streamId);
1820 return ret;
1821 }
1822 sp<ACameraCaptureSession> session = dev->mCurrentSession.promote();
1823 if (session == nullptr) {
1824 ALOGE("%s: Session is dead already", __FUNCTION__ );
1825 return ret;
1826 }
1827 // We've found the window corresponding to the surface id.
1828 ACameraWindowType *window = it->second.first;
1829 sp<AMessage> msg = new AMessage(kWhatPreparedCb, dev->mHandler);
1830 msg->setPointer(kContextKey, session->mPreparedCb.context);
1831 msg->setPointer(kAnwKey, window);
1832 msg->setObject(kSessionSpKey, session);
1833 msg->setPointer(kCallbackFpKey, (void *)session->mPreparedCb.onWindowPrepared);
1834 dev->postSessionMsgAndCleanup(msg);
1835
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001836 return binder::Status::ok();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001837}
1838
Chien-Yu Chene8c535e2016-04-14 12:18:26 -07001839binder::Status
Shuzhen Wang9d066012016-09-30 11:30:20 -07001840CameraDevice::ServiceCallback::onRequestQueueEmpty() {
1841 // onRequestQueueEmpty not yet implemented in NDK
1842 return binder::Status::ok();
1843}
1844
1845binder::Status
Yin-Chia Yeh8ca23dc2017-09-05 18:15:56 -07001846CameraDevice::ServiceCallback::onRepeatingRequestError(
1847 int64_t lastFrameNumber, int32_t stoppedSequenceId) {
Chien-Yu Chene8c535e2016-04-14 12:18:26 -07001848 binder::Status ret = binder::Status::ok();
1849
1850 sp<CameraDevice> dev = mDevice.promote();
1851 if (dev == nullptr) {
1852 return ret; // device has been closed
1853 }
1854
1855 Mutex::Autolock _l(dev->mDeviceLock);
1856
1857 int repeatingSequenceId = dev->mRepeatingSequenceId;
Yin-Chia Yeh8ca23dc2017-09-05 18:15:56 -07001858 if (stoppedSequenceId == repeatingSequenceId) {
1859 dev->mRepeatingSequenceId = REQUEST_ID_NONE;
1860 }
Chien-Yu Chene8c535e2016-04-14 12:18:26 -07001861
1862 dev->checkRepeatingSequenceCompleteLocked(repeatingSequenceId, lastFrameNumber);
1863
1864 return ret;
1865}
1866
Shuzhen Wangacae2642020-12-21 17:11:37 -08001867void
1868CameraDevice::sendCaptureSequenceCompletedLocked(int sequenceId, int64_t lastFrameNumber) {
1869 auto cbIt = mSequenceCallbackMap.find(sequenceId);
1870 if (cbIt != mSequenceCallbackMap.end()) {
1871 CallbackHolder cbh = cbIt->second;
1872 mSequenceCallbackMap.erase(cbIt);
1873
1874 // send seq complete callback
1875 sp<AMessage> msg = new AMessage(kWhatCaptureSeqEnd, mHandler);
1876 msg->setPointer(kContextKey, cbh.mContext);
1877 msg->setObject(kSessionSpKey, cbh.mSession);
1878 msg->setPointer(kCallbackFpKey, (void*) cbh.mOnCaptureSequenceCompleted);
1879 msg->setInt32(kSequenceIdKey, sequenceId);
1880 msg->setInt64(kFrameNumberKey, lastFrameNumber);
1881
1882 // Clear the session sp before we send out the message
1883 // This will guarantee the rare case where the message is processed
1884 // before cbh goes out of scope and causing we call the session
1885 // destructor while holding device lock
1886 cbh.mSession.clear();
1887 postSessionMsgAndCleanup(msg);
1888 } else {
1889 // Check if there is callback for this sequence
1890 // This should not happen because we always register callback (with nullptr inside)
1891 ALOGW("No callback found for sequenceId %d", sequenceId);
1892 }
1893}
1894
Jayant Chowdhary6df26072018-11-06 23:55:12 -08001895} // namespace acam
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001896} // namespace android