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