1 /* 2 * Copyright (C) 2016 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_CAPTURE_SESSION_H 17 #define _ACAMERA_CAPTURE_SESSION_H 18 19 #include <set> 20 #include <string> 21 #include <hardware/camera3.h> 22 #include <camera/NdkCameraDevice.h> 23 24 #ifdef __ANDROID_VNDK__ 25 #include "ndk_vendor/impl/ACameraDevice.h" 26 #include "ndk_vendor/impl/ACameraCaptureSessionVendor.h" 27 #else 28 #include "ACameraDevice.h" 29 30 using namespace android; 31 32 struct ACaptureSessionOutput { 33 explicit ACaptureSessionOutput(ACameraWindowType* window, bool isShared = false, 34 const char* physicalCameraId = "") : mWindowACaptureSessionOutput35 mWindow(window), mIsShared(isShared), mPhysicalCameraId(physicalCameraId) {}; 36 37 bool operator == (const ACaptureSessionOutput& other) const { 38 return mWindow == other.mWindow; 39 } 40 bool operator != (const ACaptureSessionOutput& other) const { 41 return mWindow != other.mWindow; 42 } 43 bool operator < (const ACaptureSessionOutput& other) const { 44 return mWindow < other.mWindow; 45 } 46 bool operator > (const ACaptureSessionOutput& other) const { 47 return mWindow > other.mWindow; 48 } 49 isWindowEqualACaptureSessionOutput50 inline bool isWindowEqual(ACameraWindowType* window) const { 51 return mWindow == window; 52 } 53 54 // returns true if the window was successfully added, false otherwise. addSharedWindowACaptureSessionOutput55 inline bool addSharedWindow(ACameraWindowType* window) { 56 auto ret = mSharedWindows.insert(window); 57 return ret.second; 58 } 59 60 // returns the number of elements removed. removeSharedWindowACaptureSessionOutput61 inline size_t removeSharedWindow(ACameraWindowType* window) { 62 return mSharedWindows.erase(window); 63 } 64 65 ACameraWindowType* mWindow; 66 std::set<ACameraWindowType *> mSharedWindows; 67 bool mIsShared; 68 int mRotation = CAMERA3_STREAM_ROTATION_0; 69 std::string mPhysicalCameraId; 70 }; 71 #endif 72 73 struct ACaptureSessionOutputContainer { 74 std::set<ACaptureSessionOutput> mOutputs; 75 }; 76 77 /** 78 * Capture session state callbacks used in {@link ACameraDevice_setPrepareCallbacks} 79 */ 80 typedef struct ACameraCaptureSession_prepareCallbacks { 81 /// optional application context. This will be passed in the context 82 /// parameter of the {@link onWindowPrepared} callback. 83 void* context; 84 85 ACameraCaptureSession_prepareCallback onWindowPrepared; 86 } ACameraCaptureSession_prepareCallbacks; 87 88 /** 89 * ACameraCaptureSession opaque struct definition 90 * Leave outside of android namespace because it's NDK struct 91 */ 92 struct ACameraCaptureSession : public RefBase { 93 public: 94 #ifdef __ANDROID_VNDK__ ACameraCaptureSessionACameraCaptureSession95 ACameraCaptureSession( 96 int id, 97 const ACaptureSessionOutputContainer* outputs, 98 const ACameraCaptureSession_stateCallbacks* cb, 99 std::weak_ptr<android::acam::CameraDevice> device) : 100 mId(id), mOutput(*outputs), mUserSessionCallback(*cb), 101 mDevice(std::move(device)) {} 102 #else 103 ACameraCaptureSession( 104 int id, 105 const ACaptureSessionOutputContainer* outputs, 106 const ACameraCaptureSession_stateCallbacks* cb, 107 android::acam::CameraDevice* device) : 108 mId(id), mOutput(*outputs), mUserSessionCallback(*cb), 109 mDevice(device) {} 110 #endif 111 112 // This can be called in app calling close() or after some app callback is finished 113 // Make sure the caller does not hold device or session lock! 114 ~ACameraCaptureSession(); 115 116 // No API except Session_Close will work if device is closed 117 // A session will enter closed state when one of the following happens: 118 // 1. Explicitly closed by app 119 // 2. Replaced by a newer session 120 // 3. Device is closed isClosedACameraCaptureSession121 bool isClosed() { Mutex::Autolock _l(mSessionLock); return mIsClosed; } 122 123 // Close the session and mark app no longer need this session. 124 void closeByApp(); 125 126 camera_status_t stopRepeating(); 127 128 camera_status_t abortCaptures(); 129 130 template<class T> 131 camera_status_t setRepeatingRequest( 132 /*optional*/T* cbs, 133 int numRequests, ACaptureRequest** requests, 134 /*optional*/int* captureSequenceId); 135 136 template<class T> 137 camera_status_t capture( 138 /*optional*/T* cbs, 139 int numRequests, ACaptureRequest** requests, 140 /*optional*/int* captureSequenceId); 141 142 camera_status_t updateOutputConfiguration(ACaptureSessionOutput *output); 143 setWindowPreparedCallbackACameraCaptureSession144 void setWindowPreparedCallback(void *context, 145 ACameraCaptureSession_prepareCallback cb) { 146 Mutex::Autolock _l(mSessionLock); 147 mPreparedCb.context = context; 148 mPreparedCb.onWindowPrepared = cb; 149 } 150 camera_status_t prepare(ACameraWindowType *window); 151 152 ACameraDevice* getDevice(); 153 154 private: 155 friend class android::acam::CameraDevice; 156 157 // Close session because app close camera device, camera device got ERROR_DISCONNECTED, 158 // or a new session is replacing this session. 159 void closeByDevice(); 160 161 #ifdef __ANDROID_VNDK__ 162 std::shared_ptr<android::acam::CameraDevice> getDevicePtr(); 163 #else 164 sp<android::acam::CameraDevice> getDeviceSp(); 165 #endif 166 167 const int mId; 168 const ACaptureSessionOutputContainer mOutput; 169 const ACameraCaptureSession_stateCallbacks mUserSessionCallback; 170 #ifdef __ANDROID_VNDK__ 171 const std::weak_ptr<android::acam::CameraDevice> mDevice; 172 #else 173 const wp<android::acam::CameraDevice> mDevice; 174 #endif 175 176 bool mIsClosed = false; 177 bool mClosedByApp = false; 178 ACameraCaptureSession_prepareCallbacks mPreparedCb; 179 Mutex mSessionLock; 180 }; 181 182 #endif // _ACAMERA_CAPTURE_SESSION_H 183