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