| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (C) 2013 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_CAMERA_CAMERADEVICEBASE_H | 
 | 18 | #define ANDROID_SERVERS_CAMERA_CAMERADEVICEBASE_H | 
 | 19 |  | 
 | 20 | #include <utils/RefBase.h> | 
 | 21 | #include <utils/String8.h> | 
 | 22 | #include <utils/String16.h> | 
 | 23 | #include <utils/Vector.h> | 
 | 24 | #include <utils/Timers.h> | 
| Jianing Wei | 90e59c9 | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 25 | #include <utils/List.h> | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 26 |  | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 27 | #include <camera/camera2/ICameraDeviceCallbacks.h> | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 28 | #include "hardware/camera2.h" | 
| Zhijun He | 0ea8fa4 | 2014-07-07 17:05:38 -0700 | [diff] [blame] | 29 | #include "hardware/camera3.h" | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 30 | #include "camera/CameraMetadata.h" | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 31 | #include "camera/CaptureResult.h" | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 32 |  | 
 | 33 | namespace android { | 
 | 34 |  | 
 | 35 | /** | 
 | 36 |  * Base interface for version >= 2 camera device classes, which interface to | 
 | 37 |  * camera HAL device versions >= 2. | 
 | 38 |  */ | 
 | 39 | class CameraDeviceBase : public virtual RefBase { | 
 | 40 |   public: | 
 | 41 |     virtual ~CameraDeviceBase(); | 
 | 42 |  | 
| Igor Murashkin | 7138105 | 2013-03-04 14:53:08 -0800 | [diff] [blame] | 43 |     /** | 
 | 44 |      * The device's camera ID | 
 | 45 |      */ | 
 | 46 |     virtual int      getId() const = 0; | 
 | 47 |  | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 48 |     virtual status_t initialize(camera_module_t *module) = 0; | 
 | 49 |     virtual status_t disconnect() = 0; | 
 | 50 |  | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 51 |     virtual status_t dump(int fd, const Vector<String16> &args) = 0; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 52 |  | 
 | 53 |     /** | 
 | 54 |      * The device's static characteristics metadata buffer | 
 | 55 |      */ | 
 | 56 |     virtual const CameraMetadata& info() const = 0; | 
 | 57 |  | 
 | 58 |     /** | 
 | 59 |      * Submit request for capture. The CameraDevice takes ownership of the | 
 | 60 |      * passed-in buffer. | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 61 |      * Output lastFrameNumber is the expected frame number of this request. | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 62 |      */ | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 63 |     virtual status_t capture(CameraMetadata &request, int64_t *lastFrameNumber = NULL) = 0; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 64 |  | 
 | 65 |     /** | 
| Jianing Wei | 90e59c9 | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 66 |      * Submit a list of requests. | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 67 |      * 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] | 68 |      */ | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 69 |     virtual status_t captureList(const List<const CameraMetadata> &requests, | 
 | 70 |                                  int64_t *lastFrameNumber = NULL) = 0; | 
| Jianing Wei | 90e59c9 | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 71 |  | 
 | 72 |     /** | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 73 |      * Submit request for streaming. The CameraDevice makes a copy of the | 
 | 74 |      * passed-in buffer and the caller retains ownership. | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 75 |      * 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] | 76 |      */ | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 77 |     virtual status_t setStreamingRequest(const CameraMetadata &request, | 
 | 78 |                                          int64_t *lastFrameNumber = NULL) = 0; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 79 |  | 
 | 80 |     /** | 
| Jianing Wei | 90e59c9 | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 81 |      * Submit a list of requests for streaming. | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 82 |      * Output lastFrameNumber is the last frame number of the previous streaming request. | 
| Jianing Wei | 90e59c9 | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 83 |      */ | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 84 |     virtual status_t setStreamingRequestList(const List<const CameraMetadata> &requests, | 
 | 85 |                                              int64_t *lastFrameNumber = NULL) = 0; | 
| Jianing Wei | 90e59c9 | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 86 |  | 
 | 87 |     /** | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 88 |      * Clear the streaming request slot. | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 89 |      * 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] | 90 |      */ | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 91 |     virtual status_t clearStreamingRequest(int64_t *lastFrameNumber = NULL) = 0; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 92 |  | 
 | 93 |     /** | 
 | 94 |      * Wait until a request with the given ID has been dequeued by the | 
 | 95 |      * HAL. Returns TIMED_OUT if the timeout duration is reached. Returns | 
 | 96 |      * immediately if the latest request received by the HAL has this id. | 
 | 97 |      */ | 
 | 98 |     virtual status_t waitUntilRequestReceived(int32_t requestId, | 
 | 99 |             nsecs_t timeout) = 0; | 
 | 100 |  | 
 | 101 |     /** | 
 | 102 |      * Create an output stream of the requested size and format. | 
 | 103 |      * | 
 | 104 |      * If format is CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, then the HAL device selects | 
 | 105 |      * an appropriate format; it can be queried with getStreamInfo. | 
 | 106 |      * | 
 | 107 |      * If format is HAL_PIXEL_FORMAT_COMPRESSED, the size parameter must be | 
 | 108 |      * equal to the size in bytes of the buffers to allocate for the stream. For | 
 | 109 |      * other formats, the size parameter is ignored. | 
 | 110 |      */ | 
 | 111 |     virtual status_t createStream(sp<ANativeWindow> consumer, | 
| Zhijun He | 28c9b6f | 2014-08-08 12:00:47 -0700 | [diff] [blame] | 112 |             uint32_t width, uint32_t height, int format, int *id) = 0; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 113 |  | 
 | 114 |     /** | 
 | 115 |      * Create an input reprocess stream that uses buffers from an existing | 
 | 116 |      * output stream. | 
 | 117 |      */ | 
 | 118 |     virtual status_t createReprocessStreamFromStream(int outputId, int *id) = 0; | 
 | 119 |  | 
 | 120 |     /** | 
 | 121 |      * Get information about a given stream. | 
 | 122 |      */ | 
 | 123 |     virtual status_t getStreamInfo(int id, | 
 | 124 |             uint32_t *width, uint32_t *height, uint32_t *format) = 0; | 
 | 125 |  | 
 | 126 |     /** | 
 | 127 |      * Set stream gralloc buffer transform | 
 | 128 |      */ | 
 | 129 |     virtual status_t setStreamTransform(int id, int transform) = 0; | 
 | 130 |  | 
 | 131 |     /** | 
 | 132 |      * Delete stream. Must not be called if there are requests in flight which | 
 | 133 |      * reference that stream. | 
 | 134 |      */ | 
 | 135 |     virtual status_t deleteStream(int id) = 0; | 
 | 136 |  | 
 | 137 |     /** | 
 | 138 |      * Delete reprocess stream. Must not be called if there are requests in | 
 | 139 |      * flight which reference that stream. | 
 | 140 |      */ | 
 | 141 |     virtual status_t deleteReprocessStream(int id) = 0; | 
 | 142 |  | 
 | 143 |     /** | 
| Igor Murashkin | e2d167e | 2014-08-19 16:19:59 -0700 | [diff] [blame] | 144 |      * Take the currently-defined set of streams and configure the HAL to use | 
 | 145 |      * them. This is a long-running operation (may be several hundered ms). | 
 | 146 |      * | 
 | 147 |      * The device must be idle (see waitUntilDrained) before calling this. | 
 | 148 |      * | 
 | 149 |      * Returns OK on success; otherwise on error: | 
 | 150 |      * - BAD_VALUE if the set of streams was invalid (e.g. fmts or sizes) | 
 | 151 |      * - INVALID_OPERATION if the device was in the wrong state | 
 | 152 |      */ | 
 | 153 |     virtual status_t configureStreams() = 0; | 
 | 154 |  | 
 | 155 |     /** | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 156 |      * Create a metadata buffer with fields that the HAL device believes are | 
 | 157 |      * best for the given use case | 
 | 158 |      */ | 
 | 159 |     virtual status_t createDefaultRequest(int templateId, | 
 | 160 |             CameraMetadata *request) = 0; | 
 | 161 |  | 
 | 162 |     /** | 
 | 163 |      * Wait until all requests have been processed. Returns INVALID_OPERATION if | 
 | 164 |      * the streaming slot is not empty, or TIMED_OUT if the requests haven't | 
 | 165 |      * finished processing in 10 seconds. | 
 | 166 |      */ | 
 | 167 |     virtual status_t waitUntilDrained() = 0; | 
 | 168 |  | 
 | 169 |     /** | 
| Zhijun He | 28c9b6f | 2014-08-08 12:00:47 -0700 | [diff] [blame] | 170 |      * Get Jpeg buffer size for a given jpeg resolution. | 
 | 171 |      * Negative values are error codes. | 
 | 172 |      */ | 
 | 173 |     virtual ssize_t getJpegBufferSize(uint32_t width, uint32_t height) const = 0; | 
 | 174 |  | 
 | 175 |     /** | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 176 |      * Abstract class for HAL notification listeners | 
 | 177 |      */ | 
 | 178 |     class NotificationListener { | 
 | 179 |       public: | 
| Eino-Ville Talvala | f1e98d8 | 2013-09-06 09:32:43 -0700 | [diff] [blame] | 180 |         // The set of notifications is a merge of the notifications required for | 
 | 181 |         // API1 and API2. | 
 | 182 |  | 
 | 183 |         // Required for API 1 and 2 | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 184 |         virtual void notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode, | 
 | 185 |                                  const CaptureResultExtras &resultExtras) = 0; | 
| Eino-Ville Talvala | f1e98d8 | 2013-09-06 09:32:43 -0700 | [diff] [blame] | 186 |  | 
 | 187 |         // Required only for API2 | 
 | 188 |         virtual void notifyIdle() = 0; | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 189 |         virtual void notifyShutter(const CaptureResultExtras &resultExtras, | 
| Eino-Ville Talvala | f1e98d8 | 2013-09-06 09:32:43 -0700 | [diff] [blame] | 190 |                 nsecs_t timestamp) = 0; | 
 | 191 |  | 
 | 192 |         // Required only for API1 | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 193 |         virtual void notifyAutoFocus(uint8_t newState, int triggerId) = 0; | 
 | 194 |         virtual void notifyAutoExposure(uint8_t newState, int triggerId) = 0; | 
 | 195 |         virtual void notifyAutoWhitebalance(uint8_t newState, | 
 | 196 |                 int triggerId) = 0; | 
 | 197 |       protected: | 
 | 198 |         virtual ~NotificationListener(); | 
 | 199 |     }; | 
 | 200 |  | 
 | 201 |     /** | 
 | 202 |      * Connect HAL notifications to a listener. Overwrites previous | 
 | 203 |      * listener. Set to NULL to stop receiving notifications. | 
 | 204 |      */ | 
 | 205 |     virtual status_t setNotifyCallback(NotificationListener *listener) = 0; | 
 | 206 |  | 
 | 207 |     /** | 
| Eino-Ville Talvala | 46910bd | 2013-07-18 19:15:17 -0700 | [diff] [blame] | 208 |      * Whether the device supports calling notifyAutofocus, notifyAutoExposure, | 
 | 209 |      * and notifyAutoWhitebalance; if this returns false, the client must | 
 | 210 |      * synthesize these notifications from received frame metadata. | 
 | 211 |      */ | 
 | 212 |     virtual bool     willNotify3A() = 0; | 
 | 213 |  | 
 | 214 |     /** | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 215 |      * Wait for a new frame to be produced, with timeout in nanoseconds. | 
 | 216 |      * Returns TIMED_OUT when no frame produced within the specified duration | 
| Eino-Ville Talvala | f1e98d8 | 2013-09-06 09:32:43 -0700 | [diff] [blame] | 217 |      * May be called concurrently to most methods, except for getNextFrame | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 218 |      */ | 
 | 219 |     virtual status_t waitForNextFrame(nsecs_t timeout) = 0; | 
 | 220 |  | 
 | 221 |     /** | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 222 |      * Get next capture result frame from the result queue. Returns NOT_ENOUGH_DATA | 
 | 223 |      * if the queue is empty; caller takes ownership of the metadata buffer inside | 
 | 224 |      * the capture result object's metadata field. | 
 | 225 |      * May be called concurrently to most methods, except for waitForNextFrame. | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 226 |      */ | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 227 |     virtual status_t getNextResult(CaptureResult *frame) = 0; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 228 |  | 
 | 229 |     /** | 
 | 230 |      * Trigger auto-focus. The latest ID used in a trigger autofocus or cancel | 
 | 231 |      * autofocus call will be returned by the HAL in all subsequent AF | 
 | 232 |      * notifications. | 
 | 233 |      */ | 
 | 234 |     virtual status_t triggerAutofocus(uint32_t id) = 0; | 
 | 235 |  | 
 | 236 |     /** | 
 | 237 |      * Cancel auto-focus. The latest ID used in a trigger autofocus/cancel | 
 | 238 |      * autofocus call will be returned by the HAL in all subsequent AF | 
 | 239 |      * notifications. | 
 | 240 |      */ | 
 | 241 |     virtual status_t triggerCancelAutofocus(uint32_t id) = 0; | 
 | 242 |  | 
 | 243 |     /** | 
 | 244 |      * Trigger pre-capture metering. The latest ID used in a trigger pre-capture | 
 | 245 |      * call will be returned by the HAL in all subsequent AE and AWB | 
 | 246 |      * notifications. | 
 | 247 |      */ | 
 | 248 |     virtual status_t triggerPrecaptureMetering(uint32_t id) = 0; | 
 | 249 |  | 
 | 250 |     /** | 
 | 251 |      * Abstract interface for clients that want to listen to reprocess buffer | 
 | 252 |      * release events | 
 | 253 |      */ | 
 | 254 |     struct BufferReleasedListener : public virtual RefBase { | 
 | 255 |         virtual void onBufferReleased(buffer_handle_t *handle) = 0; | 
 | 256 |     }; | 
 | 257 |  | 
 | 258 |     /** | 
 | 259 |      * Push a buffer to be reprocessed into a reprocessing stream, and | 
 | 260 |      * provide a listener to call once the buffer is returned by the HAL | 
 | 261 |      */ | 
 | 262 |     virtual status_t pushReprocessBuffer(int reprocessStreamId, | 
 | 263 |             buffer_handle_t *buffer, wp<BufferReleasedListener> listener) = 0; | 
| Eino-Ville Talvala | abaa51d | 2013-08-14 11:37:00 -0700 | [diff] [blame] | 264 |  | 
 | 265 |     /** | 
 | 266 |      * Flush all pending and in-flight requests. Blocks until flush is | 
 | 267 |      * complete. | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 268 |      * 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] | 269 |      */ | 
| Jianing Wei | cb0652e | 2014-03-12 18:29:36 -0700 | [diff] [blame] | 270 |     virtual status_t flush(int64_t *lastFrameNumber = NULL) = 0; | 
| Eino-Ville Talvala | abaa51d | 2013-08-14 11:37:00 -0700 | [diff] [blame] | 271 |  | 
| Zhijun He | 204e329 | 2014-07-14 17:09:23 -0700 | [diff] [blame] | 272 |     /** | 
 | 273 |      * Get the HAL device version. | 
 | 274 |      */ | 
 | 275 |     virtual uint32_t getDeviceVersion() = 0; | 
| Eino-Ville Talvala | 7fa43f3 | 2013-02-06 17:20:07 -0800 | [diff] [blame] | 276 | }; | 
 | 277 |  | 
 | 278 | }; // namespace android | 
 | 279 |  | 
 | 280 | #endif |