blob: 7a35bf0e81f6f53b9153fee75b2132ea4a9b4d1b [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>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080043#include "ACameraMetadata.h"
44
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080045namespace android {
Jayant Chowdhary6df26072018-11-06 23:55:12 -080046namespace acam {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080047
Yin-Chia Yehd21c46b2017-10-10 11:59:46 -070048// Wrap ACameraCaptureFailure so it can be ref-counted
Yin-Chia Yehead91462016-01-06 16:45:08 -080049struct CameraCaptureFailure : public RefBase, public ACameraCaptureFailure {};
50
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080051// Wrap PhysicalCaptureResultInfo so that it can be ref-counted
52struct ACameraPhysicalCaptureResultInfo: public RefBase {
53 ACameraPhysicalCaptureResultInfo(const std::vector<PhysicalCaptureResultInfo>& info,
54 int64_t frameNumber) :
55 mPhysicalResultInfo(info), mFrameNumber(frameNumber) {}
56
57 std::vector<PhysicalCaptureResultInfo> mPhysicalResultInfo;
58 int64_t mFrameNumber;
59};
60
Yin-Chia Yehead91462016-01-06 16:45:08 -080061class CameraDevice final : public RefBase {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080062 public:
63 CameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -070064 sp<ACameraMetadata> chars,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080065 ACameraDevice* wrapper);
66 ~CameraDevice();
67
68 inline const char* getId() const { return mCameraId.string(); }
69
70 camera_status_t createCaptureRequest(
71 ACameraDevice_request_template templateId,
Shuzhen Wang6c17e212019-02-19 14:51:47 -080072 const ACameraIdList* physicalIdList,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080073 ACaptureRequest** request) const;
74
Yin-Chia Yehead91462016-01-06 16:45:08 -080075 camera_status_t createCaptureSession(
76 const ACaptureSessionOutputContainer* outputs,
Emilian Peev5fbe0ba2017-10-20 15:45:45 +010077 const ACaptureRequest* sessionParameters,
Yin-Chia Yehead91462016-01-06 16:45:08 -080078 const ACameraCaptureSession_stateCallbacks* callbacks,
79 /*out*/ACameraCaptureSession** session);
80
Shuzhen Wang24810e72019-03-18 10:55:01 -070081 camera_status_t isSessionConfigurationSupported(
82 const ACaptureSessionOutputContainer* sessionOutputContainer) const;
83
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080084 // Callbacks from camera service
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080085 class ServiceCallback : public hardware::camera2::BnCameraDeviceCallbacks {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080086 public:
Chih-Hung Hsiehd19d9942016-08-29 14:21:14 -070087 explicit ServiceCallback(CameraDevice* device) : mDevice(device) {}
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080088 binder::Status onDeviceError(int32_t errorCode,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080089 const CaptureResultExtras& resultExtras) override;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080090 binder::Status onDeviceIdle() override;
91 binder::Status onCaptureStarted(const CaptureResultExtras& resultExtras,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080092 int64_t timestamp) override;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080093 binder::Status onResultReceived(const CameraMetadata& metadata,
Shuzhen Wang5c22c152017-12-31 17:12:25 -080094 const CaptureResultExtras& resultExtras,
95 const std::vector<PhysicalCaptureResultInfo>& physicalResultInfos) override;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080096 binder::Status onPrepared(int streamId) override;
Shuzhen Wang9d066012016-09-30 11:30:20 -070097 binder::Status onRequestQueueEmpty() override;
Yin-Chia Yeh8ca23dc2017-09-05 18:15:56 -070098 binder::Status onRepeatingRequestError(int64_t lastFrameNumber,
99 int32_t stoppedSequenceId) override;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800100 private:
101 const wp<CameraDevice> mDevice;
102 };
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800103 inline sp<hardware::camera2::ICameraDeviceCallbacks> getServiceCallback() {
104 return mServiceCallback;
105 };
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800106
107 // Camera device is only functional after remote being set
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800108 void setRemoteDevice(sp<hardware::camera2::ICameraDeviceUser> remote);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800109
Yin-Chia Yehead91462016-01-06 16:45:08 -0800110 inline ACameraDevice* getWrapper() const { return mWrapper; };
111
Jayant Chowdharya8488c92019-06-21 12:45:34 -0700112 // Stop the looper thread and unregister the handler
113 void stopLooper();
114
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800115 private:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800116 friend ACameraCaptureSession;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800117 camera_status_t checkCameraClosedOrErrorLocked() const;
118
Yin-Chia Yehead91462016-01-06 16:45:08 -0800119 // device goes into fatal error state after this
120 void setCameraDeviceErrorLocked(camera_status_t error);
121
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700122 void disconnectLocked(sp<ACameraCaptureSession>& session); // disconnect from camera service
Yin-Chia Yehead91462016-01-06 16:45:08 -0800123
124 camera_status_t stopRepeatingLocked();
125
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700126 camera_status_t flushLocked(ACameraCaptureSession*);
127
Yin-Chia Yehead91462016-01-06 16:45:08 -0800128 camera_status_t waitUntilIdleLocked();
129
130
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800131 template<class T>
Yin-Chia Yehead91462016-01-06 16:45:08 -0800132 camera_status_t captureLocked(sp<ACameraCaptureSession> session,
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800133 /*optional*/T* cbs,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800134 int numRequests, ACaptureRequest** requests,
135 /*optional*/int* captureSequenceId);
136
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800137 template<class T>
Yin-Chia Yehead91462016-01-06 16:45:08 -0800138 camera_status_t setRepeatingRequestsLocked(sp<ACameraCaptureSession> session,
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800139 /*optional*/T* cbs,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800140 int numRequests, ACaptureRequest** requests,
141 /*optional*/int* captureSequenceId);
142
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800143 template<class T>
Yin-Chia Yehead91462016-01-06 16:45:08 -0800144 camera_status_t submitRequestsLocked(
145 sp<ACameraCaptureSession> session,
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800146 /*optional*/T* cbs,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800147 int numRequests, ACaptureRequest** requests,
148 /*out*/int* captureSequenceId,
149 bool isRepeating);
150
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800151 camera_status_t updateOutputConfigurationLocked(ACaptureSessionOutput *output);
Emilian Peev40ead602017-09-26 15:46:36 +0100152
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800153 camera_status_t allocateCaptureRequest(
Yin-Chia Yehead91462016-01-06 16:45:08 -0800154 const ACaptureRequest* request, sp<CaptureRequest>& outReq);
155
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800156 static ACaptureRequest* allocateACaptureRequest(sp<CaptureRequest>& req,
157 const std::string& deviceId);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800158 static void freeACaptureRequest(ACaptureRequest*);
159
160 // only For session to hold device lock
161 // Always grab device lock before grabbing session lock
162 void lockDeviceForSessionOps() const { mDeviceLock.lock(); };
163 void unlockDevice() const { mDeviceLock.unlock(); };
164
165 // For capture session to notify its end of life
166 void notifySessionEndOfLifeLocked(ACameraCaptureSession* session);
167
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100168 camera_status_t configureStreamsLocked(const ACaptureSessionOutputContainer* outputs,
169 const ACaptureRequest* sessionParameters);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800170
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700171 // Input message will be posted and cleared after this returns
172 void postSessionMsgAndCleanup(sp<AMessage>& msg);
173
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700174 static camera_status_t getIGBPfromAnw(
175 ANativeWindow* anw, sp<IGraphicBufferProducer>& out);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800176
177 static camera_status_t getSurfaceFromANativeWindow(
178 ANativeWindow* anw, sp<Surface>& out);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800179
180 mutable Mutex mDeviceLock;
181 const String8 mCameraId; // Camera ID
182 const ACameraDevice_StateCallbacks mAppCallbacks; // Callback to app
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -0700183 const sp<ACameraMetadata> mChars; // Camera characteristics
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800184 const sp<ServiceCallback> mServiceCallback;
185 ACameraDevice* mWrapper;
186
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700187 // stream id -> pair of (ANW* from application, OutputConfiguration used for camera service)
188 std::map<int, std::pair<ANativeWindow*, OutputConfiguration>> mConfiguredOutputs;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800189
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800190 // TODO: maybe a bool will suffice for synchronous implementation?
191 std::atomic_bool mClosing;
192 inline bool isClosed() { return mClosing; }
193
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700194 bool mInError = false;
195 camera_status_t mError = ACAMERA_OK;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800196 void onCaptureErrorLocked(
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800197 int32_t errorCode,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800198 const CaptureResultExtras& resultExtras);
199
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700200 bool mIdle = true;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800201 // This will avoid a busy session being deleted before it's back to idle state
202 sp<ACameraCaptureSession> mBusySession;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800203
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800204 sp<hardware::camera2::ICameraDeviceUser> mRemote;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800205
206 // Looper thread to handle callback to app
207 sp<ALooper> mCbLooper;
208 // definition of handler and message
209 enum {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800210 // Device state callbacks
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700211 kWhatOnDisconnected, // onDisconnected
212 kWhatOnError, // onError
Yin-Chia Yehead91462016-01-06 16:45:08 -0800213 // Session state callbacks
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700214 kWhatSessionStateCb, // onReady, onActive
Yin-Chia Yehead91462016-01-06 16:45:08 -0800215 // Capture callbacks
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700216 kWhatCaptureStart, // onCaptureStarted
217 kWhatCaptureResult, // onCaptureProgressed, onCaptureCompleted
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800218 kWhatLogicalCaptureResult, // onLogicalCameraCaptureCompleted
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700219 kWhatCaptureFail, // onCaptureFailed
Emilian Peevedec62d2019-03-19 17:59:24 -0700220 kWhatLogicalCaptureFail, // onLogicalCameraCaptureFailed
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700221 kWhatCaptureSeqEnd, // onCaptureSequenceCompleted
222 kWhatCaptureSeqAbort, // onCaptureSequenceAborted
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700223 kWhatCaptureBufferLost,// onCaptureBufferLost
224 // Internal cleanup
225 kWhatCleanUpSessions // Cleanup cached sp<ACameraCaptureSession>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800226 };
227 static const char* kContextKey;
228 static const char* kDeviceKey;
229 static const char* kErrorCodeKey;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800230 static const char* kCallbackFpKey;
231 static const char* kSessionSpKey;
232 static const char* kCaptureRequestKey;
233 static const char* kTimeStampKey;
234 static const char* kCaptureResultKey;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800235 static const char* kPhysicalCaptureResultKey;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800236 static const char* kCaptureFailureKey;
237 static const char* kSequenceIdKey;
238 static const char* kFrameNumberKey;
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700239 static const char* kAnwKey;
Emilian Peevedec62d2019-03-19 17:59:24 -0700240 static const char* kFailingPhysicalCameraId;
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700241
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800242 class CallbackHandler : public AHandler {
243 public:
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800244 explicit CallbackHandler(const char* id);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800245 void onMessageReceived(const sp<AMessage> &msg) override;
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700246
247 private:
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800248 std::string mId;
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700249 // This handler will cache all capture session sp until kWhatCleanUpSessions
250 // is processed. This is used to guarantee the last session reference is always
251 // being removed in callback thread without holding camera device lock
252 Vector<sp<ACameraCaptureSession>> mCachedSessions;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800253 };
254 sp<CallbackHandler> mHandler;
255
Yin-Chia Yehead91462016-01-06 16:45:08 -0800256 /***********************************
257 * Capture session related members *
258 ***********************************/
259 // The current active session
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700260 wp<ACameraCaptureSession> mCurrentSession;
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700261 bool mFlushing = false;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800262
Yin-Chia Yehead91462016-01-06 16:45:08 -0800263 int mNextSessionId = 0;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800264 // TODO: might need another looper/handler to handle callbacks from service
265
Yin-Chia Yehead91462016-01-06 16:45:08 -0800266 static const int REQUEST_ID_NONE = -1;
267 int mRepeatingSequenceId = REQUEST_ID_NONE;
268
269 // sequence id -> last frame number map
270 std::map<int, int64_t> mSequenceLastFrameNumberMap;
271
272 struct CallbackHolder {
273 CallbackHolder(sp<ACameraCaptureSession> session,
274 const Vector<sp<CaptureRequest> >& requests,
275 bool isRepeating,
276 ACameraCaptureSession_captureCallbacks* cbs);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800277 CallbackHolder(sp<ACameraCaptureSession> session,
278 const Vector<sp<CaptureRequest> >& requests,
279 bool isRepeating,
280 ACameraCaptureSession_logicalCamera_captureCallbacks* lcbs);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800281
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800282 template <class T>
283 void initCaptureCallbacks(T* cbs) {
284 mContext = nullptr;
285 mOnCaptureStarted = nullptr;
286 mOnCaptureProgressed = nullptr;
287 mOnCaptureCompleted = nullptr;
288 mOnLogicalCameraCaptureCompleted = nullptr;
Emilian Peevedec62d2019-03-19 17:59:24 -0700289 mOnLogicalCameraCaptureFailed = nullptr;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800290 mOnCaptureFailed = nullptr;
291 mOnCaptureSequenceCompleted = nullptr;
292 mOnCaptureSequenceAborted = nullptr;
293 mOnCaptureBufferLost = nullptr;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800294 if (cbs != nullptr) {
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800295 mContext = cbs->context;
296 mOnCaptureStarted = cbs->onCaptureStarted;
297 mOnCaptureProgressed = cbs->onCaptureProgressed;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800298 mOnCaptureSequenceCompleted = cbs->onCaptureSequenceCompleted;
299 mOnCaptureSequenceAborted = cbs->onCaptureSequenceAborted;
300 mOnCaptureBufferLost = cbs->onCaptureBufferLost;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800301 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800302 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800303 sp<ACameraCaptureSession> mSession;
304 Vector<sp<CaptureRequest> > mRequests;
305 const bool mIsRepeating;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800306 const bool mIsLogicalCameraCallback;
307
308 void* mContext;
309 ACameraCaptureSession_captureCallback_start mOnCaptureStarted;
310 ACameraCaptureSession_captureCallback_result mOnCaptureProgressed;
311 ACameraCaptureSession_captureCallback_result mOnCaptureCompleted;
312 ACameraCaptureSession_logicalCamera_captureCallback_result mOnLogicalCameraCaptureCompleted;
Emilian Peevedec62d2019-03-19 17:59:24 -0700313 ACameraCaptureSession_logicalCamera_captureCallback_failed mOnLogicalCameraCaptureFailed;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800314 ACameraCaptureSession_captureCallback_failed mOnCaptureFailed;
315 ACameraCaptureSession_captureCallback_sequenceEnd mOnCaptureSequenceCompleted;
316 ACameraCaptureSession_captureCallback_sequenceAbort mOnCaptureSequenceAborted;
317 ACameraCaptureSession_captureCallback_bufferLost mOnCaptureBufferLost;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800318 };
319 // sequence id -> callbacks map
320 std::map<int, CallbackHolder> mSequenceCallbackMap;
321
322 static const int64_t NO_FRAMES_CAPTURED = -1;
323 class FrameNumberTracker {
324 public:
325 // TODO: Called in onResultReceived and onCaptureErrorLocked
326 void updateTracker(int64_t frameNumber, bool isError);
327 inline int64_t getCompletedFrameNumber() { return mCompletedFrameNumber; }
328 private:
329 void update();
330 void updateCompletedFrameNumber(int64_t frameNumber);
331
332 int64_t mCompletedFrameNumber = NO_FRAMES_CAPTURED;
333 List<int64_t> mSkippedFrameNumbers;
334 std::set<int64_t> mFutureErrorSet;
335 };
336 FrameNumberTracker mFrameNumberTracker;
337
338 void checkRepeatingSequenceCompleteLocked(const int sequenceId, const int64_t lastFrameNumber);
339 void checkAndFireSequenceCompleteLocked();
340
341 // Misc variables
342 int32_t mShadingMapSize[2]; // const after constructor
343 int32_t mPartialResultCount; // const after constructor
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800344 std::vector<std::string> mPhysicalIds; // const after constructor
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800345
346};
347
Jayant Chowdhary6df26072018-11-06 23:55:12 -0800348} // namespace acam;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800349} // namespace android;
350
351/**
352 * ACameraDevice opaque struct definition
353 * Leave outside of android namespace because it's NDK struct
354 */
355struct ACameraDevice {
356 ACameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -0700357 sp<ACameraMetadata> chars) :
Jayant Chowdhary6df26072018-11-06 23:55:12 -0800358 mDevice(new android::acam::CameraDevice(id, cb, chars, this)) {}
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800359
Jayant Chowdharya8488c92019-06-21 12:45:34 -0700360 ~ACameraDevice();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800361
Yin-Chia Yehead91462016-01-06 16:45:08 -0800362 /*******************
363 * NDK public APIs *
364 *******************/
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800365 inline const char* getId() const { return mDevice->getId(); }
366
367 camera_status_t createCaptureRequest(
368 ACameraDevice_request_template templateId,
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800369 const ACameraIdList* physicalCameraIdList,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800370 ACaptureRequest** request) const {
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800371 return mDevice->createCaptureRequest(templateId, physicalCameraIdList, request);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800372 }
373
Yin-Chia Yehead91462016-01-06 16:45:08 -0800374 camera_status_t createCaptureSession(
375 const ACaptureSessionOutputContainer* outputs,
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100376 const ACaptureRequest* sessionParameters,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800377 const ACameraCaptureSession_stateCallbacks* callbacks,
378 /*out*/ACameraCaptureSession** session) {
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100379 return mDevice->createCaptureSession(outputs, sessionParameters, callbacks, session);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800380 }
381
Shuzhen Wang24810e72019-03-18 10:55:01 -0700382 camera_status_t isSessionConfigurationSupported(
383 const ACaptureSessionOutputContainer* sessionOutputContainer) const {
384 return mDevice->isSessionConfigurationSupported(sessionOutputContainer);
385 }
386
Yin-Chia Yehead91462016-01-06 16:45:08 -0800387 /***********************
388 * Device interal APIs *
389 ***********************/
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800390 inline android::sp<android::hardware::camera2::ICameraDeviceCallbacks> getServiceCallback() {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800391 return mDevice->getServiceCallback();
392 };
393
394 // Camera device is only functional after remote being set
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800395 inline void setRemoteDevice(android::sp<android::hardware::camera2::ICameraDeviceUser> remote) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800396 mDevice->setRemoteDevice(remote);
397 }
398
399 private:
Jayant Chowdhary6df26072018-11-06 23:55:12 -0800400 android::sp<android::acam::CameraDevice> mDevice;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800401};
402
403#endif // _ACAMERA_DEVICE_H