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