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