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