1 /*
2  * Copyright (C) 2019 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 
17 #ifndef ANDROID_SERVERS_CAMERA3_OUTPUT_UTILS_H
18 #define ANDROID_SERVERS_CAMERA3_OUTPUT_UTILS_H
19 
20 #include <memory>
21 #include <mutex>
22 
23 #include <cutils/native_handle.h>
24 
25 #include <fmq/MessageQueue.h>
26 
27 #include <common/CameraDeviceBase.h>
28 
29 #include "device3/BufferUtils.h"
30 #include "device3/DistortionMapper.h"
31 #include "device3/ZoomRatioMapper.h"
32 #include "device3/RotateAndCropMapper.h"
33 #include "device3/InFlightRequest.h"
34 #include "device3/Camera3Stream.h"
35 #include "device3/Camera3OutputStreamInterface.h"
36 #include "utils/SessionStatsBuilder.h"
37 #include "utils/TagMonitor.h"
38 
39 namespace android {
40 
41 using ResultMetadataQueue = hardware::MessageQueue<uint8_t, hardware::kSynchronizedReadWrite>;
42 
43 namespace camera3 {
44 
45     typedef struct camera_stream_configuration {
46         uint32_t num_streams;
47         camera_stream_t **streams;
48         uint32_t operation_mode;
49         bool input_is_multi_resolution;
50     } camera_stream_configuration_t;
51 
52     typedef struct camera_capture_request {
53         uint32_t frame_number;
54         const camera_metadata_t *settings;
55         camera_stream_buffer_t *input_buffer;
56         uint32_t num_output_buffers;
57         const camera_stream_buffer_t *output_buffers;
58         uint32_t num_physcam_settings;
59         const char **physcam_id;
60         const camera_metadata_t **physcam_settings;
61         int32_t input_width;
62         int32_t input_height;
63     } camera_capture_request_t;
64 
65     typedef struct camera_capture_result {
66         uint32_t frame_number;
67         const camera_metadata_t *result;
68         uint32_t num_output_buffers;
69         const camera_stream_buffer_t *output_buffers;
70         const camera_stream_buffer_t *input_buffer;
71         uint32_t partial_result;
72         uint32_t num_physcam_metadata;
73         const char **physcam_ids;
74         const camera_metadata_t **physcam_metadata;
75     } camera_capture_result_t;
76 
77     typedef struct camera_shutter_msg {
78         uint32_t frame_number;
79         uint64_t timestamp;
80     } camera_shutter_msg_t;
81 
82     typedef struct camera_error_msg {
83         uint32_t frame_number;
84         camera_stream_t *error_stream;
85         int error_code;
86     } camera_error_msg_t;
87 
88     typedef enum camera_error_msg_code {
89         CAMERA_MSG_ERROR_DEVICE = 1,
90         CAMERA_MSG_ERROR_REQUEST = 2,
91         CAMERA_MSG_ERROR_RESULT = 3,
92         CAMERA_MSG_ERROR_BUFFER = 4,
93         CAMERA_MSG_NUM_ERRORS
94     } camera_error_msg_code_t;
95 
96     typedef struct camera_notify_msg {
97         int type;
98 
99         union {
100             camera_error_msg_t error;
101             camera_shutter_msg_t shutter;
102         } message;
103     } camera_notify_msg_t;
104 
105     /**
106      * Helper methods shared between Camera3Device/Camera3OfflineSession for HAL callbacks
107      */
108 
109     // helper function to return the output buffers to output streams. The
110     // function also optionally calls notify(ERROR_BUFFER).
111     void returnOutputBuffers(
112             bool useHalBufManager,
113             sp<NotificationListener> listener, // Only needed when outputSurfaces is not empty
114             const camera_stream_buffer_t *outputBuffers,
115             size_t numBuffers, nsecs_t timestamp, bool requested, nsecs_t requestTimeNs,
116             SessionStatsBuilder& sessionStatsBuilder, bool timestampIncreasing = true,
117             // The following arguments are only meant for surface sharing use case
118             const SurfaceMap& outputSurfaces = SurfaceMap{},
119             // Used to send buffer error callback when failing to return buffer
120             const CaptureResultExtras &resultExtras = CaptureResultExtras{},
121             ERROR_BUF_STRATEGY errorBufStrategy = ERROR_BUF_RETURN,
122             int32_t transform = -1);
123 
124     // helper function to return the output buffers to output streams, and
125     // remove the returned buffers from the inflight request's pending buffers
126     // vector.
127     void returnAndRemovePendingOutputBuffers(
128             bool useHalBufManager,
129             sp<NotificationListener> listener, // Only needed when outputSurfaces is not empty
130             InFlightRequest& request, SessionStatsBuilder& sessionStatsBuilder);
131 
132     // Camera3Device/Camera3OfflineSession internal states used in notify/processCaptureResult
133     // callbacks
134     struct CaptureOutputStates {
135         const String8& cameraId;
136         std::mutex& inflightLock;
137         int64_t& lastCompletedRegularFrameNumber;
138         int64_t& lastCompletedReprocessFrameNumber;
139         int64_t& lastCompletedZslFrameNumber;
140         InFlightRequestMap& inflightMap; // end of inflightLock scope
141         std::mutex& outputLock;
142         std::list<CaptureResult>& resultQueue;
143         std::condition_variable& resultSignal;
144         uint32_t& nextShutterFrameNum;
145         uint32_t& nextReprocShutterFrameNum;
146         uint32_t& nextZslShutterFrameNum;
147         uint32_t& nextResultFrameNum;
148         uint32_t& nextReprocResultFrameNum;
149         uint32_t& nextZslResultFrameNum; // end of outputLock scope
150         const bool useHalBufManager;
151         const bool usePartialResult;
152         const bool needFixupMonoChrome;
153         const uint32_t numPartialResults;
154         const metadata_vendor_id_t vendorTagId;
155         const CameraMetadata& deviceInfo;
156         const std::unordered_map<std::string, CameraMetadata>& physicalDeviceInfoMap;
157         std::unique_ptr<ResultMetadataQueue>& fmq;
158         std::unordered_map<std::string, camera3::DistortionMapper>& distortionMappers;
159         std::unordered_map<std::string, camera3::ZoomRatioMapper>& zoomRatioMappers;
160         std::unordered_map<std::string, camera3::RotateAndCropMapper>& rotateAndCropMappers;
161         TagMonitor& tagMonitor;
162         sp<Camera3Stream> inputStream;
163         StreamSet& outputStreams;
164         SessionStatsBuilder& sessionStatsBuilder;
165         sp<NotificationListener> listener;
166         SetErrorInterface& setErrIntf;
167         InflightRequestUpdateInterface& inflightIntf;
168         BufferRecordsInterface& bufferRecordsIntf;
169         bool legacyClient;
170     };
171 
172     // Handle one capture result. Assume callers hold the lock to serialize all
173     // processCaptureResult calls
174     void processOneCaptureResultLocked(
175             CaptureOutputStates& states,
176             const hardware::camera::device::V3_2::CaptureResult& result,
177             const hardware::hidl_vec<
178                     hardware::camera::device::V3_4::PhysicalCameraMetadata> physicalCameraMetadata);
179 
180     // Handle one notify message
181     void notify(CaptureOutputStates& states,
182             const hardware::camera::device::V3_2::NotifyMsg& msg);
183 
184     struct RequestBufferStates {
185         const String8& cameraId;
186         std::mutex& reqBufferLock; // lock to serialize request buffer calls
187         const bool useHalBufManager;
188         StreamSet& outputStreams;
189         SessionStatsBuilder& sessionStatsBuilder;
190         SetErrorInterface& setErrIntf;
191         BufferRecordsInterface& bufferRecordsIntf;
192         RequestBufferInterface& reqBufferIntf;
193     };
194 
195     void requestStreamBuffers(RequestBufferStates& states,
196             const hardware::hidl_vec<hardware::camera::device::V3_5::BufferRequest>& bufReqs,
197             hardware::camera::device::V3_5::ICameraDeviceCallback::requestStreamBuffers_cb _hidl_cb);
198 
199     struct ReturnBufferStates {
200         const String8& cameraId;
201         const bool useHalBufManager;
202         StreamSet& outputStreams;
203         SessionStatsBuilder& sessionStatsBuilder;
204         BufferRecordsInterface& bufferRecordsIntf;
205     };
206 
207     void returnStreamBuffers(ReturnBufferStates& states,
208             const hardware::hidl_vec<hardware::camera::device::V3_2::StreamBuffer>& buffers);
209 
210     struct FlushInflightReqStates {
211         const String8& cameraId;
212         std::mutex& inflightLock;
213         InFlightRequestMap& inflightMap; // end of inflightLock scope
214         const bool useHalBufManager;
215         sp<NotificationListener> listener;
216         InflightRequestUpdateInterface& inflightIntf;
217         BufferRecordsInterface& bufferRecordsIntf;
218         FlushBufferInterface& flushBufferIntf;
219         SessionStatsBuilder& sessionStatsBuilder;
220     };
221 
222     void flushInflightRequests(FlushInflightReqStates& states);
223 } // namespace camera3
224 
225 } // namespace android
226 
227 #endif
228