blob: 80b88f4d478c36aa1a3c93ec3730a5df1ea49f01 [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
Eino-Ville Talvalab99c5b82013-02-06 17:20:07 -080020#include "CameraDeviceBase.h"
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070021#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 Talvala73bbd1f2012-09-26 10:45:47 -070024#include "camera2/StreamingProcessor.h"
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -070025#include "camera2/JpegProcessor.h"
26#include "camera2/ZslProcessor.h"
27#include "camera2/CaptureSequencer.h"
Eino-Ville Talvalad86a6882012-08-28 11:34:14 -070028#include "camera2/CallbackProcessor.h"
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070029
30namespace android {
31
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -070032class IMemory;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070033/**
Eino-Ville Talvalab99c5b82013-02-06 17:20:07 -080034 * Interface between android.hardware.Camera API and Camera HAL device for versions
35 * CAMERA_DEVICE_API_VERSION_2_0 and 3_0.
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070036 */
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -070037class Camera2Client :
38 public CameraService::Client,
Eino-Ville Talvalab99c5b82013-02-06 17:20:07 -080039 public CameraDeviceBase::NotificationListener
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070040{
41public:
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -070042 /**
43 * ICamera interface (see ICamera for details)
44 */
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -070045
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070046 virtual void disconnect();
47 virtual status_t connect(const sp<ICameraClient>& client);
48 virtual status_t lock();
49 virtual status_t unlock();
50 virtual status_t setPreviewDisplay(const sp<Surface>& surface);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -070051 virtual status_t setPreviewTexture(
Andy McFadden8ba01022012-12-18 09:46:54 -080052 const sp<IGraphicBufferProducer>& bufferProducer);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070053 virtual void setPreviewCallbackFlag(int flag);
54 virtual status_t startPreview();
55 virtual void stopPreview();
56 virtual bool previewEnabled();
57 virtual status_t storeMetaDataInBuffers(bool enabled);
58 virtual status_t startRecording();
59 virtual void stopRecording();
60 virtual bool recordingEnabled();
61 virtual void releaseRecordingFrame(const sp<IMemory>& mem);
62 virtual status_t autoFocus();
63 virtual status_t cancelAutoFocus();
64 virtual status_t takePicture(int msgType);
65 virtual status_t setParameters(const String8& params);
66 virtual String8 getParameters() const;
67 virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
68
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -070069 /**
70 * Interface used by CameraService
71 */
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -070072
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070073 Camera2Client(const sp<CameraService>& cameraService,
74 const sp<ICameraClient>& cameraClient,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -080075 const String16& clientPackageName,
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070076 int cameraId,
77 int cameraFacing,
Igor Murashkinecf17e82012-10-02 16:05:11 -070078 int clientPid,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -080079 uid_t clientUid,
Eino-Ville Talvalab99c5b82013-02-06 17:20:07 -080080 int servicePid,
81 int deviceVersion);
82
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -070083 virtual ~Camera2Client();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070084
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070085 status_t initialize(camera_module_t *module);
86
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070087 virtual status_t dump(int fd, const Vector<String16>& args);
88
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -070089 /**
Eino-Ville Talvalab99c5b82013-02-06 17:20:07 -080090 * Interface used by CameraDeviceBase
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -070091 */
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -070092
93 virtual void notifyError(int errorCode, int arg1, int arg2);
94 virtual void notifyShutter(int frameNumber, nsecs_t timestamp);
95 virtual void notifyAutoFocus(uint8_t newState, int triggerId);
96 virtual void notifyAutoExposure(uint8_t newState, int triggerId);
97 virtual void notifyAutoWhitebalance(uint8_t newState, int triggerId);
98
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -070099 /**
100 * Interface used by independent components of Camera2Client.
101 */
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700102
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700103 int getCameraId() const;
Eino-Ville Talvalab99c5b82013-02-06 17:20:07 -0800104 const sp<CameraDeviceBase>& getCameraDevice();
Eino-Ville Talvala609acc02012-09-06 18:26:58 -0700105 const sp<CameraService>& getCameraService();
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700106 camera2::SharedParameters& getParameters();
107
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700108 int getPreviewStreamId() const;
109 int getCaptureStreamId() const;
110 int getCallbackStreamId() const;
111 int getRecordingStreamId() const;
112 int getZslStreamId() const;
113
Eino-Ville Talvala4865c522012-10-02 13:30:28 -0700114 status_t registerFrameListener(int32_t minId, int32_t maxId,
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700115 wp<camera2::FrameProcessor::FilteredListener> listener);
Eino-Ville Talvala4865c522012-10-02 13:30:28 -0700116 status_t removeFrameListener(int32_t minId, int32_t maxId,
117 wp<camera2::FrameProcessor::FilteredListener> listener);
118
119 status_t stopStream();
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700120
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700121 // Simple class to ensure that access to ICameraClient is serialized by
122 // requiring mCameraClientLock to be locked before access to mCameraClient
123 // is possible.
124 class SharedCameraClient {
125 public:
126 class Lock {
127 public:
128 Lock(SharedCameraClient &client);
129 ~Lock();
130 sp<ICameraClient> &mCameraClient;
131 private:
132 SharedCameraClient &mSharedClient;
133 };
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -0700134 SharedCameraClient(const sp<ICameraClient>& client);
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700135 SharedCameraClient& operator=(const sp<ICameraClient>& client);
136 void clear();
137 private:
138 sp<ICameraClient> mCameraClient;
139 mutable Mutex mCameraClientLock;
140 } mSharedCameraClient;
141
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -0700142 static size_t calculateBufferSize(int width, int height,
143 int format, int stride);
144
Eino-Ville Talvala4865c522012-10-02 13:30:28 -0700145 static const int32_t kPreviewRequestIdStart = 10000000;
146 static const int32_t kPreviewRequestIdEnd = 20000000;
147
148 static const int32_t kRecordingRequestIdStart = 20000000;
149 static const int32_t kRecordingRequestIdEnd = 30000000;
150
151 static const int32_t kCaptureRequestIdStart = 30000000;
152 static const int32_t kCaptureRequestIdEnd = 40000000;
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700153
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700154private:
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700155 /** ICamera interface-related private members */
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700156
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700157 // Mutex that must be locked by methods implementing the ICamera interface.
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700158 // Ensures serialization between incoming ICamera calls. All methods below
159 // that append 'L' to the name assume that mICameraLock is locked when
160 // they're called
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700161 mutable Mutex mICameraLock;
162
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700163 typedef camera2::Parameters Parameters;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700164
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700165 status_t setPreviewWindowL(const sp<IBinder>& binder,
Eino-Ville Talvalabe0573b2012-06-15 12:42:30 -0700166 sp<ANativeWindow> window);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700167 status_t startPreviewL(Parameters &params, bool restart);
168 void stopPreviewL();
169 status_t startRecordingL(Parameters &params, bool restart);
170 bool recordingEnabledL();
James Dong8da4cd72012-08-04 19:58:07 -0700171
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700172 // Individual commands for sendCommand()
173 status_t commandStartSmoothZoomL();
174 status_t commandStopSmoothZoomL();
175 status_t commandSetDisplayOrientationL(int degrees);
176 status_t commandEnableShutterSoundL(bool enable);
177 status_t commandPlayRecordingSoundL();
178 status_t commandStartFaceDetectionL(int type);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700179 status_t commandStopFaceDetectionL(Parameters &params);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700180 status_t commandEnableFocusMoveMsgL(bool enable);
181 status_t commandPingL();
182 status_t commandSetVideoBufferCountL(size_t count);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700183
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700184 // Current camera device configuration
185 camera2::SharedParameters mParameters;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700186
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700187 /** Camera device-related private members */
188
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700189 void setPreviewCallbackFlagL(Parameters &params, int flag);
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -0700190 status_t updateRequests(Parameters &params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700191
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700192 // Used with stream IDs
193 static const int NO_STREAM = -1;
194
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700195 sp<camera2::FrameProcessor> mFrameProcessor;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700196
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700197 /* Preview/Recording related members */
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700198
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700199 sp<IBinder> mPreviewSurface;
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700200 sp<camera2::StreamingProcessor> mStreamingProcessor;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700201
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700202 /** Preview callback related members */
203
Eino-Ville Talvalad86a6882012-08-28 11:34:14 -0700204 sp<camera2::CallbackProcessor> mCallbackProcessor;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700205
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700206 /* Still image capture related members */
207
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700208 sp<camera2::CaptureSequencer> mCaptureSequencer;
209 sp<camera2::JpegProcessor> mJpegProcessor;
210 sp<camera2::ZslProcessor> mZslProcessor;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700211
Eino-Ville Talvala174181e2012-08-03 13:53:39 -0700212 /** Notification-related members */
213
214 bool mAfInMotion;
215
Eino-Ville Talvalab99c5b82013-02-06 17:20:07 -0800216 /** CameraDevice instance, wraps HAL camera device */
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700217
Eino-Ville Talvalab99c5b82013-02-06 17:20:07 -0800218 sp<CameraDeviceBase> mDevice;
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700219
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700220 /** Utility members */
221
Eino-Ville Talvala4865c522012-10-02 13:30:28 -0700222 // Wait until the camera device has received the latest control settings
223 status_t syncWithDevice();
224
Eino-Ville Talvala3a609142012-07-31 14:36:26 -0700225 // Verify that caller is the owner of the camera
226 status_t checkPid(const char *checkLocation) const;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700227};
228
229}; // namespace android
230
231#endif