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