blob: 11904f9b98ca4c5a82e19a171bcb81c990d6ca30 [file] [log] [blame]
Igor Murashkin634a5152013-02-20 17:15:11 -08001/*
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_HARDWARE_PRO_CAMERA_H
18#define ANDROID_HARDWARE_PRO_CAMERA_H
19
20#include <utils/Timers.h>
Igor Murashkin5835cc42013-02-20 19:29:53 -080021#include <utils/KeyedVector.h>
Igor Murashkin634a5152013-02-20 17:15:11 -080022#include <gui/IGraphicBufferProducer.h>
23#include <system/camera.h>
24#include <camera/IProCameraCallbacks.h>
25#include <camera/IProCameraUser.h>
26#include <camera/Camera.h>
Igor Murashkin5835cc42013-02-20 19:29:53 -080027#include <gui/CpuConsumer.h>
Igor Murashkin634a5152013-02-20 17:15:11 -080028
29struct camera_metadata;
30
31namespace android {
32
Igor Murashkin5835cc42013-02-20 19:29:53 -080033// All callbacks on this class are concurrent
34// (they come from separate threads)
Igor Murashkin634a5152013-02-20 17:15:11 -080035class ProCameraListener : public CameraListener
36{
37public:
38 // Lock has been acquired. Write operations now available.
39 virtual void onLockAcquired() = 0;
Igor Murashkin53765732013-02-20 17:41:57 -080040 // Lock has been released with exclusiveUnlock.
Igor Murashkin634a5152013-02-20 17:15:11 -080041 virtual void onLockReleased() = 0;
Igor Murashkin53765732013-02-20 17:41:57 -080042 // Lock has been stolen by another client.
43 virtual void onLockStolen() = 0;
Igor Murashkin634a5152013-02-20 17:15:11 -080044
45 // Lock free.
46 virtual void onTriggerNotify(int32_t msgType, int32_t ext1, int32_t ext2)
47 = 0;
Igor Murashkin5835cc42013-02-20 19:29:53 -080048
49 // OnBufferReceived and OnRequestReceived can come in with any order,
50 // use android.sensor.timestamp and LockedBuffer.timestamp to correlate them
51
Igor Murashkin5835cc42013-02-20 19:29:53 -080052 // A new frame buffer has been received for this stream.
53 // -- This callback only fires for createStreamCpu streams
Igor Murashkina91537e2013-02-21 12:02:29 -080054 // -- Use buf.timestamp to correlate with metadata's
55 // android.sensor.timestamp
Igor Murashkin5835cc42013-02-20 19:29:53 -080056 // -- The buffer must not be accessed after this function call completes
57 virtual void onBufferReceived(int streamId,
58 const CpuConsumer::LockedBuffer& buf) = 0;
Igor Murashkina91537e2013-02-21 12:02:29 -080059 /**
60 * A new metadata buffer has been received.
61 * -- Ownership of request passes on to the callee, free with
62 * free_camera_metadata.
63 */
64 virtual void onResultReceived(int32_t frameId, camera_metadata* result) = 0;
Igor Murashkin634a5152013-02-20 17:15:11 -080065};
66
67class ProCamera : public BnProCameraCallbacks, public IBinder::DeathRecipient
68{
69public:
70 /**
71 * Connect a shared camera. By default access is restricted to read only
72 * (Lock free) operations. To be able to submit custom requests a lock needs
73 * to be acquired with exclusive[Try]Lock.
74 */
75 static sp<ProCamera> connect(int cameraId);
76 virtual void disconnect();
77 virtual ~ProCamera();
78
79 void setListener(const sp<ProCameraListener>& listener);
80
81 /**
82 * Exclusive Locks:
83 * - We may request exclusive access to a camera if no other
84 * clients are using the camera. This works as a traditional
85 * client, writing/reading any camera state.
86 * - An application opening the camera (a regular 'Camera') will
87 * always steal away the exclusive lock from a ProCamera,
88 * this will call onLockReleased.
89 * - onLockAcquired will be called again once it is possible
90 * to again exclusively lock the camera.
91 *
92 */
93
94 /**
95 * All exclusiveLock/unlock functions are asynchronous. The remote endpoint
96 * shall not block while waiting to acquire the lock. Instead the lock
97 * notifications will come in asynchronously on the listener.
98 */
99
100 /**
101 * Attempt to acquire the lock instantly (non-blocking)
102 * - If this succeeds, you do not need to wait for onLockAcquired
103 * but the event will still be fired
104 *
105 * Returns -EBUSY if already locked. 0 on success.
106 */
107 status_t exclusiveTryLock();
108 // always returns 0. wait for onLockAcquired before lock is acquired.
109 status_t exclusiveLock();
110 // release a lock if we have one, or cancel the lock request.
111 status_t exclusiveUnlock();
112
113 // exclusive lock = do whatever we want. no lock = read only.
114 bool hasExclusiveLock();
115
116 /**
117 * < 0 error, >= 0 the request ID. streaming to have the request repeat
118 * until cancelled.
119 * The request queue is flushed when a lock is released or stolen
120 * if not locked will return PERMISSION_DENIED
121 */
122 int submitRequest(const struct camera_metadata* metadata,
123 bool streaming = false);
124 // if not locked will return PERMISSION_DENIED, BAD_VALUE if requestId bad
125 status_t cancelRequest(int requestId);
126
127 /**
128 * Ask for a stream to be enabled.
129 * Lock free. Service maintains counter of streams.
130 */
131 status_t requestStream(int streamId);
Igor Murashkin68506fd2013-02-20 17:57:31 -0800132// TODO: remove requestStream, its useless.
133
Igor Murashkin68506fd2013-02-20 17:57:31 -0800134 /**
Igor Murashkin5835cc42013-02-20 19:29:53 -0800135 * Delete a stream.
136 * Lock free.
Igor Murashkin68506fd2013-02-20 17:57:31 -0800137 * Errors: BAD_VALUE if unknown stream ID.
Igor Murashkin5835cc42013-02-20 19:29:53 -0800138 * PERMISSION_DENIED if the stream wasn't yours
Igor Murashkin68506fd2013-02-20 17:57:31 -0800139 */
Igor Murashkin5835cc42013-02-20 19:29:53 -0800140 status_t deleteStream(int streamId);
Igor Murashkin634a5152013-02-20 17:15:11 -0800141
Igor Murashkin68506fd2013-02-20 17:57:31 -0800142 /**
143 * Create a new HW stream, whose sink will be the window.
144 * Lock free. Service maintains counter of streams.
145 * Errors: -EBUSY if too many streams created
146 */
147 status_t createStream(int width, int height, int format,
Igor Murashkin985fd302013-02-20 18:24:43 -0800148 const sp<Surface>& surface,
Igor Murashkin68506fd2013-02-20 17:57:31 -0800149 /*out*/
150 int* streamId);
151
152 /**
153 * Create a new HW stream, whose sink will be the SurfaceTexture.
154 * Lock free. Service maintains counter of streams.
155 * Errors: -EBUSY if too many streams created
156 */
157 status_t createStream(int width, int height, int format,
158 const sp<IGraphicBufferProducer>& bufferProducer,
159 /*out*/
160 int* streamId);
Igor Murashkin5835cc42013-02-20 19:29:53 -0800161 status_t createStreamCpu(int width, int height, int format,
162 int heapCount,
163 /*out*/
164 int* streamId);
Igor Murashkin68506fd2013-02-20 17:57:31 -0800165
166 // Create a request object from a template.
167 status_t createDefaultRequest(int templateId,
168 /*out*/
169 camera_metadata** request) const;
170
171 // Get number of cameras
172 static int getNumberOfCameras();
173
174 // Get static camera metadata
Igor Murashkin7b33a742013-02-21 13:49:26 -0800175 camera_metadata* getCameraInfo(int cameraId);
Igor Murashkin68506fd2013-02-20 17:57:31 -0800176
Igor Murashkin634a5152013-02-20 17:15:11 -0800177 sp<IProCameraUser> remote();
178
179protected:
180 ////////////////////////////////////////////////////////
181 // IProCameraCallbacks implementation
182 ////////////////////////////////////////////////////////
183 virtual void notifyCallback(int32_t msgType, int32_t ext,
184 int32_t ext2);
185 virtual void dataCallback(int32_t msgType,
186 const sp<IMemory>& dataPtr,
187 camera_frame_metadata_t *metadata);
188 virtual void dataCallbackTimestamp(nsecs_t timestamp,
189 int32_t msgType,
190 const sp<IMemory>& dataPtr);
Igor Murashkin53765732013-02-20 17:41:57 -0800191 virtual void onLockStatusChanged(
192 IProCameraCallbacks::LockStatus newLockStatus);
Igor Murashkin634a5152013-02-20 17:15:11 -0800193
Igor Murashkina91537e2013-02-21 12:02:29 -0800194 virtual void onResultReceived(int32_t frameId,
195 camera_metadata* result);
196
Igor Murashkin634a5152013-02-20 17:15:11 -0800197 class DeathNotifier: public IBinder::DeathRecipient
198 {
199 public:
200 DeathNotifier() {
201 }
202
203 virtual void binderDied(const wp<IBinder>& who);
204 };
205
206private:
207 ProCamera();
208
209 virtual void binderDied(const wp<IBinder>& who);
210
211 // helper function to obtain camera service handle
212 static const sp<ICameraService>& getCameraService();
213
214 static sp<DeathNotifier> mDeathNotifier;
215
216 sp<IProCameraUser> mCamera;
217 status_t mStatus;
218
219 sp<ProCameraListener> mListener;
220
221 friend class DeathNotifier;
222
223 static Mutex mLock;
224 static sp<ICameraService> mCameraService;
225
Igor Murashkin5835cc42013-02-20 19:29:53 -0800226 class ProFrameListener : public CpuConsumer::FrameAvailableListener {
227 public:
228 ProFrameListener(wp<ProCamera> camera, int streamID) {
229 mCamera = camera;
230 mStreamId = streamID;
231 }
232
233 protected:
234 virtual void onFrameAvailable() {
235 sp<ProCamera> c = mCamera.promote();
236 if (c.get() != NULL) {
237 c->onFrameAvailable(mStreamId);
238 }
239 }
240
241 private:
242 wp<ProCamera> mCamera;
243 int mStreamId;
244 };
245 friend class ProFrameListener;
246
247 struct StreamInfo
248 {
249 StreamInfo(int streamId) {
250 this->streamID = streamId;
251 cpuStream = false;
252 }
253
254 StreamInfo() {
255 streamID = -1;
256 cpuStream = false;
257 }
258
259 int streamID;
260 bool cpuStream;
261 sp<CpuConsumer> cpuConsumer;
262 sp<ProFrameListener> frameAvailableListener;
263 sp<Surface> stc;
264 };
265
266 KeyedVector<int, StreamInfo> mStreams;
267
268
269 void onFrameAvailable(int streamId);
270
271 StreamInfo& getStreamInfo(int streamId);
272
Igor Murashkin634a5152013-02-20 17:15:11 -0800273
274};
275
276}; // namespace android
277
278#endif