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 50 ACameraWindowType* mWindow; 51 std::set<ACameraWindowType *> mSharedWindows; 52 bool mIsShared; 53 int mRotation = CAMERA3_STREAM_ROTATION_0; 54 std::string mPhysicalCameraId; 55 }; 56 #endif 57 58 struct ACaptureSessionOutputContainer { 59 std::set<ACaptureSessionOutput> mOutputs; 60 }; 61 62 /** 63 * ACameraCaptureSession opaque struct definition 64 * Leave outside of android namespace because it's NDK struct 65 */ 66 struct ACameraCaptureSession : public RefBase { 67 public: ACameraCaptureSessionACameraCaptureSession68 ACameraCaptureSession( 69 int id, 70 const ACaptureSessionOutputContainer* outputs, 71 const ACameraCaptureSession_stateCallbacks* cb, 72 android::acam::CameraDevice* device) : 73 mId(id), mOutput(*outputs), mUserSessionCallback(*cb), 74 mDevice(device) {} 75 76 // This can be called in app calling close() or after some app callback is finished 77 // Make sure the caller does not hold device or session lock! 78 ~ACameraCaptureSession(); 79 80 // No API except Session_Close will work if device is closed 81 // A session will enter closed state when one of the following happens: 82 // 1. Explicitly closed by app 83 // 2. Replaced by a newer session 84 // 3. Device is closed isClosedACameraCaptureSession85 bool isClosed() { Mutex::Autolock _l(mSessionLock); return mIsClosed; } 86 87 // Close the session and mark app no longer need this session. 88 void closeByApp(); 89 90 camera_status_t stopRepeating(); 91 92 camera_status_t abortCaptures(); 93 94 template<class T> 95 camera_status_t setRepeatingRequest( 96 /*optional*/T* cbs, 97 int numRequests, ACaptureRequest** requests, 98 /*optional*/int* captureSequenceId); 99 100 template<class T> 101 camera_status_t capture( 102 /*optional*/T* cbs, 103 int numRequests, ACaptureRequest** requests, 104 /*optional*/int* captureSequenceId); 105 106 camera_status_t updateOutputConfiguration(ACaptureSessionOutput *output); 107 108 ACameraDevice* getDevice(); 109 110 private: 111 friend class android::acam::CameraDevice; 112 113 // Close session because app close camera device, camera device got ERROR_DISCONNECTED, 114 // or a new session is replacing this session. 115 void closeByDevice(); 116 117 sp<android::acam::CameraDevice> getDeviceSp(); 118 119 const int mId; 120 const ACaptureSessionOutputContainer mOutput; 121 const ACameraCaptureSession_stateCallbacks mUserSessionCallback; 122 const wp<android::acam::CameraDevice> mDevice; 123 bool mIsClosed = false; 124 bool mClosedByApp = false; 125 Mutex mSessionLock; 126 }; 127 128 #endif // _ACAMERA_CAPTURE_SESSION_H 129