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