| Eino-Ville Talvala | 61ab9f9 | 2012-05-17 10:30:54 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2012 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_CAMERA2CLIENT_H | 
|  | 18 | #define ANDROID_SERVERS_CAMERA_CAMERA2CLIENT_H | 
|  | 19 |  | 
|  | 20 | #include "Camera2Device.h" | 
|  | 21 | #include "CameraService.h" | 
| Eino-Ville Talvala | f69c70d | 2012-05-20 15:59:14 -0700 | [diff] [blame] | 22 | #include "camera/CameraParameters.h" | 
| Eino-Ville Talvala | d4bcfde | 2012-06-07 17:12:38 -0700 | [diff] [blame] | 23 | #include <binder/MemoryBase.h> | 
|  | 24 | #include <binder/MemoryHeapBase.h> | 
|  | 25 | #include <gui/CpuConsumer.h> | 
| Eino-Ville Talvala | 78822d7 | 2012-07-18 17:52:18 -0700 | [diff] [blame^] | 26 | #include "MediaConsumer.h" | 
| Eino-Ville Talvala | 61ab9f9 | 2012-05-17 10:30:54 -0700 | [diff] [blame] | 27 |  | 
|  | 28 | namespace android { | 
|  | 29 |  | 
|  | 30 | /** | 
|  | 31 | * Implements the android.hardware.camera API on top of | 
|  | 32 | * camera device HAL version 2. | 
|  | 33 | */ | 
|  | 34 | class Camera2Client : public CameraService::Client | 
|  | 35 | { | 
|  | 36 | public: | 
|  | 37 | // ICamera interface (see ICamera for details) | 
|  | 38 | virtual void            disconnect(); | 
|  | 39 | virtual status_t        connect(const sp<ICameraClient>& client); | 
|  | 40 | virtual status_t        lock(); | 
|  | 41 | virtual status_t        unlock(); | 
|  | 42 | virtual status_t        setPreviewDisplay(const sp<Surface>& surface); | 
| Eino-Ville Talvala | 6db981c | 2012-05-21 18:54:30 -0700 | [diff] [blame] | 43 | virtual status_t        setPreviewTexture( | 
|  | 44 | const sp<ISurfaceTexture>& surfaceTexture); | 
| Eino-Ville Talvala | 61ab9f9 | 2012-05-17 10:30:54 -0700 | [diff] [blame] | 45 | virtual void            setPreviewCallbackFlag(int flag); | 
|  | 46 | virtual status_t        startPreview(); | 
|  | 47 | virtual void            stopPreview(); | 
|  | 48 | virtual bool            previewEnabled(); | 
|  | 49 | virtual status_t        storeMetaDataInBuffers(bool enabled); | 
|  | 50 | virtual status_t        startRecording(); | 
|  | 51 | virtual void            stopRecording(); | 
|  | 52 | virtual bool            recordingEnabled(); | 
|  | 53 | virtual void            releaseRecordingFrame(const sp<IMemory>& mem); | 
|  | 54 | virtual status_t        autoFocus(); | 
|  | 55 | virtual status_t        cancelAutoFocus(); | 
|  | 56 | virtual status_t        takePicture(int msgType); | 
|  | 57 | virtual status_t        setParameters(const String8& params); | 
|  | 58 | virtual String8         getParameters() const; | 
|  | 59 | virtual status_t        sendCommand(int32_t cmd, int32_t arg1, int32_t arg2); | 
|  | 60 |  | 
|  | 61 | // Interface used by CameraService | 
|  | 62 | Camera2Client(const sp<CameraService>& cameraService, | 
|  | 63 | const sp<ICameraClient>& cameraClient, | 
| Eino-Ville Talvala | 61ab9f9 | 2012-05-17 10:30:54 -0700 | [diff] [blame] | 64 | int cameraId, | 
|  | 65 | int cameraFacing, | 
|  | 66 | int clientPid); | 
|  | 67 | ~Camera2Client(); | 
|  | 68 |  | 
| Eino-Ville Talvala | f69c70d | 2012-05-20 15:59:14 -0700 | [diff] [blame] | 69 | status_t initialize(camera_module_t *module); | 
|  | 70 |  | 
| Eino-Ville Talvala | 61ab9f9 | 2012-05-17 10:30:54 -0700 | [diff] [blame] | 71 | virtual status_t dump(int fd, const Vector<String16>& args); | 
|  | 72 |  | 
|  | 73 | private: | 
| Eino-Ville Talvala | 4ecfec3 | 2012-06-12 17:13:48 -0700 | [diff] [blame] | 74 | enum State { | 
| Eino-Ville Talvala | 6db981c | 2012-05-21 18:54:30 -0700 | [diff] [blame] | 75 | NOT_INITIALIZED, | 
|  | 76 | STOPPED, | 
|  | 77 | WAITING_FOR_PREVIEW_WINDOW, | 
| Eino-Ville Talvala | 7f61084 | 2012-06-07 10:20:51 -0700 | [diff] [blame] | 78 | PREVIEW, | 
|  | 79 | RECORD, | 
| Eino-Ville Talvala | d4bcfde | 2012-06-07 17:12:38 -0700 | [diff] [blame] | 80 | STILL_CAPTURE, | 
|  | 81 | VIDEO_SNAPSHOT | 
| Eino-Ville Talvala | 6db981c | 2012-05-21 18:54:30 -0700 | [diff] [blame] | 82 | } mState; | 
|  | 83 |  | 
| Eino-Ville Talvala | 4ecfec3 | 2012-06-12 17:13:48 -0700 | [diff] [blame] | 84 | static const char *getStateName(State state); | 
|  | 85 |  | 
| Eino-Ville Talvala | 3cca136 | 2012-06-07 10:07:18 -0700 | [diff] [blame] | 86 | /** ICamera interface-related private members */ | 
| Eino-Ville Talvala | 61ab9f9 | 2012-05-17 10:30:54 -0700 | [diff] [blame] | 87 |  | 
| Eino-Ville Talvala | ac45eb3 | 2012-06-07 10:24:51 -0700 | [diff] [blame] | 88 | // Mutex that must be locked by methods implementing the ICamera interface. | 
|  | 89 | // Ensures serialization between incoming ICamera calls | 
|  | 90 | mutable Mutex mICameraLock; | 
|  | 91 |  | 
| Eino-Ville Talvala | d4bcfde | 2012-06-07 17:12:38 -0700 | [diff] [blame] | 92 | // The following must be called with mICamaeraLock already locked | 
| Eino-Ville Talvala | ac45eb3 | 2012-06-07 10:24:51 -0700 | [diff] [blame] | 93 |  | 
| Eino-Ville Talvala | d4bcfde | 2012-06-07 17:12:38 -0700 | [diff] [blame] | 94 | status_t setPreviewWindowLocked(const sp<IBinder>& binder, | 
| Eino-Ville Talvala | be0573b | 2012-06-15 12:42:30 -0700 | [diff] [blame] | 95 | sp<ANativeWindow> window); | 
| Eino-Ville Talvala | d4bcfde | 2012-06-07 17:12:38 -0700 | [diff] [blame] | 96 |  | 
|  | 97 | void stopPreviewLocked(); | 
|  | 98 | status_t startPreviewLocked(); | 
|  | 99 |  | 
|  | 100 | // Mutex that must be locked before accessing mParameters, mParamsFlattened | 
| Eino-Ville Talvala | ac45eb3 | 2012-06-07 10:24:51 -0700 | [diff] [blame] | 101 | mutable Mutex mParamsLock; | 
| Eino-Ville Talvala | 3cca136 | 2012-06-07 10:07:18 -0700 | [diff] [blame] | 102 | String8 mParamsFlattened; | 
|  | 103 | // Current camera state; this is the contents of the CameraParameters object | 
|  | 104 | // in a more-efficient format. The enum values are mostly based off the | 
|  | 105 | // corresponding camera2 enums, not the camera1 strings. A few are defined | 
|  | 106 | // here if they don't cleanly map to camera2 values. | 
|  | 107 | struct Parameters { | 
|  | 108 | int previewWidth, previewHeight; | 
| Eino-Ville Talvala | 11b7cde | 2012-06-15 12:37:35 -0700 | [diff] [blame] | 109 | int32_t previewFpsRange[2]; | 
| Eino-Ville Talvala | 3cca136 | 2012-06-07 10:07:18 -0700 | [diff] [blame] | 110 | int previewFps; // deprecated, here only for tracking changes | 
|  | 111 | int previewFormat; | 
|  | 112 |  | 
| Eino-Ville Talvala | 11b7cde | 2012-06-15 12:37:35 -0700 | [diff] [blame] | 113 | int previewTransform; // set by CAMERA_CMD_SET_DISPLAY_ORIENTATION | 
|  | 114 |  | 
| Eino-Ville Talvala | 3cca136 | 2012-06-07 10:07:18 -0700 | [diff] [blame] | 115 | int pictureWidth, pictureHeight; | 
|  | 116 |  | 
| Eino-Ville Talvala | 11b7cde | 2012-06-15 12:37:35 -0700 | [diff] [blame] | 117 | int32_t jpegThumbSize[2]; | 
|  | 118 | int32_t jpegQuality, jpegThumbQuality; | 
|  | 119 | int32_t jpegRotation; | 
| Eino-Ville Talvala | 3cca136 | 2012-06-07 10:07:18 -0700 | [diff] [blame] | 120 |  | 
|  | 121 | bool gpsEnabled; | 
| Eino-Ville Talvala | 11b7cde | 2012-06-15 12:37:35 -0700 | [diff] [blame] | 122 | double gpsCoordinates[3]; | 
| Eino-Ville Talvala | 3cca136 | 2012-06-07 10:07:18 -0700 | [diff] [blame] | 123 | int64_t gpsTimestamp; | 
|  | 124 | String8 gpsProcessingMethod; | 
|  | 125 |  | 
|  | 126 | int wbMode; | 
|  | 127 | int effectMode; | 
|  | 128 | int antibandingMode; | 
|  | 129 | int sceneMode; | 
|  | 130 |  | 
|  | 131 | enum flashMode_t { | 
|  | 132 | FLASH_MODE_OFF = 0, | 
|  | 133 | FLASH_MODE_AUTO, | 
|  | 134 | FLASH_MODE_ON, | 
|  | 135 | FLASH_MODE_TORCH, | 
|  | 136 | FLASH_MODE_RED_EYE = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE, | 
|  | 137 | FLASH_MODE_INVALID = -1 | 
|  | 138 | } flashMode; | 
|  | 139 |  | 
|  | 140 | enum focusMode_t { | 
|  | 141 | FOCUS_MODE_AUTO = ANDROID_CONTROL_AF_AUTO, | 
|  | 142 | FOCUS_MODE_MACRO = ANDROID_CONTROL_AF_MACRO, | 
|  | 143 | FOCUS_MODE_CONTINUOUS_VIDEO = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO, | 
|  | 144 | FOCUS_MODE_CONTINUOUS_PICTURE = | 
|  | 145 | ANDROID_CONTROL_AF_CONTINUOUS_PICTURE, | 
|  | 146 | FOCUS_MODE_EDOF = ANDROID_CONTROL_AF_EDOF, | 
|  | 147 | FOCUS_MODE_INFINITY, | 
|  | 148 | FOCUS_MODE_FIXED, | 
|  | 149 | FOCUS_MODE_INVALID = -1 | 
|  | 150 | } focusMode; | 
|  | 151 |  | 
|  | 152 | struct Area { | 
|  | 153 | int left, top, right, bottom; | 
|  | 154 | int weight; | 
|  | 155 | Area() {} | 
|  | 156 | Area(int left, int top, int right, int bottom, int weight): | 
|  | 157 | left(left), top(top), right(right), bottom(bottom), | 
|  | 158 | weight(weight) {} | 
|  | 159 | }; | 
|  | 160 | Vector<Area> focusingAreas; | 
|  | 161 |  | 
| Eino-Ville Talvala | 11b7cde | 2012-06-15 12:37:35 -0700 | [diff] [blame] | 162 | int32_t exposureCompensation; | 
| Eino-Ville Talvala | 3cca136 | 2012-06-07 10:07:18 -0700 | [diff] [blame] | 163 | bool autoExposureLock; | 
|  | 164 | bool autoWhiteBalanceLock; | 
|  | 165 |  | 
|  | 166 | Vector<Area> meteringAreas; | 
|  | 167 |  | 
|  | 168 | int zoom; | 
|  | 169 |  | 
|  | 170 | int videoWidth, videoHeight; | 
|  | 171 |  | 
|  | 172 | bool recordingHint; | 
|  | 173 | bool videoStabilization; | 
| Eino-Ville Talvala | 78822d7 | 2012-07-18 17:52:18 -0700 | [diff] [blame^] | 174 |  | 
|  | 175 | bool storeMetadataInBuffers; | 
| Eino-Ville Talvala | 3cca136 | 2012-06-07 10:07:18 -0700 | [diff] [blame] | 176 | } mParameters; | 
|  | 177 |  | 
|  | 178 | /** Camera device-related private members */ | 
|  | 179 |  | 
| Eino-Ville Talvala | 9cca4c6 | 2012-06-15 15:41:44 -0700 | [diff] [blame] | 180 | class Camera2Heap; | 
|  | 181 |  | 
|  | 182 | // Number of zoom steps to simulate | 
|  | 183 | static const unsigned int NUM_ZOOM_STEPS = 10; | 
|  | 184 | // Used with stream IDs | 
|  | 185 | static const int NO_STREAM = -1; | 
|  | 186 |  | 
|  | 187 | /* Preview related members */ | 
|  | 188 |  | 
|  | 189 | int mPreviewStreamId; | 
|  | 190 | camera_metadata_t *mPreviewRequest; | 
|  | 191 | sp<IBinder> mPreviewSurface; | 
|  | 192 | sp<ANativeWindow> mPreviewWindow; | 
|  | 193 | // Update preview request based on mParameters | 
|  | 194 | status_t updatePreviewRequest(); | 
|  | 195 | // Update preview stream based on mParameters | 
|  | 196 | status_t updatePreviewStream(); | 
|  | 197 |  | 
|  | 198 | /* Still image capture related members */ | 
|  | 199 |  | 
|  | 200 | int mCaptureStreamId; | 
|  | 201 | sp<CpuConsumer>    mCaptureConsumer; | 
|  | 202 | sp<ANativeWindow>  mCaptureWindow; | 
| Eino-Ville Talvala | d4bcfde | 2012-06-07 17:12:38 -0700 | [diff] [blame] | 203 | // Simple listener that forwards frame available notifications from | 
|  | 204 | // a CPU consumer to the capture notification | 
|  | 205 | class CaptureWaiter: public CpuConsumer::FrameAvailableListener { | 
|  | 206 | public: | 
|  | 207 | CaptureWaiter(Camera2Client *parent) : mParent(parent) {} | 
|  | 208 | void onFrameAvailable() { mParent->onCaptureAvailable(); } | 
|  | 209 | private: | 
|  | 210 | Camera2Client *mParent; | 
|  | 211 | }; | 
| Eino-Ville Talvala | d4bcfde | 2012-06-07 17:12:38 -0700 | [diff] [blame] | 212 | sp<CaptureWaiter>  mCaptureWaiter; | 
| Eino-Ville Talvala | 3cca136 | 2012-06-07 10:07:18 -0700 | [diff] [blame] | 213 | camera_metadata_t *mCaptureRequest; | 
| Eino-Ville Talvala | 9cca4c6 | 2012-06-15 15:41:44 -0700 | [diff] [blame] | 214 | sp<Camera2Heap>    mCaptureHeap; | 
|  | 215 | // Handle captured image buffers | 
|  | 216 | void onCaptureAvailable(); | 
|  | 217 | // Update capture request based on mParameters | 
|  | 218 | status_t updateCaptureRequest(); | 
|  | 219 | // Update capture stream based on mParameters | 
|  | 220 | status_t updateCaptureStream(); | 
|  | 221 |  | 
|  | 222 | /* Recording related members */ | 
|  | 223 |  | 
|  | 224 | int mRecordingStreamId; | 
| Eino-Ville Talvala | 78822d7 | 2012-07-18 17:52:18 -0700 | [diff] [blame^] | 225 | sp<MediaConsumer>    mRecordingConsumer; | 
| Eino-Ville Talvala | 9cca4c6 | 2012-06-15 15:41:44 -0700 | [diff] [blame] | 226 | sp<ANativeWindow>  mRecordingWindow; | 
|  | 227 | // Simple listener that forwards frame available notifications from | 
|  | 228 | // a CPU consumer to the recording notification | 
| Eino-Ville Talvala | 78822d7 | 2012-07-18 17:52:18 -0700 | [diff] [blame^] | 229 | class RecordingWaiter: public MediaConsumer::FrameAvailableListener { | 
| Eino-Ville Talvala | 9cca4c6 | 2012-06-15 15:41:44 -0700 | [diff] [blame] | 230 | public: | 
|  | 231 | RecordingWaiter(Camera2Client *parent) : mParent(parent) {} | 
|  | 232 | void onFrameAvailable() { mParent->onRecordingFrameAvailable(); } | 
|  | 233 | private: | 
|  | 234 | Camera2Client *mParent; | 
|  | 235 | }; | 
|  | 236 | sp<RecordingWaiter>  mRecordingWaiter; | 
|  | 237 | camera_metadata_t *mRecordingRequest; | 
|  | 238 | sp<Camera2Heap> mRecordingHeap; | 
|  | 239 |  | 
|  | 240 | // TODO: This needs to be queried from somewhere, or the BufferQueue needs | 
|  | 241 | // to be passed all the way to stagefright | 
|  | 242 | static const size_t kRecordingHeapCount = 4; | 
| Eino-Ville Talvala | 9cca4c6 | 2012-06-15 15:41:44 -0700 | [diff] [blame] | 243 | size_t mRecordingHeapHead, mRecordingHeapFree; | 
|  | 244 | // Handle new recording image buffers | 
|  | 245 | void onRecordingFrameAvailable(); | 
|  | 246 | // Update recording request based on mParameters | 
|  | 247 | status_t updateRecordingRequest(); | 
|  | 248 | // Update recording stream based on mParameters | 
|  | 249 | status_t updateRecordingStream(); | 
|  | 250 |  | 
|  | 251 | /** Camera2Device instance wrapping HAL2 entry */ | 
| Eino-Ville Talvala | 3cca136 | 2012-06-07 10:07:18 -0700 | [diff] [blame] | 252 |  | 
|  | 253 | sp<Camera2Device> mDevice; | 
|  | 254 |  | 
| Eino-Ville Talvala | 9cca4c6 | 2012-06-15 15:41:44 -0700 | [diff] [blame] | 255 | /** Utility members */ | 
|  | 256 |  | 
|  | 257 | // Utility class for managing a set of IMemory blocks | 
|  | 258 | class Camera2Heap : public RefBase { | 
|  | 259 | public: | 
|  | 260 | Camera2Heap(size_t buf_size, uint_t num_buffers = 1, | 
|  | 261 | const char *name = NULL) : | 
|  | 262 | mBufSize(buf_size), | 
|  | 263 | mNumBufs(num_buffers) { | 
|  | 264 | mHeap = new MemoryHeapBase(buf_size * num_buffers, 0, name); | 
|  | 265 | mBuffers = new sp<MemoryBase>[mNumBufs]; | 
|  | 266 | for (uint_t i = 0; i < mNumBufs; i++) | 
|  | 267 | mBuffers[i] = new MemoryBase(mHeap, | 
|  | 268 | i * mBufSize, | 
|  | 269 | mBufSize); | 
|  | 270 | } | 
|  | 271 |  | 
|  | 272 | virtual ~Camera2Heap() | 
|  | 273 | { | 
|  | 274 | delete [] mBuffers; | 
|  | 275 | } | 
|  | 276 |  | 
|  | 277 | size_t mBufSize; | 
|  | 278 | uint_t mNumBufs; | 
|  | 279 | sp<MemoryHeapBase> mHeap; | 
|  | 280 | sp<MemoryBase> *mBuffers; | 
|  | 281 | }; | 
| Eino-Ville Talvala | 3cca136 | 2012-06-07 10:07:18 -0700 | [diff] [blame] | 282 |  | 
|  | 283 | // Get values for static camera info entry. min/maxCount are used for error | 
|  | 284 | // checking the number of values in the entry. 0 for max/minCount means to | 
|  | 285 | // do no bounds check in that direction. In case of error, the entry data | 
|  | 286 | // pointer is null and the count is 0. | 
|  | 287 | camera_metadata_entry_t staticInfo(uint32_t tag, | 
|  | 288 | size_t minCount=0, size_t maxCount=0); | 
|  | 289 |  | 
| Eino-Ville Talvala | f69c70d | 2012-05-20 15:59:14 -0700 | [diff] [blame] | 290 | // Convert static camera info from a camera2 device to the | 
|  | 291 | // old API parameter map. | 
|  | 292 | status_t buildDefaultParameters(); | 
| Eino-Ville Talvala | 61ab9f9 | 2012-05-17 10:30:54 -0700 | [diff] [blame] | 293 |  | 
| Eino-Ville Talvala | be0573b | 2012-06-15 12:42:30 -0700 | [diff] [blame] | 294 | // Update parameters all requests use, based on mParameters | 
|  | 295 | status_t updateRequestCommon(camera_metadata_t *request); | 
|  | 296 |  | 
|  | 297 | // Update specific metadata entry with new values. Adds entry if it does not | 
|  | 298 | // exist, which will invalidate sorting | 
|  | 299 | static status_t updateEntry(camera_metadata_t *buffer, | 
|  | 300 | uint32_t tag, const void *data, size_t data_count); | 
|  | 301 |  | 
|  | 302 | // Remove metadata entry. Will invalidate sorting. If entry does not exist, | 
|  | 303 | // does nothing. | 
|  | 304 | static status_t deleteEntry(camera_metadata_t *buffer, | 
|  | 305 | uint32_t tag); | 
|  | 306 |  | 
| Eino-Ville Talvala | 6861a4e | 2012-06-07 10:32:12 -0700 | [diff] [blame] | 307 | // Convert camera1 preview format string to camera2 enum | 
|  | 308 | static int formatStringToEnum(const char *format); | 
| Eino-Ville Talvala | 3cca136 | 2012-06-07 10:07:18 -0700 | [diff] [blame] | 309 | static const char *formatEnumToString(int format); | 
| Eino-Ville Talvala | 6861a4e | 2012-06-07 10:32:12 -0700 | [diff] [blame] | 310 |  | 
|  | 311 | static int wbModeStringToEnum(const char *wbMode); | 
|  | 312 | static int effectModeStringToEnum(const char *effectMode); | 
|  | 313 | static int abModeStringToEnum(const char *abMode); | 
|  | 314 | static int sceneModeStringToEnum(const char *sceneMode); | 
|  | 315 | static Parameters::flashMode_t flashModeStringToEnum(const char *flashMode); | 
|  | 316 | static Parameters::focusMode_t focusModeStringToEnum(const char *focusMode); | 
|  | 317 | static status_t parseAreas(const char *areasCStr, | 
|  | 318 | Vector<Parameters::Area> *areas); | 
|  | 319 | static status_t validateAreas(const Vector<Parameters::Area> &areas, | 
|  | 320 | size_t maxRegions); | 
|  | 321 | static bool boolFromString(const char *boolStr); | 
| Eino-Ville Talvala | c94cd19 | 2012-06-15 12:47:42 -0700 | [diff] [blame] | 322 |  | 
|  | 323 | // Map from camera orientation + facing to gralloc transform enum | 
|  | 324 | static int degToTransform(int degrees, bool mirror); | 
| Eino-Ville Talvala | 61ab9f9 | 2012-05-17 10:30:54 -0700 | [diff] [blame] | 325 | }; | 
|  | 326 |  | 
|  | 327 | }; // namespace android | 
|  | 328 |  | 
|  | 329 | #endif |