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