1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (C) 2013 The Android Open Source Project
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Licensed under the Apache License, Version 2.0 (the "License");
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * you may not use this file except in compliance with the License.
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * You may obtain a copy of the License at
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *      http://www.apache.org/licenses/LICENSE-2.0
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Unless required by applicable law or agreed to in writing, software
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * distributed under the License is distributed on an "AS IS" BASIS,
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * See the License for the specific language governing permissions and
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * limitations under the License.
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef ANDROID_HARDWARE_PRO_CAMERA_H
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define ANDROID_HARDWARE_PRO_CAMERA_H
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <utils/Timers.h>
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <utils/KeyedVector.h>
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <gui/IGraphicBufferProducer.h>
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <system/camera.h>
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <camera/IProCameraCallbacks.h>
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <camera/IProCameraUser.h>
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <camera/Camera.h>
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <camera/CameraMetadata.h>
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <camera/ICameraService.h>
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <gui/CpuConsumer.h>
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <gui/Surface.h>
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <utils/Condition.h>
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <utils/Mutex.h>
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <camera/CameraBase.h>
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct camera_metadata;
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace android {
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// All callbacks on this class are concurrent
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// (they come from separate threads)
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass ProCameraListener : virtual public RefBase
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2) = 0;
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Lock has been acquired. Write operations now available.
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void onLockAcquired() = 0;
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Lock has been released with exclusiveUnlock.
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void onLockReleased() = 0;
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Lock has been stolen by another client.
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void onLockStolen() = 0;
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Lock free.
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void onTriggerNotify(int32_t msgType, int32_t ext1, int32_t ext2)
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                                            = 0;
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // onFrameAvailable and OnResultReceived can come in with any order,
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // use android.sensor.timestamp and LockedBuffer.timestamp to correlate them
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /**
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      * A new metadata buffer has been received.
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      * -- Ownership of request passes on to the callee, free with
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      *    free_camera_metadata.
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      */
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void onResultReceived(int32_t frameId, camera_metadata* result) = 0;
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // TODO: make onFrameAvailable pure virtual
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // A new frame buffer has been received for this stream.
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // -- This callback only fires for createStreamCpu streams
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // -- A buffer may be obtained by calling cpuConsumer->lockNextBuffer
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // -- Use buf.timestamp to correlate with result's android.sensor.timestamp
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // -- The buffer should be accessed with CpuConsumer::lockNextBuffer
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    //      and CpuConsumer::unlockBuffer
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void onFrameAvailable(int /*streamId*/,
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                  const sp<CpuConsumer>& /*cpuConsumer*/) {
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass ProCamera;
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtemplate <>
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct CameraTraits<ProCamera>
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    typedef ProCameraListener     TCamListener;
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    typedef IProCameraUser        TCamUser;
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    typedef IProCameraCallbacks   TCamCallbacks;
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    typedef status_t (ICameraService::*TCamConnectService)(const sp<IProCameraCallbacks>&,
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                           int, const String16&, int,
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                           /*out*/
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                           sp<IProCameraUser>&);
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static TCamConnectService     fnConnectService;
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass ProCamera :
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    public CameraBase<ProCamera>,
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    public BnProCameraCallbacks
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /**
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * Connect a shared camera. By default access is restricted to read only
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * (Lock free) operations. To be able to submit custom requests a lock needs
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * to be acquired with exclusive[Try]Lock.
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     */
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static sp<ProCamera> connect(int cameraId);
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual ~ProCamera();
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /**
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * Exclusive Locks:
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * - We may request exclusive access to a camera if no other
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     *   clients are using the camera. This works as a traditional
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     *   client, writing/reading any camera state.
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * - An application opening the camera (a regular 'Camera') will
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     *   always steal away the exclusive lock from a ProCamera,
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     *   this will call onLockReleased.
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * - onLockAcquired will be called again once it is possible
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     *   to again exclusively lock the camera.
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     *
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     */
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /**
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * All exclusiveLock/unlock functions are asynchronous. The remote endpoint
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * shall not block while waiting to acquire the lock. Instead the lock
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * notifications will come in asynchronously on the listener.
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     */
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /**
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      * Attempt to acquire the lock instantly (non-blocking)
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      * - If this succeeds, you do not need to wait for onLockAcquired
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      *   but the event will still be fired
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      *
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      * Returns -EBUSY if already locked. 0 on success.
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      */
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    status_t exclusiveTryLock();
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // always returns 0. wait for onLockAcquired before lock is acquired.
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    status_t exclusiveLock();
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // release a lock if we have one, or cancel the lock request.
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    status_t exclusiveUnlock();
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // exclusive lock = do whatever we want. no lock = read only.
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool hasExclusiveLock();
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /**
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * < 0 error, >= 0 the request ID. streaming to have the request repeat
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     *    until cancelled.
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * The request queue is flushed when a lock is released or stolen
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     *    if not locked will return PERMISSION_DENIED
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     */
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int submitRequest(const struct camera_metadata* metadata,
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                        bool streaming = false);
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // if not locked will return PERMISSION_DENIED, BAD_VALUE if requestId bad
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    status_t cancelRequest(int requestId);
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /**
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * Ask for a stream to be enabled.
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * Lock free. Service maintains counter of streams.
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     */
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    status_t requestStream(int streamId);
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// TODO: remove requestStream, its useless.
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /**
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      * Delete a stream.
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      * Lock free.
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      *
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      * NOTE: As a side effect this cancels ALL streaming requests.
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      *
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      * Errors: BAD_VALUE if unknown stream ID.
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      *         PERMISSION_DENIED if the stream wasn't yours
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      */
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    status_t deleteStream(int streamId);
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /**
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      * Create a new HW stream, whose sink will be the window.
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      * Lock free. Service maintains counter of streams.
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      * Errors: -EBUSY if too many streams created
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      */
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    status_t createStream(int width, int height, int format,
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          const sp<Surface>& surface,
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          /*out*/
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          int* streamId);
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /**
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      * Create a new HW stream, whose sink will be the SurfaceTexture.
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      * Lock free. Service maintains counter of streams.
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      * Errors: -EBUSY if too many streams created
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      */
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    status_t createStream(int width, int height, int format,
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          const sp<IGraphicBufferProducer>& bufferProducer,
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          /*out*/
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          int* streamId);
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    status_t createStreamCpu(int width, int height, int format,
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          int heapCount,
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          /*out*/
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          sp<CpuConsumer>* cpuConsumer,
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          int* streamId);
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    status_t createStreamCpu(int width, int height, int format,
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          int heapCount,
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          bool synchronousMode,
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          /*out*/
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          sp<CpuConsumer>* cpuConsumer,
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          int* streamId);
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Create a request object from a template.
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    status_t createDefaultRequest(int templateId,
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                 /*out*/
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                  camera_metadata** request) const;
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Get static camera metadata
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    camera_metadata* getCameraInfo(int cameraId);
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Blocks until a frame is available (CPU streams only)
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // - Obtain the frame data by calling CpuConsumer::lockNextBuffer
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // - Release the frame data after use with CpuConsumer::unlockBuffer
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Return value:
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // - >0 - number of frames available to be locked
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // - <0 - error (refer to error codes)
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Error codes:
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // -ETIMEDOUT if it took too long to get a frame
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int waitForFrameBuffer(int streamId);
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Blocks until a metadata result is available
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // - Obtain the metadata by calling consumeFrameMetadata()
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Error codes:
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // -ETIMEDOUT if it took too long to get a frame
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    status_t waitForFrameMetadata();
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Get the latest metadata. This is destructive.
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // - Calling this repeatedly will produce empty metadata objects.
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // - Use waitForFrameMetadata to sync until new data is available.
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CameraMetadata consumeFrameMetadata();
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Convenience method to drop frame buffers (CPU streams only)
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Return values:
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    //  >=0 - number of frames dropped (up to count)
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    //  <0  - error code
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Error codes:
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    //   BAD_VALUE - invalid streamId or count passed
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int dropFrameBuffer(int streamId, int count);
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ////////////////////////////////////////////////////////
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // IProCameraCallbacks implementation
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ////////////////////////////////////////////////////////
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void        notifyCallback(int32_t msgType,
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                       int32_t ext,
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                       int32_t ext2);
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void        onLockStatusChanged(
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                IProCameraCallbacks::LockStatus newLockStatus);
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    virtual void        onResultReceived(int32_t requestId,
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                         camera_metadata* result);
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate:
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ProCamera(int cameraId);
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    class ProFrameListener : public CpuConsumer::FrameAvailableListener {
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    public:
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ProFrameListener(wp<ProCamera> camera, int streamID) {
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            mCamera = camera;
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            mStreamId = streamID;
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    protected:
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        virtual void onFrameAvailable(const BufferItem& /* item */) {
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            sp<ProCamera> c = mCamera.promote();
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (c.get() != NULL) {
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                c->onFrameAvailable(mStreamId);
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    private:
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        wp<ProCamera> mCamera;
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int mStreamId;
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    };
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    friend class ProFrameListener;
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    struct StreamInfo
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        StreamInfo(int streamId) {
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            this->streamID = streamId;
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            cpuStream = false;
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            frameReady = 0;
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        StreamInfo() {
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            streamID = -1;
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            cpuStream = false;
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int  streamID;
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        bool cpuStream;
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        sp<CpuConsumer> cpuConsumer;
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        bool synchronousMode;
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        sp<ProFrameListener> frameAvailableListener;
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        sp<Surface> stc;
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int frameReady;
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    };
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Condition mWaitCondition;
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Mutex     mWaitMutex;
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static const nsecs_t mWaitTimeout = 1000000000; // 1sec
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    KeyedVector<int, StreamInfo> mStreams;
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bool mMetadataReady;
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CameraMetadata mLatestMetadata;
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void onFrameAvailable(int streamId);
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    StreamInfo& getStreamInfo(int streamId);
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    friend class CameraBase;
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; // namespace android
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov