ACameraDevice.cpp revision e081c59aeb309f5d91b99c433fc252e4570d4db8
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
30using namespace android;
31
32namespace android {
33// Static member definitions
34const char* CameraDevice::kContextKey        = "Context";
35const char* CameraDevice::kDeviceKey         = "Device";
36const char* CameraDevice::kErrorCodeKey      = "ErrorCode";
37const char* CameraDevice::kCallbackFpKey     = "Callback";
38const char* CameraDevice::kSessionSpKey      = "SessionSp";
39const char* CameraDevice::kCaptureRequestKey = "CaptureRequest";
40const char* CameraDevice::kTimeStampKey      = "TimeStamp";
41const char* CameraDevice::kCaptureResultKey  = "CaptureResult";
42const char* CameraDevice::kCaptureFailureKey = "CaptureFailure";
43const char* CameraDevice::kSequenceIdKey     = "SequenceId";
44const char* CameraDevice::kFrameNumberKey    = "FrameNumber";
45const char* CameraDevice::kAnwKey            = "Anw";
46
47/**
48 * CameraDevice Implementation
49 */
50CameraDevice::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
100CameraDevice::~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?
114camera_status_t
115CameraDevice::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_UNSUPPORTED;
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
144camera_status_t
145CameraDevice::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
178camera_status_t
179CameraDevice::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
188camera_status_t
189CameraDevice::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
198camera_status_t
199CameraDevice::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
278camera_status_t
279CameraDevice::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
300ACaptureRequest*
301CameraDevice::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
314void
315CameraDevice::freeACaptureRequest(ACaptureRequest* req) {
316    if (req == nullptr) {
317        return;
318    }
319    delete req->settings;
320    delete req->targets;
321    delete req;
322}
323
324void
325CameraDevice::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
351void
352CameraDevice::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
370camera_status_t
371CameraDevice::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.isOk()) {
384            ALOGE("Stop repeating request fails in remote: %s", remoteRet.toString8().string());
385            return ACAMERA_ERROR_UNKNOWN;
386        }
387        checkRepeatingSequenceCompleteLocked(repeatingSequenceId, lastFrameNumber);
388    }
389    return ACAMERA_OK;
390}
391
392camera_status_t
393CameraDevice::flushLocked(ACameraCaptureSession* session) {
394    camera_status_t ret = checkCameraClosedOrErrorLocked();
395    if (ret != ACAMERA_OK) {
396        ALOGE("Camera %s abort captures failed! ret %d", getId(), ret);
397        return ret;
398    }
399
400    // This should never happen because creating a new session will close
401    // previous one and thus reject any API call from previous session.
402    // But still good to check here in case something unexpected happen.
403    if (session != mCurrentSession) {
404        ALOGE("Camera %s session %p is not current active session!", getId(), session);
405        return ACAMERA_ERROR_INVALID_OPERATION;
406    }
407
408    if (mFlushing) {
409        ALOGW("Camera %s is already aborting captures", getId());
410        return ACAMERA_OK;
411    }
412
413    mFlushing = true;
414    // Send onActive callback to guarantee there is always active->ready transition
415    sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
416    msg->setPointer(kContextKey, session->mUserSessionCallback.context);
417    msg->setObject(kSessionSpKey, session);
418    msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onActive);
419    msg->post();
420
421    // If device is already idling, send callback and exit early
422    if (mIdle) {
423        sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
424        msg->setPointer(kContextKey, session->mUserSessionCallback.context);
425        msg->setObject(kSessionSpKey, session);
426        msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onReady);
427        msg->post();
428        mFlushing = false;
429        return ACAMERA_OK;
430    }
431
432    int64_t lastFrameNumber;
433    binder::Status remoteRet = mRemote->flush(&lastFrameNumber);
434    if (!remoteRet.isOk()) {
435        ALOGE("Abort captures fails in remote: %s", remoteRet.toString8().string());
436        return ACAMERA_ERROR_UNKNOWN;
437    }
438    if (mRepeatingSequenceId != REQUEST_ID_NONE) {
439        checkRepeatingSequenceCompleteLocked(mRepeatingSequenceId, lastFrameNumber);
440    }
441    return ACAMERA_OK;
442}
443
444camera_status_t
445CameraDevice::waitUntilIdleLocked() {
446    camera_status_t ret = checkCameraClosedOrErrorLocked();
447    if (ret != ACAMERA_OK) {
448        ALOGE("Wait until camera %s idle failed! ret %d", getId(), ret);
449        return ret;
450    }
451
452    if (mRepeatingSequenceId != REQUEST_ID_NONE) {
453        ALOGE("Camera device %s won't go to idle when there is repeating request!", getId());
454        return ACAMERA_ERROR_INVALID_OPERATION;
455    }
456
457    binder::Status remoteRet = mRemote->waitUntilIdle();
458    if (!remoteRet.isOk()) {
459        ALOGE("Camera device %s waitUntilIdle failed: %s", getId(), remoteRet.toString8().string());
460        // TODO: define a function to convert status_t -> camera_status_t
461        return ACAMERA_ERROR_UNKNOWN;
462    }
463
464    return ACAMERA_OK;
465}
466
467camera_status_t
468CameraDevice::getIGBPfromAnw(
469        ANativeWindow* anw,
470        sp<IGraphicBufferProducer>& out) {
471    if (anw == nullptr) {
472        ALOGE("Error: output ANativeWindow is null");
473        return ACAMERA_ERROR_INVALID_PARAMETER;
474    }
475    int value;
476    int err = (*anw->query)(anw, NATIVE_WINDOW_CONCRETE_TYPE, &value);
477    if (err != OK || value != NATIVE_WINDOW_SURFACE) {
478        ALOGE("Error: ANativeWindow is not backed by Surface!");
479        return ACAMERA_ERROR_INVALID_PARAMETER;
480    }
481    const sp<Surface> surface(static_cast<Surface*>(anw));
482    out = surface->getIGraphicBufferProducer();
483    return ACAMERA_OK;
484}
485
486camera_status_t
487CameraDevice::getSurfaceFromANativeWindow(
488        ANativeWindow* anw, sp<Surface>& out) {
489    if (anw == nullptr) {
490        ALOGE("Error: output ANativeWindow is null");
491        return ACAMERA_ERROR_INVALID_PARAMETER;
492    }
493    int value;
494    int err = (*anw->query)(anw, NATIVE_WINDOW_CONCRETE_TYPE, &value);
495    if (err != OK || value != NATIVE_WINDOW_SURFACE) {
496        ALOGE("Error: ANativeWindow is not backed by Surface!");
497        return ACAMERA_ERROR_INVALID_PARAMETER;
498    }
499    sp<Surface> surface(static_cast<Surface*>(anw));
500    out = surface;
501    return ACAMERA_OK;
502}
503
504camera_status_t
505CameraDevice::configureStreamsLocked(const ACaptureSessionOutputContainer* outputs) {
506    ACaptureSessionOutputContainer emptyOutput;
507    if (outputs == nullptr) {
508        outputs = &emptyOutput;
509    }
510
511    camera_status_t ret = checkCameraClosedOrErrorLocked();
512    if (ret != ACAMERA_OK) {
513        return ret;
514    }
515
516    std::set<std::pair<ANativeWindow*, OutputConfiguration>> outputSet;
517    for (auto outConfig : outputs->mOutputs) {
518        ANativeWindow* anw = outConfig.mWindow;
519        sp<IGraphicBufferProducer> iGBP(nullptr);
520        ret = getIGBPfromAnw(anw, iGBP);
521        if (ret != ACAMERA_OK) {
522            return ret;
523        }
524        outputSet.insert(std::make_pair(
525                anw, OutputConfiguration(iGBP, outConfig.mRotation)));
526    }
527    auto addSet = outputSet;
528    std::vector<int> deleteList;
529
530    // Determine which streams need to be created, which to be deleted
531    for (auto& kvPair : mConfiguredOutputs) {
532        int streamId = kvPair.first;
533        auto& outputPair = kvPair.second;
534        if (outputSet.count(outputPair) == 0) {
535            deleteList.push_back(streamId); // Need to delete a no longer needed stream
536        } else {
537            addSet.erase(outputPair);        // No need to add already existing stream
538        }
539    }
540
541    ret = stopRepeatingLocked();
542    if (ret != ACAMERA_OK) {
543        ALOGE("Camera device %s stop repeating failed, ret %d", getId(), ret);
544        return ret;
545    }
546
547    ret = waitUntilIdleLocked();
548    if (ret != ACAMERA_OK) {
549        ALOGE("Camera device %s wait until idle failed, ret %d", getId(), ret);
550        return ret;
551    }
552
553    // Send onReady to previous session
554    // CurrentSession will be updated after configureStreamLocked, so here
555    // mCurrentSession is the session to be replaced by a new session
556    if (!mIdle && mCurrentSession != nullptr) {
557        if (mBusySession != mCurrentSession) {
558            ALOGE("Current session != busy session");
559            setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
560            return ACAMERA_ERROR_CAMERA_DEVICE;
561        }
562        sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
563        msg->setPointer(kContextKey, mBusySession->mUserSessionCallback.context);
564        msg->setObject(kSessionSpKey, mBusySession);
565        msg->setPointer(kCallbackFpKey, (void*) mBusySession->mUserSessionCallback.onReady);
566        mBusySession.clear();
567        msg->post();
568    }
569    mIdle = true;
570
571    binder::Status remoteRet = mRemote->beginConfigure();
572    if (!remoteRet.isOk()) {
573        ALOGE("Camera device %s begin configure failed: %s", getId(), remoteRet.toString8().string());
574        return ACAMERA_ERROR_UNKNOWN;
575    }
576
577    // delete to-be-deleted streams
578    for (auto streamId : deleteList) {
579        remoteRet = mRemote->deleteStream(streamId);
580        if (!remoteRet.isOk()) {
581            ALOGE("Camera device %s failed to remove stream %d: %s", getId(), streamId,
582                    remoteRet.toString8().string());
583            return ACAMERA_ERROR_UNKNOWN;
584        }
585        mConfiguredOutputs.erase(streamId);
586    }
587
588    // add new streams
589    for (auto outputPair : addSet) {
590        int streamId;
591        remoteRet = mRemote->createStream(outputPair.second, &streamId);
592        if (!remoteRet.isOk()) {
593            ALOGE("Camera device %s failed to create stream: %s", getId(),
594                    remoteRet.toString8().string());
595            return ACAMERA_ERROR_UNKNOWN;
596        }
597        mConfiguredOutputs.insert(std::make_pair(streamId, outputPair));
598    }
599
600    remoteRet = mRemote->endConfigure(/*isConstrainedHighSpeed*/ false);
601    if (remoteRet.serviceSpecificErrorCode() == hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) {
602        ALOGE("Camera device %s cannnot support app output configuration: %s", getId(),
603                remoteRet.toString8().string());
604        return ACAMERA_ERROR_STREAM_CONFIGURE_FAIL;
605    } else if (!remoteRet.isOk()) {
606        ALOGE("Camera device %s end configure failed: %s", getId(), remoteRet.toString8().string());
607        return ACAMERA_ERROR_UNKNOWN;
608    }
609
610    return ACAMERA_OK;
611}
612
613void
614CameraDevice::setRemoteDevice(sp<hardware::camera2::ICameraDeviceUser> remote) {
615    Mutex::Autolock _l(mDeviceLock);
616    mRemote = remote;
617}
618
619camera_status_t
620CameraDevice::checkCameraClosedOrErrorLocked() const {
621    if (mRemote == nullptr) {
622        ALOGE("%s: camera device already closed", __FUNCTION__);
623        return ACAMERA_ERROR_CAMERA_DISCONNECTED;
624    }
625    if (mInError) {// triggered by onDeviceError
626        ALOGE("%s: camera device has encountered a serious error", __FUNCTION__);
627        return mError;
628    }
629    return ACAMERA_OK;
630}
631
632void
633CameraDevice::setCameraDeviceErrorLocked(camera_status_t error) {
634    mInError = true;
635    mError = error;
636    return;
637}
638
639void
640CameraDevice::FrameNumberTracker::updateTracker(int64_t frameNumber, bool isError) {
641    ALOGV("updateTracker frame %" PRId64 " isError %d", frameNumber, isError);
642    if (isError) {
643        mFutureErrorSet.insert(frameNumber);
644    } else if (frameNumber <= mCompletedFrameNumber) {
645        ALOGE("Frame number %" PRId64 " decreased! current fn %" PRId64,
646                frameNumber, mCompletedFrameNumber);
647        return;
648    } else {
649        if (frameNumber != mCompletedFrameNumber + 1) {
650            ALOGE("Frame number out of order. Expect %" PRId64 " but get %" PRId64,
651                    mCompletedFrameNumber + 1, frameNumber);
652            // Do not assert as in java implementation
653        }
654        mCompletedFrameNumber = frameNumber;
655    }
656    update();
657}
658
659void
660CameraDevice::FrameNumberTracker::update() {
661    for (auto it = mFutureErrorSet.begin(); it != mFutureErrorSet.end();) {
662        int64_t errorFrameNumber = *it;
663        if (errorFrameNumber == mCompletedFrameNumber + 1) {
664            mCompletedFrameNumber++;
665            it = mFutureErrorSet.erase(it);
666        } else if (errorFrameNumber <= mCompletedFrameNumber) {
667            // This should not happen, but deal with it anyway
668            ALOGE("Completd frame number passed through current frame number!");
669            // erase the old error since it's no longer useful
670            it = mFutureErrorSet.erase(it);
671        } else {
672            // Normal requests hasn't catched up error frames, just break
673            break;
674        }
675    }
676    ALOGV("Update complete frame %" PRId64, mCompletedFrameNumber);
677}
678
679void
680CameraDevice::onCaptureErrorLocked(
681        int32_t errorCode,
682        const CaptureResultExtras& resultExtras) {
683    int sequenceId = resultExtras.requestId;
684    int64_t frameNumber = resultExtras.frameNumber;
685    int32_t burstId = resultExtras.burstId;
686    auto it = mSequenceCallbackMap.find(sequenceId);
687    if (it == mSequenceCallbackMap.end()) {
688        ALOGE("%s: Error: capture sequence index %d not found!",
689                __FUNCTION__, sequenceId);
690        setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
691        return;
692    }
693
694    CallbackHolder cbh = (*it).second;
695    sp<ACameraCaptureSession> session = cbh.mSession;
696    if ((size_t) burstId >= cbh.mRequests.size()) {
697        ALOGE("%s: Error: request index %d out of bound (size %zu)",
698                __FUNCTION__, burstId, cbh.mRequests.size());
699        setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
700        return;
701    }
702    sp<CaptureRequest> request = cbh.mRequests[burstId];
703
704    // Handle buffer error
705    if (errorCode == hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER) {
706        int32_t streamId = resultExtras.errorStreamId;
707        ACameraCaptureSession_captureCallback_bufferLost onBufferLost =
708                cbh.mCallbacks.onCaptureBufferLost;
709        auto outputPairIt = mConfiguredOutputs.find(streamId);
710        if (outputPairIt == mConfiguredOutputs.end()) {
711            ALOGE("%s: Error: stream id %d does not exist", __FUNCTION__, streamId);
712            setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
713            return;
714        }
715        ANativeWindow* anw = outputPairIt->second.first;
716
717        ALOGV("Camera %s Lost output buffer for ANW %p frame %" PRId64,
718                getId(), anw, frameNumber);
719
720        sp<AMessage> msg = new AMessage(kWhatCaptureBufferLost, mHandler);
721        msg->setPointer(kContextKey, cbh.mCallbacks.context);
722        msg->setObject(kSessionSpKey, session);
723        msg->setPointer(kCallbackFpKey, (void*) onBufferLost);
724        msg->setObject(kCaptureRequestKey, request);
725        msg->setPointer(kAnwKey, (void*) anw);
726        msg->setInt64(kFrameNumberKey, frameNumber);
727        msg->post();
728    } else { // Handle other capture failures
729        // Fire capture failure callback if there is one registered
730        ACameraCaptureSession_captureCallback_failed onError = cbh.mCallbacks.onCaptureFailed;
731        sp<CameraCaptureFailure> failure(new CameraCaptureFailure());
732        failure->frameNumber = frameNumber;
733        // TODO: refine this when implementing flush
734        failure->reason      = CAPTURE_FAILURE_REASON_ERROR;
735        failure->sequenceId  = sequenceId;
736        failure->wasImageCaptured = (errorCode ==
737                hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT);
738
739        sp<AMessage> msg = new AMessage(kWhatCaptureFail, mHandler);
740        msg->setPointer(kContextKey, cbh.mCallbacks.context);
741        msg->setObject(kSessionSpKey, session);
742        msg->setPointer(kCallbackFpKey, (void*) onError);
743        msg->setObject(kCaptureRequestKey, request);
744        msg->setObject(kCaptureFailureKey, failure);
745        msg->post();
746
747        // Update tracker
748        mFrameNumberTracker.updateTracker(frameNumber, /*isError*/true);
749        checkAndFireSequenceCompleteLocked();
750    }
751    return;
752}
753
754void CameraDevice::CallbackHandler::onMessageReceived(
755        const sp<AMessage> &msg) {
756    switch (msg->what()) {
757        case kWhatOnDisconnected:
758        case kWhatOnError:
759        case kWhatSessionStateCb:
760        case kWhatCaptureStart:
761        case kWhatCaptureResult:
762        case kWhatCaptureFail:
763        case kWhatCaptureSeqEnd:
764        case kWhatCaptureSeqAbort:
765        case kWhatCaptureBufferLost:
766            ALOGV("%s: Received msg %d", __FUNCTION__, msg->what());
767            break;
768        default:
769            ALOGE("%s:Error: unknown device callback %d", __FUNCTION__, msg->what());
770            return;
771    }
772    // Check the common part of all message
773    void* context;
774    bool found = msg->findPointer(kContextKey, &context);
775    if (!found) {
776        ALOGE("%s: Cannot find callback context!", __FUNCTION__);
777        return;
778    }
779    switch (msg->what()) {
780        case kWhatOnDisconnected:
781        {
782            ACameraDevice* dev;
783            found = msg->findPointer(kDeviceKey, (void**) &dev);
784            if (!found || dev == nullptr) {
785                ALOGE("%s: Cannot find device pointer!", __FUNCTION__);
786                return;
787            }
788            ACameraDevice_StateCallback onDisconnected;
789            found = msg->findPointer(kCallbackFpKey, (void**) &onDisconnected);
790            if (!found) {
791                ALOGE("%s: Cannot find onDisconnected!", __FUNCTION__);
792                return;
793            }
794            if (onDisconnected == nullptr) {
795                return;
796            }
797            (*onDisconnected)(context, dev);
798            break;
799        }
800        case kWhatOnError:
801        {
802            ACameraDevice* dev;
803            found = msg->findPointer(kDeviceKey, (void**) &dev);
804            if (!found || dev == nullptr) {
805                ALOGE("%s: Cannot find device pointer!", __FUNCTION__);
806                return;
807            }
808            ACameraDevice_ErrorStateCallback onError;
809            found = msg->findPointer(kCallbackFpKey, (void**) &onError);
810            if (!found) {
811                ALOGE("%s: Cannot find onError!", __FUNCTION__);
812                return;
813            }
814            int errorCode;
815            found = msg->findInt32(kErrorCodeKey, &errorCode);
816            if (!found) {
817                ALOGE("%s: Cannot find error code!", __FUNCTION__);
818                return;
819            }
820            if (onError == nullptr) {
821                return;
822            }
823            (*onError)(context, dev, errorCode);
824            break;
825        }
826        case kWhatSessionStateCb:
827        case kWhatCaptureStart:
828        case kWhatCaptureResult:
829        case kWhatCaptureFail:
830        case kWhatCaptureSeqEnd:
831        case kWhatCaptureSeqAbort:
832        case kWhatCaptureBufferLost:
833        {
834            sp<RefBase> obj;
835            found = msg->findObject(kSessionSpKey, &obj);
836            if (!found || obj == nullptr) {
837                ALOGE("%s: Cannot find session pointer!", __FUNCTION__);
838                return;
839            }
840            sp<ACameraCaptureSession> session(static_cast<ACameraCaptureSession*>(obj.get()));
841            sp<CaptureRequest> requestSp = nullptr;
842            switch (msg->what()) {
843                case kWhatCaptureStart:
844                case kWhatCaptureResult:
845                case kWhatCaptureFail:
846                case kWhatCaptureBufferLost:
847                    found = msg->findObject(kCaptureRequestKey, &obj);
848                    if (!found) {
849                        ALOGE("%s: Cannot find capture request!", __FUNCTION__);
850                        return;
851                    }
852                    requestSp = static_cast<CaptureRequest*>(obj.get());
853                    break;
854            }
855
856            switch (msg->what()) {
857                case kWhatSessionStateCb:
858                {
859                    ACameraCaptureSession_stateCallback onState;
860                    found = msg->findPointer(kCallbackFpKey, (void**) &onState);
861                    if (!found) {
862                        ALOGE("%s: Cannot find state callback!", __FUNCTION__);
863                        return;
864                    }
865                    if (onState == nullptr) {
866                        return;
867                    }
868                    (*onState)(context, session.get());
869                    break;
870                }
871                case kWhatCaptureStart:
872                {
873                    ACameraCaptureSession_captureCallback_start onStart;
874                    found = msg->findPointer(kCallbackFpKey, (void**) &onStart);
875                    if (!found) {
876                        ALOGE("%s: Cannot find capture start callback!", __FUNCTION__);
877                        return;
878                    }
879                    if (onStart == nullptr) {
880                        return;
881                    }
882                    int64_t timestamp;
883                    found = msg->findInt64(kTimeStampKey, &timestamp);
884                    if (!found) {
885                        ALOGE("%s: Cannot find timestamp!", __FUNCTION__);
886                        return;
887                    }
888                    ACaptureRequest* request = allocateACaptureRequest(requestSp);
889                    (*onStart)(context, session.get(), request, timestamp);
890                    freeACaptureRequest(request);
891                    break;
892                }
893                case kWhatCaptureResult:
894                {
895                    ACameraCaptureSession_captureCallback_result onResult;
896                    found = msg->findPointer(kCallbackFpKey, (void**) &onResult);
897                    if (!found) {
898                        ALOGE("%s: Cannot find capture result callback!", __FUNCTION__);
899                        return;
900                    }
901                    if (onResult == nullptr) {
902                        return;
903                    }
904
905                    found = msg->findObject(kCaptureResultKey, &obj);
906                    if (!found) {
907                        ALOGE("%s: Cannot find capture result!", __FUNCTION__);
908                        return;
909                    }
910                    sp<ACameraMetadata> result(static_cast<ACameraMetadata*>(obj.get()));
911                    ACaptureRequest* request = allocateACaptureRequest(requestSp);
912                    (*onResult)(context, session.get(), request, result.get());
913                    freeACaptureRequest(request);
914                    break;
915                }
916                case kWhatCaptureFail:
917                {
918                    ACameraCaptureSession_captureCallback_failed onFail;
919                    found = msg->findPointer(kCallbackFpKey, (void**) &onFail);
920                    if (!found) {
921                        ALOGE("%s: Cannot find capture fail callback!", __FUNCTION__);
922                        return;
923                    }
924                    if (onFail == nullptr) {
925                        return;
926                    }
927
928                    found = msg->findObject(kCaptureFailureKey, &obj);
929                    if (!found) {
930                        ALOGE("%s: Cannot find capture failure!", __FUNCTION__);
931                        return;
932                    }
933                    sp<CameraCaptureFailure> failureSp(
934                            static_cast<CameraCaptureFailure*>(obj.get()));
935                    ACameraCaptureFailure* failure =
936                            static_cast<ACameraCaptureFailure*>(failureSp.get());
937                    ACaptureRequest* request = allocateACaptureRequest(requestSp);
938                    (*onFail)(context, session.get(), request, failure);
939                    freeACaptureRequest(request);
940                    delete failure;
941                    break;
942                }
943                case kWhatCaptureSeqEnd:
944                {
945                    ACameraCaptureSession_captureCallback_sequenceEnd onSeqEnd;
946                    found = msg->findPointer(kCallbackFpKey, (void**) &onSeqEnd);
947                    if (!found) {
948                        ALOGE("%s: Cannot find sequence end callback!", __FUNCTION__);
949                        return;
950                    }
951                    if (onSeqEnd == nullptr) {
952                        return;
953                    }
954                    int seqId;
955                    found = msg->findInt32(kSequenceIdKey, &seqId);
956                    if (!found) {
957                        ALOGE("%s: Cannot find frame number!", __FUNCTION__);
958                        return;
959                    }
960                    int64_t frameNumber;
961                    found = msg->findInt64(kFrameNumberKey, &frameNumber);
962                    if (!found) {
963                        ALOGE("%s: Cannot find frame number!", __FUNCTION__);
964                        return;
965                    }
966                    (*onSeqEnd)(context, session.get(), seqId, frameNumber);
967                    break;
968                }
969                case kWhatCaptureSeqAbort:
970                {
971                    ACameraCaptureSession_captureCallback_sequenceAbort onSeqAbort;
972                    found = msg->findPointer(kCallbackFpKey, (void**) &onSeqAbort);
973                    if (!found) {
974                        ALOGE("%s: Cannot find sequence end callback!", __FUNCTION__);
975                        return;
976                    }
977                    if (onSeqAbort == nullptr) {
978                        return;
979                    }
980                    int seqId;
981                    found = msg->findInt32(kSequenceIdKey, &seqId);
982                    if (!found) {
983                        ALOGE("%s: Cannot find frame number!", __FUNCTION__);
984                        return;
985                    }
986                    (*onSeqAbort)(context, session.get(), seqId);
987                    break;
988                }
989                case kWhatCaptureBufferLost:
990                {
991                    ACameraCaptureSession_captureCallback_bufferLost onBufferLost;
992                    found = msg->findPointer(kCallbackFpKey, (void**) &onBufferLost);
993                    if (!found) {
994                        ALOGE("%s: Cannot find buffer lost callback!", __FUNCTION__);
995                        return;
996                    }
997                    if (onBufferLost == nullptr) {
998                        return;
999                    }
1000
1001                    ANativeWindow* anw;
1002                    found = msg->findPointer(kAnwKey, (void**) &anw);
1003                    if (!found) {
1004                        ALOGE("%s: Cannot find ANativeWindow!", __FUNCTION__);
1005                        return;
1006                    }
1007
1008                    int64_t frameNumber;
1009                    found = msg->findInt64(kFrameNumberKey, &frameNumber);
1010                    if (!found) {
1011                        ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1012                        return;
1013                    }
1014
1015                    ACaptureRequest* request = allocateACaptureRequest(requestSp);
1016                    (*onBufferLost)(context, session.get(), request, anw, frameNumber);
1017                    freeACaptureRequest(request);
1018                    break;
1019                }
1020            }
1021            break;
1022        }
1023    }
1024}
1025
1026CameraDevice::CallbackHolder::CallbackHolder(
1027    sp<ACameraCaptureSession>          session,
1028    const Vector<sp<CaptureRequest> >& requests,
1029    bool                               isRepeating,
1030    ACameraCaptureSession_captureCallbacks* cbs) :
1031    mSession(session), mRequests(requests),
1032    mIsRepeating(isRepeating), mCallbacks(fillCb(cbs)) {}
1033
1034void
1035CameraDevice::checkRepeatingSequenceCompleteLocked(
1036    const int sequenceId, const int64_t lastFrameNumber) {
1037    ALOGV("Repeating seqId %d lastFrameNumer %" PRId64, sequenceId, lastFrameNumber);
1038    if (lastFrameNumber == NO_FRAMES_CAPTURED) {
1039        if (mSequenceCallbackMap.count(sequenceId) == 0) {
1040            ALOGW("No callback found for sequenceId %d", sequenceId);
1041            return;
1042        }
1043        // remove callback holder from callback map
1044        auto cbIt = mSequenceCallbackMap.find(sequenceId);
1045        CallbackHolder cbh = cbIt->second;
1046        mSequenceCallbackMap.erase(cbIt);
1047        // send seq aborted callback
1048        sp<AMessage> msg = new AMessage(kWhatCaptureSeqAbort, mHandler);
1049        msg->setPointer(kContextKey, cbh.mCallbacks.context);
1050        msg->setObject(kSessionSpKey, cbh.mSession);
1051        msg->setPointer(kCallbackFpKey, (void*) cbh.mCallbacks.onCaptureSequenceAborted);
1052        msg->setInt32(kSequenceIdKey, sequenceId);
1053        msg->post();
1054    } else {
1055        // Use mSequenceLastFrameNumberMap to track
1056        mSequenceLastFrameNumberMap.insert(std::make_pair(sequenceId, lastFrameNumber));
1057
1058        // Last frame might have arrived. Check now
1059        checkAndFireSequenceCompleteLocked();
1060    }
1061}
1062
1063void
1064CameraDevice::checkAndFireSequenceCompleteLocked() {
1065    int64_t completedFrameNumber = mFrameNumberTracker.getCompletedFrameNumber();
1066    //std::map<int, int64_t> mSequenceLastFrameNumberMap;
1067    auto it = mSequenceLastFrameNumberMap.begin();
1068    while (it != mSequenceLastFrameNumberMap.end()) {
1069        int sequenceId = it->first;
1070        int64_t lastFrameNumber = it->second;
1071        bool seqCompleted = false;
1072        bool hasCallback  = true;
1073
1074        if (mRemote == nullptr) {
1075            ALOGW("Camera %s closed while checking sequence complete", getId());
1076            return;
1077        }
1078
1079        // Check if there is callback for this sequence
1080        // This should not happen because we always register callback (with nullptr inside)
1081        if (mSequenceCallbackMap.count(sequenceId) == 0) {
1082            ALOGW("No callback found for sequenceId %d", sequenceId);
1083            hasCallback = false;
1084        }
1085
1086        if (lastFrameNumber <= completedFrameNumber) {
1087            ALOGV("seq %d reached last frame %" PRId64 ", completed %" PRId64,
1088                    sequenceId, lastFrameNumber, completedFrameNumber);
1089            seqCompleted = true;
1090        }
1091
1092        if (seqCompleted && hasCallback) {
1093            // remove callback holder from callback map
1094            auto cbIt = mSequenceCallbackMap.find(sequenceId);
1095            CallbackHolder cbh = cbIt->second;
1096            mSequenceCallbackMap.erase(cbIt);
1097            // send seq complete callback
1098            sp<AMessage> msg = new AMessage(kWhatCaptureSeqEnd, mHandler);
1099            msg->setPointer(kContextKey, cbh.mCallbacks.context);
1100            msg->setObject(kSessionSpKey, cbh.mSession);
1101            msg->setPointer(kCallbackFpKey, (void*) cbh.mCallbacks.onCaptureSequenceCompleted);
1102            msg->setInt32(kSequenceIdKey, sequenceId);
1103            msg->setInt64(kFrameNumberKey, lastFrameNumber);
1104
1105            // Clear the session sp before we send out the message
1106            // This will guarantee the rare case where the message is processed
1107            // before cbh goes out of scope and causing we call the session
1108            // destructor while holding device lock
1109            cbh.mSession.clear();
1110            msg->post();
1111        }
1112
1113        // No need to track sequence complete if there is no callback registered
1114        if (seqCompleted || !hasCallback) {
1115            it = mSequenceLastFrameNumberMap.erase(it);
1116        } else {
1117            ++it;
1118        }
1119    }
1120}
1121
1122/**
1123  * Camera service callback implementation
1124  */
1125binder::Status
1126CameraDevice::ServiceCallback::onDeviceError(
1127        int32_t errorCode,
1128        const CaptureResultExtras& resultExtras) {
1129    ALOGD("Device error received, code %d, frame number %" PRId64 ", request ID %d, subseq ID %d",
1130            errorCode, resultExtras.frameNumber, resultExtras.requestId, resultExtras.burstId);
1131    binder::Status ret = binder::Status::ok();
1132    sp<CameraDevice> dev = mDevice.promote();
1133    if (dev == nullptr) {
1134        return ret; // device has been closed
1135    }
1136
1137    Mutex::Autolock _l(dev->mDeviceLock);
1138    if (dev->mRemote == nullptr) {
1139        return ret; // device has been closed
1140    }
1141    switch (errorCode) {
1142        case ERROR_CAMERA_DISCONNECTED:
1143        {
1144            // Camera is disconnected, close the session and expect no more callbacks
1145            if (dev->mCurrentSession != nullptr) {
1146                dev->mCurrentSession->closeByDevice();
1147                dev->mCurrentSession = nullptr;
1148            }
1149            sp<AMessage> msg = new AMessage(kWhatOnDisconnected, dev->mHandler);
1150            msg->setPointer(kContextKey, dev->mAppCallbacks.context);
1151            msg->setPointer(kDeviceKey, (void*) dev->getWrapper());
1152            msg->setPointer(kCallbackFpKey, (void*) dev->mAppCallbacks.onDisconnected);
1153            msg->post();
1154            break;
1155        }
1156        default:
1157            ALOGE("Unknown error from camera device: %d", errorCode);
1158            // no break
1159        case ERROR_CAMERA_DEVICE:
1160        case ERROR_CAMERA_SERVICE:
1161        {
1162            switch (errorCode) {
1163                case ERROR_CAMERA_DEVICE:
1164                    dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
1165                    break;
1166                case ERROR_CAMERA_SERVICE:
1167                    dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
1168                    break;
1169                default:
1170                    dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_UNKNOWN);
1171                    break;
1172            }
1173            sp<AMessage> msg = new AMessage(kWhatOnError, dev->mHandler);
1174            msg->setPointer(kContextKey, dev->mAppCallbacks.context);
1175            msg->setPointer(kDeviceKey, (void*) dev->getWrapper());
1176            msg->setPointer(kCallbackFpKey, (void*) dev->mAppCallbacks.onError);
1177            msg->setInt32(kErrorCodeKey, errorCode);
1178            msg->post();
1179            break;
1180        }
1181        case ERROR_CAMERA_REQUEST:
1182        case ERROR_CAMERA_RESULT:
1183        case ERROR_CAMERA_BUFFER:
1184            dev->onCaptureErrorLocked(errorCode, resultExtras);
1185            break;
1186    }
1187    return ret;
1188}
1189
1190binder::Status
1191CameraDevice::ServiceCallback::onDeviceIdle() {
1192    ALOGV("Camera is now idle");
1193    binder::Status ret = binder::Status::ok();
1194    sp<CameraDevice> dev = mDevice.promote();
1195    if (dev == nullptr) {
1196        return ret; // device has been closed
1197    }
1198
1199    Mutex::Autolock _l(dev->mDeviceLock);
1200    if (dev->isClosed() || dev->mRemote == nullptr) {
1201        return ret;
1202    }
1203
1204    if (dev->mIdle) {
1205        // Already in idle state. Possibly other thread did waitUntilIdle
1206        return ret;
1207    }
1208
1209    if (dev->mCurrentSession != nullptr) {
1210        ALOGE("onDeviceIdle sending state cb");
1211        if (dev->mBusySession != dev->mCurrentSession) {
1212            ALOGE("Current session != busy session");
1213            dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
1214            return ret;
1215        }
1216        sp<AMessage> msg = new AMessage(kWhatSessionStateCb, dev->mHandler);
1217        msg->setPointer(kContextKey, dev->mBusySession->mUserSessionCallback.context);
1218        msg->setObject(kSessionSpKey, dev->mBusySession);
1219        msg->setPointer(kCallbackFpKey, (void*) dev->mBusySession->mUserSessionCallback.onReady);
1220        // Make sure we clear the sp first so the session destructor can
1221        // only happen on handler thread (where we don't hold device/session lock)
1222        dev->mBusySession.clear();
1223        msg->post();
1224    }
1225    dev->mIdle = true;
1226    dev->mFlushing = false;
1227    return ret;
1228}
1229
1230binder::Status
1231CameraDevice::ServiceCallback::onCaptureStarted(
1232        const CaptureResultExtras& resultExtras,
1233        int64_t timestamp) {
1234    binder::Status ret = binder::Status::ok();
1235
1236    sp<CameraDevice> dev = mDevice.promote();
1237    if (dev == nullptr) {
1238        return ret; // device has been closed
1239    }
1240    Mutex::Autolock _l(dev->mDeviceLock);
1241    if (dev->isClosed() || dev->mRemote == nullptr) {
1242        return ret;
1243    }
1244
1245    int sequenceId = resultExtras.requestId;
1246    int32_t burstId = resultExtras.burstId;
1247
1248    auto it = dev->mSequenceCallbackMap.find(sequenceId);
1249    if (it != dev->mSequenceCallbackMap.end()) {
1250        CallbackHolder cbh = (*it).second;
1251        ACameraCaptureSession_captureCallback_start onStart = cbh.mCallbacks.onCaptureStarted;
1252        sp<ACameraCaptureSession> session = cbh.mSession;
1253        if ((size_t) burstId >= cbh.mRequests.size()) {
1254            ALOGE("%s: Error: request index %d out of bound (size %zu)",
1255                    __FUNCTION__, burstId, cbh.mRequests.size());
1256            dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
1257        }
1258        sp<CaptureRequest> request = cbh.mRequests[burstId];
1259        sp<AMessage> msg = new AMessage(kWhatCaptureStart, dev->mHandler);
1260        msg->setPointer(kContextKey, cbh.mCallbacks.context);
1261        msg->setObject(kSessionSpKey, session);
1262        msg->setPointer(kCallbackFpKey, (void*) onStart);
1263        msg->setObject(kCaptureRequestKey, request);
1264        msg->setInt64(kTimeStampKey, timestamp);
1265        msg->post();
1266    }
1267    return ret;
1268}
1269
1270binder::Status
1271CameraDevice::ServiceCallback::onResultReceived(
1272        const CameraMetadata& metadata,
1273        const CaptureResultExtras& resultExtras) {
1274    binder::Status ret = binder::Status::ok();
1275
1276    sp<CameraDevice> dev = mDevice.promote();
1277    if (dev == nullptr) {
1278        return ret; // device has been closed
1279    }
1280    int sequenceId = resultExtras.requestId;
1281    int64_t frameNumber = resultExtras.frameNumber;
1282    int32_t burstId = resultExtras.burstId;
1283    bool    isPartialResult = (resultExtras.partialResultCount < dev->mPartialResultCount);
1284
1285    if (!isPartialResult) {
1286        ALOGV("SeqId %d frame %" PRId64 " result arrive.", sequenceId, frameNumber);
1287    }
1288
1289    Mutex::Autolock _l(dev->mDeviceLock);
1290    if (dev->mRemote == nullptr) {
1291        return ret; // device has been disconnected
1292    }
1293
1294    if (dev->isClosed()) {
1295        if (!isPartialResult) {
1296            dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false);
1297        }
1298        // early return to avoid callback sent to closed devices
1299        return ret;
1300    }
1301
1302    CameraMetadata metadataCopy = metadata;
1303    // Copied from java implmentation. Why do we need this?
1304    metadataCopy.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, dev->mShadingMapSize, /*data_count*/2);
1305
1306    auto it = dev->mSequenceCallbackMap.find(sequenceId);
1307    if (it != dev->mSequenceCallbackMap.end()) {
1308        CallbackHolder cbh = (*it).second;
1309        ACameraCaptureSession_captureCallback_result onResult = isPartialResult ?
1310                cbh.mCallbacks.onCaptureProgressed :
1311                cbh.mCallbacks.onCaptureCompleted;
1312        sp<ACameraCaptureSession> session = cbh.mSession;
1313        if ((size_t) burstId >= cbh.mRequests.size()) {
1314            ALOGE("%s: Error: request index %d out of bound (size %zu)",
1315                    __FUNCTION__, burstId, cbh.mRequests.size());
1316            dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
1317        }
1318        sp<CaptureRequest> request = cbh.mRequests[burstId];
1319        sp<ACameraMetadata> result(new ACameraMetadata(
1320                metadataCopy.release(), ACameraMetadata::ACM_RESULT));
1321
1322        sp<AMessage> msg = new AMessage(kWhatCaptureResult, dev->mHandler);
1323        msg->setPointer(kContextKey, cbh.mCallbacks.context);
1324        msg->setObject(kSessionSpKey, session);
1325        msg->setPointer(kCallbackFpKey, (void*) onResult);
1326        msg->setObject(kCaptureRequestKey, request);
1327        msg->setObject(kCaptureResultKey, result);
1328        msg->post();
1329    }
1330
1331    if (!isPartialResult) {
1332        dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false);
1333        dev->checkAndFireSequenceCompleteLocked();
1334    }
1335
1336    return ret;
1337}
1338
1339binder::Status
1340CameraDevice::ServiceCallback::onPrepared(int) {
1341    // Prepare not yet implemented in NDK
1342    return binder::Status::ok();
1343}
1344
1345} // namespace android
1346