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