1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker #ifndef _ACAMERA_CAPTURE_SESSION_H 17*ec779b8eSAndroid Build Coastguard Worker #define _ACAMERA_CAPTURE_SESSION_H 18*ec779b8eSAndroid Build Coastguard Worker 19*ec779b8eSAndroid Build Coastguard Worker #include <set> 20*ec779b8eSAndroid Build Coastguard Worker #include <string> 21*ec779b8eSAndroid Build Coastguard Worker #include <hardware/camera3.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <camera/NdkCameraDevice.h> 23*ec779b8eSAndroid Build Coastguard Worker 24*ec779b8eSAndroid Build Coastguard Worker #ifdef __ANDROID_VNDK__ 25*ec779b8eSAndroid Build Coastguard Worker #include "ndk_vendor/impl/ACameraDevice.h" 26*ec779b8eSAndroid Build Coastguard Worker #else 27*ec779b8eSAndroid Build Coastguard Worker #include "ACameraDevice.h" 28*ec779b8eSAndroid Build Coastguard Worker #endif 29*ec779b8eSAndroid Build Coastguard Worker 30*ec779b8eSAndroid Build Coastguard Worker using namespace android; 31*ec779b8eSAndroid Build Coastguard Worker 32*ec779b8eSAndroid Build Coastguard Worker struct ACaptureSessionOutput { 33*ec779b8eSAndroid Build Coastguard Worker explicit ACaptureSessionOutput(ANativeWindow* window, bool isShared = false, 34*ec779b8eSAndroid Build Coastguard Worker const char* physicalCameraId = "") : mWindowACaptureSessionOutput35*ec779b8eSAndroid Build Coastguard Worker mWindow(window), mIsShared(isShared), mPhysicalCameraId(physicalCameraId) {}; 36*ec779b8eSAndroid Build Coastguard Worker 37*ec779b8eSAndroid Build Coastguard Worker bool operator == (const ACaptureSessionOutput& other) const { 38*ec779b8eSAndroid Build Coastguard Worker return mWindow == other.mWindow; 39*ec779b8eSAndroid Build Coastguard Worker } 40*ec779b8eSAndroid Build Coastguard Worker bool operator != (const ACaptureSessionOutput& other) const { 41*ec779b8eSAndroid Build Coastguard Worker return mWindow != other.mWindow; 42*ec779b8eSAndroid Build Coastguard Worker } 43*ec779b8eSAndroid Build Coastguard Worker bool operator < (const ACaptureSessionOutput& other) const { 44*ec779b8eSAndroid Build Coastguard Worker return mWindow < other.mWindow; 45*ec779b8eSAndroid Build Coastguard Worker } 46*ec779b8eSAndroid Build Coastguard Worker bool operator > (const ACaptureSessionOutput& other) const { 47*ec779b8eSAndroid Build Coastguard Worker return mWindow > other.mWindow; 48*ec779b8eSAndroid Build Coastguard Worker } 49*ec779b8eSAndroid Build Coastguard Worker isWindowEqualACaptureSessionOutput50*ec779b8eSAndroid Build Coastguard Worker inline bool isWindowEqual(ANativeWindow* window) const { 51*ec779b8eSAndroid Build Coastguard Worker return mWindow == window; 52*ec779b8eSAndroid Build Coastguard Worker } 53*ec779b8eSAndroid Build Coastguard Worker 54*ec779b8eSAndroid Build Coastguard Worker // returns true if the window was successfully added, false otherwise. addSharedWindowACaptureSessionOutput55*ec779b8eSAndroid Build Coastguard Worker inline bool addSharedWindow(ANativeWindow* window) { 56*ec779b8eSAndroid Build Coastguard Worker auto ret = mSharedWindows.insert(window); 57*ec779b8eSAndroid Build Coastguard Worker return ret.second; 58*ec779b8eSAndroid Build Coastguard Worker } 59*ec779b8eSAndroid Build Coastguard Worker 60*ec779b8eSAndroid Build Coastguard Worker // returns the number of elements removed. removeSharedWindowACaptureSessionOutput61*ec779b8eSAndroid Build Coastguard Worker inline size_t removeSharedWindow(ANativeWindow* window) { 62*ec779b8eSAndroid Build Coastguard Worker return mSharedWindows.erase(window); 63*ec779b8eSAndroid Build Coastguard Worker } 64*ec779b8eSAndroid Build Coastguard Worker 65*ec779b8eSAndroid Build Coastguard Worker ANativeWindow* mWindow; 66*ec779b8eSAndroid Build Coastguard Worker std::set<ANativeWindow*> mSharedWindows; 67*ec779b8eSAndroid Build Coastguard Worker bool mIsShared; 68*ec779b8eSAndroid Build Coastguard Worker int mRotation = CAMERA3_STREAM_ROTATION_0; 69*ec779b8eSAndroid Build Coastguard Worker std::string mPhysicalCameraId; 70*ec779b8eSAndroid Build Coastguard Worker }; 71*ec779b8eSAndroid Build Coastguard Worker 72*ec779b8eSAndroid Build Coastguard Worker struct ACaptureSessionOutputContainer { 73*ec779b8eSAndroid Build Coastguard Worker std::set<ACaptureSessionOutput> mOutputs; 74*ec779b8eSAndroid Build Coastguard Worker }; 75*ec779b8eSAndroid Build Coastguard Worker 76*ec779b8eSAndroid Build Coastguard Worker /** 77*ec779b8eSAndroid Build Coastguard Worker * Capture session state callbacks used in {@link ACameraDevice_setPrepareCallbacks} 78*ec779b8eSAndroid Build Coastguard Worker */ 79*ec779b8eSAndroid Build Coastguard Worker typedef struct ACameraCaptureSession_prepareCallbacks { 80*ec779b8eSAndroid Build Coastguard Worker /// optional application context. This will be passed in the context 81*ec779b8eSAndroid Build Coastguard Worker /// parameter of the {@link onWindowPrepared} callback. 82*ec779b8eSAndroid Build Coastguard Worker void* context; 83*ec779b8eSAndroid Build Coastguard Worker 84*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_prepareCallback onWindowPrepared; 85*ec779b8eSAndroid Build Coastguard Worker } ACameraCaptureSession_prepareCallbacks; 86*ec779b8eSAndroid Build Coastguard Worker 87*ec779b8eSAndroid Build Coastguard Worker /** 88*ec779b8eSAndroid Build Coastguard Worker * ACameraCaptureSession opaque struct definition 89*ec779b8eSAndroid Build Coastguard Worker * Leave outside of android namespace because it's NDK struct 90*ec779b8eSAndroid Build Coastguard Worker */ 91*ec779b8eSAndroid Build Coastguard Worker struct ACameraCaptureSession : public RefBase { 92*ec779b8eSAndroid Build Coastguard Worker public: 93*ec779b8eSAndroid Build Coastguard Worker #ifdef __ANDROID_VNDK__ ACameraCaptureSessionACameraCaptureSession94*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession( 95*ec779b8eSAndroid Build Coastguard Worker int id, 96*ec779b8eSAndroid Build Coastguard Worker const ACaptureSessionOutputContainer* outputs, 97*ec779b8eSAndroid Build Coastguard Worker const ACameraCaptureSession_stateCallbacks* cb, 98*ec779b8eSAndroid Build Coastguard Worker std::weak_ptr<android::acam::CameraDevice> device) : 99*ec779b8eSAndroid Build Coastguard Worker mId(id), mOutput(*outputs), mUserSessionCallback(*cb), 100*ec779b8eSAndroid Build Coastguard Worker mDevice(std::move(device)) {} 101*ec779b8eSAndroid Build Coastguard Worker #else 102*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession( 103*ec779b8eSAndroid Build Coastguard Worker int id, 104*ec779b8eSAndroid Build Coastguard Worker const ACaptureSessionOutputContainer* outputs, 105*ec779b8eSAndroid Build Coastguard Worker const ACameraCaptureSession_stateCallbacks* cb, 106*ec779b8eSAndroid Build Coastguard Worker android::acam::CameraDevice* device) : 107*ec779b8eSAndroid Build Coastguard Worker mId(id), mOutput(*outputs), mUserSessionCallback(*cb), 108*ec779b8eSAndroid Build Coastguard Worker mDevice(device) {} 109*ec779b8eSAndroid Build Coastguard Worker #endif 110*ec779b8eSAndroid Build Coastguard Worker 111*ec779b8eSAndroid Build Coastguard Worker // This can be called in app calling close() or after some app callback is finished 112*ec779b8eSAndroid Build Coastguard Worker // Make sure the caller does not hold device or session lock! 113*ec779b8eSAndroid Build Coastguard Worker ~ACameraCaptureSession(); 114*ec779b8eSAndroid Build Coastguard Worker 115*ec779b8eSAndroid Build Coastguard Worker // No API except Session_Close will work if device is closed 116*ec779b8eSAndroid Build Coastguard Worker // A session will enter closed state when one of the following happens: 117*ec779b8eSAndroid Build Coastguard Worker // 1. Explicitly closed by app 118*ec779b8eSAndroid Build Coastguard Worker // 2. Replaced by a newer session 119*ec779b8eSAndroid Build Coastguard Worker // 3. Device is closed isClosedACameraCaptureSession120*ec779b8eSAndroid Build Coastguard Worker bool isClosed() { Mutex::Autolock _l(mSessionLock); return mIsClosed; } 121*ec779b8eSAndroid Build Coastguard Worker 122*ec779b8eSAndroid Build Coastguard Worker // Close the session and mark app no longer need this session. 123*ec779b8eSAndroid Build Coastguard Worker void closeByApp(); 124*ec779b8eSAndroid Build Coastguard Worker 125*ec779b8eSAndroid Build Coastguard Worker camera_status_t stopRepeating(); 126*ec779b8eSAndroid Build Coastguard Worker 127*ec779b8eSAndroid Build Coastguard Worker camera_status_t abortCaptures(); 128*ec779b8eSAndroid Build Coastguard Worker 129*ec779b8eSAndroid Build Coastguard Worker template<class T> 130*ec779b8eSAndroid Build Coastguard Worker camera_status_t setRepeatingRequest( 131*ec779b8eSAndroid Build Coastguard Worker /*optional*/T* cbs, 132*ec779b8eSAndroid Build Coastguard Worker int numRequests, ACaptureRequest** requests, 133*ec779b8eSAndroid Build Coastguard Worker /*optional*/int* captureSequenceId); 134*ec779b8eSAndroid Build Coastguard Worker 135*ec779b8eSAndroid Build Coastguard Worker template<class T> 136*ec779b8eSAndroid Build Coastguard Worker camera_status_t capture( 137*ec779b8eSAndroid Build Coastguard Worker /*optional*/T* cbs, 138*ec779b8eSAndroid Build Coastguard Worker int numRequests, ACaptureRequest** requests, 139*ec779b8eSAndroid Build Coastguard Worker /*optional*/int* captureSequenceId); 140*ec779b8eSAndroid Build Coastguard Worker 141*ec779b8eSAndroid Build Coastguard Worker camera_status_t updateOutputConfiguration(ACaptureSessionOutput *output); 142*ec779b8eSAndroid Build Coastguard Worker setWindowPreparedCallbackACameraCaptureSession143*ec779b8eSAndroid Build Coastguard Worker void setWindowPreparedCallback(void *context, 144*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_prepareCallback cb) { 145*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock _l(mSessionLock); 146*ec779b8eSAndroid Build Coastguard Worker mPreparedCb.context = context; 147*ec779b8eSAndroid Build Coastguard Worker mPreparedCb.onWindowPrepared = cb; 148*ec779b8eSAndroid Build Coastguard Worker } 149*ec779b8eSAndroid Build Coastguard Worker camera_status_t prepare(ANativeWindow *window); 150*ec779b8eSAndroid Build Coastguard Worker 151*ec779b8eSAndroid Build Coastguard Worker ACameraDevice* getDevice(); 152*ec779b8eSAndroid Build Coastguard Worker 153*ec779b8eSAndroid Build Coastguard Worker private: 154*ec779b8eSAndroid Build Coastguard Worker friend class android::acam::CameraDevice; 155*ec779b8eSAndroid Build Coastguard Worker 156*ec779b8eSAndroid Build Coastguard Worker // Close session because app close camera device, camera device got ERROR_DISCONNECTED, 157*ec779b8eSAndroid Build Coastguard Worker // or a new session is replacing this session. 158*ec779b8eSAndroid Build Coastguard Worker void closeByDevice(); 159*ec779b8eSAndroid Build Coastguard Worker 160*ec779b8eSAndroid Build Coastguard Worker #ifdef __ANDROID_VNDK__ 161*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<android::acam::CameraDevice> getDevicePtr(); 162*ec779b8eSAndroid Build Coastguard Worker #else 163*ec779b8eSAndroid Build Coastguard Worker sp<android::acam::CameraDevice> getDeviceSp(); 164*ec779b8eSAndroid Build Coastguard Worker #endif 165*ec779b8eSAndroid Build Coastguard Worker 166*ec779b8eSAndroid Build Coastguard Worker const int mId; 167*ec779b8eSAndroid Build Coastguard Worker const ACaptureSessionOutputContainer mOutput; 168*ec779b8eSAndroid Build Coastguard Worker const ACameraCaptureSession_stateCallbacks mUserSessionCallback; 169*ec779b8eSAndroid Build Coastguard Worker #ifdef __ANDROID_VNDK__ 170*ec779b8eSAndroid Build Coastguard Worker const std::weak_ptr<android::acam::CameraDevice> mDevice; 171*ec779b8eSAndroid Build Coastguard Worker #else 172*ec779b8eSAndroid Build Coastguard Worker const wp<android::acam::CameraDevice> mDevice; 173*ec779b8eSAndroid Build Coastguard Worker #endif 174*ec779b8eSAndroid Build Coastguard Worker 175*ec779b8eSAndroid Build Coastguard Worker bool mIsClosed = false; 176*ec779b8eSAndroid Build Coastguard Worker bool mClosedByApp = false; 177*ec779b8eSAndroid Build Coastguard Worker ACameraCaptureSession_prepareCallbacks mPreparedCb; 178*ec779b8eSAndroid Build Coastguard Worker Mutex mSessionLock; 179*ec779b8eSAndroid Build Coastguard Worker }; 180*ec779b8eSAndroid Build Coastguard Worker 181*ec779b8eSAndroid Build Coastguard Worker #endif // _ACAMERA_CAPTURE_SESSION_H 182