ProCamera.cpp revision c073ba525404f3416c2824c435d3d926a9892f1b
1634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin/* 2634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** 3634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** Copyright (C) 2013, The Android Open Source Project 4634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** 5634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** Licensed under the Apache License, Version 2.0 (the "License"); 6634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** you may not use this file except in compliance with the License. 7634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** You may obtain a copy of the License at 8634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** 9634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** http://www.apache.org/licenses/LICENSE-2.0 10634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** 11634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** Unless required by applicable law or agreed to in writing, software 12634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** distributed under the License is distributed on an "AS IS" BASIS, 13634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** See the License for the specific language governing permissions and 15634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** limitations under the License. 16634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin*/ 17634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 18634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin//#define LOG_NDEBUG 0 19634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#define LOG_TAG "ProCamera" 20634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <utils/Log.h> 21634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <utils/threads.h> 22634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <utils/Mutex.h> 23634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 24634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <binder/IPCThreadState.h> 25634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <binder/IServiceManager.h> 26634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <binder/IMemory.h> 27634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 28634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <camera/ProCamera.h> 29634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <camera/ICameraService.h> 30634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <camera/IProCameraUser.h> 31634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <camera/IProCameraCallbacks.h> 32634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 33634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <gui/IGraphicBufferProducer.h> 34634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 35a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin#include <system/camera_metadata.h> 36a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin 37634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinnamespace android { 38634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 39634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinsp<ProCamera> ProCamera::connect(int cameraId) 40634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 41c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin return CameraBaseT::connect(cameraId, String16(), 42c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin ICameraService::USE_CALLING_UID); 43634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 44634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 45c073ba525404f3416c2824c435d3d926a9892f1bIgor MurashkinProCamera::ProCamera(int cameraId) 46c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin : CameraBase(cameraId) 47634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 48634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 49634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 50634a51509ee50475f3e9f8ccf897e90fc72ded31Igor MurashkinProCamera::~ProCamera() 51634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 52634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 53634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 54634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 55c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin/* IProCameraUser's implementation */ 56634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 57634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// callback from camera service 58634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) 59634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 60c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin return CameraBaseT::notifyCallback(msgType, ext1, ext2); 61634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 62634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 63634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// callback from camera service when frame or image is ready 64634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr, 65634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin camera_frame_metadata_t *metadata) 66634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 67c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin return CameraBaseT::dataCallback(msgType, dataPtr, metadata); 68634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 69634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 70634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// callback from camera service when timestamped frame is ready 71634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinvoid ProCamera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, 72c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin const sp<IMemory>& dataPtr) 73634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 74c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin CameraBaseT::dataCallbackTimestamp(timestamp, msgType, dataPtr); 75634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 76634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 77634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 785376573eff55f370f041889618c9a7a9e1894615Igor Murashkinvoid ProCamera::onLockStatusChanged( 795376573eff55f370f041889618c9a7a9e1894615Igor Murashkin IProCameraCallbacks::LockStatus newLockStatus) 805376573eff55f370f041889618c9a7a9e1894615Igor Murashkin{ 815376573eff55f370f041889618c9a7a9e1894615Igor Murashkin ALOGV("%s: newLockStatus = %d", __FUNCTION__, newLockStatus); 825376573eff55f370f041889618c9a7a9e1894615Igor Murashkin 835376573eff55f370f041889618c9a7a9e1894615Igor Murashkin sp<ProCameraListener> listener; 845376573eff55f370f041889618c9a7a9e1894615Igor Murashkin { 855376573eff55f370f041889618c9a7a9e1894615Igor Murashkin Mutex::Autolock _l(mLock); 865376573eff55f370f041889618c9a7a9e1894615Igor Murashkin listener = mListener; 875376573eff55f370f041889618c9a7a9e1894615Igor Murashkin } 885376573eff55f370f041889618c9a7a9e1894615Igor Murashkin if (listener != NULL) { 895376573eff55f370f041889618c9a7a9e1894615Igor Murashkin switch (newLockStatus) { 905376573eff55f370f041889618c9a7a9e1894615Igor Murashkin case IProCameraCallbacks::LOCK_ACQUIRED: 915376573eff55f370f041889618c9a7a9e1894615Igor Murashkin listener->onLockAcquired(); 925376573eff55f370f041889618c9a7a9e1894615Igor Murashkin break; 935376573eff55f370f041889618c9a7a9e1894615Igor Murashkin case IProCameraCallbacks::LOCK_RELEASED: 945376573eff55f370f041889618c9a7a9e1894615Igor Murashkin listener->onLockReleased(); 955376573eff55f370f041889618c9a7a9e1894615Igor Murashkin break; 965376573eff55f370f041889618c9a7a9e1894615Igor Murashkin case IProCameraCallbacks::LOCK_STOLEN: 975376573eff55f370f041889618c9a7a9e1894615Igor Murashkin listener->onLockStolen(); 985376573eff55f370f041889618c9a7a9e1894615Igor Murashkin break; 995376573eff55f370f041889618c9a7a9e1894615Igor Murashkin default: 1005376573eff55f370f041889618c9a7a9e1894615Igor Murashkin ALOGE("%s: Unknown lock status: %d", 1015376573eff55f370f041889618c9a7a9e1894615Igor Murashkin __FUNCTION__, newLockStatus); 1025376573eff55f370f041889618c9a7a9e1894615Igor Murashkin } 1035376573eff55f370f041889618c9a7a9e1894615Igor Murashkin } 1045376573eff55f370f041889618c9a7a9e1894615Igor Murashkin} 1055376573eff55f370f041889618c9a7a9e1894615Igor Murashkin 106a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkinvoid ProCamera::onResultReceived(int32_t frameId, camera_metadata* result) { 107a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin ALOGV("%s: frameId = %d, result = %p", __FUNCTION__, frameId, result); 108a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin 109a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin sp<ProCameraListener> listener; 110a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin { 111a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin Mutex::Autolock _l(mLock); 112a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin listener = mListener; 113a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin } 114a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 115a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin CameraMetadata tmp(result); 116a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 117a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin // Unblock waitForFrame(id) callers 118a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin { 119a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin Mutex::Autolock al(mWaitMutex); 120a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin mMetadataReady = true; 121a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin mLatestMetadata = tmp; 122a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin mWaitCondition.broadcast(); 123a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin } 124a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 125a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin result = tmp.release(); 126a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 127a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin if (listener != NULL) { 128a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin listener->onResultReceived(frameId, result); 129a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin } else { 130a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin free_camera_metadata(result); 131a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin } 132a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin 133a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin} 134a91537e268f2b35f9f0dfdc0c4f84655c93285aeIgor Murashkin 135634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::exclusiveTryLock() 136634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 137634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 138634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 139634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 140634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->exclusiveTryLock(); 141634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 142634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::exclusiveLock() 143634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 144634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 145634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 146634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 147634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->exclusiveLock(); 148634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 149634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::exclusiveUnlock() 150634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 151634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 152634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 153634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 154634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->exclusiveUnlock(); 155634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 156634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinbool ProCamera::hasExclusiveLock() 157634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 158634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 159634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 160634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 161634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->hasExclusiveLock(); 162634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 163634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 164634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// Note that the callee gets a copy of the metadata. 165634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinint ProCamera::submitRequest(const struct camera_metadata* metadata, 166634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin bool streaming) 167634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 168634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 169634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 170634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 171634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->submitRequest(const_cast<struct camera_metadata*>(metadata), 172634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin streaming); 173634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 174634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 175634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t ProCamera::cancelRequest(int requestId) 176634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 177634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 178634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 179634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 180634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return c->cancelRequest(requestId); 181634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 182634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 1835835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkinstatus_t ProCamera::deleteStream(int streamId) 184634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{ 185634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin sp <IProCameraUser> c = mCamera; 186634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin if (c == 0) return NO_INIT; 187634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 1885835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin status_t s = c->cancelStream(streamId); 1895835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 1905835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin mStreams.removeItem(streamId); 191634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 1925835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return s; 193634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin} 194634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 19568506fd58d26748617babe94d5648503cb3690bbIgor Murashkinstatus_t ProCamera::createStream(int width, int height, int format, 196c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin const sp<Surface>& surface, 197c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin /*out*/ 198c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin int* streamId) 19968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin{ 20068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin *streamId = -1; 20168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 20268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin ALOGV("%s: createStreamW %dx%d (fmt=0x%x)", __FUNCTION__, width, height, 20368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin format); 20468506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 205985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin if (surface == 0) { 20668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin return BAD_VALUE; 20768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin } 20868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 209c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin return createStream(width, height, format, 210c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin surface->getIGraphicBufferProducer(), 2115835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin streamId); 21268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin} 21368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 21468506fd58d26748617babe94d5648503cb3690bbIgor Murashkinstatus_t ProCamera::createStream(int width, int height, int format, 215c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin const sp<IGraphicBufferProducer>& bufferProducer, 216c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin /*out*/ 217c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin int* streamId) { 2185835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin *streamId = -1; 21968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 22068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin ALOGV("%s: createStreamT %dx%d (fmt=0x%x)", __FUNCTION__, width, height, 22168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin format); 22268506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 2235835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (bufferProducer == 0) { 2245835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return BAD_VALUE; 2255835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin } 22668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 2275835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp <IProCameraUser> c = mCamera; 2285835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin status_t stat = c->createStream(width, height, format, bufferProducer, 2295835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin streamId); 23068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 2315835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (stat == OK) { 2325835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin StreamInfo s(*streamId); 2335835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 2345835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin mStreams.add(*streamId, s); 23568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin } 23668506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 237985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin return stat; 23868506fd58d26748617babe94d5648503cb3690bbIgor Murashkin} 23968506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 2405835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkinstatus_t ProCamera::createStreamCpu(int width, int height, int format, 241c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin int heapCount, 242c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin /*out*/ 243c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin sp<CpuConsumer>* cpuConsumer, 244c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin int* streamId) 2455835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin{ 2465835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin ALOGV("%s: createStreamW %dx%d (fmt=0x%x)", __FUNCTION__, width, height, 2475835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin format); 2485835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 249a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin *cpuConsumer = NULL; 250a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 2515835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp <IProCameraUser> c = mCamera; 2525835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (c == 0) return NO_INIT; 2535835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 2545835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp<CpuConsumer> cc = new CpuConsumer(heapCount); 2555835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin cc->setName(String8("ProCamera::mCpuConsumer")); 2565835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 2575835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp<Surface> stc = new Surface( 2585835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin cc->getProducerInterface()); 2595835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 260c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin status_t s = createStream(width, height, format, 261c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin stc->getIGraphicBufferProducer(), 262c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin streamId); 2635835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 2645835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin if (s != OK) { 2655835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin ALOGE("%s: Failure to create stream %dx%d (fmt=0x%x)", __FUNCTION__, 2665835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin width, height, format); 2675835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return s; 2685835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin } 2695835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 2705835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp<ProFrameListener> frameAvailableListener = 2715835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin new ProFrameListener(this, *streamId); 2725835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 2735835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin getStreamInfo(*streamId).cpuStream = true; 2745835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin getStreamInfo(*streamId).cpuConsumer = cc; 2755835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin getStreamInfo(*streamId).stc = stc; 2765835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin // for lifetime management 2775835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin getStreamInfo(*streamId).frameAvailableListener = frameAvailableListener; 2785835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 2795835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin cc->setFrameAvailableListener(frameAvailableListener); 2805835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 281a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin *cpuConsumer = cc; 282a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 2835835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return s; 2845835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin} 2855835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 28668506fd58d26748617babe94d5648503cb3690bbIgor Murashkincamera_metadata* ProCamera::getCameraInfo(int cameraId) { 28768506fd58d26748617babe94d5648503cb3690bbIgor Murashkin ALOGV("%s: cameraId = %d", __FUNCTION__, cameraId); 2887b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 2897b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin sp <IProCameraUser> c = mCamera; 2907b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin if (c == 0) return NULL; 2917b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 2927b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin camera_metadata* ptr = NULL; 2937b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin status_t status = c->getCameraInfo(cameraId, &ptr); 2947b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 2957b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin if (status != OK) { 2967b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin ALOGE("%s: Failed to get camera info, error = %d", __FUNCTION__, status); 2977b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin } 2987b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin 2997b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin return ptr; 30068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin} 30168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 30268506fd58d26748617babe94d5648503cb3690bbIgor Murashkinstatus_t ProCamera::createDefaultRequest(int templateId, 30368506fd58d26748617babe94d5648503cb3690bbIgor Murashkin camera_metadata** request) const { 30468506fd58d26748617babe94d5648503cb3690bbIgor Murashkin ALOGV("%s: templateId = %d", __FUNCTION__, templateId); 30568506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 306985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin sp <IProCameraUser> c = mCamera; 307985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin if (c == 0) return NO_INIT; 308985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin 309985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin return c->createDefaultRequest(templateId, request); 31068506fd58d26748617babe94d5648503cb3690bbIgor Murashkin} 31168506fd58d26748617babe94d5648503cb3690bbIgor Murashkin 3125835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkinvoid ProCamera::onFrameAvailable(int streamId) { 3135835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin ALOGV("%s: streamId = %d", __FUNCTION__, streamId); 3145835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3155835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin sp<ProCameraListener> listener = mListener; 316a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin StreamInfo& stream = getStreamInfo(streamId); 3175835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 318a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin CpuConsumer::LockedBuffer buf; 3195835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 320a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin if (listener.get() != NULL) { 321a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin if (listener->useOnFrameAvailable()) { 322a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin listener->onFrameAvailable(streamId, stream.cpuConsumer); 3235835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return; 3245835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin } 325a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin } 326a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 327a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin // Unblock waitForFrame(id) callers 328a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin { 329a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin Mutex::Autolock al(mWaitMutex); 3304bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin getStreamInfo(streamId).frameReady++; 331a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin mWaitCondition.broadcast(); 332a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin } 333a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin} 334a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 3354bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkinint ProCamera::waitForFrameBuffer(int streamId) { 336a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin status_t stat = BAD_VALUE; 337a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin Mutex::Autolock al(mWaitMutex); 3385835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 339a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin StreamInfo& si = getStreamInfo(streamId); 3405835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 3414bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin if (si.frameReady > 0) { 3424bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin int numFrames = si.frameReady; 3434bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin si.frameReady = 0; 3444bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin return numFrames; 345a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin } else { 346a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin while (true) { 347a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin stat = mWaitCondition.waitRelative(mWaitMutex, 348a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin mWaitTimeout); 349a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin if (stat != OK) { 350a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin ALOGE("%s: Error while waiting for frame buffer: %d", 351a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin __FUNCTION__, stat); 352a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin return stat; 353a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin } 354a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 3554bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin if (si.frameReady > 0) { 3564bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin int numFrames = si.frameReady; 3574bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin si.frameReady = 0; 3584bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin return numFrames; 359a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin } 360a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin // else it was some other stream that got unblocked 3615835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin } 3625835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin } 363a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 364a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin return stat; 365a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin} 366a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 3674bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkinint ProCamera::dropFrameBuffer(int streamId, int count) { 3684bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin StreamInfo& si = getStreamInfo(streamId); 3694bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin 3704bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin if (!si.cpuStream) { 3714bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin return BAD_VALUE; 3724bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin } else if (count < 0) { 3734bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin return BAD_VALUE; 3744bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin } 3754bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin 3764bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin int numDropped = 0; 3774bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin for (int i = 0; i < count; ++i) { 3784bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin CpuConsumer::LockedBuffer buffer; 3794bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin if (si.cpuConsumer->lockNextBuffer(&buffer) != OK) { 3804bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin break; 3814bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin } 3824bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin 3834bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin si.cpuConsumer->unlockBuffer(buffer); 3844bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin numDropped++; 3854bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin } 3864bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin 3874bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin return numDropped; 3884bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin} 3894bc4a3845e456fd464556d79d20650a107e873e5Igor Murashkin 390a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkinstatus_t ProCamera::waitForFrameMetadata() { 391a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin status_t stat = BAD_VALUE; 392a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin Mutex::Autolock al(mWaitMutex); 393a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 394a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin if (mMetadataReady) { 395a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin return OK; 396a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin } else { 397a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin while (true) { 398a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin stat = mWaitCondition.waitRelative(mWaitMutex, 399a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin mWaitTimeout); 400a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 401a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin if (stat != OK) { 402a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin ALOGE("%s: Error while waiting for metadata: %d", 403a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin __FUNCTION__, stat); 404a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin return stat; 405a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin } 406a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 407a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin if (mMetadataReady) { 408a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin mMetadataReady = false; 409a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin return OK; 410a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin } 411a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin // else it was some other stream or metadata 412a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin } 413a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin } 414a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 415a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin return stat; 416a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin} 417a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 418a140a6efea1db7837984b3578755cfa4eaa8d92dIgor MurashkinCameraMetadata ProCamera::consumeFrameMetadata() { 419a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin Mutex::Autolock al(mWaitMutex); 420a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 421a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin // Destructive: Subsequent calls return empty metadatas 422a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin CameraMetadata tmp = mLatestMetadata; 423a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin mLatestMetadata.release(); 424a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin 425a140a6efea1db7837984b3578755cfa4eaa8d92dIgor Murashkin return tmp; 4265835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin} 4275835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 4285835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor MurashkinProCamera::StreamInfo& ProCamera::getStreamInfo(int streamId) { 4295835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin return mStreams.editValueFor(streamId); 4305835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin} 4315835cc46a2f06dbfa5fbdab70e091896ef2fb438Igor Murashkin 432634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}; // namespace android 433