xref: /aosp_15_r20/hardware/interfaces/camera/device/3.2/default/CameraDeviceSession.h (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #ifndef ANDROID_HARDWARE_CAMERA_DEVICE_V3_2_CAMERADEVICE3SESSION_H
18*4d7e907cSAndroid Build Coastguard Worker #define ANDROID_HARDWARE_CAMERA_DEVICE_V3_2_CAMERADEVICE3SESSION_H
19*4d7e907cSAndroid Build Coastguard Worker 
20*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/camera/device/3.2/ICameraDevice.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/camera/device/3.2/ICameraDeviceSession.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <fmq/MessageQueue.h>
23*4d7e907cSAndroid Build Coastguard Worker #include <hidl/MQDescriptor.h>
24*4d7e907cSAndroid Build Coastguard Worker #include <hidl/Status.h>
25*4d7e907cSAndroid Build Coastguard Worker #include <include/convert.h>
26*4d7e907cSAndroid Build Coastguard Worker #include <deque>
27*4d7e907cSAndroid Build Coastguard Worker #include <map>
28*4d7e907cSAndroid Build Coastguard Worker #include <unordered_map>
29*4d7e907cSAndroid Build Coastguard Worker #include "CameraMetadata.h"
30*4d7e907cSAndroid Build Coastguard Worker #include "HandleImporter.h"
31*4d7e907cSAndroid Build Coastguard Worker #include "hardware/camera3.h"
32*4d7e907cSAndroid Build Coastguard Worker #include "hardware/camera_common.h"
33*4d7e907cSAndroid Build Coastguard Worker #include "utils/Mutex.h"
34*4d7e907cSAndroid Build Coastguard Worker 
35*4d7e907cSAndroid Build Coastguard Worker namespace android {
36*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
37*4d7e907cSAndroid Build Coastguard Worker namespace camera {
38*4d7e907cSAndroid Build Coastguard Worker namespace device {
39*4d7e907cSAndroid Build Coastguard Worker namespace V3_2 {
40*4d7e907cSAndroid Build Coastguard Worker namespace implementation {
41*4d7e907cSAndroid Build Coastguard Worker 
42*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::camera::device::V3_2::CaptureRequest;
43*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::camera::device::V3_2::HalStreamConfiguration;
44*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::camera::device::V3_2::StreamConfiguration;
45*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::camera::device::V3_2::ICameraDeviceSession;
46*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::camera::common::V1_0::Status;
47*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::camera::common::V1_0::helper::HandleImporter;
48*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::kSynchronizedReadWrite;
49*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::MessageQueue;
50*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::MQDescriptorSync;
51*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::Return;
52*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::Void;
53*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::hidl_vec;
54*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::hidl_string;
55*4d7e907cSAndroid Build Coastguard Worker using ::android::sp;
56*4d7e907cSAndroid Build Coastguard Worker using ::android::Mutex;
57*4d7e907cSAndroid Build Coastguard Worker 
58*4d7e907cSAndroid Build Coastguard Worker struct Camera3Stream;
59*4d7e907cSAndroid Build Coastguard Worker 
60*4d7e907cSAndroid Build Coastguard Worker /**
61*4d7e907cSAndroid Build Coastguard Worker  * Function pointer types with C calling convention to
62*4d7e907cSAndroid Build Coastguard Worker  * use for HAL callback functions.
63*4d7e907cSAndroid Build Coastguard Worker  */
64*4d7e907cSAndroid Build Coastguard Worker extern "C" {
65*4d7e907cSAndroid Build Coastguard Worker     typedef void (callbacks_process_capture_result_t)(
66*4d7e907cSAndroid Build Coastguard Worker         const struct camera3_callback_ops *,
67*4d7e907cSAndroid Build Coastguard Worker         const camera3_capture_result_t *);
68*4d7e907cSAndroid Build Coastguard Worker 
69*4d7e907cSAndroid Build Coastguard Worker     typedef void (callbacks_notify_t)(
70*4d7e907cSAndroid Build Coastguard Worker         const struct camera3_callback_ops *,
71*4d7e907cSAndroid Build Coastguard Worker         const camera3_notify_msg_t *);
72*4d7e907cSAndroid Build Coastguard Worker }
73*4d7e907cSAndroid Build Coastguard Worker 
74*4d7e907cSAndroid Build Coastguard Worker struct CameraDeviceSession : public virtual RefBase, protected camera3_callback_ops  {
75*4d7e907cSAndroid Build Coastguard Worker 
76*4d7e907cSAndroid Build Coastguard Worker     CameraDeviceSession(camera3_device_t*,
77*4d7e907cSAndroid Build Coastguard Worker                         const camera_metadata_t* deviceInfo,
78*4d7e907cSAndroid Build Coastguard Worker                         const sp<ICameraDeviceCallback>&);
79*4d7e907cSAndroid Build Coastguard Worker     virtual ~CameraDeviceSession();
80*4d7e907cSAndroid Build Coastguard Worker     // Call by CameraDevice to dump active device states
81*4d7e907cSAndroid Build Coastguard Worker     void dumpState(const native_handle_t* fd);
82*4d7e907cSAndroid Build Coastguard Worker     // Caller must use this method to check if CameraDeviceSession ctor failed
isInitFailedCameraDeviceSession83*4d7e907cSAndroid Build Coastguard Worker     bool isInitFailed() { return mInitFail; }
84*4d7e907cSAndroid Build Coastguard Worker     // Used by CameraDevice to signal external camera disconnected
85*4d7e907cSAndroid Build Coastguard Worker     void disconnect();
86*4d7e907cSAndroid Build Coastguard Worker     bool isClosed();
87*4d7e907cSAndroid Build Coastguard Worker 
88*4d7e907cSAndroid Build Coastguard Worker     // Retrieve the HIDL interface, split into its own class to avoid inheritance issues when
89*4d7e907cSAndroid Build Coastguard Worker     // dealing with minor version revs and simultaneous implementation and interface inheritance
getInterfaceCameraDeviceSession90*4d7e907cSAndroid Build Coastguard Worker     virtual sp<ICameraDeviceSession> getInterface() {
91*4d7e907cSAndroid Build Coastguard Worker         return new TrampolineSessionInterface_3_2(this);
92*4d7e907cSAndroid Build Coastguard Worker     }
93*4d7e907cSAndroid Build Coastguard Worker 
94*4d7e907cSAndroid Build Coastguard Worker protected:
95*4d7e907cSAndroid Build Coastguard Worker 
96*4d7e907cSAndroid Build Coastguard Worker     // Methods from ::android::hardware::camera::device::V3_2::ICameraDeviceSession follow
97*4d7e907cSAndroid Build Coastguard Worker 
98*4d7e907cSAndroid Build Coastguard Worker     Return<void> constructDefaultRequestSettings(
99*4d7e907cSAndroid Build Coastguard Worker             RequestTemplate type,
100*4d7e907cSAndroid Build Coastguard Worker             ICameraDeviceSession::constructDefaultRequestSettings_cb _hidl_cb);
101*4d7e907cSAndroid Build Coastguard Worker     Return<void> configureStreams(
102*4d7e907cSAndroid Build Coastguard Worker             const StreamConfiguration& requestedConfiguration,
103*4d7e907cSAndroid Build Coastguard Worker             ICameraDeviceSession::configureStreams_cb _hidl_cb);
104*4d7e907cSAndroid Build Coastguard Worker     Return<void> getCaptureRequestMetadataQueue(
105*4d7e907cSAndroid Build Coastguard Worker         ICameraDeviceSession::getCaptureRequestMetadataQueue_cb _hidl_cb);
106*4d7e907cSAndroid Build Coastguard Worker     Return<void> getCaptureResultMetadataQueue(
107*4d7e907cSAndroid Build Coastguard Worker         ICameraDeviceSession::getCaptureResultMetadataQueue_cb _hidl_cb);
108*4d7e907cSAndroid Build Coastguard Worker     Return<void> processCaptureRequest(
109*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<CaptureRequest>& requests,
110*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<BufferCache>& cachesToRemove,
111*4d7e907cSAndroid Build Coastguard Worker             ICameraDeviceSession::processCaptureRequest_cb _hidl_cb);
112*4d7e907cSAndroid Build Coastguard Worker     Return<Status> flush();
113*4d7e907cSAndroid Build Coastguard Worker     Return<void> close();
114*4d7e907cSAndroid Build Coastguard Worker 
115*4d7e907cSAndroid Build Coastguard Worker     // Helper methods
116*4d7e907cSAndroid Build Coastguard Worker     Status constructDefaultRequestSettingsRaw(int type, CameraMetadata *outMetadata);
117*4d7e907cSAndroid Build Coastguard Worker 
118*4d7e907cSAndroid Build Coastguard Worker     bool preProcessConfigurationLocked(const StreamConfiguration& requestedConfiguration,
119*4d7e907cSAndroid Build Coastguard Worker             camera3_stream_configuration_t *stream_list /*out*/,
120*4d7e907cSAndroid Build Coastguard Worker             hidl_vec<camera3_stream_t*> *streams /*out*/);
121*4d7e907cSAndroid Build Coastguard Worker     void postProcessConfigurationLocked(const StreamConfiguration& requestedConfiguration);
122*4d7e907cSAndroid Build Coastguard Worker 
123*4d7e907cSAndroid Build Coastguard Worker     void postProcessConfigurationFailureLocked(const StreamConfiguration& requestedConfiguration);
124*4d7e907cSAndroid Build Coastguard Worker 
125*4d7e907cSAndroid Build Coastguard Worker protected:
126*4d7e907cSAndroid Build Coastguard Worker 
127*4d7e907cSAndroid Build Coastguard Worker     // protecting mClosed/mDisconnected/mInitFail
128*4d7e907cSAndroid Build Coastguard Worker     mutable Mutex mStateLock;
129*4d7e907cSAndroid Build Coastguard Worker     // device is closed either
130*4d7e907cSAndroid Build Coastguard Worker     //    - closed by user
131*4d7e907cSAndroid Build Coastguard Worker     //    - init failed
132*4d7e907cSAndroid Build Coastguard Worker     //    - camera disconnected
133*4d7e907cSAndroid Build Coastguard Worker     bool mClosed = false;
134*4d7e907cSAndroid Build Coastguard Worker 
135*4d7e907cSAndroid Build Coastguard Worker     // Set by CameraDevice (when external camera is disconnected)
136*4d7e907cSAndroid Build Coastguard Worker     bool mDisconnected = false;
137*4d7e907cSAndroid Build Coastguard Worker 
138*4d7e907cSAndroid Build Coastguard Worker     struct AETriggerCancelOverride {
139*4d7e907cSAndroid Build Coastguard Worker         bool applyAeLock;
140*4d7e907cSAndroid Build Coastguard Worker         uint8_t aeLock;
141*4d7e907cSAndroid Build Coastguard Worker         bool applyAePrecaptureTrigger;
142*4d7e907cSAndroid Build Coastguard Worker         uint8_t aePrecaptureTrigger;
143*4d7e907cSAndroid Build Coastguard Worker     };
144*4d7e907cSAndroid Build Coastguard Worker 
145*4d7e907cSAndroid Build Coastguard Worker     camera3_device_t* mDevice;
146*4d7e907cSAndroid Build Coastguard Worker     const uint32_t mDeviceVersion;
147*4d7e907cSAndroid Build Coastguard Worker     const bool mFreeBufEarly;
148*4d7e907cSAndroid Build Coastguard Worker     bool mIsAELockAvailable;
149*4d7e907cSAndroid Build Coastguard Worker     bool mDerivePostRawSensKey;
150*4d7e907cSAndroid Build Coastguard Worker     uint32_t mNumPartialResults;
151*4d7e907cSAndroid Build Coastguard Worker     // Stream ID -> Camera3Stream cache
152*4d7e907cSAndroid Build Coastguard Worker     std::map<int, Camera3Stream> mStreamMap;
153*4d7e907cSAndroid Build Coastguard Worker 
154*4d7e907cSAndroid Build Coastguard Worker     mutable Mutex mInflightLock; // protecting mInflightBuffers and mCirculatingBuffers
155*4d7e907cSAndroid Build Coastguard Worker     // (streamID, frameNumber) -> inflight buffer cache
156*4d7e907cSAndroid Build Coastguard Worker     std::map<std::pair<int, uint32_t>, camera3_stream_buffer_t>  mInflightBuffers;
157*4d7e907cSAndroid Build Coastguard Worker 
158*4d7e907cSAndroid Build Coastguard Worker     // (frameNumber, AETriggerOverride) -> inflight request AETriggerOverrides
159*4d7e907cSAndroid Build Coastguard Worker     std::map<uint32_t, AETriggerCancelOverride> mInflightAETriggerOverrides;
160*4d7e907cSAndroid Build Coastguard Worker     ::android::hardware::camera::common::V1_0::helper::CameraMetadata mOverridenResult;
161*4d7e907cSAndroid Build Coastguard Worker     std::map<uint32_t, bool> mInflightRawBoostPresent;
162*4d7e907cSAndroid Build Coastguard Worker     ::android::hardware::camera::common::V1_0::helper::CameraMetadata mOverridenRequest;
163*4d7e907cSAndroid Build Coastguard Worker 
164*4d7e907cSAndroid Build Coastguard Worker     static const uint64_t BUFFER_ID_NO_BUFFER = 0;
165*4d7e907cSAndroid Build Coastguard Worker     // buffers currently ciculating between HAL and camera service
166*4d7e907cSAndroid Build Coastguard Worker     // key: bufferId sent via HIDL interface
167*4d7e907cSAndroid Build Coastguard Worker     // value: imported buffer_handle_t
168*4d7e907cSAndroid Build Coastguard Worker     // Buffer will be imported during process_capture_request and will be freed
169*4d7e907cSAndroid Build Coastguard Worker     // when the its stream is deleted or camera device session is closed
170*4d7e907cSAndroid Build Coastguard Worker     typedef std::unordered_map<uint64_t, buffer_handle_t> CirculatingBuffers;
171*4d7e907cSAndroid Build Coastguard Worker     // Stream ID -> circulating buffers map
172*4d7e907cSAndroid Build Coastguard Worker     std::map<int, CirculatingBuffers> mCirculatingBuffers;
173*4d7e907cSAndroid Build Coastguard Worker 
174*4d7e907cSAndroid Build Coastguard Worker     static HandleImporter sHandleImporter;
175*4d7e907cSAndroid Build Coastguard Worker     static buffer_handle_t sEmptyBuffer;
176*4d7e907cSAndroid Build Coastguard Worker 
177*4d7e907cSAndroid Build Coastguard Worker     bool mInitFail;
178*4d7e907cSAndroid Build Coastguard Worker     bool mFirstRequest = false;
179*4d7e907cSAndroid Build Coastguard Worker 
180*4d7e907cSAndroid Build Coastguard Worker     common::V1_0::helper::CameraMetadata mDeviceInfo;
181*4d7e907cSAndroid Build Coastguard Worker 
182*4d7e907cSAndroid Build Coastguard Worker     using RequestMetadataQueue = MessageQueue<uint8_t, kSynchronizedReadWrite>;
183*4d7e907cSAndroid Build Coastguard Worker     std::unique_ptr<RequestMetadataQueue> mRequestMetadataQueue;
184*4d7e907cSAndroid Build Coastguard Worker     using ResultMetadataQueue = MessageQueue<uint8_t, kSynchronizedReadWrite>;
185*4d7e907cSAndroid Build Coastguard Worker     std::shared_ptr<ResultMetadataQueue> mResultMetadataQueue;
186*4d7e907cSAndroid Build Coastguard Worker 
187*4d7e907cSAndroid Build Coastguard Worker     class ResultBatcher {
188*4d7e907cSAndroid Build Coastguard Worker     public:
189*4d7e907cSAndroid Build Coastguard Worker         ResultBatcher(const sp<ICameraDeviceCallback>& callback);
190*4d7e907cSAndroid Build Coastguard Worker         void setNumPartialResults(uint32_t n);
191*4d7e907cSAndroid Build Coastguard Worker         void setBatchedStreams(const std::vector<int>& streamsToBatch);
192*4d7e907cSAndroid Build Coastguard Worker         void setResultMetadataQueue(std::shared_ptr<ResultMetadataQueue> q);
193*4d7e907cSAndroid Build Coastguard Worker 
194*4d7e907cSAndroid Build Coastguard Worker         void registerBatch(uint32_t frameNumber, uint32_t batchSize);
195*4d7e907cSAndroid Build Coastguard Worker         void notify(NotifyMsg& msg);
196*4d7e907cSAndroid Build Coastguard Worker         void processCaptureResult(CaptureResult& result);
197*4d7e907cSAndroid Build Coastguard Worker 
198*4d7e907cSAndroid Build Coastguard Worker     protected:
199*4d7e907cSAndroid Build Coastguard Worker         struct InflightBatch {
200*4d7e907cSAndroid Build Coastguard Worker             // Protect access to entire struct. Acquire this lock before read/write any data or
201*4d7e907cSAndroid Build Coastguard Worker             // calling any methods. processCaptureResult and notify will compete for this lock
202*4d7e907cSAndroid Build Coastguard Worker             // HIDL IPCs might be issued while the lock is held
203*4d7e907cSAndroid Build Coastguard Worker             Mutex mLock;
204*4d7e907cSAndroid Build Coastguard Worker 
205*4d7e907cSAndroid Build Coastguard Worker             bool allDelivered() const;
206*4d7e907cSAndroid Build Coastguard Worker 
207*4d7e907cSAndroid Build Coastguard Worker             uint32_t mFirstFrame;
208*4d7e907cSAndroid Build Coastguard Worker             uint32_t mLastFrame;
209*4d7e907cSAndroid Build Coastguard Worker             uint32_t mBatchSize;
210*4d7e907cSAndroid Build Coastguard Worker 
211*4d7e907cSAndroid Build Coastguard Worker             bool mShutterDelivered = false;
212*4d7e907cSAndroid Build Coastguard Worker             std::vector<NotifyMsg> mShutterMsgs;
213*4d7e907cSAndroid Build Coastguard Worker 
214*4d7e907cSAndroid Build Coastguard Worker             struct BufferBatch {
BufferBatchCameraDeviceSession::InflightBatch::BufferBatch215*4d7e907cSAndroid Build Coastguard Worker                 BufferBatch(uint32_t batchSize) {
216*4d7e907cSAndroid Build Coastguard Worker                     mBuffers.reserve(batchSize);
217*4d7e907cSAndroid Build Coastguard Worker                 }
218*4d7e907cSAndroid Build Coastguard Worker                 bool mDelivered = false;
219*4d7e907cSAndroid Build Coastguard Worker                 // This currently assumes every batched request will output to the batched stream
220*4d7e907cSAndroid Build Coastguard Worker                 // and since HAL must always send buffers in order, no frameNumber tracking is
221*4d7e907cSAndroid Build Coastguard Worker                 // needed
222*4d7e907cSAndroid Build Coastguard Worker                 std::vector<StreamBuffer> mBuffers;
223*4d7e907cSAndroid Build Coastguard Worker             };
224*4d7e907cSAndroid Build Coastguard Worker             // Stream ID -> VideoBatch
225*4d7e907cSAndroid Build Coastguard Worker             std::unordered_map<int, BufferBatch> mBatchBufs;
226*4d7e907cSAndroid Build Coastguard Worker 
227*4d7e907cSAndroid Build Coastguard Worker             struct MetadataBatch {
228*4d7e907cSAndroid Build Coastguard Worker                 //                   (frameNumber, metadata)
229*4d7e907cSAndroid Build Coastguard Worker                 std::vector<std::pair<uint32_t, CameraMetadata>> mMds;
230*4d7e907cSAndroid Build Coastguard Worker             };
231*4d7e907cSAndroid Build Coastguard Worker             // Partial result IDs that has been delivered to framework
232*4d7e907cSAndroid Build Coastguard Worker             uint32_t mNumPartialResults;
233*4d7e907cSAndroid Build Coastguard Worker             uint32_t mPartialResultProgress = 0;
234*4d7e907cSAndroid Build Coastguard Worker             // partialResult -> MetadataBatch
235*4d7e907cSAndroid Build Coastguard Worker             std::map<uint32_t, MetadataBatch> mResultMds;
236*4d7e907cSAndroid Build Coastguard Worker 
237*4d7e907cSAndroid Build Coastguard Worker             // Set to true when batch is removed from mInflightBatches
238*4d7e907cSAndroid Build Coastguard Worker             // processCaptureResult and notify must check this flag after acquiring mLock to make
239*4d7e907cSAndroid Build Coastguard Worker             // sure this batch isn't removed while waiting for mLock
240*4d7e907cSAndroid Build Coastguard Worker             bool mRemoved = false;
241*4d7e907cSAndroid Build Coastguard Worker         };
242*4d7e907cSAndroid Build Coastguard Worker 
243*4d7e907cSAndroid Build Coastguard Worker 
244*4d7e907cSAndroid Build Coastguard Worker         // Get the batch index and pointer to InflightBatch (nullptrt if the frame is not batched)
245*4d7e907cSAndroid Build Coastguard Worker         // Caller must acquire the InflightBatch::mLock before accessing the InflightBatch
246*4d7e907cSAndroid Build Coastguard Worker         // It's possible that the InflightBatch is removed from mInflightBatches before the
247*4d7e907cSAndroid Build Coastguard Worker         // InflightBatch::mLock is acquired (most likely caused by an error notification), so
248*4d7e907cSAndroid Build Coastguard Worker         // caller must check InflightBatch::mRemoved flag after the lock is acquried.
249*4d7e907cSAndroid Build Coastguard Worker         // This method will hold ResultBatcher::mLock briefly
250*4d7e907cSAndroid Build Coastguard Worker         std::pair<int, std::shared_ptr<InflightBatch>> getBatch(uint32_t frameNumber);
251*4d7e907cSAndroid Build Coastguard Worker 
252*4d7e907cSAndroid Build Coastguard Worker         static const int NOT_BATCHED = -1;
253*4d7e907cSAndroid Build Coastguard Worker 
254*4d7e907cSAndroid Build Coastguard Worker         // move/push function avoids "hidl_handle& operator=(hidl_handle&)", which clones native
255*4d7e907cSAndroid Build Coastguard Worker         // handle
256*4d7e907cSAndroid Build Coastguard Worker         void moveStreamBuffer(StreamBuffer&& src, StreamBuffer& dst);
257*4d7e907cSAndroid Build Coastguard Worker         void pushStreamBuffer(StreamBuffer&& src, std::vector<StreamBuffer>& dst);
258*4d7e907cSAndroid Build Coastguard Worker 
259*4d7e907cSAndroid Build Coastguard Worker         void sendBatchMetadataLocked(
260*4d7e907cSAndroid Build Coastguard Worker                 std::shared_ptr<InflightBatch> batch, uint32_t lastPartialResultIdx);
261*4d7e907cSAndroid Build Coastguard Worker 
262*4d7e907cSAndroid Build Coastguard Worker         // Check if the first batch in mInflightBatches is ready to be removed, and remove it if so
263*4d7e907cSAndroid Build Coastguard Worker         // This method will hold ResultBatcher::mLock briefly
264*4d7e907cSAndroid Build Coastguard Worker         void checkAndRemoveFirstBatch();
265*4d7e907cSAndroid Build Coastguard Worker 
266*4d7e907cSAndroid Build Coastguard Worker         // The following sendXXXX methods must be called while the InflightBatch::mLock is locked
267*4d7e907cSAndroid Build Coastguard Worker         // HIDL IPC methods will be called during these methods.
268*4d7e907cSAndroid Build Coastguard Worker         void sendBatchShutterCbsLocked(std::shared_ptr<InflightBatch> batch);
269*4d7e907cSAndroid Build Coastguard Worker         // send buffers for all batched streams
270*4d7e907cSAndroid Build Coastguard Worker         void sendBatchBuffersLocked(std::shared_ptr<InflightBatch> batch);
271*4d7e907cSAndroid Build Coastguard Worker         // send buffers for specified streams
272*4d7e907cSAndroid Build Coastguard Worker         void sendBatchBuffersLocked(
273*4d7e907cSAndroid Build Coastguard Worker                 std::shared_ptr<InflightBatch> batch, const std::vector<int>& streams);
274*4d7e907cSAndroid Build Coastguard Worker        // End of sendXXXX methods
275*4d7e907cSAndroid Build Coastguard Worker 
276*4d7e907cSAndroid Build Coastguard Worker         // helper methods
277*4d7e907cSAndroid Build Coastguard Worker         void freeReleaseFences(hidl_vec<CaptureResult>&);
278*4d7e907cSAndroid Build Coastguard Worker         void notifySingleMsg(NotifyMsg& msg);
279*4d7e907cSAndroid Build Coastguard Worker         void processOneCaptureResult(CaptureResult& result);
280*4d7e907cSAndroid Build Coastguard Worker         void invokeProcessCaptureResultCallback(hidl_vec<CaptureResult> &results, bool tryWriteFmq);
281*4d7e907cSAndroid Build Coastguard Worker 
282*4d7e907cSAndroid Build Coastguard Worker         // Protect access to mInflightBatches, mNumPartialResults and mStreamsToBatch
283*4d7e907cSAndroid Build Coastguard Worker         // processCaptureRequest, processCaptureResult, notify will compete for this lock
284*4d7e907cSAndroid Build Coastguard Worker         // Do NOT issue HIDL IPCs while holding this lock (except when HAL reports error)
285*4d7e907cSAndroid Build Coastguard Worker         mutable Mutex mLock;
286*4d7e907cSAndroid Build Coastguard Worker         std::deque<std::shared_ptr<InflightBatch>> mInflightBatches;
287*4d7e907cSAndroid Build Coastguard Worker         uint32_t mNumPartialResults;
288*4d7e907cSAndroid Build Coastguard Worker         std::vector<int> mStreamsToBatch;
289*4d7e907cSAndroid Build Coastguard Worker         const sp<ICameraDeviceCallback> mCallback;
290*4d7e907cSAndroid Build Coastguard Worker         std::shared_ptr<ResultMetadataQueue> mResultMetadataQueue;
291*4d7e907cSAndroid Build Coastguard Worker 
292*4d7e907cSAndroid Build Coastguard Worker         // Protect against invokeProcessCaptureResultCallback()
293*4d7e907cSAndroid Build Coastguard Worker         Mutex mProcessCaptureResultLock;
294*4d7e907cSAndroid Build Coastguard Worker 
295*4d7e907cSAndroid Build Coastguard Worker     } mResultBatcher;
296*4d7e907cSAndroid Build Coastguard Worker 
297*4d7e907cSAndroid Build Coastguard Worker     std::vector<int> mVideoStreamIds;
298*4d7e907cSAndroid Build Coastguard Worker 
299*4d7e907cSAndroid Build Coastguard Worker     bool initialize();
300*4d7e907cSAndroid Build Coastguard Worker 
301*4d7e907cSAndroid Build Coastguard Worker     static bool shouldFreeBufEarly();
302*4d7e907cSAndroid Build Coastguard Worker 
303*4d7e907cSAndroid Build Coastguard Worker     Status initStatus() const;
304*4d7e907cSAndroid Build Coastguard Worker 
305*4d7e907cSAndroid Build Coastguard Worker     // Validate and import request's input buffer and acquire fence
306*4d7e907cSAndroid Build Coastguard Worker     virtual Status importRequest(
307*4d7e907cSAndroid Build Coastguard Worker             const CaptureRequest& request,
308*4d7e907cSAndroid Build Coastguard Worker             hidl_vec<buffer_handle_t*>& allBufPtrs,
309*4d7e907cSAndroid Build Coastguard Worker             hidl_vec<int>& allFences);
310*4d7e907cSAndroid Build Coastguard Worker 
311*4d7e907cSAndroid Build Coastguard Worker     Status importRequestImpl(
312*4d7e907cSAndroid Build Coastguard Worker             const CaptureRequest& request,
313*4d7e907cSAndroid Build Coastguard Worker             hidl_vec<buffer_handle_t*>& allBufPtrs,
314*4d7e907cSAndroid Build Coastguard Worker             hidl_vec<int>& allFences,
315*4d7e907cSAndroid Build Coastguard Worker             // Optional argument for [email protected] impl
316*4d7e907cSAndroid Build Coastguard Worker             bool allowEmptyBuf = false);
317*4d7e907cSAndroid Build Coastguard Worker 
318*4d7e907cSAndroid Build Coastguard Worker     Status importBuffer(int32_t streamId,
319*4d7e907cSAndroid Build Coastguard Worker             uint64_t bufId, buffer_handle_t buf,
320*4d7e907cSAndroid Build Coastguard Worker             /*out*/buffer_handle_t** outBufPtr,
321*4d7e907cSAndroid Build Coastguard Worker             bool allowEmptyBuf);
322*4d7e907cSAndroid Build Coastguard Worker 
323*4d7e907cSAndroid Build Coastguard Worker     static void cleanupInflightFences(
324*4d7e907cSAndroid Build Coastguard Worker             hidl_vec<int>& allFences, size_t numFences);
325*4d7e907cSAndroid Build Coastguard Worker 
326*4d7e907cSAndroid Build Coastguard Worker     void cleanupBuffersLocked(int id);
327*4d7e907cSAndroid Build Coastguard Worker 
328*4d7e907cSAndroid Build Coastguard Worker     void updateBufferCaches(const hidl_vec<BufferCache>& cachesToRemove);
329*4d7e907cSAndroid Build Coastguard Worker 
330*4d7e907cSAndroid Build Coastguard Worker     android_dataspace mapToLegacyDataspace(
331*4d7e907cSAndroid Build Coastguard Worker             android_dataspace dataSpace) const;
332*4d7e907cSAndroid Build Coastguard Worker 
333*4d7e907cSAndroid Build Coastguard Worker     bool handleAePrecaptureCancelRequestLocked(
334*4d7e907cSAndroid Build Coastguard Worker             const camera3_capture_request_t &halRequest,
335*4d7e907cSAndroid Build Coastguard Worker             android::hardware::camera::common::V1_0::helper::CameraMetadata *settings /*out*/,
336*4d7e907cSAndroid Build Coastguard Worker             AETriggerCancelOverride *override /*out*/);
337*4d7e907cSAndroid Build Coastguard Worker 
338*4d7e907cSAndroid Build Coastguard Worker     void overrideResultForPrecaptureCancelLocked(
339*4d7e907cSAndroid Build Coastguard Worker             const AETriggerCancelOverride &aeTriggerCancelOverride,
340*4d7e907cSAndroid Build Coastguard Worker             ::android::hardware::camera::common::V1_0::helper::CameraMetadata *settings /*out*/);
341*4d7e907cSAndroid Build Coastguard Worker 
342*4d7e907cSAndroid Build Coastguard Worker     Status processOneCaptureRequest(const CaptureRequest& request);
343*4d7e907cSAndroid Build Coastguard Worker     /**
344*4d7e907cSAndroid Build Coastguard Worker      * Static callback forwarding methods from HAL to instance
345*4d7e907cSAndroid Build Coastguard Worker      */
346*4d7e907cSAndroid Build Coastguard Worker     static callbacks_process_capture_result_t sProcessCaptureResult;
347*4d7e907cSAndroid Build Coastguard Worker     static callbacks_notify_t sNotify;
348*4d7e907cSAndroid Build Coastguard Worker 
349*4d7e907cSAndroid Build Coastguard Worker     // By default camera service uses frameNumber/streamId pair to retrieve the buffer that
350*4d7e907cSAndroid Build Coastguard Worker     // was sent to HAL. Override this implementation if HAL is using buffers from buffer management
351*4d7e907cSAndroid Build Coastguard Worker     // APIs to send output buffer.
352*4d7e907cSAndroid Build Coastguard Worker     virtual uint64_t getCapResultBufferId(const buffer_handle_t& buf, int streamId);
353*4d7e907cSAndroid Build Coastguard Worker 
354*4d7e907cSAndroid Build Coastguard Worker     status_t constructCaptureResult(CaptureResult& result,
355*4d7e907cSAndroid Build Coastguard Worker                                 const camera3_capture_result *hal_result);
356*4d7e907cSAndroid Build Coastguard Worker 
357*4d7e907cSAndroid Build Coastguard Worker     // Static helper method to copy/shrink capture result metadata sent by HAL
358*4d7e907cSAndroid Build Coastguard Worker     // Temporarily allocated metadata copy will be hold in mds
359*4d7e907cSAndroid Build Coastguard Worker     static void sShrinkCaptureResult(
360*4d7e907cSAndroid Build Coastguard Worker             camera3_capture_result* dst, const camera3_capture_result* src,
361*4d7e907cSAndroid Build Coastguard Worker             std::vector<::android::hardware::camera::common::V1_0::helper::CameraMetadata>* mds,
362*4d7e907cSAndroid Build Coastguard Worker             std::vector<const camera_metadata_t*>* physCamMdArray,
363*4d7e907cSAndroid Build Coastguard Worker             bool handlePhysCam);
364*4d7e907cSAndroid Build Coastguard Worker     static bool sShouldShrink(const camera_metadata_t* md);
365*4d7e907cSAndroid Build Coastguard Worker     static camera_metadata_t* sCreateCompactCopy(const camera_metadata_t* src);
366*4d7e907cSAndroid Build Coastguard Worker 
367*4d7e907cSAndroid Build Coastguard Worker private:
368*4d7e907cSAndroid Build Coastguard Worker 
369*4d7e907cSAndroid Build Coastguard Worker     struct TrampolineSessionInterface_3_2 : public ICameraDeviceSession {
TrampolineSessionInterface_3_2CameraDeviceSession::TrampolineSessionInterface_3_2370*4d7e907cSAndroid Build Coastguard Worker         TrampolineSessionInterface_3_2(sp<CameraDeviceSession> parent) :
371*4d7e907cSAndroid Build Coastguard Worker                 mParent(parent) {}
372*4d7e907cSAndroid Build Coastguard Worker 
constructDefaultRequestSettingsCameraDeviceSession::TrampolineSessionInterface_3_2373*4d7e907cSAndroid Build Coastguard Worker         virtual Return<void> constructDefaultRequestSettings(
374*4d7e907cSAndroid Build Coastguard Worker                 V3_2::RequestTemplate type,
375*4d7e907cSAndroid Build Coastguard Worker                 V3_2::ICameraDeviceSession::constructDefaultRequestSettings_cb _hidl_cb) override {
376*4d7e907cSAndroid Build Coastguard Worker             return mParent->constructDefaultRequestSettings(type, _hidl_cb);
377*4d7e907cSAndroid Build Coastguard Worker         }
378*4d7e907cSAndroid Build Coastguard Worker 
configureStreamsCameraDeviceSession::TrampolineSessionInterface_3_2379*4d7e907cSAndroid Build Coastguard Worker         virtual Return<void> configureStreams(
380*4d7e907cSAndroid Build Coastguard Worker                 const V3_2::StreamConfiguration& requestedConfiguration,
381*4d7e907cSAndroid Build Coastguard Worker                 V3_2::ICameraDeviceSession::configureStreams_cb _hidl_cb) override {
382*4d7e907cSAndroid Build Coastguard Worker             return mParent->configureStreams(requestedConfiguration, _hidl_cb);
383*4d7e907cSAndroid Build Coastguard Worker         }
384*4d7e907cSAndroid Build Coastguard Worker 
processCaptureRequestCameraDeviceSession::TrampolineSessionInterface_3_2385*4d7e907cSAndroid Build Coastguard Worker         virtual Return<void> processCaptureRequest(const hidl_vec<V3_2::CaptureRequest>& requests,
386*4d7e907cSAndroid Build Coastguard Worker                 const hidl_vec<V3_2::BufferCache>& cachesToRemove,
387*4d7e907cSAndroid Build Coastguard Worker                 V3_2::ICameraDeviceSession::processCaptureRequest_cb _hidl_cb) override {
388*4d7e907cSAndroid Build Coastguard Worker             return mParent->processCaptureRequest(requests, cachesToRemove, _hidl_cb);
389*4d7e907cSAndroid Build Coastguard Worker         }
390*4d7e907cSAndroid Build Coastguard Worker 
getCaptureRequestMetadataQueueCameraDeviceSession::TrampolineSessionInterface_3_2391*4d7e907cSAndroid Build Coastguard Worker         virtual Return<void> getCaptureRequestMetadataQueue(
392*4d7e907cSAndroid Build Coastguard Worker                 V3_2::ICameraDeviceSession::getCaptureRequestMetadataQueue_cb _hidl_cb) override  {
393*4d7e907cSAndroid Build Coastguard Worker             return mParent->getCaptureRequestMetadataQueue(_hidl_cb);
394*4d7e907cSAndroid Build Coastguard Worker         }
395*4d7e907cSAndroid Build Coastguard Worker 
getCaptureResultMetadataQueueCameraDeviceSession::TrampolineSessionInterface_3_2396*4d7e907cSAndroid Build Coastguard Worker         virtual Return<void> getCaptureResultMetadataQueue(
397*4d7e907cSAndroid Build Coastguard Worker                 V3_2::ICameraDeviceSession::getCaptureResultMetadataQueue_cb _hidl_cb) override  {
398*4d7e907cSAndroid Build Coastguard Worker             return mParent->getCaptureResultMetadataQueue(_hidl_cb);
399*4d7e907cSAndroid Build Coastguard Worker         }
400*4d7e907cSAndroid Build Coastguard Worker 
flushCameraDeviceSession::TrampolineSessionInterface_3_2401*4d7e907cSAndroid Build Coastguard Worker         virtual Return<Status> flush() override {
402*4d7e907cSAndroid Build Coastguard Worker             return mParent->flush();
403*4d7e907cSAndroid Build Coastguard Worker         }
404*4d7e907cSAndroid Build Coastguard Worker 
closeCameraDeviceSession::TrampolineSessionInterface_3_2405*4d7e907cSAndroid Build Coastguard Worker         virtual Return<void> close() override {
406*4d7e907cSAndroid Build Coastguard Worker             return mParent->close();
407*4d7e907cSAndroid Build Coastguard Worker         }
408*4d7e907cSAndroid Build Coastguard Worker 
409*4d7e907cSAndroid Build Coastguard Worker     private:
410*4d7e907cSAndroid Build Coastguard Worker         sp<CameraDeviceSession> mParent;
411*4d7e907cSAndroid Build Coastguard Worker     };
412*4d7e907cSAndroid Build Coastguard Worker };
413*4d7e907cSAndroid Build Coastguard Worker 
414*4d7e907cSAndroid Build Coastguard Worker }  // namespace implementation
415*4d7e907cSAndroid Build Coastguard Worker }  // namespace V3_2
416*4d7e907cSAndroid Build Coastguard Worker }  // namespace device
417*4d7e907cSAndroid Build Coastguard Worker }  // namespace camera
418*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
419*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
420*4d7e907cSAndroid Build Coastguard Worker 
421*4d7e907cSAndroid Build Coastguard Worker #endif  // ANDROID_HARDWARE_CAMERA_DEVICE_V3_2_CAMERADEVICE3SESSION_H
422