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_INFLIGHT_REQUEST_H 18 #define ANDROID_SERVERS_CAMERA3_INFLIGHT_REQUEST_H 19 20 #include <set> 21 22 #include <camera/CaptureResult.h> 23 #include <camera/CameraMetadata.h> 24 #include <utils/String8.h> 25 #include <utils/Timers.h> 26 27 #include "common/CameraDeviceBase.h" 28 29 namespace android { 30 31 namespace camera3 { 32 33 typedef struct camera_stream_configuration { 34 uint32_t num_streams; 35 camera_stream_t **streams; 36 uint32_t operation_mode; 37 bool input_is_multi_resolution; 38 } camera_stream_configuration_t; 39 40 typedef struct camera_capture_request { 41 uint32_t frame_number; 42 const camera_metadata_t *settings; 43 camera_stream_buffer_t *input_buffer; 44 uint32_t num_output_buffers; 45 const camera_stream_buffer_t *output_buffers; 46 uint32_t num_physcam_settings; 47 const char **physcam_id; 48 const camera_metadata_t **physcam_settings; 49 int32_t input_width; 50 int32_t input_height; 51 } camera_capture_request_t; 52 53 typedef struct camera_capture_result { 54 uint32_t frame_number; 55 const camera_metadata_t *result; 56 uint32_t num_output_buffers; 57 const camera_stream_buffer_t *output_buffers; 58 const camera_stream_buffer_t *input_buffer; 59 uint32_t partial_result; 60 uint32_t num_physcam_metadata; 61 const char **physcam_ids; 62 const camera_metadata_t **physcam_metadata; 63 } camera_capture_result_t; 64 65 typedef struct camera_shutter_msg { 66 uint32_t frame_number; 67 uint64_t timestamp; 68 bool readout_timestamp_valid; 69 uint64_t readout_timestamp; 70 } camera_shutter_msg_t; 71 72 typedef struct camera_error_msg { 73 uint32_t frame_number; 74 camera_stream_t *error_stream; 75 int error_code; 76 } camera_error_msg_t; 77 78 typedef enum camera_error_msg_code { 79 CAMERA_MSG_ERROR_DEVICE = 1, 80 CAMERA_MSG_ERROR_REQUEST = 2, 81 CAMERA_MSG_ERROR_RESULT = 3, 82 CAMERA_MSG_ERROR_BUFFER = 4, 83 CAMERA_MSG_NUM_ERRORS 84 } camera_error_msg_code_t; 85 86 typedef struct camera_notify_msg { 87 int type; 88 89 union { 90 camera_error_msg_t error; 91 camera_shutter_msg_t shutter; 92 } message; 93 } camera_notify_msg_t; 94 95 typedef enum { 96 // Cache the buffers with STATUS_ERROR within InFlightRequest 97 ERROR_BUF_CACHE, 98 // Return the buffers with STATUS_ERROR to the buffer queue 99 ERROR_BUF_RETURN, 100 // Return the buffers with STATUS_ERROR to the buffer queue, and call 101 // notify(ERROR_BUFFER) as well 102 ERROR_BUF_RETURN_NOTIFY 103 } ERROR_BUF_STRATEGY; 104 105 struct InFlightRequest { 106 // Set by notify() SHUTTER call. 107 nsecs_t shutterTimestamp; 108 // Set by process_capture_result(). 109 nsecs_t sensorTimestamp; 110 int requestStatus; 111 // Set by process_capture_result call with valid metadata 112 bool haveResultMetadata; 113 // Decremented by calls to process_capture_result with valid output 114 // and input buffers 115 int numBuffersLeft; 116 117 // The inflight request is considered complete if all buffers are returned 118 119 CaptureResultExtras resultExtras; 120 // If this request has any input buffer 121 bool hasInputBuffer; 122 123 // The last metadata that framework receives from HAL and 124 // not yet send out because the shutter event hasn't arrived. 125 // It's added by process_capture_result and sent when framework 126 // receives the shutter event. 127 CameraMetadata pendingMetadata; 128 129 // The metadata of the partial results that framework receives from HAL so far 130 // and has sent out. 131 CameraMetadata collectedPartialResult; 132 133 // Buffers are added by process_capture_result when output buffers 134 // return from HAL but framework has not yet received the shutter 135 // event. They will be returned to the streams when framework receives 136 // the shutter event. 137 Vector<camera_stream_buffer_t> pendingOutputBuffers; 138 139 // Whether this inflight request's shutter and result callback are to be 140 // called. The policy is that if the request is the last one in the constrained 141 // high speed recording request list, this flag will be true. If the request list 142 // is not for constrained high speed recording, this flag will also be true. 143 bool hasCallback; 144 145 // Minimum expected frame duration for this request 146 // For manual captures, equal to the max of requested exposure time and frame duration 147 // For auto-exposure modes, equal to 1/(higher end of target FPS range) 148 nsecs_t minExpectedDuration; 149 150 // Maximum expected frame duration for this request. 151 // For manual captures, equal to the max of requested exposure time and frame duration 152 // For auto-exposure modes, equal to 1/(lower end of target FPS range) 153 nsecs_t maxExpectedDuration; 154 155 // Whether the FPS range is fixed, aka, minFps == maxFps 156 bool isFixedFps; 157 158 // Whether the result metadata for this request is to be skipped. The 159 // result metadata should be skipped in the case of 160 // REQUEST/RESULT error. 161 bool skipResultMetadata; 162 163 // Whether the buffers with STATUS_ERROR should be cached as pending buffers, 164 // returned to the buffer queue, or returned to the buffer queue and notify with ERROR_BUFFER. 165 ERROR_BUF_STRATEGY errorBufStrategy; 166 167 // The physical camera ids being requested. 168 // For request on a physical camera stream, the inside set contains one Id 169 // For request on a stream group containing physical camera streams, the 170 // inside set contains all stream Ids in the group. 171 std::set<std::set<String8>> physicalCameraIds; 172 173 // Map of physicalCameraId <-> Metadata 174 std::vector<PhysicalCaptureResultInfo> physicalMetadatas; 175 176 // Indicates a still capture request. 177 bool stillCapture; 178 179 // Indicates a ZSL capture request 180 bool zslCapture; 181 182 // Indicates that ROTATE_AND_CROP was set to AUTO 183 bool rotateAndCropAuto; 184 185 // Indicates that AUTOFRAMING was set to AUTO 186 bool autoframingAuto; 187 188 // Requested camera ids (both logical and physical) with zoomRatio != 1.0f 189 std::set<std::string> cameraIdsWithZoom; 190 191 // Time of capture request (from systemTime) in Ns 192 nsecs_t requestTimeNs; 193 194 // What shared surfaces an output should go to 195 SurfaceMap outputSurfaces; 196 197 // Current output transformation 198 int32_t transform; 199 200 static const nsecs_t kDefaultMinExpectedDuration = 33333333; // 33 ms 201 static const nsecs_t kDefaultMaxExpectedDuration = 100000000; // 100 ms 202 203 // Default constructor needed by KeyedVector InFlightRequestInFlightRequest204 InFlightRequest() : 205 shutterTimestamp(0), 206 sensorTimestamp(0), 207 requestStatus(OK), 208 haveResultMetadata(false), 209 numBuffersLeft(0), 210 hasInputBuffer(false), 211 hasCallback(true), 212 minExpectedDuration(kDefaultMinExpectedDuration), 213 maxExpectedDuration(kDefaultMaxExpectedDuration), 214 isFixedFps(false), 215 skipResultMetadata(false), 216 errorBufStrategy(ERROR_BUF_CACHE), 217 stillCapture(false), 218 zslCapture(false), 219 rotateAndCropAuto(false), 220 autoframingAuto(false), 221 requestTimeNs(0), 222 transform(-1) { 223 } 224 225 InFlightRequest(int numBuffers, CaptureResultExtras extras, bool hasInput, 226 bool hasAppCallback, nsecs_t minDuration, nsecs_t maxDuration, bool fixedFps, 227 const std::set<std::set<String8>>& physicalCameraIdSet, bool isStillCapture, 228 bool isZslCapture, bool rotateAndCropAuto, bool autoframingAuto, 229 const std::set<std::string>& idsWithZoom, nsecs_t requestNs, 230 const SurfaceMap& outSurfaces = SurfaceMap{}) : 231 shutterTimestamp(0), 232 sensorTimestamp(0), 233 requestStatus(OK), 234 haveResultMetadata(false), 235 numBuffersLeft(numBuffers), 236 resultExtras(extras), 237 hasInputBuffer(hasInput), 238 hasCallback(hasAppCallback), 239 minExpectedDuration(minDuration), 240 maxExpectedDuration(maxDuration), 241 isFixedFps(fixedFps), 242 skipResultMetadata(false), 243 errorBufStrategy(ERROR_BUF_CACHE), 244 physicalCameraIds(physicalCameraIdSet), 245 stillCapture(isStillCapture), 246 zslCapture(isZslCapture), 247 rotateAndCropAuto(rotateAndCropAuto), 248 autoframingAuto(autoframingAuto), 249 cameraIdsWithZoom(idsWithZoom), 250 requestTimeNs(requestNs), 251 outputSurfaces(outSurfaces), 252 transform(-1) { 253 } 254 }; 255 256 // Map from frame number to the in-flight request state 257 typedef KeyedVector<uint32_t, InFlightRequest> InFlightRequestMap; 258 259 } // namespace camera3 260 261 } // namespace android 262 263 #endif 264