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