144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin/* 244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * Copyright (C) 2013 The Android Open Source Project 344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * 444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * you may not use this file except in compliance with the License. 644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * You may obtain a copy of the License at 744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * 844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * 1044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * Unless required by applicable law or agreed to in writing, software 1144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 1244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * See the License for the specific language governing permissions and 1444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * limitations under the License. 1544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin */ 1644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 1744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#define LOG_TAG "Camera2ClientBase" 1844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#define ATRACE_TAG ATRACE_TAG_CAMERA 1944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin//#define LOG_NDEBUG 0 2044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 21e5729fac81c8a984e984fefc90afc64135817d4fColin Cross#include <inttypes.h> 22e5729fac81c8a984e984fefc90afc64135817d4fColin Cross 2344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <utils/Log.h> 2444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <utils/Trace.h> 2544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 2644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <cutils/properties.h> 2744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <gui/Surface.h> 2844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <gui/Surface.h> 2944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/Camera2ClientBase.h" 317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 327b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api2/CameraDeviceClient.h" 33e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 34d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala#include "device3/Camera3Device.h" 3544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 3644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinnamespace android { 3744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinusing namespace camera2; 3844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 3944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinstatic int getCallingPid() { 4044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return IPCThreadState::self()->getCallingPid(); 4144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 4244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 4344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin// Interface used by CameraService 4444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 4544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 4644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor MurashkinCamera2ClientBase<TClientBase>::Camera2ClientBase( 4744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const sp<CameraService>& cameraService, 4844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const sp<TCamCallbacks>& remoteCallback, 4944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const String16& clientPackageName, 502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const String8& cameraId, 51c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh int api1CameraId, 5244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int cameraFacing, 5344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int clientPid, 5444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin uid_t clientUid, 5544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int servicePid): 5644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin TClientBase(cameraService, remoteCallback, clientPackageName, 57c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh cameraId, api1CameraId, cameraFacing, clientPid, clientUid, servicePid), 58cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh mSharedCameraCallbacks(remoteCallback), 592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mDeviceVersion(cameraService->getDeviceVersion(TClientBase::mCameraIdStr)), 60c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh mDeviceActive(false), mApi1CameraId(api1CameraId) 6144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin{ 622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGI("Camera %s: Opened. Client: %s (PID %d, UID %d)", cameraId.string(), 63b9d2f3333369183344aa89c7be1e643a44296d48Eino-Ville Talvala String8(clientPackageName).string(), clientPid, clientUid); 6498e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin 65b9d2f3333369183344aa89c7be1e643a44296d48Eino-Ville Talvala mInitialClientPid = clientPid; 66d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala mDevice = new Camera3Device(cameraId); 6798e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin LOG_ALWAYS_FATAL_IF(mDevice == 0, "Device should never be NULL here."); 6844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 6944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 7044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 7144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinstatus_t Camera2ClientBase<TClientBase>::checkPid(const char* checkLocation) 7244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const { 7344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 7444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int callingPid = getCallingPid(); 7544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (callingPid == TClientBase::mClientPid) return NO_ERROR; 7644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 7744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGE("%s: attempt to use a locked camera from a different process" 7844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin " (old pid %d, new pid %d)", checkLocation, TClientBase::mClientPid, callingPid); 7944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return PERMISSION_DENIED; 8044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 8144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 8244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 83bd8c503398d6b483b7abba594c7838a4c93b6e23Emilian Peevstatus_t Camera2ClientBase<TClientBase>::initialize(sp<CameraProviderManager> manager, 84bd8c503398d6b483b7abba594c7838a4c93b6e23Emilian Peev const String8& monitorTags) { 85bd8c503398d6b483b7abba594c7838a4c93b6e23Emilian Peev return initializeImpl(manager, monitorTags); 862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate <typename TClientBase> 892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate <typename TProviderPtr> 90bd8c503398d6b483b7abba594c7838a4c93b6e23Emilian Peevstatus_t Camera2ClientBase<TClientBase>::initializeImpl(TProviderPtr providerPtr, 91bd8c503398d6b483b7abba594c7838a4c93b6e23Emilian Peev const String8& monitorTags) { 9244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ATRACE_CALL(); 932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGV("%s: Initializing client for camera %s", __FUNCTION__, 942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala TClientBase::mCameraIdStr.string()); 9544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin status_t res; 9644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 97e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin // Verify ops permissions 98e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin res = TClientBase::startCameraOps(); 99e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin if (res != OK) { 100e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin return res; 101e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin } 102e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin 103e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin if (mDevice == NULL) { 1042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Camera %s: No device connected", 1052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, TClientBase::mCameraIdStr.string()); 106e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin return NO_INIT; 107e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin } 108e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin 109bd8c503398d6b483b7abba594c7838a4c93b6e23Emilian Peev res = mDevice->initialize(providerPtr, monitorTags); 11044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (res != OK) { 1112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Camera %s: unable to initialize device: %s (%d)", 1122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, TClientBase::mCameraIdStr.string(), strerror(-res), res); 11366281c3a5d7eea486ddc6ad30088ba92956fd4fdZhijun He return res; 11444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin } 11544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 116e1c8063521b0645b091b080d896106b2e6fd8670Yin-Chia Yeh wp<CameraDeviceBase::NotificationListener> weakThis(this); 117e1c8063521b0645b091b080d896106b2e6fd8670Yin-Chia Yeh res = mDevice->setNotifyCallback(weakThis); 11844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 11944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return OK; 12044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 12144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 12244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 12344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor MurashkinCamera2ClientBase<TClientBase>::~Camera2ClientBase() { 12444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ATRACE_CALL(); 12544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 12644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin TClientBase::mDestructionStarted = true; 12744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 12844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin disconnect(); 12944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 1302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGI("Closed Camera %s. Client was: %s (PID %d, UID %u)", 1312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala TClientBase::mCameraIdStr.string(), 132280405a138a0068694f3c39b4290f510173133d9Svetoslav Ganov String8(TClientBase::mClientPackageName).string(), 133b9d2f3333369183344aa89c7be1e643a44296d48Eino-Ville Talvala mInitialClientPid, TClientBase::mClientUid); 13444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 13544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 13644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 137c4003965258404a19b99280ac0f475e2f290bf27Eino-Ville Talvalastatus_t Camera2ClientBase<TClientBase>::dumpClient(int fd, 13844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const Vector<String16>& args) { 13944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin String8 result; 1402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala result.appendFormat("Camera2ClientBase[%s] (%p) PID: %d, dump:\n", 1412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala TClientBase::mCameraIdStr.string(), 142e992e75053e98e3699af6e344c11b787e30411adEino-Ville Talvala (TClientBase::getRemoteCallback() != NULL ? 14306b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen IInterface::asBinder(TClientBase::getRemoteCallback()).get() : NULL), 14444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin TClientBase::mClientPid); 14544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin result.append(" State: "); 14644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 14744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin write(fd, result.string(), result.size()); 14844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // TODO: print dynamic/request section from most recent requests 14944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 15044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return dumpDevice(fd, args); 15144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 15244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 15344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 15444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinstatus_t Camera2ClientBase<TClientBase>::dumpDevice( 15544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int fd, 15644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const Vector<String16>& args) { 15744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin String8 result; 15844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 15944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin result = " Device dump:\n"; 16044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin write(fd, result.string(), result.size()); 16144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 162e5138f10ca712365a917894ef381b9216d95ca14Yin-Chia Yeh sp<CameraDeviceBase> device = mDevice; 163e5138f10ca712365a917894ef381b9216d95ca14Yin-Chia Yeh if (!device.get()) { 16444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin result = " *** Device is detached\n"; 16544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin write(fd, result.string(), result.size()); 16644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return NO_ERROR; 16744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin } 16844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 169e5138f10ca712365a917894ef381b9216d95ca14Yin-Chia Yeh status_t res = device->dump(fd, args); 17044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (res != OK) { 17144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin result = String8::format(" Error dumping device: %s (%d)", 17244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin strerror(-res), res); 17344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin write(fd, result.string(), result.size()); 17444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin } 17544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 17644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return NO_ERROR; 17744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 17844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 17944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin// ICameraClient2BaseUser interface 18044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 18144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 18244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 183d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalabinder::Status Camera2ClientBase<TClientBase>::disconnect() { 18444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ATRACE_CALL(); 18544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 18644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 187d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status res = binder::Status::ok(); 18844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // Allow both client and the media server to disconnect at all times 18944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int callingPid = getCallingPid(); 19044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (callingPid != TClientBase::mClientPid && 191d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala callingPid != TClientBase::mServicePid) return res; 19244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 1932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGV("Camera %s: Shutting down", TClientBase::mCameraIdStr.string()); 19444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 19544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin detachDevice(); 19644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 197e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin CameraService::BasicClient::disconnect(); 19844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 1992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGV("Camera %s: Shut down complete complete", TClientBase::mCameraIdStr.string()); 200d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 201d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return res; 20244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 20344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 20444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 20544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinvoid Camera2ClientBase<TClientBase>::detachDevice() { 20644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (mDevice == 0) return; 20744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mDevice->disconnect(); 20844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 20944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mDevice.clear(); 21044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 2112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGV("Camera %s: Detach complete", TClientBase::mCameraIdStr.string()); 21244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 21344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 21444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 21544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinstatus_t Camera2ClientBase<TClientBase>::connect( 21644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const sp<TCamCallbacks>& client) { 21744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ATRACE_CALL(); 21844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGV("%s: E", __FUNCTION__); 21944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 22044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 22144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (TClientBase::mClientPid != 0 && 22244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin getCallingPid() != TClientBase::mClientPid) { 22344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 2242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Camera %s: Connection attempt from pid %d; " 22544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin "current locked to pid %d", 22644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin __FUNCTION__, 2272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala TClientBase::mCameraIdStr.string(), 22844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin getCallingPid(), 22944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin TClientBase::mClientPid); 23044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return BAD_VALUE; 23144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin } 23244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 23344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin TClientBase::mClientPid = getCallingPid(); 23444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 23544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin TClientBase::mRemoteCallback = client; 23644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mSharedCameraCallbacks = client; 23744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 23844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return OK; 23944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 24044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 24144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin/** Device-related methods */ 24244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 24344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 244cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weivoid Camera2ClientBase<TClientBase>::notifyError( 245d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t errorCode, 246cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei const CaptureResultExtras& resultExtras) { 247cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGE("Error condition %d reported by HAL, requestId %" PRId32, errorCode, 248cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei resultExtras.requestId); 24944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 25044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 25144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 252f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid Camera2ClientBase<TClientBase>::notifyIdle() { 253412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala if (mDeviceActive) { 254412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala getCameraService()->updateProxyDeviceState( 255e8c96c765b95ec7dcd10732621a825fce05960c6Eino-Ville Talvala hardware::ICameraServiceProxy::CAMERA_STATE_IDLE, TClientBase::mCameraIdStr, 256573291c251d9e85f51f7c0fa1cb35baa2969ca17Emilian Peev TClientBase::mCameraFacing, TClientBase::mClientPackageName, 257573291c251d9e85f51f7c0fa1cb35baa2969ca17Emilian Peev ((mApi1CameraId < 0) ? hardware::ICameraServiceProxy::CAMERA_API_LEVEL_2 : 258573291c251d9e85f51f7c0fa1cb35baa2969ca17Emilian Peev hardware::ICameraServiceProxy::CAMERA_API_LEVEL_1)); 259412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala } 260412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala mDeviceActive = false; 261412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala 262f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera device is now idle"); 263f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 264f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 265f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalatemplate <typename TClientBase> 266cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weivoid Camera2ClientBase<TClientBase>::notifyShutter(const CaptureResultExtras& resultExtras, 26744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin nsecs_t timestamp) { 268cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei (void)resultExtras; 26944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin (void)timestamp; 27044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 271412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala if (!mDeviceActive) { 272412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala getCameraService()->updateProxyDeviceState( 273e8c96c765b95ec7dcd10732621a825fce05960c6Eino-Ville Talvala hardware::ICameraServiceProxy::CAMERA_STATE_ACTIVE, TClientBase::mCameraIdStr, 274573291c251d9e85f51f7c0fa1cb35baa2969ca17Emilian Peev TClientBase::mCameraFacing, TClientBase::mClientPackageName, 275573291c251d9e85f51f7c0fa1cb35baa2969ca17Emilian Peev ((mApi1CameraId < 0) ? hardware::ICameraServiceProxy::CAMERA_API_LEVEL_2 : 276573291c251d9e85f51f7c0fa1cb35baa2969ca17Emilian Peev hardware::ICameraServiceProxy::CAMERA_API_LEVEL_1)); 277412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala } 278412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala mDeviceActive = true; 279412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala 280cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGV("%s: Shutter notification for request id %" PRId32 " at time %" PRId64, 281cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei __FUNCTION__, resultExtras.requestId, timestamp); 28244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 28344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 28444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 28544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinvoid Camera2ClientBase<TClientBase>::notifyAutoFocus(uint8_t newState, 28644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int triggerId) { 28744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin (void)newState; 28844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin (void)triggerId; 28944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 29044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGV("%s: Autofocus state now %d, last trigger %d", 29144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin __FUNCTION__, newState, triggerId); 29244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 29344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 29444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 29544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 29644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinvoid Camera2ClientBase<TClientBase>::notifyAutoExposure(uint8_t newState, 29744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int triggerId) { 29844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin (void)newState; 29944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin (void)triggerId; 30044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 30144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGV("%s: Autoexposure state now %d, last trigger %d", 30244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin __FUNCTION__, newState, triggerId); 30344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 30444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 30544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 30644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinvoid Camera2ClientBase<TClientBase>::notifyAutoWhitebalance(uint8_t newState, 30744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int triggerId) { 30844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin (void)newState; 30944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin (void)triggerId; 31044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 31144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGV("%s: Auto-whitebalance state now %d, last trigger %d", 31244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin __FUNCTION__, newState, triggerId); 31344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 31444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 31544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 3164d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvalavoid Camera2ClientBase<TClientBase>::notifyPrepared(int streamId) { 3174d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala (void)streamId; 3184d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 3194d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Stream %d now prepared", 3204d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala __FUNCTION__, streamId); 3214d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 3224d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 3234d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvalatemplate <typename TClientBase> 3249d06601e54848f076b7472a376c672215cd70c46Shuzhen Wangvoid Camera2ClientBase<TClientBase>::notifyRequestQueueEmpty() { 3259d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang 3269d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang ALOGV("%s: Request queue now empty", __FUNCTION__); 3279d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang} 3289d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang 3299d06601e54848f076b7472a376c672215cd70c46Shuzhen Wangtemplate <typename TClientBase> 330e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chenvoid Camera2ClientBase<TClientBase>::notifyRepeatingRequestError(long lastFrameNumber) { 331e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen (void)lastFrameNumber; 332e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen 333e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen ALOGV("%s: Repeating request was stopped. Last frame number is %ld", 334e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen __FUNCTION__, lastFrameNumber); 335e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen} 336e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen 337e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chentemplate <typename TClientBase> 33844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinint Camera2ClientBase<TClientBase>::getCameraId() const { 339c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh return mApi1CameraId; 34044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 34144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 34244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 343cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yehint Camera2ClientBase<TClientBase>::getCameraDeviceVersion() const { 344cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return mDeviceVersion; 345cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh} 346cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 347cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yehtemplate <typename TClientBase> 34844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinconst sp<CameraDeviceBase>& Camera2ClientBase<TClientBase>::getCameraDevice() { 34944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return mDevice; 35044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 35144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 35244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 35344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinconst sp<CameraService>& Camera2ClientBase<TClientBase>::getCameraService() { 3542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return TClientBase::sCameraService; 35544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 35644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 35744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 35844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor MurashkinCamera2ClientBase<TClientBase>::SharedCameraCallbacks::Lock::Lock( 35944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin SharedCameraCallbacks &client) : 36044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 36144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mRemoteCallback(client.mRemoteCallback), 36244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mSharedClient(client) { 36344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 36444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mSharedClient.mRemoteCallbackLock.lock(); 36544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 36644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 36744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 36844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor MurashkinCamera2ClientBase<TClientBase>::SharedCameraCallbacks::Lock::~Lock() { 36944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mSharedClient.mRemoteCallbackLock.unlock(); 37044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 37144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 37244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 37344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor MurashkinCamera2ClientBase<TClientBase>::SharedCameraCallbacks::SharedCameraCallbacks( 37444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const sp<TCamCallbacks>&client) : 37544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 37644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mRemoteCallback(client) { 37744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 37844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 37944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 38044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintypename Camera2ClientBase<TClientBase>::SharedCameraCallbacks& 38144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor MurashkinCamera2ClientBase<TClientBase>::SharedCameraCallbacks::operator=( 38244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const sp<TCamCallbacks>&client) { 38344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 38444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock l(mRemoteCallbackLock); 38544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mRemoteCallback = client; 38644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return *this; 38744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 38844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 38944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 39044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinvoid Camera2ClientBase<TClientBase>::SharedCameraCallbacks::clear() { 39144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock l(mRemoteCallbackLock); 39244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mRemoteCallback.clear(); 39344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 39444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 39544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate class Camera2ClientBase<CameraService::Client>; 396e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkintemplate class Camera2ClientBase<CameraDeviceClientBase>; 39744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 39844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} // namespace android 399