• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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