blob: cd65e8c7ce51e6cac20fe7b741f2e06c9b4fb952 [file] [log] [blame]
Yin-Chia Yehead91462016-01-06 16:45:08 -08001/*
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>
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080020#include <string>
Yin-Chia Yehead91462016-01-06 16:45:08 -080021#include <hardware/camera3.h>
Colin Cross7e8d4ba2017-05-04 16:17:42 -070022#include <camera/NdkCameraDevice.h>
Jayant Chowdhary6df26072018-11-06 23:55:12 -080023
24#ifdef __ANDROID_VNDK__
25#include "ndk_vendor/impl/ACameraDevice.h"
26#include "ndk_vendor/impl/ACameraCaptureSessionVendor.h"
27#else
Yin-Chia Yehead91462016-01-06 16:45:08 -080028#include "ACameraDevice.h"
29
30using namespace android;
31
32struct ACaptureSessionOutput {
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080033 explicit ACaptureSessionOutput(ACameraWindowType* window, bool isShared = false,
34 const char* physicalCameraId = "") :
35 mWindow(window), mIsShared(isShared), mPhysicalCameraId(physicalCameraId) {};
Yin-Chia Yehead91462016-01-06 16:45:08 -080036
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
Avichal Rakeshf099b232022-10-27 15:44:50 -070050 inline bool isWindowEqual(ACameraWindowType* window) const {
51 return mWindow == window;
52 }
53
54 // returns true if the window was successfully added, false otherwise.
55 inline bool addSharedWindow(ACameraWindowType* window) {
56 auto ret = mSharedWindows.insert(window);
57 return ret.second;
58 }
59
60 // returns the number of elements removed.
61 inline size_t removeSharedWindow(ACameraWindowType* window) {
62 return mSharedWindows.erase(window);
63 }
64
Jayant Chowdhary6df26072018-11-06 23:55:12 -080065 ACameraWindowType* mWindow;
66 std::set<ACameraWindowType *> mSharedWindows;
Emilian Peev40ead602017-09-26 15:46:36 +010067 bool mIsShared;
Yin-Chia Yehead91462016-01-06 16:45:08 -080068 int mRotation = CAMERA3_STREAM_ROTATION_0;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080069 std::string mPhysicalCameraId;
Yin-Chia Yehead91462016-01-06 16:45:08 -080070};
Jayant Chowdhary6df26072018-11-06 23:55:12 -080071#endif
Yin-Chia Yehead91462016-01-06 16:45:08 -080072
73struct ACaptureSessionOutputContainer {
74 std::set<ACaptureSessionOutput> mOutputs;
75};
76
77/**
78 * ACameraCaptureSession opaque struct definition
79 * Leave outside of android namespace because it's NDK struct
80 */
81struct ACameraCaptureSession : public RefBase {
82 public:
Avichal Rakeshf099b232022-10-27 15:44:50 -070083#ifdef __ANDROID_VNDK__
84 ACameraCaptureSession(
85 int id,
86 const ACaptureSessionOutputContainer* outputs,
87 const ACameraCaptureSession_stateCallbacks* cb,
88 std::weak_ptr<android::acam::CameraDevice> device) :
89 mId(id), mOutput(*outputs), mUserSessionCallback(*cb),
90 mDevice(std::move(device)) {}
91#else
Yin-Chia Yehead91462016-01-06 16:45:08 -080092 ACameraCaptureSession(
93 int id,
94 const ACaptureSessionOutputContainer* outputs,
95 const ACameraCaptureSession_stateCallbacks* cb,
Jayant Chowdhary6df26072018-11-06 23:55:12 -080096 android::acam::CameraDevice* device) :
Yin-Chia Yehead91462016-01-06 16:45:08 -080097 mId(id), mOutput(*outputs), mUserSessionCallback(*cb),
98 mDevice(device) {}
Avichal Rakeshf099b232022-10-27 15:44:50 -070099#endif
Yin-Chia Yehead91462016-01-06 16:45:08 -0800100
101 // This can be called in app calling close() or after some app callback is finished
102 // Make sure the caller does not hold device or session lock!
103 ~ACameraCaptureSession();
104
105 // No API except Session_Close will work if device is closed
106 // A session will enter closed state when one of the following happens:
107 // 1. Explicitly closed by app
108 // 2. Replaced by a newer session
109 // 3. Device is closed
110 bool isClosed() { Mutex::Autolock _l(mSessionLock); return mIsClosed; }
111
112 // Close the session and mark app no longer need this session.
113 void closeByApp();
114
115 camera_status_t stopRepeating();
116
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700117 camera_status_t abortCaptures();
118
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800119 template<class T>
Yin-Chia Yehead91462016-01-06 16:45:08 -0800120 camera_status_t setRepeatingRequest(
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800121 /*optional*/T* cbs,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800122 int numRequests, ACaptureRequest** requests,
123 /*optional*/int* captureSequenceId);
124
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800125 template<class T>
Yin-Chia Yehead91462016-01-06 16:45:08 -0800126 camera_status_t capture(
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800127 /*optional*/T* cbs,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800128 int numRequests, ACaptureRequest** requests,
129 /*optional*/int* captureSequenceId);
130
Emilian Peev40ead602017-09-26 15:46:36 +0100131 camera_status_t updateOutputConfiguration(ACaptureSessionOutput *output);
132
Yin-Chia Yehead91462016-01-06 16:45:08 -0800133 ACameraDevice* getDevice();
134
135 private:
Jayant Chowdhary6df26072018-11-06 23:55:12 -0800136 friend class android::acam::CameraDevice;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800137
138 // Close session because app close camera device, camera device got ERROR_DISCONNECTED,
139 // or a new session is replacing this session.
140 void closeByDevice();
141
Avichal Rakeshf099b232022-10-27 15:44:50 -0700142#ifdef __ANDROID_VNDK__
143 std::shared_ptr<android::acam::CameraDevice> getDevicePtr();
144#else
Jayant Chowdhary6df26072018-11-06 23:55:12 -0800145 sp<android::acam::CameraDevice> getDeviceSp();
Avichal Rakeshf099b232022-10-27 15:44:50 -0700146#endif
Yin-Chia Yehead91462016-01-06 16:45:08 -0800147
148 const int mId;
149 const ACaptureSessionOutputContainer mOutput;
150 const ACameraCaptureSession_stateCallbacks mUserSessionCallback;
Avichal Rakeshf099b232022-10-27 15:44:50 -0700151#ifdef __ANDROID_VNDK__
152 const std::weak_ptr<android::acam::CameraDevice> mDevice;
153#else
Jayant Chowdhary6df26072018-11-06 23:55:12 -0800154 const wp<android::acam::CameraDevice> mDevice;
Avichal Rakeshf099b232022-10-27 15:44:50 -0700155#endif
156
Yin-Chia Yehead91462016-01-06 16:45:08 -0800157 bool mIsClosed = false;
Yin-Chia Yeh085dd092016-03-02 14:16:31 -0800158 bool mClosedByApp = false;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800159 Mutex mSessionLock;
160};
161
162#endif // _ACAMERA_CAPTURE_SESSION_H