blob: 103efd5218caee6b9fa796a684daf56c223320a1 [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>
38#include <camera/camera2/CaptureRequest.h>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080039
Emilian Peev40ead602017-09-26 15:46:36 +010040#include <camera/NdkCameraManager.h>
41#include <camera/NdkCameraCaptureSession.h>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080042#include "ACameraMetadata.h"
43
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080044namespace android {
Jayant Chowdhary6df26072018-11-06 23:55:12 -080045namespace acam {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080046
Yin-Chia Yehd21c46b2017-10-10 11:59:46 -070047// Wrap ACameraCaptureFailure so it can be ref-counted
Yin-Chia Yehead91462016-01-06 16:45:08 -080048struct CameraCaptureFailure : public RefBase, public ACameraCaptureFailure {};
49
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080050// Wrap PhysicalCaptureResultInfo so that it can be ref-counted
51struct ACameraPhysicalCaptureResultInfo: public RefBase {
52 ACameraPhysicalCaptureResultInfo(const std::vector<PhysicalCaptureResultInfo>& info,
53 int64_t frameNumber) :
54 mPhysicalResultInfo(info), mFrameNumber(frameNumber) {}
55
56 std::vector<PhysicalCaptureResultInfo> mPhysicalResultInfo;
57 int64_t mFrameNumber;
58};
59
Yin-Chia Yehead91462016-01-06 16:45:08 -080060class CameraDevice final : public RefBase {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080061 public:
62 CameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -070063 sp<ACameraMetadata> chars,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080064 ACameraDevice* wrapper);
65 ~CameraDevice();
66
67 inline const char* getId() const { return mCameraId.string(); }
68
69 camera_status_t createCaptureRequest(
70 ACameraDevice_request_template templateId,
Shuzhen Wang6c17e212019-02-19 14:51:47 -080071 const ACameraIdList* physicalIdList,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080072 ACaptureRequest** request) const;
73
Yin-Chia Yehead91462016-01-06 16:45:08 -080074 camera_status_t createCaptureSession(
75 const ACaptureSessionOutputContainer* outputs,
Emilian Peev5fbe0ba2017-10-20 15:45:45 +010076 const ACaptureRequest* sessionParameters,
Yin-Chia Yehead91462016-01-06 16:45:08 -080077 const ACameraCaptureSession_stateCallbacks* callbacks,
78 /*out*/ACameraCaptureSession** session);
79
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080080 // Callbacks from camera service
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080081 class ServiceCallback : public hardware::camera2::BnCameraDeviceCallbacks {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080082 public:
Chih-Hung Hsiehd19d9942016-08-29 14:21:14 -070083 explicit ServiceCallback(CameraDevice* device) : mDevice(device) {}
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080084 binder::Status onDeviceError(int32_t errorCode,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080085 const CaptureResultExtras& resultExtras) override;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080086 binder::Status onDeviceIdle() override;
87 binder::Status onCaptureStarted(const CaptureResultExtras& resultExtras,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080088 int64_t timestamp) override;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080089 binder::Status onResultReceived(const CameraMetadata& metadata,
Shuzhen Wang5c22c152017-12-31 17:12:25 -080090 const CaptureResultExtras& resultExtras,
91 const std::vector<PhysicalCaptureResultInfo>& physicalResultInfos) override;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080092 binder::Status onPrepared(int streamId) override;
Shuzhen Wang9d066012016-09-30 11:30:20 -070093 binder::Status onRequestQueueEmpty() override;
Yin-Chia Yeh8ca23dc2017-09-05 18:15:56 -070094 binder::Status onRepeatingRequestError(int64_t lastFrameNumber,
95 int32_t stoppedSequenceId) override;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080096 private:
97 const wp<CameraDevice> mDevice;
98 };
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080099 inline sp<hardware::camera2::ICameraDeviceCallbacks> getServiceCallback() {
100 return mServiceCallback;
101 };
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800102
103 // Camera device is only functional after remote being set
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800104 void setRemoteDevice(sp<hardware::camera2::ICameraDeviceUser> remote);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800105
Yin-Chia Yehead91462016-01-06 16:45:08 -0800106 inline ACameraDevice* getWrapper() const { return mWrapper; };
107
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800108 private:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800109 friend ACameraCaptureSession;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800110 camera_status_t checkCameraClosedOrErrorLocked() const;
111
Yin-Chia Yehead91462016-01-06 16:45:08 -0800112 // device goes into fatal error state after this
113 void setCameraDeviceErrorLocked(camera_status_t error);
114
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700115 void disconnectLocked(sp<ACameraCaptureSession>& session); // disconnect from camera service
Yin-Chia Yehead91462016-01-06 16:45:08 -0800116
117 camera_status_t stopRepeatingLocked();
118
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700119 camera_status_t flushLocked(ACameraCaptureSession*);
120
Yin-Chia Yehead91462016-01-06 16:45:08 -0800121 camera_status_t waitUntilIdleLocked();
122
123
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800124 template<class T>
Yin-Chia Yehead91462016-01-06 16:45:08 -0800125 camera_status_t captureLocked(sp<ACameraCaptureSession> session,
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800126 /*optional*/T* cbs,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800127 int numRequests, ACaptureRequest** requests,
128 /*optional*/int* captureSequenceId);
129
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800130 template<class T>
Yin-Chia Yehead91462016-01-06 16:45:08 -0800131 camera_status_t setRepeatingRequestsLocked(sp<ACameraCaptureSession> session,
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800132 /*optional*/T* cbs,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800133 int numRequests, ACaptureRequest** requests,
134 /*optional*/int* captureSequenceId);
135
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800136 template<class T>
Yin-Chia Yehead91462016-01-06 16:45:08 -0800137 camera_status_t submitRequestsLocked(
138 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 /*out*/int* captureSequenceId,
142 bool isRepeating);
143
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800144 camera_status_t updateOutputConfigurationLocked(ACaptureSessionOutput *output);
Emilian Peev40ead602017-09-26 15:46:36 +0100145
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800146 camera_status_t allocateCaptureRequest(
Yin-Chia Yehead91462016-01-06 16:45:08 -0800147 const ACaptureRequest* request, sp<CaptureRequest>& outReq);
148
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800149 static ACaptureRequest* allocateACaptureRequest(sp<CaptureRequest>& req,
150 const std::string& deviceId);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800151 static void freeACaptureRequest(ACaptureRequest*);
152
153 // only For session to hold device lock
154 // Always grab device lock before grabbing session lock
155 void lockDeviceForSessionOps() const { mDeviceLock.lock(); };
156 void unlockDevice() const { mDeviceLock.unlock(); };
157
158 // For capture session to notify its end of life
159 void notifySessionEndOfLifeLocked(ACameraCaptureSession* session);
160
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100161 camera_status_t configureStreamsLocked(const ACaptureSessionOutputContainer* outputs,
162 const ACaptureRequest* sessionParameters);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800163
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700164 // Input message will be posted and cleared after this returns
165 void postSessionMsgAndCleanup(sp<AMessage>& msg);
166
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700167 static camera_status_t getIGBPfromAnw(
168 ANativeWindow* anw, sp<IGraphicBufferProducer>& out);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800169
170 static camera_status_t getSurfaceFromANativeWindow(
171 ANativeWindow* anw, sp<Surface>& out);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800172
173 mutable Mutex mDeviceLock;
174 const String8 mCameraId; // Camera ID
175 const ACameraDevice_StateCallbacks mAppCallbacks; // Callback to app
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -0700176 const sp<ACameraMetadata> mChars; // Camera characteristics
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800177 const sp<ServiceCallback> mServiceCallback;
178 ACameraDevice* mWrapper;
179
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700180 // stream id -> pair of (ANW* from application, OutputConfiguration used for camera service)
181 std::map<int, std::pair<ANativeWindow*, OutputConfiguration>> mConfiguredOutputs;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800182
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800183 // TODO: maybe a bool will suffice for synchronous implementation?
184 std::atomic_bool mClosing;
185 inline bool isClosed() { return mClosing; }
186
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700187 bool mInError = false;
188 camera_status_t mError = ACAMERA_OK;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800189 void onCaptureErrorLocked(
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800190 int32_t errorCode,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800191 const CaptureResultExtras& resultExtras);
192
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700193 bool mIdle = true;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800194 // This will avoid a busy session being deleted before it's back to idle state
195 sp<ACameraCaptureSession> mBusySession;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800196
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800197 sp<hardware::camera2::ICameraDeviceUser> mRemote;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800198
199 // Looper thread to handle callback to app
200 sp<ALooper> mCbLooper;
201 // definition of handler and message
202 enum {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800203 // Device state callbacks
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700204 kWhatOnDisconnected, // onDisconnected
205 kWhatOnError, // onError
Yin-Chia Yehead91462016-01-06 16:45:08 -0800206 // Session state callbacks
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700207 kWhatSessionStateCb, // onReady, onActive
Yin-Chia Yehead91462016-01-06 16:45:08 -0800208 // Capture callbacks
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700209 kWhatCaptureStart, // onCaptureStarted
210 kWhatCaptureResult, // onCaptureProgressed, onCaptureCompleted
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800211 kWhatLogicalCaptureResult, // onLogicalCameraCaptureCompleted
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700212 kWhatCaptureFail, // onCaptureFailed
213 kWhatCaptureSeqEnd, // onCaptureSequenceCompleted
214 kWhatCaptureSeqAbort, // onCaptureSequenceAborted
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700215 kWhatCaptureBufferLost,// onCaptureBufferLost
216 // Internal cleanup
217 kWhatCleanUpSessions // Cleanup cached sp<ACameraCaptureSession>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800218 };
219 static const char* kContextKey;
220 static const char* kDeviceKey;
221 static const char* kErrorCodeKey;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800222 static const char* kCallbackFpKey;
223 static const char* kSessionSpKey;
224 static const char* kCaptureRequestKey;
225 static const char* kTimeStampKey;
226 static const char* kCaptureResultKey;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800227 static const char* kPhysicalCaptureResultKey;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800228 static const char* kCaptureFailureKey;
229 static const char* kSequenceIdKey;
230 static const char* kFrameNumberKey;
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700231 static const char* kAnwKey;
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700232
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800233 class CallbackHandler : public AHandler {
234 public:
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800235 explicit CallbackHandler(const char* id);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800236 void onMessageReceived(const sp<AMessage> &msg) override;
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700237
238 private:
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800239 std::string mId;
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700240 // This handler will cache all capture session sp until kWhatCleanUpSessions
241 // is processed. This is used to guarantee the last session reference is always
242 // being removed in callback thread without holding camera device lock
243 Vector<sp<ACameraCaptureSession>> mCachedSessions;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800244 };
245 sp<CallbackHandler> mHandler;
246
Yin-Chia Yehead91462016-01-06 16:45:08 -0800247 /***********************************
248 * Capture session related members *
249 ***********************************/
250 // The current active session
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700251 wp<ACameraCaptureSession> mCurrentSession;
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700252 bool mFlushing = false;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800253
Yin-Chia Yehead91462016-01-06 16:45:08 -0800254 int mNextSessionId = 0;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800255 // TODO: might need another looper/handler to handle callbacks from service
256
Yin-Chia Yehead91462016-01-06 16:45:08 -0800257 static const int REQUEST_ID_NONE = -1;
258 int mRepeatingSequenceId = REQUEST_ID_NONE;
259
260 // sequence id -> last frame number map
261 std::map<int, int64_t> mSequenceLastFrameNumberMap;
262
263 struct CallbackHolder {
264 CallbackHolder(sp<ACameraCaptureSession> session,
265 const Vector<sp<CaptureRequest> >& requests,
266 bool isRepeating,
267 ACameraCaptureSession_captureCallbacks* cbs);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800268 CallbackHolder(sp<ACameraCaptureSession> session,
269 const Vector<sp<CaptureRequest> >& requests,
270 bool isRepeating,
271 ACameraCaptureSession_logicalCamera_captureCallbacks* lcbs);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800272
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800273 template <class T>
274 void initCaptureCallbacks(T* cbs) {
275 mContext = nullptr;
276 mOnCaptureStarted = nullptr;
277 mOnCaptureProgressed = nullptr;
278 mOnCaptureCompleted = nullptr;
279 mOnLogicalCameraCaptureCompleted = nullptr;
280 mOnCaptureFailed = nullptr;
281 mOnCaptureSequenceCompleted = nullptr;
282 mOnCaptureSequenceAborted = nullptr;
283 mOnCaptureBufferLost = nullptr;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800284 if (cbs != nullptr) {
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800285 mContext = cbs->context;
286 mOnCaptureStarted = cbs->onCaptureStarted;
287 mOnCaptureProgressed = cbs->onCaptureProgressed;
288 mOnCaptureFailed = cbs->onCaptureFailed;
289 mOnCaptureSequenceCompleted = cbs->onCaptureSequenceCompleted;
290 mOnCaptureSequenceAborted = cbs->onCaptureSequenceAborted;
291 mOnCaptureBufferLost = cbs->onCaptureBufferLost;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800292 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800293 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800294 sp<ACameraCaptureSession> mSession;
295 Vector<sp<CaptureRequest> > mRequests;
296 const bool mIsRepeating;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800297 const bool mIsLogicalCameraCallback;
298
299 void* mContext;
300 ACameraCaptureSession_captureCallback_start mOnCaptureStarted;
301 ACameraCaptureSession_captureCallback_result mOnCaptureProgressed;
302 ACameraCaptureSession_captureCallback_result mOnCaptureCompleted;
303 ACameraCaptureSession_logicalCamera_captureCallback_result mOnLogicalCameraCaptureCompleted;
304 ACameraCaptureSession_captureCallback_failed mOnCaptureFailed;
305 ACameraCaptureSession_captureCallback_sequenceEnd mOnCaptureSequenceCompleted;
306 ACameraCaptureSession_captureCallback_sequenceAbort mOnCaptureSequenceAborted;
307 ACameraCaptureSession_captureCallback_bufferLost mOnCaptureBufferLost;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800308 };
309 // sequence id -> callbacks map
310 std::map<int, CallbackHolder> mSequenceCallbackMap;
311
312 static const int64_t NO_FRAMES_CAPTURED = -1;
313 class FrameNumberTracker {
314 public:
315 // TODO: Called in onResultReceived and onCaptureErrorLocked
316 void updateTracker(int64_t frameNumber, bool isError);
317 inline int64_t getCompletedFrameNumber() { return mCompletedFrameNumber; }
318 private:
319 void update();
320 void updateCompletedFrameNumber(int64_t frameNumber);
321
322 int64_t mCompletedFrameNumber = NO_FRAMES_CAPTURED;
323 List<int64_t> mSkippedFrameNumbers;
324 std::set<int64_t> mFutureErrorSet;
325 };
326 FrameNumberTracker mFrameNumberTracker;
327
328 void checkRepeatingSequenceCompleteLocked(const int sequenceId, const int64_t lastFrameNumber);
329 void checkAndFireSequenceCompleteLocked();
330
331 // Misc variables
332 int32_t mShadingMapSize[2]; // const after constructor
333 int32_t mPartialResultCount; // const after constructor
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800334 std::vector<std::string> mPhysicalIds; // const after constructor
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800335
336};
337
Jayant Chowdhary6df26072018-11-06 23:55:12 -0800338} // namespace acam;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800339} // namespace android;
340
341/**
342 * ACameraDevice opaque struct definition
343 * Leave outside of android namespace because it's NDK struct
344 */
345struct ACameraDevice {
346 ACameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -0700347 sp<ACameraMetadata> chars) :
Jayant Chowdhary6df26072018-11-06 23:55:12 -0800348 mDevice(new android::acam::CameraDevice(id, cb, chars, this)) {}
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800349
350 ~ACameraDevice() {};
351
Yin-Chia Yehead91462016-01-06 16:45:08 -0800352 /*******************
353 * NDK public APIs *
354 *******************/
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800355 inline const char* getId() const { return mDevice->getId(); }
356
357 camera_status_t createCaptureRequest(
358 ACameraDevice_request_template templateId,
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800359 const ACameraIdList* physicalCameraIdList,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800360 ACaptureRequest** request) const {
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800361 return mDevice->createCaptureRequest(templateId, physicalCameraIdList, request);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800362 }
363
Yin-Chia Yehead91462016-01-06 16:45:08 -0800364 camera_status_t createCaptureSession(
365 const ACaptureSessionOutputContainer* outputs,
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100366 const ACaptureRequest* sessionParameters,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800367 const ACameraCaptureSession_stateCallbacks* callbacks,
368 /*out*/ACameraCaptureSession** session) {
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100369 return mDevice->createCaptureSession(outputs, sessionParameters, callbacks, session);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800370 }
371
372 /***********************
373 * Device interal APIs *
374 ***********************/
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800375 inline android::sp<android::hardware::camera2::ICameraDeviceCallbacks> getServiceCallback() {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800376 return mDevice->getServiceCallback();
377 };
378
379 // Camera device is only functional after remote being set
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800380 inline void setRemoteDevice(android::sp<android::hardware::camera2::ICameraDeviceUser> remote) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800381 mDevice->setRemoteDevice(remote);
382 }
383
384 private:
Jayant Chowdhary6df26072018-11-06 23:55:12 -0800385 android::sp<android::acam::CameraDevice> mDevice;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800386};
387
388#endif // _ACAMERA_DEVICE_H