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