1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker #ifndef _ACAMERA_DEVICE_H 17*ec779b8eSAndroid Build Coastguard Worker #define _ACAMERA_DEVICE_H 18*ec779b8eSAndroid Build Coastguard Worker 19*ec779b8eSAndroid Build Coastguard Worker #include <memory> 20*ec779b8eSAndroid Build Coastguard Worker #include <map> 21*ec779b8eSAndroid Build Coastguard Worker #include <set> 22*ec779b8eSAndroid Build Coastguard Worker #include <atomic> 23*ec779b8eSAndroid Build Coastguard Worker #include <utility> 24*ec779b8eSAndroid Build Coastguard Worker #include <vector> 25*ec779b8eSAndroid Build Coastguard Worker #include <utils/StrongPointer.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <utils/Mutex.h> 27*ec779b8eSAndroid Build Coastguard Worker #include <utils/String8.h> 28*ec779b8eSAndroid Build Coastguard Worker #include <utils/List.h> 29*ec779b8eSAndroid Build Coastguard Worker #include <utils/Vector.h> 30*ec779b8eSAndroid Build Coastguard Worker 31*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/camera2/BnCameraDeviceCallbacks.h> 32*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/camera2/ICameraDeviceUser.h> 33*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/ALooper.h> 34*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/AHandler.h> 35*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/AMessage.h> 36*ec779b8eSAndroid Build Coastguard Worker #include <camera/CaptureResult.h> 37*ec779b8eSAndroid Build Coastguard Worker #include <camera/camera2/OutputConfiguration.h> 38*ec779b8eSAndroid Build Coastguard Worker #include <camera/camera2/SessionConfiguration.h> 39*ec779b8eSAndroid Build Coastguard Worker #include <camera/camera2/CaptureRequest.h> 40*ec779b8eSAndroid Build Coastguard Worker #include <fmq/AidlMessageQueueCpp.h> 41*ec779b8eSAndroid Build Coastguard Worker 42*ec779b8eSAndroid Build Coastguard Worker #include <camera/NdkCameraCaptureSession.h> 43*ec779b8eSAndroid Build Coastguard Worker #include <camera/NdkCameraManager.h> 44*ec779b8eSAndroid Build Coastguard Worker #include <gui/Flags.h> // remove with WB_LIBCAMERASERVICE_WITH_DEPENDENCIES 45*ec779b8eSAndroid Build Coastguard Worker 46*ec779b8eSAndroid Build Coastguard Worker #include "ACameraMetadata.h" 47*ec779b8eSAndroid Build Coastguard Worker 48*ec779b8eSAndroid Build Coastguard Worker namespace android { 49*ec779b8eSAndroid Build Coastguard Worker namespace acam { 50*ec779b8eSAndroid Build Coastguard Worker 51*ec779b8eSAndroid Build Coastguard Worker using android::hardware::common::fmq::SynchronizedReadWrite; 52*ec779b8eSAndroid Build Coastguard Worker using ResultMetadataQueue = AidlMessageQueueCpp<int8_t, SynchronizedReadWrite>; 53*ec779b8eSAndroid Build Coastguard Worker 54*ec779b8eSAndroid Build Coastguard Worker // Wrap ACameraCaptureFailure so it can be ref-counted 55*ec779b8eSAndroid Build Coastguard Worker struct CameraCaptureFailure : public RefBase, public ACameraCaptureFailure {}; 56*ec779b8eSAndroid Build Coastguard Worker 57*ec779b8eSAndroid Build Coastguard Worker // Wrap PhysicalCaptureResultInfo so that it can be ref-counted 58*ec779b8eSAndroid Build Coastguard Worker struct ACameraPhysicalCaptureResultInfo: public RefBase { ACameraPhysicalCaptureResultInfoACameraPhysicalCaptureResultInfo59*ec779b8eSAndroid Build Coastguard Worker ACameraPhysicalCaptureResultInfo(const std::vector<PhysicalCaptureResultInfo>& info, 60*ec779b8eSAndroid Build Coastguard Worker int64_t frameNumber) : 61*ec779b8eSAndroid Build Coastguard Worker mPhysicalResultInfo(info), mFrameNumber(frameNumber) {} 62*ec779b8eSAndroid Build Coastguard Worker 63*ec779b8eSAndroid Build Coastguard Worker std::vector<PhysicalCaptureResultInfo> mPhysicalResultInfo; 64*ec779b8eSAndroid Build Coastguard Worker int64_t mFrameNumber; 65*ec779b8eSAndroid Build Coastguard Worker }; 66*ec779b8eSAndroid Build Coastguard Worker 67*ec779b8eSAndroid Build Coastguard Worker class CameraDevice final : public RefBase { 68*ec779b8eSAndroid Build Coastguard Worker public: 69*ec779b8eSAndroid Build Coastguard Worker 70*ec779b8eSAndroid Build Coastguard Worker using CameraMetadataInfo = android::hardware::camera2::CameraMetadataInfo; 71*ec779b8eSAndroid Build Coastguard Worker CameraDevice(const char* id, ACameraDevice_StateCallbacks* cb, 72*ec779b8eSAndroid Build Coastguard Worker sp<ACameraMetadata> chars, 73*ec779b8eSAndroid Build Coastguard Worker ACameraDevice* wrapper, bool sharedMode); 74*ec779b8eSAndroid Build Coastguard Worker ~CameraDevice(); 75*ec779b8eSAndroid Build Coastguard Worker getId()76*ec779b8eSAndroid Build Coastguard Worker inline const char* getId() const { return mCameraId.c_str(); } 77*ec779b8eSAndroid Build Coastguard Worker 78*ec779b8eSAndroid Build Coastguard Worker camera_status_t createCaptureRequest( 79*ec779b8eSAndroid Build Coastguard Worker ACameraDevice_request_template templateId, 80*ec779b8eSAndroid Build Coastguard Worker const ACameraIdList* physicalIdList, 81*ec779b8eSAndroid Build Coastguard Worker ACaptureRequest** request) const; 82*ec779b8eSAndroid Build Coastguard Worker 83*ec779b8eSAndroid Build Coastguard Worker camera_status_t createCaptureSession( 84*ec779b8eSAndroid Build Coastguard Worker const ACaptureSessionOutputContainer* outputs, 85*ec779b8eSAndroid Build Coastguard Worker const ACaptureRequest* sessionParameters, 86*ec779b8eSAndroid Build Coastguard Worker const ACameraCaptureSession_stateCallbacks* callbacks, 87*ec779b8eSAndroid Build Coastguard Worker /*out*/ACameraCaptureSession** session); 88*ec779b8eSAndroid Build Coastguard Worker 89*ec779b8eSAndroid Build Coastguard Worker camera_status_t isSessionConfigurationSupported( 90*ec779b8eSAndroid Build Coastguard Worker const ACaptureSessionOutputContainer* sessionOutputContainer) const; 91*ec779b8eSAndroid Build Coastguard Worker 92*ec779b8eSAndroid Build Coastguard Worker // Callbacks from camera service 93*ec779b8eSAndroid Build Coastguard Worker class ServiceCallback : public hardware::camera2::BnCameraDeviceCallbacks { 94*ec779b8eSAndroid Build Coastguard Worker public: ServiceCallback(CameraDevice * device)95*ec779b8eSAndroid Build Coastguard Worker explicit ServiceCallback(CameraDevice* device) : mDevice(device) {} 96*ec779b8eSAndroid Build Coastguard Worker binder::Status onDeviceError(int32_t errorCode, 97*ec779b8eSAndroid Build Coastguard Worker const CaptureResultExtras& resultExtras) override; 98*ec779b8eSAndroid Build Coastguard Worker binder::Status onDeviceIdle() override; 99*ec779b8eSAndroid Build Coastguard Worker binder::Status onCaptureStarted(const CaptureResultExtras& resultExtras, 100*ec779b8eSAndroid Build Coastguard Worker int64_t timestamp) override; 101*ec779b8eSAndroid Build Coastguard Worker binder::Status onResultReceived(const CameraMetadataInfo &resultInfo, 102*ec779b8eSAndroid Build Coastguard Worker const CaptureResultExtras& resultExtras, 103*ec779b8eSAndroid Build Coastguard Worker const std::vector<PhysicalCaptureResultInfo>& physicalResultInfos) override; 104*ec779b8eSAndroid Build Coastguard Worker binder::Status onPrepared(int streamId) override; 105*ec779b8eSAndroid Build Coastguard Worker binder::Status onRequestQueueEmpty() override; 106*ec779b8eSAndroid Build Coastguard Worker binder::Status onRepeatingRequestError(int64_t lastFrameNumber, 107*ec779b8eSAndroid Build Coastguard Worker int32_t stoppedSequenceId) override; 108*ec779b8eSAndroid Build Coastguard Worker binder::Status onClientSharedAccessPriorityChanged(bool isPrimaryClient) override; 109*ec779b8eSAndroid Build Coastguard Worker private: 110*ec779b8eSAndroid Build Coastguard Worker camera_status_t readOneResultMetadata( 111*ec779b8eSAndroid Build Coastguard Worker const CameraMetadataInfo& resultInfo, ResultMetadataQueue* metadataQueue, 112*ec779b8eSAndroid Build Coastguard Worker CameraMetadata* metadata); 113*ec779b8eSAndroid Build Coastguard Worker const wp<CameraDevice> mDevice; 114*ec779b8eSAndroid Build Coastguard Worker }; getServiceCallback()115*ec779b8eSAndroid Build Coastguard Worker inline sp<hardware::camera2::ICameraDeviceCallbacks> getServiceCallback() { 116*ec779b8eSAndroid Build Coastguard Worker return mServiceCallback; 117*ec779b8eSAndroid Build Coastguard Worker }; 118*ec779b8eSAndroid Build Coastguard Worker 119*ec779b8eSAndroid Build Coastguard Worker // Camera device is only functional after remote being set 120*ec779b8eSAndroid Build Coastguard Worker void setRemoteDevice(sp<hardware::camera2::ICameraDeviceUser> remote); 121*ec779b8eSAndroid Build Coastguard Worker bool setDeviceMetadataQueues(); 122*ec779b8eSAndroid Build Coastguard Worker getWrapper()123*ec779b8eSAndroid Build Coastguard Worker inline ACameraDevice* getWrapper() const { return mWrapper; }; 124*ec779b8eSAndroid Build Coastguard Worker 125*ec779b8eSAndroid Build Coastguard Worker // Stop the looper thread and unregister the handler 126*ec779b8eSAndroid Build Coastguard Worker void stopLooperAndDisconnect(); 127*ec779b8eSAndroid Build Coastguard Worker setPrimaryClient(bool isPrimary)128*ec779b8eSAndroid Build Coastguard Worker void setPrimaryClient(bool isPrimary) {mIsPrimaryClient = isPrimary;}; isPrimaryClient()129*ec779b8eSAndroid Build Coastguard Worker bool isPrimaryClient() {return mIsPrimaryClient;}; 130*ec779b8eSAndroid Build Coastguard Worker 131*ec779b8eSAndroid Build Coastguard Worker private: 132*ec779b8eSAndroid Build Coastguard Worker friend ACameraCaptureSession; 133*ec779b8eSAndroid Build Coastguard Worker camera_status_t checkCameraClosedOrErrorLocked() const; 134*ec779b8eSAndroid Build Coastguard Worker 135*ec779b8eSAndroid Build Coastguard Worker // device goes into fatal error state after this 136*ec779b8eSAndroid Build Coastguard Worker void setCameraDeviceErrorLocked(camera_status_t error); 137*ec779b8eSAndroid Build Coastguard Worker 138*ec779b8eSAndroid Build Coastguard Worker void disconnectLocked(sp<ACameraCaptureSession>& session); // disconnect from camera service 139*ec779b8eSAndroid Build Coastguard Worker 140*ec779b8eSAndroid Build Coastguard Worker camera_status_t stopRepeatingLocked(); 141*ec779b8eSAndroid Build Coastguard Worker 142*ec779b8eSAndroid Build Coastguard Worker camera_status_t flushLocked(ACameraCaptureSession*); 143*ec779b8eSAndroid Build Coastguard Worker 144*ec779b8eSAndroid Build Coastguard Worker camera_status_t waitUntilIdleLocked(); 145*ec779b8eSAndroid Build Coastguard Worker 146*ec779b8eSAndroid Build Coastguard Worker 147*ec779b8eSAndroid Build Coastguard Worker template<class T> 148*ec779b8eSAndroid Build Coastguard Worker camera_status_t captureLocked(sp<ACameraCaptureSession> session, 149*ec779b8eSAndroid Build Coastguard Worker /*optional*/T* cbs, 150*ec779b8eSAndroid Build Coastguard Worker int numRequests, ACaptureRequest** requests, 151*ec779b8eSAndroid Build Coastguard Worker /*optional*/int* captureSequenceId); 152*ec779b8eSAndroid Build Coastguard Worker 153*ec779b8eSAndroid Build Coastguard Worker template<class T> 154*ec779b8eSAndroid Build Coastguard Worker camera_status_t setRepeatingRequestsLocked(sp<ACameraCaptureSession> session, 155*ec779b8eSAndroid Build Coastguard Worker /*optional*/T* cbs, 156*ec779b8eSAndroid Build Coastguard Worker int numRequests, ACaptureRequest** requests, 157*ec779b8eSAndroid Build Coastguard Worker /*optional*/int* captureSequenceId); 158*ec779b8eSAndroid Build Coastguard Worker 159*ec779b8eSAndroid Build Coastguard Worker template<class T> 160*ec779b8eSAndroid Build Coastguard Worker camera_status_t submitRequestsLocked( 161*ec779b8eSAndroid Build Coastguard Worker sp<ACameraCaptureSession> session, 162*ec779b8eSAndroid Build Coastguard Worker /*optional*/T* cbs, 163*ec779b8eSAndroid Build Coastguard Worker int numRequests, ACaptureRequest** requests, 164*ec779b8eSAndroid Build Coastguard Worker /*out*/int* captureSequenceId, 165*ec779b8eSAndroid Build Coastguard Worker bool isRepeating); 166*ec779b8eSAndroid Build Coastguard Worker 167*ec779b8eSAndroid Build Coastguard Worker camera_status_t updateOutputConfigurationLocked(ACaptureSessionOutput *output); 168*ec779b8eSAndroid Build Coastguard Worker 169*ec779b8eSAndroid Build Coastguard Worker camera_status_t prepareLocked(ANativeWindow *window); 170*ec779b8eSAndroid Build Coastguard Worker 171*ec779b8eSAndroid Build Coastguard Worker camera_status_t allocateCaptureRequest( 172*ec779b8eSAndroid Build Coastguard Worker const ACaptureRequest* request, sp<CaptureRequest>& outReq); 173*ec779b8eSAndroid Build Coastguard Worker 174*ec779b8eSAndroid Build Coastguard Worker static ACaptureRequest* allocateACaptureRequest(sp<CaptureRequest>& req, 175*ec779b8eSAndroid Build Coastguard Worker const std::string& deviceId); 176*ec779b8eSAndroid Build Coastguard Worker static void freeACaptureRequest(ACaptureRequest*); 177*ec779b8eSAndroid Build Coastguard Worker 178*ec779b8eSAndroid Build Coastguard Worker // only For session to hold device lock 179*ec779b8eSAndroid Build Coastguard Worker // Always grab device lock before grabbing session lock lockDeviceForSessionOps()180*ec779b8eSAndroid Build Coastguard Worker void lockDeviceForSessionOps() const { mDeviceLock.lock(); }; unlockDevice()181*ec779b8eSAndroid Build Coastguard Worker void unlockDevice() const { mDeviceLock.unlock(); }; 182*ec779b8eSAndroid Build Coastguard Worker 183*ec779b8eSAndroid Build Coastguard Worker // For capture session to notify its end of life 184*ec779b8eSAndroid Build Coastguard Worker void notifySessionEndOfLifeLocked(ACameraCaptureSession* session); 185*ec779b8eSAndroid Build Coastguard Worker 186*ec779b8eSAndroid Build Coastguard Worker camera_status_t configureStreamsLocked(const ACaptureSessionOutputContainer* outputs, 187*ec779b8eSAndroid Build Coastguard Worker const ACaptureRequest* sessionParameters, nsecs_t startTimeNs); 188*ec779b8eSAndroid Build Coastguard Worker 189*ec779b8eSAndroid Build Coastguard Worker // Input message will be posted and cleared after this returns 190*ec779b8eSAndroid Build Coastguard Worker void postSessionMsgAndCleanup(sp<AMessage>& msg); 191*ec779b8eSAndroid Build Coastguard Worker 192*ec779b8eSAndroid Build Coastguard Worker // Only used when WB_LIBCAMERASERVICE_WITH_DEPENDENCIES is active 193*ec779b8eSAndroid Build Coastguard Worker static ParcelableSurfaceType convertSurfaceTypeToView(sp<SurfaceType> surface); 194*ec779b8eSAndroid Build Coastguard Worker 195*ec779b8eSAndroid Build Coastguard Worker static camera_status_t getSurfacefromAnw(ANativeWindow* anw, sp<SurfaceType>& out); 196*ec779b8eSAndroid Build Coastguard Worker 197*ec779b8eSAndroid Build Coastguard Worker static camera_status_t getSurfaceFromANativeWindow( 198*ec779b8eSAndroid Build Coastguard Worker ANativeWindow* anw, sp<Surface>& out); 199*ec779b8eSAndroid Build Coastguard Worker 200*ec779b8eSAndroid Build Coastguard Worker mutable Mutex mDeviceLock; 201*ec779b8eSAndroid Build Coastguard Worker const String8 mCameraId; // Camera ID 202*ec779b8eSAndroid Build Coastguard Worker const ACameraDevice_StateCallbacks mAppCallbacks; // Callback to app 203*ec779b8eSAndroid Build Coastguard Worker const sp<ACameraMetadata> mChars; // Camera characteristics 204*ec779b8eSAndroid Build Coastguard Worker const sp<ServiceCallback> mServiceCallback; 205*ec779b8eSAndroid Build Coastguard Worker ACameraDevice* mWrapper; 206*ec779b8eSAndroid Build Coastguard Worker bool mSharedMode; 207*ec779b8eSAndroid Build Coastguard Worker bool mIsPrimaryClient; 208*ec779b8eSAndroid Build Coastguard Worker 209*ec779b8eSAndroid Build Coastguard Worker // stream id -> pair of (ANW* from application, OutputConfiguration used for camera service) 210*ec779b8eSAndroid Build Coastguard Worker std::map<int, std::pair<ANativeWindow*, OutputConfiguration>> mConfiguredOutputs; 211*ec779b8eSAndroid Build Coastguard Worker 212*ec779b8eSAndroid Build Coastguard Worker // TODO: maybe a bool will suffice for synchronous implementation? 213*ec779b8eSAndroid Build Coastguard Worker std::atomic_bool mClosing; isClosed()214*ec779b8eSAndroid Build Coastguard Worker inline bool isClosed() { return mClosing; } 215*ec779b8eSAndroid Build Coastguard Worker 216*ec779b8eSAndroid Build Coastguard Worker bool mInError = false; 217*ec779b8eSAndroid Build Coastguard Worker camera_status_t mError = ACAMERA_OK; 218*ec779b8eSAndroid Build Coastguard Worker void onCaptureErrorLocked( 219*ec779b8eSAndroid Build Coastguard Worker int32_t errorCode, 220*ec779b8eSAndroid Build Coastguard Worker const CaptureResultExtras& resultExtras); 221*ec779b8eSAndroid Build Coastguard Worker 222*ec779b8eSAndroid Build Coastguard Worker bool mIdle = true; 223*ec779b8eSAndroid Build Coastguard Worker // This will avoid a busy session being deleted before it's back to idle state 224*ec779b8eSAndroid Build Coastguard Worker sp<ACameraCaptureSession> mBusySession; 225*ec779b8eSAndroid Build Coastguard Worker 226*ec779b8eSAndroid Build Coastguard Worker sp<hardware::camera2::ICameraDeviceUser> mRemote; 227*ec779b8eSAndroid Build Coastguard Worker 228*ec779b8eSAndroid Build Coastguard Worker // Looper thread to handle callback to app 229*ec779b8eSAndroid Build Coastguard Worker sp<ALooper> mCbLooper; 230*ec779b8eSAndroid Build Coastguard Worker // definition of handler and message 231*ec779b8eSAndroid Build Coastguard Worker enum { 232*ec779b8eSAndroid Build Coastguard Worker // Device state callbacks 233*ec779b8eSAndroid Build Coastguard Worker kWhatOnDisconnected, // onDisconnected 234*ec779b8eSAndroid Build Coastguard Worker kWhatOnError, // onError 235*ec779b8eSAndroid Build Coastguard Worker // Session state callbacks 236*ec779b8eSAndroid Build Coastguard Worker kWhatSessionStateCb, // onReady, onActive 237*ec779b8eSAndroid Build Coastguard Worker // Capture callbacks 238*ec779b8eSAndroid Build Coastguard Worker kWhatCaptureStart, // onCaptureStarted 239*ec779b8eSAndroid Build Coastguard Worker kWhatCaptureStart2, // onCaptureStarted 240*ec779b8eSAndroid Build Coastguard Worker kWhatCaptureResult, // onCaptureProgressed, onCaptureCompleted 241*ec779b8eSAndroid Build Coastguard Worker kWhatLogicalCaptureResult, // onLogicalCameraCaptureCompleted 242*ec779b8eSAndroid Build Coastguard Worker kWhatCaptureFail, // onCaptureFailed 243*ec779b8eSAndroid Build Coastguard Worker kWhatLogicalCaptureFail, // onLogicalCameraCaptureFailed 244*ec779b8eSAndroid Build Coastguard Worker kWhatCaptureSeqEnd, // onCaptureSequenceCompleted 245*ec779b8eSAndroid Build Coastguard Worker kWhatCaptureSeqAbort, // onCaptureSequenceAborted 246*ec779b8eSAndroid Build Coastguard Worker kWhatCaptureBufferLost, // onCaptureBufferLost 247*ec779b8eSAndroid Build Coastguard Worker kWhatPreparedCb, // onWindowPrepared 248*ec779b8eSAndroid Build Coastguard Worker // Internal cleanup 249*ec779b8eSAndroid Build Coastguard Worker kWhatCleanUpSessions, // Cleanup cached sp<ACameraCaptureSession> 250*ec779b8eSAndroid Build Coastguard Worker kWhatClientSharedAccessPriorityChanged 251*ec779b8eSAndroid Build Coastguard Worker }; 252*ec779b8eSAndroid Build Coastguard Worker static const char* kContextKey; 253*ec779b8eSAndroid Build Coastguard Worker static const char* kDeviceKey; 254*ec779b8eSAndroid Build Coastguard Worker static const char* kErrorCodeKey; 255*ec779b8eSAndroid Build Coastguard Worker static const char* kCallbackFpKey; 256*ec779b8eSAndroid Build Coastguard Worker static const char* kSessionSpKey; 257*ec779b8eSAndroid Build Coastguard Worker static const char* kCaptureRequestKey; 258*ec779b8eSAndroid Build Coastguard Worker static const char* kTimeStampKey; 259*ec779b8eSAndroid Build Coastguard Worker static const char* kCaptureResultKey; 260*ec779b8eSAndroid Build Coastguard Worker static const char* kPhysicalCaptureResultKey; 261*ec779b8eSAndroid Build Coastguard Worker static const char* kCaptureFailureKey; 262*ec779b8eSAndroid Build Coastguard Worker static const char* kSequenceIdKey; 263*ec779b8eSAndroid Build Coastguard Worker static const char* kFrameNumberKey; 264*ec779b8eSAndroid Build Coastguard Worker static const char* kAnwKey; 265*ec779b8eSAndroid Build Coastguard Worker static const char* kFailingPhysicalCameraId; 266*ec779b8eSAndroid Build Coastguard Worker 267*ec779b8eSAndroid Build Coastguard Worker class CallbackHandler : public AHandler { 268*ec779b8eSAndroid Build Coastguard Worker public: 269*ec779b8eSAndroid Build Coastguard Worker explicit CallbackHandler(const char* id); 270*ec779b8eSAndroid Build Coastguard Worker void onMessageReceived(const sp<AMessage> &msg) override; 271*ec779b8eSAndroid Build Coastguard Worker 272*ec779b8eSAndroid Build Coastguard Worker private: 273*ec779b8eSAndroid Build Coastguard Worker std::string mId; 274*ec779b8eSAndroid Build Coastguard Worker // This handler will cache all capture session sp until kWhatCleanUpSessions 275*ec779b8eSAndroid Build Coastguard Worker // is processed. This is used to guarantee the last session reference is always 276*ec779b8eSAndroid Build Coastguard Worker // being removed in callback thread without holding camera device lock 277*ec779b8eSAndroid Build Coastguard Worker Vector<sp<ACameraCaptureSession>> mCachedSessions; 278*ec779b8eSAndroid Build Coastguard Worker }; 279*ec779b8eSAndroid Build Coastguard Worker sp<CallbackHandler> mHandler; 280*ec779b8eSAndroid Build Coastguard Worker 281*ec779b8eSAndroid Build Coastguard Worker /*********************************** 282*ec779b8eSAndroid Build Coastguard Worker * Capture session related members * 283*ec779b8eSAndroid Build Coastguard Worker ***********************************/ 284*ec779b8eSAndroid Build Coastguard Worker // The current active session 285*ec779b8eSAndroid Build Coastguard Worker wp<ACameraCaptureSession> mCurrentSession; 286*ec779b8eSAndroid Build Coastguard Worker bool mFlushing = false; 287*ec779b8eSAndroid Build Coastguard Worker 288*ec779b8eSAndroid Build Coastguard Worker int mNextSessionId = 0; 289*ec779b8eSAndroid Build Coastguard Worker // TODO: might need another looper/handler to handle callbacks from service 290*ec779b8eSAndroid Build Coastguard Worker 291*ec779b8eSAndroid Build Coastguard Worker static const int REQUEST_ID_NONE = -1; 292*ec779b8eSAndroid Build Coastguard Worker int mRepeatingSequenceId = REQUEST_ID_NONE; 293*ec779b8eSAndroid Build Coastguard Worker 294*ec779b8eSAndroid Build Coastguard Worker // sequence id -> last frame number holder map 295*ec779b8eSAndroid Build Coastguard Worker struct RequestLastFrameNumberHolder { 296*ec779b8eSAndroid Build Coastguard Worker int64_t lastFrameNumber; 297*ec779b8eSAndroid Build Coastguard Worker // Whether the current sequence is completed (capture results are 298*ec779b8eSAndroid Build Coastguard Worker // generated). May be set to true, but 299*ec779b8eSAndroid Build Coastguard Worker // not removed from the map if not all inflight requests in the sequence 300*ec779b8eSAndroid Build Coastguard Worker // have been completed. 301*ec779b8eSAndroid Build Coastguard Worker bool isSequenceCompleted = false; 302*ec779b8eSAndroid Build Coastguard Worker // Whether all inflight requests in the sequence are completed 303*ec779b8eSAndroid Build Coastguard Worker // (capture results and buffers are generated). May be 304*ec779b8eSAndroid Build Coastguard Worker // set to true, but not removed from the map yet if the capture results 305*ec779b8eSAndroid Build Coastguard Worker // haven't been delivered to the app yet. 306*ec779b8eSAndroid Build Coastguard Worker bool isInflightCompleted = false; RequestLastFrameNumberHolderRequestLastFrameNumberHolder307*ec779b8eSAndroid Build Coastguard Worker RequestLastFrameNumberHolder(int64_t lastFN) : 308*ec779b8eSAndroid Build Coastguard Worker lastFrameNumber(lastFN) {} 309*ec779b8eSAndroid Build Coastguard Worker }; 310*ec779b8eSAndroid Build Coastguard Worker std::map<int, RequestLastFrameNumberHolder> mSequenceLastFrameNumberMap; 311*ec779b8eSAndroid Build Coastguard Worker 312*ec779b8eSAndroid Build Coastguard Worker struct CallbackHolder { 313*ec779b8eSAndroid Build Coastguard Worker CallbackHolder(sp<ACameraCaptureSession> session, 314*ec779b8eSAndroid Build Coastguard Worker const Vector<sp<CaptureRequest> >& requests, 315*ec779b8eSAndroid Build Coastguard Worker bool isRepeating, 316*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_captureCallbacks* cbs); 317*ec779b8eSAndroid Build Coastguard Worker CallbackHolder(sp<ACameraCaptureSession> session, 318*ec779b8eSAndroid Build Coastguard Worker const Vector<sp<CaptureRequest> >& requests, 319*ec779b8eSAndroid Build Coastguard Worker bool isRepeating, 320*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_logicalCamera_captureCallbacks* lcbs); 321*ec779b8eSAndroid Build Coastguard Worker CallbackHolder(sp<ACameraCaptureSession> session, 322*ec779b8eSAndroid Build Coastguard Worker const Vector<sp<CaptureRequest> >& requests, 323*ec779b8eSAndroid Build Coastguard Worker bool isRepeating, 324*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_captureCallbacksV2* cbs); 325*ec779b8eSAndroid Build Coastguard Worker CallbackHolder(sp<ACameraCaptureSession> session, 326*ec779b8eSAndroid Build Coastguard Worker const Vector<sp<CaptureRequest> >& requests, 327*ec779b8eSAndroid Build Coastguard Worker bool isRepeating, 328*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_logicalCamera_captureCallbacksV2* lcbs); clearCallbacksCallbackHolder329*ec779b8eSAndroid Build Coastguard Worker void clearCallbacks() { 330*ec779b8eSAndroid Build Coastguard Worker mContext = nullptr; 331*ec779b8eSAndroid Build Coastguard Worker mOnCaptureStarted = nullptr; 332*ec779b8eSAndroid Build Coastguard Worker mOnCaptureStarted2 = nullptr; 333*ec779b8eSAndroid Build Coastguard Worker mOnCaptureProgressed = nullptr; 334*ec779b8eSAndroid Build Coastguard Worker mOnCaptureCompleted = nullptr; 335*ec779b8eSAndroid Build Coastguard Worker mOnLogicalCameraCaptureCompleted = nullptr; 336*ec779b8eSAndroid Build Coastguard Worker mOnLogicalCameraCaptureFailed = nullptr; 337*ec779b8eSAndroid Build Coastguard Worker mOnCaptureFailed = nullptr; 338*ec779b8eSAndroid Build Coastguard Worker mOnCaptureSequenceCompleted = nullptr; 339*ec779b8eSAndroid Build Coastguard Worker mOnCaptureSequenceAborted = nullptr; 340*ec779b8eSAndroid Build Coastguard Worker mOnCaptureBufferLost = nullptr; 341*ec779b8eSAndroid Build Coastguard Worker } 342*ec779b8eSAndroid Build Coastguard Worker 343*ec779b8eSAndroid Build Coastguard Worker template <class T> initCaptureCallbacksV2CallbackHolder344*ec779b8eSAndroid Build Coastguard Worker void initCaptureCallbacksV2(T* cbs) { 345*ec779b8eSAndroid Build Coastguard Worker clearCallbacks(); 346*ec779b8eSAndroid Build Coastguard Worker if (cbs != nullptr) { 347*ec779b8eSAndroid Build Coastguard Worker mContext = cbs->context; 348*ec779b8eSAndroid Build Coastguard Worker mOnCaptureStarted2 = cbs->onCaptureStarted; 349*ec779b8eSAndroid Build Coastguard Worker mOnCaptureProgressed = cbs->onCaptureProgressed; 350*ec779b8eSAndroid Build Coastguard Worker mOnCaptureSequenceCompleted = cbs->onCaptureSequenceCompleted; 351*ec779b8eSAndroid Build Coastguard Worker mOnCaptureSequenceAborted = cbs->onCaptureSequenceAborted; 352*ec779b8eSAndroid Build Coastguard Worker mOnCaptureBufferLost = cbs->onCaptureBufferLost; 353*ec779b8eSAndroid Build Coastguard Worker } 354*ec779b8eSAndroid Build Coastguard Worker } 355*ec779b8eSAndroid Build Coastguard Worker 356*ec779b8eSAndroid Build Coastguard Worker template <class T> initCaptureCallbacksCallbackHolder357*ec779b8eSAndroid Build Coastguard Worker void initCaptureCallbacks(T* cbs) { 358*ec779b8eSAndroid Build Coastguard Worker clearCallbacks(); 359*ec779b8eSAndroid Build Coastguard Worker if (cbs != nullptr) { 360*ec779b8eSAndroid Build Coastguard Worker mContext = cbs->context; 361*ec779b8eSAndroid Build Coastguard Worker mOnCaptureStarted = cbs->onCaptureStarted; 362*ec779b8eSAndroid Build Coastguard Worker mOnCaptureProgressed = cbs->onCaptureProgressed; 363*ec779b8eSAndroid Build Coastguard Worker mOnCaptureSequenceCompleted = cbs->onCaptureSequenceCompleted; 364*ec779b8eSAndroid Build Coastguard Worker mOnCaptureSequenceAborted = cbs->onCaptureSequenceAborted; 365*ec779b8eSAndroid Build Coastguard Worker mOnCaptureBufferLost = cbs->onCaptureBufferLost; 366*ec779b8eSAndroid Build Coastguard Worker } 367*ec779b8eSAndroid Build Coastguard Worker } 368*ec779b8eSAndroid Build Coastguard Worker sp<ACameraCaptureSession> mSession; 369*ec779b8eSAndroid Build Coastguard Worker Vector<sp<CaptureRequest> > mRequests; 370*ec779b8eSAndroid Build Coastguard Worker const bool mIsRepeating; 371*ec779b8eSAndroid Build Coastguard Worker const bool mIsLogicalCameraCallback; 372*ec779b8eSAndroid Build Coastguard Worker const bool mIs2Callback; 373*ec779b8eSAndroid Build Coastguard Worker 374*ec779b8eSAndroid Build Coastguard Worker void* mContext; 375*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_captureCallback_start mOnCaptureStarted; 376*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_captureCallback_startV2 mOnCaptureStarted2; 377*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_captureCallback_result mOnCaptureProgressed; 378*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_captureCallback_result mOnCaptureCompleted; 379*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_logicalCamera_captureCallback_result mOnLogicalCameraCaptureCompleted; 380*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_logicalCamera_captureCallback_failed mOnLogicalCameraCaptureFailed; 381*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_captureCallback_failed mOnCaptureFailed; 382*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_captureCallback_sequenceEnd mOnCaptureSequenceCompleted; 383*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_captureCallback_sequenceAbort mOnCaptureSequenceAborted; 384*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_captureCallback_bufferLost mOnCaptureBufferLost; 385*ec779b8eSAndroid Build Coastguard Worker }; 386*ec779b8eSAndroid Build Coastguard Worker // sequence id -> callbacks map 387*ec779b8eSAndroid Build Coastguard Worker std::map<int, CallbackHolder> mSequenceCallbackMap; 388*ec779b8eSAndroid Build Coastguard Worker 389*ec779b8eSAndroid Build Coastguard Worker static const int64_t NO_FRAMES_CAPTURED = -1; 390*ec779b8eSAndroid Build Coastguard Worker class FrameNumberTracker { 391*ec779b8eSAndroid Build Coastguard Worker public: 392*ec779b8eSAndroid Build Coastguard Worker // TODO: Called in onResultReceived and onCaptureErrorLocked 393*ec779b8eSAndroid Build Coastguard Worker void updateTracker(int64_t frameNumber, bool isError); getCompletedFrameNumber()394*ec779b8eSAndroid Build Coastguard Worker inline int64_t getCompletedFrameNumber() { return mCompletedFrameNumber; } 395*ec779b8eSAndroid Build Coastguard Worker private: 396*ec779b8eSAndroid Build Coastguard Worker void update(); 397*ec779b8eSAndroid Build Coastguard Worker void updateCompletedFrameNumber(int64_t frameNumber); 398*ec779b8eSAndroid Build Coastguard Worker 399*ec779b8eSAndroid Build Coastguard Worker int64_t mCompletedFrameNumber = NO_FRAMES_CAPTURED; 400*ec779b8eSAndroid Build Coastguard Worker List<int64_t> mSkippedFrameNumbers; 401*ec779b8eSAndroid Build Coastguard Worker std::set<int64_t> mFutureErrorSet; 402*ec779b8eSAndroid Build Coastguard Worker }; 403*ec779b8eSAndroid Build Coastguard Worker FrameNumberTracker mFrameNumberTracker; 404*ec779b8eSAndroid Build Coastguard Worker 405*ec779b8eSAndroid Build Coastguard Worker void checkRepeatingSequenceCompleteLocked(const int sequenceId, const int64_t lastFrameNumber); 406*ec779b8eSAndroid Build Coastguard Worker void checkAndFireSequenceCompleteLocked(); 407*ec779b8eSAndroid Build Coastguard Worker void removeCompletedCallbackHolderLocked(int64_t lastCompletedRegularFrameNumber); 408*ec779b8eSAndroid Build Coastguard Worker void sendCaptureSequenceCompletedLocked(int sequenceId, int64_t lastFrameNumber); 409*ec779b8eSAndroid Build Coastguard Worker 410*ec779b8eSAndroid Build Coastguard Worker // Misc variables 411*ec779b8eSAndroid Build Coastguard Worker int32_t mShadingMapSize[2]; // const after constructor 412*ec779b8eSAndroid Build Coastguard Worker int32_t mPartialResultCount; // const after constructor 413*ec779b8eSAndroid Build Coastguard Worker std::vector<std::string> mPhysicalIds; // const after constructor 414*ec779b8eSAndroid Build Coastguard Worker 415*ec779b8eSAndroid Build Coastguard Worker // Metadata queue to write the result metadata to. 416*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<ResultMetadataQueue> mCaptureResultMetadataQueue; 417*ec779b8eSAndroid Build Coastguard Worker 418*ec779b8eSAndroid Build Coastguard Worker }; 419*ec779b8eSAndroid Build Coastguard Worker 420*ec779b8eSAndroid Build Coastguard Worker } // namespace acam; 421*ec779b8eSAndroid Build Coastguard Worker } // namespace android; 422*ec779b8eSAndroid Build Coastguard Worker 423*ec779b8eSAndroid Build Coastguard Worker /** 424*ec779b8eSAndroid Build Coastguard Worker * ACameraDevice opaque struct definition 425*ec779b8eSAndroid Build Coastguard Worker * Leave outside of android namespace because it's NDK struct 426*ec779b8eSAndroid Build Coastguard Worker */ 427*ec779b8eSAndroid Build Coastguard Worker struct ACameraDevice { ACameraDeviceACameraDevice428*ec779b8eSAndroid Build Coastguard Worker ACameraDevice(const char* id, ACameraDevice_StateCallbacks* cb, 429*ec779b8eSAndroid Build Coastguard Worker sp<ACameraMetadata> chars, bool sharedMode) : 430*ec779b8eSAndroid Build Coastguard Worker mDevice(new android::acam::CameraDevice(id, cb, chars, this, sharedMode)) {} 431*ec779b8eSAndroid Build Coastguard Worker 432*ec779b8eSAndroid Build Coastguard Worker ~ACameraDevice(); 433*ec779b8eSAndroid Build Coastguard Worker 434*ec779b8eSAndroid Build Coastguard Worker /******************* 435*ec779b8eSAndroid Build Coastguard Worker * NDK public APIs * 436*ec779b8eSAndroid Build Coastguard Worker *******************/ getIdACameraDevice437*ec779b8eSAndroid Build Coastguard Worker inline const char* getId() const { return mDevice->getId(); } 438*ec779b8eSAndroid Build Coastguard Worker createCaptureRequestACameraDevice439*ec779b8eSAndroid Build Coastguard Worker camera_status_t createCaptureRequest( 440*ec779b8eSAndroid Build Coastguard Worker ACameraDevice_request_template templateId, 441*ec779b8eSAndroid Build Coastguard Worker const ACameraIdList* physicalCameraIdList, 442*ec779b8eSAndroid Build Coastguard Worker ACaptureRequest** request) const { 443*ec779b8eSAndroid Build Coastguard Worker return mDevice->createCaptureRequest(templateId, physicalCameraIdList, request); 444*ec779b8eSAndroid Build Coastguard Worker } 445*ec779b8eSAndroid Build Coastguard Worker createCaptureSessionACameraDevice446*ec779b8eSAndroid Build Coastguard Worker camera_status_t createCaptureSession( 447*ec779b8eSAndroid Build Coastguard Worker const ACaptureSessionOutputContainer* outputs, 448*ec779b8eSAndroid Build Coastguard Worker const ACaptureRequest* sessionParameters, 449*ec779b8eSAndroid Build Coastguard Worker const ACameraCaptureSession_stateCallbacks* callbacks, 450*ec779b8eSAndroid Build Coastguard Worker /*out*/ACameraCaptureSession** session) { 451*ec779b8eSAndroid Build Coastguard Worker return mDevice->createCaptureSession(outputs, sessionParameters, callbacks, session); 452*ec779b8eSAndroid Build Coastguard Worker } 453*ec779b8eSAndroid Build Coastguard Worker isSessionConfigurationSupportedACameraDevice454*ec779b8eSAndroid Build Coastguard Worker camera_status_t isSessionConfigurationSupported( 455*ec779b8eSAndroid Build Coastguard Worker const ACaptureSessionOutputContainer* sessionOutputContainer) const { 456*ec779b8eSAndroid Build Coastguard Worker return mDevice->isSessionConfigurationSupported(sessionOutputContainer); 457*ec779b8eSAndroid Build Coastguard Worker } 458*ec779b8eSAndroid Build Coastguard Worker 459*ec779b8eSAndroid Build Coastguard Worker /*********************** 460*ec779b8eSAndroid Build Coastguard Worker * Device interal APIs * 461*ec779b8eSAndroid Build Coastguard Worker ***********************/ getServiceCallbackACameraDevice462*ec779b8eSAndroid Build Coastguard Worker inline android::sp<android::hardware::camera2::ICameraDeviceCallbacks> getServiceCallback() { 463*ec779b8eSAndroid Build Coastguard Worker return mDevice->getServiceCallback(); 464*ec779b8eSAndroid Build Coastguard Worker }; 465*ec779b8eSAndroid Build Coastguard Worker 466*ec779b8eSAndroid Build Coastguard Worker // Camera device is only functional after remote being set setRemoteDeviceACameraDevice467*ec779b8eSAndroid Build Coastguard Worker inline void setRemoteDevice(android::sp<android::hardware::camera2::ICameraDeviceUser> remote) { 468*ec779b8eSAndroid Build Coastguard Worker mDevice->setRemoteDevice(remote); 469*ec779b8eSAndroid Build Coastguard Worker } 470*ec779b8eSAndroid Build Coastguard Worker setDeviceMetadataQueuesACameraDevice471*ec779b8eSAndroid Build Coastguard Worker inline bool setDeviceMetadataQueues() { 472*ec779b8eSAndroid Build Coastguard Worker return mDevice->setDeviceMetadataQueues(); 473*ec779b8eSAndroid Build Coastguard Worker } 474*ec779b8eSAndroid Build Coastguard Worker setPrimaryClientACameraDevice475*ec779b8eSAndroid Build Coastguard Worker inline void setPrimaryClient(bool isPrimary) { 476*ec779b8eSAndroid Build Coastguard Worker mDevice->setPrimaryClient(isPrimary); 477*ec779b8eSAndroid Build Coastguard Worker } 478*ec779b8eSAndroid Build Coastguard Worker isPrimaryClientACameraDevice479*ec779b8eSAndroid Build Coastguard Worker inline bool isPrimaryClient() { 480*ec779b8eSAndroid Build Coastguard Worker return mDevice->isPrimaryClient(); 481*ec779b8eSAndroid Build Coastguard Worker } 482*ec779b8eSAndroid Build Coastguard Worker 483*ec779b8eSAndroid Build Coastguard Worker private: 484*ec779b8eSAndroid Build Coastguard Worker android::sp<android::acam::CameraDevice> mDevice; 485*ec779b8eSAndroid Build Coastguard Worker }; 486*ec779b8eSAndroid Build Coastguard Worker 487*ec779b8eSAndroid Build Coastguard Worker #endif // _ACAMERA_DEVICE_H 488