blob: 1eb024a56185f4206b8a3cf3fefb00516cab9e72 [file] [log] [blame]
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001/*
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 Talvala2e19c3c2012-08-26 09:29:28 -070022#include "camera2/Parameters.h"
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -070023#include "camera2/FrameProcessor.h"
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -070024#include "camera2/JpegProcessor.h"
25#include "camera2/ZslProcessor.h"
26#include "camera2/CaptureSequencer.h"
Eino-Ville Talvalad86a6882012-08-28 11:34:14 -070027#include "camera2/CallbackProcessor.h"
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -070028#include <binder/MemoryBase.h>
29#include <binder/MemoryHeapBase.h>
30#include <gui/CpuConsumer.h>
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -070031#include <gui/BufferItemConsumer.h>
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070032
33namespace android {
34
35/**
36 * Implements the android.hardware.camera API on top of
37 * camera device HAL version 2.
38 */
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -070039class Camera2Client :
40 public CameraService::Client,
Eino-Ville Talvalac8474b62012-08-24 16:30:44 -070041 public Camera2Device::NotificationListener
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070042{
43public:
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -070044 /**
45 * ICamera interface (see ICamera for details)
46 */
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -070047
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070048 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);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -070053 virtual status_t setPreviewTexture(
54 const sp<ISurfaceTexture>& surfaceTexture);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070055 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
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -070071 /**
72 * Interface used by CameraService
73 */
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -070074
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070075 Camera2Client(const sp<CameraService>& cameraService,
76 const sp<ICameraClient>& cameraClient,
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070077 int cameraId,
78 int cameraFacing,
79 int clientPid);
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -070080 virtual ~Camera2Client();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070081
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070082 status_t initialize(camera_module_t *module);
83
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070084 virtual status_t dump(int fd, const Vector<String16>& args);
85
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -070086 /**
87 * Interface used by Camera2Device
88 */
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -070089
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
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -070096 /**
97 * Interface used by independent components of Camera2Client.
98 */
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -070099
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700100 int getCameraId() const;
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700101 const sp<Camera2Device>& getCameraDevice();
Eino-Ville Talvala609acc02012-09-06 18:26:58 -0700102 const sp<CameraService>& getCameraService();
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700103 camera2::SharedParameters& getParameters();
104
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700105 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
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700115 // 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 };
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -0700128 SharedCameraClient(const sp<ICameraClient>& client);
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700129 SharedCameraClient& operator=(const sp<ICameraClient>& client);
130 void clear();
131 private:
132 sp<ICameraClient> mCameraClient;
133 mutable Mutex mCameraClientLock;
134 } mSharedCameraClient;
135
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -0700136 static size_t calculateBufferSize(int width, int height,
137 int format, int stride);
138
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700139 static const int32_t kPreviewRequestId = 1000;
140 static const int32_t kRecordRequestId = 2000;
141 static const int32_t kFirstCaptureRequestId = 3000;
142
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700143private:
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700144 /** ICamera interface-related private members */
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700145
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700146 // Mutex that must be locked by methods implementing the ICamera interface.
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700147 // 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
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700150 mutable Mutex mICameraLock;
151
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700152 typedef camera2::Parameters Parameters;
153 typedef camera2::CameraMetadata CameraMetadata;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700154
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700155 status_t setPreviewWindowL(const sp<IBinder>& binder,
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700156 sp<ANativeWindow> window);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700157 status_t startPreviewL(Parameters &params, bool restart);
158 void stopPreviewL();
159 status_t startRecordingL(Parameters &params, bool restart);
160 bool recordingEnabledL();
James Dong8da4cd72012-08-04 19:58:07 -0700161
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700162 // 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);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700169 status_t commandStopFaceDetectionL(Parameters &params);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700170 status_t commandEnableFocusMoveMsgL(bool enable);
171 status_t commandPingL();
172 status_t commandSetVideoBufferCountL(size_t count);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700173
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700174 // Current camera device configuration
175 camera2::SharedParameters mParameters;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700176
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700177 /** Camera device-related private members */
178
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700179 void setPreviewCallbackFlagL(Parameters &params, int flag);
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -0700180 status_t updateRequests(Parameters &params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700181
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700182 // Used with stream IDs
183 static const int NO_STREAM = -1;
184
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700185 sp<camera2::FrameProcessor> mFrameProcessor;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700186
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700187 /* Preview related members */
188
189 int mPreviewStreamId;
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700190 CameraMetadata mPreviewRequest;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700191 sp<IBinder> mPreviewSurface;
192 sp<ANativeWindow> mPreviewWindow;
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700193
194 status_t updatePreviewRequest(const Parameters &params);
195 status_t updatePreviewStream(const Parameters &params);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700196
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700197 /** Preview callback related members */
198
Eino-Ville Talvalad86a6882012-08-28 11:34:14 -0700199 sp<camera2::CallbackProcessor> mCallbackProcessor;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700200
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700201 /* Still image capture related members */
202
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700203 sp<camera2::CaptureSequencer> mCaptureSequencer;
204 sp<camera2::JpegProcessor> mJpegProcessor;
205 sp<camera2::ZslProcessor> mZslProcessor;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700206
207 /* Recording related members */
208
209 int mRecordingStreamId;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700210 int mRecordingFrameCount;
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700211 sp<BufferItemConsumer> mRecordingConsumer;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700212 sp<ANativeWindow> mRecordingWindow;
213 // Simple listener that forwards frame available notifications from
214 // a CPU consumer to the recording notification
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700215 class RecordingWaiter: public BufferItemConsumer::FrameAvailableListener {
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700216 public:
217 RecordingWaiter(Camera2Client *parent) : mParent(parent) {}
218 void onFrameAvailable() { mParent->onRecordingFrameAvailable(); }
219 private:
220 Camera2Client *mParent;
221 };
222 sp<RecordingWaiter> mRecordingWaiter;
Eino-Ville Talvalacab96a42012-08-24 11:29:22 -0700223 CameraMetadata mRecordingRequest;
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -0700224 sp<camera2::Camera2Heap> mRecordingHeap;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700225
James Dong983cf232012-08-01 16:39:55 -0700226 static const size_t kDefaultRecordingHeapCount = 8;
227 size_t mRecordingHeapCount;
Eino-Ville Talvala30e65e72012-08-21 13:30:45 -0700228 Vector<BufferItemConsumer::BufferItem> mRecordingBuffers;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700229 size_t mRecordingHeapHead, mRecordingHeapFree;
230 // Handle new recording image buffers
231 void onRecordingFrameAvailable();
Eino-Ville Talvala836b81f2012-07-27 11:35:21 -0700232
233 status_t updateRecordingRequest(const Parameters &params);
234 status_t updateRecordingStream(const Parameters &params);
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700235
Eino-Ville Talvala174181e2012-08-03 13:53:39 -0700236 /** Notification-related members */
237
238 bool mAfInMotion;
239
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700240 /** Camera2Device instance wrapping HAL2 entry */
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700241
242 sp<Camera2Device> mDevice;
243
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700244 /** Utility members */
245
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700246 // Verify that caller is the owner of the camera
247 status_t checkPid(const char *checkLocation) const;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700248};
249
250}; // namespace android
251
252#endif