1 /*
2 * Copyright (C) 2018 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 "ACameraDeviceVendor"
19
20 #include <vector>
21 #include <inttypes.h>
22 #include <android/frameworks/cameraservice/service/2.0/ICameraService.h>
23 #include <android/frameworks/cameraservice/device/2.0/types.h>
24 #include <CameraMetadata.h>
25
26 #include "ndk_vendor/impl/ACameraDevice.h"
27 #include "ACameraCaptureSession.h"
28 #include "ACameraMetadata.h"
29 #include "ACaptureRequest.h"
30 #include "utils.h"
31
32 #define CHECK_TRANSACTION_AND_RET(remoteRet, status, callName) \
33 if (!remoteRet.isOk()) { \
34 ALOGE("%s: Transaction error during %s call %s", __FUNCTION__, callName, \
35 remoteRet.description().c_str()); \
36 return ACAMERA_ERROR_UNKNOWN; \
37 } \
38 if (status != Status::NO_ERROR) { \
39 ALOGE("%s: %s call failed", __FUNCTION__, callName); \
40 return utils::convertFromHidl(status); \
41 }
42
43 using namespace android;
44
~ACameraDevice()45 ACameraDevice::~ACameraDevice() {
46 mDevice->stopLooperAndDisconnect();
47 }
48
49 namespace android {
50 namespace acam {
51
52 using HCameraMetadata = frameworks::cameraservice::device::V2_0::CameraMetadata;
53 using OutputConfiguration = frameworks::cameraservice::device::V2_0::OutputConfiguration;
54 using SessionConfiguration = frameworks::cameraservice::device::V2_0::SessionConfiguration;
55 using hardware::Void;
56
57 // Static member definitions
58 const char* CameraDevice::kContextKey = "Context";
59 const char* CameraDevice::kDeviceKey = "Device";
60 const char* CameraDevice::kErrorCodeKey = "ErrorCode";
61 const char* CameraDevice::kCallbackFpKey = "Callback";
62 const char* CameraDevice::kSessionSpKey = "SessionSp";
63 const char* CameraDevice::kCaptureRequestKey = "CaptureRequest";
64 const char* CameraDevice::kTimeStampKey = "TimeStamp";
65 const char* CameraDevice::kCaptureResultKey = "CaptureResult";
66 const char* CameraDevice::kPhysicalCaptureResultKey = "PhysicalCaptureResult";
67 const char* CameraDevice::kCaptureFailureKey = "CaptureFailure";
68 const char* CameraDevice::kSequenceIdKey = "SequenceId";
69 const char* CameraDevice::kFrameNumberKey = "FrameNumber";
70 const char* CameraDevice::kAnwKey = "Anw";
71 const char* CameraDevice::kFailingPhysicalCameraId= "FailingPhysicalCameraId";
72
73 /**
74 * CameraDevice Implementation
75 */
CameraDevice(const char * id,ACameraDevice_StateCallbacks * cb,sp<ACameraMetadata> chars,ACameraDevice * wrapper)76 CameraDevice::CameraDevice(
77 const char* id,
78 ACameraDevice_StateCallbacks* cb,
79 sp<ACameraMetadata> chars,
80 ACameraDevice* wrapper) :
81 mCameraId(id),
82 mAppCallbacks(*cb),
83 mChars(std::move(chars)),
84 mServiceCallback(new ServiceCallback(this)),
85 mWrapper(wrapper),
86 mInError(false),
87 mError(ACAMERA_OK),
88 mIdle(true),
89 mCurrentSession(nullptr) {
90 mClosing = false;
91 // Setup looper thread to perfrom device callbacks to app
92 mCbLooper = new ALooper;
93 mCbLooper->setName("C2N-dev-looper");
94 status_t err = mCbLooper->start(
95 /*runOnCallingThread*/false,
96 /*canCallJava*/ true,
97 PRIORITY_DEFAULT);
98 if (err != OK) {
99 ALOGE("%s: Unable to start camera device callback looper: %s (%d)",
100 __FUNCTION__, strerror(-err), err);
101 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
102 }
103 mHandler = new CallbackHandler(id);
104 mCbLooper->registerHandler(mHandler);
105
106 const CameraMetadata& metadata = mChars->getInternalData();
107 camera_metadata_ro_entry entry = metadata.find(ANDROID_REQUEST_PARTIAL_RESULT_COUNT);
108 if (entry.count != 1) {
109 ALOGW("%s: bad count %zu for partial result count", __FUNCTION__, entry.count);
110 mPartialResultCount = 1;
111 } else {
112 mPartialResultCount = entry.data.i32[0];
113 }
114
115 entry = metadata.find(ANDROID_LENS_INFO_SHADING_MAP_SIZE);
116 if (entry.count != 2) {
117 ALOGW("%s: bad count %zu for shading map size", __FUNCTION__, entry.count);
118 mShadingMapSize[0] = 0;
119 mShadingMapSize[1] = 0;
120 } else {
121 mShadingMapSize[0] = entry.data.i32[0];
122 mShadingMapSize[1] = entry.data.i32[1];
123 }
124 }
125
~CameraDevice()126 CameraDevice::~CameraDevice() { }
127
128 void
postSessionMsgAndCleanup(sp<AMessage> & msg)129 CameraDevice::postSessionMsgAndCleanup(sp<AMessage>& msg) {
130 msg->post();
131 msg.clear();
132 sp<AMessage> cleanupMsg = new AMessage(kWhatCleanUpSessions, mHandler);
133 cleanupMsg->post();
134 }
135
136 // TODO: cached created request?
137 camera_status_t
createCaptureRequest(ACameraDevice_request_template templateId,const ACameraIdList * physicalCameraIdList,ACaptureRequest ** request) const138 CameraDevice::createCaptureRequest(
139 ACameraDevice_request_template templateId,
140 const ACameraIdList* physicalCameraIdList,
141 ACaptureRequest** request) const {
142 Mutex::Autolock _l(mDeviceLock);
143 camera_status_t ret = checkCameraClosedOrErrorLocked();
144 if (ret != ACAMERA_OK) {
145 return ret;
146 }
147 if (mRemote == nullptr) {
148 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
149 }
150 CameraMetadata rawRequest;
151 Status status = Status::UNKNOWN_ERROR;
152 auto remoteRet = mRemote->createDefaultRequest(
153 utils::convertToHidl(templateId),
154 [&status, &rawRequest](auto s, const hidl_vec<uint8_t> &metadata) {
155 status = s;
156 if (status == Status::NO_ERROR && utils::convertFromHidlCloned(metadata, &rawRequest)) {
157 } else {
158 ALOGE("%s: Couldn't create default request", __FUNCTION__);
159 }
160 });
161 CHECK_TRANSACTION_AND_RET(remoteRet, status, "createDefaultRequest()")
162 ACaptureRequest* outReq = new ACaptureRequest();
163 outReq->settings = new ACameraMetadata(rawRequest.release(), ACameraMetadata::ACM_REQUEST);
164 if (physicalCameraIdList != nullptr) {
165 for (auto i = 0; i < physicalCameraIdList->numCameras; i++) {
166 outReq->physicalSettings.emplace(physicalCameraIdList->cameraIds[i],
167 new ACameraMetadata(*(outReq->settings)));
168 }
169 }
170 outReq->targets = new ACameraOutputTargets();
171 *request = outReq;
172 return ACAMERA_OK;
173 }
174
175 camera_status_t
createCaptureSession(const ACaptureSessionOutputContainer * outputs,const ACaptureRequest * sessionParameters,const ACameraCaptureSession_stateCallbacks * callbacks,ACameraCaptureSession ** session)176 CameraDevice::createCaptureSession(
177 const ACaptureSessionOutputContainer* outputs,
178 const ACaptureRequest* sessionParameters,
179 const ACameraCaptureSession_stateCallbacks* callbacks,
180 /*out*/ACameraCaptureSession** session) {
181 nsecs_t startTimeNs = systemTime();
182 sp<ACameraCaptureSession> currentSession = mCurrentSession.promote();
183 Mutex::Autolock _l(mDeviceLock);
184 camera_status_t ret = checkCameraClosedOrErrorLocked();
185 if (ret != ACAMERA_OK) {
186 return ret;
187 }
188
189 if (currentSession != nullptr) {
190 currentSession->closeByDevice();
191 stopRepeatingLocked();
192 }
193
194 // Create new session
195 ret = configureStreamsLocked(outputs, sessionParameters, startTimeNs);
196 if (ret != ACAMERA_OK) {
197 ALOGE("Fail to create new session. cannot configure streams");
198 return ret;
199 }
200
201 ACameraCaptureSession* newSession = new ACameraCaptureSession(
202 mNextSessionId++, outputs, callbacks, this);
203
204 // set new session as current session
205 newSession->incStrong((void *) ACameraDevice_createCaptureSession);
206 mCurrentSession = newSession;
207 mFlushing = false;
208 *session = newSession;
209 return ACAMERA_OK;
210 }
211
isSessionConfigurationSupported(const ACaptureSessionOutputContainer * sessionOutputContainer) const212 camera_status_t CameraDevice::isSessionConfigurationSupported(
213 const ACaptureSessionOutputContainer* sessionOutputContainer) const {
214 Mutex::Autolock _l(mDeviceLock);
215 camera_status_t ret = checkCameraClosedOrErrorLocked();
216 if (ret != ACAMERA_OK) {
217 return ret;
218 }
219
220 SessionConfiguration sessionConfig;
221 sessionConfig.inputWidth = 0;
222 sessionConfig.inputHeight = 0;
223 sessionConfig.inputFormat = -1;
224 sessionConfig.operationMode = StreamConfigurationMode::NORMAL_MODE;
225 sessionConfig.outputStreams.resize(sessionOutputContainer->mOutputs.size());
226 size_t index = 0;
227 for (const auto& output : sessionOutputContainer->mOutputs) {
228 sessionConfig.outputStreams[index].rotation = utils::convertToHidl(output.mRotation);
229 sessionConfig.outputStreams[index].windowGroupId = -1;
230 sessionConfig.outputStreams[index].windowHandles.resize(output.mSharedWindows.size() + 1);
231 sessionConfig.outputStreams[index].windowHandles[0] = output.mWindow;
232 sessionConfig.outputStreams[index].physicalCameraId = output.mPhysicalCameraId;
233 index++;
234 }
235
236 bool configSupported = false;
237 Status status = Status::UNKNOWN_ERROR;
238 auto remoteRet = mRemote->isSessionConfigurationSupported(sessionConfig,
239 [&status, &configSupported](auto s, auto supported) {
240 status = s;
241 configSupported = supported;
242 });
243
244 CHECK_TRANSACTION_AND_RET(remoteRet, status, "isSessionConfigurationSupported()");
245 return configSupported ? ACAMERA_OK : ACAMERA_ERROR_STREAM_CONFIGURE_FAIL;
246 }
247
addMetadataToPhysicalCameraSettings(const CameraMetadata * metadata,const std::string & cameraId,PhysicalCameraSettings * physicalCameraSettings)248 static void addMetadataToPhysicalCameraSettings(const CameraMetadata *metadata,
249 const std::string &cameraId, PhysicalCameraSettings *physicalCameraSettings) {
250 CameraMetadata metadataCopy = *metadata;
251 camera_metadata_t *camera_metadata = metadataCopy.release();
252 HCameraMetadata hCameraMetadata;
253 utils::convertToHidl(camera_metadata, &hCameraMetadata, /*shouldOwn*/ true);
254 physicalCameraSettings->settings.metadata(std::move(hCameraMetadata));
255 physicalCameraSettings->id = cameraId;
256 }
257
addRequestSettingsMetadata(ACaptureRequest * aCaptureRequest,sp<CaptureRequest> & req)258 void CameraDevice::addRequestSettingsMetadata(ACaptureRequest *aCaptureRequest,
259 sp<CaptureRequest> &req) {
260 req->mPhysicalCameraSettings.resize(1 + aCaptureRequest->physicalSettings.size());
261 addMetadataToPhysicalCameraSettings(&(aCaptureRequest->settings->getInternalData()), getId(),
262 &(req->mPhysicalCameraSettings[0]));
263 size_t i = 1;
264 for (auto &physicalSetting : aCaptureRequest->physicalSettings) {
265 addMetadataToPhysicalCameraSettings(&(physicalSetting.second->getInternalData()),
266 physicalSetting.first, &(req->mPhysicalCameraSettings[i]));
267 i++;
268 }
269 }
270
updateOutputConfigurationLocked(ACaptureSessionOutput * output)271 camera_status_t CameraDevice::updateOutputConfigurationLocked(ACaptureSessionOutput *output) {
272 camera_status_t ret = checkCameraClosedOrErrorLocked();
273 if (ret != ACAMERA_OK) {
274 return ret;
275 }
276
277 if (output == nullptr) {
278 return ACAMERA_ERROR_INVALID_PARAMETER;
279 }
280
281 if (!output->mIsShared) {
282 ALOGE("Error output configuration is not shared");
283 return ACAMERA_ERROR_INVALID_OPERATION;
284 }
285
286 int32_t streamId = -1;
287 for (auto& kvPair : mConfiguredOutputs) {
288 if (utils::isWindowNativeHandleEqual(kvPair.second.first, output->mWindow)) {
289 streamId = kvPair.first;
290 break;
291 }
292 }
293 if (streamId < 0) {
294 ALOGE("Error: Invalid output configuration");
295 return ACAMERA_ERROR_INVALID_PARAMETER;
296 }
297
298 OutputConfigurationWrapper outConfigW;
299 OutputConfiguration &outConfig = outConfigW.mOutputConfiguration;
300 outConfig.rotation = utils::convertToHidl(output->mRotation);
301 outConfig.windowHandles.resize(output->mSharedWindows.size() + 1);
302 outConfig.windowHandles[0] = output->mWindow;
303 outConfig.physicalCameraId = output->mPhysicalCameraId;
304 int i = 1;
305 for (auto& anw : output->mSharedWindows) {
306 outConfig.windowHandles[i++] = anw;
307 }
308
309 auto remoteRet = mRemote->updateOutputConfiguration(streamId, outConfig);
310 if (!remoteRet.isOk()) {
311 ALOGE("%s: Transaction error in updating OutputConfiguration: %s", __FUNCTION__,
312 remoteRet.description().c_str());
313 return ACAMERA_ERROR_UNKNOWN;
314 }
315
316 switch (remoteRet) {
317 case Status::NO_ERROR:
318 break;
319 case Status::INVALID_OPERATION:
320 ALOGE("Camera device %s invalid operation", getId());
321 return ACAMERA_ERROR_INVALID_OPERATION;
322 case Status::ALREADY_EXISTS:
323 ALOGE("Camera device %s output surface already exists", getId());
324 return ACAMERA_ERROR_INVALID_PARAMETER;
325 case Status::ILLEGAL_ARGUMENT:
326 ALOGE("Camera device %s invalid input argument", getId());
327 return ACAMERA_ERROR_INVALID_PARAMETER;
328 default:
329 ALOGE("Camera device %s failed to add shared output", getId());
330 return ACAMERA_ERROR_UNKNOWN;
331 }
332
333 mConfiguredOutputs[streamId] =
334 std::move(std::make_pair(std::move(output->mWindow), std::move(outConfigW)));
335
336 return ACAMERA_OK;
337 }
338
339 camera_status_t
allocateCaptureRequestLocked(const ACaptureRequest * request,sp<CaptureRequest> & outReq)340 CameraDevice::allocateCaptureRequestLocked(
341 const ACaptureRequest* request, /*out*/sp<CaptureRequest> &outReq) {
342 sp<CaptureRequest> req(new CaptureRequest());
343 req->mCaptureRequest.physicalCameraSettings.resize(1 + request->physicalSettings.size());
344
345 size_t index = 0;
346 allocateOneCaptureRequestMetadata(
347 req->mCaptureRequest.physicalCameraSettings[index++], mCameraId, request->settings);
348
349 for (auto& physicalEntry : request->physicalSettings) {
350 allocateOneCaptureRequestMetadata(
351 req->mCaptureRequest.physicalCameraSettings[index++],
352 physicalEntry.first, physicalEntry.second);
353 }
354
355 std::vector<int32_t> requestStreamIdxList;
356 std::vector<int32_t> requestSurfaceIdxList;
357 for (auto outputTarget : request->targets->mOutputs) {
358 const native_handle_t* anw = outputTarget.mWindow;
359 bool found = false;
360 req->mSurfaceList.push_back(anw);
361 // lookup stream/surface ID
362 for (const auto& kvPair : mConfiguredOutputs) {
363 int streamId = kvPair.first;
364 const OutputConfigurationWrapper& outConfig = kvPair.second.second;
365 const auto& windowHandles = outConfig.mOutputConfiguration.windowHandles;
366 for (int surfaceId = 0; surfaceId < (int) windowHandles.size(); surfaceId++) {
367 // If two native handles are equivalent, so are their surfaces.
368 if (utils::isWindowNativeHandleEqual(windowHandles[surfaceId].getNativeHandle(),
369 anw)) {
370 found = true;
371 requestStreamIdxList.push_back(streamId);
372 requestSurfaceIdxList.push_back(surfaceId);
373 break;
374 }
375 }
376 if (found) {
377 break;
378 }
379 }
380 if (!found) {
381 ALOGE("Unconfigured output target %p in capture request!", anw);
382 return ACAMERA_ERROR_INVALID_PARAMETER;
383 }
384 }
385 req->mCaptureRequest.streamAndWindowIds.resize(requestStreamIdxList.size());
386 for (int i = 0; i < requestStreamIdxList.size(); i++) {
387 req->mCaptureRequest.streamAndWindowIds[i].streamId = requestStreamIdxList[i];
388 req->mCaptureRequest.streamAndWindowIds[i].windowId = requestSurfaceIdxList[i];
389 }
390 outReq = req;
391 return ACAMERA_OK;
392 }
393
allocateOneCaptureRequestMetadata(PhysicalCameraSettings & cameraSettings,const std::string & id,const sp<ACameraMetadata> & metadata)394 void CameraDevice::allocateOneCaptureRequestMetadata(
395 PhysicalCameraSettings& cameraSettings,
396 const std::string& id, const sp<ACameraMetadata>& metadata) {
397 cameraSettings.id = id;
398 // TODO: Do we really need to copy the metadata here ?
399 CameraMetadata metadataCopy = metadata->getInternalData();
400 camera_metadata_t *cameraMetadata = metadataCopy.release();
401 HCameraMetadata hCameraMetadata;
402 utils::convertToHidl(cameraMetadata, &hCameraMetadata, true);
403 if (metadata != nullptr) {
404 if (hCameraMetadata.data() != nullptr &&
405 mCaptureRequestMetadataQueue != nullptr &&
406 mCaptureRequestMetadataQueue->write(
407 reinterpret_cast<const uint8_t *>(hCameraMetadata.data()),
408 hCameraMetadata.size())) {
409 // The metadata field of the union would've been destructued, so no need
410 // to re-size it.
411 cameraSettings.settings.fmqMetadataSize(hCameraMetadata.size());
412 } else {
413 ALOGE("Fmq write capture result failed, falling back to hwbinder");
414 cameraSettings.settings.metadata(std::move(hCameraMetadata));
415 }
416 }
417 }
418
419
420 ACaptureRequest*
allocateACaptureRequest(sp<CaptureRequest> & req,const char * deviceId)421 CameraDevice::allocateACaptureRequest(sp<CaptureRequest>& req, const char* deviceId) {
422 ACaptureRequest* pRequest = new ACaptureRequest();
423 for (size_t i = 0; i < req->mPhysicalCameraSettings.size(); i++) {
424 const std::string& id = req->mPhysicalCameraSettings[i].id;
425 CameraMetadata clone;
426 utils::convertFromHidlCloned(req->mPhysicalCameraSettings[i].settings.metadata(), &clone);
427 camera_metadata_t *clonep = clone.release();
428 if (id == deviceId) {
429 pRequest->settings = new ACameraMetadata(clonep, ACameraMetadata::ACM_REQUEST);
430 } else {
431 pRequest->physicalSettings[req->mPhysicalCameraSettings[i].id] =
432 new ACameraMetadata(clonep, ACameraMetadata::ACM_REQUEST);
433 }
434 }
435 pRequest->targets = new ACameraOutputTargets();
436 for (size_t i = 0; i < req->mSurfaceList.size(); i++) {
437 const native_handle_t* anw = req->mSurfaceList[i];
438 ACameraOutputTarget outputTarget(anw);
439 pRequest->targets->mOutputs.insert(outputTarget);
440 }
441 return pRequest;
442 }
443
444 void
freeACaptureRequest(ACaptureRequest * req)445 CameraDevice::freeACaptureRequest(ACaptureRequest* req) {
446 if (req == nullptr) {
447 return;
448 }
449 req->settings.clear();
450 delete req->targets;
451 delete req;
452 }
453
454 void
notifySessionEndOfLifeLocked(ACameraCaptureSession * session)455 CameraDevice::notifySessionEndOfLifeLocked(ACameraCaptureSession* session) {
456 if (isClosed()) {
457 // Device is closing already. do nothing
458 return;
459 }
460
461 if (mCurrentSession != session) {
462 // Session has been replaced by other seesion or device is closed
463 return;
464 }
465 mCurrentSession = nullptr;
466
467 // Should not happen
468 if (!session->mIsClosed) {
469 ALOGE("Error: unclosed session %p reaches end of life!", session);
470 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
471 return;
472 }
473
474 // No new session, unconfigure now
475 // Note: The unconfiguration of session won't be accounted for session
476 // latency because a stream configuration with 0 streams won't ever become
477 // active.
478 nsecs_t startTimeNs = systemTime();
479 camera_status_t ret = configureStreamsLocked(nullptr, nullptr, startTimeNs);
480 if (ret != ACAMERA_OK) {
481 ALOGE("Unconfigure stream failed. Device might still be configured! ret %d", ret);
482 }
483 }
484
485 void
disconnectLocked(sp<ACameraCaptureSession> & session)486 CameraDevice::disconnectLocked(sp<ACameraCaptureSession>& session) {
487 if (mClosing.exchange(true)) {
488 // Already closing, just return
489 ALOGW("Camera device %s is already closing.", getId());
490 return;
491 }
492
493 if (mRemote != nullptr) {
494 ALOGD("%s: binder disconnect reached", __FUNCTION__);
495 auto ret = mRemote->disconnect();
496 if (!ret.isOk()) {
497 ALOGE("%s: Transaction error while disconnecting device %s", __FUNCTION__,
498 ret.description().c_str());
499 }
500 }
501 mRemote = nullptr;
502
503 if (session != nullptr) {
504 session->closeByDevice();
505 }
506 }
507
508 camera_status_t
stopRepeatingLocked()509 CameraDevice::stopRepeatingLocked() {
510 camera_status_t ret = checkCameraClosedOrErrorLocked();
511 if (ret != ACAMERA_OK) {
512 ALOGE("Camera %s stop repeating failed! ret %d", getId(), ret);
513 return ret;
514 }
515 if (mRepeatingSequenceId != REQUEST_ID_NONE) {
516 int repeatingSequenceId = mRepeatingSequenceId;
517 mRepeatingSequenceId = REQUEST_ID_NONE;
518
519 int64_t lastFrameNumber;
520 Status status = Status::UNKNOWN_ERROR;
521 auto remoteRet = mRemote->cancelRepeatingRequest(
522 [&status, &lastFrameNumber](Status s, auto frameNumber) {
523 status = s;
524 lastFrameNumber = frameNumber;
525 });
526 CHECK_TRANSACTION_AND_RET(remoteRet, status, "cancelRepeatingRequest()");
527 checkRepeatingSequenceCompleteLocked(repeatingSequenceId, lastFrameNumber);
528 }
529 return ACAMERA_OK;
530 }
531
532 camera_status_t
flushLocked(ACameraCaptureSession * session)533 CameraDevice::flushLocked(ACameraCaptureSession* session) {
534 camera_status_t ret = checkCameraClosedOrErrorLocked();
535 if (ret != ACAMERA_OK) {
536 ALOGE("Camera %s abort captures failed! ret %d", getId(), ret);
537 return ret;
538 }
539
540 // This should never happen because creating a new session will close
541 // previous one and thus reject any API call from previous session.
542 // But still good to check here in case something unexpected happen.
543 if (mCurrentSession != session) {
544 ALOGE("Camera %s session %p is not current active session!", getId(), session);
545 return ACAMERA_ERROR_INVALID_OPERATION;
546 }
547
548 if (mFlushing) {
549 ALOGW("Camera %s is already aborting captures", getId());
550 return ACAMERA_OK;
551 }
552
553 mFlushing = true;
554
555 // Send onActive callback to guarantee there is always active->ready transition
556 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
557 msg->setPointer(kContextKey, session->mUserSessionCallback.context);
558 msg->setObject(kSessionSpKey, session);
559 msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onActive);
560 postSessionMsgAndCleanup(msg);
561
562 // If device is already idling, send callback and exit early
563 if (mIdle) {
564 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
565 msg->setPointer(kContextKey, session->mUserSessionCallback.context);
566 msg->setObject(kSessionSpKey, session);
567 msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onReady);
568 postSessionMsgAndCleanup(msg);
569 mFlushing = false;
570 return ACAMERA_OK;
571 }
572
573 int64_t lastFrameNumber;
574 Status status = Status::UNKNOWN_ERROR;
575 auto remoteRet = mRemote->flush([&status, &lastFrameNumber](auto s, auto frameNumber) {
576 status = s;
577 lastFrameNumber = frameNumber;
578 });
579 CHECK_TRANSACTION_AND_RET(remoteRet, status, "flush()")
580 if (mRepeatingSequenceId != REQUEST_ID_NONE) {
581 checkRepeatingSequenceCompleteLocked(mRepeatingSequenceId, lastFrameNumber);
582 }
583 return ACAMERA_OK;
584 }
585
586 camera_status_t
waitUntilIdleLocked()587 CameraDevice::waitUntilIdleLocked() {
588 camera_status_t ret = checkCameraClosedOrErrorLocked();
589 if (ret != ACAMERA_OK) {
590 ALOGE("Wait until camera %s idle failed! ret %d", getId(), ret);
591 return ret;
592 }
593
594 if (mRepeatingSequenceId != REQUEST_ID_NONE) {
595 ALOGE("Camera device %s won't go to idle when there is repeating request!", getId());
596 return ACAMERA_ERROR_INVALID_OPERATION;
597 }
598
599 auto remoteRet = mRemote->waitUntilIdle();
600 CHECK_TRANSACTION_AND_RET(remoteRet, remoteRet, "waitUntilIdle()")
601 return ACAMERA_OK;
602 }
603
604 camera_status_t
configureStreamsLocked(const ACaptureSessionOutputContainer * outputs,const ACaptureRequest * sessionParameters,nsecs_t startTimeNs)605 CameraDevice::configureStreamsLocked(const ACaptureSessionOutputContainer* outputs,
606 const ACaptureRequest* sessionParameters, nsecs_t startTimeNs) {
607 ACaptureSessionOutputContainer emptyOutput;
608 if (outputs == nullptr) {
609 outputs = &emptyOutput;
610 }
611
612 camera_status_t ret = checkCameraClosedOrErrorLocked();
613 if (ret != ACAMERA_OK) {
614 return ret;
615 }
616
617 std::set<std::pair<native_handle_ptr_wrapper, OutputConfigurationWrapper>> outputSet;
618 for (auto outConfig : outputs->mOutputs) {
619 const native_handle_t* anw = outConfig.mWindow;
620 OutputConfigurationWrapper outConfigInsertW;
621 OutputConfiguration &outConfigInsert = outConfigInsertW.mOutputConfiguration;
622 outConfigInsert.rotation = utils::convertToHidl(outConfig.mRotation);
623 outConfigInsert.windowGroupId = -1;
624 outConfigInsert.windowHandles.resize(outConfig.mSharedWindows.size() + 1);
625 outConfigInsert.windowHandles[0] = anw;
626 outConfigInsert.physicalCameraId = outConfig.mPhysicalCameraId;
627 native_handle_ptr_wrapper wrap(anw);
628
629 outputSet.emplace(std::make_pair(std::move(anw), std::move(outConfigInsertW)));
630 }
631 std::set<std::pair<native_handle_ptr_wrapper, OutputConfigurationWrapper>> addSet = outputSet;
632 std::vector<int32_t> deleteList;
633
634 // Determine which streams need to be created, which to be deleted
635 for (auto& kvPair : mConfiguredOutputs) {
636 int32_t streamId = kvPair.first;
637 auto& outputPair = kvPair.second;
638 if (outputSet.count(outputPair)) {
639 deleteList.push_back(streamId); // Need to delete a no longer needed stream
640 } else {
641 addSet.erase(outputPair); // No need to add already existing stream
642 }
643 }
644
645 ret = stopRepeatingLocked();
646 if (ret != ACAMERA_OK) {
647 ALOGE("Camera device %s stop repeating failed, ret %d", getId(), ret);
648 return ret;
649 }
650
651 ret = waitUntilIdleLocked();
652 if (ret != ACAMERA_OK) {
653 ALOGE("Camera device %s wait until idle failed, ret %d", getId(), ret);
654 return ret;
655 }
656
657 // Send onReady to previous session
658 // CurrentSession will be updated after configureStreamLocked, so here
659 // mCurrentSession is the session to be replaced by a new session
660 if (!mIdle && mCurrentSession != nullptr) {
661 if (mBusySession != mCurrentSession) {
662 ALOGE("Current session != busy session");
663 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
664 return ACAMERA_ERROR_CAMERA_DEVICE;
665 }
666 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
667 msg->setPointer(kContextKey, mBusySession->mUserSessionCallback.context);
668 msg->setObject(kSessionSpKey, mBusySession);
669 msg->setPointer(kCallbackFpKey, (void*) mBusySession->mUserSessionCallback.onReady);
670 mBusySession.clear();
671 postSessionMsgAndCleanup(msg);
672 }
673 mIdle = true;
674
675 auto remoteRet = mRemote->beginConfigure();
676 CHECK_TRANSACTION_AND_RET(remoteRet, remoteRet, "beginConfigure()")
677
678 // delete to-be-deleted streams
679 for (auto streamId : deleteList) {
680 remoteRet = mRemote->deleteStream(streamId);
681 CHECK_TRANSACTION_AND_RET(remoteRet, remoteRet, "deleteStream()")
682 mConfiguredOutputs.erase(streamId);
683 }
684
685 // add new streams
686 for (const auto &outputPair : addSet) {
687 int streamId;
688 Status status = Status::UNKNOWN_ERROR;
689 auto ret = mRemote->createStream(outputPair.second,
690 [&status, &streamId](Status s, auto stream_id) {
691 status = s;
692 streamId = stream_id;
693 });
694 CHECK_TRANSACTION_AND_RET(ret, status, "createStream()")
695 mConfiguredOutputs.insert(std::make_pair(streamId, outputPair));
696 }
697
698 CameraMetadata params;
699 HCameraMetadata hidlParams;
700 if ((sessionParameters != nullptr) && (sessionParameters->settings != nullptr)) {
701 params.append(sessionParameters->settings->getInternalData());
702 const camera_metadata_t *params_metadata = params.getAndLock();
703 utils::convertToHidl(params_metadata, &hidlParams);
704 params.unlock(params_metadata);
705 }
706 remoteRet = mRemote->endConfigure_2_1(StreamConfigurationMode::NORMAL_MODE,
707 hidlParams, startTimeNs);
708 CHECK_TRANSACTION_AND_RET(remoteRet, remoteRet, "endConfigure()")
709 return ACAMERA_OK;
710 }
711
712 void
setRemoteDevice(sp<ICameraDeviceUser> remote)713 CameraDevice::setRemoteDevice(sp<ICameraDeviceUser> remote) {
714 Mutex::Autolock _l(mDeviceLock);
715 mRemote = remote;
716 }
717
718 bool
setDeviceMetadataQueues()719 CameraDevice::setDeviceMetadataQueues() {
720 if (mRemote == nullptr) {
721 ALOGE("mRemote must not be null while trying to fetch metadata queues");
722 return false;
723 }
724 std::shared_ptr<RequestMetadataQueue> &reqQueue = mCaptureRequestMetadataQueue;
725 auto ret =
726 mRemote->getCaptureRequestMetadataQueue(
727 [&reqQueue](const auto &mqDescriptor) {
728 reqQueue = std::make_shared<RequestMetadataQueue>(mqDescriptor);
729 if (!reqQueue->isValid() || reqQueue->availableToWrite() <=0) {
730 ALOGE("Empty fmq from cameraserver");
731 reqQueue = nullptr;
732 }
733 });
734 if (!ret.isOk()) {
735 ALOGE("Transaction error trying to get capture request metadata queue");
736 return false;
737 }
738 std::shared_ptr<ResultMetadataQueue> &resQueue = mCaptureResultMetadataQueue;
739 ret =
740 mRemote->getCaptureResultMetadataQueue(
741 [&resQueue](const auto &mqDescriptor) {
742 resQueue = std::make_shared<ResultMetadataQueue>(mqDescriptor);
743 if (!resQueue->isValid() || resQueue->availableToWrite() <=0) {
744 ALOGE("Empty fmq from cameraserver");
745 }
746 });
747 if (!ret.isOk()) {
748 ALOGE("Transaction error trying to get capture result metadata queue");
749 return false;
750 }
751 return true;
752 }
753
754 camera_status_t
checkCameraClosedOrErrorLocked() const755 CameraDevice::checkCameraClosedOrErrorLocked() const {
756 if (mRemote == nullptr) {
757 ALOGE("%s: camera device already closed", __FUNCTION__);
758 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
759 }
760 if (mInError) {// triggered by onDeviceError
761 ALOGE("%s: camera device has encountered a serious error", __FUNCTION__);
762 return mError;
763 }
764 return ACAMERA_OK;
765 }
766
767 void
setCameraDeviceErrorLocked(camera_status_t error)768 CameraDevice::setCameraDeviceErrorLocked(camera_status_t error) {
769 mInError = true;
770 mError = error;
771 return;
772 }
773
774 void
updateTracker(int64_t frameNumber,bool isError)775 CameraDevice::FrameNumberTracker::updateTracker(int64_t frameNumber, bool isError) {
776 ALOGV("updateTracker frame %" PRId64 " isError %d", frameNumber, isError);
777 if (isError) {
778 mFutureErrorSet.insert(frameNumber);
779 } else if (frameNumber <= mCompletedFrameNumber) {
780 ALOGE("Frame number %" PRId64 " decreased! current fn %" PRId64,
781 frameNumber, mCompletedFrameNumber);
782 return;
783 } else {
784 if (frameNumber != mCompletedFrameNumber + 1) {
785 ALOGE("Frame number out of order. Expect %" PRId64 " but get %" PRId64,
786 mCompletedFrameNumber + 1, frameNumber);
787 // Do not assert as in java implementation
788 }
789 mCompletedFrameNumber = frameNumber;
790 }
791 update();
792 }
793
794 void
update()795 CameraDevice::FrameNumberTracker::update() {
796 for (auto it = mFutureErrorSet.begin(); it != mFutureErrorSet.end();) {
797 int64_t errorFrameNumber = *it;
798 if (errorFrameNumber == mCompletedFrameNumber + 1) {
799 mCompletedFrameNumber++;
800 it = mFutureErrorSet.erase(it);
801 } else if (errorFrameNumber <= mCompletedFrameNumber) {
802 // This should not happen, but deal with it anyway
803 ALOGE("Completd frame number passed through current frame number!");
804 // erase the old error since it's no longer useful
805 it = mFutureErrorSet.erase(it);
806 } else {
807 // Normal requests hasn't catched up error frames, just break
808 break;
809 }
810 }
811 ALOGV("Update complete frame %" PRId64, mCompletedFrameNumber);
812 }
813
814 void
onCaptureErrorLocked(ErrorCode errorCode,const CaptureResultExtras & resultExtras)815 CameraDevice::onCaptureErrorLocked(
816 ErrorCode errorCode,
817 const CaptureResultExtras& resultExtras) {
818 int sequenceId = resultExtras.requestId;
819 int64_t frameNumber = resultExtras.frameNumber;
820 int32_t burstId = resultExtras.burstId;
821 auto it = mSequenceCallbackMap.find(sequenceId);
822 if (it == mSequenceCallbackMap.end()) {
823 ALOGE("%s: Error: capture sequence index %d not found!",
824 __FUNCTION__, sequenceId);
825 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
826 return;
827 }
828
829 CallbackHolder cbh = (*it).second;
830 sp<ACameraCaptureSession> session = cbh.mSession;
831 if ((size_t) burstId >= cbh.mRequests.size()) {
832 ALOGE("%s: Error: request index %d out of bound (size %zu)",
833 __FUNCTION__, burstId, cbh.mRequests.size());
834 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
835 return;
836 }
837 sp<CaptureRequest> request = cbh.mRequests[burstId];
838
839 // Handle buffer error
840 if (errorCode == ErrorCode::CAMERA_BUFFER) {
841 int32_t streamId = resultExtras.errorStreamId;
842 ACameraCaptureSession_captureCallback_bufferLost onBufferLost =
843 cbh.mOnCaptureBufferLost;
844 auto outputPairIt = mConfiguredOutputs.find(streamId);
845 if (outputPairIt == mConfiguredOutputs.end()) {
846 ALOGE("%s: Error: stream id %d does not exist", __FUNCTION__, streamId);
847 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
848 return;
849 }
850
851 // Get the surfaces corresponding to the error stream id, go through
852 // them and try to match the surfaces in the corresponding
853 // CaptureRequest.
854 const auto& errorWindowHandles =
855 outputPairIt->second.second.mOutputConfiguration.windowHandles;
856 for (const auto& errorWindowHandle : errorWindowHandles) {
857 for (const auto &requestStreamAndWindowId :
858 request->mCaptureRequest.streamAndWindowIds) {
859 // Go through the surfaces in the capture request and see which
860 // ones match the surfaces in the error stream.
861 int32_t requestWindowId = requestStreamAndWindowId.windowId;
862 auto requestSurfacePairIt =
863 mConfiguredOutputs.find(requestStreamAndWindowId.streamId);
864 if (requestSurfacePairIt == mConfiguredOutputs.end()) {
865 ALOGE("%s: Error: request stream id %d does not exist", __FUNCTION__,
866 requestStreamAndWindowId.streamId);
867 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
868 return;
869 }
870
871 const auto &requestWindowHandles =
872 requestSurfacePairIt->second.second.mOutputConfiguration.windowHandles;
873 if (utils::isWindowNativeHandleEqual(
874 requestWindowHandles[requestWindowId], errorWindowHandle)) {
875 const native_handle_t* anw =
876 requestWindowHandles[requestWindowId].getNativeHandle();
877 ALOGV("Camera %s Lost output buffer for ANW %p frame %" PRId64,
878 getId(), anw, frameNumber);
879
880 sp<AMessage> msg = new AMessage(kWhatCaptureBufferLost, mHandler);
881 msg->setPointer(kContextKey, cbh.mContext);
882 msg->setObject(kSessionSpKey, session);
883 msg->setPointer(kCallbackFpKey, (void*) onBufferLost);
884 msg->setObject(kCaptureRequestKey, request);
885 msg->setPointer(kAnwKey, (void*) anw);
886 msg->setInt64(kFrameNumberKey, frameNumber);
887 postSessionMsgAndCleanup(msg);
888 }
889 }
890 }
891 } else { // Handle other capture failures
892 // Fire capture failure callback if there is one registered
893 ACameraCaptureSession_captureCallback_failed onError = cbh.mOnCaptureFailed;
894 sp<CameraCaptureFailure> failure(new CameraCaptureFailure());
895 failure->frameNumber = frameNumber;
896 // TODO: refine this when implementing flush
897 failure->reason = CAPTURE_FAILURE_REASON_ERROR;
898 failure->sequenceId = sequenceId;
899 failure->wasImageCaptured = (errorCode == ErrorCode::CAMERA_RESULT);
900
901 sp<AMessage> msg = new AMessage(cbh.mIsLogicalCameraCallback ? kWhatLogicalCaptureFail :
902 kWhatCaptureFail, mHandler);
903 msg->setPointer(kContextKey, cbh.mContext);
904 msg->setObject(kSessionSpKey, session);
905 if (cbh.mIsLogicalCameraCallback) {
906 if (resultExtras.errorPhysicalCameraId.size() > 0) {
907 msg->setString(kFailingPhysicalCameraId, resultExtras.errorPhysicalCameraId.c_str(),
908 resultExtras.errorPhysicalCameraId.size());
909 }
910 msg->setPointer(kCallbackFpKey, (void*) cbh.mOnLogicalCameraCaptureFailed);
911 } else {
912 msg->setPointer(kCallbackFpKey, (void*) onError);
913 }
914 msg->setObject(kCaptureRequestKey, request);
915 msg->setObject(kCaptureFailureKey, failure);
916 postSessionMsgAndCleanup(msg);
917
918 // Update tracker
919 mFrameNumberTracker.updateTracker(frameNumber, /*isError*/true);
920 checkAndFireSequenceCompleteLocked();
921 }
922 return;
923 }
924
CallbackHandler(const char * id)925 CameraDevice::CallbackHandler::CallbackHandler(const char *id) : mId(id) { }
926
onMessageReceived(const sp<AMessage> & msg)927 void CameraDevice::CallbackHandler::onMessageReceived(
928 const sp<AMessage> &msg) {
929 switch (msg->what()) {
930 case kWhatOnDisconnected:
931 case kWhatOnError:
932 case kWhatSessionStateCb:
933 case kWhatCaptureStart:
934 case kWhatCaptureStart2:
935 case kWhatCaptureResult:
936 case kWhatLogicalCaptureResult:
937 case kWhatCaptureFail:
938 case kWhatLogicalCaptureFail:
939 case kWhatCaptureSeqEnd:
940 case kWhatCaptureSeqAbort:
941 case kWhatCaptureBufferLost:
942 ALOGV("%s: Received msg %d", __FUNCTION__, msg->what());
943 break;
944 case kWhatCleanUpSessions:
945 mCachedSessions.clear();
946 return;
947 default:
948 ALOGE("%s:Error: unknown device callback %d", __FUNCTION__, msg->what());
949 return;
950 }
951 // Check the common part of all message
952 void* context;
953 bool found = msg->findPointer(kContextKey, &context);
954 if (!found) {
955 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
956 return;
957 }
958 switch (msg->what()) {
959 case kWhatOnDisconnected:
960 {
961 ACameraDevice* dev;
962 found = msg->findPointer(kDeviceKey, (void**) &dev);
963 if (!found || dev == nullptr) {
964 ALOGE("%s: Cannot find device pointer!", __FUNCTION__);
965 return;
966 }
967 ACameraDevice_StateCallback onDisconnected;
968 found = msg->findPointer(kCallbackFpKey, (void**) &onDisconnected);
969 if (!found) {
970 ALOGE("%s: Cannot find onDisconnected!", __FUNCTION__);
971 return;
972 }
973 if (onDisconnected == nullptr) {
974 return;
975 }
976 (*onDisconnected)(context, dev);
977 break;
978 }
979 case kWhatOnError:
980 {
981 ACameraDevice* dev;
982 found = msg->findPointer(kDeviceKey, (void**) &dev);
983 if (!found || dev == nullptr) {
984 ALOGE("%s: Cannot find device pointer!", __FUNCTION__);
985 return;
986 }
987 ACameraDevice_ErrorStateCallback onError;
988 found = msg->findPointer(kCallbackFpKey, (void**) &onError);
989 if (!found) {
990 ALOGE("%s: Cannot find onError!", __FUNCTION__);
991 return;
992 }
993 int errorCode;
994 found = msg->findInt32(kErrorCodeKey, &errorCode);
995 if (!found) {
996 ALOGE("%s: Cannot find error code!", __FUNCTION__);
997 return;
998 }
999 if (onError == nullptr) {
1000 return;
1001 }
1002 (*onError)(context, dev, errorCode);
1003 break;
1004 }
1005 case kWhatSessionStateCb:
1006 case kWhatCaptureStart:
1007 case kWhatCaptureStart2:
1008 case kWhatCaptureResult:
1009 case kWhatLogicalCaptureResult:
1010 case kWhatCaptureFail:
1011 case kWhatLogicalCaptureFail:
1012 case kWhatCaptureSeqEnd:
1013 case kWhatCaptureSeqAbort:
1014 case kWhatCaptureBufferLost:
1015 {
1016 sp<RefBase> obj;
1017 found = msg->findObject(kSessionSpKey, &obj);
1018 if (!found || obj == nullptr) {
1019 ALOGE("%s: Cannot find session pointer!", __FUNCTION__);
1020 return;
1021 }
1022 sp<ACameraCaptureSession> session(static_cast<ACameraCaptureSession*>(obj.get()));
1023 mCachedSessions.push(session);
1024 sp<CaptureRequest> requestSp = nullptr;
1025 const char *id_cstr = mId.c_str();
1026 switch (msg->what()) {
1027 case kWhatCaptureStart:
1028 case kWhatCaptureStart2:
1029 case kWhatCaptureResult:
1030 case kWhatLogicalCaptureResult:
1031 case kWhatCaptureFail:
1032 case kWhatLogicalCaptureFail:
1033 case kWhatCaptureBufferLost:
1034 found = msg->findObject(kCaptureRequestKey, &obj);
1035 if (!found) {
1036 ALOGE("%s: Cannot find capture request!", __FUNCTION__);
1037 return;
1038 }
1039 requestSp = static_cast<CaptureRequest*>(obj.get());
1040 break;
1041 }
1042
1043 switch (msg->what()) {
1044 case kWhatSessionStateCb:
1045 {
1046 ACameraCaptureSession_stateCallback onState;
1047 found = msg->findPointer(kCallbackFpKey, (void**) &onState);
1048 if (!found) {
1049 ALOGE("%s: Cannot find state callback!", __FUNCTION__);
1050 return;
1051 }
1052 if (onState == nullptr) {
1053 return;
1054 }
1055 (*onState)(context, session.get());
1056 break;
1057 }
1058 case kWhatCaptureStart:
1059 {
1060 ACameraCaptureSession_captureCallback_start onStart;
1061 found = msg->findPointer(kCallbackFpKey, (void**) &onStart);
1062 if (!found) {
1063 ALOGE("%s: Cannot find capture start callback!", __FUNCTION__);
1064 return;
1065 }
1066 if (onStart == nullptr) {
1067 return;
1068 }
1069 int64_t timestamp;
1070 found = msg->findInt64(kTimeStampKey, ×tamp);
1071 if (!found) {
1072 ALOGE("%s: Cannot find timestamp!", __FUNCTION__);
1073 return;
1074 }
1075 ACaptureRequest* request = allocateACaptureRequest(requestSp, id_cstr);
1076 (*onStart)(context, session.get(), request, timestamp);
1077 freeACaptureRequest(request);
1078 break;
1079 }
1080 case kWhatCaptureStart2:
1081 {
1082 ACameraCaptureSession_captureCallback_startV2 onStart2;
1083 found = msg->findPointer(kCallbackFpKey, (void**) &onStart2);
1084 if (!found) {
1085 ALOGE("%s: Cannot find capture startV2 callback!", __FUNCTION__);
1086 return;
1087 }
1088 if (onStart2 == nullptr) {
1089 return;
1090 }
1091 int64_t timestamp;
1092 found = msg->findInt64(kTimeStampKey, ×tamp);
1093 if (!found) {
1094 ALOGE("%s: Cannot find timestamp!", __FUNCTION__);
1095 return;
1096 }
1097 int64_t frameNumber;
1098 found = msg->findInt64(kFrameNumberKey, &frameNumber);
1099 if (!found) {
1100 ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1101 return;
1102 }
1103
1104 ACaptureRequest* request = allocateACaptureRequest(requestSp, id_cstr);
1105 (*onStart2)(context, session.get(), request, timestamp, frameNumber);
1106 freeACaptureRequest(request);
1107 break;
1108 }
1109 case kWhatCaptureResult:
1110 {
1111 ACameraCaptureSession_captureCallback_result onResult;
1112 found = msg->findPointer(kCallbackFpKey, (void**) &onResult);
1113 if (!found) {
1114 ALOGE("%s: Cannot find capture result callback!", __FUNCTION__);
1115 return;
1116 }
1117 if (onResult == nullptr) {
1118 return;
1119 }
1120
1121 found = msg->findObject(kCaptureResultKey, &obj);
1122 if (!found) {
1123 ALOGE("%s: Cannot find capture result!", __FUNCTION__);
1124 return;
1125 }
1126 sp<ACameraMetadata> result(static_cast<ACameraMetadata*>(obj.get()));
1127 ACaptureRequest* request = allocateACaptureRequest(requestSp, id_cstr);
1128 (*onResult)(context, session.get(), request, result.get());
1129 freeACaptureRequest(request);
1130 break;
1131 }
1132 case kWhatLogicalCaptureResult:
1133 {
1134 ACameraCaptureSession_logicalCamera_captureCallback_result onResult;
1135 found = msg->findPointer(kCallbackFpKey, (void**) &onResult);
1136 if (!found) {
1137 ALOGE("%s: Cannot find capture result callback!", __FUNCTION__);
1138 return;
1139 }
1140 if (onResult == nullptr) {
1141 return;
1142 }
1143
1144 found = msg->findObject(kCaptureResultKey, &obj);
1145 if (!found) {
1146 ALOGE("%s: Cannot find capture result!", __FUNCTION__);
1147 return;
1148 }
1149 sp<ACameraMetadata> result(static_cast<ACameraMetadata*>(obj.get()));
1150
1151 found = msg->findObject(kPhysicalCaptureResultKey, &obj);
1152 if (!found) {
1153 ALOGE("%s: Cannot find physical capture result!", __FUNCTION__);
1154 return;
1155 }
1156 sp<ACameraPhysicalCaptureResultInfo> physicalResult(
1157 static_cast<ACameraPhysicalCaptureResultInfo*>(obj.get()));
1158 std::vector<PhysicalCaptureResultInfoLocal>& physicalResultInfo =
1159 physicalResult->mPhysicalResultInfo;
1160
1161 std::vector<std::string> physicalCameraIds;
1162 std::vector<sp<ACameraMetadata>> physicalMetadataCopy;
1163 for (size_t i = 0; i < physicalResultInfo.size(); i++) {
1164 physicalCameraIds.push_back(physicalResultInfo[i].physicalCameraId);
1165
1166 CameraMetadata clone = physicalResultInfo[i].physicalMetadata;
1167 clone.update(ANDROID_SYNC_FRAME_NUMBER,
1168 &physicalResult->mFrameNumber, /*data_count*/1);
1169 sp<ACameraMetadata> metadata =
1170 new ACameraMetadata(clone.release(), ACameraMetadata::ACM_RESULT);
1171 physicalMetadataCopy.push_back(metadata);
1172 }
1173 std::vector<const char*> physicalCameraIdPtrs;
1174 std::vector<const ACameraMetadata*> physicalMetadataCopyPtrs;
1175 for (size_t i = 0; i < physicalResultInfo.size(); i++) {
1176 physicalCameraIdPtrs.push_back(physicalCameraIds[i].c_str());
1177 physicalMetadataCopyPtrs.push_back(physicalMetadataCopy[i].get());
1178 }
1179
1180 ACaptureRequest* request = allocateACaptureRequest(requestSp, id_cstr);
1181 (*onResult)(context, session.get(), request, result.get(),
1182 physicalResultInfo.size(), physicalCameraIdPtrs.data(),
1183 physicalMetadataCopyPtrs.data());
1184 freeACaptureRequest(request);
1185 break;
1186 }
1187
1188 case kWhatCaptureFail:
1189 {
1190 ACameraCaptureSession_captureCallback_failed onFail;
1191 found = msg->findPointer(kCallbackFpKey, (void**) &onFail);
1192 if (!found) {
1193 ALOGE("%s: Cannot find capture fail callback!", __FUNCTION__);
1194 return;
1195 }
1196 if (onFail == nullptr) {
1197 return;
1198 }
1199
1200 found = msg->findObject(kCaptureFailureKey, &obj);
1201 if (!found) {
1202 ALOGE("%s: Cannot find capture failure!", __FUNCTION__);
1203 return;
1204 }
1205 sp<CameraCaptureFailure> failureSp(
1206 static_cast<CameraCaptureFailure*>(obj.get()));
1207 ACameraCaptureFailure* failure =
1208 static_cast<ACameraCaptureFailure*>(failureSp.get());
1209 ACaptureRequest* request = allocateACaptureRequest(requestSp, id_cstr);
1210 (*onFail)(context, session.get(), request, failure);
1211 freeACaptureRequest(request);
1212 break;
1213 }
1214 case kWhatLogicalCaptureFail:
1215 {
1216 ACameraCaptureSession_logicalCamera_captureCallback_failed onFail;
1217 found = msg->findPointer(kCallbackFpKey, (void**) &onFail);
1218 if (!found) {
1219 ALOGE("%s: Cannot find capture fail callback!", __FUNCTION__);
1220 return;
1221 }
1222 if (onFail == nullptr) {
1223 return;
1224 }
1225
1226 found = msg->findObject(kCaptureFailureKey, &obj);
1227 if (!found) {
1228 ALOGE("%s: Cannot find capture failure!", __FUNCTION__);
1229 return;
1230 }
1231 sp<CameraCaptureFailure> failureSp(
1232 static_cast<CameraCaptureFailure*>(obj.get()));
1233 ALogicalCameraCaptureFailure failure;
1234 AString physicalCameraId;
1235 found = msg->findString(kFailingPhysicalCameraId, &physicalCameraId);
1236 if (found && !physicalCameraId.empty()) {
1237 failure.physicalCameraId = physicalCameraId.c_str();
1238 } else {
1239 failure.physicalCameraId = nullptr;
1240 }
1241 failure.captureFailure = *failureSp;
1242 ACaptureRequest* request = allocateACaptureRequest(requestSp, id_cstr);
1243 (*onFail)(context, session.get(), request, &failure);
1244 freeACaptureRequest(request);
1245 break;
1246 }
1247 case kWhatCaptureSeqEnd:
1248 {
1249 ACameraCaptureSession_captureCallback_sequenceEnd onSeqEnd;
1250 found = msg->findPointer(kCallbackFpKey, (void**) &onSeqEnd);
1251 if (!found) {
1252 ALOGE("%s: Cannot find sequence end callback!", __FUNCTION__);
1253 return;
1254 }
1255 if (onSeqEnd == nullptr) {
1256 return;
1257 }
1258 int seqId;
1259 found = msg->findInt32(kSequenceIdKey, &seqId);
1260 if (!found) {
1261 ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1262 return;
1263 }
1264 int64_t frameNumber;
1265 found = msg->findInt64(kFrameNumberKey, &frameNumber);
1266 if (!found) {
1267 ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1268 return;
1269 }
1270 (*onSeqEnd)(context, session.get(), seqId, frameNumber);
1271 break;
1272 }
1273 case kWhatCaptureSeqAbort:
1274 {
1275 ACameraCaptureSession_captureCallback_sequenceAbort onSeqAbort;
1276 found = msg->findPointer(kCallbackFpKey, (void**) &onSeqAbort);
1277 if (!found) {
1278 ALOGE("%s: Cannot find sequence end callback!", __FUNCTION__);
1279 return;
1280 }
1281 if (onSeqAbort == nullptr) {
1282 return;
1283 }
1284 int seqId;
1285 found = msg->findInt32(kSequenceIdKey, &seqId);
1286 if (!found) {
1287 ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1288 return;
1289 }
1290 (*onSeqAbort)(context, session.get(), seqId);
1291 break;
1292 }
1293 case kWhatCaptureBufferLost:
1294 {
1295 ACameraCaptureSession_captureCallback_bufferLost onBufferLost;
1296 found = msg->findPointer(kCallbackFpKey, (void**) &onBufferLost);
1297 if (!found) {
1298 ALOGE("%s: Cannot find buffer lost callback!", __FUNCTION__);
1299 return;
1300 }
1301 if (onBufferLost == nullptr) {
1302 return;
1303 }
1304
1305 const native_handle_t* anw;
1306 found = msg->findPointer(kAnwKey, (void**) &anw);
1307 if (!found) {
1308 ALOGE("%s: Cannot find native_handle_t!", __FUNCTION__);
1309 return;
1310 }
1311
1312 int64_t frameNumber;
1313 found = msg->findInt64(kFrameNumberKey, &frameNumber);
1314 if (!found) {
1315 ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1316 return;
1317 }
1318
1319 ACaptureRequest* request = allocateACaptureRequest(requestSp, id_cstr);
1320 (*onBufferLost)(context, session.get(), request, anw, frameNumber);
1321 freeACaptureRequest(request);
1322 break;
1323 }
1324 }
1325 break;
1326 }
1327 }
1328 }
1329
CallbackHolder(sp<ACameraCaptureSession> session,const Vector<sp<CaptureRequest>> & requests,bool isRepeating,ACameraCaptureSession_captureCallbacks * cbs)1330 CameraDevice::CallbackHolder::CallbackHolder(
1331 sp<ACameraCaptureSession> session,
1332 const Vector<sp<CaptureRequest> >& requests,
1333 bool isRepeating,
1334 ACameraCaptureSession_captureCallbacks* cbs) :
1335 mSession(session), mRequests(requests),
1336 mIsRepeating(isRepeating),
1337 mIs2Callback(false),
1338 mIsLogicalCameraCallback(false) {
1339 initCaptureCallbacks(cbs);
1340
1341 if (cbs != nullptr) {
1342 mOnCaptureCompleted = cbs->onCaptureCompleted;
1343 mOnCaptureFailed = cbs->onCaptureFailed;
1344 }
1345 }
1346
CallbackHolder(sp<ACameraCaptureSession> session,const Vector<sp<CaptureRequest>> & requests,bool isRepeating,ACameraCaptureSession_logicalCamera_captureCallbacks * lcbs)1347 CameraDevice::CallbackHolder::CallbackHolder(
1348 sp<ACameraCaptureSession> session,
1349 const Vector<sp<CaptureRequest> >& requests,
1350 bool isRepeating,
1351 ACameraCaptureSession_logicalCamera_captureCallbacks* lcbs) :
1352 mSession(session), mRequests(requests),
1353 mIsRepeating(isRepeating),
1354 mIs2Callback(false),
1355 mIsLogicalCameraCallback(true) {
1356 initCaptureCallbacks(lcbs);
1357
1358 if (lcbs != nullptr) {
1359 mOnLogicalCameraCaptureCompleted = lcbs->onLogicalCameraCaptureCompleted;
1360 mOnLogicalCameraCaptureFailed = lcbs->onLogicalCameraCaptureFailed;
1361 }
1362 }
1363
CallbackHolder(sp<ACameraCaptureSession> session,const Vector<sp<CaptureRequest>> & requests,bool isRepeating,ACameraCaptureSession_captureCallbacksV2 * cbs)1364 CameraDevice::CallbackHolder::CallbackHolder(
1365 sp<ACameraCaptureSession> session,
1366 const Vector<sp<CaptureRequest> >& requests,
1367 bool isRepeating,
1368 ACameraCaptureSession_captureCallbacksV2* cbs) :
1369 mSession(session), mRequests(requests),
1370 mIsRepeating(isRepeating),
1371 mIs2Callback(true),
1372 mIsLogicalCameraCallback(false) {
1373 initCaptureCallbacksV2(cbs);
1374
1375 if (cbs != nullptr) {
1376 mOnCaptureCompleted = cbs->onCaptureCompleted;
1377 mOnCaptureFailed = cbs->onCaptureFailed;
1378 }
1379 }
1380
CallbackHolder(sp<ACameraCaptureSession> session,const Vector<sp<CaptureRequest>> & requests,bool isRepeating,ACameraCaptureSession_logicalCamera_captureCallbacksV2 * lcbs)1381 CameraDevice::CallbackHolder::CallbackHolder(
1382 sp<ACameraCaptureSession> session,
1383 const Vector<sp<CaptureRequest> >& requests,
1384 bool isRepeating,
1385 ACameraCaptureSession_logicalCamera_captureCallbacksV2* lcbs) :
1386 mSession(session), mRequests(requests),
1387 mIsRepeating(isRepeating),
1388 mIs2Callback(true),
1389 mIsLogicalCameraCallback(true) {
1390 initCaptureCallbacksV2(lcbs);
1391
1392 if (lcbs != nullptr) {
1393 mOnLogicalCameraCaptureCompleted = lcbs->onLogicalCameraCaptureCompleted;
1394 mOnLogicalCameraCaptureFailed = lcbs->onLogicalCameraCaptureFailed;
1395 }
1396 }
1397
1398 void
checkRepeatingSequenceCompleteLocked(const int sequenceId,const int64_t lastFrameNumber)1399 CameraDevice::checkRepeatingSequenceCompleteLocked(
1400 const int sequenceId, const int64_t lastFrameNumber) {
1401 ALOGV("Repeating seqId %d lastFrameNumer %" PRId64, sequenceId, lastFrameNumber);
1402 if (lastFrameNumber == NO_FRAMES_CAPTURED) {
1403 if (mSequenceCallbackMap.count(sequenceId) == 0) {
1404 ALOGW("No callback found for sequenceId %d", sequenceId);
1405 return;
1406 }
1407 // remove callback holder from callback map
1408 auto cbIt = mSequenceCallbackMap.find(sequenceId);
1409 CallbackHolder cbh = cbIt->second;
1410 mSequenceCallbackMap.erase(cbIt);
1411 // send seq aborted callback
1412 sp<AMessage> msg = new AMessage(kWhatCaptureSeqAbort, mHandler);
1413 msg->setPointer(kContextKey, cbh.mContext);
1414 msg->setObject(kSessionSpKey, cbh.mSession);
1415 msg->setPointer(kCallbackFpKey, (void*) cbh.mOnCaptureSequenceAborted);
1416 msg->setInt32(kSequenceIdKey, sequenceId);
1417 postSessionMsgAndCleanup(msg);
1418 } else {
1419 // Use mSequenceLastFrameNumberMap to track
1420 mSequenceLastFrameNumberMap.insert(std::make_pair(sequenceId, lastFrameNumber));
1421
1422 // Last frame might have arrived. Check now
1423 checkAndFireSequenceCompleteLocked();
1424 }
1425 }
1426
1427 void
checkAndFireSequenceCompleteLocked()1428 CameraDevice::checkAndFireSequenceCompleteLocked() {
1429 int64_t completedFrameNumber = mFrameNumberTracker.getCompletedFrameNumber();
1430 auto it = mSequenceLastFrameNumberMap.begin();
1431 while (it != mSequenceLastFrameNumberMap.end()) {
1432 int sequenceId = it->first;
1433 int64_t lastFrameNumber = it->second;
1434 bool seqCompleted = false;
1435 bool hasCallback = true;
1436
1437 if (mRemote == nullptr) {
1438 ALOGW("Camera %s closed while checking sequence complete", getId());
1439 return;
1440 }
1441
1442 // Check if there is callback for this sequence
1443 // This should not happen because we always register callback (with nullptr inside)
1444 if (mSequenceCallbackMap.count(sequenceId) == 0) {
1445 ALOGW("No callback found for sequenceId %d", sequenceId);
1446 hasCallback = false;
1447 }
1448
1449 if (lastFrameNumber <= completedFrameNumber) {
1450 ALOGV("seq %d reached last frame %" PRId64 ", completed %" PRId64,
1451 sequenceId, lastFrameNumber, completedFrameNumber);
1452 seqCompleted = true;
1453 }
1454
1455 if (seqCompleted && hasCallback) {
1456 // remove callback holder from callback map
1457 auto cbIt = mSequenceCallbackMap.find(sequenceId);
1458 CallbackHolder cbh = cbIt->second;
1459 mSequenceCallbackMap.erase(cbIt);
1460 // send seq complete callback
1461 sp<AMessage> msg = new AMessage(kWhatCaptureSeqEnd, mHandler);
1462 msg->setPointer(kContextKey, cbh.mContext);
1463 msg->setObject(kSessionSpKey, cbh.mSession);
1464 msg->setPointer(kCallbackFpKey, (void*) cbh.mOnCaptureSequenceCompleted);
1465 msg->setInt32(kSequenceIdKey, sequenceId);
1466 msg->setInt64(kFrameNumberKey, lastFrameNumber);
1467
1468 // Clear the session sp before we send out the message
1469 // This will guarantee the rare case where the message is processed
1470 // before cbh goes out of scope and causing we call the session
1471 // destructor while holding device lock
1472 cbh.mSession.clear();
1473
1474 postSessionMsgAndCleanup(msg);
1475 }
1476
1477 // No need to track sequence complete if there is no callback registered
1478 if (seqCompleted || !hasCallback) {
1479 it = mSequenceLastFrameNumberMap.erase(it);
1480 } else {
1481 ++it;
1482 }
1483 }
1484 }
1485
stopLooperAndDisconnect()1486 void CameraDevice::stopLooperAndDisconnect() {
1487 Mutex::Autolock _l(mDeviceLock);
1488 sp<ACameraCaptureSession> session = mCurrentSession.promote();
1489 if (!isClosed()) {
1490 disconnectLocked(session);
1491 }
1492 mCurrentSession = nullptr;
1493 if (mCbLooper != nullptr) {
1494 mCbLooper->unregisterHandler(mHandler->id());
1495 mCbLooper->stop();
1496 }
1497 mCbLooper.clear();
1498 mHandler.clear();
1499 }
1500
1501 /**
1502 * Camera service callback implementation
1503 */
1504 android::hardware::Return<void>
onDeviceError(ErrorCode errorCode,const CaptureResultExtras & resultExtras)1505 CameraDevice::ServiceCallback::onDeviceError(
1506 ErrorCode errorCode,
1507 const CaptureResultExtras& resultExtras) {
1508 ALOGD("Device error received, code %d, frame number %" PRId64 ", request ID %d, subseq ID %d"
1509 " physical camera ID %s", errorCode, resultExtras.frameNumber, resultExtras.requestId,
1510 resultExtras.burstId, resultExtras.errorPhysicalCameraId.c_str());
1511 auto ret = Void();
1512 sp<CameraDevice> dev = mDevice.promote();
1513 if (dev == nullptr) {
1514 return ret; // device has been closed
1515 }
1516
1517 sp<ACameraCaptureSession> session = dev->mCurrentSession.promote();
1518 Mutex::Autolock _l(dev->mDeviceLock);
1519 if (dev->mRemote == nullptr) {
1520 return ret; // device has been closed
1521 }
1522 switch (errorCode) {
1523 case ErrorCode::CAMERA_DISCONNECTED:
1524 {
1525 // Camera is disconnected, close the session and expect no more callbacks
1526 if (session != nullptr) {
1527 session->closeByDevice();
1528 }
1529 dev->mCurrentSession = nullptr;
1530 sp<AMessage> msg = new AMessage(kWhatOnDisconnected, dev->mHandler);
1531 msg->setPointer(kContextKey, dev->mAppCallbacks.context);
1532 msg->setPointer(kDeviceKey, (void*) dev->getWrapper());
1533 msg->setPointer(kCallbackFpKey, (void*) dev->mAppCallbacks.onDisconnected);
1534 msg->post();
1535 break;
1536 }
1537 default:
1538 ALOGE("Unknown error from camera device: %d", errorCode);
1539 [[fallthrough]];
1540 case ErrorCode::CAMERA_DEVICE:
1541 case ErrorCode::CAMERA_SERVICE:
1542 {
1543 int32_t errorVal = ::ERROR_CAMERA_DEVICE;
1544 // We keep this switch since this block might be encountered with
1545 // more than just 2 states. The default fallthrough could have us
1546 // handling more unmatched error cases.
1547 switch (errorCode) {
1548 case ErrorCode::CAMERA_DEVICE:
1549 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
1550 break;
1551 case ErrorCode::CAMERA_SERVICE:
1552 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
1553 errorVal = ::ERROR_CAMERA_SERVICE;
1554 break;
1555 default:
1556 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_UNKNOWN);
1557 break;
1558 }
1559 sp<AMessage> msg = new AMessage(kWhatOnError, dev->mHandler);
1560 msg->setPointer(kContextKey, dev->mAppCallbacks.context);
1561 msg->setPointer(kDeviceKey, (void*) dev->getWrapper());
1562 msg->setPointer(kCallbackFpKey, (void*) dev->mAppCallbacks.onError);
1563 msg->setInt32(kErrorCodeKey, errorVal);
1564 msg->post();
1565 break;
1566 }
1567 case ErrorCode::CAMERA_REQUEST:
1568 case ErrorCode::CAMERA_RESULT:
1569 case ErrorCode::CAMERA_BUFFER:
1570 dev->onCaptureErrorLocked(errorCode, resultExtras);
1571 break;
1572 }
1573 return ret;
1574 }
1575
1576 android::hardware::Return<void>
onDeviceIdle()1577 CameraDevice::ServiceCallback::onDeviceIdle() {
1578 ALOGV("Camera is now idle");
1579 auto ret = Void();
1580 sp<CameraDevice> dev = mDevice.promote();
1581 if (dev == nullptr) {
1582 return ret; // device has been closed
1583 }
1584
1585 Mutex::Autolock _l(dev->mDeviceLock);
1586 if (dev->isClosed() || dev->mRemote == nullptr) {
1587 return ret;
1588 }
1589
1590 if (dev->mIdle) {
1591 // Already in idle state. Possibly other thread did waitUntilIdle
1592 return ret;
1593 }
1594
1595 if (dev->mCurrentSession != nullptr) {
1596 ALOGE("onDeviceIdle sending state cb");
1597 if (dev->mBusySession != dev->mCurrentSession) {
1598 ALOGE("Current session != busy session");
1599 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
1600 return ret;
1601 }
1602
1603 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, dev->mHandler);
1604 msg->setPointer(kContextKey, dev->mBusySession->mUserSessionCallback.context);
1605 msg->setObject(kSessionSpKey, dev->mBusySession);
1606 msg->setPointer(kCallbackFpKey, (void*) dev->mBusySession->mUserSessionCallback.onReady);
1607 // Make sure we clear the sp first so the session destructor can
1608 // only happen on handler thread (where we don't hold device/session lock)
1609 dev->mBusySession.clear();
1610 dev->postSessionMsgAndCleanup(msg);
1611 }
1612 dev->mIdle = true;
1613 dev->mFlushing = false;
1614 return ret;
1615 }
1616
1617 android::hardware::Return<void>
onCaptureStarted(const CaptureResultExtras & resultExtras,uint64_t timestamp)1618 CameraDevice::ServiceCallback::onCaptureStarted(
1619 const CaptureResultExtras& resultExtras,
1620 uint64_t timestamp) {
1621 auto ret = Void();
1622
1623 sp<CameraDevice> dev = mDevice.promote();
1624 if (dev == nullptr) {
1625 return ret; // device has been closed
1626 }
1627 Mutex::Autolock _l(dev->mDeviceLock);
1628 if (dev->isClosed() || dev->mRemote == nullptr) {
1629 return ret;
1630 }
1631
1632 int32_t sequenceId = resultExtras.requestId;
1633 int32_t burstId = resultExtras.burstId;
1634 int64_t frameNumber = resultExtras.frameNumber;
1635
1636 auto it = dev->mSequenceCallbackMap.find(sequenceId);
1637 if (it != dev->mSequenceCallbackMap.end()) {
1638 CallbackHolder cbh = (*it).second;
1639 ACameraCaptureSession_captureCallback_start onStart = cbh.mOnCaptureStarted;
1640 ACameraCaptureSession_captureCallback_startV2 onStart2 = cbh.mOnCaptureStarted2;
1641 bool v2Callback = cbh.mIs2Callback;
1642 sp<ACameraCaptureSession> session = cbh.mSession;
1643 if ((size_t) burstId >= cbh.mRequests.size()) {
1644 ALOGE("%s: Error: request index %d out of bound (size %zu)",
1645 __FUNCTION__, burstId, cbh.mRequests.size());
1646 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
1647 }
1648 sp<CaptureRequest> request = cbh.mRequests[burstId];
1649 sp<AMessage> msg = nullptr;
1650 if (v2Callback) {
1651 msg = new AMessage(kWhatCaptureStart2, dev->mHandler);
1652 msg->setPointer(kCallbackFpKey, (void*) onStart2);
1653 } else {
1654 msg = new AMessage(kWhatCaptureStart, dev->mHandler);
1655 msg->setPointer(kCallbackFpKey, (void*) onStart);
1656 }
1657 msg->setPointer(kContextKey, cbh.mContext);
1658 msg->setObject(kSessionSpKey, session);
1659 msg->setObject(kCaptureRequestKey, request);
1660 msg->setInt64(kTimeStampKey, timestamp);
1661 msg->setInt64(kFrameNumberKey, frameNumber);
1662 dev->postSessionMsgAndCleanup(msg);
1663 }
1664 return ret;
1665 }
1666
1667 android::hardware::Return<void>
onResultReceived(const FmqSizeOrMetadata & resultMetadata,const CaptureResultExtras & resultExtras,const hidl_vec<PhysicalCaptureResultInfo> & physicalResultInfos)1668 CameraDevice::ServiceCallback::onResultReceived(
1669 const FmqSizeOrMetadata& resultMetadata,
1670 const CaptureResultExtras& resultExtras,
1671 const hidl_vec<PhysicalCaptureResultInfo>& physicalResultInfos) {
1672 auto ret = Void();
1673
1674 sp<CameraDevice> dev = mDevice.promote();
1675 if (dev == nullptr) {
1676 return ret; // device has been closed
1677 }
1678 int32_t sequenceId = resultExtras.requestId;
1679 int64_t frameNumber = resultExtras.frameNumber;
1680 int32_t burstId = resultExtras.burstId;
1681 bool isPartialResult = (resultExtras.partialResultCount < dev->mPartialResultCount);
1682
1683 if (!isPartialResult) {
1684 ALOGV("SeqId %d frame %" PRId64 " result arrive.", sequenceId, frameNumber);
1685 }
1686
1687 Mutex::Autolock _l(dev->mDeviceLock);
1688 if (dev->mRemote == nullptr) {
1689 return ret; // device has been disconnected
1690 }
1691
1692 if (dev->isClosed()) {
1693 if (!isPartialResult) {
1694 dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false);
1695 }
1696 // early return to avoid callback sent to closed devices
1697 return ret;
1698 }
1699
1700 CameraMetadata metadataCopy;
1701 camera_status_t status = readOneResultMetadata(resultMetadata,
1702 dev->mCaptureResultMetadataQueue.get(), &metadataCopy);
1703 if (status != ACAMERA_OK) {
1704 ALOGE("%s: result metadata couldn't be converted", __FUNCTION__);
1705 return ret;
1706 }
1707
1708 metadataCopy.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, dev->mShadingMapSize, /*data_count*/2);
1709 metadataCopy.update(ANDROID_SYNC_FRAME_NUMBER, &frameNumber, /*data_count*/1);
1710
1711 auto it = dev->mSequenceCallbackMap.find(sequenceId);
1712 if (it != dev->mSequenceCallbackMap.end()) {
1713 CallbackHolder cbh = (*it).second;
1714 sp<ACameraCaptureSession> session = cbh.mSession;
1715 if ((size_t) burstId >= cbh.mRequests.size()) {
1716 ALOGE("%s: Error: request index %d out of bound (size %zu)",
1717 __FUNCTION__, burstId, cbh.mRequests.size());
1718 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
1719 }
1720 sp<CaptureRequest> request = cbh.mRequests[burstId];
1721 sp<ACameraMetadata> result(new ACameraMetadata(
1722 metadataCopy.release(), ACameraMetadata::ACM_RESULT));
1723
1724 std::vector<PhysicalCaptureResultInfoLocal> localPhysicalResult;
1725 localPhysicalResult.resize(physicalResultInfos.size());
1726 for (size_t i = 0; i < physicalResultInfos.size(); i++) {
1727 localPhysicalResult[i].physicalCameraId = physicalResultInfos[i].physicalCameraId;
1728 status = readOneResultMetadata(physicalResultInfos[i].physicalCameraMetadata,
1729 dev->mCaptureResultMetadataQueue.get(),
1730 &localPhysicalResult[i].physicalMetadata);
1731 if (status != ACAMERA_OK) {
1732 ALOGE("%s: physical camera result metadata couldn't be converted", __FUNCTION__);
1733 return ret;
1734 }
1735 }
1736 sp<ACameraPhysicalCaptureResultInfo> physicalResult(
1737 new ACameraPhysicalCaptureResultInfo(localPhysicalResult, frameNumber));
1738
1739 sp<AMessage> msg = new AMessage(
1740 cbh.mIsLogicalCameraCallback ? kWhatLogicalCaptureResult : kWhatCaptureResult,
1741 dev->mHandler);
1742 msg->setPointer(kContextKey, cbh.mContext);
1743 msg->setObject(kSessionSpKey, session);
1744 msg->setObject(kCaptureRequestKey, request);
1745 msg->setObject(kCaptureResultKey, result);
1746 if (isPartialResult) {
1747 msg->setPointer(kCallbackFpKey,
1748 (void *)cbh.mOnCaptureProgressed);
1749 } else if (cbh.mIsLogicalCameraCallback) {
1750 msg->setPointer(kCallbackFpKey,
1751 (void *)cbh.mOnLogicalCameraCaptureCompleted);
1752 msg->setObject(kPhysicalCaptureResultKey, physicalResult);
1753 } else {
1754 msg->setPointer(kCallbackFpKey,
1755 (void *)cbh.mOnCaptureCompleted);
1756 }
1757 dev->postSessionMsgAndCleanup(msg);
1758 }
1759
1760 if (!isPartialResult) {
1761 dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false);
1762 dev->checkAndFireSequenceCompleteLocked();
1763 }
1764
1765 return ret;
1766 }
1767
1768 android::hardware::Return<void>
onRepeatingRequestError(uint64_t lastFrameNumber,int32_t stoppedSequenceId)1769 CameraDevice::ServiceCallback::onRepeatingRequestError(
1770 uint64_t lastFrameNumber, int32_t stoppedSequenceId) {
1771 auto ret = Void();
1772
1773 sp<CameraDevice> dev = mDevice.promote();
1774 if (dev == nullptr) {
1775 return ret; // device has been closed
1776 }
1777
1778 Mutex::Autolock _l(dev->mDeviceLock);
1779
1780 int repeatingSequenceId = dev->mRepeatingSequenceId;
1781 if (stoppedSequenceId == repeatingSequenceId) {
1782 dev->mRepeatingSequenceId = REQUEST_ID_NONE;
1783 }
1784
1785 dev->checkRepeatingSequenceCompleteLocked(repeatingSequenceId, lastFrameNumber);
1786
1787 return ret;
1788 }
1789
readOneResultMetadata(const FmqSizeOrMetadata & fmqSizeOrMetadata,ResultMetadataQueue * metadataQueue,CameraMetadata * metadata)1790 camera_status_t CameraDevice::ServiceCallback::readOneResultMetadata(
1791 const FmqSizeOrMetadata& fmqSizeOrMetadata, ResultMetadataQueue* metadataQueue,
1792 CameraMetadata* metadata) {
1793 if (metadataQueue == nullptr || metadata == nullptr) {
1794 return ACAMERA_ERROR_INVALID_PARAMETER;
1795 }
1796 bool converted;
1797 HCameraMetadata hCameraMetadata;
1798 if (fmqSizeOrMetadata.getDiscriminator() ==
1799 FmqSizeOrMetadata::hidl_discriminator::fmqMetadataSize) {
1800 hCameraMetadata.resize(fmqSizeOrMetadata.fmqMetadataSize());
1801 bool read = metadataQueue->read(
1802 hCameraMetadata.data(), fmqSizeOrMetadata.fmqMetadataSize());
1803 if (!read) {
1804 ALOGE("%s capture request settings could't be read from fmq", __FUNCTION__);
1805 return ACAMERA_ERROR_UNKNOWN;
1806 }
1807 // TODO: Do we actually need to clone here ?
1808 converted = utils::convertFromHidlCloned(hCameraMetadata, metadata);
1809 } else {
1810 converted = utils::convertFromHidlCloned(fmqSizeOrMetadata.metadata(), metadata);
1811 }
1812
1813 return converted ? ACAMERA_OK : ACAMERA_ERROR_UNKNOWN;
1814 }
1815
1816 } // namespace acam
1817 } // namespace android
1818