• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 //#define LOG_NDEBUG 0
18 #define LOG_TAG "ACameraDevice"
19 
20 #include <vector>
21 #include <inttypes.h>
22 #include <android/hardware/ICameraService.h>
23 #include <gui/Surface.h>
24 #include "ACameraDevice.h"
25 #include "ACameraMetadata.h"
26 #include "ACaptureRequest.h"
27 #include "ACameraCaptureSession.h"
28 
~ACameraDevice()29 ACameraDevice::~ACameraDevice() {
30     mDevice->stopLooperAndDisconnect();
31 }
32 
33 namespace android {
34 namespace acam {
35 
36 // Static member definitions
37 const char* CameraDevice::kContextKey        = "Context";
38 const char* CameraDevice::kDeviceKey         = "Device";
39 const char* CameraDevice::kErrorCodeKey      = "ErrorCode";
40 const char* CameraDevice::kCallbackFpKey     = "Callback";
41 const char* CameraDevice::kSessionSpKey      = "SessionSp";
42 const char* CameraDevice::kCaptureRequestKey = "CaptureRequest";
43 const char* CameraDevice::kTimeStampKey      = "TimeStamp";
44 const char* CameraDevice::kCaptureResultKey  = "CaptureResult";
45 const char* CameraDevice::kPhysicalCaptureResultKey = "PhysicalCaptureResult";
46 const char* CameraDevice::kCaptureFailureKey = "CaptureFailure";
47 const char* CameraDevice::kSequenceIdKey     = "SequenceId";
48 const char* CameraDevice::kFrameNumberKey    = "FrameNumber";
49 const char* CameraDevice::kAnwKey            = "Anw";
50 const char* CameraDevice::kFailingPhysicalCameraId= "FailingPhysicalCameraId";
51 
52 /**
53  * CameraDevice Implementation
54  */
CameraDevice(const char * id,ACameraDevice_StateCallbacks * cb,sp<ACameraMetadata> chars,ACameraDevice * wrapper)55 CameraDevice::CameraDevice(
56         const char* id,
57         ACameraDevice_StateCallbacks* cb,
58         sp<ACameraMetadata> chars,
59         ACameraDevice* wrapper) :
60         mCameraId(id),
61         mAppCallbacks(*cb),
62         mChars(chars),
63         mServiceCallback(new ServiceCallback(this)),
64         mWrapper(wrapper),
65         mInError(false),
66         mError(ACAMERA_OK),
67         mIdle(true),
68         mCurrentSession(nullptr) {
69     mClosing = false;
70     // Setup looper thread to perfrom device callbacks to app
71     mCbLooper = new ALooper;
72     mCbLooper->setName("C2N-dev-looper");
73     status_t err = mCbLooper->start(
74             /*runOnCallingThread*/false,
75             /*canCallJava*/       true,
76             PRIORITY_DEFAULT);
77     if (err != OK) {
78         ALOGE("%s: Unable to start camera device callback looper: %s (%d)",
79                 __FUNCTION__, strerror(-err), err);
80         setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
81     }
82     mHandler = new CallbackHandler(id);
83     mCbLooper->registerHandler(mHandler);
84 
85     const CameraMetadata& metadata = mChars->getInternalData();
86     camera_metadata_ro_entry entry = metadata.find(ANDROID_REQUEST_PARTIAL_RESULT_COUNT);
87     if (entry.count != 1) {
88         ALOGW("%s: bad count %zu for partial result count", __FUNCTION__, entry.count);
89         mPartialResultCount = 1;
90     } else {
91         mPartialResultCount = entry.data.i32[0];
92     }
93 
94     entry = metadata.find(ANDROID_LENS_INFO_SHADING_MAP_SIZE);
95     if (entry.count != 2) {
96         ALOGW("%s: bad count %zu for shading map size", __FUNCTION__, entry.count);
97         mShadingMapSize[0] = 0;
98         mShadingMapSize[1] = 0;
99     } else {
100         mShadingMapSize[0] = entry.data.i32[0];
101         mShadingMapSize[1] = entry.data.i32[1];
102     }
103 
104     size_t physicalIdCnt = 0;
105     const char*const* physicalCameraIds;
106     if (mChars->isLogicalMultiCamera(&physicalIdCnt, &physicalCameraIds)) {
107         for (size_t i = 0; i < physicalIdCnt; i++) {
108             mPhysicalIds.push_back(physicalCameraIds[i]);
109         }
110     }
111 }
112 
~CameraDevice()113 CameraDevice::~CameraDevice() { }
114 
115 void
postSessionMsgAndCleanup(sp<AMessage> & msg)116 CameraDevice::postSessionMsgAndCleanup(sp<AMessage>& msg) {
117     msg->post();
118     msg.clear();
119     sp<AMessage> cleanupMsg = new AMessage(kWhatCleanUpSessions, mHandler);
120     cleanupMsg->post();
121 }
122 
123 // TODO: cached created request?
124 camera_status_t
createCaptureRequest(ACameraDevice_request_template templateId,const ACameraIdList * physicalIdList,ACaptureRequest ** request) const125 CameraDevice::createCaptureRequest(
126         ACameraDevice_request_template templateId,
127         const ACameraIdList* physicalIdList,
128         ACaptureRequest** request) const {
129     Mutex::Autolock _l(mDeviceLock);
130 
131     if (physicalIdList != nullptr) {
132         if (physicalIdList->numCameras > static_cast<int>(mPhysicalIds.size())) {
133             ALOGE("%s: physicalIdList size %d exceeds number of available physical cameras %zu",
134                     __FUNCTION__, physicalIdList->numCameras, mPhysicalIds.size());
135             return ACAMERA_ERROR_INVALID_PARAMETER;
136         }
137         for (auto i = 0; i < physicalIdList->numCameras; i++) {
138             if (physicalIdList->cameraIds[i] == nullptr) {
139                 ALOGE("%s: physicalId is null!", __FUNCTION__);
140                 return ACAMERA_ERROR_INVALID_PARAMETER;
141             }
142             if (mPhysicalIds.end() == std::find(
143                     mPhysicalIds.begin(), mPhysicalIds.end(), physicalIdList->cameraIds[i])) {
144                 ALOGE("%s: Invalid physicalId %s!", __FUNCTION__, physicalIdList->cameraIds[i]);
145                 return ACAMERA_ERROR_INVALID_PARAMETER;
146             }
147         }
148     }
149 
150     camera_status_t ret = checkCameraClosedOrErrorLocked();
151     if (ret != ACAMERA_OK) {
152         return ret;
153     }
154     if (mRemote == nullptr) {
155         return ACAMERA_ERROR_CAMERA_DISCONNECTED;
156     }
157     CameraMetadata rawRequest;
158     binder::Status remoteRet = mRemote->createDefaultRequest(templateId, &rawRequest);
159     if (remoteRet.serviceSpecificErrorCode() ==
160             hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) {
161         ALOGW("Create capture request failed! template %d is not supported on this device",
162             templateId);
163         return ACAMERA_ERROR_INVALID_PARAMETER;
164     } else if (!remoteRet.isOk()) {
165         ALOGE("Create capture request failed: %s", remoteRet.toString8().string());
166         return ACAMERA_ERROR_UNKNOWN;
167     }
168     ACaptureRequest* outReq = new ACaptureRequest();
169     outReq->settings = new ACameraMetadata(rawRequest.release(), ACameraMetadata::ACM_REQUEST);
170     if (physicalIdList != nullptr) {
171         for (auto i = 0; i < physicalIdList->numCameras; i++) {
172             outReq->physicalSettings.emplace(physicalIdList->cameraIds[i],
173                     new ACameraMetadata(*(outReq->settings)));
174         }
175     }
176     outReq->targets  = new ACameraOutputTargets();
177     *request = outReq;
178     return ACAMERA_OK;
179 }
180 
181 camera_status_t
createCaptureSession(const ACaptureSessionOutputContainer * outputs,const ACaptureRequest * sessionParameters,const ACameraCaptureSession_stateCallbacks * callbacks,ACameraCaptureSession ** session)182 CameraDevice::createCaptureSession(
183         const ACaptureSessionOutputContainer*       outputs,
184         const ACaptureRequest* sessionParameters,
185         const ACameraCaptureSession_stateCallbacks* callbacks,
186         /*out*/ACameraCaptureSession** session) {
187     nsecs_t startTimeNs = systemTime();
188     sp<ACameraCaptureSession> currentSession = mCurrentSession.promote();
189     Mutex::Autolock _l(mDeviceLock);
190     camera_status_t ret = checkCameraClosedOrErrorLocked();
191     if (ret != ACAMERA_OK) {
192         return ret;
193     }
194 
195     if (currentSession != nullptr) {
196         currentSession->closeByDevice();
197         stopRepeatingLocked();
198     }
199 
200     // Create new session
201     ret = configureStreamsLocked(outputs, sessionParameters, startTimeNs);
202     if (ret != ACAMERA_OK) {
203         ALOGE("Fail to create new session. cannot configure streams");
204         return ret;
205     }
206 
207     ACameraCaptureSession* newSession = new ACameraCaptureSession(
208             mNextSessionId++, outputs, callbacks, this);
209 
210     // set new session as current session
211     newSession->incStrong((void *) ACameraDevice_createCaptureSession);
212     mCurrentSession = newSession;
213     mFlushing = false;
214     *session = newSession;
215     return ACAMERA_OK;
216 }
217 
isSessionConfigurationSupported(const ACaptureSessionOutputContainer * sessionOutputContainer) const218 camera_status_t CameraDevice::isSessionConfigurationSupported(
219         const ACaptureSessionOutputContainer* sessionOutputContainer) const {
220     Mutex::Autolock _l(mDeviceLock);
221     camera_status_t ret = checkCameraClosedOrErrorLocked();
222     if (ret != ACAMERA_OK) {
223         return ret;
224     }
225 
226     SessionConfiguration sessionConfiguration(0 /*inputWidth*/, 0 /*inputHeight*/,
227             -1 /*inputFormat*/, CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE);
228     for (const auto& output : sessionOutputContainer->mOutputs) {
229         sp<IGraphicBufferProducer> iGBP(nullptr);
230         ret = getIGBPfromAnw(output.mWindow, iGBP);
231         if (ret != ACAMERA_OK) {
232             ALOGE("Camera device %s failed to extract graphic producer from native window",
233                     getId());
234             return ret;
235         }
236 
237         String16 physicalId16(output.mPhysicalCameraId.c_str());
238         OutputConfiguration outConfig(iGBP, output.mRotation, physicalId16,
239                 OutputConfiguration::INVALID_SET_ID, true);
240 
241         for (auto& anw : output.mSharedWindows) {
242             ret = getIGBPfromAnw(anw, iGBP);
243             if (ret != ACAMERA_OK) {
244                 ALOGE("Camera device %s failed to extract graphic producer from native window",
245                         getId());
246                 return ret;
247             }
248             outConfig.addGraphicProducer(iGBP);
249         }
250 
251         sessionConfiguration.addOutputConfiguration(outConfig);
252     }
253 
254     bool supported = false;
255     binder::Status remoteRet = mRemote->isSessionConfigurationSupported(
256             sessionConfiguration, &supported);
257     if (remoteRet.serviceSpecificErrorCode() ==
258             hardware::ICameraService::ERROR_INVALID_OPERATION) {
259         return ACAMERA_ERROR_UNSUPPORTED_OPERATION;
260     } else if (!remoteRet.isOk()) {
261         return ACAMERA_ERROR_UNKNOWN;
262     } else {
263         return supported ? ACAMERA_OK : ACAMERA_ERROR_STREAM_CONFIGURE_FAIL;
264     }
265 }
266 
updateOutputConfigurationLocked(ACaptureSessionOutput * output)267 camera_status_t CameraDevice::updateOutputConfigurationLocked(ACaptureSessionOutput *output) {
268     camera_status_t ret = checkCameraClosedOrErrorLocked();
269     if (ret != ACAMERA_OK) {
270         return ret;
271     }
272 
273     if (output == nullptr) {
274         return ACAMERA_ERROR_INVALID_PARAMETER;
275     }
276 
277     if (!output->mIsShared) {
278         ALOGE("Error output configuration is not shared");
279         return ACAMERA_ERROR_INVALID_OPERATION;
280     }
281 
282     int32_t streamId = -1;
283     for (auto& kvPair : mConfiguredOutputs) {
284         if (kvPair.second.first == output->mWindow) {
285             streamId = kvPair.first;
286             break;
287         }
288     }
289     if (streamId < 0) {
290         ALOGE("Error: Invalid output configuration");
291         return ACAMERA_ERROR_INVALID_PARAMETER;
292     }
293 
294     sp<IGraphicBufferProducer> iGBP(nullptr);
295     ret = getIGBPfromAnw(output->mWindow, iGBP);
296     if (ret != ACAMERA_OK) {
297         ALOGE("Camera device %s failed to extract graphic producer from native window",
298                 getId());
299         return ret;
300     }
301 
302     String16 physicalId16(output->mPhysicalCameraId.c_str());
303     OutputConfiguration outConfig(iGBP, output->mRotation, physicalId16,
304             OutputConfiguration::INVALID_SET_ID, true);
305 
306     for (auto& anw : output->mSharedWindows) {
307         ret = getIGBPfromAnw(anw, iGBP);
308         if (ret != ACAMERA_OK) {
309             ALOGE("Camera device %s failed to extract graphic producer from native window",
310                     getId());
311             return ret;
312         }
313         outConfig.addGraphicProducer(iGBP);
314     }
315 
316     auto remoteRet = mRemote->updateOutputConfiguration(streamId, outConfig);
317     if (!remoteRet.isOk()) {
318         switch (remoteRet.serviceSpecificErrorCode()) {
319             case hardware::ICameraService::ERROR_INVALID_OPERATION:
320                 ALOGE("Camera device %s invalid operation: %s", getId(),
321                         remoteRet.toString8().string());
322                 return ACAMERA_ERROR_INVALID_OPERATION;
323                 break;
324             case hardware::ICameraService::ERROR_ALREADY_EXISTS:
325                 ALOGE("Camera device %s output surface already exists: %s", getId(),
326                         remoteRet.toString8().string());
327                 return ACAMERA_ERROR_INVALID_PARAMETER;
328                 break;
329             case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
330                 ALOGE("Camera device %s invalid input argument: %s", getId(),
331                         remoteRet.toString8().string());
332                 return ACAMERA_ERROR_INVALID_PARAMETER;
333                 break;
334             default:
335                 ALOGE("Camera device %s failed to add shared output: %s", getId(),
336                         remoteRet.toString8().string());
337                 return ACAMERA_ERROR_UNKNOWN;
338         }
339     }
340     mConfiguredOutputs[streamId] = std::make_pair(output->mWindow, outConfig);
341 
342     return ACAMERA_OK;
343 }
344 
prepareLocked(ACameraWindowType * window)345 camera_status_t CameraDevice::prepareLocked(ACameraWindowType *window) {
346     camera_status_t ret = checkCameraClosedOrErrorLocked();
347     if (ret != ACAMERA_OK) {
348         return ret;
349     }
350 
351     if (window == nullptr) {
352         return ACAMERA_ERROR_INVALID_PARAMETER;
353     }
354 
355     int32_t streamId = -1;
356     for (auto& kvPair : mConfiguredOutputs) {
357         if (window == kvPair.second.first) {
358             streamId = kvPair.first;
359             break;
360         }
361     }
362     if (streamId < 0) {
363         ALOGE("Error: Invalid output configuration");
364         return ACAMERA_ERROR_INVALID_PARAMETER;
365     }
366     auto remoteRet = mRemote->prepare(streamId);
367     if (!remoteRet.isOk()) {
368         // TODO:(b/259735869) Do this check for all other binder calls in the
369         // ndk as well.
370         if (remoteRet.exceptionCode() != EX_SERVICE_SPECIFIC) {
371             ALOGE("Camera device %s failed to prepare output window %p: %s", getId(), window,
372                     remoteRet.toString8().string());
373             return ACAMERA_ERROR_UNKNOWN;
374 
375         }
376         switch (remoteRet.serviceSpecificErrorCode()) {
377             case hardware::ICameraService::ERROR_INVALID_OPERATION:
378                 ALOGE("Camera device %s invalid operation: %s", getId(),
379                         remoteRet.toString8().string());
380                 return ACAMERA_ERROR_INVALID_OPERATION;
381                 break;
382             case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
383                 ALOGE("Camera device %s invalid input argument: %s", getId(),
384                         remoteRet.toString8().string());
385                 return ACAMERA_ERROR_INVALID_PARAMETER;
386                 break;
387             default:
388                 ALOGE("Camera device %s failed to prepare output window %p: %s", getId(), window,
389                         remoteRet.toString8().string());
390                 return ACAMERA_ERROR_UNKNOWN;
391         }
392     }
393 
394     return ACAMERA_OK;
395 }
396 
397 camera_status_t
allocateCaptureRequest(const ACaptureRequest * request,sp<CaptureRequest> & outReq)398 CameraDevice::allocateCaptureRequest(
399         const ACaptureRequest* request, /*out*/sp<CaptureRequest>& outReq) {
400     camera_status_t ret;
401     sp<CaptureRequest> req(new CaptureRequest());
402     req->mPhysicalCameraSettings.push_back({getId(),
403             request->settings->getInternalData()});
404     for (auto& entry : request->physicalSettings) {
405         req->mPhysicalCameraSettings.push_back({entry.first,
406                 entry.second->getInternalData()});
407     }
408     req->mIsReprocess = false; // NDK does not support reprocessing yet
409     req->mContext = request->context;
410     req->mSurfaceConverted = true; // set to true, and fill in stream/surface idx to speed up IPC
411 
412     for (auto outputTarget : request->targets->mOutputs) {
413         ANativeWindow* anw = outputTarget.mWindow;
414         sp<Surface> surface;
415         ret = getSurfaceFromANativeWindow(anw, surface);
416         if (ret != ACAMERA_OK) {
417             ALOGE("Bad output target in capture request! ret %d", ret);
418             return ret;
419         }
420         req->mSurfaceList.push_back(surface);
421 
422         bool found = false;
423         // lookup stream/surface ID
424         for (const auto& kvPair : mConfiguredOutputs) {
425             int streamId = kvPair.first;
426             const OutputConfiguration& outConfig = kvPair.second.second;
427             const auto& gbps = outConfig.getGraphicBufferProducers();
428             for (int surfaceId = 0; surfaceId < (int) gbps.size(); surfaceId++) {
429                 if (gbps[surfaceId] == surface->getIGraphicBufferProducer()) {
430                     found = true;
431                     req->mStreamIdxList.push_back(streamId);
432                     req->mSurfaceIdxList.push_back(surfaceId);
433                     break;
434                 }
435             }
436             if (found) {
437                 break;
438             }
439         }
440         if (!found) {
441             ALOGE("Unconfigured output target %p in capture request!", anw);
442             return ret;
443         }
444     }
445 
446     outReq = req;
447     return ACAMERA_OK;
448 }
449 
450 ACaptureRequest*
allocateACaptureRequest(sp<CaptureRequest> & req,const std::string & deviceId)451 CameraDevice::allocateACaptureRequest(sp<CaptureRequest>& req, const std::string& deviceId) {
452     ACaptureRequest* pRequest = new ACaptureRequest();
453     for (auto& entry : req->mPhysicalCameraSettings) {
454         CameraMetadata clone = entry.settings;
455         if (entry.id == deviceId) {
456             pRequest->settings = new ACameraMetadata(clone.release(), ACameraMetadata::ACM_REQUEST);
457         } else {
458             pRequest->physicalSettings.emplace(entry.id,
459                     new ACameraMetadata(clone.release(), ACameraMetadata::ACM_REQUEST));
460         }
461     }
462     pRequest->targets  = new ACameraOutputTargets();
463     for (size_t i = 0; i < req->mSurfaceList.size(); i++) {
464         ANativeWindow* anw = static_cast<ANativeWindow*>(req->mSurfaceList[i].get());
465         ACameraOutputTarget outputTarget(anw);
466         pRequest->targets->mOutputs.insert(outputTarget);
467     }
468     pRequest->context = req->mContext;
469     return pRequest;
470 }
471 
472 void
freeACaptureRequest(ACaptureRequest * req)473 CameraDevice::freeACaptureRequest(ACaptureRequest* req) {
474     if (req == nullptr) {
475         return;
476     }
477     req->settings.clear();
478     req->physicalSettings.clear();
479     delete req->targets;
480     delete req;
481 }
482 
483 void
notifySessionEndOfLifeLocked(ACameraCaptureSession * session)484 CameraDevice::notifySessionEndOfLifeLocked(ACameraCaptureSession* session) {
485     if (isClosed()) {
486         // Device is closing already. do nothing
487         return;
488     }
489 
490     if (mCurrentSession != session) {
491         // Session has been replaced by other seesion or device is closed
492         return;
493     }
494     mCurrentSession = nullptr;
495 
496     // Should not happen
497     if (!session->mIsClosed) {
498         ALOGE("Error: unclosed session %p reaches end of life!", session);
499         setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
500         return;
501     }
502 
503     // No new session, unconfigure now
504     // Note: The unconfiguration of session won't be accounted for session
505     // latency because a stream configuration with 0 streams won't ever become
506     // active.
507     nsecs_t startTimeNs = systemTime();
508     camera_status_t ret = configureStreamsLocked(nullptr, nullptr, startTimeNs);
509     if (ret != ACAMERA_OK) {
510         ALOGE("Unconfigure stream failed. Device might still be configured! ret %d", ret);
511     }
512 }
513 
514 void
disconnectLocked(sp<ACameraCaptureSession> & session)515 CameraDevice::disconnectLocked(sp<ACameraCaptureSession>& session) {
516     if (mClosing.exchange(true)) {
517         // Already closing, just return
518         ALOGW("Camera device %s is already closing.", getId());
519         return;
520     }
521 
522     if (mRemote != nullptr) {
523         mRemote->disconnect();
524     }
525     mRemote = nullptr;
526 
527     if (session != nullptr) {
528         session->closeByDevice();
529     }
530 }
531 
532 camera_status_t
stopRepeatingLocked()533 CameraDevice::stopRepeatingLocked() {
534     camera_status_t ret = checkCameraClosedOrErrorLocked();
535     if (ret != ACAMERA_OK) {
536         ALOGE("Camera %s stop repeating failed! ret %d", getId(), ret);
537         return ret;
538     }
539     if (mRepeatingSequenceId != REQUEST_ID_NONE) {
540         int repeatingSequenceId = mRepeatingSequenceId;
541         mRepeatingSequenceId = REQUEST_ID_NONE;
542 
543         int64_t lastFrameNumber;
544         binder::Status remoteRet = mRemote->cancelRequest(repeatingSequenceId, &lastFrameNumber);
545         if (remoteRet.serviceSpecificErrorCode() ==
546                 hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) {
547             ALOGV("Repeating request is already stopped.");
548             return ACAMERA_OK;
549         } else if (!remoteRet.isOk()) {
550             ALOGE("Stop repeating request fails in remote: %s", remoteRet.toString8().string());
551             return ACAMERA_ERROR_UNKNOWN;
552         }
553         checkRepeatingSequenceCompleteLocked(repeatingSequenceId, lastFrameNumber);
554     }
555     return ACAMERA_OK;
556 }
557 
558 camera_status_t
flushLocked(ACameraCaptureSession * session)559 CameraDevice::flushLocked(ACameraCaptureSession* session) {
560     camera_status_t ret = checkCameraClosedOrErrorLocked();
561     if (ret != ACAMERA_OK) {
562         ALOGE("Camera %s abort captures failed! ret %d", getId(), ret);
563         return ret;
564     }
565 
566     // This should never happen because creating a new session will close
567     // previous one and thus reject any API call from previous session.
568     // But still good to check here in case something unexpected happen.
569     if (mCurrentSession != session) {
570         ALOGE("Camera %s session %p is not current active session!", getId(), session);
571         return ACAMERA_ERROR_INVALID_OPERATION;
572     }
573 
574     if (mFlushing) {
575         ALOGW("Camera %s is already aborting captures", getId());
576         return ACAMERA_OK;
577     }
578 
579     mFlushing = true;
580 
581     // Send onActive callback to guarantee there is always active->ready transition
582     sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
583     msg->setPointer(kContextKey, session->mUserSessionCallback.context);
584     msg->setObject(kSessionSpKey, session);
585     msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onActive);
586     postSessionMsgAndCleanup(msg);
587 
588     // If device is already idling, send callback and exit early
589     if (mIdle) {
590         sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
591         msg->setPointer(kContextKey, session->mUserSessionCallback.context);
592         msg->setObject(kSessionSpKey, session);
593         msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onReady);
594         postSessionMsgAndCleanup(msg);
595         mFlushing = false;
596         return ACAMERA_OK;
597     }
598 
599     int64_t lastFrameNumber;
600     binder::Status remoteRet = mRemote->flush(&lastFrameNumber);
601     if (!remoteRet.isOk()) {
602         ALOGE("Abort captures fails in remote: %s", remoteRet.toString8().string());
603         return ACAMERA_ERROR_UNKNOWN;
604     }
605     if (mRepeatingSequenceId != REQUEST_ID_NONE) {
606         checkRepeatingSequenceCompleteLocked(mRepeatingSequenceId, lastFrameNumber);
607     }
608     return ACAMERA_OK;
609 }
610 
611 camera_status_t
waitUntilIdleLocked()612 CameraDevice::waitUntilIdleLocked() {
613     camera_status_t ret = checkCameraClosedOrErrorLocked();
614     if (ret != ACAMERA_OK) {
615         ALOGE("Wait until camera %s idle failed! ret %d", getId(), ret);
616         return ret;
617     }
618 
619     if (mRepeatingSequenceId != REQUEST_ID_NONE) {
620         ALOGE("Camera device %s won't go to idle when there is repeating request!", getId());
621         return ACAMERA_ERROR_INVALID_OPERATION;
622     }
623 
624     binder::Status remoteRet = mRemote->waitUntilIdle();
625     if (!remoteRet.isOk()) {
626         ALOGE("Camera device %s waitUntilIdle failed: %s", getId(), remoteRet.toString8().string());
627         // TODO: define a function to convert status_t -> camera_status_t
628         return ACAMERA_ERROR_UNKNOWN;
629     }
630 
631     return ACAMERA_OK;
632 }
633 
634 camera_status_t
getIGBPfromAnw(ANativeWindow * anw,sp<IGraphicBufferProducer> & out)635 CameraDevice::getIGBPfromAnw(
636         ANativeWindow* anw,
637         sp<IGraphicBufferProducer>& out) {
638     sp<Surface> surface;
639     camera_status_t ret = getSurfaceFromANativeWindow(anw, surface);
640     if (ret != ACAMERA_OK) {
641         return ret;
642     }
643     out = surface->getIGraphicBufferProducer();
644     return ACAMERA_OK;
645 }
646 
647 camera_status_t
getSurfaceFromANativeWindow(ANativeWindow * anw,sp<Surface> & out)648 CameraDevice::getSurfaceFromANativeWindow(
649         ANativeWindow* anw, sp<Surface>& out) {
650     if (anw == nullptr) {
651         ALOGE("Error: output ANativeWindow is null");
652         return ACAMERA_ERROR_INVALID_PARAMETER;
653     }
654     int value;
655     int err = (*anw->query)(anw, NATIVE_WINDOW_CONCRETE_TYPE, &value);
656     if (err != OK || value != NATIVE_WINDOW_SURFACE) {
657         ALOGE("Error: ANativeWindow is not backed by Surface!");
658         return ACAMERA_ERROR_INVALID_PARAMETER;
659     }
660     sp<Surface> surface(static_cast<Surface*>(anw));
661     out = surface;
662     return ACAMERA_OK;
663 }
664 
665 camera_status_t
configureStreamsLocked(const ACaptureSessionOutputContainer * outputs,const ACaptureRequest * sessionParameters,nsecs_t startTimeNs)666 CameraDevice::configureStreamsLocked(const ACaptureSessionOutputContainer* outputs,
667         const ACaptureRequest* sessionParameters, nsecs_t startTimeNs) {
668     ACaptureSessionOutputContainer emptyOutput;
669     if (outputs == nullptr) {
670         outputs = &emptyOutput;
671     }
672 
673     camera_status_t ret = checkCameraClosedOrErrorLocked();
674     if (ret != ACAMERA_OK) {
675         return ret;
676     }
677 
678     std::set<std::pair<ANativeWindow*, OutputConfiguration>> outputSet;
679     for (const auto& outConfig : outputs->mOutputs) {
680         ANativeWindow* anw = outConfig.mWindow;
681         sp<IGraphicBufferProducer> iGBP(nullptr);
682         ret = getIGBPfromAnw(anw, iGBP);
683         if (ret != ACAMERA_OK) {
684             return ret;
685         }
686         String16 physicalId16(outConfig.mPhysicalCameraId.c_str());
687         outputSet.insert(std::make_pair(
688                 anw, OutputConfiguration(iGBP, outConfig.mRotation, physicalId16,
689                         OutputConfiguration::INVALID_SET_ID, outConfig.mIsShared)));
690     }
691     auto addSet = outputSet;
692     std::vector<int> deleteList;
693 
694     // Determine which streams need to be created, which to be deleted
695     for (auto& kvPair : mConfiguredOutputs) {
696         int streamId = kvPair.first;
697         auto& outputPair = kvPair.second;
698         if (outputSet.count(outputPair) == 0) {
699             deleteList.push_back(streamId); // Need to delete a no longer needed stream
700         } else {
701             addSet.erase(outputPair);        // No need to add already existing stream
702         }
703     }
704 
705     ret = stopRepeatingLocked();
706     if (ret != ACAMERA_OK) {
707         ALOGE("Camera device %s stop repeating failed, ret %d", getId(), ret);
708         return ret;
709     }
710 
711     ret = waitUntilIdleLocked();
712     if (ret != ACAMERA_OK) {
713         ALOGE("Camera device %s wait until idle failed, ret %d", getId(), ret);
714         return ret;
715     }
716 
717     // Send onReady to previous session
718     // CurrentSession will be updated after configureStreamLocked, so here
719     // mCurrentSession is the session to be replaced by a new session
720     if (!mIdle && mCurrentSession != nullptr) {
721         if (mBusySession != mCurrentSession) {
722             ALOGE("Current session != busy session");
723             setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
724             return ACAMERA_ERROR_CAMERA_DEVICE;
725         }
726         sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
727         msg->setPointer(kContextKey, mBusySession->mUserSessionCallback.context);
728         msg->setObject(kSessionSpKey, mBusySession);
729         msg->setPointer(kCallbackFpKey, (void*) mBusySession->mUserSessionCallback.onReady);
730         mBusySession.clear();
731         postSessionMsgAndCleanup(msg);
732     }
733     mIdle = true;
734 
735     binder::Status remoteRet = mRemote->beginConfigure();
736     if (!remoteRet.isOk()) {
737         ALOGE("Camera device %s begin configure failed: %s", getId(), remoteRet.toString8().string());
738         return ACAMERA_ERROR_UNKNOWN;
739     }
740 
741     // delete to-be-deleted streams
742     for (auto streamId : deleteList) {
743         remoteRet = mRemote->deleteStream(streamId);
744         if (!remoteRet.isOk()) {
745             ALOGE("Camera device %s failed to remove stream %d: %s", getId(), streamId,
746                     remoteRet.toString8().string());
747             return ACAMERA_ERROR_UNKNOWN;
748         }
749         mConfiguredOutputs.erase(streamId);
750     }
751 
752     // add new streams
753     for (const auto& outputPair : addSet) {
754         int streamId;
755         remoteRet = mRemote->createStream(outputPair.second, &streamId);
756         if (!remoteRet.isOk()) {
757             ALOGE("Camera device %s failed to create stream: %s", getId(),
758                     remoteRet.toString8().string());
759             return ACAMERA_ERROR_UNKNOWN;
760         }
761         mConfiguredOutputs.insert(std::make_pair(streamId, outputPair));
762     }
763 
764     CameraMetadata params;
765     if ((sessionParameters != nullptr) && (sessionParameters->settings != nullptr)) {
766         params.append(sessionParameters->settings->getInternalData());
767     }
768     std::vector<int> offlineStreamIds;
769     remoteRet = mRemote->endConfigure(/*isConstrainedHighSpeed*/ false, params,
770             ns2ms(startTimeNs), &offlineStreamIds);
771     if (remoteRet.serviceSpecificErrorCode() == hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) {
772         ALOGE("Camera device %s cannnot support app output configuration: %s", getId(),
773                 remoteRet.toString8().string());
774         return ACAMERA_ERROR_STREAM_CONFIGURE_FAIL;
775     } else if (!remoteRet.isOk()) {
776         ALOGE("Camera device %s end configure failed: %s", getId(), remoteRet.toString8().string());
777         return ACAMERA_ERROR_UNKNOWN;
778     }
779 
780     return ACAMERA_OK;
781 }
782 
783 void
setRemoteDevice(sp<hardware::camera2::ICameraDeviceUser> remote)784 CameraDevice::setRemoteDevice(sp<hardware::camera2::ICameraDeviceUser> remote) {
785     Mutex::Autolock _l(mDeviceLock);
786     mRemote = remote;
787 }
788 
789 camera_status_t
checkCameraClosedOrErrorLocked() const790 CameraDevice::checkCameraClosedOrErrorLocked() const {
791     if (mRemote == nullptr) {
792         ALOGE("%s: camera device already closed", __FUNCTION__);
793         return ACAMERA_ERROR_CAMERA_DISCONNECTED;
794     }
795     if (mInError) {// triggered by onDeviceError
796         ALOGE("%s: camera device has encountered a serious error", __FUNCTION__);
797         return mError;
798     }
799     return ACAMERA_OK;
800 }
801 
802 void
setCameraDeviceErrorLocked(camera_status_t error)803 CameraDevice::setCameraDeviceErrorLocked(camera_status_t error) {
804     mInError = true;
805     mError = error;
806     return;
807 }
808 
809 void
updateTracker(int64_t frameNumber,bool isError)810 CameraDevice::FrameNumberTracker::updateTracker(int64_t frameNumber, bool isError) {
811     ALOGV("updateTracker frame %" PRId64 " isError %d", frameNumber, isError);
812     if (isError) {
813         mFutureErrorSet.insert(frameNumber);
814     } else if (frameNumber <= mCompletedFrameNumber) {
815         ALOGE("Frame number %" PRId64 " decreased! current fn %" PRId64,
816                 frameNumber, mCompletedFrameNumber);
817         return;
818     } else {
819         if (frameNumber != mCompletedFrameNumber + 1) {
820             ALOGE("Frame number out of order. Expect %" PRId64 " but get %" PRId64,
821                     mCompletedFrameNumber + 1, frameNumber);
822             // Do not assert as in java implementation
823         }
824         mCompletedFrameNumber = frameNumber;
825     }
826     update();
827 }
828 
829 void
update()830 CameraDevice::FrameNumberTracker::update() {
831     for (auto it = mFutureErrorSet.begin(); it != mFutureErrorSet.end();) {
832         int64_t errorFrameNumber = *it;
833         if (errorFrameNumber == mCompletedFrameNumber + 1) {
834             mCompletedFrameNumber++;
835             it = mFutureErrorSet.erase(it);
836         } else if (errorFrameNumber <= mCompletedFrameNumber) {
837             // This should not happen, but deal with it anyway
838             ALOGE("Completd frame number passed through current frame number!");
839             // erase the old error since it's no longer useful
840             it = mFutureErrorSet.erase(it);
841         } else {
842             // Normal requests hasn't catched up error frames, just break
843             break;
844         }
845     }
846     ALOGV("Update complete frame %" PRId64, mCompletedFrameNumber);
847 }
848 
849 void
onCaptureErrorLocked(int32_t errorCode,const CaptureResultExtras & resultExtras)850 CameraDevice::onCaptureErrorLocked(
851         int32_t errorCode,
852         const CaptureResultExtras& resultExtras) {
853     int sequenceId = resultExtras.requestId;
854     int64_t frameNumber = resultExtras.frameNumber;
855     int32_t burstId = resultExtras.burstId;
856     auto it = mSequenceCallbackMap.find(sequenceId);
857     if (it == mSequenceCallbackMap.end()) {
858         ALOGE("%s: Error: capture sequence index %d not found!",
859                 __FUNCTION__, sequenceId);
860         setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
861         return;
862     }
863 
864     CallbackHolder cbh = (*it).second;
865     sp<ACameraCaptureSession> session = cbh.mSession;
866     if ((size_t) burstId >= cbh.mRequests.size()) {
867         ALOGE("%s: Error: request index %d out of bound (size %zu)",
868                 __FUNCTION__, burstId, cbh.mRequests.size());
869         setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
870         return;
871     }
872     sp<CaptureRequest> request = cbh.mRequests[burstId];
873 
874     // Handle buffer error
875     if (errorCode == hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER) {
876         int32_t streamId = resultExtras.errorStreamId;
877         ACameraCaptureSession_captureCallback_bufferLost onBufferLost =
878                 cbh.mOnCaptureBufferLost;
879         auto outputPairIt = mConfiguredOutputs.find(streamId);
880         if (outputPairIt == mConfiguredOutputs.end()) {
881             ALOGE("%s: Error: stream id %d does not exist", __FUNCTION__, streamId);
882             setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
883             return;
884         }
885 
886         const auto& gbps = outputPairIt->second.second.getGraphicBufferProducers();
887         for (const auto& outGbp : gbps) {
888             for (const auto& surface : request->mSurfaceList) {
889                 if (surface->getIGraphicBufferProducer() == outGbp) {
890                     ANativeWindow* anw = static_cast<ANativeWindow*>(surface.get());
891                     ALOGV("Camera %s Lost output buffer for ANW %p frame %" PRId64,
892                             getId(), anw, frameNumber);
893 
894                     sp<AMessage> msg = new AMessage(kWhatCaptureBufferLost, mHandler);
895                     msg->setPointer(kContextKey, cbh.mContext);
896                     msg->setObject(kSessionSpKey, session);
897                     msg->setPointer(kCallbackFpKey, (void*) onBufferLost);
898                     msg->setObject(kCaptureRequestKey, request);
899                     msg->setPointer(kAnwKey, (void*) anw);
900                     msg->setInt64(kFrameNumberKey, frameNumber);
901                     postSessionMsgAndCleanup(msg);
902                 }
903             }
904         }
905     } else { // Handle other capture failures
906         // Fire capture failure callback if there is one registered
907         ACameraCaptureSession_captureCallback_failed onError = cbh.mOnCaptureFailed;
908         sp<CameraCaptureFailure> failure(new CameraCaptureFailure());
909         failure->frameNumber = frameNumber;
910         // TODO: refine this when implementing flush
911         failure->reason      = CAPTURE_FAILURE_REASON_ERROR;
912         failure->sequenceId  = sequenceId;
913         failure->wasImageCaptured = (errorCode ==
914                 hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT);
915 
916         sp<AMessage> msg = new AMessage(cbh.mIsLogicalCameraCallback ? kWhatLogicalCaptureFail :
917                 kWhatCaptureFail, mHandler);
918         msg->setPointer(kContextKey, cbh.mContext);
919         msg->setObject(kSessionSpKey, session);
920         if (cbh.mIsLogicalCameraCallback) {
921             if (resultExtras.errorPhysicalCameraId.size() > 0) {
922                 String8 cameraId(resultExtras.errorPhysicalCameraId);
923                 msg->setString(kFailingPhysicalCameraId, cameraId.string(), cameraId.size());
924             }
925             msg->setPointer(kCallbackFpKey, (void*) cbh.mOnLogicalCameraCaptureFailed);
926         } else {
927             msg->setPointer(kCallbackFpKey, (void*) onError);
928         }
929         msg->setObject(kCaptureRequestKey, request);
930         msg->setObject(kCaptureFailureKey, failure);
931         postSessionMsgAndCleanup(msg);
932 
933         // Update tracker
934         mFrameNumberTracker.updateTracker(frameNumber, /*isError*/true);
935         checkAndFireSequenceCompleteLocked();
936     }
937     return;
938 }
939 
stopLooperAndDisconnect()940 void CameraDevice::stopLooperAndDisconnect() {
941     Mutex::Autolock _l(mDeviceLock);
942     sp<ACameraCaptureSession> session = mCurrentSession.promote();
943     if (!isClosed()) {
944         disconnectLocked(session);
945     }
946     mCurrentSession = nullptr;
947 
948     if (mCbLooper != nullptr) {
949       mCbLooper->unregisterHandler(mHandler->id());
950       mCbLooper->stop();
951     }
952     mCbLooper.clear();
953     mHandler.clear();
954 }
955 
CallbackHandler(const char * id)956 CameraDevice::CallbackHandler::CallbackHandler(const char* id) : mId(id) {
957 }
958 
onMessageReceived(const sp<AMessage> & msg)959 void CameraDevice::CallbackHandler::onMessageReceived(
960         const sp<AMessage> &msg) {
961     switch (msg->what()) {
962         case kWhatOnDisconnected:
963         case kWhatOnError:
964         case kWhatSessionStateCb:
965         case kWhatCaptureStart:
966         case kWhatCaptureStart2:
967         case kWhatCaptureResult:
968         case kWhatLogicalCaptureResult:
969         case kWhatCaptureFail:
970         case kWhatLogicalCaptureFail:
971         case kWhatCaptureSeqEnd:
972         case kWhatCaptureSeqAbort:
973         case kWhatCaptureBufferLost:
974         case kWhatPreparedCb:
975             ALOGV("%s: Received msg %d", __FUNCTION__, msg->what());
976             break;
977         case kWhatCleanUpSessions:
978             mCachedSessions.clear();
979             return;
980         default:
981             ALOGE("%s:Error: unknown device callback %d", __FUNCTION__, msg->what());
982             return;
983     }
984     // Check the common part of all message
985     void* context;
986     bool found = msg->findPointer(kContextKey, &context);
987     if (!found) {
988         ALOGE("%s: Cannot find callback context!", __FUNCTION__);
989         return;
990     }
991     switch (msg->what()) {
992         case kWhatOnDisconnected:
993         {
994             ACameraDevice* dev;
995             found = msg->findPointer(kDeviceKey, (void**) &dev);
996             if (!found || dev == nullptr) {
997                 ALOGE("%s: Cannot find device pointer!", __FUNCTION__);
998                 return;
999             }
1000             ACameraDevice_StateCallback onDisconnected;
1001             found = msg->findPointer(kCallbackFpKey, (void**) &onDisconnected);
1002             if (!found) {
1003                 ALOGE("%s: Cannot find onDisconnected!", __FUNCTION__);
1004                 return;
1005             }
1006             if (onDisconnected == nullptr) {
1007                 return;
1008             }
1009             (*onDisconnected)(context, dev);
1010             break;
1011         }
1012         case kWhatOnError:
1013         {
1014             ACameraDevice* dev;
1015             found = msg->findPointer(kDeviceKey, (void**) &dev);
1016             if (!found || dev == nullptr) {
1017                 ALOGE("%s: Cannot find device pointer!", __FUNCTION__);
1018                 return;
1019             }
1020             ACameraDevice_ErrorStateCallback onError;
1021             found = msg->findPointer(kCallbackFpKey, (void**) &onError);
1022             if (!found) {
1023                 ALOGE("%s: Cannot find onError!", __FUNCTION__);
1024                 return;
1025             }
1026             int errorCode;
1027             found = msg->findInt32(kErrorCodeKey, &errorCode);
1028             if (!found) {
1029                 ALOGE("%s: Cannot find error code!", __FUNCTION__);
1030                 return;
1031             }
1032             if (onError == nullptr) {
1033                 return;
1034             }
1035             (*onError)(context, dev, errorCode);
1036             break;
1037         }
1038         case kWhatSessionStateCb:
1039         case kWhatCaptureStart:
1040         case kWhatCaptureStart2:
1041         case kWhatCaptureResult:
1042         case kWhatLogicalCaptureResult:
1043         case kWhatCaptureFail:
1044         case kWhatLogicalCaptureFail:
1045         case kWhatCaptureSeqEnd:
1046         case kWhatCaptureSeqAbort:
1047         case kWhatCaptureBufferLost:
1048         case kWhatPreparedCb:
1049         {
1050             sp<RefBase> obj;
1051             found = msg->findObject(kSessionSpKey, &obj);
1052             if (!found || obj == nullptr) {
1053                 ALOGE("%s: Cannot find session pointer!", __FUNCTION__);
1054                 return;
1055             }
1056             sp<ACameraCaptureSession> session(static_cast<ACameraCaptureSession*>(obj.get()));
1057             mCachedSessions.push(session);
1058             sp<CaptureRequest> requestSp = nullptr;
1059             switch (msg->what()) {
1060                 case kWhatCaptureStart:
1061                 case kWhatCaptureStart2:
1062                 case kWhatCaptureResult:
1063                 case kWhatLogicalCaptureResult:
1064                 case kWhatCaptureFail:
1065                 case kWhatLogicalCaptureFail:
1066                 case kWhatCaptureBufferLost:
1067                     found = msg->findObject(kCaptureRequestKey, &obj);
1068                     if (!found) {
1069                         ALOGE("%s: Cannot find capture request!", __FUNCTION__);
1070                         return;
1071                     }
1072                     requestSp = static_cast<CaptureRequest*>(obj.get());
1073                     break;
1074             }
1075 
1076             switch (msg->what()) {
1077                 case kWhatSessionStateCb:
1078                 {
1079                     ACameraCaptureSession_stateCallback onState;
1080                     found = msg->findPointer(kCallbackFpKey, (void**) &onState);
1081                     if (!found) {
1082                         ALOGE("%s: Cannot find state callback!", __FUNCTION__);
1083                         return;
1084                     }
1085                     if (onState == nullptr) {
1086                         return;
1087                     }
1088                     (*onState)(context, session.get());
1089                     break;
1090                 }
1091                 case kWhatPreparedCb:
1092                 {
1093                     ACameraCaptureSession_prepareCallback onWindowPrepared;
1094                     found = msg->findPointer(kCallbackFpKey, (void**) &onWindowPrepared);
1095                     if (!found) {
1096                         ALOGE("%s: Cannot find window prepared callback!", __FUNCTION__);
1097                         return;
1098                     }
1099                     if (onWindowPrepared == nullptr) {
1100                         return;
1101                     }
1102                     ACameraWindowType* anw;
1103                     found = msg->findPointer(kAnwKey, (void**) &anw);
1104                     if (!found) {
1105                         ALOGE("%s: Cannot find ANativeWindow: %d!", __FUNCTION__, __LINE__);
1106                         return;
1107                     }
1108                     (*onWindowPrepared)(context, anw, session.get());
1109                     break;
1110                 }
1111                 case kWhatCaptureStart:
1112                 {
1113                     ACameraCaptureSession_captureCallback_start onStart;
1114                     found = msg->findPointer(kCallbackFpKey, (void**) &onStart);
1115                     if (!found) {
1116                         ALOGE("%s: Cannot find capture start callback!", __FUNCTION__);
1117                         return;
1118                     }
1119                     if (onStart == nullptr) {
1120                         return;
1121                     }
1122                     int64_t timestamp;
1123                     found = msg->findInt64(kTimeStampKey, &timestamp);
1124                     if (!found) {
1125                         ALOGE("%s: Cannot find timestamp!", __FUNCTION__);
1126                         return;
1127                     }
1128                     ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
1129                     (*onStart)(context, session.get(), request, timestamp);
1130                     freeACaptureRequest(request);
1131                     break;
1132                 }
1133                 case kWhatCaptureStart2:
1134                 {
1135                     ACameraCaptureSession_captureCallback_startV2 onStart2;
1136                     found = msg->findPointer(kCallbackFpKey, (void**) &onStart2);
1137                     if (!found) {
1138                         ALOGE("%s: Cannot find capture startV2 callback!", __FUNCTION__);
1139                         return;
1140                     }
1141                     if (onStart2 == nullptr) {
1142                         return;
1143                     }
1144                     int64_t timestamp;
1145                     found = msg->findInt64(kTimeStampKey, &timestamp);
1146                     if (!found) {
1147                         ALOGE("%s: Cannot find timestamp!", __FUNCTION__);
1148                         return;
1149                     }
1150                     int64_t frameNumber;
1151                     found = msg->findInt64(kFrameNumberKey, &frameNumber);
1152                     if (!found) {
1153                         ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1154                         return;
1155                     }
1156 
1157                     ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
1158                     (*onStart2)(context, session.get(), request, timestamp, frameNumber);
1159                     freeACaptureRequest(request);
1160                     break;
1161                 }
1162                 case kWhatCaptureResult:
1163                 {
1164                     ACameraCaptureSession_captureCallback_result onResult;
1165                     found = msg->findPointer(kCallbackFpKey, (void**) &onResult);
1166                     if (!found) {
1167                         ALOGE("%s: Cannot find capture result callback!", __FUNCTION__);
1168                         return;
1169                     }
1170                     if (onResult == nullptr) {
1171                         return;
1172                     }
1173 
1174                     found = msg->findObject(kCaptureResultKey, &obj);
1175                     if (!found) {
1176                         ALOGE("%s: Cannot find capture result!", __FUNCTION__);
1177                         return;
1178                     }
1179                     sp<ACameraMetadata> result(static_cast<ACameraMetadata*>(obj.get()));
1180                     ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
1181                     (*onResult)(context, session.get(), request, result.get());
1182                     freeACaptureRequest(request);
1183                     break;
1184                 }
1185                 case kWhatLogicalCaptureResult:
1186                 {
1187                     ACameraCaptureSession_logicalCamera_captureCallback_result onResult;
1188                     found = msg->findPointer(kCallbackFpKey, (void**) &onResult);
1189                     if (!found) {
1190                         ALOGE("%s: Cannot find logicalCamera capture result callback!",
1191                                 __FUNCTION__);
1192                         return;
1193                     }
1194                     if (onResult == nullptr) {
1195                         return;
1196                     }
1197 
1198                     found = msg->findObject(kCaptureResultKey, &obj);
1199                     if (!found) {
1200                         ALOGE("%s: Cannot find capture result!", __FUNCTION__);
1201                         return;
1202                     }
1203                     sp<ACameraMetadata> result(static_cast<ACameraMetadata*>(obj.get()));
1204 
1205                     found = msg->findObject(kPhysicalCaptureResultKey, &obj);
1206                     if (!found) {
1207                         ALOGE("%s: Cannot find physical capture result!", __FUNCTION__);
1208                         return;
1209                     }
1210                     sp<ACameraPhysicalCaptureResultInfo> physicalResult(
1211                             static_cast<ACameraPhysicalCaptureResultInfo*>(obj.get()));
1212                     std::vector<PhysicalCaptureResultInfo>& physicalResultInfo =
1213                             physicalResult->mPhysicalResultInfo;
1214 
1215                     std::vector<std::string> physicalCameraIds;
1216                     std::vector<sp<ACameraMetadata>> physicalMetadataCopy;
1217                     for (size_t i = 0; i < physicalResultInfo.size(); i++) {
1218                         String8 physicalId8(physicalResultInfo[i].mPhysicalCameraId);
1219                         physicalCameraIds.push_back(physicalId8.c_str());
1220 
1221                         CameraMetadata clone = physicalResultInfo[i].mPhysicalCameraMetadata;
1222                         clone.update(ANDROID_SYNC_FRAME_NUMBER,
1223                                 &physicalResult->mFrameNumber, /*data_count*/1);
1224                         sp<ACameraMetadata> metadata =
1225                                 new ACameraMetadata(clone.release(), ACameraMetadata::ACM_RESULT);
1226                         physicalMetadataCopy.push_back(metadata);
1227                     }
1228 
1229                     std::vector<const char*> physicalCameraIdPtrs;
1230                     std::vector<const ACameraMetadata*> physicalMetadataCopyPtrs;
1231                     for (size_t i = 0; i < physicalResultInfo.size(); i++) {
1232                         physicalCameraIdPtrs.push_back(physicalCameraIds[i].c_str());
1233                         physicalMetadataCopyPtrs.push_back(physicalMetadataCopy[i].get());
1234                     }
1235 
1236                     ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
1237                     (*onResult)(context, session.get(), request, result.get(),
1238                             physicalResultInfo.size(), physicalCameraIdPtrs.data(),
1239                             physicalMetadataCopyPtrs.data());
1240                     freeACaptureRequest(request);
1241                     break;
1242                 }
1243                 case kWhatCaptureFail:
1244                 {
1245                     ACameraCaptureSession_captureCallback_failed onFail;
1246                     found = msg->findPointer(kCallbackFpKey, (void**) &onFail);
1247                     if (!found) {
1248                         ALOGE("%s: Cannot find capture fail callback!", __FUNCTION__);
1249                         return;
1250                     }
1251                     if (onFail == nullptr) {
1252                         return;
1253                     }
1254 
1255                     found = msg->findObject(kCaptureFailureKey, &obj);
1256                     if (!found) {
1257                         ALOGE("%s: Cannot find capture failure!", __FUNCTION__);
1258                         return;
1259                     }
1260                     sp<CameraCaptureFailure> failureSp(
1261                             static_cast<CameraCaptureFailure*>(obj.get()));
1262                     ACameraCaptureFailure* failure =
1263                             static_cast<ACameraCaptureFailure*>(failureSp.get());
1264                     ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
1265                     (*onFail)(context, session.get(), request, failure);
1266                     freeACaptureRequest(request);
1267                     break;
1268                 }
1269                 case kWhatLogicalCaptureFail:
1270                 {
1271                     ACameraCaptureSession_logicalCamera_captureCallback_failed onFail;
1272                     found = msg->findPointer(kCallbackFpKey, (void**) &onFail);
1273                     if (!found) {
1274                         ALOGE("%s: Cannot find capture fail callback!", __FUNCTION__);
1275                         return;
1276                     }
1277                     if (onFail == nullptr) {
1278                         return;
1279                     }
1280 
1281                     found = msg->findObject(kCaptureFailureKey, &obj);
1282                     if (!found) {
1283                         ALOGE("%s: Cannot find capture failure!", __FUNCTION__);
1284                         return;
1285                     }
1286                     sp<CameraCaptureFailure> failureSp(
1287                             static_cast<CameraCaptureFailure*>(obj.get()));
1288                     ALogicalCameraCaptureFailure failure;
1289                     AString physicalCameraId;
1290                     found = msg->findString(kFailingPhysicalCameraId, &physicalCameraId);
1291                     if (found && !physicalCameraId.empty()) {
1292                         failure.physicalCameraId = physicalCameraId.c_str();
1293                     } else {
1294                         failure.physicalCameraId = nullptr;
1295                     }
1296                     failure.captureFailure = *failureSp;
1297                     ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
1298                     (*onFail)(context, session.get(), request, &failure);
1299                     freeACaptureRequest(request);
1300                     break;
1301                 }
1302                 case kWhatCaptureSeqEnd:
1303                 {
1304                     ACameraCaptureSession_captureCallback_sequenceEnd onSeqEnd;
1305                     found = msg->findPointer(kCallbackFpKey, (void**) &onSeqEnd);
1306                     if (!found) {
1307                         ALOGE("%s: Cannot find sequence end callback!", __FUNCTION__);
1308                         return;
1309                     }
1310                     if (onSeqEnd == nullptr) {
1311                         return;
1312                     }
1313                     int seqId;
1314                     found = msg->findInt32(kSequenceIdKey, &seqId);
1315                     if (!found) {
1316                         ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1317                         return;
1318                     }
1319                     int64_t frameNumber;
1320                     found = msg->findInt64(kFrameNumberKey, &frameNumber);
1321                     if (!found) {
1322                         ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1323                         return;
1324                     }
1325                     (*onSeqEnd)(context, session.get(), seqId, frameNumber);
1326                     break;
1327                 }
1328                 case kWhatCaptureSeqAbort:
1329                 {
1330                     ACameraCaptureSession_captureCallback_sequenceAbort onSeqAbort;
1331                     found = msg->findPointer(kCallbackFpKey, (void**) &onSeqAbort);
1332                     if (!found) {
1333                         ALOGE("%s: Cannot find sequence end callback!", __FUNCTION__);
1334                         return;
1335                     }
1336                     if (onSeqAbort == nullptr) {
1337                         return;
1338                     }
1339                     int seqId;
1340                     found = msg->findInt32(kSequenceIdKey, &seqId);
1341                     if (!found) {
1342                         ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1343                         return;
1344                     }
1345                     (*onSeqAbort)(context, session.get(), seqId);
1346                     break;
1347                 }
1348                 case kWhatCaptureBufferLost:
1349                 {
1350                     ACameraCaptureSession_captureCallback_bufferLost onBufferLost;
1351                     found = msg->findPointer(kCallbackFpKey, (void**) &onBufferLost);
1352                     if (!found) {
1353                         ALOGE("%s: Cannot find buffer lost callback!", __FUNCTION__);
1354                         return;
1355                     }
1356                     if (onBufferLost == nullptr) {
1357                         return;
1358                     }
1359 
1360                     ANativeWindow* anw;
1361                     found = msg->findPointer(kAnwKey, (void**) &anw);
1362                     if (!found) {
1363                         ALOGE("%s: Cannot find ANativeWindow!", __FUNCTION__);
1364                         return;
1365                     }
1366 
1367                     int64_t frameNumber;
1368                     found = msg->findInt64(kFrameNumberKey, &frameNumber);
1369                     if (!found) {
1370                         ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1371                         return;
1372                     }
1373 
1374                     ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
1375                     (*onBufferLost)(context, session.get(), request, anw, frameNumber);
1376                     freeACaptureRequest(request);
1377                     break;
1378                 }
1379             }
1380             break;
1381         }
1382     }
1383 }
1384 
CallbackHolder(sp<ACameraCaptureSession> session,const Vector<sp<CaptureRequest>> & requests,bool isRepeating,ACameraCaptureSession_captureCallbacks * cbs)1385 CameraDevice::CallbackHolder::CallbackHolder(
1386         sp<ACameraCaptureSession>          session,
1387         const Vector<sp<CaptureRequest> >& requests,
1388         bool                               isRepeating,
1389         ACameraCaptureSession_captureCallbacks* cbs) :
1390         mSession(session), mRequests(requests),
1391         mIsRepeating(isRepeating),
1392         mIsLogicalCameraCallback(false),
1393         mIs2Callback(false) {
1394     initCaptureCallbacks(cbs);
1395 
1396     if (cbs != nullptr) {
1397         mOnCaptureCompleted = cbs->onCaptureCompleted;
1398         mOnCaptureFailed = cbs->onCaptureFailed;
1399     }
1400 }
1401 
CallbackHolder(sp<ACameraCaptureSession> session,const Vector<sp<CaptureRequest>> & requests,bool isRepeating,ACameraCaptureSession_logicalCamera_captureCallbacks * lcbs)1402 CameraDevice::CallbackHolder::CallbackHolder(
1403         sp<ACameraCaptureSession>          session,
1404         const Vector<sp<CaptureRequest> >& requests,
1405         bool                               isRepeating,
1406         ACameraCaptureSession_logicalCamera_captureCallbacks* lcbs) :
1407         mSession(session), mRequests(requests),
1408         mIsRepeating(isRepeating),
1409         mIsLogicalCameraCallback(true),
1410         mIs2Callback(false) {
1411     initCaptureCallbacks(lcbs);
1412 
1413     if (lcbs != nullptr) {
1414         mOnLogicalCameraCaptureCompleted = lcbs->onLogicalCameraCaptureCompleted;
1415         mOnLogicalCameraCaptureFailed = lcbs->onLogicalCameraCaptureFailed;
1416     }
1417 }
1418 
CallbackHolder(sp<ACameraCaptureSession> session,const Vector<sp<CaptureRequest>> & requests,bool isRepeating,ACameraCaptureSession_captureCallbacksV2 * cbs)1419 CameraDevice::CallbackHolder::CallbackHolder(
1420         sp<ACameraCaptureSession>          session,
1421         const Vector<sp<CaptureRequest> >& requests,
1422         bool                               isRepeating,
1423         ACameraCaptureSession_captureCallbacksV2* cbs) :
1424         mSession(session), mRequests(requests),
1425         mIsRepeating(isRepeating),
1426         mIsLogicalCameraCallback(false),
1427         mIs2Callback(true) {
1428     initCaptureCallbacksV2(cbs);
1429 
1430     if (cbs != nullptr) {
1431         mOnCaptureCompleted = cbs->onCaptureCompleted;
1432         mOnCaptureFailed = cbs->onCaptureFailed;
1433     }
1434 }
1435 
CallbackHolder(sp<ACameraCaptureSession> session,const Vector<sp<CaptureRequest>> & requests,bool isRepeating,ACameraCaptureSession_logicalCamera_captureCallbacksV2 * lcbs)1436 CameraDevice::CallbackHolder::CallbackHolder(
1437         sp<ACameraCaptureSession>          session,
1438         const Vector<sp<CaptureRequest> >& requests,
1439         bool                               isRepeating,
1440         ACameraCaptureSession_logicalCamera_captureCallbacksV2* lcbs) :
1441         mSession(session), mRequests(requests),
1442         mIsRepeating(isRepeating),
1443         mIsLogicalCameraCallback(true),
1444         mIs2Callback(true) {
1445     initCaptureCallbacksV2(lcbs);
1446 
1447     if (lcbs != nullptr) {
1448         mOnLogicalCameraCaptureCompleted = lcbs->onLogicalCameraCaptureCompleted;
1449         mOnLogicalCameraCaptureFailed = lcbs->onLogicalCameraCaptureFailed;
1450     }
1451 }
1452 
1453 void
checkRepeatingSequenceCompleteLocked(const int sequenceId,const int64_t lastFrameNumber)1454 CameraDevice::checkRepeatingSequenceCompleteLocked(
1455     const int sequenceId, const int64_t lastFrameNumber) {
1456     ALOGV("Repeating seqId %d lastFrameNumer %" PRId64, sequenceId, lastFrameNumber);
1457     if (lastFrameNumber == NO_FRAMES_CAPTURED) {
1458         if (mSequenceCallbackMap.count(sequenceId) == 0) {
1459             ALOGW("No callback found for sequenceId %d", sequenceId);
1460             return;
1461         }
1462         // remove callback holder from callback map
1463         auto cbIt = mSequenceCallbackMap.find(sequenceId);
1464         CallbackHolder cbh = cbIt->second;
1465         mSequenceCallbackMap.erase(cbIt);
1466         // send seq aborted callback
1467         sp<AMessage> msg = new AMessage(kWhatCaptureSeqAbort, mHandler);
1468         msg->setPointer(kContextKey, cbh.mContext);
1469         msg->setObject(kSessionSpKey, cbh.mSession);
1470         msg->setPointer(kCallbackFpKey, (void*) cbh.mOnCaptureSequenceAborted);
1471         msg->setInt32(kSequenceIdKey, sequenceId);
1472         postSessionMsgAndCleanup(msg);
1473     } else {
1474         // Use mSequenceLastFrameNumberMap to track
1475         mSequenceLastFrameNumberMap.insert(std::make_pair(sequenceId, lastFrameNumber));
1476 
1477         // Last frame might have arrived. Check now
1478         checkAndFireSequenceCompleteLocked();
1479     }
1480 }
1481 
1482 void
checkAndFireSequenceCompleteLocked()1483 CameraDevice::checkAndFireSequenceCompleteLocked() {
1484     int64_t completedFrameNumber = mFrameNumberTracker.getCompletedFrameNumber();
1485     auto it = mSequenceLastFrameNumberMap.begin();
1486     while (it != mSequenceLastFrameNumberMap.end()) {
1487         int sequenceId = it->first;
1488         int64_t lastFrameNumber = it->second.lastFrameNumber;
1489 
1490         if (mRemote == nullptr) {
1491             ALOGW("Camera %s closed while checking sequence complete", getId());
1492             return;
1493         }
1494         ALOGV("%s: seq %d's last frame number %" PRId64 ", completed %" PRId64,
1495                 __FUNCTION__, sequenceId, lastFrameNumber, completedFrameNumber);
1496         if (!it->second.isSequenceCompleted) {
1497             // Check if there is callback for this sequence
1498             // This should not happen because we always register callback (with nullptr inside)
1499             if (mSequenceCallbackMap.count(sequenceId) == 0) {
1500                 ALOGW("No callback found for sequenceId %d", sequenceId);
1501             }
1502 
1503             if (lastFrameNumber <= completedFrameNumber) {
1504                 ALOGV("Mark sequenceId %d as sequence completed", sequenceId);
1505                 it->second.isSequenceCompleted = true;
1506             }
1507 
1508         }
1509 
1510         if (it->second.isSequenceCompleted && it->second.isInflightCompleted) {
1511             sendCaptureSequenceCompletedLocked(sequenceId, lastFrameNumber);
1512 
1513             it = mSequenceLastFrameNumberMap.erase(it);
1514             ALOGV("%s: Remove holder for sequenceId %d", __FUNCTION__, sequenceId);
1515         } else {
1516             ++it;
1517         }
1518     }
1519 }
1520 
1521 void
removeCompletedCallbackHolderLocked(int64_t lastCompletedRegularFrameNumber)1522 CameraDevice::removeCompletedCallbackHolderLocked(int64_t lastCompletedRegularFrameNumber) {
1523     auto it = mSequenceLastFrameNumberMap.begin();
1524     while (it != mSequenceLastFrameNumberMap.end()) {
1525         int sequenceId = it->first;
1526         int64_t lastFrameNumber = it->second.lastFrameNumber;
1527 
1528         if (mRemote == nullptr) {
1529             ALOGW("Camera %s closed while checking sequence complete", getId());
1530             return;
1531         }
1532 
1533         ALOGV("%s: seq %d's last frame number %" PRId64
1534                 ", completed inflight frame number %" PRId64,
1535                 __FUNCTION__, sequenceId, lastFrameNumber,
1536                 lastCompletedRegularFrameNumber);
1537         if (lastFrameNumber <= lastCompletedRegularFrameNumber) {
1538             if (it->second.isSequenceCompleted) {
1539                 sendCaptureSequenceCompletedLocked(sequenceId, lastFrameNumber);
1540 
1541                 it = mSequenceLastFrameNumberMap.erase(it);
1542                 ALOGV("%s: Remove holder for sequenceId %d", __FUNCTION__, sequenceId);
1543             } else {
1544                 ALOGV("Mark sequenceId %d as inflight completed", sequenceId);
1545                 it->second.isInflightCompleted = true;
1546                 ++it;
1547             }
1548         } else {
1549             ++it;
1550         }
1551     }
1552 }
1553 
1554 /**
1555   * Camera service callback implementation
1556   */
1557 binder::Status
onDeviceError(int32_t errorCode,const CaptureResultExtras & resultExtras)1558 CameraDevice::ServiceCallback::onDeviceError(
1559         int32_t errorCode,
1560         const CaptureResultExtras& resultExtras) {
1561     ALOGD("Device error received, code %d, frame number %" PRId64 ", request ID %d, subseq ID %d",
1562             errorCode, resultExtras.frameNumber, resultExtras.requestId, resultExtras.burstId);
1563     binder::Status ret = binder::Status::ok();
1564     sp<CameraDevice> dev = mDevice.promote();
1565     if (dev == nullptr) {
1566         return ret; // device has been closed
1567     }
1568 
1569     sp<ACameraCaptureSession> session = dev->mCurrentSession.promote();
1570     Mutex::Autolock _l(dev->mDeviceLock);
1571     if (dev->mRemote == nullptr) {
1572         return ret; // device has been closed
1573     }
1574     switch (errorCode) {
1575         case ERROR_CAMERA_DISCONNECTED:
1576         {
1577             // Camera is disconnected, close the session and expect no more callbacks
1578             if (session != nullptr) {
1579                 session->closeByDevice();
1580             }
1581             dev->mCurrentSession = nullptr;
1582             sp<AMessage> msg = new AMessage(kWhatOnDisconnected, dev->mHandler);
1583             msg->setPointer(kContextKey, dev->mAppCallbacks.context);
1584             msg->setPointer(kDeviceKey, (void*) dev->getWrapper());
1585             msg->setPointer(kCallbackFpKey, (void*) dev->mAppCallbacks.onDisconnected);
1586             msg->post();
1587             break;
1588         }
1589         default:
1590             ALOGE("Unknown error from camera device: %d", errorCode);
1591             [[fallthrough]];
1592         case ERROR_CAMERA_DEVICE:
1593         case ERROR_CAMERA_SERVICE:
1594         {
1595             int32_t errorVal = ::ERROR_CAMERA_DEVICE;
1596             // We keep this switch since this block might be encountered with
1597             // more than just 2 states. The default fallthrough could have us
1598             // handling more unmatched error cases.
1599             switch (errorCode) {
1600                 case ERROR_CAMERA_DEVICE:
1601                     dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
1602                     break;
1603                 case ERROR_CAMERA_SERVICE:
1604                     dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
1605                     errorVal = ::ERROR_CAMERA_SERVICE;
1606                     break;
1607                 default:
1608                     dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_UNKNOWN);
1609                     break;
1610             }
1611             sp<AMessage> msg = new AMessage(kWhatOnError, dev->mHandler);
1612             msg->setPointer(kContextKey, dev->mAppCallbacks.context);
1613             msg->setPointer(kDeviceKey, (void*) dev->getWrapper());
1614             msg->setPointer(kCallbackFpKey, (void*) dev->mAppCallbacks.onError);
1615             msg->setInt32(kErrorCodeKey, errorVal);
1616             msg->post();
1617             break;
1618         }
1619         case ERROR_CAMERA_REQUEST:
1620         case ERROR_CAMERA_RESULT:
1621         case ERROR_CAMERA_BUFFER:
1622             dev->onCaptureErrorLocked(errorCode, resultExtras);
1623             break;
1624     }
1625     return ret;
1626 }
1627 
1628 binder::Status
onDeviceIdle()1629 CameraDevice::ServiceCallback::onDeviceIdle() {
1630     ALOGV("Camera is now idle");
1631     binder::Status ret = binder::Status::ok();
1632     sp<CameraDevice> dev = mDevice.promote();
1633     if (dev == nullptr) {
1634         return ret; // device has been closed
1635     }
1636 
1637     Mutex::Autolock _l(dev->mDeviceLock);
1638     if (dev->isClosed() || dev->mRemote == nullptr) {
1639         return ret;
1640     }
1641 
1642     dev->removeCompletedCallbackHolderLocked(
1643              std::numeric_limits<int64_t>::max()/*lastCompletedRegularFrameNumber*/);
1644 
1645     if (dev->mIdle) {
1646         // Already in idle state. Possibly other thread did waitUntilIdle
1647         return ret;
1648     }
1649 
1650     if (dev->mCurrentSession != nullptr) {
1651         ALOGE("onDeviceIdle sending state cb");
1652         if (dev->mBusySession != dev->mCurrentSession) {
1653             ALOGE("Current session != busy session");
1654             dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
1655             return ret;
1656         }
1657 
1658         sp<AMessage> msg = new AMessage(kWhatSessionStateCb, dev->mHandler);
1659         msg->setPointer(kContextKey, dev->mBusySession->mUserSessionCallback.context);
1660         msg->setObject(kSessionSpKey, dev->mBusySession);
1661         msg->setPointer(kCallbackFpKey, (void*) dev->mBusySession->mUserSessionCallback.onReady);
1662         // Make sure we clear the sp first so the session destructor can
1663         // only happen on handler thread (where we don't hold device/session lock)
1664         dev->mBusySession.clear();
1665         dev->postSessionMsgAndCleanup(msg);
1666     }
1667     dev->mIdle = true;
1668     dev->mFlushing = false;
1669     return ret;
1670 }
1671 
1672 binder::Status
onCaptureStarted(const CaptureResultExtras & resultExtras,int64_t timestamp)1673 CameraDevice::ServiceCallback::onCaptureStarted(
1674         const CaptureResultExtras& resultExtras,
1675         int64_t timestamp) {
1676     binder::Status ret = binder::Status::ok();
1677     sp<CameraDevice> dev = mDevice.promote();
1678     if (dev == nullptr) {
1679         return ret; // device has been closed
1680     }
1681     Mutex::Autolock _l(dev->mDeviceLock);
1682     if (dev->isClosed() || dev->mRemote == nullptr) {
1683         return ret;
1684     }
1685 
1686     dev->removeCompletedCallbackHolderLocked(
1687             resultExtras.lastCompletedRegularFrameNumber);
1688 
1689     int sequenceId = resultExtras.requestId;
1690     int32_t burstId = resultExtras.burstId;
1691     int64_t frameNumber = resultExtras.frameNumber;
1692 
1693     auto it = dev->mSequenceCallbackMap.find(sequenceId);
1694     if (it != dev->mSequenceCallbackMap.end()) {
1695         CallbackHolder cbh = (*it).second;
1696         bool v2Callback = cbh.mIs2Callback;
1697         ACameraCaptureSession_captureCallback_start onStart = cbh.mOnCaptureStarted;
1698         ACameraCaptureSession_captureCallback_startV2 onStart2 = cbh.mOnCaptureStarted2;
1699         sp<ACameraCaptureSession> session = cbh.mSession;
1700         if ((size_t) burstId >= cbh.mRequests.size()) {
1701             ALOGE("%s: Error: request index %d out of bound (size %zu)",
1702                     __FUNCTION__, burstId, cbh.mRequests.size());
1703             dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
1704         }
1705         sp<CaptureRequest> request = cbh.mRequests[burstId];
1706         sp<AMessage> msg = nullptr;
1707         if (v2Callback) {
1708             msg = new AMessage(kWhatCaptureStart2, dev->mHandler);
1709             msg->setPointer(kCallbackFpKey, (void*) onStart2);
1710         } else {
1711             msg = new AMessage(kWhatCaptureStart, dev->mHandler);
1712             msg->setPointer(kCallbackFpKey, (void *)onStart);
1713         }
1714         msg->setPointer(kContextKey, cbh.mContext);
1715         msg->setObject(kSessionSpKey, session);
1716         msg->setObject(kCaptureRequestKey, request);
1717         msg->setInt64(kTimeStampKey, timestamp);
1718         msg->setInt64(kFrameNumberKey, frameNumber);
1719         dev->postSessionMsgAndCleanup(msg);
1720     }
1721     return ret;
1722 }
1723 
1724 binder::Status
onResultReceived(const CameraMetadata & metadata,const CaptureResultExtras & resultExtras,const std::vector<PhysicalCaptureResultInfo> & physicalResultInfos)1725 CameraDevice::ServiceCallback::onResultReceived(
1726         const CameraMetadata& metadata,
1727         const CaptureResultExtras& resultExtras,
1728         const std::vector<PhysicalCaptureResultInfo>& physicalResultInfos) {
1729     binder::Status ret = binder::Status::ok();
1730 
1731     sp<CameraDevice> dev = mDevice.promote();
1732     if (dev == nullptr) {
1733         return ret; // device has been closed
1734     }
1735     int sequenceId = resultExtras.requestId;
1736     int64_t frameNumber = resultExtras.frameNumber;
1737     int32_t burstId = resultExtras.burstId;
1738     bool    isPartialResult = (resultExtras.partialResultCount < dev->mPartialResultCount);
1739 
1740     if (!isPartialResult) {
1741         ALOGV("SeqId %d frame %" PRId64 " result arrive.", sequenceId, frameNumber);
1742     }
1743 
1744     Mutex::Autolock _l(dev->mDeviceLock);
1745     if (dev->mRemote == nullptr) {
1746         return ret; // device has been disconnected
1747     }
1748 
1749     if (dev->isClosed()) {
1750         if (!isPartialResult) {
1751             dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false);
1752         }
1753         // early return to avoid callback sent to closed devices
1754         return ret;
1755     }
1756 
1757     CameraMetadata metadataCopy = metadata;
1758     metadataCopy.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, dev->mShadingMapSize, /*data_count*/2);
1759     metadataCopy.update(ANDROID_SYNC_FRAME_NUMBER, &frameNumber, /*data_count*/1);
1760 
1761     auto it = dev->mSequenceCallbackMap.find(sequenceId);
1762     if (it != dev->mSequenceCallbackMap.end()) {
1763         CallbackHolder cbh = (*it).second;
1764         sp<ACameraCaptureSession> session = cbh.mSession;
1765         if ((size_t) burstId >= cbh.mRequests.size()) {
1766             ALOGE("%s: Error: request index %d out of bound (size %zu)",
1767                     __FUNCTION__, burstId, cbh.mRequests.size());
1768             dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
1769         }
1770         sp<CaptureRequest> request = cbh.mRequests[burstId];
1771         sp<ACameraMetadata> result(new ACameraMetadata(
1772                 metadataCopy.release(), ACameraMetadata::ACM_RESULT));
1773         sp<ACameraPhysicalCaptureResultInfo> physicalResult(
1774                 new ACameraPhysicalCaptureResultInfo(physicalResultInfos, frameNumber));
1775 
1776         sp<AMessage> msg = new AMessage(
1777                 cbh.mIsLogicalCameraCallback ? kWhatLogicalCaptureResult : kWhatCaptureResult,
1778                 dev->mHandler);
1779         msg->setPointer(kContextKey, cbh.mContext);
1780         msg->setObject(kSessionSpKey, session);
1781         msg->setObject(kCaptureRequestKey, request);
1782         msg->setObject(kCaptureResultKey, result);
1783         if (isPartialResult) {
1784             msg->setPointer(kCallbackFpKey,
1785                     (void *)cbh.mOnCaptureProgressed);
1786         } else if (cbh.mIsLogicalCameraCallback) {
1787             msg->setPointer(kCallbackFpKey,
1788                     (void *)cbh.mOnLogicalCameraCaptureCompleted);
1789             msg->setObject(kPhysicalCaptureResultKey, physicalResult);
1790         } else {
1791             msg->setPointer(kCallbackFpKey,
1792                     (void *)cbh.mOnCaptureCompleted);
1793         }
1794         dev->postSessionMsgAndCleanup(msg);
1795     }
1796 
1797     if (!isPartialResult) {
1798         dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false);
1799         dev->checkAndFireSequenceCompleteLocked();
1800     }
1801 
1802     return ret;
1803 }
1804 
1805 binder::Status
onPrepared(int streamId)1806 CameraDevice::ServiceCallback::onPrepared(int streamId) {
1807     ALOGV("%s: callback for stream id %d", __FUNCTION__, streamId);
1808     binder::Status ret = binder::Status::ok();
1809     sp<CameraDevice> dev = mDevice.promote();
1810     if (dev == nullptr) {
1811         return ret; // device has been closed
1812     }
1813     Mutex::Autolock _l(dev->mDeviceLock);
1814     if (dev->isClosed() || dev->mRemote == nullptr) {
1815         return ret;
1816     }
1817     auto it = dev->mConfiguredOutputs.find(streamId);
1818     if (it == dev->mConfiguredOutputs.end()) {
1819         ALOGE("%s: stream id %d does not exist", __FUNCTION__ , streamId);
1820         return ret;
1821     }
1822     sp<ACameraCaptureSession> session = dev->mCurrentSession.promote();
1823     if (session == nullptr) {
1824         ALOGE("%s: Session is dead already", __FUNCTION__ );
1825         return ret;
1826     }
1827     // We've found the window corresponding to the surface id.
1828     ACameraWindowType *window = it->second.first;
1829     sp<AMessage> msg = new AMessage(kWhatPreparedCb, dev->mHandler);
1830     msg->setPointer(kContextKey, session->mPreparedCb.context);
1831     msg->setPointer(kAnwKey, window);
1832     msg->setObject(kSessionSpKey, session);
1833     msg->setPointer(kCallbackFpKey, (void *)session->mPreparedCb.onWindowPrepared);
1834     dev->postSessionMsgAndCleanup(msg);
1835 
1836     return binder::Status::ok();
1837 }
1838 
1839 binder::Status
onRequestQueueEmpty()1840 CameraDevice::ServiceCallback::onRequestQueueEmpty() {
1841     // onRequestQueueEmpty not yet implemented in NDK
1842     return binder::Status::ok();
1843 }
1844 
1845 binder::Status
onRepeatingRequestError(int64_t lastFrameNumber,int32_t stoppedSequenceId)1846 CameraDevice::ServiceCallback::onRepeatingRequestError(
1847         int64_t lastFrameNumber, int32_t stoppedSequenceId) {
1848     binder::Status ret = binder::Status::ok();
1849 
1850     sp<CameraDevice> dev = mDevice.promote();
1851     if (dev == nullptr) {
1852         return ret; // device has been closed
1853     }
1854 
1855     Mutex::Autolock _l(dev->mDeviceLock);
1856 
1857     int repeatingSequenceId = dev->mRepeatingSequenceId;
1858     if (stoppedSequenceId == repeatingSequenceId) {
1859         dev->mRepeatingSequenceId = REQUEST_ID_NONE;
1860     }
1861 
1862     dev->checkRepeatingSequenceCompleteLocked(repeatingSequenceId, lastFrameNumber);
1863 
1864     return ret;
1865 }
1866 
1867 void
sendCaptureSequenceCompletedLocked(int sequenceId,int64_t lastFrameNumber)1868 CameraDevice::sendCaptureSequenceCompletedLocked(int sequenceId, int64_t lastFrameNumber) {
1869     auto cbIt = mSequenceCallbackMap.find(sequenceId);
1870     if (cbIt != mSequenceCallbackMap.end()) {
1871         CallbackHolder cbh = cbIt->second;
1872         mSequenceCallbackMap.erase(cbIt);
1873 
1874         // send seq complete callback
1875         sp<AMessage> msg = new AMessage(kWhatCaptureSeqEnd, mHandler);
1876         msg->setPointer(kContextKey, cbh.mContext);
1877         msg->setObject(kSessionSpKey, cbh.mSession);
1878         msg->setPointer(kCallbackFpKey, (void*) cbh.mOnCaptureSequenceCompleted);
1879         msg->setInt32(kSequenceIdKey, sequenceId);
1880         msg->setInt64(kFrameNumberKey, lastFrameNumber);
1881 
1882         // Clear the session sp before we send out the message
1883         // This will guarantee the rare case where the message is processed
1884         // before cbh goes out of scope and causing we call the session
1885         // destructor while holding device lock
1886         cbh.mSession.clear();
1887         postSessionMsgAndCleanup(msg);
1888     } else {
1889         // Check if there is callback for this sequence
1890         // This should not happen because we always register callback (with nullptr inside)
1891         ALOGW("No callback found for sequenceId %d", sequenceId);
1892     }
1893 }
1894 
1895 } // namespace acam
1896 } // namespace android
1897