ACameraDevice.h revision b3ded702104331ae35597eef28f670e407a1b519
1/* 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> 20#include <map> 21#include <set> 22#include <atomic> 23#include <utility> 24#include <utils/StrongPointer.h> 25#include <utils/Mutex.h> 26#include <utils/String8.h> 27#include <utils/List.h> 28#include <utils/Vector.h> 29 30#include <android/hardware/camera2/BnCameraDeviceCallbacks.h> 31#include <android/hardware/camera2/ICameraDeviceUser.h> 32#include <media/stagefright/foundation/ALooper.h> 33#include <media/stagefright/foundation/AHandler.h> 34#include <media/stagefright/foundation/AMessage.h> 35#include <camera/CaptureResult.h> 36#include <camera/camera2/OutputConfiguration.h> 37#include <camera/camera2/CaptureRequest.h> 38 39#include <camera/NdkCameraManager.h> 40#include <camera/NdkCameraCaptureSession.h> 41#include "ACameraMetadata.h" 42 43namespace android { 44 45// Wrap ACameraCaptureFailure so it can be ref-counted 46struct CameraCaptureFailure : public RefBase, public ACameraCaptureFailure {}; 47 48class CameraDevice final : public RefBase { 49 public: 50 CameraDevice(const char* id, ACameraDevice_StateCallbacks* cb, 51 std::unique_ptr<ACameraMetadata> chars, 52 ACameraDevice* wrapper); 53 ~CameraDevice(); 54 55 inline const char* getId() const { return mCameraId.string(); } 56 57 camera_status_t createCaptureRequest( 58 ACameraDevice_request_template templateId, 59 ACaptureRequest** request) const; 60 61 camera_status_t createCaptureSession( 62 const ACaptureSessionOutputContainer* outputs, 63 const ACaptureRequest* sessionParameters, 64 const ACameraCaptureSession_stateCallbacks* callbacks, 65 /*out*/ACameraCaptureSession** session); 66 67 // Callbacks from camera service 68 class ServiceCallback : public hardware::camera2::BnCameraDeviceCallbacks { 69 public: 70 explicit ServiceCallback(CameraDevice* device) : mDevice(device) {} 71 binder::Status onDeviceError(int32_t errorCode, 72 const CaptureResultExtras& resultExtras) override; 73 binder::Status onDeviceIdle() override; 74 binder::Status onCaptureStarted(const CaptureResultExtras& resultExtras, 75 int64_t timestamp) override; 76 binder::Status onResultReceived(const CameraMetadata& metadata, 77 const CaptureResultExtras& resultExtras) override; 78 binder::Status onPrepared(int streamId) override; 79 binder::Status onRequestQueueEmpty() override; 80 binder::Status onRepeatingRequestError(int64_t lastFrameNumber, 81 int32_t stoppedSequenceId) override; 82 private: 83 const wp<CameraDevice> mDevice; 84 }; 85 inline sp<hardware::camera2::ICameraDeviceCallbacks> getServiceCallback() { 86 return mServiceCallback; 87 }; 88 89 // Camera device is only functional after remote being set 90 void setRemoteDevice(sp<hardware::camera2::ICameraDeviceUser> remote); 91 92 inline ACameraDevice* getWrapper() const { return mWrapper; }; 93 94 private: 95 friend ACameraCaptureSession; 96 camera_status_t checkCameraClosedOrErrorLocked() const; 97 98 // device goes into fatal error state after this 99 void setCameraDeviceErrorLocked(camera_status_t error); 100 101 void disconnectLocked(sp<ACameraCaptureSession>& session); // disconnect from camera service 102 103 camera_status_t stopRepeatingLocked(); 104 105 camera_status_t flushLocked(ACameraCaptureSession*); 106 107 camera_status_t waitUntilIdleLocked(); 108 109 110 camera_status_t captureLocked(sp<ACameraCaptureSession> session, 111 /*optional*/ACameraCaptureSession_captureCallbacks* cbs, 112 int numRequests, ACaptureRequest** requests, 113 /*optional*/int* captureSequenceId); 114 115 camera_status_t setRepeatingRequestsLocked(sp<ACameraCaptureSession> session, 116 /*optional*/ACameraCaptureSession_captureCallbacks* cbs, 117 int numRequests, ACaptureRequest** requests, 118 /*optional*/int* captureSequenceId); 119 120 camera_status_t submitRequestsLocked( 121 sp<ACameraCaptureSession> session, 122 /*optional*/ACameraCaptureSession_captureCallbacks* cbs, 123 int numRequests, ACaptureRequest** requests, 124 /*out*/int* captureSequenceId, 125 bool isRepeating); 126 127 camera_status_t updateOutputConfigurationLocked(ACaptureSessionOutput *output); 128 129 camera_status_t allocateCaptureRequest( 130 const ACaptureRequest* request, sp<CaptureRequest>& outReq); 131 132 static ACaptureRequest* allocateACaptureRequest(sp<CaptureRequest>& req); 133 static void freeACaptureRequest(ACaptureRequest*); 134 135 // only For session to hold device lock 136 // Always grab device lock before grabbing session lock 137 void lockDeviceForSessionOps() const { mDeviceLock.lock(); }; 138 void unlockDevice() const { mDeviceLock.unlock(); }; 139 140 // For capture session to notify its end of life 141 void notifySessionEndOfLifeLocked(ACameraCaptureSession* session); 142 143 camera_status_t configureStreamsLocked(const ACaptureSessionOutputContainer* outputs, 144 const ACaptureRequest* sessionParameters); 145 146 // Input message will be posted and cleared after this returns 147 void postSessionMsgAndCleanup(sp<AMessage>& msg); 148 149 static camera_status_t getIGBPfromAnw( 150 ANativeWindow* anw, sp<IGraphicBufferProducer>& out); 151 152 static camera_status_t getSurfaceFromANativeWindow( 153 ANativeWindow* anw, sp<Surface>& out); 154 155 mutable Mutex mDeviceLock; 156 const String8 mCameraId; // Camera ID 157 const ACameraDevice_StateCallbacks mAppCallbacks; // Callback to app 158 const std::unique_ptr<ACameraMetadata> mChars; // Camera characteristics 159 const sp<ServiceCallback> mServiceCallback; 160 ACameraDevice* mWrapper; 161 162 // stream id -> pair of (ANW* from application, OutputConfiguration used for camera service) 163 std::map<int, std::pair<ANativeWindow*, OutputConfiguration>> mConfiguredOutputs; 164 165 // TODO: maybe a bool will suffice for synchronous implementation? 166 std::atomic_bool mClosing; 167 inline bool isClosed() { return mClosing; } 168 169 bool mInError = false; 170 camera_status_t mError = ACAMERA_OK; 171 void onCaptureErrorLocked( 172 int32_t errorCode, 173 const CaptureResultExtras& resultExtras); 174 175 bool mIdle = true; 176 // This will avoid a busy session being deleted before it's back to idle state 177 sp<ACameraCaptureSession> mBusySession; 178 179 sp<hardware::camera2::ICameraDeviceUser> mRemote; 180 181 // Looper thread to handle callback to app 182 sp<ALooper> mCbLooper; 183 // definition of handler and message 184 enum { 185 // Device state callbacks 186 kWhatOnDisconnected, // onDisconnected 187 kWhatOnError, // onError 188 // Session state callbacks 189 kWhatSessionStateCb, // onReady, onActive 190 // Capture callbacks 191 kWhatCaptureStart, // onCaptureStarted 192 kWhatCaptureResult, // onCaptureProgressed, onCaptureCompleted 193 kWhatCaptureFail, // onCaptureFailed 194 kWhatCaptureSeqEnd, // onCaptureSequenceCompleted 195 kWhatCaptureSeqAbort, // onCaptureSequenceAborted 196 kWhatCaptureBufferLost,// onCaptureBufferLost 197 // Internal cleanup 198 kWhatCleanUpSessions // Cleanup cached sp<ACameraCaptureSession> 199 }; 200 static const char* kContextKey; 201 static const char* kDeviceKey; 202 static const char* kErrorCodeKey; 203 static const char* kCallbackFpKey; 204 static const char* kSessionSpKey; 205 static const char* kCaptureRequestKey; 206 static const char* kTimeStampKey; 207 static const char* kCaptureResultKey; 208 static const char* kCaptureFailureKey; 209 static const char* kSequenceIdKey; 210 static const char* kFrameNumberKey; 211 static const char* kAnwKey; 212 213 class CallbackHandler : public AHandler { 214 public: 215 void onMessageReceived(const sp<AMessage> &msg) override; 216 217 private: 218 // This handler will cache all capture session sp until kWhatCleanUpSessions 219 // is processed. This is used to guarantee the last session reference is always 220 // being removed in callback thread without holding camera device lock 221 Vector<sp<ACameraCaptureSession>> mCachedSessions; 222 }; 223 sp<CallbackHandler> mHandler; 224 225 /*********************************** 226 * Capture session related members * 227 ***********************************/ 228 // The current active session 229 wp<ACameraCaptureSession> mCurrentSession; 230 bool mFlushing = false; 231 232 int mNextSessionId = 0; 233 // TODO: might need another looper/handler to handle callbacks from service 234 235 static const int REQUEST_ID_NONE = -1; 236 int mRepeatingSequenceId = REQUEST_ID_NONE; 237 238 // sequence id -> last frame number map 239 std::map<int, int64_t> mSequenceLastFrameNumberMap; 240 241 struct CallbackHolder { 242 CallbackHolder(sp<ACameraCaptureSession> session, 243 const Vector<sp<CaptureRequest> >& requests, 244 bool isRepeating, 245 ACameraCaptureSession_captureCallbacks* cbs); 246 247 static ACameraCaptureSession_captureCallbacks fillCb( 248 ACameraCaptureSession_captureCallbacks* cbs) { 249 if (cbs != nullptr) { 250 return *cbs; 251 } 252 return { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; 253 } 254 255 sp<ACameraCaptureSession> mSession; 256 Vector<sp<CaptureRequest> > mRequests; 257 const bool mIsRepeating; 258 ACameraCaptureSession_captureCallbacks mCallbacks; 259 }; 260 // sequence id -> callbacks map 261 std::map<int, CallbackHolder> mSequenceCallbackMap; 262 263 static const int64_t NO_FRAMES_CAPTURED = -1; 264 class FrameNumberTracker { 265 public: 266 // TODO: Called in onResultReceived and onCaptureErrorLocked 267 void updateTracker(int64_t frameNumber, bool isError); 268 inline int64_t getCompletedFrameNumber() { return mCompletedFrameNumber; } 269 private: 270 void update(); 271 void updateCompletedFrameNumber(int64_t frameNumber); 272 273 int64_t mCompletedFrameNumber = NO_FRAMES_CAPTURED; 274 List<int64_t> mSkippedFrameNumbers; 275 std::set<int64_t> mFutureErrorSet; 276 }; 277 FrameNumberTracker mFrameNumberTracker; 278 279 void checkRepeatingSequenceCompleteLocked(const int sequenceId, const int64_t lastFrameNumber); 280 void checkAndFireSequenceCompleteLocked(); 281 282 // Misc variables 283 int32_t mShadingMapSize[2]; // const after constructor 284 int32_t mPartialResultCount; // const after constructor 285 286}; 287 288} // namespace android; 289 290/** 291 * ACameraDevice opaque struct definition 292 * Leave outside of android namespace because it's NDK struct 293 */ 294struct ACameraDevice { 295 ACameraDevice(const char* id, ACameraDevice_StateCallbacks* cb, 296 std::unique_ptr<ACameraMetadata> chars) : 297 mDevice(new CameraDevice(id, cb, std::move(chars), this)) {} 298 299 ~ACameraDevice() {}; 300 301 /******************* 302 * NDK public APIs * 303 *******************/ 304 inline const char* getId() const { return mDevice->getId(); } 305 306 camera_status_t createCaptureRequest( 307 ACameraDevice_request_template templateId, 308 ACaptureRequest** request) const { 309 return mDevice->createCaptureRequest(templateId, request); 310 } 311 312 camera_status_t createCaptureSession( 313 const ACaptureSessionOutputContainer* outputs, 314 const ACaptureRequest* sessionParameters, 315 const ACameraCaptureSession_stateCallbacks* callbacks, 316 /*out*/ACameraCaptureSession** session) { 317 return mDevice->createCaptureSession(outputs, sessionParameters, callbacks, session); 318 } 319 320 /*********************** 321 * Device interal APIs * 322 ***********************/ 323 inline android::sp<android::hardware::camera2::ICameraDeviceCallbacks> getServiceCallback() { 324 return mDevice->getServiceCallback(); 325 }; 326 327 // Camera device is only functional after remote being set 328 inline void setRemoteDevice(android::sp<android::hardware::camera2::ICameraDeviceUser> remote) { 329 mDevice->setRemoteDevice(remote); 330 } 331 332 private: 333 android::sp<android::CameraDevice> mDevice; 334}; 335 336#endif // _ACAMERA_DEVICE_H 337