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 <camera2/SubmitInfo.h> 24 #include <gui/Surface.h> 25 #include "ACameraDevice.h" 26 #include "ACameraMetadata.h" 27 #include "ACaptureRequest.h" 28 #include "ACameraCaptureSession.h" 29 30 using namespace android; 31 32 namespace android { 33 // Static member definitions 34 const char* CameraDevice::kContextKey = "Context"; 35 const char* CameraDevice::kDeviceKey = "Device"; 36 const char* CameraDevice::kErrorCodeKey = "ErrorCode"; 37 const char* CameraDevice::kCallbackFpKey = "Callback"; 38 const char* CameraDevice::kSessionSpKey = "SessionSp"; 39 const char* CameraDevice::kCaptureRequestKey = "CaptureRequest"; 40 const char* CameraDevice::kTimeStampKey = "TimeStamp"; 41 const char* CameraDevice::kCaptureResultKey = "CaptureResult"; 42 const char* CameraDevice::kCaptureFailureKey = "CaptureFailure"; 43 const char* CameraDevice::kSequenceIdKey = "SequenceId"; 44 const char* CameraDevice::kFrameNumberKey = "FrameNumber"; 45 const char* CameraDevice::kAnwKey = "Anw"; 46 47 /** 48 * CameraDevice Implementation 49 */ 50 CameraDevice::CameraDevice( 51 const char* id, 52 ACameraDevice_StateCallbacks* cb, 53 std::unique_ptr<ACameraMetadata> chars, 54 ACameraDevice* wrapper) : 55 mCameraId(id), 56 mAppCallbacks(*cb), 57 mChars(std::move(chars)), 58 mServiceCallback(new ServiceCallback(this)), 59 mWrapper(wrapper), 60 mInError(false), 61 mError(ACAMERA_OK), 62 mIdle(true), 63 mCurrentSession(nullptr) { 64 mClosing = false; 65 // Setup looper thread to perfrom device callbacks to app 66 mCbLooper = new ALooper; 67 mCbLooper->setName("C2N-dev-looper"); 68 status_t err = mCbLooper->start( 69 /*runOnCallingThread*/false, 70 /*canCallJava*/ true, 71 PRIORITY_DEFAULT); 72 if (err != OK) { 73 ALOGE("%s: Unable to start camera device callback looper: %s (%d)", 74 __FUNCTION__, strerror(-err), err); 75 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE); 76 } 77 mHandler = new CallbackHandler(); 78 mCbLooper->registerHandler(mHandler); 79 80 const CameraMetadata& metadata = mChars->getInternalData(); 81 camera_metadata_ro_entry entry = metadata.find(ANDROID_REQUEST_PARTIAL_RESULT_COUNT); 82 if (entry.count != 1) { 83 ALOGW("%s: bad count %zu for partial result count", __FUNCTION__, entry.count); 84 mPartialResultCount = 1; 85 } else { 86 mPartialResultCount = entry.data.i32[0]; 87 } 88 89 entry = metadata.find(ANDROID_LENS_INFO_SHADING_MAP_SIZE); 90 if (entry.count != 2) { 91 ALOGW("%s: bad count %zu for shading map size", __FUNCTION__, entry.count); 92 mShadingMapSize[0] = 0; 93 mShadingMapSize[1] = 0; 94 } else { 95 mShadingMapSize[0] = entry.data.i32[0]; 96 mShadingMapSize[1] = entry.data.i32[1]; 97 } 98 } 99 100 // Device close implementaiton 101 CameraDevice::~CameraDevice() { 102 sp<ACameraCaptureSession> session = mCurrentSession.promote(); 103 { 104 Mutex::Autolock _l(mDeviceLock); 105 if (!isClosed()) { 106 disconnectLocked(session); 107 } 108 mCurrentSession = nullptr; 109 if (mCbLooper != nullptr) { 110 mCbLooper->unregisterHandler(mHandler->id()); 111 mCbLooper->stop(); 112 } 113 } 114 mCbLooper.clear(); 115 mHandler.clear(); 116 } 117 118 void 119 CameraDevice::postSessionMsgAndCleanup(sp<AMessage>& msg) { 120 msg->post(); 121 msg.clear(); 122 sp<AMessage> cleanupMsg = new AMessage(kWhatCleanUpSessions, mHandler); 123 cleanupMsg->post(); 124 } 125 126 // TODO: cached created request? 127 camera_status_t 128 CameraDevice::createCaptureRequest( 129 ACameraDevice_request_template templateId, 130 ACaptureRequest** request) const { 131 Mutex::Autolock _l(mDeviceLock); 132 camera_status_t ret = checkCameraClosedOrErrorLocked(); 133 if (ret != ACAMERA_OK) { 134 return ret; 135 } 136 if (mRemote == nullptr) { 137 return ACAMERA_ERROR_CAMERA_DISCONNECTED; 138 } 139 CameraMetadata rawRequest; 140 binder::Status remoteRet = mRemote->createDefaultRequest(templateId, &rawRequest); 141 if (remoteRet.serviceSpecificErrorCode() == 142 hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) { 143 ALOGW("Create capture request failed! template %d is not supported on this device", 144 templateId); 145 return ACAMERA_ERROR_INVALID_PARAMETER; 146 } else if (!remoteRet.isOk()) { 147 ALOGE("Create capture request failed: %s", remoteRet.toString8().string()); 148 return ACAMERA_ERROR_UNKNOWN; 149 } 150 ACaptureRequest* outReq = new ACaptureRequest(); 151 outReq->settings = new ACameraMetadata(rawRequest.release(), ACameraMetadata::ACM_REQUEST); 152 outReq->targets = new ACameraOutputTargets(); 153 *request = outReq; 154 return ACAMERA_OK; 155 } 156 157 camera_status_t 158 CameraDevice::createCaptureSession( 159 const ACaptureSessionOutputContainer* outputs, 160 const ACaptureRequest* sessionParameters, 161 const ACameraCaptureSession_stateCallbacks* callbacks, 162 /*out*/ACameraCaptureSession** session) { 163 sp<ACameraCaptureSession> currentSession = mCurrentSession.promote(); 164 Mutex::Autolock _l(mDeviceLock); 165 camera_status_t ret = checkCameraClosedOrErrorLocked(); 166 if (ret != ACAMERA_OK) { 167 return ret; 168 } 169 170 if (currentSession != nullptr) { 171 currentSession->closeByDevice(); 172 stopRepeatingLocked(); 173 } 174 175 // Create new session 176 ret = configureStreamsLocked(outputs, sessionParameters); 177 if (ret != ACAMERA_OK) { 178 ALOGE("Fail to create new session. cannot configure streams"); 179 return ret; 180 } 181 182 ACameraCaptureSession* newSession = new ACameraCaptureSession( 183 mNextSessionId++, outputs, callbacks, this); 184 185 // set new session as current session 186 newSession->incStrong((void *) ACameraDevice_createCaptureSession); 187 mCurrentSession = newSession; 188 mFlushing = false; 189 *session = newSession; 190 return ACAMERA_OK; 191 } 192 193 camera_status_t 194 CameraDevice::captureLocked( 195 sp<ACameraCaptureSession> session, 196 /*optional*/ACameraCaptureSession_captureCallbacks* cbs, 197 int numRequests, ACaptureRequest** requests, 198 /*optional*/int* captureSequenceId) { 199 return submitRequestsLocked( 200 session, cbs, numRequests, requests, captureSequenceId, /*isRepeating*/false); 201 } 202 203 camera_status_t 204 CameraDevice::setRepeatingRequestsLocked( 205 sp<ACameraCaptureSession> session, 206 /*optional*/ACameraCaptureSession_captureCallbacks* cbs, 207 int numRequests, ACaptureRequest** requests, 208 /*optional*/int* captureSequenceId) { 209 return submitRequestsLocked( 210 session, cbs, numRequests, requests, captureSequenceId, /*isRepeating*/true); 211 } 212 213 camera_status_t 214 CameraDevice::submitRequestsLocked( 215 sp<ACameraCaptureSession> session, 216 /*optional*/ACameraCaptureSession_captureCallbacks* cbs, 217 int numRequests, ACaptureRequest** requests, 218 /*optional*/int* captureSequenceId, 219 bool isRepeating) { 220 camera_status_t ret = checkCameraClosedOrErrorLocked(); 221 if (ret != ACAMERA_OK) { 222 ALOGE("Camera %s submit capture request failed! ret %d", getId(), ret); 223 return ret; 224 } 225 226 // Form two vectors of capture request, one for internal tracking 227 std::vector<hardware::camera2::CaptureRequest> requestList; 228 Vector<sp<CaptureRequest> > requestsV; 229 requestsV.setCapacity(numRequests); 230 for (int i = 0; i < numRequests; i++) { 231 sp<CaptureRequest> req; 232 ret = allocateCaptureRequest(requests[i], req); 233 if (ret != ACAMERA_OK) { 234 ALOGE("Convert capture request to internal format failure! ret %d", ret); 235 return ret; 236 } 237 if (req->mSurfaceList.empty()) { 238 ALOGE("Capture request without output target cannot be submitted!"); 239 return ACAMERA_ERROR_INVALID_PARAMETER; 240 } 241 requestList.push_back(*(req.get())); 242 requestsV.push_back(req); 243 } 244 245 if (isRepeating) { 246 ret = stopRepeatingLocked(); 247 if (ret != ACAMERA_OK) { 248 ALOGE("Camera %s stop repeating failed! ret %d", getId(), ret); 249 return ret; 250 } 251 } 252 253 binder::Status remoteRet; 254 hardware::camera2::utils::SubmitInfo info; 255 remoteRet = mRemote->submitRequestList(requestList, isRepeating, &info); 256 int sequenceId = info.mRequestId; 257 int64_t lastFrameNumber = info.mLastFrameNumber; 258 if (sequenceId < 0) { 259 ALOGE("Camera %s submit request remote failure: ret %d", getId(), sequenceId); 260 return ACAMERA_ERROR_UNKNOWN; 261 } 262 263 CallbackHolder cbHolder(session, requestsV, isRepeating, cbs); 264 mSequenceCallbackMap.insert(std::make_pair(sequenceId, cbHolder)); 265 266 if (isRepeating) { 267 // stopRepeating above should have cleanup repeating sequence id 268 if (mRepeatingSequenceId != REQUEST_ID_NONE) { 269 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE); 270 return ACAMERA_ERROR_CAMERA_DEVICE; 271 } 272 mRepeatingSequenceId = sequenceId; 273 } else { 274 mSequenceLastFrameNumberMap.insert(std::make_pair(sequenceId, lastFrameNumber)); 275 } 276 277 if (mIdle) { 278 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler); 279 msg->setPointer(kContextKey, session->mUserSessionCallback.context); 280 msg->setObject(kSessionSpKey, session); 281 msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onActive); 282 postSessionMsgAndCleanup(msg); 283 } 284 mIdle = false; 285 mBusySession = session; 286 287 if (captureSequenceId) { 288 *captureSequenceId = sequenceId; 289 } 290 return ACAMERA_OK; 291 } 292 293 camera_status_t CameraDevice::updateOutputConfigurationLocked(ACaptureSessionOutput *output) { 294 camera_status_t ret = checkCameraClosedOrErrorLocked(); 295 if (ret != ACAMERA_OK) { 296 return ret; 297 } 298 299 if (output == nullptr) { 300 return ACAMERA_ERROR_INVALID_PARAMETER; 301 } 302 303 if (!output->mIsShared) { 304 ALOGE("Error output configuration is not shared"); 305 return ACAMERA_ERROR_INVALID_OPERATION; 306 } 307 308 int32_t streamId = -1; 309 for (auto& kvPair : mConfiguredOutputs) { 310 if (kvPair.second.first == output->mWindow) { 311 streamId = kvPair.first; 312 break; 313 } 314 } 315 if (streamId < 0) { 316 ALOGE("Error: Invalid output configuration"); 317 return ACAMERA_ERROR_INVALID_PARAMETER; 318 } 319 320 sp<IGraphicBufferProducer> iGBP(nullptr); 321 ret = getIGBPfromAnw(output->mWindow, iGBP); 322 if (ret != ACAMERA_OK) { 323 ALOGE("Camera device %s failed to extract graphic producer from native window", 324 getId()); 325 return ret; 326 } 327 328 OutputConfiguration outConfig(iGBP, output->mRotation, OutputConfiguration::INVALID_SET_ID, 329 true); 330 331 for (auto& anw : output->mSharedWindows) { 332 ret = getIGBPfromAnw(anw, iGBP); 333 if (ret != ACAMERA_OK) { 334 ALOGE("Camera device %s failed to extract graphic producer from native window", 335 getId()); 336 return ret; 337 } 338 outConfig.addGraphicProducer(iGBP); 339 } 340 341 auto remoteRet = mRemote->updateOutputConfiguration(streamId, outConfig); 342 if (!remoteRet.isOk()) { 343 switch (remoteRet.serviceSpecificErrorCode()) { 344 case hardware::ICameraService::ERROR_INVALID_OPERATION: 345 ALOGE("Camera device %s invalid operation: %s", getId(), 346 remoteRet.toString8().string()); 347 return ACAMERA_ERROR_INVALID_OPERATION; 348 break; 349 case hardware::ICameraService::ERROR_ALREADY_EXISTS: 350 ALOGE("Camera device %s output surface already exists: %s", getId(), 351 remoteRet.toString8().string()); 352 return ACAMERA_ERROR_INVALID_PARAMETER; 353 break; 354 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT: 355 ALOGE("Camera device %s invalid input argument: %s", getId(), 356 remoteRet.toString8().string()); 357 return ACAMERA_ERROR_INVALID_PARAMETER; 358 break; 359 default: 360 ALOGE("Camera device %s failed to add shared output: %s", getId(), 361 remoteRet.toString8().string()); 362 return ACAMERA_ERROR_UNKNOWN; 363 } 364 } 365 mConfiguredOutputs[streamId] = std::make_pair(output->mWindow, outConfig); 366 367 return ACAMERA_OK; 368 } 369 370 camera_status_t 371 CameraDevice::allocateCaptureRequest( 372 const ACaptureRequest* request, /*out*/sp<CaptureRequest>& outReq) { 373 camera_status_t ret; 374 sp<CaptureRequest> req(new CaptureRequest()); 375 req->mPhysicalCameraSettings.push_back({std::string(mCameraId.string()), 376 request->settings->getInternalData()}); 377 req->mIsReprocess = false; // NDK does not support reprocessing yet 378 req->mContext = request->context; 379 req->mSurfaceConverted = true; // set to true, and fill in stream/surface idx to speed up IPC 380 381 for (auto outputTarget : request->targets->mOutputs) { 382 ANativeWindow* anw = outputTarget.mWindow; 383 sp<Surface> surface; 384 ret = getSurfaceFromANativeWindow(anw, surface); 385 if (ret != ACAMERA_OK) { 386 ALOGE("Bad output target in capture request! ret %d", ret); 387 return ret; 388 } 389 req->mSurfaceList.push_back(surface); 390 391 bool found = false; 392 // lookup stream/surface ID 393 for (const auto& kvPair : mConfiguredOutputs) { 394 int streamId = kvPair.first; 395 const OutputConfiguration& outConfig = kvPair.second.second; 396 const auto& gbps = outConfig.getGraphicBufferProducers(); 397 for (int surfaceId = 0; surfaceId < (int) gbps.size(); surfaceId++) { 398 if (gbps[surfaceId] == surface->getIGraphicBufferProducer()) { 399 found = true; 400 req->mStreamIdxList.push_back(streamId); 401 req->mSurfaceIdxList.push_back(surfaceId); 402 break; 403 } 404 } 405 if (found) { 406 break; 407 } 408 } 409 if (!found) { 410 ALOGE("Unconfigured output target %p in capture request!", anw); 411 return ret; 412 } 413 } 414 415 outReq = req; 416 return ACAMERA_OK; 417 } 418 419 ACaptureRequest* 420 CameraDevice::allocateACaptureRequest(sp<CaptureRequest>& req) { 421 ACaptureRequest* pRequest = new ACaptureRequest(); 422 CameraMetadata clone = req->mPhysicalCameraSettings.begin()->settings; 423 pRequest->settings = new ACameraMetadata(clone.release(), ACameraMetadata::ACM_REQUEST); 424 pRequest->targets = new ACameraOutputTargets(); 425 for (size_t i = 0; i < req->mSurfaceList.size(); i++) { 426 ANativeWindow* anw = static_cast<ANativeWindow*>(req->mSurfaceList[i].get()); 427 ACameraOutputTarget outputTarget(anw); 428 pRequest->targets->mOutputs.insert(outputTarget); 429 } 430 pRequest->context = req->mContext; 431 return pRequest; 432 } 433 434 void 435 CameraDevice::freeACaptureRequest(ACaptureRequest* req) { 436 if (req == nullptr) { 437 return; 438 } 439 delete req->settings; 440 delete req->targets; 441 delete req; 442 } 443 444 void 445 CameraDevice::notifySessionEndOfLifeLocked(ACameraCaptureSession* session) { 446 if (isClosed()) { 447 // Device is closing already. do nothing 448 return; 449 } 450 451 if (mCurrentSession != session) { 452 // Session has been replaced by other seesion or device is closed 453 return; 454 } 455 mCurrentSession = nullptr; 456 457 // Should not happen 458 if (!session->mIsClosed) { 459 ALOGE("Error: unclosed session %p reaches end of life!", session); 460 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE); 461 return; 462 } 463 464 // No new session, unconfigure now 465 camera_status_t ret = configureStreamsLocked(nullptr, nullptr); 466 if (ret != ACAMERA_OK) { 467 ALOGE("Unconfigure stream failed. Device might still be configured! ret %d", ret); 468 } 469 } 470 471 void 472 CameraDevice::disconnectLocked(sp<ACameraCaptureSession>& session) { 473 if (mClosing.exchange(true)) { 474 // Already closing, just return 475 ALOGW("Camera device %s is already closing.", getId()); 476 return; 477 } 478 479 if (mRemote != nullptr) { 480 mRemote->disconnect(); 481 } 482 mRemote = nullptr; 483 484 if (session != nullptr) { 485 session->closeByDevice(); 486 } 487 } 488 489 camera_status_t 490 CameraDevice::stopRepeatingLocked() { 491 camera_status_t ret = checkCameraClosedOrErrorLocked(); 492 if (ret != ACAMERA_OK) { 493 ALOGE("Camera %s stop repeating failed! ret %d", getId(), ret); 494 return ret; 495 } 496 if (mRepeatingSequenceId != REQUEST_ID_NONE) { 497 int repeatingSequenceId = mRepeatingSequenceId; 498 mRepeatingSequenceId = REQUEST_ID_NONE; 499 500 int64_t lastFrameNumber; 501 binder::Status remoteRet = mRemote->cancelRequest(repeatingSequenceId, &lastFrameNumber); 502 if (remoteRet.serviceSpecificErrorCode() == 503 hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) { 504 ALOGV("Repeating request is already stopped."); 505 return ACAMERA_OK; 506 } else if (!remoteRet.isOk()) { 507 ALOGE("Stop repeating request fails in remote: %s", remoteRet.toString8().string()); 508 return ACAMERA_ERROR_UNKNOWN; 509 } 510 checkRepeatingSequenceCompleteLocked(repeatingSequenceId, lastFrameNumber); 511 } 512 return ACAMERA_OK; 513 } 514 515 camera_status_t 516 CameraDevice::flushLocked(ACameraCaptureSession* session) { 517 camera_status_t ret = checkCameraClosedOrErrorLocked(); 518 if (ret != ACAMERA_OK) { 519 ALOGE("Camera %s abort captures failed! ret %d", getId(), ret); 520 return ret; 521 } 522 523 // This should never happen because creating a new session will close 524 // previous one and thus reject any API call from previous session. 525 // But still good to check here in case something unexpected happen. 526 if (mCurrentSession != session) { 527 ALOGE("Camera %s session %p is not current active session!", getId(), session); 528 return ACAMERA_ERROR_INVALID_OPERATION; 529 } 530 531 if (mFlushing) { 532 ALOGW("Camera %s is already aborting captures", getId()); 533 return ACAMERA_OK; 534 } 535 536 mFlushing = true; 537 538 // Send onActive callback to guarantee there is always active->ready transition 539 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler); 540 msg->setPointer(kContextKey, session->mUserSessionCallback.context); 541 msg->setObject(kSessionSpKey, session); 542 msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onActive); 543 postSessionMsgAndCleanup(msg); 544 545 // If device is already idling, send callback and exit early 546 if (mIdle) { 547 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler); 548 msg->setPointer(kContextKey, session->mUserSessionCallback.context); 549 msg->setObject(kSessionSpKey, session); 550 msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onReady); 551 postSessionMsgAndCleanup(msg); 552 mFlushing = false; 553 return ACAMERA_OK; 554 } 555 556 int64_t lastFrameNumber; 557 binder::Status remoteRet = mRemote->flush(&lastFrameNumber); 558 if (!remoteRet.isOk()) { 559 ALOGE("Abort captures fails in remote: %s", remoteRet.toString8().string()); 560 return ACAMERA_ERROR_UNKNOWN; 561 } 562 if (mRepeatingSequenceId != REQUEST_ID_NONE) { 563 checkRepeatingSequenceCompleteLocked(mRepeatingSequenceId, lastFrameNumber); 564 } 565 return ACAMERA_OK; 566 } 567 568 camera_status_t 569 CameraDevice::waitUntilIdleLocked() { 570 camera_status_t ret = checkCameraClosedOrErrorLocked(); 571 if (ret != ACAMERA_OK) { 572 ALOGE("Wait until camera %s idle failed! ret %d", getId(), ret); 573 return ret; 574 } 575 576 if (mRepeatingSequenceId != REQUEST_ID_NONE) { 577 ALOGE("Camera device %s won't go to idle when there is repeating request!", getId()); 578 return ACAMERA_ERROR_INVALID_OPERATION; 579 } 580 581 binder::Status remoteRet = mRemote->waitUntilIdle(); 582 if (!remoteRet.isOk()) { 583 ALOGE("Camera device %s waitUntilIdle failed: %s", getId(), remoteRet.toString8().string()); 584 // TODO: define a function to convert status_t -> camera_status_t 585 return ACAMERA_ERROR_UNKNOWN; 586 } 587 588 return ACAMERA_OK; 589 } 590 591 camera_status_t 592 CameraDevice::getIGBPfromAnw( 593 ANativeWindow* anw, 594 sp<IGraphicBufferProducer>& out) { 595 sp<Surface> surface; 596 camera_status_t ret = getSurfaceFromANativeWindow(anw, surface); 597 if (ret != ACAMERA_OK) { 598 return ret; 599 } 600 out = surface->getIGraphicBufferProducer(); 601 return ACAMERA_OK; 602 } 603 604 camera_status_t 605 CameraDevice::getSurfaceFromANativeWindow( 606 ANativeWindow* anw, sp<Surface>& out) { 607 if (anw == nullptr) { 608 ALOGE("Error: output ANativeWindow is null"); 609 return ACAMERA_ERROR_INVALID_PARAMETER; 610 } 611 int value; 612 int err = (*anw->query)(anw, NATIVE_WINDOW_CONCRETE_TYPE, &value); 613 if (err != OK || value != NATIVE_WINDOW_SURFACE) { 614 ALOGE("Error: ANativeWindow is not backed by Surface!"); 615 return ACAMERA_ERROR_INVALID_PARAMETER; 616 } 617 sp<Surface> surface(static_cast<Surface*>(anw)); 618 out = surface; 619 return ACAMERA_OK; 620 } 621 622 camera_status_t 623 CameraDevice::configureStreamsLocked(const ACaptureSessionOutputContainer* outputs, 624 const ACaptureRequest* sessionParameters) { 625 ACaptureSessionOutputContainer emptyOutput; 626 if (outputs == nullptr) { 627 outputs = &emptyOutput; 628 } 629 630 camera_status_t ret = checkCameraClosedOrErrorLocked(); 631 if (ret != ACAMERA_OK) { 632 return ret; 633 } 634 635 std::set<std::pair<ANativeWindow*, OutputConfiguration>> outputSet; 636 for (auto outConfig : outputs->mOutputs) { 637 ANativeWindow* anw = outConfig.mWindow; 638 sp<IGraphicBufferProducer> iGBP(nullptr); 639 ret = getIGBPfromAnw(anw, iGBP); 640 if (ret != ACAMERA_OK) { 641 return ret; 642 } 643 outputSet.insert(std::make_pair( 644 anw, OutputConfiguration(iGBP, outConfig.mRotation, 645 OutputConfiguration::INVALID_SET_ID, outConfig.mIsShared))); 646 } 647 auto addSet = outputSet; 648 std::vector<int> deleteList; 649 650 // Determine which streams need to be created, which to be deleted 651 for (auto& kvPair : mConfiguredOutputs) { 652 int streamId = kvPair.first; 653 auto& outputPair = kvPair.second; 654 if (outputSet.count(outputPair) == 0) { 655 deleteList.push_back(streamId); // Need to delete a no longer needed stream 656 } else { 657 addSet.erase(outputPair); // No need to add already existing stream 658 } 659 } 660 661 ret = stopRepeatingLocked(); 662 if (ret != ACAMERA_OK) { 663 ALOGE("Camera device %s stop repeating failed, ret %d", getId(), ret); 664 return ret; 665 } 666 667 ret = waitUntilIdleLocked(); 668 if (ret != ACAMERA_OK) { 669 ALOGE("Camera device %s wait until idle failed, ret %d", getId(), ret); 670 return ret; 671 } 672 673 // Send onReady to previous session 674 // CurrentSession will be updated after configureStreamLocked, so here 675 // mCurrentSession is the session to be replaced by a new session 676 if (!mIdle && mCurrentSession != nullptr) { 677 if (mBusySession != mCurrentSession) { 678 ALOGE("Current session != busy session"); 679 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE); 680 return ACAMERA_ERROR_CAMERA_DEVICE; 681 } 682 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler); 683 msg->setPointer(kContextKey, mBusySession->mUserSessionCallback.context); 684 msg->setObject(kSessionSpKey, mBusySession); 685 msg->setPointer(kCallbackFpKey, (void*) mBusySession->mUserSessionCallback.onReady); 686 mBusySession.clear(); 687 postSessionMsgAndCleanup(msg); 688 } 689 mIdle = true; 690 691 binder::Status remoteRet = mRemote->beginConfigure(); 692 if (!remoteRet.isOk()) { 693 ALOGE("Camera device %s begin configure failed: %s", getId(), remoteRet.toString8().string()); 694 return ACAMERA_ERROR_UNKNOWN; 695 } 696 697 // delete to-be-deleted streams 698 for (auto streamId : deleteList) { 699 remoteRet = mRemote->deleteStream(streamId); 700 if (!remoteRet.isOk()) { 701 ALOGE("Camera device %s failed to remove stream %d: %s", getId(), streamId, 702 remoteRet.toString8().string()); 703 return ACAMERA_ERROR_UNKNOWN; 704 } 705 mConfiguredOutputs.erase(streamId); 706 } 707 708 // add new streams 709 for (auto outputPair : addSet) { 710 int streamId; 711 remoteRet = mRemote->createStream(outputPair.second, &streamId); 712 if (!remoteRet.isOk()) { 713 ALOGE("Camera device %s failed to create stream: %s", getId(), 714 remoteRet.toString8().string()); 715 return ACAMERA_ERROR_UNKNOWN; 716 } 717 mConfiguredOutputs.insert(std::make_pair(streamId, outputPair)); 718 } 719 720 CameraMetadata params; 721 if ((sessionParameters != nullptr) && (sessionParameters->settings != nullptr)) { 722 params.append(sessionParameters->settings->getInternalData()); 723 } 724 remoteRet = mRemote->endConfigure(/*isConstrainedHighSpeed*/ false, params); 725 if (remoteRet.serviceSpecificErrorCode() == hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) { 726 ALOGE("Camera device %s cannnot support app output configuration: %s", getId(), 727 remoteRet.toString8().string()); 728 return ACAMERA_ERROR_STREAM_CONFIGURE_FAIL; 729 } else if (!remoteRet.isOk()) { 730 ALOGE("Camera device %s end configure failed: %s", getId(), remoteRet.toString8().string()); 731 return ACAMERA_ERROR_UNKNOWN; 732 } 733 734 return ACAMERA_OK; 735 } 736 737 void 738 CameraDevice::setRemoteDevice(sp<hardware::camera2::ICameraDeviceUser> remote) { 739 Mutex::Autolock _l(mDeviceLock); 740 mRemote = remote; 741 } 742 743 camera_status_t 744 CameraDevice::checkCameraClosedOrErrorLocked() const { 745 if (mRemote == nullptr) { 746 ALOGE("%s: camera device already closed", __FUNCTION__); 747 return ACAMERA_ERROR_CAMERA_DISCONNECTED; 748 } 749 if (mInError) {// triggered by onDeviceError 750 ALOGE("%s: camera device has encountered a serious error", __FUNCTION__); 751 return mError; 752 } 753 return ACAMERA_OK; 754 } 755 756 void 757 CameraDevice::setCameraDeviceErrorLocked(camera_status_t error) { 758 mInError = true; 759 mError = error; 760 return; 761 } 762 763 void 764 CameraDevice::FrameNumberTracker::updateTracker(int64_t frameNumber, bool isError) { 765 ALOGV("updateTracker frame %" PRId64 " isError %d", frameNumber, isError); 766 if (isError) { 767 mFutureErrorSet.insert(frameNumber); 768 } else if (frameNumber <= mCompletedFrameNumber) { 769 ALOGE("Frame number %" PRId64 " decreased! current fn %" PRId64, 770 frameNumber, mCompletedFrameNumber); 771 return; 772 } else { 773 if (frameNumber != mCompletedFrameNumber + 1) { 774 ALOGE("Frame number out of order. Expect %" PRId64 " but get %" PRId64, 775 mCompletedFrameNumber + 1, frameNumber); 776 // Do not assert as in java implementation 777 } 778 mCompletedFrameNumber = frameNumber; 779 } 780 update(); 781 } 782 783 void 784 CameraDevice::FrameNumberTracker::update() { 785 for (auto it = mFutureErrorSet.begin(); it != mFutureErrorSet.end();) { 786 int64_t errorFrameNumber = *it; 787 if (errorFrameNumber == mCompletedFrameNumber + 1) { 788 mCompletedFrameNumber++; 789 it = mFutureErrorSet.erase(it); 790 } else if (errorFrameNumber <= mCompletedFrameNumber) { 791 // This should not happen, but deal with it anyway 792 ALOGE("Completd frame number passed through current frame number!"); 793 // erase the old error since it's no longer useful 794 it = mFutureErrorSet.erase(it); 795 } else { 796 // Normal requests hasn't catched up error frames, just break 797 break; 798 } 799 } 800 ALOGV("Update complete frame %" PRId64, mCompletedFrameNumber); 801 } 802 803 void 804 CameraDevice::onCaptureErrorLocked( 805 int32_t errorCode, 806 const CaptureResultExtras& resultExtras) { 807 int sequenceId = resultExtras.requestId; 808 int64_t frameNumber = resultExtras.frameNumber; 809 int32_t burstId = resultExtras.burstId; 810 auto it = mSequenceCallbackMap.find(sequenceId); 811 if (it == mSequenceCallbackMap.end()) { 812 ALOGE("%s: Error: capture sequence index %d not found!", 813 __FUNCTION__, sequenceId); 814 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE); 815 return; 816 } 817 818 CallbackHolder cbh = (*it).second; 819 sp<ACameraCaptureSession> session = cbh.mSession; 820 if ((size_t) burstId >= cbh.mRequests.size()) { 821 ALOGE("%s: Error: request index %d out of bound (size %zu)", 822 __FUNCTION__, burstId, cbh.mRequests.size()); 823 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE); 824 return; 825 } 826 sp<CaptureRequest> request = cbh.mRequests[burstId]; 827 828 // Handle buffer error 829 if (errorCode == hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER) { 830 int32_t streamId = resultExtras.errorStreamId; 831 ACameraCaptureSession_captureCallback_bufferLost onBufferLost = 832 cbh.mCallbacks.onCaptureBufferLost; 833 auto outputPairIt = mConfiguredOutputs.find(streamId); 834 if (outputPairIt == mConfiguredOutputs.end()) { 835 ALOGE("%s: Error: stream id %d does not exist", __FUNCTION__, streamId); 836 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE); 837 return; 838 } 839 840 const auto& gbps = outputPairIt->second.second.getGraphicBufferProducers(); 841 for (const auto& outGbp : gbps) { 842 for (auto surface : request->mSurfaceList) { 843 if (surface->getIGraphicBufferProducer() == outGbp) { 844 ANativeWindow* anw = static_cast<ANativeWindow*>(surface.get()); 845 ALOGV("Camera %s Lost output buffer for ANW %p frame %" PRId64, 846 getId(), anw, frameNumber); 847 848 sp<AMessage> msg = new AMessage(kWhatCaptureBufferLost, mHandler); 849 msg->setPointer(kContextKey, cbh.mCallbacks.context); 850 msg->setObject(kSessionSpKey, session); 851 msg->setPointer(kCallbackFpKey, (void*) onBufferLost); 852 msg->setObject(kCaptureRequestKey, request); 853 msg->setPointer(kAnwKey, (void*) anw); 854 msg->setInt64(kFrameNumberKey, frameNumber); 855 postSessionMsgAndCleanup(msg); 856 } 857 } 858 } 859 } else { // Handle other capture failures 860 // Fire capture failure callback if there is one registered 861 ACameraCaptureSession_captureCallback_failed onError = cbh.mCallbacks.onCaptureFailed; 862 sp<CameraCaptureFailure> failure(new CameraCaptureFailure()); 863 failure->frameNumber = frameNumber; 864 // TODO: refine this when implementing flush 865 failure->reason = CAPTURE_FAILURE_REASON_ERROR; 866 failure->sequenceId = sequenceId; 867 failure->wasImageCaptured = (errorCode == 868 hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT); 869 870 sp<AMessage> msg = new AMessage(kWhatCaptureFail, mHandler); 871 msg->setPointer(kContextKey, cbh.mCallbacks.context); 872 msg->setObject(kSessionSpKey, session); 873 msg->setPointer(kCallbackFpKey, (void*) onError); 874 msg->setObject(kCaptureRequestKey, request); 875 msg->setObject(kCaptureFailureKey, failure); 876 postSessionMsgAndCleanup(msg); 877 878 // Update tracker 879 mFrameNumberTracker.updateTracker(frameNumber, /*isError*/true); 880 checkAndFireSequenceCompleteLocked(); 881 } 882 return; 883 } 884 885 void CameraDevice::CallbackHandler::onMessageReceived( 886 const sp<AMessage> &msg) { 887 switch (msg->what()) { 888 case kWhatOnDisconnected: 889 case kWhatOnError: 890 case kWhatSessionStateCb: 891 case kWhatCaptureStart: 892 case kWhatCaptureResult: 893 case kWhatCaptureFail: 894 case kWhatCaptureSeqEnd: 895 case kWhatCaptureSeqAbort: 896 case kWhatCaptureBufferLost: 897 ALOGV("%s: Received msg %d", __FUNCTION__, msg->what()); 898 break; 899 case kWhatCleanUpSessions: 900 mCachedSessions.clear(); 901 return; 902 default: 903 ALOGE("%s:Error: unknown device callback %d", __FUNCTION__, msg->what()); 904 return; 905 } 906 // Check the common part of all message 907 void* context; 908 bool found = msg->findPointer(kContextKey, &context); 909 if (!found) { 910 ALOGE("%s: Cannot find callback context!", __FUNCTION__); 911 return; 912 } 913 switch (msg->what()) { 914 case kWhatOnDisconnected: 915 { 916 ACameraDevice* dev; 917 found = msg->findPointer(kDeviceKey, (void**) &dev); 918 if (!found || dev == nullptr) { 919 ALOGE("%s: Cannot find device pointer!", __FUNCTION__); 920 return; 921 } 922 ACameraDevice_StateCallback onDisconnected; 923 found = msg->findPointer(kCallbackFpKey, (void**) &onDisconnected); 924 if (!found) { 925 ALOGE("%s: Cannot find onDisconnected!", __FUNCTION__); 926 return; 927 } 928 if (onDisconnected == nullptr) { 929 return; 930 } 931 (*onDisconnected)(context, dev); 932 break; 933 } 934 case kWhatOnError: 935 { 936 ACameraDevice* dev; 937 found = msg->findPointer(kDeviceKey, (void**) &dev); 938 if (!found || dev == nullptr) { 939 ALOGE("%s: Cannot find device pointer!", __FUNCTION__); 940 return; 941 } 942 ACameraDevice_ErrorStateCallback onError; 943 found = msg->findPointer(kCallbackFpKey, (void**) &onError); 944 if (!found) { 945 ALOGE("%s: Cannot find onError!", __FUNCTION__); 946 return; 947 } 948 int errorCode; 949 found = msg->findInt32(kErrorCodeKey, &errorCode); 950 if (!found) { 951 ALOGE("%s: Cannot find error code!", __FUNCTION__); 952 return; 953 } 954 if (onError == nullptr) { 955 return; 956 } 957 (*onError)(context, dev, errorCode); 958 break; 959 } 960 case kWhatSessionStateCb: 961 case kWhatCaptureStart: 962 case kWhatCaptureResult: 963 case kWhatCaptureFail: 964 case kWhatCaptureSeqEnd: 965 case kWhatCaptureSeqAbort: 966 case kWhatCaptureBufferLost: 967 { 968 sp<RefBase> obj; 969 found = msg->findObject(kSessionSpKey, &obj); 970 if (!found || obj == nullptr) { 971 ALOGE("%s: Cannot find session pointer!", __FUNCTION__); 972 return; 973 } 974 sp<ACameraCaptureSession> session(static_cast<ACameraCaptureSession*>(obj.get())); 975 mCachedSessions.push(session); 976 sp<CaptureRequest> requestSp = nullptr; 977 switch (msg->what()) { 978 case kWhatCaptureStart: 979 case kWhatCaptureResult: 980 case kWhatCaptureFail: 981 case kWhatCaptureBufferLost: 982 found = msg->findObject(kCaptureRequestKey, &obj); 983 if (!found) { 984 ALOGE("%s: Cannot find capture request!", __FUNCTION__); 985 return; 986 } 987 requestSp = static_cast<CaptureRequest*>(obj.get()); 988 break; 989 } 990 991 switch (msg->what()) { 992 case kWhatSessionStateCb: 993 { 994 ACameraCaptureSession_stateCallback onState; 995 found = msg->findPointer(kCallbackFpKey, (void**) &onState); 996 if (!found) { 997 ALOGE("%s: Cannot find state callback!", __FUNCTION__); 998 return; 999 } 1000 if (onState == nullptr) { 1001 return; 1002 } 1003 (*onState)(context, session.get()); 1004 break; 1005 } 1006 case kWhatCaptureStart: 1007 { 1008 ACameraCaptureSession_captureCallback_start onStart; 1009 found = msg->findPointer(kCallbackFpKey, (void**) &onStart); 1010 if (!found) { 1011 ALOGE("%s: Cannot find capture start callback!", __FUNCTION__); 1012 return; 1013 } 1014 if (onStart == nullptr) { 1015 return; 1016 } 1017 int64_t timestamp; 1018 found = msg->findInt64(kTimeStampKey, ×tamp); 1019 if (!found) { 1020 ALOGE("%s: Cannot find timestamp!", __FUNCTION__); 1021 return; 1022 } 1023 ACaptureRequest* request = allocateACaptureRequest(requestSp); 1024 (*onStart)(context, session.get(), request, timestamp); 1025 freeACaptureRequest(request); 1026 break; 1027 } 1028 case kWhatCaptureResult: 1029 { 1030 ACameraCaptureSession_captureCallback_result onResult; 1031 found = msg->findPointer(kCallbackFpKey, (void**) &onResult); 1032 if (!found) { 1033 ALOGE("%s: Cannot find capture result callback!", __FUNCTION__); 1034 return; 1035 } 1036 if (onResult == nullptr) { 1037 return; 1038 } 1039 1040 found = msg->findObject(kCaptureResultKey, &obj); 1041 if (!found) { 1042 ALOGE("%s: Cannot find capture result!", __FUNCTION__); 1043 return; 1044 } 1045 sp<ACameraMetadata> result(static_cast<ACameraMetadata*>(obj.get())); 1046 ACaptureRequest* request = allocateACaptureRequest(requestSp); 1047 (*onResult)(context, session.get(), request, result.get()); 1048 freeACaptureRequest(request); 1049 break; 1050 } 1051 case kWhatCaptureFail: 1052 { 1053 ACameraCaptureSession_captureCallback_failed onFail; 1054 found = msg->findPointer(kCallbackFpKey, (void**) &onFail); 1055 if (!found) { 1056 ALOGE("%s: Cannot find capture fail callback!", __FUNCTION__); 1057 return; 1058 } 1059 if (onFail == nullptr) { 1060 return; 1061 } 1062 1063 found = msg->findObject(kCaptureFailureKey, &obj); 1064 if (!found) { 1065 ALOGE("%s: Cannot find capture failure!", __FUNCTION__); 1066 return; 1067 } 1068 sp<CameraCaptureFailure> failureSp( 1069 static_cast<CameraCaptureFailure*>(obj.get())); 1070 ACameraCaptureFailure* failure = 1071 static_cast<ACameraCaptureFailure*>(failureSp.get()); 1072 ACaptureRequest* request = allocateACaptureRequest(requestSp); 1073 (*onFail)(context, session.get(), request, failure); 1074 freeACaptureRequest(request); 1075 break; 1076 } 1077 case kWhatCaptureSeqEnd: 1078 { 1079 ACameraCaptureSession_captureCallback_sequenceEnd onSeqEnd; 1080 found = msg->findPointer(kCallbackFpKey, (void**) &onSeqEnd); 1081 if (!found) { 1082 ALOGE("%s: Cannot find sequence end callback!", __FUNCTION__); 1083 return; 1084 } 1085 if (onSeqEnd == nullptr) { 1086 return; 1087 } 1088 int seqId; 1089 found = msg->findInt32(kSequenceIdKey, &seqId); 1090 if (!found) { 1091 ALOGE("%s: Cannot find frame number!", __FUNCTION__); 1092 return; 1093 } 1094 int64_t frameNumber; 1095 found = msg->findInt64(kFrameNumberKey, &frameNumber); 1096 if (!found) { 1097 ALOGE("%s: Cannot find frame number!", __FUNCTION__); 1098 return; 1099 } 1100 (*onSeqEnd)(context, session.get(), seqId, frameNumber); 1101 break; 1102 } 1103 case kWhatCaptureSeqAbort: 1104 { 1105 ACameraCaptureSession_captureCallback_sequenceAbort onSeqAbort; 1106 found = msg->findPointer(kCallbackFpKey, (void**) &onSeqAbort); 1107 if (!found) { 1108 ALOGE("%s: Cannot find sequence end callback!", __FUNCTION__); 1109 return; 1110 } 1111 if (onSeqAbort == nullptr) { 1112 return; 1113 } 1114 int seqId; 1115 found = msg->findInt32(kSequenceIdKey, &seqId); 1116 if (!found) { 1117 ALOGE("%s: Cannot find frame number!", __FUNCTION__); 1118 return; 1119 } 1120 (*onSeqAbort)(context, session.get(), seqId); 1121 break; 1122 } 1123 case kWhatCaptureBufferLost: 1124 { 1125 ACameraCaptureSession_captureCallback_bufferLost onBufferLost; 1126 found = msg->findPointer(kCallbackFpKey, (void**) &onBufferLost); 1127 if (!found) { 1128 ALOGE("%s: Cannot find buffer lost callback!", __FUNCTION__); 1129 return; 1130 } 1131 if (onBufferLost == nullptr) { 1132 return; 1133 } 1134 1135 ANativeWindow* anw; 1136 found = msg->findPointer(kAnwKey, (void**) &anw); 1137 if (!found) { 1138 ALOGE("%s: Cannot find ANativeWindow!", __FUNCTION__); 1139 return; 1140 } 1141 1142 int64_t frameNumber; 1143 found = msg->findInt64(kFrameNumberKey, &frameNumber); 1144 if (!found) { 1145 ALOGE("%s: Cannot find frame number!", __FUNCTION__); 1146 return; 1147 } 1148 1149 ACaptureRequest* request = allocateACaptureRequest(requestSp); 1150 (*onBufferLost)(context, session.get(), request, anw, frameNumber); 1151 freeACaptureRequest(request); 1152 break; 1153 } 1154 } 1155 break; 1156 } 1157 } 1158 } 1159 1160 CameraDevice::CallbackHolder::CallbackHolder( 1161 sp<ACameraCaptureSession> session, 1162 const Vector<sp<CaptureRequest> >& requests, 1163 bool isRepeating, 1164 ACameraCaptureSession_captureCallbacks* cbs) : 1165 mSession(session), mRequests(requests), 1166 mIsRepeating(isRepeating), mCallbacks(fillCb(cbs)) {} 1167 1168 void 1169 CameraDevice::checkRepeatingSequenceCompleteLocked( 1170 const int sequenceId, const int64_t lastFrameNumber) { 1171 ALOGV("Repeating seqId %d lastFrameNumer %" PRId64, sequenceId, lastFrameNumber); 1172 if (lastFrameNumber == NO_FRAMES_CAPTURED) { 1173 if (mSequenceCallbackMap.count(sequenceId) == 0) { 1174 ALOGW("No callback found for sequenceId %d", sequenceId); 1175 return; 1176 } 1177 // remove callback holder from callback map 1178 auto cbIt = mSequenceCallbackMap.find(sequenceId); 1179 CallbackHolder cbh = cbIt->second; 1180 mSequenceCallbackMap.erase(cbIt); 1181 // send seq aborted callback 1182 sp<AMessage> msg = new AMessage(kWhatCaptureSeqAbort, mHandler); 1183 msg->setPointer(kContextKey, cbh.mCallbacks.context); 1184 msg->setObject(kSessionSpKey, cbh.mSession); 1185 msg->setPointer(kCallbackFpKey, (void*) cbh.mCallbacks.onCaptureSequenceAborted); 1186 msg->setInt32(kSequenceIdKey, sequenceId); 1187 postSessionMsgAndCleanup(msg); 1188 } else { 1189 // Use mSequenceLastFrameNumberMap to track 1190 mSequenceLastFrameNumberMap.insert(std::make_pair(sequenceId, lastFrameNumber)); 1191 1192 // Last frame might have arrived. Check now 1193 checkAndFireSequenceCompleteLocked(); 1194 } 1195 } 1196 1197 void 1198 CameraDevice::checkAndFireSequenceCompleteLocked() { 1199 int64_t completedFrameNumber = mFrameNumberTracker.getCompletedFrameNumber(); 1200 //std::map<int, int64_t> mSequenceLastFrameNumberMap; 1201 auto it = mSequenceLastFrameNumberMap.begin(); 1202 while (it != mSequenceLastFrameNumberMap.end()) { 1203 int sequenceId = it->first; 1204 int64_t lastFrameNumber = it->second; 1205 bool seqCompleted = false; 1206 bool hasCallback = true; 1207 1208 if (mRemote == nullptr) { 1209 ALOGW("Camera %s closed while checking sequence complete", getId()); 1210 return; 1211 } 1212 1213 // Check if there is callback for this sequence 1214 // This should not happen because we always register callback (with nullptr inside) 1215 if (mSequenceCallbackMap.count(sequenceId) == 0) { 1216 ALOGW("No callback found for sequenceId %d", sequenceId); 1217 hasCallback = false; 1218 } 1219 1220 if (lastFrameNumber <= completedFrameNumber) { 1221 ALOGV("seq %d reached last frame %" PRId64 ", completed %" PRId64, 1222 sequenceId, lastFrameNumber, completedFrameNumber); 1223 seqCompleted = true; 1224 } 1225 1226 if (seqCompleted && hasCallback) { 1227 // remove callback holder from callback map 1228 auto cbIt = mSequenceCallbackMap.find(sequenceId); 1229 CallbackHolder cbh = cbIt->second; 1230 mSequenceCallbackMap.erase(cbIt); 1231 // send seq complete callback 1232 sp<AMessage> msg = new AMessage(kWhatCaptureSeqEnd, mHandler); 1233 msg->setPointer(kContextKey, cbh.mCallbacks.context); 1234 msg->setObject(kSessionSpKey, cbh.mSession); 1235 msg->setPointer(kCallbackFpKey, (void*) cbh.mCallbacks.onCaptureSequenceCompleted); 1236 msg->setInt32(kSequenceIdKey, sequenceId); 1237 msg->setInt64(kFrameNumberKey, lastFrameNumber); 1238 1239 // Clear the session sp before we send out the message 1240 // This will guarantee the rare case where the message is processed 1241 // before cbh goes out of scope and causing we call the session 1242 // destructor while holding device lock 1243 cbh.mSession.clear(); 1244 postSessionMsgAndCleanup(msg); 1245 } 1246 1247 // No need to track sequence complete if there is no callback registered 1248 if (seqCompleted || !hasCallback) { 1249 it = mSequenceLastFrameNumberMap.erase(it); 1250 } else { 1251 ++it; 1252 } 1253 } 1254 } 1255 1256 /** 1257 * Camera service callback implementation 1258 */ 1259 binder::Status 1260 CameraDevice::ServiceCallback::onDeviceError( 1261 int32_t errorCode, 1262 const CaptureResultExtras& resultExtras) { 1263 ALOGD("Device error received, code %d, frame number %" PRId64 ", request ID %d, subseq ID %d", 1264 errorCode, resultExtras.frameNumber, resultExtras.requestId, resultExtras.burstId); 1265 binder::Status ret = binder::Status::ok(); 1266 sp<CameraDevice> dev = mDevice.promote(); 1267 if (dev == nullptr) { 1268 return ret; // device has been closed 1269 } 1270 1271 sp<ACameraCaptureSession> session = dev->mCurrentSession.promote(); 1272 Mutex::Autolock _l(dev->mDeviceLock); 1273 if (dev->mRemote == nullptr) { 1274 return ret; // device has been closed 1275 } 1276 switch (errorCode) { 1277 case ERROR_CAMERA_DISCONNECTED: 1278 { 1279 // Camera is disconnected, close the session and expect no more callbacks 1280 if (session != nullptr) { 1281 session->closeByDevice(); 1282 } 1283 dev->mCurrentSession = nullptr; 1284 sp<AMessage> msg = new AMessage(kWhatOnDisconnected, dev->mHandler); 1285 msg->setPointer(kContextKey, dev->mAppCallbacks.context); 1286 msg->setPointer(kDeviceKey, (void*) dev->getWrapper()); 1287 msg->setPointer(kCallbackFpKey, (void*) dev->mAppCallbacks.onDisconnected); 1288 msg->post(); 1289 break; 1290 } 1291 default: 1292 ALOGE("Unknown error from camera device: %d", errorCode); 1293 // no break 1294 case ERROR_CAMERA_DEVICE: 1295 case ERROR_CAMERA_SERVICE: 1296 { 1297 switch (errorCode) { 1298 case ERROR_CAMERA_DEVICE: 1299 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE); 1300 break; 1301 case ERROR_CAMERA_SERVICE: 1302 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE); 1303 break; 1304 default: 1305 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_UNKNOWN); 1306 break; 1307 } 1308 sp<AMessage> msg = new AMessage(kWhatOnError, dev->mHandler); 1309 msg->setPointer(kContextKey, dev->mAppCallbacks.context); 1310 msg->setPointer(kDeviceKey, (void*) dev->getWrapper()); 1311 msg->setPointer(kCallbackFpKey, (void*) dev->mAppCallbacks.onError); 1312 msg->setInt32(kErrorCodeKey, errorCode); 1313 msg->post(); 1314 break; 1315 } 1316 case ERROR_CAMERA_REQUEST: 1317 case ERROR_CAMERA_RESULT: 1318 case ERROR_CAMERA_BUFFER: 1319 dev->onCaptureErrorLocked(errorCode, resultExtras); 1320 break; 1321 } 1322 return ret; 1323 } 1324 1325 binder::Status 1326 CameraDevice::ServiceCallback::onDeviceIdle() { 1327 ALOGV("Camera is now idle"); 1328 binder::Status ret = binder::Status::ok(); 1329 sp<CameraDevice> dev = mDevice.promote(); 1330 if (dev == nullptr) { 1331 return ret; // device has been closed 1332 } 1333 1334 Mutex::Autolock _l(dev->mDeviceLock); 1335 if (dev->isClosed() || dev->mRemote == nullptr) { 1336 return ret; 1337 } 1338 1339 if (dev->mIdle) { 1340 // Already in idle state. Possibly other thread did waitUntilIdle 1341 return ret; 1342 } 1343 1344 if (dev->mCurrentSession != nullptr) { 1345 ALOGE("onDeviceIdle sending state cb"); 1346 if (dev->mBusySession != dev->mCurrentSession) { 1347 ALOGE("Current session != busy session"); 1348 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE); 1349 return ret; 1350 } 1351 1352 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, dev->mHandler); 1353 msg->setPointer(kContextKey, dev->mBusySession->mUserSessionCallback.context); 1354 msg->setObject(kSessionSpKey, dev->mBusySession); 1355 msg->setPointer(kCallbackFpKey, (void*) dev->mBusySession->mUserSessionCallback.onReady); 1356 // Make sure we clear the sp first so the session destructor can 1357 // only happen on handler thread (where we don't hold device/session lock) 1358 dev->mBusySession.clear(); 1359 dev->postSessionMsgAndCleanup(msg); 1360 } 1361 dev->mIdle = true; 1362 dev->mFlushing = false; 1363 return ret; 1364 } 1365 1366 binder::Status 1367 CameraDevice::ServiceCallback::onCaptureStarted( 1368 const CaptureResultExtras& resultExtras, 1369 int64_t timestamp) { 1370 binder::Status ret = binder::Status::ok(); 1371 1372 sp<CameraDevice> dev = mDevice.promote(); 1373 if (dev == nullptr) { 1374 return ret; // device has been closed 1375 } 1376 Mutex::Autolock _l(dev->mDeviceLock); 1377 if (dev->isClosed() || dev->mRemote == nullptr) { 1378 return ret; 1379 } 1380 1381 int sequenceId = resultExtras.requestId; 1382 int32_t burstId = resultExtras.burstId; 1383 1384 auto it = dev->mSequenceCallbackMap.find(sequenceId); 1385 if (it != dev->mSequenceCallbackMap.end()) { 1386 CallbackHolder cbh = (*it).second; 1387 ACameraCaptureSession_captureCallback_start onStart = cbh.mCallbacks.onCaptureStarted; 1388 sp<ACameraCaptureSession> session = cbh.mSession; 1389 if ((size_t) burstId >= cbh.mRequests.size()) { 1390 ALOGE("%s: Error: request index %d out of bound (size %zu)", 1391 __FUNCTION__, burstId, cbh.mRequests.size()); 1392 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE); 1393 } 1394 sp<CaptureRequest> request = cbh.mRequests[burstId]; 1395 sp<AMessage> msg = new AMessage(kWhatCaptureStart, dev->mHandler); 1396 msg->setPointer(kContextKey, cbh.mCallbacks.context); 1397 msg->setObject(kSessionSpKey, session); 1398 msg->setPointer(kCallbackFpKey, (void*) onStart); 1399 msg->setObject(kCaptureRequestKey, request); 1400 msg->setInt64(kTimeStampKey, timestamp); 1401 dev->postSessionMsgAndCleanup(msg); 1402 } 1403 return ret; 1404 } 1405 1406 binder::Status 1407 CameraDevice::ServiceCallback::onResultReceived( 1408 const CameraMetadata& metadata, 1409 const CaptureResultExtras& resultExtras, 1410 const std::vector<PhysicalCaptureResultInfo>& physicalResultInfos) { 1411 (void) physicalResultInfos; 1412 binder::Status ret = binder::Status::ok(); 1413 1414 sp<CameraDevice> dev = mDevice.promote(); 1415 if (dev == nullptr) { 1416 return ret; // device has been closed 1417 } 1418 int sequenceId = resultExtras.requestId; 1419 int64_t frameNumber = resultExtras.frameNumber; 1420 int32_t burstId = resultExtras.burstId; 1421 bool isPartialResult = (resultExtras.partialResultCount < dev->mPartialResultCount); 1422 1423 if (!isPartialResult) { 1424 ALOGV("SeqId %d frame %" PRId64 " result arrive.", sequenceId, frameNumber); 1425 } 1426 1427 Mutex::Autolock _l(dev->mDeviceLock); 1428 if (dev->mRemote == nullptr) { 1429 return ret; // device has been disconnected 1430 } 1431 1432 if (dev->isClosed()) { 1433 if (!isPartialResult) { 1434 dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false); 1435 } 1436 // early return to avoid callback sent to closed devices 1437 return ret; 1438 } 1439 1440 CameraMetadata metadataCopy = metadata; 1441 metadataCopy.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, dev->mShadingMapSize, /*data_count*/2); 1442 metadataCopy.update(ANDROID_SYNC_FRAME_NUMBER, &frameNumber, /*data_count*/1); 1443 1444 auto it = dev->mSequenceCallbackMap.find(sequenceId); 1445 if (it != dev->mSequenceCallbackMap.end()) { 1446 CallbackHolder cbh = (*it).second; 1447 ACameraCaptureSession_captureCallback_result onResult = isPartialResult ? 1448 cbh.mCallbacks.onCaptureProgressed : 1449 cbh.mCallbacks.onCaptureCompleted; 1450 sp<ACameraCaptureSession> session = cbh.mSession; 1451 if ((size_t) burstId >= cbh.mRequests.size()) { 1452 ALOGE("%s: Error: request index %d out of bound (size %zu)", 1453 __FUNCTION__, burstId, cbh.mRequests.size()); 1454 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE); 1455 } 1456 sp<CaptureRequest> request = cbh.mRequests[burstId]; 1457 sp<ACameraMetadata> result(new ACameraMetadata( 1458 metadataCopy.release(), ACameraMetadata::ACM_RESULT)); 1459 1460 sp<AMessage> msg = new AMessage(kWhatCaptureResult, dev->mHandler); 1461 msg->setPointer(kContextKey, cbh.mCallbacks.context); 1462 msg->setObject(kSessionSpKey, session); 1463 msg->setPointer(kCallbackFpKey, (void*) onResult); 1464 msg->setObject(kCaptureRequestKey, request); 1465 msg->setObject(kCaptureResultKey, result); 1466 dev->postSessionMsgAndCleanup(msg); 1467 } 1468 1469 if (!isPartialResult) { 1470 dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false); 1471 dev->checkAndFireSequenceCompleteLocked(); 1472 } 1473 1474 return ret; 1475 } 1476 1477 binder::Status 1478 CameraDevice::ServiceCallback::onPrepared(int) { 1479 // Prepare not yet implemented in NDK 1480 return binder::Status::ok(); 1481 } 1482 1483 binder::Status 1484 CameraDevice::ServiceCallback::onRequestQueueEmpty() { 1485 // onRequestQueueEmpty not yet implemented in NDK 1486 return binder::Status::ok(); 1487 } 1488 1489 binder::Status 1490 CameraDevice::ServiceCallback::onRepeatingRequestError( 1491 int64_t lastFrameNumber, int32_t stoppedSequenceId) { 1492 binder::Status ret = binder::Status::ok(); 1493 1494 sp<CameraDevice> dev = mDevice.promote(); 1495 if (dev == nullptr) { 1496 return ret; // device has been closed 1497 } 1498 1499 Mutex::Autolock _l(dev->mDeviceLock); 1500 1501 int repeatingSequenceId = dev->mRepeatingSequenceId; 1502 if (stoppedSequenceId == repeatingSequenceId) { 1503 dev->mRepeatingSequenceId = REQUEST_ID_NONE; 1504 } 1505 1506 dev->checkRepeatingSequenceCompleteLocked(repeatingSequenceId, lastFrameNumber); 1507 1508 return ret; 1509 } 1510 1511 1512 } // namespace android 1513