blob: d3aed4b2a4bb3937964c408c72d4353ba1b30eef [file] [log] [blame]
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001/*
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>
Yin-Chia Yehead91462016-01-06 16:45:08 -080020#include <map>
21#include <set>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080022#include <atomic>
Yin-Chia Yehe081c592016-03-29 18:26:44 -070023#include <utility>
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080024#include <vector>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080025#include <utils/StrongPointer.h>
26#include <utils/Mutex.h>
27#include <utils/String8.h>
Yin-Chia Yehead91462016-01-06 16:45:08 -080028#include <utils/List.h>
29#include <utils/Vector.h>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080030
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080031#include <android/hardware/camera2/BnCameraDeviceCallbacks.h>
32#include <android/hardware/camera2/ICameraDeviceUser.h>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080033#include <media/stagefright/foundation/ALooper.h>
34#include <media/stagefright/foundation/AHandler.h>
35#include <media/stagefright/foundation/AMessage.h>
Yin-Chia Yehead91462016-01-06 16:45:08 -080036#include <camera/CaptureResult.h>
Yin-Chia Yehead91462016-01-06 16:45:08 -080037#include <camera/camera2/OutputConfiguration.h>
Shuzhen Wang24810e72019-03-18 10:55:01 -070038#include <camera/camera2/SessionConfiguration.h>
Yin-Chia Yehead91462016-01-06 16:45:08 -080039#include <camera/camera2/CaptureRequest.h>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080040
Emilian Peev40ead602017-09-26 15:46:36 +010041#include <camera/NdkCameraManager.h>
42#include <camera/NdkCameraCaptureSession.h>
Jayant Chowdharya8bf1c62019-09-26 08:50:17 -070043
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080044#include "ACameraMetadata.h"
45
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080046namespace android {
Jayant Chowdhary6df26072018-11-06 23:55:12 -080047namespace acam {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080048
Yin-Chia Yehd21c46b2017-10-10 11:59:46 -070049// Wrap ACameraCaptureFailure so it can be ref-counted
Yin-Chia Yehead91462016-01-06 16:45:08 -080050struct CameraCaptureFailure : public RefBase, public ACameraCaptureFailure {};
51
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080052// Wrap PhysicalCaptureResultInfo so that it can be ref-counted
53struct ACameraPhysicalCaptureResultInfo: public RefBase {
54 ACameraPhysicalCaptureResultInfo(const std::vector<PhysicalCaptureResultInfo>& info,
55 int64_t frameNumber) :
56 mPhysicalResultInfo(info), mFrameNumber(frameNumber) {}
57
58 std::vector<PhysicalCaptureResultInfo> mPhysicalResultInfo;
59 int64_t mFrameNumber;
60};
61
Yin-Chia Yehead91462016-01-06 16:45:08 -080062class CameraDevice final : public RefBase {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080063 public:
64 CameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -070065 sp<ACameraMetadata> chars,
Jyoti Bhayana1f9600b2024-10-29 20:25:32 -070066 ACameraDevice* wrapper, bool sharedMode);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080067 ~CameraDevice();
68
Tomasz Wasilczyk12b04a52023-08-11 15:52:22 +000069 inline const char* getId() const { return mCameraId.c_str(); }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080070
71 camera_status_t createCaptureRequest(
72 ACameraDevice_request_template templateId,
Shuzhen Wang6c17e212019-02-19 14:51:47 -080073 const ACameraIdList* physicalIdList,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080074 ACaptureRequest** request) const;
75
Yin-Chia Yehead91462016-01-06 16:45:08 -080076 camera_status_t createCaptureSession(
77 const ACaptureSessionOutputContainer* outputs,
Emilian Peev5fbe0ba2017-10-20 15:45:45 +010078 const ACaptureRequest* sessionParameters,
Yin-Chia Yehead91462016-01-06 16:45:08 -080079 const ACameraCaptureSession_stateCallbacks* callbacks,
80 /*out*/ACameraCaptureSession** session);
81
Shuzhen Wang24810e72019-03-18 10:55:01 -070082 camera_status_t isSessionConfigurationSupported(
83 const ACaptureSessionOutputContainer* sessionOutputContainer) const;
84
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080085 // Callbacks from camera service
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080086 class ServiceCallback : public hardware::camera2::BnCameraDeviceCallbacks {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080087 public:
Chih-Hung Hsiehd19d9942016-08-29 14:21:14 -070088 explicit ServiceCallback(CameraDevice* device) : mDevice(device) {}
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080089 binder::Status onDeviceError(int32_t errorCode,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080090 const CaptureResultExtras& resultExtras) override;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080091 binder::Status onDeviceIdle() override;
92 binder::Status onCaptureStarted(const CaptureResultExtras& resultExtras,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080093 int64_t timestamp) override;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080094 binder::Status onResultReceived(const CameraMetadata& metadata,
Shuzhen Wang5c22c152017-12-31 17:12:25 -080095 const CaptureResultExtras& resultExtras,
96 const std::vector<PhysicalCaptureResultInfo>& physicalResultInfos) override;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080097 binder::Status onPrepared(int streamId) override;
Shuzhen Wang9d066012016-09-30 11:30:20 -070098 binder::Status onRequestQueueEmpty() override;
Yin-Chia Yeh8ca23dc2017-09-05 18:15:56 -070099 binder::Status onRepeatingRequestError(int64_t lastFrameNumber,
100 int32_t stoppedSequenceId) override;
Jyoti Bhayana1f9600b2024-10-29 20:25:32 -0700101 binder::Status onClientSharedAccessPriorityChanged(bool isPrimaryClient) override;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800102 private:
103 const wp<CameraDevice> mDevice;
104 };
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800105 inline sp<hardware::camera2::ICameraDeviceCallbacks> getServiceCallback() {
106 return mServiceCallback;
107 };
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800108
109 // Camera device is only functional after remote being set
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800110 void setRemoteDevice(sp<hardware::camera2::ICameraDeviceUser> remote);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800111
Yin-Chia Yehead91462016-01-06 16:45:08 -0800112 inline ACameraDevice* getWrapper() const { return mWrapper; };
113
Jayant Chowdharya8488c92019-06-21 12:45:34 -0700114 // Stop the looper thread and unregister the handler
Jayant Chowdharya8bf1c62019-09-26 08:50:17 -0700115 void stopLooperAndDisconnect();
Jayant Chowdharya8488c92019-06-21 12:45:34 -0700116
Jyoti Bhayana1f9600b2024-10-29 20:25:32 -0700117 void setPrimaryClient(bool isPrimary) {mIsPrimaryClient = isPrimary;};
118 bool isPrimaryClient() {return mIsPrimaryClient;};
119
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800120 private:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800121 friend ACameraCaptureSession;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800122 camera_status_t checkCameraClosedOrErrorLocked() const;
123
Yin-Chia Yehead91462016-01-06 16:45:08 -0800124 // device goes into fatal error state after this
125 void setCameraDeviceErrorLocked(camera_status_t error);
126
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700127 void disconnectLocked(sp<ACameraCaptureSession>& session); // disconnect from camera service
Yin-Chia Yehead91462016-01-06 16:45:08 -0800128
129 camera_status_t stopRepeatingLocked();
130
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700131 camera_status_t flushLocked(ACameraCaptureSession*);
132
Yin-Chia Yehead91462016-01-06 16:45:08 -0800133 camera_status_t waitUntilIdleLocked();
134
135
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800136 template<class T>
Yin-Chia Yehead91462016-01-06 16:45:08 -0800137 camera_status_t captureLocked(sp<ACameraCaptureSession> session,
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800138 /*optional*/T* cbs,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800139 int numRequests, ACaptureRequest** requests,
140 /*optional*/int* captureSequenceId);
141
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800142 template<class T>
Yin-Chia Yehead91462016-01-06 16:45:08 -0800143 camera_status_t setRepeatingRequestsLocked(sp<ACameraCaptureSession> session,
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800144 /*optional*/T* cbs,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800145 int numRequests, ACaptureRequest** requests,
146 /*optional*/int* captureSequenceId);
147
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800148 template<class T>
Yin-Chia Yehead91462016-01-06 16:45:08 -0800149 camera_status_t submitRequestsLocked(
150 sp<ACameraCaptureSession> session,
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800151 /*optional*/T* cbs,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800152 int numRequests, ACaptureRequest** requests,
153 /*out*/int* captureSequenceId,
154 bool isRepeating);
155
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800156 camera_status_t updateOutputConfigurationLocked(ACaptureSessionOutput *output);
Emilian Peev40ead602017-09-26 15:46:36 +0100157
Avichal Rakesh8effe982023-11-13 18:53:40 -0800158 camera_status_t prepareLocked(ANativeWindow *window);
Jayant Chowdhary09b368b2023-02-13 06:53:05 +0000159
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800160 camera_status_t allocateCaptureRequest(
Yin-Chia Yehead91462016-01-06 16:45:08 -0800161 const ACaptureRequest* request, sp<CaptureRequest>& outReq);
162
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800163 static ACaptureRequest* allocateACaptureRequest(sp<CaptureRequest>& req,
164 const std::string& deviceId);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800165 static void freeACaptureRequest(ACaptureRequest*);
166
167 // only For session to hold device lock
168 // Always grab device lock before grabbing session lock
169 void lockDeviceForSessionOps() const { mDeviceLock.lock(); };
170 void unlockDevice() const { mDeviceLock.unlock(); };
171
172 // For capture session to notify its end of life
173 void notifySessionEndOfLifeLocked(ACameraCaptureSession* session);
174
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100175 camera_status_t configureStreamsLocked(const ACaptureSessionOutputContainer* outputs,
Shuzhen Wang316781a2020-08-18 18:11:01 -0700176 const ACaptureRequest* sessionParameters, nsecs_t startTimeNs);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800177
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700178 // Input message will be posted and cleared after this returns
179 void postSessionMsgAndCleanup(sp<AMessage>& msg);
180
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700181 static camera_status_t getIGBPfromAnw(
182 ANativeWindow* anw, sp<IGraphicBufferProducer>& out);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800183
184 static camera_status_t getSurfaceFromANativeWindow(
185 ANativeWindow* anw, sp<Surface>& out);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800186
187 mutable Mutex mDeviceLock;
188 const String8 mCameraId; // Camera ID
189 const ACameraDevice_StateCallbacks mAppCallbacks; // Callback to app
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -0700190 const sp<ACameraMetadata> mChars; // Camera characteristics
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800191 const sp<ServiceCallback> mServiceCallback;
192 ACameraDevice* mWrapper;
Jyoti Bhayana1f9600b2024-10-29 20:25:32 -0700193 bool mSharedMode;
194 bool mIsPrimaryClient;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800195
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700196 // stream id -> pair of (ANW* from application, OutputConfiguration used for camera service)
197 std::map<int, std::pair<ANativeWindow*, OutputConfiguration>> mConfiguredOutputs;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800198
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800199 // TODO: maybe a bool will suffice for synchronous implementation?
200 std::atomic_bool mClosing;
201 inline bool isClosed() { return mClosing; }
202
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700203 bool mInError = false;
204 camera_status_t mError = ACAMERA_OK;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800205 void onCaptureErrorLocked(
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800206 int32_t errorCode,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800207 const CaptureResultExtras& resultExtras);
208
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700209 bool mIdle = true;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800210 // This will avoid a busy session being deleted before it's back to idle state
211 sp<ACameraCaptureSession> mBusySession;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800212
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800213 sp<hardware::camera2::ICameraDeviceUser> mRemote;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800214
215 // Looper thread to handle callback to app
216 sp<ALooper> mCbLooper;
217 // definition of handler and message
218 enum {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800219 // Device state callbacks
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700220 kWhatOnDisconnected, // onDisconnected
221 kWhatOnError, // onError
Yin-Chia Yehead91462016-01-06 16:45:08 -0800222 // Session state callbacks
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700223 kWhatSessionStateCb, // onReady, onActive
Yin-Chia Yehead91462016-01-06 16:45:08 -0800224 // Capture callbacks
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700225 kWhatCaptureStart, // onCaptureStarted
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +0000226 kWhatCaptureStart2, // onCaptureStarted
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700227 kWhatCaptureResult, // onCaptureProgressed, onCaptureCompleted
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800228 kWhatLogicalCaptureResult, // onLogicalCameraCaptureCompleted
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700229 kWhatCaptureFail, // onCaptureFailed
Emilian Peevedec62d2019-03-19 17:59:24 -0700230 kWhatLogicalCaptureFail, // onLogicalCameraCaptureFailed
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700231 kWhatCaptureSeqEnd, // onCaptureSequenceCompleted
232 kWhatCaptureSeqAbort, // onCaptureSequenceAborted
Jayant Chowdhary09b368b2023-02-13 06:53:05 +0000233 kWhatCaptureBufferLost, // onCaptureBufferLost
234 kWhatPreparedCb, // onWindowPrepared
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700235 // Internal cleanup
Jyoti Bhayana1f9600b2024-10-29 20:25:32 -0700236 kWhatCleanUpSessions, // Cleanup cached sp<ACameraCaptureSession>
237 kWhatClientSharedAccessPriorityChanged
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800238 };
239 static const char* kContextKey;
240 static const char* kDeviceKey;
241 static const char* kErrorCodeKey;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800242 static const char* kCallbackFpKey;
243 static const char* kSessionSpKey;
244 static const char* kCaptureRequestKey;
245 static const char* kTimeStampKey;
246 static const char* kCaptureResultKey;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800247 static const char* kPhysicalCaptureResultKey;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800248 static const char* kCaptureFailureKey;
249 static const char* kSequenceIdKey;
250 static const char* kFrameNumberKey;
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700251 static const char* kAnwKey;
Emilian Peevedec62d2019-03-19 17:59:24 -0700252 static const char* kFailingPhysicalCameraId;
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700253
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800254 class CallbackHandler : public AHandler {
255 public:
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800256 explicit CallbackHandler(const char* id);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800257 void onMessageReceived(const sp<AMessage> &msg) override;
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700258
259 private:
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800260 std::string mId;
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700261 // This handler will cache all capture session sp until kWhatCleanUpSessions
262 // is processed. This is used to guarantee the last session reference is always
263 // being removed in callback thread without holding camera device lock
264 Vector<sp<ACameraCaptureSession>> mCachedSessions;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800265 };
266 sp<CallbackHandler> mHandler;
267
Yin-Chia Yehead91462016-01-06 16:45:08 -0800268 /***********************************
269 * Capture session related members *
270 ***********************************/
271 // The current active session
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700272 wp<ACameraCaptureSession> mCurrentSession;
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700273 bool mFlushing = false;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800274
Yin-Chia Yehead91462016-01-06 16:45:08 -0800275 int mNextSessionId = 0;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800276 // TODO: might need another looper/handler to handle callbacks from service
277
Yin-Chia Yehead91462016-01-06 16:45:08 -0800278 static const int REQUEST_ID_NONE = -1;
279 int mRepeatingSequenceId = REQUEST_ID_NONE;
280
Shuzhen Wangb7b42652020-05-07 11:59:02 -0700281 // sequence id -> last frame number holder map
282 struct RequestLastFrameNumberHolder {
283 int64_t lastFrameNumber;
284 // Whether the current sequence is completed (capture results are
285 // generated). May be set to true, but
286 // not removed from the map if not all inflight requests in the sequence
287 // have been completed.
288 bool isSequenceCompleted = false;
289 // Whether all inflight requests in the sequence are completed
290 // (capture results and buffers are generated). May be
291 // set to true, but not removed from the map yet if the capture results
292 // haven't been delivered to the app yet.
293 bool isInflightCompleted = false;
294 RequestLastFrameNumberHolder(int64_t lastFN) :
295 lastFrameNumber(lastFN) {}
296 };
297 std::map<int, RequestLastFrameNumberHolder> mSequenceLastFrameNumberMap;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800298
299 struct CallbackHolder {
300 CallbackHolder(sp<ACameraCaptureSession> session,
301 const Vector<sp<CaptureRequest> >& requests,
302 bool isRepeating,
303 ACameraCaptureSession_captureCallbacks* cbs);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800304 CallbackHolder(sp<ACameraCaptureSession> session,
305 const Vector<sp<CaptureRequest> >& requests,
306 bool isRepeating,
307 ACameraCaptureSession_logicalCamera_captureCallbacks* lcbs);
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +0000308 CallbackHolder(sp<ACameraCaptureSession> session,
309 const Vector<sp<CaptureRequest> >& requests,
310 bool isRepeating,
311 ACameraCaptureSession_captureCallbacksV2* cbs);
312 CallbackHolder(sp<ACameraCaptureSession> session,
313 const Vector<sp<CaptureRequest> >& requests,
314 bool isRepeating,
315 ACameraCaptureSession_logicalCamera_captureCallbacksV2* lcbs);
316 void clearCallbacks() {
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800317 mContext = nullptr;
318 mOnCaptureStarted = nullptr;
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +0000319 mOnCaptureStarted2 = nullptr;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800320 mOnCaptureProgressed = nullptr;
321 mOnCaptureCompleted = nullptr;
322 mOnLogicalCameraCaptureCompleted = nullptr;
Emilian Peevedec62d2019-03-19 17:59:24 -0700323 mOnLogicalCameraCaptureFailed = nullptr;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800324 mOnCaptureFailed = nullptr;
325 mOnCaptureSequenceCompleted = nullptr;
326 mOnCaptureSequenceAborted = nullptr;
327 mOnCaptureBufferLost = nullptr;
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +0000328 }
329
330 template <class T>
331 void initCaptureCallbacksV2(T* cbs) {
332 clearCallbacks();
333 if (cbs != nullptr) {
334 mContext = cbs->context;
335 mOnCaptureStarted2 = cbs->onCaptureStarted;
336 mOnCaptureProgressed = cbs->onCaptureProgressed;
337 mOnCaptureSequenceCompleted = cbs->onCaptureSequenceCompleted;
338 mOnCaptureSequenceAborted = cbs->onCaptureSequenceAborted;
339 mOnCaptureBufferLost = cbs->onCaptureBufferLost;
340 }
341 }
342
343 template <class T>
344 void initCaptureCallbacks(T* cbs) {
345 clearCallbacks();
Yin-Chia Yehead91462016-01-06 16:45:08 -0800346 if (cbs != nullptr) {
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800347 mContext = cbs->context;
348 mOnCaptureStarted = cbs->onCaptureStarted;
349 mOnCaptureProgressed = cbs->onCaptureProgressed;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800350 mOnCaptureSequenceCompleted = cbs->onCaptureSequenceCompleted;
351 mOnCaptureSequenceAborted = cbs->onCaptureSequenceAborted;
352 mOnCaptureBufferLost = cbs->onCaptureBufferLost;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800353 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800354 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800355 sp<ACameraCaptureSession> mSession;
356 Vector<sp<CaptureRequest> > mRequests;
357 const bool mIsRepeating;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800358 const bool mIsLogicalCameraCallback;
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +0000359 const bool mIs2Callback;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800360
361 void* mContext;
362 ACameraCaptureSession_captureCallback_start mOnCaptureStarted;
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +0000363 ACameraCaptureSession_captureCallback_startV2 mOnCaptureStarted2;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800364 ACameraCaptureSession_captureCallback_result mOnCaptureProgressed;
365 ACameraCaptureSession_captureCallback_result mOnCaptureCompleted;
366 ACameraCaptureSession_logicalCamera_captureCallback_result mOnLogicalCameraCaptureCompleted;
Emilian Peevedec62d2019-03-19 17:59:24 -0700367 ACameraCaptureSession_logicalCamera_captureCallback_failed mOnLogicalCameraCaptureFailed;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800368 ACameraCaptureSession_captureCallback_failed mOnCaptureFailed;
369 ACameraCaptureSession_captureCallback_sequenceEnd mOnCaptureSequenceCompleted;
370 ACameraCaptureSession_captureCallback_sequenceAbort mOnCaptureSequenceAborted;
371 ACameraCaptureSession_captureCallback_bufferLost mOnCaptureBufferLost;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800372 };
373 // sequence id -> callbacks map
374 std::map<int, CallbackHolder> mSequenceCallbackMap;
375
376 static const int64_t NO_FRAMES_CAPTURED = -1;
377 class FrameNumberTracker {
378 public:
379 // TODO: Called in onResultReceived and onCaptureErrorLocked
380 void updateTracker(int64_t frameNumber, bool isError);
381 inline int64_t getCompletedFrameNumber() { return mCompletedFrameNumber; }
382 private:
383 void update();
384 void updateCompletedFrameNumber(int64_t frameNumber);
385
386 int64_t mCompletedFrameNumber = NO_FRAMES_CAPTURED;
387 List<int64_t> mSkippedFrameNumbers;
388 std::set<int64_t> mFutureErrorSet;
389 };
390 FrameNumberTracker mFrameNumberTracker;
391
392 void checkRepeatingSequenceCompleteLocked(const int sequenceId, const int64_t lastFrameNumber);
393 void checkAndFireSequenceCompleteLocked();
Shuzhen Wangb7b42652020-05-07 11:59:02 -0700394 void removeCompletedCallbackHolderLocked(int64_t lastCompletedRegularFrameNumber);
Shuzhen Wangacae2642020-12-21 17:11:37 -0800395 void sendCaptureSequenceCompletedLocked(int sequenceId, int64_t lastFrameNumber);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800396
397 // Misc variables
398 int32_t mShadingMapSize[2]; // const after constructor
399 int32_t mPartialResultCount; // const after constructor
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800400 std::vector<std::string> mPhysicalIds; // const after constructor
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800401
402};
403
Jayant Chowdhary6df26072018-11-06 23:55:12 -0800404} // namespace acam;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800405} // namespace android;
406
407/**
408 * ACameraDevice opaque struct definition
409 * Leave outside of android namespace because it's NDK struct
410 */
411struct ACameraDevice {
412 ACameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
Jyoti Bhayana1f9600b2024-10-29 20:25:32 -0700413 sp<ACameraMetadata> chars, bool sharedMode) :
414 mDevice(new android::acam::CameraDevice(id, cb, chars, this, sharedMode)) {}
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800415
Jayant Chowdharya8488c92019-06-21 12:45:34 -0700416 ~ACameraDevice();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800417
Yin-Chia Yehead91462016-01-06 16:45:08 -0800418 /*******************
419 * NDK public APIs *
420 *******************/
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800421 inline const char* getId() const { return mDevice->getId(); }
422
423 camera_status_t createCaptureRequest(
424 ACameraDevice_request_template templateId,
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800425 const ACameraIdList* physicalCameraIdList,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800426 ACaptureRequest** request) const {
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800427 return mDevice->createCaptureRequest(templateId, physicalCameraIdList, request);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800428 }
429
Yin-Chia Yehead91462016-01-06 16:45:08 -0800430 camera_status_t createCaptureSession(
431 const ACaptureSessionOutputContainer* outputs,
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100432 const ACaptureRequest* sessionParameters,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800433 const ACameraCaptureSession_stateCallbacks* callbacks,
434 /*out*/ACameraCaptureSession** session) {
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100435 return mDevice->createCaptureSession(outputs, sessionParameters, callbacks, session);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800436 }
437
Shuzhen Wang24810e72019-03-18 10:55:01 -0700438 camera_status_t isSessionConfigurationSupported(
439 const ACaptureSessionOutputContainer* sessionOutputContainer) const {
440 return mDevice->isSessionConfigurationSupported(sessionOutputContainer);
441 }
442
Yin-Chia Yehead91462016-01-06 16:45:08 -0800443 /***********************
444 * Device interal APIs *
445 ***********************/
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800446 inline android::sp<android::hardware::camera2::ICameraDeviceCallbacks> getServiceCallback() {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800447 return mDevice->getServiceCallback();
448 };
449
450 // Camera device is only functional after remote being set
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800451 inline void setRemoteDevice(android::sp<android::hardware::camera2::ICameraDeviceUser> remote) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800452 mDevice->setRemoteDevice(remote);
453 }
454
Jyoti Bhayana1f9600b2024-10-29 20:25:32 -0700455 inline void setPrimaryClient(bool isPrimary) {
456 mDevice->setPrimaryClient(isPrimary);
457 }
458
459 inline bool isPrimaryClient() {
460 return mDevice->isPrimaryClient();
461 }
462
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800463 private:
Jayant Chowdhary6df26072018-11-06 23:55:12 -0800464 android::sp<android::acam::CameraDevice> mDevice;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800465};
466
467#endif // _ACAMERA_DEVICE_H