Camera2Client.h revision 5a4f93eaaab7518fd734fdc9f0f686d632f31a59
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" 22#include "camera2/Parameters.h" 23#include "camera2/FrameProcessor.h" 24#include "camera2/JpegProcessor.h" 25#include "camera2/ZslProcessor.h" 26#include "camera2/CaptureSequencer.h" 27#include "camera2/CallbackProcessor.h" 28#include <binder/MemoryBase.h> 29#include <binder/MemoryHeapBase.h> 30#include <gui/CpuConsumer.h> 31#include <gui/BufferItemConsumer.h> 32 33namespace android { 34 35/** 36 * Implements the android.hardware.camera API on top of 37 * camera device HAL version 2. 38 */ 39class Camera2Client : 40 public CameraService::Client, 41 public Camera2Device::NotificationListener 42{ 43public: 44 /** 45 * ICamera interface (see ICamera for details) 46 */ 47 48 virtual void disconnect(); 49 virtual status_t connect(const sp<ICameraClient>& client); 50 virtual status_t lock(); 51 virtual status_t unlock(); 52 virtual status_t setPreviewDisplay(const sp<Surface>& surface); 53 virtual status_t setPreviewTexture( 54 const sp<ISurfaceTexture>& surfaceTexture); 55 virtual void setPreviewCallbackFlag(int flag); 56 virtual status_t startPreview(); 57 virtual void stopPreview(); 58 virtual bool previewEnabled(); 59 virtual status_t storeMetaDataInBuffers(bool enabled); 60 virtual status_t startRecording(); 61 virtual void stopRecording(); 62 virtual bool recordingEnabled(); 63 virtual void releaseRecordingFrame(const sp<IMemory>& mem); 64 virtual status_t autoFocus(); 65 virtual status_t cancelAutoFocus(); 66 virtual status_t takePicture(int msgType); 67 virtual status_t setParameters(const String8& params); 68 virtual String8 getParameters() const; 69 virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2); 70 71 /** 72 * Interface used by CameraService 73 */ 74 75 Camera2Client(const sp<CameraService>& cameraService, 76 const sp<ICameraClient>& cameraClient, 77 int cameraId, 78 int cameraFacing, 79 int clientPid); 80 virtual ~Camera2Client(); 81 82 status_t initialize(camera_module_t *module); 83 84 virtual status_t dump(int fd, const Vector<String16>& args); 85 86 /** 87 * Interface used by Camera2Device 88 */ 89 90 virtual void notifyError(int errorCode, int arg1, int arg2); 91 virtual void notifyShutter(int frameNumber, nsecs_t timestamp); 92 virtual void notifyAutoFocus(uint8_t newState, int triggerId); 93 virtual void notifyAutoExposure(uint8_t newState, int triggerId); 94 virtual void notifyAutoWhitebalance(uint8_t newState, int triggerId); 95 96 /** 97 * Interface used by independent components of Camera2Client. 98 */ 99 100 int getCameraId() const; 101 const sp<Camera2Device>& getCameraDevice(); 102 const sp<CameraService>& getCameraService(); 103 camera2::SharedParameters& getParameters(); 104 105 int getPreviewStreamId() const; 106 int getCaptureStreamId() const; 107 int getCallbackStreamId() const; 108 int getRecordingStreamId() const; 109 int getZslStreamId() const; 110 111 status_t registerFrameListener(int32_t id, 112 wp<camera2::FrameProcessor::FilteredListener> listener); 113 status_t removeFrameListener(int32_t id); 114 115 // Simple class to ensure that access to ICameraClient is serialized by 116 // requiring mCameraClientLock to be locked before access to mCameraClient 117 // is possible. 118 class SharedCameraClient { 119 public: 120 class Lock { 121 public: 122 Lock(SharedCameraClient &client); 123 ~Lock(); 124 sp<ICameraClient> &mCameraClient; 125 private: 126 SharedCameraClient &mSharedClient; 127 }; 128 SharedCameraClient(const sp<ICameraClient>& client); 129 SharedCameraClient& operator=(const sp<ICameraClient>& client); 130 void clear(); 131 private: 132 sp<ICameraClient> mCameraClient; 133 mutable Mutex mCameraClientLock; 134 } mSharedCameraClient; 135 136 static size_t calculateBufferSize(int width, int height, 137 int format, int stride); 138 139 static const int32_t kPreviewRequestId = 1000; 140 static const int32_t kRecordRequestId = 2000; 141 static const int32_t kFirstCaptureRequestId = 3000; 142 143private: 144 /** ICamera interface-related private members */ 145 146 // Mutex that must be locked by methods implementing the ICamera interface. 147 // Ensures serialization between incoming ICamera calls. All methods below 148 // that append 'L' to the name assume that mICameraLock is locked when 149 // they're called 150 mutable Mutex mICameraLock; 151 152 typedef camera2::Parameters Parameters; 153 typedef camera2::CameraMetadata CameraMetadata; 154 155 status_t setPreviewWindowL(const sp<IBinder>& binder, 156 sp<ANativeWindow> window); 157 status_t startPreviewL(Parameters ¶ms, bool restart); 158 void stopPreviewL(); 159 status_t startRecordingL(Parameters ¶ms, bool restart); 160 bool recordingEnabledL(); 161 162 // Individual commands for sendCommand() 163 status_t commandStartSmoothZoomL(); 164 status_t commandStopSmoothZoomL(); 165 status_t commandSetDisplayOrientationL(int degrees); 166 status_t commandEnableShutterSoundL(bool enable); 167 status_t commandPlayRecordingSoundL(); 168 status_t commandStartFaceDetectionL(int type); 169 status_t commandStopFaceDetectionL(Parameters ¶ms); 170 status_t commandEnableFocusMoveMsgL(bool enable); 171 status_t commandPingL(); 172 status_t commandSetVideoBufferCountL(size_t count); 173 174 // Current camera device configuration 175 camera2::SharedParameters mParameters; 176 177 /** Camera device-related private members */ 178 179 void setPreviewCallbackFlagL(Parameters ¶ms, int flag); 180 status_t updateRequests(Parameters ¶ms); 181 182 // Used with stream IDs 183 static const int NO_STREAM = -1; 184 185 sp<camera2::FrameProcessor> mFrameProcessor; 186 187 /* Preview related members */ 188 189 int mPreviewStreamId; 190 CameraMetadata mPreviewRequest; 191 sp<IBinder> mPreviewSurface; 192 sp<ANativeWindow> mPreviewWindow; 193 194 status_t updatePreviewRequest(const Parameters ¶ms); 195 status_t updatePreviewStream(const Parameters ¶ms); 196 197 /** Preview callback related members */ 198 199 sp<camera2::CallbackProcessor> mCallbackProcessor; 200 201 /* Still image capture related members */ 202 203 sp<camera2::CaptureSequencer> mCaptureSequencer; 204 sp<camera2::JpegProcessor> mJpegProcessor; 205 sp<camera2::ZslProcessor> mZslProcessor; 206 207 /* Recording related members */ 208 209 int mRecordingStreamId; 210 int mRecordingFrameCount; 211 sp<BufferItemConsumer> mRecordingConsumer; 212 sp<ANativeWindow> mRecordingWindow; 213 // Simple listener that forwards frame available notifications from 214 // a CPU consumer to the recording notification 215 class RecordingWaiter: public BufferItemConsumer::FrameAvailableListener { 216 public: 217 RecordingWaiter(Camera2Client *parent) : mParent(parent) {} 218 void onFrameAvailable() { mParent->onRecordingFrameAvailable(); } 219 private: 220 Camera2Client *mParent; 221 }; 222 sp<RecordingWaiter> mRecordingWaiter; 223 CameraMetadata mRecordingRequest; 224 sp<camera2::Camera2Heap> mRecordingHeap; 225 226 static const size_t kDefaultRecordingHeapCount = 8; 227 size_t mRecordingHeapCount; 228 Vector<BufferItemConsumer::BufferItem> mRecordingBuffers; 229 size_t mRecordingHeapHead, mRecordingHeapFree; 230 // Handle new recording image buffers 231 void onRecordingFrameAvailable(); 232 233 status_t updateRecordingRequest(const Parameters ¶ms); 234 status_t updateRecordingStream(const Parameters ¶ms); 235 236 /** Notification-related members */ 237 238 bool mAfInMotion; 239 240 /** Camera2Device instance wrapping HAL2 entry */ 241 242 sp<Camera2Device> mDevice; 243 244 /** Utility members */ 245 246 // Verify that caller is the owner of the camera 247 status_t checkPid(const char *checkLocation) const; 248}; 249 250}; // namespace android 251 252#endif 253