1634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin/*
2634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * Copyright (C) 2013 The Android Open Source Project
3634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin *
4634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * you may not use this file except in compliance with the License.
6634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * You may obtain a copy of the License at
7634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin *
8634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin *
10634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * Unless required by applicable law or agreed to in writing, software
11634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * See the License for the specific language governing permissions and
14634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin * limitations under the License.
15634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin */
16634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
17634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#ifndef ANDROID_HARDWARE_PRO_CAMERA_H
18634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#define ANDROID_HARDWARE_PRO_CAMERA_H
19634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
20634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <utils/Timers.h>
215835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin#include <utils/KeyedVector.h>
22634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <gui/IGraphicBufferProducer.h>
23634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <system/camera.h>
24634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <camera/IProCameraCallbacks.h>
25634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <camera/IProCameraUser.h>
26634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <camera/Camera.h>
27a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin#include <camera/CameraMetadata.h>
280f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk#include <camera/ICameraService.h>
295835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin#include <gui/CpuConsumer.h>
30634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
31c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <gui/Surface.h>
32c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin
33a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin#include <utils/Condition.h>
34a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin#include <utils/Mutex.h>
35a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
36c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/CameraBase.h>
37c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin
38634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstruct camera_metadata;
39634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
40634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinnamespace android {
41634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
425835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin// All callbacks on this class are concurrent
435835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin// (they come from separate threads)
44fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkinclass ProCameraListener : virtual public RefBase
45634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{
46634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinpublic:
47fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2) = 0;
48fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin
49634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // Lock has been acquired. Write operations now available.
50634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual void onLockAcquired() = 0;
515376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    // Lock has been released with exclusiveUnlock.
52634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual void onLockReleased() = 0;
535376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    // Lock has been stolen by another client.
545376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    virtual void onLockStolen() = 0;
55634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
56634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // Lock free.
57634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual void onTriggerNotify(int32_t msgType, int32_t ext1, int32_t ext2)
58634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                                                                            = 0;
59fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    // onFrameAvailable and OnResultReceived can come in with any order,
605835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    // use android.sensor.timestamp and LockedBuffer.timestamp to correlate them
615835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
62a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    /**
63a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin      * A new metadata buffer has been received.
64a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin      * -- Ownership of request passes on to the callee, free with
65a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin      *    free_camera_metadata.
66a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin      */
67a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin    virtual void onResultReceived(int32_t frameId, camera_metadata* result) = 0;
68a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
69c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    // TODO: make onFrameAvailable pure virtual
70a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
71a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // A new frame buffer has been received for this stream.
72a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // -- This callback only fires for createStreamCpu streams
73fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    // -- A buffer may be obtained by calling cpuConsumer->lockNextBuffer
74fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    // -- Use buf.timestamp to correlate with result's android.sensor.timestamp
75a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // -- The buffer should be accessed with CpuConsumer::lockNextBuffer
76a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    //      and CpuConsumer::unlockBuffer
77c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    virtual void onFrameAvailable(int /*streamId*/,
78c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin                                  const sp<CpuConsumer>& /*cpuConsumer*/) {
79a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    }
80a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
81634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin};
82634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
83c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinclass ProCamera;
84c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin
85c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkintemplate <>
86c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinstruct CameraTraits<ProCamera>
87c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin{
88c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    typedef ProCameraListener     TCamListener;
89c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    typedef IProCameraUser        TCamUser;
90c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    typedef IProCameraCallbacks   TCamCallbacks;
910f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk    typedef status_t (ICameraService::*TCamConnectService)(const sp<IProCameraCallbacks>&,
920f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                                                           int, const String16&, int,
930f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                                                           /*out*/
940f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                                                           sp<IProCameraUser>&);
950f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk    static TCamConnectService     fnConnectService;
96c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin};
97c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin
980f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk
99c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinclass ProCamera :
100c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    public CameraBase<ProCamera>,
101c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    public BnProCameraCallbacks
102634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{
103634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinpublic:
104634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    /**
105634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     * Connect a shared camera. By default access is restricted to read only
106634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     * (Lock free) operations. To be able to submit custom requests a lock needs
107634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     * to be acquired with exclusive[Try]Lock.
108634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     */
109634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    static sp<ProCamera> connect(int cameraId);
110634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual ~ProCamera();
111634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
112634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    /**
113634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     * Exclusive Locks:
114634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     * - We may request exclusive access to a camera if no other
115634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     *   clients are using the camera. This works as a traditional
116634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     *   client, writing/reading any camera state.
117634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     * - An application opening the camera (a regular 'Camera') will
118634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     *   always steal away the exclusive lock from a ProCamera,
119634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     *   this will call onLockReleased.
120634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     * - onLockAcquired will be called again once it is possible
121634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     *   to again exclusively lock the camera.
122634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     *
123634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     */
124634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
125634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    /**
126634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     * All exclusiveLock/unlock functions are asynchronous. The remote endpoint
127634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     * shall not block while waiting to acquire the lock. Instead the lock
128634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     * notifications will come in asynchronously on the listener.
129634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     */
130634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
131634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    /**
132634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin      * Attempt to acquire the lock instantly (non-blocking)
133634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin      * - If this succeeds, you do not need to wait for onLockAcquired
134634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin      *   but the event will still be fired
135634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin      *
136634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin      * Returns -EBUSY if already locked. 0 on success.
137634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin      */
138634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    status_t exclusiveTryLock();
139634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // always returns 0. wait for onLockAcquired before lock is acquired.
140634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    status_t exclusiveLock();
141634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // release a lock if we have one, or cancel the lock request.
142634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    status_t exclusiveUnlock();
143634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
144634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // exclusive lock = do whatever we want. no lock = read only.
145634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    bool hasExclusiveLock();
146634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
147634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    /**
148634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     * < 0 error, >= 0 the request ID. streaming to have the request repeat
149634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     *    until cancelled.
150634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     * The request queue is flushed when a lock is released or stolen
151634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     *    if not locked will return PERMISSION_DENIED
152634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     */
153634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    int submitRequest(const struct camera_metadata* metadata,
154634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                                                        bool streaming = false);
155634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // if not locked will return PERMISSION_DENIED, BAD_VALUE if requestId bad
156634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    status_t cancelRequest(int requestId);
157634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
158634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    /**
159634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     * Ask for a stream to be enabled.
160634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     * Lock free. Service maintains counter of streams.
161634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin     */
162634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    status_t requestStream(int streamId);
16368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin// TODO: remove requestStream, its useless.
16468506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
16568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    /**
1665835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin      * Delete a stream.
1675835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin      * Lock free.
168bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin      *
169bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin      * NOTE: As a side effect this cancels ALL streaming requests.
170bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin      *
17168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin      * Errors: BAD_VALUE if unknown stream ID.
1725835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin      *         PERMISSION_DENIED if the stream wasn't yours
17368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin      */
1745835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    status_t deleteStream(int streamId);
175634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
17668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    /**
17768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin      * Create a new HW stream, whose sink will be the window.
17868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin      * Lock free. Service maintains counter of streams.
17968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin      * Errors: -EBUSY if too many streams created
18068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin      */
18168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    status_t createStream(int width, int height, int format,
182985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin                          const sp<Surface>& surface,
18368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin                          /*out*/
18468506fd58d26748617babe94d5648503cb3690bbIgor Murashkin                          int* streamId);
18568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
18668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    /**
18768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin      * Create a new HW stream, whose sink will be the SurfaceTexture.
18868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin      * Lock free. Service maintains counter of streams.
18968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin      * Errors: -EBUSY if too many streams created
19068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin      */
19168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    status_t createStream(int width, int height, int format,
19268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin                          const sp<IGraphicBufferProducer>& bufferProducer,
19368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin                          /*out*/
19468506fd58d26748617babe94d5648503cb3690bbIgor Murashkin                          int* streamId);
1955835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    status_t createStreamCpu(int width, int height, int format,
1965835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin                          int heapCount,
1975835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin                          /*out*/
198a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin                          sp<CpuConsumer>* cpuConsumer,
1995835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin                          int* streamId);
200ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin    status_t createStreamCpu(int width, int height, int format,
201ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin                          int heapCount,
202ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin                          bool synchronousMode,
203ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin                          /*out*/
204ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin                          sp<CpuConsumer>* cpuConsumer,
205ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin                          int* streamId);
20668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
20768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    // Create a request object from a template.
20868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    status_t createDefaultRequest(int templateId,
20968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin                                 /*out*/
21068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin                                  camera_metadata** request) const;
21168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
21268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin    // Get static camera metadata
2137b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin    camera_metadata* getCameraInfo(int cameraId);
21468506fd58d26748617babe94d5648503cb3690bbIgor Murashkin
215a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // Blocks until a frame is available (CPU streams only)
216a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // - Obtain the frame data by calling CpuConsumer::lockNextBuffer
217a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // - Release the frame data after use with CpuConsumer::unlockBuffer
2184bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    // Return value:
2194bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    // - >0 - number of frames available to be locked
2204bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    // - <0 - error (refer to error codes)
221a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // Error codes:
222a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // -ETIMEDOUT if it took too long to get a frame
2234bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    int waitForFrameBuffer(int streamId);
224a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
225a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // Blocks until a metadata result is available
226a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // - Obtain the metadata by calling consumeFrameMetadata()
227a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // Error codes:
228a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // -ETIMEDOUT if it took too long to get a frame
229a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    status_t waitForFrameMetadata();
230a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
231a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // Get the latest metadata. This is destructive.
232a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // - Calling this repeatedly will produce empty metadata objects.
233a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    // - Use waitForFrameMetadata to sync until new data is available.
234a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    CameraMetadata consumeFrameMetadata();
235a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin
2364bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    // Convenience method to drop frame buffers (CPU streams only)
2374bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    // Return values:
2384bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    //  >=0 - number of frames dropped (up to count)
2394bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    //  <0  - error code
2404bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    // Error codes:
2414bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    //   BAD_VALUE - invalid streamId or count passed
2424bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin    int dropFrameBuffer(int streamId, int count);
2434bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin
244634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinprotected:
245634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    ////////////////////////////////////////////////////////
246634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // IProCameraCallbacks implementation
247634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    ////////////////////////////////////////////////////////
248fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    virtual void        notifyCallback(int32_t msgType,
249fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin                                       int32_t ext,
250634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                                       int32_t ext2);
251fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin
2525376573eff55f370f041889618c9a7a9e1894615Igor Murashkin    virtual void        onLockStatusChanged(
2535376573eff55f370f041889618c9a7a9e1894615Igor Murashkin                                IProCameraCallbacks::LockStatus newLockStatus);
254634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
255f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual void        onResultReceived(int32_t requestId,
256a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin                                         camera_metadata* result);
257634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinprivate:
258c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    ProCamera(int cameraId);
259634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
2605835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    class ProFrameListener : public CpuConsumer::FrameAvailableListener {
2615835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    public:
2625835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        ProFrameListener(wp<ProCamera> camera, int streamID) {
2635835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            mCamera = camera;
2645835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            mStreamId = streamID;
2655835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        }
2665835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
2675835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    protected:
26804f101c35eaa90b1f95939afac30674ec1611e6fDan Stoza        virtual void onFrameAvailable(const BufferItem& /* item */) {
2695835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            sp<ProCamera> c = mCamera.promote();
2705835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            if (c.get() != NULL) {
2715835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin                c->onFrameAvailable(mStreamId);
2725835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            }
2735835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        }
2745835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
2755835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    private:
2765835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        wp<ProCamera> mCamera;
2775835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        int mStreamId;
2785835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    };
2795835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    friend class ProFrameListener;
2805835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
2815835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    struct StreamInfo
2825835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    {
2835835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        StreamInfo(int streamId) {
2845835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            this->streamID = streamId;
2855835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            cpuStream = false;
2864bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin            frameReady = 0;
2875835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        }
2885835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
2895835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        StreamInfo() {
2905835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            streamID = -1;
2915835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin            cpuStream = false;
2925835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        }
2935835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
2945835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        int  streamID;
2955835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        bool cpuStream;
2965835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        sp<CpuConsumer> cpuConsumer;
297ba5ca4ee770fa0fe9e14990fd13b23f1010f5c98Igor Murashkin        bool synchronousMode;
2985835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        sp<ProFrameListener> frameAvailableListener;
2995835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin        sp<Surface> stc;
3004bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin        int frameReady;
3015835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    };
3025835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
303a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    Condition mWaitCondition;
304a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    Mutex     mWaitMutex;
305a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    static const nsecs_t mWaitTimeout = 1000000000; // 1sec
3065835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    KeyedVector<int, StreamInfo> mStreams;
307a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    bool mMetadataReady;
308a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin    CameraMetadata mLatestMetadata;
3095835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
3105835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    void onFrameAvailable(int streamId);
3115835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
3125835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin    StreamInfo& getStreamInfo(int streamId);
3135835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin
314c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    friend class CameraBase;
315634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin};
316634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
317634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}; // namespace android
318634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
319634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#endif
320