xref: /aosp_15_r20/frameworks/av/camera/ndk/impl/ACameraDevice.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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