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 <hardware/camera3.h> 21 #include <camera/NdkCameraDevice.h> 22 #include "ACameraDevice.h" 23 24 using namespace android; 25 26 struct ACaptureSessionOutput { ACaptureSessionOutputACaptureSessionOutput27 explicit ACaptureSessionOutput(ANativeWindow* window) : mWindow(window) {}; 28 29 bool operator == (const ACaptureSessionOutput& other) const { 30 return mWindow == other.mWindow; 31 } 32 bool operator != (const ACaptureSessionOutput& other) const { 33 return mWindow != other.mWindow; 34 } 35 bool operator < (const ACaptureSessionOutput& other) const { 36 return mWindow < other.mWindow; 37 } 38 bool operator > (const ACaptureSessionOutput& other) const { 39 return mWindow > other.mWindow; 40 } 41 42 ANativeWindow* mWindow; 43 int mRotation = CAMERA3_STREAM_ROTATION_0; 44 }; 45 46 struct ACaptureSessionOutputContainer { 47 std::set<ACaptureSessionOutput> mOutputs; 48 }; 49 50 /** 51 * ACameraCaptureSession opaque struct definition 52 * Leave outside of android namespace because it's NDK struct 53 */ 54 struct ACameraCaptureSession : public RefBase { 55 public: ACameraCaptureSessionACameraCaptureSession56 ACameraCaptureSession( 57 int id, 58 const ACaptureSessionOutputContainer* outputs, 59 const ACameraCaptureSession_stateCallbacks* cb, 60 CameraDevice* device) : 61 mId(id), mOutput(*outputs), mUserSessionCallback(*cb), 62 mDevice(device) {} 63 64 // This can be called in app calling close() or after some app callback is finished 65 // Make sure the caller does not hold device or session lock! 66 ~ACameraCaptureSession(); 67 68 // No API except Session_Close will work if device is closed 69 // A session will enter closed state when one of the following happens: 70 // 1. Explicitly closed by app 71 // 2. Replaced by a newer session 72 // 3. Device is closed isClosedACameraCaptureSession73 bool isClosed() { Mutex::Autolock _l(mSessionLock); return mIsClosed; } 74 75 // Close the session and mark app no longer need this session. 76 void closeByApp(); 77 78 camera_status_t stopRepeating(); 79 80 camera_status_t abortCaptures(); 81 82 camera_status_t setRepeatingRequest( 83 /*optional*/ACameraCaptureSession_captureCallbacks* cbs, 84 int numRequests, ACaptureRequest** requests, 85 /*optional*/int* captureSequenceId); 86 87 camera_status_t capture( 88 /*optional*/ACameraCaptureSession_captureCallbacks* cbs, 89 int numRequests, ACaptureRequest** requests, 90 /*optional*/int* captureSequenceId); 91 92 ACameraDevice* getDevice(); 93 94 private: 95 friend class CameraDevice; 96 97 // Close session because app close camera device, camera device got ERROR_DISCONNECTED, 98 // or a new session is replacing this session. 99 void closeByDevice(); 100 101 sp<CameraDevice> getDeviceSp(); 102 103 const int mId; 104 const ACaptureSessionOutputContainer mOutput; 105 const ACameraCaptureSession_stateCallbacks mUserSessionCallback; 106 const wp<CameraDevice> mDevice; 107 bool mIsClosed = false; 108 bool mClosedByApp = false; 109 Mutex mSessionLock; 110 }; 111 112 #endif // _ACAMERA_CAPTURE_SESSION_H 113