blob: 5d6cfaa50374ad62df4ef4ea74bdea044cf5754a [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 Murashkina140a6e2013-02-21 14:45:03 -080027#include <camera/CameraMetadata.h>
Igor Murashkin5835cc42013-02-20 19:29:53 -080028#include <gui/CpuConsumer.h>
Igor Murashkin634a5152013-02-20 17:15:11 -080029
Igor Murashkinc073ba52013-02-26 14:32:34 -080030#include <gui/Surface.h>
31
Igor Murashkina140a6e2013-02-21 14:45:03 -080032#include <utils/Condition.h>
33#include <utils/Mutex.h>
34
Igor Murashkinc073ba52013-02-26 14:32:34 -080035#include <camera/CameraBase.h>
36
Igor Murashkin634a5152013-02-20 17:15:11 -080037struct camera_metadata;
38
39namespace android {
40
Igor Murashkin5835cc42013-02-20 19:29:53 -080041// All callbacks on this class are concurrent
42// (they come from separate threads)
Igor Murashkin634a5152013-02-20 17:15:11 -080043class ProCameraListener : public CameraListener
44{
45public:
46 // Lock has been acquired. Write operations now available.
47 virtual void onLockAcquired() = 0;
Igor Murashkin53765732013-02-20 17:41:57 -080048 // Lock has been released with exclusiveUnlock.
Igor Murashkin634a5152013-02-20 17:15:11 -080049 virtual void onLockReleased() = 0;
Igor Murashkin53765732013-02-20 17:41:57 -080050 // Lock has been stolen by another client.
51 virtual void onLockStolen() = 0;
Igor Murashkin634a5152013-02-20 17:15:11 -080052
53 // Lock free.
54 virtual void onTriggerNotify(int32_t msgType, int32_t ext1, int32_t ext2)
55 = 0;
Igor Murashkin5835cc42013-02-20 19:29:53 -080056
57 // OnBufferReceived and OnRequestReceived can come in with any order,
58 // use android.sensor.timestamp and LockedBuffer.timestamp to correlate them
59
Igor Murashkinc073ba52013-02-26 14:32:34 -080060 // TODO: remove onBufferReceived
61
Igor Murashkin5835cc42013-02-20 19:29:53 -080062 // A new frame buffer has been received for this stream.
63 // -- This callback only fires for createStreamCpu streams
Igor Murashkina91537e2013-02-21 12:02:29 -080064 // -- Use buf.timestamp to correlate with metadata's
65 // android.sensor.timestamp
Igor Murashkin5835cc42013-02-20 19:29:53 -080066 // -- The buffer must not be accessed after this function call completes
67 virtual void onBufferReceived(int streamId,
68 const CpuConsumer::LockedBuffer& buf) = 0;
Igor Murashkina91537e2013-02-21 12:02:29 -080069 /**
70 * A new metadata buffer has been received.
71 * -- Ownership of request passes on to the callee, free with
72 * free_camera_metadata.
73 */
74 virtual void onResultReceived(int32_t frameId, camera_metadata* result) = 0;
Igor Murashkina140a6e2013-02-21 14:45:03 -080075
Igor Murashkinc073ba52013-02-26 14:32:34 -080076 // TODO: make onFrameAvailable pure virtual
Igor Murashkina140a6e2013-02-21 14:45:03 -080077
78 // A new frame buffer has been received for this stream.
79 // -- This callback only fires for createStreamCpu streams
80 // -- Use buf.timestamp to correlate with metadata's android.sensor.timestamp
81 // -- The buffer should be accessed with CpuConsumer::lockNextBuffer
82 // and CpuConsumer::unlockBuffer
Igor Murashkinc073ba52013-02-26 14:32:34 -080083 virtual void onFrameAvailable(int /*streamId*/,
84 const sp<CpuConsumer>& /*cpuConsumer*/) {
Igor Murashkina140a6e2013-02-21 14:45:03 -080085 }
86
Igor Murashkinc073ba52013-02-26 14:32:34 -080087 // TODO: Remove useOnFrameAvailable
Igor Murashkina140a6e2013-02-21 14:45:03 -080088 virtual bool useOnFrameAvailable() {
89 return false;
90 }
Igor Murashkin634a5152013-02-20 17:15:11 -080091};
92
Igor Murashkinc073ba52013-02-26 14:32:34 -080093class ProCamera;
94
95template <>
96struct CameraTraits<ProCamera>
97{
98 typedef ProCameraListener TCamListener;
99 typedef IProCameraUser TCamUser;
100 typedef IProCameraCallbacks TCamCallbacks;
101};
102
103class ProCamera :
104 public CameraBase<ProCamera>,
105 public BnProCameraCallbacks
Igor Murashkin634a5152013-02-20 17:15:11 -0800106{
107public:
108 /**
109 * Connect a shared camera. By default access is restricted to read only
110 * (Lock free) operations. To be able to submit custom requests a lock needs
111 * to be acquired with exclusive[Try]Lock.
112 */
113 static sp<ProCamera> connect(int cameraId);
Igor Murashkin634a5152013-02-20 17:15:11 -0800114 virtual ~ProCamera();
115
Igor Murashkin634a5152013-02-20 17:15:11 -0800116 /**
117 * Exclusive Locks:
118 * - We may request exclusive access to a camera if no other
119 * clients are using the camera. This works as a traditional
120 * client, writing/reading any camera state.
121 * - An application opening the camera (a regular 'Camera') will
122 * always steal away the exclusive lock from a ProCamera,
123 * this will call onLockReleased.
124 * - onLockAcquired will be called again once it is possible
125 * to again exclusively lock the camera.
126 *
127 */
128
129 /**
130 * All exclusiveLock/unlock functions are asynchronous. The remote endpoint
131 * shall not block while waiting to acquire the lock. Instead the lock
132 * notifications will come in asynchronously on the listener.
133 */
134
135 /**
136 * Attempt to acquire the lock instantly (non-blocking)
137 * - If this succeeds, you do not need to wait for onLockAcquired
138 * but the event will still be fired
139 *
140 * Returns -EBUSY if already locked. 0 on success.
141 */
142 status_t exclusiveTryLock();
143 // always returns 0. wait for onLockAcquired before lock is acquired.
144 status_t exclusiveLock();
145 // release a lock if we have one, or cancel the lock request.
146 status_t exclusiveUnlock();
147
148 // exclusive lock = do whatever we want. no lock = read only.
149 bool hasExclusiveLock();
150
151 /**
152 * < 0 error, >= 0 the request ID. streaming to have the request repeat
153 * until cancelled.
154 * The request queue is flushed when a lock is released or stolen
155 * if not locked will return PERMISSION_DENIED
156 */
157 int submitRequest(const struct camera_metadata* metadata,
158 bool streaming = false);
159 // if not locked will return PERMISSION_DENIED, BAD_VALUE if requestId bad
160 status_t cancelRequest(int requestId);
161
162 /**
163 * Ask for a stream to be enabled.
164 * Lock free. Service maintains counter of streams.
165 */
166 status_t requestStream(int streamId);
Igor Murashkin68506fd2013-02-20 17:57:31 -0800167// TODO: remove requestStream, its useless.
168
Igor Murashkin68506fd2013-02-20 17:57:31 -0800169 /**
Igor Murashkin5835cc42013-02-20 19:29:53 -0800170 * Delete a stream.
171 * Lock free.
Igor Murashkinbfc99152013-02-27 12:55:20 -0800172 *
173 * NOTE: As a side effect this cancels ALL streaming requests.
174 *
Igor Murashkin68506fd2013-02-20 17:57:31 -0800175 * Errors: BAD_VALUE if unknown stream ID.
Igor Murashkin5835cc42013-02-20 19:29:53 -0800176 * PERMISSION_DENIED if the stream wasn't yours
Igor Murashkin68506fd2013-02-20 17:57:31 -0800177 */
Igor Murashkin5835cc42013-02-20 19:29:53 -0800178 status_t deleteStream(int streamId);
Igor Murashkin634a5152013-02-20 17:15:11 -0800179
Igor Murashkin68506fd2013-02-20 17:57:31 -0800180 /**
181 * Create a new HW stream, whose sink will be the window.
182 * Lock free. Service maintains counter of streams.
183 * Errors: -EBUSY if too many streams created
184 */
185 status_t createStream(int width, int height, int format,
Igor Murashkin985fd302013-02-20 18:24:43 -0800186 const sp<Surface>& surface,
Igor Murashkin68506fd2013-02-20 17:57:31 -0800187 /*out*/
188 int* streamId);
189
190 /**
191 * Create a new HW stream, whose sink will be the SurfaceTexture.
192 * Lock free. Service maintains counter of streams.
193 * Errors: -EBUSY if too many streams created
194 */
195 status_t createStream(int width, int height, int format,
196 const sp<IGraphicBufferProducer>& bufferProducer,
197 /*out*/
198 int* streamId);
Igor Murashkin5835cc42013-02-20 19:29:53 -0800199 status_t createStreamCpu(int width, int height, int format,
200 int heapCount,
201 /*out*/
Igor Murashkina140a6e2013-02-21 14:45:03 -0800202 sp<CpuConsumer>* cpuConsumer,
Igor Murashkin5835cc42013-02-20 19:29:53 -0800203 int* streamId);
Igor Murashkinba5ca4e2013-02-28 11:21:00 -0800204 status_t createStreamCpu(int width, int height, int format,
205 int heapCount,
206 bool synchronousMode,
207 /*out*/
208 sp<CpuConsumer>* cpuConsumer,
209 int* streamId);
Igor Murashkin68506fd2013-02-20 17:57:31 -0800210
211 // Create a request object from a template.
212 status_t createDefaultRequest(int templateId,
213 /*out*/
214 camera_metadata** request) const;
215
Igor Murashkin68506fd2013-02-20 17:57:31 -0800216 // Get static camera metadata
Igor Murashkin7b33a742013-02-21 13:49:26 -0800217 camera_metadata* getCameraInfo(int cameraId);
Igor Murashkin68506fd2013-02-20 17:57:31 -0800218
Igor Murashkina140a6e2013-02-21 14:45:03 -0800219 // Blocks until a frame is available (CPU streams only)
220 // - Obtain the frame data by calling CpuConsumer::lockNextBuffer
221 // - Release the frame data after use with CpuConsumer::unlockBuffer
Igor Murashkin4bc4a382013-02-20 13:36:17 -0800222 // Return value:
223 // - >0 - number of frames available to be locked
224 // - <0 - error (refer to error codes)
Igor Murashkina140a6e2013-02-21 14:45:03 -0800225 // Error codes:
226 // -ETIMEDOUT if it took too long to get a frame
Igor Murashkin4bc4a382013-02-20 13:36:17 -0800227 int waitForFrameBuffer(int streamId);
Igor Murashkina140a6e2013-02-21 14:45:03 -0800228
229 // Blocks until a metadata result is available
230 // - Obtain the metadata by calling consumeFrameMetadata()
231 // Error codes:
232 // -ETIMEDOUT if it took too long to get a frame
233 status_t waitForFrameMetadata();
234
235 // Get the latest metadata. This is destructive.
236 // - Calling this repeatedly will produce empty metadata objects.
237 // - Use waitForFrameMetadata to sync until new data is available.
238 CameraMetadata consumeFrameMetadata();
239
Igor Murashkin4bc4a382013-02-20 13:36:17 -0800240 // Convenience method to drop frame buffers (CPU streams only)
241 // Return values:
242 // >=0 - number of frames dropped (up to count)
243 // <0 - error code
244 // Error codes:
245 // BAD_VALUE - invalid streamId or count passed
246 int dropFrameBuffer(int streamId, int count);
247
Igor Murashkin634a5152013-02-20 17:15:11 -0800248protected:
249 ////////////////////////////////////////////////////////
250 // IProCameraCallbacks implementation
251 ////////////////////////////////////////////////////////
252 virtual void notifyCallback(int32_t msgType, int32_t ext,
253 int32_t ext2);
254 virtual void dataCallback(int32_t msgType,
255 const sp<IMemory>& dataPtr,
256 camera_frame_metadata_t *metadata);
257 virtual void dataCallbackTimestamp(nsecs_t timestamp,
258 int32_t msgType,
259 const sp<IMemory>& dataPtr);
Igor Murashkin53765732013-02-20 17:41:57 -0800260 virtual void onLockStatusChanged(
261 IProCameraCallbacks::LockStatus newLockStatus);
Igor Murashkin634a5152013-02-20 17:15:11 -0800262
Igor Murashkina91537e2013-02-21 12:02:29 -0800263 virtual void onResultReceived(int32_t frameId,
264 camera_metadata* result);
Igor Murashkin634a5152013-02-20 17:15:11 -0800265private:
Igor Murashkinc073ba52013-02-26 14:32:34 -0800266 ProCamera(int cameraId);
Igor Murashkin634a5152013-02-20 17:15:11 -0800267
Igor Murashkin5835cc42013-02-20 19:29:53 -0800268 class ProFrameListener : public CpuConsumer::FrameAvailableListener {
269 public:
270 ProFrameListener(wp<ProCamera> camera, int streamID) {
271 mCamera = camera;
272 mStreamId = streamID;
273 }
274
275 protected:
276 virtual void onFrameAvailable() {
277 sp<ProCamera> c = mCamera.promote();
278 if (c.get() != NULL) {
279 c->onFrameAvailable(mStreamId);
280 }
281 }
282
283 private:
284 wp<ProCamera> mCamera;
285 int mStreamId;
286 };
287 friend class ProFrameListener;
288
289 struct StreamInfo
290 {
291 StreamInfo(int streamId) {
292 this->streamID = streamId;
293 cpuStream = false;
Igor Murashkin4bc4a382013-02-20 13:36:17 -0800294 frameReady = 0;
Igor Murashkin5835cc42013-02-20 19:29:53 -0800295 }
296
297 StreamInfo() {
298 streamID = -1;
299 cpuStream = false;
300 }
301
302 int streamID;
303 bool cpuStream;
304 sp<CpuConsumer> cpuConsumer;
Igor Murashkinba5ca4e2013-02-28 11:21:00 -0800305 bool synchronousMode;
Igor Murashkin5835cc42013-02-20 19:29:53 -0800306 sp<ProFrameListener> frameAvailableListener;
307 sp<Surface> stc;
Igor Murashkin4bc4a382013-02-20 13:36:17 -0800308 int frameReady;
Igor Murashkin5835cc42013-02-20 19:29:53 -0800309 };
310
Igor Murashkina140a6e2013-02-21 14:45:03 -0800311 Condition mWaitCondition;
312 Mutex mWaitMutex;
313 static const nsecs_t mWaitTimeout = 1000000000; // 1sec
Igor Murashkin5835cc42013-02-20 19:29:53 -0800314 KeyedVector<int, StreamInfo> mStreams;
Igor Murashkina140a6e2013-02-21 14:45:03 -0800315 bool mMetadataReady;
316 CameraMetadata mLatestMetadata;
Igor Murashkin5835cc42013-02-20 19:29:53 -0800317
318 void onFrameAvailable(int streamId);
319
320 StreamInfo& getStreamInfo(int streamId);
321
Igor Murashkinc073ba52013-02-26 14:32:34 -0800322 friend class CameraBase;
Igor Murashkin634a5152013-02-20 17:15:11 -0800323};
324
325}; // namespace android
326
327#endif