| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 1 | /* | 
| Shuzhen Wang | c28189a | 2017-11-27 23:05:10 -0800 | [diff] [blame] | 2 | * Copyright (C) 2013-2018 The Android Open Source Project | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 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_CAMERA_CAMERADEVICEBASE_H | 
|  | 18 | #define ANDROID_SERVERS_CAMERA_CAMERADEVICEBASE_H | 
|  | 19 |  | 
| Shuzhen Wang | 0129d52 | 2016-10-30 22:43:41 -0700 | [diff] [blame] | 20 | #include <list> | 
|  | 21 |  | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 22 | #include <utils/RefBase.h> | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 23 | #include <utils/String16.h> | 
|  | 24 | #include <utils/Vector.h> | 
| Emilian Peev | 40ead60 | 2017-09-26 15:46:36 +0100 | [diff] [blame] | 25 | #include <utils/KeyedVector.h> | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 26 | #include <utils/Timers.h> | 
| Jianing Wei | 90e59c9 | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 27 | #include <utils/List.h> | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 28 |  | 
|  | 29 | #include "hardware/camera2.h" | 
|  | 30 | #include "camera/CameraMetadata.h" | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 31 | #include "camera/CaptureResult.h" | 
| Chien-Yu Chen | 618ff8a | 2015-03-13 11:27:17 -0700 | [diff] [blame] | 32 | #include "gui/IGraphicBufferProducer.h" | 
| Zhijun He | 125684a | 2015-12-26 15:07:30 -0800 | [diff] [blame] | 33 | #include "device3/Camera3StreamInterface.h" | 
| Shuzhen Wang | e867578 | 2019-12-05 09:12:14 -0800 | [diff] [blame] | 34 | #include "device3/StatusTracker.h" | 
| Eino-Ville Talvala | d56db1d | 2015-12-17 16:50:35 -0800 | [diff] [blame] | 35 | #include "binder/Status.h" | 
| Emilian Peev | faa4bde | 2020-01-23 12:19:37 -0800 | [diff] [blame] | 36 | #include "FrameProducer.h" | 
| Jayant Chowdhary | c67af1b | 2022-04-07 18:05:04 +0000 | [diff] [blame] | 37 | #include "utils/IPCTransport.h" | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 38 |  | 
| Yin-Chia Yeh | b978c38 | 2019-10-30 00:22:37 -0700 | [diff] [blame] | 39 | #include "CameraOfflineSessionBase.h" | 
|  | 40 |  | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 41 | namespace android { | 
|  | 42 |  | 
| Emilian Peev | f481670 | 2020-04-03 15:44:51 -0700 | [diff] [blame] | 43 | namespace camera3 { | 
|  | 44 |  | 
|  | 45 | typedef enum camera_request_template { | 
|  | 46 | CAMERA_TEMPLATE_PREVIEW = 1, | 
|  | 47 | CAMERA_TEMPLATE_STILL_CAPTURE = 2, | 
|  | 48 | CAMERA_TEMPLATE_VIDEO_RECORD = 3, | 
|  | 49 | CAMERA_TEMPLATE_VIDEO_SNAPSHOT = 4, | 
|  | 50 | CAMERA_TEMPLATE_ZERO_SHUTTER_LAG = 5, | 
|  | 51 | CAMERA_TEMPLATE_MANUAL = 6, | 
|  | 52 | CAMERA_TEMPLATE_COUNT, | 
|  | 53 | CAMERA_VENDOR_TEMPLATE_START = 0x40000000 | 
|  | 54 | } camera_request_template_t; | 
|  | 55 |  | 
|  | 56 | typedef enum camera_stream_configuration_mode { | 
|  | 57 | CAMERA_STREAM_CONFIGURATION_NORMAL_MODE = 0, | 
|  | 58 | CAMERA_STREAM_CONFIGURATION_CONSTRAINED_HIGH_SPEED_MODE = 1, | 
|  | 59 | CAMERA_VENDOR_STREAM_CONFIGURATION_MODE_START = 0x8000 | 
|  | 60 | } camera_stream_configuration_mode_t; | 
|  | 61 |  | 
| Jayant Chowdhary | c67af1b | 2022-04-07 18:05:04 +0000 | [diff] [blame] | 62 | // Matches definition of camera3_jpeg_blob in camera3.h and HIDL definition | 
|  | 63 | // device@3.2:types.hal, needs to stay around till HIDL support is removed (for | 
|  | 64 | // HIDL -> AIDL cameraBlob translation) | 
| Emilian Peev | f481670 | 2020-04-03 15:44:51 -0700 | [diff] [blame] | 65 | typedef struct camera_jpeg_blob { | 
|  | 66 | uint16_t jpeg_blob_id; | 
|  | 67 | uint32_t jpeg_size; | 
|  | 68 | } camera_jpeg_blob_t; | 
|  | 69 |  | 
|  | 70 | enum { | 
|  | 71 | CAMERA_JPEG_BLOB_ID = 0x00FF, | 
|  | 72 | CAMERA_JPEG_APP_SEGMENTS_BLOB_ID = 0x0100, | 
|  | 73 | }; | 
|  | 74 |  | 
|  | 75 | } // namespace camera3 | 
|  | 76 |  | 
|  | 77 | using camera3::camera_request_template_t;; | 
|  | 78 | using camera3::camera_stream_configuration_mode_t; | 
|  | 79 | using camera3::camera_stream_rotation_t; | 
|  | 80 |  | 
| Eino-Ville Talvala | 2f09bac | 2016-12-13 11:29:54 -0800 | [diff] [blame] | 81 | class CameraProviderManager; | 
|  | 82 |  | 
| Shuzhen Wang | 0129d52 | 2016-10-30 22:43:41 -0700 | [diff] [blame] | 83 | // Mapping of output stream index to surface ids | 
|  | 84 | typedef std::unordered_map<int, std::vector<size_t> > SurfaceMap; | 
|  | 85 |  | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 86 | /** | 
|  | 87 | * Base interface for version >= 2 camera device classes, which interface to | 
|  | 88 | * camera HAL device versions >= 2. | 
|  | 89 | */ | 
| Emilian Peev | faa4bde | 2020-01-23 12:19:37 -0800 | [diff] [blame] | 90 | class CameraDeviceBase : public virtual FrameProducer { | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 91 | public: | 
|  | 92 | virtual ~CameraDeviceBase(); | 
|  | 93 |  | 
| Jayant Chowdhary | c67af1b | 2022-04-07 18:05:04 +0000 | [diff] [blame] | 94 | virtual IPCTransport getTransportType() const = 0; | 
|  | 95 |  | 
| Igor Murashkin | 7138105 | 2013-03-04 14:53:08 -0800 | [diff] [blame] | 96 | /** | 
| Emilian Peev | 00420d2 | 2018-02-05 21:33:13 +0000 | [diff] [blame] | 97 | * The device vendor tag ID | 
|  | 98 | */ | 
|  | 99 | virtual metadata_vendor_id_t getVendorTagId() const = 0; | 
|  | 100 |  | 
| Austin Borger | 0fb3ad9 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 101 | virtual status_t initialize(sp<CameraProviderManager> manager, | 
|  | 102 | const std::string& monitorTags) = 0; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 103 | virtual status_t disconnect() = 0; | 
|  | 104 |  | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 105 | virtual status_t dump(int fd, const Vector<String16> &args) = 0; | 
| Austin Borger | 0fb3ad9 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 106 | virtual status_t startWatchingTags(const std::string &tags) = 0; | 
| Avichal Rakesh | 7e53cad | 2021-10-05 13:46:30 -0700 | [diff] [blame] | 107 | virtual status_t stopWatchingTags() = 0; | 
|  | 108 | virtual status_t dumpWatchedEventsToVector(std::vector<std::string> &out) = 0; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 109 |  | 
|  | 110 | /** | 
| Jayant Chowdhary | 6a6d3a8 | 2021-11-17 16:54:34 -0800 | [diff] [blame] | 111 | * The physical camera device's static characteristics metadata buffer, or | 
|  | 112 | * the logical camera's static characteristics if physical id is empty. | 
| Shuzhen Wang | 2e7f58f | 2018-07-11 14:00:29 -0700 | [diff] [blame] | 113 | */ | 
| Austin Borger | 0fb3ad9 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 114 | virtual const CameraMetadata& infoPhysical(const std::string& physicalId) const = 0; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 115 |  | 
| Emilian Peev | aebbe41 | 2018-01-15 13:53:24 +0000 | [diff] [blame] | 116 | struct PhysicalCameraSettings { | 
|  | 117 | std::string cameraId; | 
|  | 118 | CameraMetadata metadata; | 
| Shuzhen Wang | 911c6a3 | 2021-10-27 13:36:03 -0700 | [diff] [blame] | 119 |  | 
|  | 120 | // Whether the physical camera supports testPatternMode/testPatternData | 
|  | 121 | bool mHasTestPatternModeTag = true; | 
|  | 122 | bool mHasTestPatternDataTag = true; | 
|  | 123 |  | 
|  | 124 | // Original value of TEST_PATTERN_MODE and DATA so that they can be | 
|  | 125 | // restored when sensor muting is turned off | 
|  | 126 | int32_t mOriginalTestPatternMode = 0; | 
|  | 127 | int32_t mOriginalTestPatternData[4] = {}; | 
|  | 128 |  | 
| Emilian Peev | aebbe41 | 2018-01-15 13:53:24 +0000 | [diff] [blame] | 129 | }; | 
|  | 130 | typedef List<PhysicalCameraSettings> PhysicalCameraSettingsList; | 
|  | 131 |  | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 132 | /** | 
|  | 133 | * Submit request for capture. The CameraDevice takes ownership of the | 
|  | 134 | * passed-in buffer. | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 135 | * Output lastFrameNumber is the expected frame number of this request. | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 136 | */ | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 137 | virtual status_t capture(CameraMetadata &request, int64_t *lastFrameNumber = NULL) = 0; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 138 |  | 
|  | 139 | /** | 
| Jianing Wei | 90e59c9 | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 140 | * Submit a list of requests. | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 141 | * Output lastFrameNumber is the expected last frame number of the list of requests. | 
| Jianing Wei | 90e59c9 | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 142 | */ | 
| Emilian Peev | aebbe41 | 2018-01-15 13:53:24 +0000 | [diff] [blame] | 143 | virtual status_t captureList(const List<const PhysicalCameraSettingsList> &requests, | 
| Shuzhen Wang | 0129d52 | 2016-10-30 22:43:41 -0700 | [diff] [blame] | 144 | const std::list<const SurfaceMap> &surfaceMaps, | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 145 | int64_t *lastFrameNumber = NULL) = 0; | 
| Jianing Wei | 90e59c9 | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 146 |  | 
|  | 147 | /** | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 148 | * Submit request for streaming. The CameraDevice makes a copy of the | 
|  | 149 | * passed-in buffer and the caller retains ownership. | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 150 | * Output lastFrameNumber is the last frame number of the previous streaming request. | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 151 | */ | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 152 | virtual status_t setStreamingRequest(const CameraMetadata &request, | 
|  | 153 | int64_t *lastFrameNumber = NULL) = 0; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 154 |  | 
|  | 155 | /** | 
| Jianing Wei | 90e59c9 | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 156 | * Submit a list of requests for streaming. | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 157 | * Output lastFrameNumber is the last frame number of the previous streaming request. | 
| Jianing Wei | 90e59c9 | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 158 | */ | 
| Emilian Peev | aebbe41 | 2018-01-15 13:53:24 +0000 | [diff] [blame] | 159 | virtual status_t setStreamingRequestList(const List<const PhysicalCameraSettingsList> &requests, | 
| Shuzhen Wang | 0129d52 | 2016-10-30 22:43:41 -0700 | [diff] [blame] | 160 | const std::list<const SurfaceMap> &surfaceMaps, | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 161 | int64_t *lastFrameNumber = NULL) = 0; | 
| Jianing Wei | 90e59c9 | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 162 |  | 
|  | 163 | /** | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 164 | * Clear the streaming request slot. | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 165 | * Output lastFrameNumber is the last frame number of the previous streaming request. | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 166 | */ | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 167 | virtual status_t clearStreamingRequest(int64_t *lastFrameNumber = NULL) = 0; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 168 |  | 
|  | 169 | /** | 
|  | 170 | * Wait until a request with the given ID has been dequeued by the | 
|  | 171 | * HAL. Returns TIMED_OUT if the timeout duration is reached. Returns | 
|  | 172 | * immediately if the latest request received by the HAL has this id. | 
|  | 173 | */ | 
|  | 174 | virtual status_t waitUntilRequestReceived(int32_t requestId, | 
|  | 175 | nsecs_t timeout) = 0; | 
|  | 176 |  | 
|  | 177 | /** | 
| Yin-Chia Yeh | b97babb | 2015-03-12 13:42:44 -0700 | [diff] [blame] | 178 | * Create an output stream of the requested size, format, rotation and dataspace | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 179 | * | 
| Eino-Ville Talvala | 3d82c0d | 2015-02-23 15:19:19 -0800 | [diff] [blame] | 180 | * For HAL_PIXEL_FORMAT_BLOB formats, the width and height should be the | 
|  | 181 | * logical dimensions of the buffer, not the number of bytes. | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 182 | */ | 
| Eino-Ville Talvala | 727d172 | 2015-06-09 13:44:19 -0700 | [diff] [blame] | 183 | virtual status_t createStream(sp<Surface> consumer, | 
| Eino-Ville Talvala | 3d82c0d | 2015-02-23 15:19:19 -0800 | [diff] [blame] | 184 | uint32_t width, uint32_t height, int format, | 
| Emilian Peev | f481670 | 2020-04-03 15:44:51 -0700 | [diff] [blame] | 185 | android_dataspace dataSpace, camera_stream_rotation_t rotation, int *id, | 
| Austin Borger | 0fb3ad9 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 186 | const std::string& physicalCameraId, | 
| Jayant Chowdhary | 13f9b2f | 2020-12-02 22:46:15 -0800 | [diff] [blame] | 187 | const std::unordered_set<int32_t>  &sensorPixelModesUsed, | 
| Emilian Peev | 40ead60 | 2017-09-26 15:46:36 +0100 | [diff] [blame] | 188 | std::vector<int> *surfaceIds = nullptr, | 
| Zhijun He | 5d677d1 | 2016-05-29 16:52:39 -0700 | [diff] [blame] | 189 | int streamSetId = camera3::CAMERA3_STREAM_SET_ID_INVALID, | 
| Shuzhen Wang | 83bff12 | 2020-11-20 15:51:39 -0800 | [diff] [blame] | 190 | bool isShared = false, bool isMultiResolution = false, | 
| Emilian Peev | 2295df7 | 2021-11-12 18:14:10 -0800 | [diff] [blame] | 191 | uint64_t consumerUsage = 0, | 
| Emilian Peev | c81a759 | 2022-02-14 17:38:18 -0800 | [diff] [blame] | 192 | int64_t dynamicProfile = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD, | 
| Shuzhen Wang | 8ed1e87 | 2022-03-08 16:34:33 -0800 | [diff] [blame] | 193 | int64_t streamUseCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT, | 
| Shuzhen Wang | 610d7b8 | 2022-02-08 14:37:22 -0800 | [diff] [blame] | 194 | int timestampBase = OutputConfiguration::TIMESTAMP_BASE_DEFAULT, | 
|  | 195 | int mirrorMode = OutputConfiguration::MIRROR_MODE_AUTO) = 0; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 196 |  | 
|  | 197 | /** | 
| Shuzhen Wang | 0129d52 | 2016-10-30 22:43:41 -0700 | [diff] [blame] | 198 | * Create an output stream of the requested size, format, rotation and | 
|  | 199 | * dataspace with a number of consumers. | 
|  | 200 | * | 
|  | 201 | * For HAL_PIXEL_FORMAT_BLOB formats, the width and height should be the | 
|  | 202 | * logical dimensions of the buffer, not the number of bytes. | 
|  | 203 | */ | 
|  | 204 | virtual status_t createStream(const std::vector<sp<Surface>>& consumers, | 
|  | 205 | bool hasDeferredConsumer, uint32_t width, uint32_t height, int format, | 
| Emilian Peev | f481670 | 2020-04-03 15:44:51 -0700 | [diff] [blame] | 206 | android_dataspace dataSpace, camera_stream_rotation_t rotation, int *id, | 
| Austin Borger | 0fb3ad9 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 207 | const std::string& physicalCameraId, | 
| Jayant Chowdhary | 13f9b2f | 2020-12-02 22:46:15 -0800 | [diff] [blame] | 208 | const std::unordered_set<int32_t> &sensorPixelModesUsed, | 
| Emilian Peev | 40ead60 | 2017-09-26 15:46:36 +0100 | [diff] [blame] | 209 | std::vector<int> *surfaceIds = nullptr, | 
| Shuzhen Wang | 0129d52 | 2016-10-30 22:43:41 -0700 | [diff] [blame] | 210 | int streamSetId = camera3::CAMERA3_STREAM_SET_ID_INVALID, | 
| Shuzhen Wang | 83bff12 | 2020-11-20 15:51:39 -0800 | [diff] [blame] | 211 | bool isShared = false, bool isMultiResolution = false, | 
| Emilian Peev | 2295df7 | 2021-11-12 18:14:10 -0800 | [diff] [blame] | 212 | uint64_t consumerUsage = 0, | 
| Emilian Peev | c81a759 | 2022-02-14 17:38:18 -0800 | [diff] [blame] | 213 | int64_t dynamicProfile = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD, | 
| Shuzhen Wang | 8ed1e87 | 2022-03-08 16:34:33 -0800 | [diff] [blame] | 214 | int64_t streamUseCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT, | 
| Shuzhen Wang | 610d7b8 | 2022-02-08 14:37:22 -0800 | [diff] [blame] | 215 | int timestampBase = OutputConfiguration::TIMESTAMP_BASE_DEFAULT, | 
|  | 216 | int mirrorMode = OutputConfiguration::MIRROR_MODE_AUTO) = 0; | 
| Shuzhen Wang | 0129d52 | 2016-10-30 22:43:41 -0700 | [diff] [blame] | 217 |  | 
|  | 218 | /** | 
| Chien-Yu Chen | 618ff8a | 2015-03-13 11:27:17 -0700 | [diff] [blame] | 219 | * Create an input stream of width, height, and format. | 
|  | 220 | * | 
|  | 221 | * Return value is the stream ID if non-negative and an error if negative. | 
|  | 222 | */ | 
|  | 223 | virtual status_t createInputStream(uint32_t width, uint32_t height, | 
| Shuzhen Wang | 83bff12 | 2020-11-20 15:51:39 -0800 | [diff] [blame] | 224 | int32_t format, bool multiResolution, /*out*/ int32_t *id) = 0; | 
| Chien-Yu Chen | 618ff8a | 2015-03-13 11:27:17 -0700 | [diff] [blame] | 225 |  | 
| Emilian Peev | 710c142 | 2017-08-30 11:19:38 +0100 | [diff] [blame] | 226 | struct StreamInfo { | 
|  | 227 | uint32_t width; | 
|  | 228 | uint32_t height; | 
| Eino-Ville Talvala | 91cd3f8 | 2017-08-21 16:12:50 -0700 | [diff] [blame] | 229 |  | 
| Emilian Peev | 710c142 | 2017-08-30 11:19:38 +0100 | [diff] [blame] | 230 | uint32_t format; | 
|  | 231 | bool formatOverridden; | 
|  | 232 | uint32_t originalFormat; | 
| Eino-Ville Talvala | 91cd3f8 | 2017-08-21 16:12:50 -0700 | [diff] [blame] | 233 |  | 
| Emilian Peev | 710c142 | 2017-08-30 11:19:38 +0100 | [diff] [blame] | 234 | android_dataspace dataSpace; | 
| Eino-Ville Talvala | 91cd3f8 | 2017-08-21 16:12:50 -0700 | [diff] [blame] | 235 | bool dataSpaceOverridden; | 
|  | 236 | android_dataspace originalDataSpace; | 
| Emilian Peev | c81a759 | 2022-02-14 17:38:18 -0800 | [diff] [blame] | 237 | int64_t dynamicRangeProfile; | 
| Eino-Ville Talvala | 91cd3f8 | 2017-08-21 16:12:50 -0700 | [diff] [blame] | 238 |  | 
| Emilian Peev | 710c142 | 2017-08-30 11:19:38 +0100 | [diff] [blame] | 239 | StreamInfo() : width(0), height(0), format(0), formatOverridden(false), originalFormat(0), | 
| Eino-Ville Talvala | 91cd3f8 | 2017-08-21 16:12:50 -0700 | [diff] [blame] | 240 | dataSpace(HAL_DATASPACE_UNKNOWN), dataSpaceOverridden(false), | 
| Emilian Peev | 2295df7 | 2021-11-12 18:14:10 -0800 | [diff] [blame] | 241 | originalDataSpace(HAL_DATASPACE_UNKNOWN), | 
|  | 242 | dynamicRangeProfile(ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD){} | 
| Emilian Peev | 710c142 | 2017-08-30 11:19:38 +0100 | [diff] [blame] | 243 | /** | 
|  | 244 | * Check whether the format matches the current or the original one in case | 
|  | 245 | * it got overridden. | 
|  | 246 | */ | 
| Eino-Ville Talvala | 91cd3f8 | 2017-08-21 16:12:50 -0700 | [diff] [blame] | 247 | bool matchFormat(uint32_t clientFormat) const { | 
| Emilian Peev | 710c142 | 2017-08-30 11:19:38 +0100 | [diff] [blame] | 248 | if ((formatOverridden && (originalFormat == clientFormat)) || | 
|  | 249 | (format == clientFormat)) { | 
|  | 250 | return true; | 
|  | 251 | } | 
|  | 252 | return false; | 
|  | 253 | } | 
| Eino-Ville Talvala | 91cd3f8 | 2017-08-21 16:12:50 -0700 | [diff] [blame] | 254 |  | 
|  | 255 | /** | 
|  | 256 | * Check whether the dataspace matches the current or the original one in case | 
|  | 257 | * it got overridden. | 
|  | 258 | */ | 
|  | 259 | bool matchDataSpace(android_dataspace clientDataSpace) const { | 
|  | 260 | if ((dataSpaceOverridden && (originalDataSpace == clientDataSpace)) || | 
|  | 261 | (dataSpace == clientDataSpace)) { | 
|  | 262 | return true; | 
|  | 263 | } | 
|  | 264 | return false; | 
|  | 265 | } | 
|  | 266 |  | 
| Emilian Peev | 710c142 | 2017-08-30 11:19:38 +0100 | [diff] [blame] | 267 | }; | 
|  | 268 |  | 
| Chien-Yu Chen | 618ff8a | 2015-03-13 11:27:17 -0700 | [diff] [blame] | 269 | /** | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 270 | * Get information about a given stream. | 
|  | 271 | */ | 
| Emilian Peev | 710c142 | 2017-08-30 11:19:38 +0100 | [diff] [blame] | 272 | virtual status_t getStreamInfo(int id, StreamInfo *streamInfo) = 0; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 273 |  | 
|  | 274 | /** | 
|  | 275 | * Set stream gralloc buffer transform | 
|  | 276 | */ | 
|  | 277 | virtual status_t setStreamTransform(int id, int transform) = 0; | 
|  | 278 |  | 
|  | 279 | /** | 
|  | 280 | * Delete stream. Must not be called if there are requests in flight which | 
|  | 281 | * reference that stream. | 
|  | 282 | */ | 
|  | 283 | virtual status_t deleteStream(int id) = 0; | 
|  | 284 |  | 
|  | 285 | /** | 
| Igor Murashkin | e2d167e | 2014-08-19 16:19:59 -0700 | [diff] [blame] | 286 | * Take the currently-defined set of streams and configure the HAL to use | 
|  | 287 | * them. This is a long-running operation (may be several hundered ms). | 
|  | 288 | * | 
|  | 289 | * The device must be idle (see waitUntilDrained) before calling this. | 
|  | 290 | * | 
|  | 291 | * Returns OK on success; otherwise on error: | 
|  | 292 | * - BAD_VALUE if the set of streams was invalid (e.g. fmts or sizes) | 
|  | 293 | * - INVALID_OPERATION if the device was in the wrong state | 
|  | 294 | */ | 
| Emilian Peev | 5fbe0ba | 2017-10-20 15:45:45 +0100 | [diff] [blame] | 295 | virtual status_t configureStreams(const CameraMetadata& sessionParams, | 
| Emilian Peev | f481670 | 2020-04-03 15:44:51 -0700 | [diff] [blame] | 296 | int operatingMode = | 
|  | 297 | camera_stream_configuration_mode_t::CAMERA_STREAM_CONFIGURATION_NORMAL_MODE) = 0; | 
| Igor Murashkin | e2d167e | 2014-08-19 16:19:59 -0700 | [diff] [blame] | 298 |  | 
| Emilian Peev | cc0b795 | 2020-01-07 13:54:47 -0800 | [diff] [blame] | 299 | /** | 
|  | 300 | * Retrieve a list of all stream ids that were advertised as capable of | 
|  | 301 | * supporting offline processing mode by Hal after the last stream configuration. | 
|  | 302 | */ | 
|  | 303 | virtual void getOfflineStreamIds(std::vector<int> *offlineStreamIds) = 0; | 
|  | 304 |  | 
| Chien-Yu Chen | 618ff8a | 2015-03-13 11:27:17 -0700 | [diff] [blame] | 305 | // get the buffer producer of the input stream | 
|  | 306 | virtual status_t getInputBufferProducer( | 
|  | 307 | sp<IGraphicBufferProducer> *producer) = 0; | 
|  | 308 |  | 
| Igor Murashkin | e2d167e | 2014-08-19 16:19:59 -0700 | [diff] [blame] | 309 | /** | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 310 | * Create a metadata buffer with fields that the HAL device believes are | 
|  | 311 | * best for the given use case | 
|  | 312 | */ | 
| Emilian Peev | f481670 | 2020-04-03 15:44:51 -0700 | [diff] [blame] | 313 | virtual status_t createDefaultRequest(camera_request_template_t templateId, | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 314 | CameraMetadata *request) = 0; | 
|  | 315 |  | 
|  | 316 | /** | 
|  | 317 | * Wait until all requests have been processed. Returns INVALID_OPERATION if | 
|  | 318 | * the streaming slot is not empty, or TIMED_OUT if the requests haven't | 
|  | 319 | * finished processing in 10 seconds. | 
|  | 320 | */ | 
|  | 321 | virtual status_t waitUntilDrained() = 0; | 
|  | 322 |  | 
|  | 323 | /** | 
| Zhijun He | 28c9b6f | 2014-08-08 12:00:47 -0700 | [diff] [blame] | 324 | * Get Jpeg buffer size for a given jpeg resolution. | 
|  | 325 | * Negative values are error codes. | 
|  | 326 | */ | 
| Jayant Chowdhary | 6a6d3a8 | 2021-11-17 16:54:34 -0800 | [diff] [blame] | 327 | virtual ssize_t getJpegBufferSize(const CameraMetadata &info, uint32_t width, | 
|  | 328 | uint32_t height) const = 0; | 
| Zhijun He | 28c9b6f | 2014-08-08 12:00:47 -0700 | [diff] [blame] | 329 |  | 
|  | 330 | /** | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 331 | * Connect HAL notifications to a listener. Overwrites previous | 
|  | 332 | * listener. Set to NULL to stop receiving notifications. | 
|  | 333 | */ | 
| Yin-Chia Yeh | e1c8063 | 2016-08-08 14:48:05 -0700 | [diff] [blame] | 334 | virtual status_t setNotifyCallback(wp<NotificationListener> listener) = 0; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 335 |  | 
|  | 336 | /** | 
| Eino-Ville Talvala | 46910bd | 2013-07-18 19:15:17 -0700 | [diff] [blame] | 337 | * Whether the device supports calling notifyAutofocus, notifyAutoExposure, | 
|  | 338 | * and notifyAutoWhitebalance; if this returns false, the client must | 
|  | 339 | * synthesize these notifications from received frame metadata. | 
|  | 340 | */ | 
|  | 341 | virtual bool     willNotify3A() = 0; | 
|  | 342 |  | 
|  | 343 | /** | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 344 | * Trigger auto-focus. The latest ID used in a trigger autofocus or cancel | 
|  | 345 | * autofocus call will be returned by the HAL in all subsequent AF | 
|  | 346 | * notifications. | 
|  | 347 | */ | 
|  | 348 | virtual status_t triggerAutofocus(uint32_t id) = 0; | 
|  | 349 |  | 
|  | 350 | /** | 
|  | 351 | * Cancel auto-focus. The latest ID used in a trigger autofocus/cancel | 
|  | 352 | * autofocus call will be returned by the HAL in all subsequent AF | 
|  | 353 | * notifications. | 
|  | 354 | */ | 
|  | 355 | virtual status_t triggerCancelAutofocus(uint32_t id) = 0; | 
|  | 356 |  | 
|  | 357 | /** | 
|  | 358 | * Trigger pre-capture metering. The latest ID used in a trigger pre-capture | 
|  | 359 | * call will be returned by the HAL in all subsequent AE and AWB | 
|  | 360 | * notifications. | 
|  | 361 | */ | 
|  | 362 | virtual status_t triggerPrecaptureMetering(uint32_t id) = 0; | 
|  | 363 |  | 
|  | 364 | /** | 
| Eino-Ville Talvala | abaa51d | 2013-08-14 11:37:00 -0700 | [diff] [blame] | 365 | * Flush all pending and in-flight requests. Blocks until flush is | 
|  | 366 | * complete. | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 367 | * Output lastFrameNumber is the last frame number of the previous streaming request. | 
| Eino-Ville Talvala | abaa51d | 2013-08-14 11:37:00 -0700 | [diff] [blame] | 368 | */ | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 369 | virtual status_t flush(int64_t *lastFrameNumber = NULL) = 0; | 
| Eino-Ville Talvala | abaa51d | 2013-08-14 11:37:00 -0700 | [diff] [blame] | 370 |  | 
| Zhijun He | 204e329 | 2014-07-14 17:09:23 -0700 | [diff] [blame] | 371 | /** | 
| Eino-Ville Talvala | 4d44cad | 2015-04-11 13:15:45 -0700 | [diff] [blame] | 372 | * Prepare stream by preallocating buffers for it asynchronously. | 
|  | 373 | * Calls notifyPrepared() once allocation is complete. | 
|  | 374 | */ | 
|  | 375 | virtual status_t prepare(int streamId) = 0; | 
|  | 376 |  | 
|  | 377 | /** | 
| Eino-Ville Talvala | b25e3c8 | 2015-07-15 16:04:27 -0700 | [diff] [blame] | 378 | * Free stream resources by dumping its unused gralloc buffers. | 
|  | 379 | */ | 
|  | 380 | virtual status_t tearDown(int streamId) = 0; | 
|  | 381 |  | 
|  | 382 | /** | 
| Shuzhen Wang | b0fdc1e | 2016-03-20 23:21:39 -0700 | [diff] [blame] | 383 | * Add buffer listener for a particular stream in the device. | 
|  | 384 | */ | 
|  | 385 | virtual status_t addBufferListenerForStream(int streamId, | 
|  | 386 | wp<camera3::Camera3StreamBufferListener> listener) = 0; | 
|  | 387 |  | 
|  | 388 | /** | 
| Ruben Brunk | c78ac26 | 2015-08-13 17:58:46 -0700 | [diff] [blame] | 389 | * Prepare stream by preallocating up to maxCount buffers for it asynchronously. | 
|  | 390 | * Calls notifyPrepared() once allocation is complete. | 
|  | 391 | */ | 
|  | 392 | virtual status_t prepare(int maxCount, int streamId) = 0; | 
|  | 393 |  | 
|  | 394 | /** | 
| Zhijun He | 5d677d1 | 2016-05-29 16:52:39 -0700 | [diff] [blame] | 395 | * Set the deferred consumer surface and finish the rest of the stream configuration. | 
|  | 396 | */ | 
| Shuzhen Wang | 758c215 | 2017-01-10 18:26:18 -0800 | [diff] [blame] | 397 | virtual status_t setConsumerSurfaces(int streamId, | 
| Emilian Peev | 40ead60 | 2017-09-26 15:46:36 +0100 | [diff] [blame] | 398 | const std::vector<sp<Surface>>& consumers, std::vector<int> *surfaceIds /*out*/) = 0; | 
| Zhijun He | 5d677d1 | 2016-05-29 16:52:39 -0700 | [diff] [blame] | 399 |  | 
| Emilian Peev | 40ead60 | 2017-09-26 15:46:36 +0100 | [diff] [blame] | 400 | /** | 
|  | 401 | * Update a given stream. | 
|  | 402 | */ | 
|  | 403 | virtual status_t updateStream(int streamId, const std::vector<sp<Surface>> &newSurfaces, | 
|  | 404 | const std::vector<android::camera3::OutputStreamInfo> &outputInfo, | 
|  | 405 | const std::vector<size_t> &removedSurfaceIds, | 
|  | 406 | KeyedVector<sp<Surface>, size_t> *outputMap/*out*/) = 0; | 
| Chien-Yu Chen | a936ac2 | 2017-10-23 15:59:49 -0700 | [diff] [blame] | 407 |  | 
|  | 408 | /** | 
|  | 409 | * Drop buffers for stream of streamId if dropping is true. If dropping is false, do not | 
|  | 410 | * drop buffers for stream of streamId. | 
|  | 411 | */ | 
|  | 412 | virtual status_t dropStreamBuffers(bool /*dropping*/, int /*streamId*/) = 0; | 
| Emilian Peev | 2a8e283 | 2019-08-23 13:00:31 -0700 | [diff] [blame] | 413 |  | 
|  | 414 | /** | 
|  | 415 | * Returns the maximum expected time it'll take for all currently in-flight | 
|  | 416 | * requests to complete, based on their settings | 
|  | 417 | */ | 
|  | 418 | virtual nsecs_t getExpectedInFlightDuration() = 0; | 
| Yin-Chia Yeh | b978c38 | 2019-10-30 00:22:37 -0700 | [diff] [blame] | 419 |  | 
|  | 420 | /** | 
|  | 421 | * switch to offline session | 
|  | 422 | */ | 
|  | 423 | virtual status_t switchToOffline( | 
|  | 424 | const std::vector<int32_t>& streamsToKeep, | 
|  | 425 | /*out*/ sp<CameraOfflineSessionBase>* session) = 0; | 
| Eino-Ville Talvala | f2e3709 | 2020-01-07 15:32:32 -0800 | [diff] [blame] | 426 |  | 
|  | 427 | /** | 
|  | 428 | * Set the current behavior for the ROTATE_AND_CROP control when in AUTO. | 
|  | 429 | * | 
|  | 430 | * The value must be one of the ROTATE_AND_CROP_* values besides AUTO, | 
|  | 431 | * and defaults to NONE. | 
|  | 432 | */ | 
|  | 433 | virtual status_t setRotateAndCropAutoBehavior( | 
|  | 434 | camera_metadata_enum_android_scaler_rotate_and_crop_t rotateAndCropValue) = 0; | 
|  | 435 |  | 
| Shuzhen Wang | e867578 | 2019-12-05 09:12:14 -0800 | [diff] [blame] | 436 | /** | 
| Eino-Ville Talvala | 305cec6 | 2020-11-12 14:18:17 -0800 | [diff] [blame] | 437 | * Whether camera muting (producing black-only output) is supported. | 
|  | 438 | * | 
|  | 439 | * Calling setCameraMute(true) when this returns false will return an | 
|  | 440 | * INVALID_OPERATION error. | 
|  | 441 | */ | 
|  | 442 | virtual bool supportsCameraMute() = 0; | 
|  | 443 |  | 
|  | 444 | /** | 
|  | 445 | * Mute the camera. | 
|  | 446 | * | 
|  | 447 | * When muted, black image data is output on all output streams. | 
|  | 448 | */ | 
|  | 449 | virtual status_t setCameraMute(bool enabled) = 0; | 
|  | 450 |  | 
|  | 451 | /** | 
| Ravneet | 74cd373 | 2022-03-30 05:33:03 +0000 | [diff] [blame] | 452 | * Enable/disable camera service watchdog | 
|  | 453 | */ | 
|  | 454 | virtual status_t setCameraServiceWatchdog(bool enabled) = 0; | 
|  | 455 |  | 
|  | 456 | /** | 
| Shuzhen Wang | e867578 | 2019-12-05 09:12:14 -0800 | [diff] [blame] | 457 | * Get the status tracker of the camera device | 
|  | 458 | */ | 
|  | 459 | virtual wp<camera3::StatusTracker> getStatusTracker() = 0; | 
| Shuzhen Wang | abbcb6b | 2020-12-09 22:32:44 -0800 | [diff] [blame] | 460 |  | 
|  | 461 | /** | 
|  | 462 | * Set bitmask for image dump flag | 
|  | 463 | */ | 
|  | 464 | void setImageDumpMask(int mask) { mImageDumpMask = mask; } | 
|  | 465 |  | 
| Cliff Wu | d3a0531 | 2021-04-26 23:07:31 +0800 | [diff] [blame] | 466 | /** | 
| Shuzhen Wang | abe5ea1 | 2022-12-15 22:38:07 -0800 | [diff] [blame] | 467 | * Set stream use case overrides | 
|  | 468 | */ | 
|  | 469 | void setStreamUseCaseOverrides(const std::vector<int64_t>& useCaseOverrides) { | 
|  | 470 | mStreamUseCaseOverrides = useCaseOverrides; | 
|  | 471 | } | 
|  | 472 |  | 
|  | 473 | void clearStreamUseCaseOverrides() {} | 
|  | 474 |  | 
|  | 475 | /** | 
| Cliff Wu | d3a0531 | 2021-04-26 23:07:31 +0800 | [diff] [blame] | 476 | * The injection camera session to replace the internal camera | 
|  | 477 | * session. | 
|  | 478 | */ | 
| Austin Borger | 0fb3ad9 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 479 | virtual status_t injectCamera(const std::string& injectedCamId, | 
| Cliff Wu | d3a0531 | 2021-04-26 23:07:31 +0800 | [diff] [blame] | 480 | sp<CameraProviderManager> manager) = 0; | 
|  | 481 |  | 
|  | 482 | /** | 
|  | 483 | * Stop the injection camera and restore to internal camera session. | 
|  | 484 | */ | 
|  | 485 | virtual status_t stopInjection() = 0; | 
|  | 486 |  | 
| Shuzhen Wang | abbcb6b | 2020-12-09 22:32:44 -0800 | [diff] [blame] | 487 | protected: | 
|  | 488 | bool mImageDumpMask = 0; | 
| Shuzhen Wang | abe5ea1 | 2022-12-15 22:38:07 -0800 | [diff] [blame] | 489 | std::vector<int64_t> mStreamUseCaseOverrides; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 490 | }; | 
|  | 491 |  | 
|  | 492 | }; // namespace android | 
|  | 493 |  | 
|  | 494 | #endif |