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