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