blob: 15dd08d9d89e30b1fba83fd1bd7bace6862c92b9 [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>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080024#include <utils/StrongPointer.h>
25#include <utils/Mutex.h>
26#include <utils/String8.h>
Yin-Chia Yehead91462016-01-06 16:45:08 -080027#include <utils/List.h>
28#include <utils/Vector.h>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080029
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080030#include <android/hardware/camera2/BnCameraDeviceCallbacks.h>
31#include <android/hardware/camera2/ICameraDeviceUser.h>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080032#include <media/stagefright/foundation/ALooper.h>
33#include <media/stagefright/foundation/AHandler.h>
34#include <media/stagefright/foundation/AMessage.h>
Yin-Chia Yehead91462016-01-06 16:45:08 -080035#include <camera/CaptureResult.h>
Yin-Chia Yehead91462016-01-06 16:45:08 -080036#include <camera/camera2/OutputConfiguration.h>
37#include <camera/camera2/CaptureRequest.h>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080038
Colin Cross18618192017-05-04 16:17:42 -070039#include <camera/NdkCameraDevice.h>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080040#include "ACameraMetadata.h"
41
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080042namespace android {
43
Yin-Chia Yehd21c46b2017-10-10 11:59:46 -070044// Wrap ACameraCaptureFailure so it can be ref-counted
Yin-Chia Yehead91462016-01-06 16:45:08 -080045struct CameraCaptureFailure : public RefBase, public ACameraCaptureFailure {};
46
47class CameraDevice final : public RefBase {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080048 public:
49 CameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
50 std::unique_ptr<ACameraMetadata> chars,
51 ACameraDevice* wrapper);
52 ~CameraDevice();
53
54 inline const char* getId() const { return mCameraId.string(); }
55
56 camera_status_t createCaptureRequest(
57 ACameraDevice_request_template templateId,
58 ACaptureRequest** request) const;
59
Yin-Chia Yehead91462016-01-06 16:45:08 -080060 camera_status_t createCaptureSession(
61 const ACaptureSessionOutputContainer* outputs,
62 const ACameraCaptureSession_stateCallbacks* callbacks,
63 /*out*/ACameraCaptureSession** session);
64
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080065 // Callbacks from camera service
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080066 class ServiceCallback : public hardware::camera2::BnCameraDeviceCallbacks {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080067 public:
Chih-Hung Hsiehd19d9942016-08-29 14:21:14 -070068 explicit ServiceCallback(CameraDevice* device) : mDevice(device) {}
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080069 binder::Status onDeviceError(int32_t errorCode,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080070 const CaptureResultExtras& resultExtras) override;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080071 binder::Status onDeviceIdle() override;
72 binder::Status onCaptureStarted(const CaptureResultExtras& resultExtras,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080073 int64_t timestamp) override;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080074 binder::Status onResultReceived(const CameraMetadata& metadata,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080075 const CaptureResultExtras& resultExtras) override;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080076 binder::Status onPrepared(int streamId) override;
Shuzhen Wang9d066012016-09-30 11:30:20 -070077 binder::Status onRequestQueueEmpty() override;
Chien-Yu Chene8c535e2016-04-14 12:18:26 -070078 binder::Status onRepeatingRequestError(int64_t lastFrameNumber) override;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080079 private:
80 const wp<CameraDevice> mDevice;
81 };
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080082 inline sp<hardware::camera2::ICameraDeviceCallbacks> getServiceCallback() {
83 return mServiceCallback;
84 };
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080085
86 // Camera device is only functional after remote being set
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080087 void setRemoteDevice(sp<hardware::camera2::ICameraDeviceUser> remote);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080088
Yin-Chia Yehead91462016-01-06 16:45:08 -080089 inline ACameraDevice* getWrapper() const { return mWrapper; };
90
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080091 private:
Yin-Chia Yehead91462016-01-06 16:45:08 -080092 friend ACameraCaptureSession;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080093 camera_status_t checkCameraClosedOrErrorLocked() const;
94
Yin-Chia Yehead91462016-01-06 16:45:08 -080095 // device goes into fatal error state after this
96 void setCameraDeviceErrorLocked(camera_status_t error);
97
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -070098 void disconnectLocked(sp<ACameraCaptureSession>& session); // disconnect from camera service
Yin-Chia Yehead91462016-01-06 16:45:08 -080099
100 camera_status_t stopRepeatingLocked();
101
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700102 camera_status_t flushLocked(ACameraCaptureSession*);
103
Yin-Chia Yehead91462016-01-06 16:45:08 -0800104 camera_status_t waitUntilIdleLocked();
105
106
107 camera_status_t captureLocked(sp<ACameraCaptureSession> session,
108 /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
109 int numRequests, ACaptureRequest** requests,
110 /*optional*/int* captureSequenceId);
111
112 camera_status_t setRepeatingRequestsLocked(sp<ACameraCaptureSession> session,
113 /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
114 int numRequests, ACaptureRequest** requests,
115 /*optional*/int* captureSequenceId);
116
117 camera_status_t submitRequestsLocked(
118 sp<ACameraCaptureSession> session,
119 /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
120 int numRequests, ACaptureRequest** requests,
121 /*out*/int* captureSequenceId,
122 bool isRepeating);
123
124 static camera_status_t allocateCaptureRequest(
125 const ACaptureRequest* request, sp<CaptureRequest>& outReq);
126
127 static ACaptureRequest* allocateACaptureRequest(sp<CaptureRequest>& req);
128 static void freeACaptureRequest(ACaptureRequest*);
129
130 // only For session to hold device lock
131 // Always grab device lock before grabbing session lock
132 void lockDeviceForSessionOps() const { mDeviceLock.lock(); };
133 void unlockDevice() const { mDeviceLock.unlock(); };
134
135 // For capture session to notify its end of life
136 void notifySessionEndOfLifeLocked(ACameraCaptureSession* session);
137
138 camera_status_t configureStreamsLocked(const ACaptureSessionOutputContainer* outputs);
139
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700140 // Input message will be posted and cleared after this returns
141 void postSessionMsgAndCleanup(sp<AMessage>& msg);
142
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700143 static camera_status_t getIGBPfromAnw(
144 ANativeWindow* anw, sp<IGraphicBufferProducer>& out);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800145
146 static camera_status_t getSurfaceFromANativeWindow(
147 ANativeWindow* anw, sp<Surface>& out);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800148
149 mutable Mutex mDeviceLock;
150 const String8 mCameraId; // Camera ID
151 const ACameraDevice_StateCallbacks mAppCallbacks; // Callback to app
152 const std::unique_ptr<ACameraMetadata> mChars; // Camera characteristics
153 const sp<ServiceCallback> mServiceCallback;
154 ACameraDevice* mWrapper;
155
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700156 // stream id -> pair of (ANW* from application, OutputConfiguration used for camera service)
157 std::map<int, std::pair<ANativeWindow*, OutputConfiguration>> mConfiguredOutputs;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800158
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800159 // TODO: maybe a bool will suffice for synchronous implementation?
160 std::atomic_bool mClosing;
161 inline bool isClosed() { return mClosing; }
162
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700163 bool mInError = false;
164 camera_status_t mError = ACAMERA_OK;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800165 void onCaptureErrorLocked(
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800166 int32_t errorCode,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800167 const CaptureResultExtras& resultExtras);
168
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700169 bool mIdle = true;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800170 // This will avoid a busy session being deleted before it's back to idle state
171 sp<ACameraCaptureSession> mBusySession;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800172
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800173 sp<hardware::camera2::ICameraDeviceUser> mRemote;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800174
175 // Looper thread to handle callback to app
176 sp<ALooper> mCbLooper;
177 // definition of handler and message
178 enum {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800179 // Device state callbacks
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700180 kWhatOnDisconnected, // onDisconnected
181 kWhatOnError, // onError
Yin-Chia Yehead91462016-01-06 16:45:08 -0800182 // Session state callbacks
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700183 kWhatSessionStateCb, // onReady, onActive
Yin-Chia Yehead91462016-01-06 16:45:08 -0800184 // Capture callbacks
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700185 kWhatCaptureStart, // onCaptureStarted
186 kWhatCaptureResult, // onCaptureProgressed, onCaptureCompleted
187 kWhatCaptureFail, // onCaptureFailed
188 kWhatCaptureSeqEnd, // onCaptureSequenceCompleted
189 kWhatCaptureSeqAbort, // onCaptureSequenceAborted
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700190 kWhatCaptureBufferLost,// onCaptureBufferLost
191 // Internal cleanup
192 kWhatCleanUpSessions // Cleanup cached sp<ACameraCaptureSession>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800193 };
194 static const char* kContextKey;
195 static const char* kDeviceKey;
196 static const char* kErrorCodeKey;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800197 static const char* kCallbackFpKey;
198 static const char* kSessionSpKey;
199 static const char* kCaptureRequestKey;
200 static const char* kTimeStampKey;
201 static const char* kCaptureResultKey;
202 static const char* kCaptureFailureKey;
203 static const char* kSequenceIdKey;
204 static const char* kFrameNumberKey;
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700205 static const char* kAnwKey;
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700206
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800207 class CallbackHandler : public AHandler {
208 public:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800209 void onMessageReceived(const sp<AMessage> &msg) override;
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700210
211 private:
212 // This handler will cache all capture session sp until kWhatCleanUpSessions
213 // is processed. This is used to guarantee the last session reference is always
214 // being removed in callback thread without holding camera device lock
215 Vector<sp<ACameraCaptureSession>> mCachedSessions;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800216 };
217 sp<CallbackHandler> mHandler;
218
Yin-Chia Yehead91462016-01-06 16:45:08 -0800219 /***********************************
220 * Capture session related members *
221 ***********************************/
222 // The current active session
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700223 wp<ACameraCaptureSession> mCurrentSession;
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700224 bool mFlushing = false;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800225
Yin-Chia Yehead91462016-01-06 16:45:08 -0800226 int mNextSessionId = 0;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800227 // TODO: might need another looper/handler to handle callbacks from service
228
Yin-Chia Yehead91462016-01-06 16:45:08 -0800229 static const int REQUEST_ID_NONE = -1;
230 int mRepeatingSequenceId = REQUEST_ID_NONE;
231
232 // sequence id -> last frame number map
233 std::map<int, int64_t> mSequenceLastFrameNumberMap;
234
235 struct CallbackHolder {
236 CallbackHolder(sp<ACameraCaptureSession> session,
237 const Vector<sp<CaptureRequest> >& requests,
238 bool isRepeating,
239 ACameraCaptureSession_captureCallbacks* cbs);
240
241 static ACameraCaptureSession_captureCallbacks fillCb(
242 ACameraCaptureSession_captureCallbacks* cbs) {
243 if (cbs != nullptr) {
244 return *cbs;
245 }
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700246 return { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr };
Yin-Chia Yehead91462016-01-06 16:45:08 -0800247 }
248
249 sp<ACameraCaptureSession> mSession;
250 Vector<sp<CaptureRequest> > mRequests;
251 const bool mIsRepeating;
252 ACameraCaptureSession_captureCallbacks mCallbacks;
253 };
254 // sequence id -> callbacks map
255 std::map<int, CallbackHolder> mSequenceCallbackMap;
256
257 static const int64_t NO_FRAMES_CAPTURED = -1;
258 class FrameNumberTracker {
259 public:
260 // TODO: Called in onResultReceived and onCaptureErrorLocked
261 void updateTracker(int64_t frameNumber, bool isError);
262 inline int64_t getCompletedFrameNumber() { return mCompletedFrameNumber; }
263 private:
264 void update();
265 void updateCompletedFrameNumber(int64_t frameNumber);
266
267 int64_t mCompletedFrameNumber = NO_FRAMES_CAPTURED;
268 List<int64_t> mSkippedFrameNumbers;
269 std::set<int64_t> mFutureErrorSet;
270 };
271 FrameNumberTracker mFrameNumberTracker;
272
273 void checkRepeatingSequenceCompleteLocked(const int sequenceId, const int64_t lastFrameNumber);
274 void checkAndFireSequenceCompleteLocked();
275
276 // Misc variables
277 int32_t mShadingMapSize[2]; // const after constructor
278 int32_t mPartialResultCount; // const after constructor
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800279
280};
281
282} // namespace android;
283
284/**
285 * ACameraDevice opaque struct definition
286 * Leave outside of android namespace because it's NDK struct
287 */
288struct ACameraDevice {
289 ACameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
290 std::unique_ptr<ACameraMetadata> chars) :
291 mDevice(new CameraDevice(id, cb, std::move(chars), this)) {}
292
293 ~ACameraDevice() {};
294
Yin-Chia Yehead91462016-01-06 16:45:08 -0800295 /*******************
296 * NDK public APIs *
297 *******************/
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800298 inline const char* getId() const { return mDevice->getId(); }
299
300 camera_status_t createCaptureRequest(
301 ACameraDevice_request_template templateId,
302 ACaptureRequest** request) const {
303 return mDevice->createCaptureRequest(templateId, request);
304 }
305
Yin-Chia Yehead91462016-01-06 16:45:08 -0800306 camera_status_t createCaptureSession(
307 const ACaptureSessionOutputContainer* outputs,
308 const ACameraCaptureSession_stateCallbacks* callbacks,
309 /*out*/ACameraCaptureSession** session) {
310 return mDevice->createCaptureSession(outputs, callbacks, session);
311 }
312
313 /***********************
314 * Device interal APIs *
315 ***********************/
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800316 inline android::sp<android::hardware::camera2::ICameraDeviceCallbacks> getServiceCallback() {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800317 return mDevice->getServiceCallback();
318 };
319
320 // Camera device is only functional after remote being set
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800321 inline void setRemoteDevice(android::sp<android::hardware::camera2::ICameraDeviceUser> remote) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800322 mDevice->setRemoteDevice(remote);
323 }
324
325 private:
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800326 android::sp<android::CameraDevice> mDevice;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800327};
328
329#endif // _ACAMERA_DEVICE_H