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