Camera2ClientBase.cpp revision 66281c3a5d7eea486ddc6ad30088ba92956fd4fd
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 2144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <utils/Log.h> 2244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <utils/Trace.h> 2344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 2444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <cutils/properties.h> 2544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <gui/Surface.h> 2644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <gui/Surface.h> 2744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/Camera2ClientBase.h" 297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api2/CameraDeviceClient.h" 31e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 3298e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin#include "CameraDeviceFactory.h" 3344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 3444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinnamespace android { 3544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinusing namespace camera2; 3644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 3744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinstatic int getCallingPid() { 3844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return IPCThreadState::self()->getCallingPid(); 3944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 4044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 4144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin// Interface used by CameraService 4244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 4344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 4444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor MurashkinCamera2ClientBase<TClientBase>::Camera2ClientBase( 4544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const sp<CameraService>& cameraService, 4644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const sp<TCamCallbacks>& remoteCallback, 4744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const String16& clientPackageName, 4844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int cameraId, 4944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int cameraFacing, 5044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int clientPid, 5144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin uid_t clientUid, 5244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int servicePid): 5344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin TClientBase(cameraService, remoteCallback, clientPackageName, 5444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin cameraId, cameraFacing, clientPid, clientUid, servicePid), 5544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mSharedCameraCallbacks(remoteCallback) 5644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin{ 5744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGI("Camera %d: Opened", cameraId); 5898e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin 5998e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin mDevice = CameraDeviceFactory::createDevice(cameraId); 6098e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin LOG_ALWAYS_FATAL_IF(mDevice == 0, "Device should never be NULL here."); 6144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 6244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 6344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 6444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinstatus_t Camera2ClientBase<TClientBase>::checkPid(const char* checkLocation) 6544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const { 6644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 6744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int callingPid = getCallingPid(); 6844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (callingPid == TClientBase::mClientPid) return NO_ERROR; 6944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 7044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGE("%s: attempt to use a locked camera from a different process" 7144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin " (old pid %d, new pid %d)", checkLocation, TClientBase::mClientPid, callingPid); 7244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return PERMISSION_DENIED; 7344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 7444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 7544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 7644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinstatus_t Camera2ClientBase<TClientBase>::initialize(camera_module_t *module) { 7744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ATRACE_CALL(); 7844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGV("%s: Initializing client for camera %d", __FUNCTION__, 7944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin TClientBase::mCameraId); 8044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin status_t res; 8144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 82e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin // Verify ops permissions 83e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin res = TClientBase::startCameraOps(); 84e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin if (res != OK) { 85e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin return res; 86e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin } 87e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin 88e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin if (mDevice == NULL) { 89e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin ALOGE("%s: Camera %d: No device connected", 90e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin __FUNCTION__, TClientBase::mCameraId); 91e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin return NO_INIT; 92e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin } 93e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin 9444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin res = mDevice->initialize(module); 9544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (res != OK) { 9644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGE("%s: Camera %d: unable to initialize device: %s (%d)", 9744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin __FUNCTION__, TClientBase::mCameraId, strerror(-res), res); 9866281c3a5d7eea486ddc6ad30088ba92956fd4fdZhijun He return res; 9944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin } 10044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 10144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin res = mDevice->setNotifyCallback(this); 10244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 10344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return OK; 10444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 10544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 10644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 10744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor MurashkinCamera2ClientBase<TClientBase>::~Camera2ClientBase() { 10844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ATRACE_CALL(); 10944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 11044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin TClientBase::mDestructionStarted = true; 11144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 112e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin TClientBase::finishCameraOps(); 113e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin 11444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin disconnect(); 11544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 11644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGI("Closed Camera %d", TClientBase::mCameraId); 11744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 11844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 11944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 12044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinstatus_t Camera2ClientBase<TClientBase>::dump(int fd, 12144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const Vector<String16>& args) { 12244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin String8 result; 12344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin result.appendFormat("Camera2ClientBase[%d] (%p) PID: %d, dump:\n", 12444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin TClientBase::mCameraId, 12544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin TClientBase::getRemoteCallback()->asBinder().get(), 12644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin TClientBase::mClientPid); 12744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin result.append(" State: "); 12844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 12944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin write(fd, result.string(), result.size()); 13044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // TODO: print dynamic/request section from most recent requests 13144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 13244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return dumpDevice(fd, args); 13344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 13444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 13544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 13644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinstatus_t Camera2ClientBase<TClientBase>::dumpDevice( 13744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int fd, 13844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const Vector<String16>& args) { 13944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin String8 result; 14044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 14144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin result = " Device dump:\n"; 14244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin write(fd, result.string(), result.size()); 14344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 14444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (!mDevice.get()) { 14544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin result = " *** Device is detached\n"; 14644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin write(fd, result.string(), result.size()); 14744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return NO_ERROR; 14844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin } 14944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 15044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin status_t res = mDevice->dump(fd, args); 15144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (res != OK) { 15244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin result = String8::format(" Error dumping device: %s (%d)", 15344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin strerror(-res), res); 15444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin write(fd, result.string(), result.size()); 15544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin } 15644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 15744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return NO_ERROR; 15844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 15944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 16044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin// ICameraClient2BaseUser interface 16144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 16244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 16344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 16444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinvoid Camera2ClientBase<TClientBase>::disconnect() { 16544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ATRACE_CALL(); 16644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 16744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 16844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // Allow both client and the media server to disconnect at all times 16944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int callingPid = getCallingPid(); 17044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (callingPid != TClientBase::mClientPid && 17144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin callingPid != TClientBase::mServicePid) return; 17244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 17344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGV("Camera %d: Shutting down", TClientBase::mCameraId); 17444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 17544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin detachDevice(); 17644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 177e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin CameraService::BasicClient::disconnect(); 17844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 17944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGV("Camera %d: Shut down complete complete", TClientBase::mCameraId); 18044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 18144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 18244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 18344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinvoid Camera2ClientBase<TClientBase>::detachDevice() { 18444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (mDevice == 0) return; 18544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mDevice->disconnect(); 18644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 18744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mDevice.clear(); 18844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 18944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGV("Camera %d: Detach complete", TClientBase::mCameraId); 19044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 19144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 19244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 19344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinstatus_t Camera2ClientBase<TClientBase>::connect( 19444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const sp<TCamCallbacks>& client) { 19544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ATRACE_CALL(); 19644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGV("%s: E", __FUNCTION__); 19744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock icl(mBinderSerializationLock); 19844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 19944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (TClientBase::mClientPid != 0 && 20044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin getCallingPid() != TClientBase::mClientPid) { 20144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 20244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGE("%s: Camera %d: Connection attempt from pid %d; " 20344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin "current locked to pid %d", 20444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin __FUNCTION__, 20544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin TClientBase::mCameraId, 20644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin getCallingPid(), 20744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin TClientBase::mClientPid); 20844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return BAD_VALUE; 20944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin } 21044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 21144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin TClientBase::mClientPid = getCallingPid(); 21244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 21344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin TClientBase::mRemoteCallback = client; 21444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mSharedCameraCallbacks = client; 21544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 21644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return OK; 21744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 21844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 21944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin/** Device-related methods */ 22044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 22144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 22244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinvoid Camera2ClientBase<TClientBase>::notifyError(int errorCode, int arg1, 22344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int arg2) { 22444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, 22544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin arg1, arg2); 22644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 22744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 22844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 22944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinvoid Camera2ClientBase<TClientBase>::notifyShutter(int frameNumber, 23044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin nsecs_t timestamp) { 23144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin (void)frameNumber; 23244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin (void)timestamp; 23344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 23444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__, 23544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin frameNumber, timestamp); 23644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 23744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 23844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 23944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinvoid Camera2ClientBase<TClientBase>::notifyAutoFocus(uint8_t newState, 24044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int triggerId) { 24144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin (void)newState; 24244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin (void)triggerId; 24344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 24444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGV("%s: Autofocus state now %d, last trigger %d", 24544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin __FUNCTION__, newState, triggerId); 24644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 24744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin typename SharedCameraCallbacks::Lock l(mSharedCameraCallbacks); 24844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (l.mRemoteCallback != 0) { 24944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS_MOVE, 1, 0); 25044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin } 25144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin if (l.mRemoteCallback != 0) { 25244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS, 1, 0); 25344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin } 25444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 25544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 25644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 25744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinvoid Camera2ClientBase<TClientBase>::notifyAutoExposure(uint8_t newState, 25844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int triggerId) { 25944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin (void)newState; 26044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin (void)triggerId; 26144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 26244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGV("%s: Autoexposure state now %d, last trigger %d", 26344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin __FUNCTION__, newState, triggerId); 26444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 26544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 26644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 26744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinvoid Camera2ClientBase<TClientBase>::notifyAutoWhitebalance(uint8_t newState, 26844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int triggerId) { 26944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin (void)newState; 27044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin (void)triggerId; 27144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 27244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin ALOGV("%s: Auto-whitebalance state now %d, last trigger %d", 27344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin __FUNCTION__, newState, triggerId); 27444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 27544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 27644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 27744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinint Camera2ClientBase<TClientBase>::getCameraId() const { 27844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return TClientBase::mCameraId; 27944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 28044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 28144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 28244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinconst sp<CameraDeviceBase>& Camera2ClientBase<TClientBase>::getCameraDevice() { 28344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return mDevice; 28444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 28544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 28644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 28744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinconst sp<CameraService>& Camera2ClientBase<TClientBase>::getCameraService() { 28844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return TClientBase::mCameraService; 28944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 29044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 29144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 29244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor MurashkinCamera2ClientBase<TClientBase>::SharedCameraCallbacks::Lock::Lock( 29344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin SharedCameraCallbacks &client) : 29444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 29544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mRemoteCallback(client.mRemoteCallback), 29644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mSharedClient(client) { 29744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 29844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mSharedClient.mRemoteCallbackLock.lock(); 29944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 30044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 30144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 30244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor MurashkinCamera2ClientBase<TClientBase>::SharedCameraCallbacks::Lock::~Lock() { 30344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mSharedClient.mRemoteCallbackLock.unlock(); 30444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 30544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 30644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 30744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor MurashkinCamera2ClientBase<TClientBase>::SharedCameraCallbacks::SharedCameraCallbacks( 30844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const sp<TCamCallbacks>&client) : 30944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 31044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mRemoteCallback(client) { 31144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 31244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 31344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 31444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintypename Camera2ClientBase<TClientBase>::SharedCameraCallbacks& 31544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor MurashkinCamera2ClientBase<TClientBase>::SharedCameraCallbacks::operator=( 31644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const sp<TCamCallbacks>&client) { 31744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 31844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock l(mRemoteCallbackLock); 31944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mRemoteCallback = client; 32044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return *this; 32144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 32244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 32344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate <typename TClientBase> 32444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinvoid Camera2ClientBase<TClientBase>::SharedCameraCallbacks::clear() { 32544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Mutex::Autolock l(mRemoteCallbackLock); 32644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin mRemoteCallback.clear(); 32744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} 32844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 32944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate class Camera2ClientBase<CameraService::ProClient>; 33044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkintemplate class Camera2ClientBase<CameraService::Client>; 331e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkintemplate class Camera2ClientBase<CameraDeviceClientBase>; 33244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 33344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} // namespace android 334