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