CameraDeviceClient.cpp revision e2d167eb689d7a536805f950c31f11b9e9c578ae
1e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin/*
2e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Copyright (C) 2013 The Android Open Source Project
3e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin *
4e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * you may not use this file except in compliance with the License.
6e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * You may obtain a copy of the License at
7e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin *
8e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin *
10e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * Unless required by applicable law or agreed to in writing, software
11e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * See the License for the specific language governing permissions and
14e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin * limitations under the License.
15e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin */
16e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
17e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#define LOG_TAG "CameraDeviceClient"
18e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#define ATRACE_TAG ATRACE_TAG_CAMERA
19cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei//#define LOG_NDEBUG 0
20e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
217b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <cutils/properties.h>
22e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <utils/Log.h>
23e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <utils/Trace.h>
24e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <gui/Surface.h>
257b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/CaptureRequest.h>
265698d4461a260dbf208484383f692b03c6473e74Ruben Brunk#include <camera/CameraUtils.h>
277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/CameraDeviceBase.h"
297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api2/CameraDeviceClient.h"
307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
32e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
33e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinnamespace android {
34e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinusing namespace camera2;
35e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
36e7ee7637747371635a85fedd24d2190bb1f38651Igor MurashkinCameraDeviceClientBase::CameraDeviceClientBase(
37e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        const sp<CameraService>& cameraService,
38e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        const sp<ICameraDeviceCallbacks>& remoteCallback,
39e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        const String16& clientPackageName,
40e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        int cameraId,
41e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        int cameraFacing,
42e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        int clientPid,
43e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        uid_t clientUid,
44e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        int servicePid) :
45e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    BasicClient(cameraService, remoteCallback->asBinder(), clientPackageName,
46e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                cameraId, cameraFacing, clientPid, clientUid, servicePid),
47e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mRemoteCallback(remoteCallback) {
48e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
49e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
50e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// Interface used by CameraService
51e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
52e7ee7637747371635a85fedd24d2190bb1f38651Igor MurashkinCameraDeviceClient::CameraDeviceClient(const sp<CameraService>& cameraService,
53e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                   const sp<ICameraDeviceCallbacks>& remoteCallback,
54e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                   const String16& clientPackageName,
55e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                   int cameraId,
56e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                   int cameraFacing,
57e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                   int clientPid,
58e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                   uid_t clientUid,
59e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                   int servicePid) :
60e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Camera2ClientBase(cameraService, remoteCallback, clientPackageName,
61e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                cameraId, cameraFacing, clientPid, clientUid, servicePid),
62e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mRequestIdCounter(0) {
63e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
64e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ATRACE_CALL();
65e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGI("CameraDeviceClient %d: Opened", cameraId);
66e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
67e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
68e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraDeviceClient::initialize(camera_module_t *module)
69e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
70e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ATRACE_CALL();
71e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    status_t res;
72e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
73e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    res = Camera2ClientBase::initialize(module);
74e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (res != OK) {
75e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return res;
76e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
77e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
78e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    String8 threadName;
797b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala    mFrameProcessor = new FrameProcessorBase(mDevice);
80e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    threadName = String8::format("CDU-%d-FrameProc", mCameraId);
81e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mFrameProcessor->run(threadName.string());
82e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
83e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mFrameProcessor->registerListener(FRAME_PROCESSOR_LISTENER_MIN_ID,
84e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                      FRAME_PROCESSOR_LISTENER_MAX_ID,
85184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala                                      /*listener*/this,
8625a0aef19e170d2695f64b4c48296e7914155a88Zhijun He                                      /*sendPartials*/true);
87e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
88e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return OK;
89e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
90e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
91e7ee7637747371635a85fedd24d2190bb1f38651Igor MurashkinCameraDeviceClient::~CameraDeviceClient() {
92e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
93e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
94e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraDeviceClient::submitRequest(sp<CaptureRequest> request,
95cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                         bool streaming,
96cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                         /*out*/
97cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                         int64_t* lastFrameNumber) {
98cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    List<sp<CaptureRequest> > requestList;
99cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    requestList.push_back(request);
100cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    return submitRequestList(requestList, streaming, lastFrameNumber);
10190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei}
10290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
10390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t CameraDeviceClient::submitRequestList(List<sp<CaptureRequest> > requests,
104cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                               bool streaming, int64_t* lastFrameNumber) {
10590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    ATRACE_CALL();
10650468413251bd92a1cdf9de8275a994dab8648d1Mark Salyzyn    ALOGV("%s-start of function. Request list size %zu", __FUNCTION__, requests.size());
10790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
10890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    status_t res;
10990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
11090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
11190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    Mutex::Autolock icl(mBinderSerializationLock);
11290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
11390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    if (!mDevice.get()) return DEAD_OBJECT;
11490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
11590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    if (requests.empty()) {
11690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        ALOGE("%s: Camera %d: Sent null request. Rejecting request.",
11790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei              __FUNCTION__, mCameraId);
11890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        return BAD_VALUE;
11990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    }
12090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
12190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    List<const CameraMetadata> metadataRequestList;
12290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    int32_t requestId = mRequestIdCounter;
12390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    uint32_t loopCounter = 0;
12490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
12590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    for (List<sp<CaptureRequest> >::iterator it = requests.begin(); it != requests.end(); ++it) {
12690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        sp<CaptureRequest> request = *it;
12790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        if (request == 0) {
12890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            ALOGE("%s: Camera %d: Sent null request.",
12990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                    __FUNCTION__, mCameraId);
13090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            return BAD_VALUE;
13190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        }
13290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
13390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        CameraMetadata metadata(request->mMetadata);
13490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        if (metadata.isEmpty()) {
13590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            ALOGE("%s: Camera %d: Sent empty metadata packet. Rejecting request.",
13690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                   __FUNCTION__, mCameraId);
13790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            return BAD_VALUE;
13890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        } else if (request->mSurfaceList.isEmpty()) {
13990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            ALOGE("%s: Camera %d: Requests must have at least one surface target. "
14090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                  "Rejecting request.", __FUNCTION__, mCameraId);
14190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            return BAD_VALUE;
14290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        }
14390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
14490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        if (!enforceRequestPermissions(metadata)) {
14590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            // Callee logs
14690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            return PERMISSION_DENIED;
14790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        }
14890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
14990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        /**
15090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei         * Write in the output stream IDs which we calculate from
15190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei         * the capture request's list of surface targets
15290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei         */
15390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        Vector<int32_t> outputStreamIds;
15490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        outputStreamIds.setCapacity(request->mSurfaceList.size());
155cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        for (size_t i = 0; i < request->mSurfaceList.size(); ++i) {
156cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            sp<Surface> surface = request->mSurfaceList[i];
15790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            if (surface == 0) continue;
15890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
15990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            sp<IGraphicBufferProducer> gbp = surface->getIGraphicBufferProducer();
16090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            int idx = mStreamMap.indexOfKey(gbp->asBinder());
16190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
16290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            // Trying to submit request with surface that wasn't created
16390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            if (idx == NAME_NOT_FOUND) {
16490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                ALOGE("%s: Camera %d: Tried to submit a request with a surface that"
16590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                      " we have not called createStream on",
16690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                      __FUNCTION__, mCameraId);
16790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                return BAD_VALUE;
16890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            }
16990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
17090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            int streamId = mStreamMap.valueAt(idx);
17190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            outputStreamIds.push_back(streamId);
17290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            ALOGV("%s: Camera %d: Appending output stream %d to request",
17390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                  __FUNCTION__, mCameraId, streamId);
17490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        }
17590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
17690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        metadata.update(ANDROID_REQUEST_OUTPUT_STREAMS, &outputStreamIds[0],
17790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                        outputStreamIds.size());
17890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
17990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        metadata.update(ANDROID_REQUEST_ID, &requestId, /*size*/1);
18090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        loopCounter++; // loopCounter starts from 1
18150468413251bd92a1cdf9de8275a994dab8648d1Mark Salyzyn        ALOGV("%s: Camera %d: Creating request with ID %d (%d of %zu)",
18290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei              __FUNCTION__, mCameraId, requestId, loopCounter, requests.size());
18390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
18490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        metadataRequestList.push_back(metadata);
18590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    }
18690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    mRequestIdCounter++;
18790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
18890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    if (streaming) {
189cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        res = mDevice->setStreamingRequestList(metadataRequestList, lastFrameNumber);
19090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        if (res != OK) {
19190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            ALOGE("%s: Camera %d:  Got error %d after trying to set streaming "
19290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                  "request", __FUNCTION__, mCameraId, res);
19390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        } else {
19490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            mStreamingRequestList.push_back(requestId);
19590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        }
19690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    } else {
197cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        res = mDevice->captureList(metadataRequestList, lastFrameNumber);
19890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        if (res != OK) {
19990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            ALOGE("%s: Camera %d: Got error %d after trying to set capture",
20090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                __FUNCTION__, mCameraId, res);
20190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        }
202cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        ALOGV("%s: requestId = %d ", __FUNCTION__, requestId);
20390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    }
20490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
20590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    ALOGV("%s: Camera %d: End of function", __FUNCTION__, mCameraId);
20690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    if (res == OK) {
20790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        return requestId;
20890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    }
209e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
210e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return res;
211e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
212e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
213cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t CameraDeviceClient::cancelRequest(int requestId, int64_t* lastFrameNumber) {
214e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ATRACE_CALL();
215e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("%s, requestId = %d", __FUNCTION__, requestId);
216e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
217e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    status_t res;
218e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
219e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
220e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
221e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
222e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
223e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (!mDevice.get()) return DEAD_OBJECT;
224e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
225e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Vector<int>::iterator it, end;
226e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    for (it = mStreamingRequestList.begin(), end = mStreamingRequestList.end();
227e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin         it != end; ++it) {
228e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (*it == requestId) {
229e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            break;
230e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
231e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
232e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
233e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (it == end) {
234e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: Camera%d: Did not find request id %d in list of streaming "
235e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              "requests", __FUNCTION__, mCameraId, requestId);
236e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return BAD_VALUE;
237e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
238e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
239cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    res = mDevice->clearStreamingRequest(lastFrameNumber);
240e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
241e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (res == OK) {
242e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGV("%s: Camera %d: Successfully cleared streaming request",
243e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              __FUNCTION__, mCameraId);
244e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        mStreamingRequestList.erase(it);
245e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
246e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
247e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return res;
248e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
249e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
250b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunkstatus_t CameraDeviceClient::beginConfigure() {
251b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    // TODO: Implement this.
252b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    ALOGE("%s: Not implemented yet.", __FUNCTION__);
253b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    return OK;
254b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk}
255b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
256b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunkstatus_t CameraDeviceClient::endConfigure() {
257e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin    ALOGV("%s: ending configure (%zu streams)",
258e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin            __FUNCTION__, mStreamMap.size());
259e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin
260e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin    status_t res;
261e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
262e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin
263e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
264e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin
265e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin    if (!mDevice.get()) return DEAD_OBJECT;
266e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin
267e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin    return mDevice->configureStreams();
268b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk}
269b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
270e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraDeviceClient::deleteStream(int streamId) {
271e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ATRACE_CALL();
272e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("%s (streamId = 0x%x)", __FUNCTION__, streamId);
273e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
274e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    status_t res;
275e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
276e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
277e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
278e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
279e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (!mDevice.get()) return DEAD_OBJECT;
280e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
281e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Guard against trying to delete non-created streams
282e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ssize_t index = NAME_NOT_FOUND;
283e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    for (size_t i = 0; i < mStreamMap.size(); ++i) {
284e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (streamId == mStreamMap.valueAt(i)) {
285e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            index = i;
286e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            break;
287e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
288e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
289e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
290e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (index == NAME_NOT_FOUND) {
291e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGW("%s: Camera %d: Invalid stream ID (%d) specified, no stream "
292e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              "created yet", __FUNCTION__, mCameraId, streamId);
293e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return BAD_VALUE;
294e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
295e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
296e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Also returns BAD_VALUE if stream ID was not valid
297e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    res = mDevice->deleteStream(streamId);
298e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
299e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (res == BAD_VALUE) {
300e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: Camera %d: Unexpected BAD_VALUE when deleting stream, but we"
301e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              " already checked and the stream ID (%d) should be valid.",
302e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              __FUNCTION__, mCameraId, streamId);
303e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    } else if (res == OK) {
304e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        mStreamMap.removeItemsAt(index);
305e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
306e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
307e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
308e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return res;
309e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
310e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
311e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraDeviceClient::createStream(int width, int height, int format,
312e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                      const sp<IGraphicBufferProducer>& bufferProducer)
313e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
314e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ATRACE_CALL();
315e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("%s (w = %d, h = %d, f = 0x%x)", __FUNCTION__, width, height, format);
316e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
317e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    status_t res;
318e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
319e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
320e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
321e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
32289f14dacfadea1b14149510d4dfbc75dc79b23bbYin-Chia Yeh    if (bufferProducer == NULL) {
32389f14dacfadea1b14149510d4dfbc75dc79b23bbYin-Chia Yeh        ALOGE("%s: bufferProducer must not be null", __FUNCTION__);
32489f14dacfadea1b14149510d4dfbc75dc79b23bbYin-Chia Yeh        return BAD_VALUE;
32589f14dacfadea1b14149510d4dfbc75dc79b23bbYin-Chia Yeh    }
326e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (!mDevice.get()) return DEAD_OBJECT;
327e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
328e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Don't create multiple streams for the same target surface
329e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
330e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ssize_t index = mStreamMap.indexOfKey(bufferProducer->asBinder());
331e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (index != NAME_NOT_FOUND) {
332e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGW("%s: Camera %d: Buffer producer already has a stream for it "
333e5729fac81c8a984e984fefc90afc64135817d4fColin Cross                  "(ID %zd)",
334e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                  __FUNCTION__, mCameraId, index);
335e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return ALREADY_EXISTS;
336e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
337e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
338e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
3391da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    // HACK b/10949105
3401da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    // Query consumer usage bits to set async operation mode for
3411da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    // GLConsumer using controlledByApp parameter.
3421da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    bool useAsync = false;
3431da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    int32_t consumerUsage;
3441da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    if ((res = bufferProducer->query(NATIVE_WINDOW_CONSUMER_USAGE_BITS,
3451da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala            &consumerUsage)) != OK) {
3461da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala        ALOGE("%s: Camera %d: Failed to query consumer usage", __FUNCTION__,
3471da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala              mCameraId);
3481da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala        return res;
3491da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    }
3501da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    if (consumerUsage & GraphicBuffer::USAGE_HW_TEXTURE) {
3511da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala        ALOGW("%s: Camera %d: Forcing asynchronous mode for stream",
3521da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala                __FUNCTION__, mCameraId);
3531da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala        useAsync = true;
3541da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    }
3551da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala
356e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    sp<IBinder> binder;
357e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    sp<ANativeWindow> anw;
358e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (bufferProducer != 0) {
359e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        binder = bufferProducer->asBinder();
3601da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala        anw = new Surface(bufferProducer, useAsync);
361e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
362e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
363e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // TODO: remove w,h,f since we are ignoring them
364e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
365e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ((res = anw->query(anw.get(), NATIVE_WINDOW_WIDTH, &width)) != OK) {
366e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: Camera %d: Failed to query Surface width", __FUNCTION__,
367e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              mCameraId);
368e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return res;
369e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
370e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ((res = anw->query(anw.get(), NATIVE_WINDOW_HEIGHT, &height)) != OK) {
371e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: Camera %d: Failed to query Surface height", __FUNCTION__,
372e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              mCameraId);
373e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return res;
374e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
375e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ((res = anw->query(anw.get(), NATIVE_WINDOW_FORMAT, &format)) != OK) {
376e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: Camera %d: Failed to query Surface format", __FUNCTION__,
377e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              mCameraId);
378e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return res;
379e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
380e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
381e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // FIXME: remove this override since the default format should be
382e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    //       IMPLEMENTATION_DEFINED. b/9487482
3831581101ce2a8c1b8d0b07b643ad891595221d781Igor Murashkin    if (format >= HAL_PIXEL_FORMAT_RGBA_8888 &&
3841581101ce2a8c1b8d0b07b643ad891595221d781Igor Murashkin        format <= HAL_PIXEL_FORMAT_BGRA_8888) {
385e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGW("%s: Camera %d: Overriding format 0x%x to IMPLEMENTATION_DEFINED",
386e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              __FUNCTION__, mCameraId, format);
387e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED;
388e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
389e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
390e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // TODO: add startConfigure/stopConfigure call to CameraDeviceBase
391e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // this will make it so Camera3Device doesn't call configure_streams
392e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // after each call, but only once we are done with all.
393e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
394e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    int streamId = -1;
39528c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He    res = mDevice->createStream(anw, width, height, format, &streamId);
396e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
397e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (res == OK) {
398e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        mStreamMap.add(bufferProducer->asBinder(), streamId);
399e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
400e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGV("%s: Camera %d: Successfully created a new stream ID %d",
401e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              __FUNCTION__, mCameraId, streamId);
402f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
403f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        /**
404f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin         * Set the stream transform flags to automatically
405f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin         * rotate the camera stream for preview use cases.
406f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin         */
407f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        int32_t transform = 0;
408f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        res = getRotationTransformLocked(&transform);
409f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
410f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        if (res != OK) {
411f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin            // Error logged by getRotationTransformLocked.
412f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin            return res;
413f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        }
414f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
415f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        res = mDevice->setStreamTransform(streamId, transform);
416f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        if (res != OK) {
417f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin            ALOGE("%s: Failed to set stream transform (stream id %d)",
418f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin                  __FUNCTION__, streamId);
419f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin            return res;
420f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        }
421f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
422e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return streamId;
423e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
424e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
425e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return res;
426e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
427e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
428e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// Create a request object from a template.
429e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraDeviceClient::createDefaultRequest(int templateId,
430e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                                  /*out*/
431e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                                  CameraMetadata* request)
432e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
433e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ATRACE_CALL();
434e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("%s (templateId = 0x%x)", __FUNCTION__, templateId);
435e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
436e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    status_t res;
437e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
438e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
439e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
440e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
441e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (!mDevice.get()) return DEAD_OBJECT;
442e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
443e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    CameraMetadata metadata;
444e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ( (res = mDevice->createDefaultRequest(templateId, &metadata) ) == OK &&
445e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        request != NULL) {
446e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
447e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        request->swap(metadata);
448e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
449e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
450e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return res;
451e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
452e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
453099b457f3203fa51387e21bd450495abb973ab31Igor Murashkinstatus_t CameraDeviceClient::getCameraInfo(/*out*/CameraMetadata* info)
454e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
455e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ATRACE_CALL();
456e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("%s", __FUNCTION__);
457e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
458e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    status_t res = OK;
459e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
460e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
461e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
462e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
463e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
464e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (!mDevice.get()) return DEAD_OBJECT;
465e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
466099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin    if (info != NULL) {
467099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin        *info = mDevice->info(); // static camera metadata
468099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin        // TODO: merge with device-specific camera metadata
469099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin    }
470e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
471e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return res;
472e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
473e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
4742ab500c632569e2f131a1a2288459933da70c4eeZhijun Hestatus_t CameraDeviceClient::waitUntilIdle()
4752ab500c632569e2f131a1a2288459933da70c4eeZhijun He{
4762ab500c632569e2f131a1a2288459933da70c4eeZhijun He    ATRACE_CALL();
4772ab500c632569e2f131a1a2288459933da70c4eeZhijun He    ALOGV("%s", __FUNCTION__);
4782ab500c632569e2f131a1a2288459933da70c4eeZhijun He
4792ab500c632569e2f131a1a2288459933da70c4eeZhijun He    status_t res = OK;
4802ab500c632569e2f131a1a2288459933da70c4eeZhijun He    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
4812ab500c632569e2f131a1a2288459933da70c4eeZhijun He
4822ab500c632569e2f131a1a2288459933da70c4eeZhijun He    Mutex::Autolock icl(mBinderSerializationLock);
4832ab500c632569e2f131a1a2288459933da70c4eeZhijun He
4842ab500c632569e2f131a1a2288459933da70c4eeZhijun He    if (!mDevice.get()) return DEAD_OBJECT;
4852ab500c632569e2f131a1a2288459933da70c4eeZhijun He
4862ab500c632569e2f131a1a2288459933da70c4eeZhijun He    // FIXME: Also need check repeating burst.
4872ab500c632569e2f131a1a2288459933da70c4eeZhijun He    if (!mStreamingRequestList.isEmpty()) {
4882ab500c632569e2f131a1a2288459933da70c4eeZhijun He        ALOGE("%s: Camera %d: Try to waitUntilIdle when there are active streaming requests",
4892ab500c632569e2f131a1a2288459933da70c4eeZhijun He              __FUNCTION__, mCameraId);
4902ab500c632569e2f131a1a2288459933da70c4eeZhijun He        return INVALID_OPERATION;
4912ab500c632569e2f131a1a2288459933da70c4eeZhijun He    }
4922ab500c632569e2f131a1a2288459933da70c4eeZhijun He    res = mDevice->waitUntilDrained();
4932ab500c632569e2f131a1a2288459933da70c4eeZhijun He    ALOGV("%s Done", __FUNCTION__);
4942ab500c632569e2f131a1a2288459933da70c4eeZhijun He
4952ab500c632569e2f131a1a2288459933da70c4eeZhijun He    return res;
4962ab500c632569e2f131a1a2288459933da70c4eeZhijun He}
4972ab500c632569e2f131a1a2288459933da70c4eeZhijun He
498cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t CameraDeviceClient::flush(int64_t* lastFrameNumber) {
499abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    ATRACE_CALL();
500abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    ALOGV("%s", __FUNCTION__);
501abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
502abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    status_t res = OK;
503abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
504abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
505abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    Mutex::Autolock icl(mBinderSerializationLock);
506abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
507abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    if (!mDevice.get()) return DEAD_OBJECT;
508abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
5093c76fa3e73374dfe7bb93e1b03fed30749e1e4b9Jianing Wei    mStreamingRequestList.clear();
510cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    return mDevice->flush(lastFrameNumber);
511abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala}
512abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
513e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraDeviceClient::dump(int fd, const Vector<String16>& args) {
514e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    String8 result;
515e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    result.appendFormat("CameraDeviceClient[%d] (%p) PID: %d, dump:\n",
516e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            mCameraId,
517e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            getRemoteCallback()->asBinder().get(),
518e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            mClientPid);
519e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    result.append("  State: ");
520e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
521e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // TODO: print dynamic/request section from most recent requests
522e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mFrameProcessor->dump(fd, args);
523e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
524e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return dumpDevice(fd, args);
525e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
526e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
527cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weivoid CameraDeviceClient::notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode,
528cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                     const CaptureResultExtras& resultExtras) {
529f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Thread safe. Don't bother locking.
530f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    sp<ICameraDeviceCallbacks> remoteCb = getRemoteCallback();
531f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
532f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (remoteCb != 0) {
533cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        remoteCb->onDeviceError(errorCode, resultExtras);
534f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
535f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
536f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
537f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid CameraDeviceClient::notifyIdle() {
538f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Thread safe. Don't bother locking.
539f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    sp<ICameraDeviceCallbacks> remoteCb = getRemoteCallback();
540f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
541f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (remoteCb != 0) {
542f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        remoteCb->onDeviceIdle();
543f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
544f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
545f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
546cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weivoid CameraDeviceClient::notifyShutter(const CaptureResultExtras& resultExtras,
547f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        nsecs_t timestamp) {
548f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Thread safe. Don't bother locking.
549f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    sp<ICameraDeviceCallbacks> remoteCb = getRemoteCallback();
550f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (remoteCb != 0) {
551cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        remoteCb->onCaptureStarted(resultExtras, timestamp);
552f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
553f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
554f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
555e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// TODO: refactor the code below this with IProCameraUser.
556e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// it's 100% copy-pasted, so lets not change it right now to make it easier.
557e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
558e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinvoid CameraDeviceClient::detachDevice() {
559e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (mDevice == 0) return;
560e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
561e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("Camera %d: Stopping processors", mCameraId);
562e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
563e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mFrameProcessor->removeListener(FRAME_PROCESSOR_LISTENER_MIN_ID,
564e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                    FRAME_PROCESSOR_LISTENER_MAX_ID,
565e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                    /*listener*/this);
566e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mFrameProcessor->requestExit();
567e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("Camera %d: Waiting for threads", mCameraId);
568e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mFrameProcessor->join();
569e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("Camera %d: Disconnecting device", mCameraId);
570e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
571e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // WORKAROUND: HAL refuses to disconnect while there's streams in flight
572e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
573e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        mDevice->clearStreamingRequest();
574e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
575e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        status_t code;
576e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if ((code = mDevice->waitUntilDrained()) != OK) {
577e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGE("%s: waitUntilDrained failed with code 0x%x", __FUNCTION__,
578e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                  code);
579e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
580e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
581e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
582e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Camera2ClientBase::detachDevice();
583e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
584e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
585e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin/** Device-related methods */
586cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weivoid CameraDeviceClient::onResultAvailable(const CaptureResult& result) {
587e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ATRACE_CALL();
588e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("%s", __FUNCTION__);
589e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
5904fb55c15da1a563ab925914a0f493a3dc80495a3Igor Murashkin    // Thread-safe. No lock necessary.
5914fb55c15da1a563ab925914a0f493a3dc80495a3Igor Murashkin    sp<ICameraDeviceCallbacks> remoteCb = mRemoteCallback;
5924fb55c15da1a563ab925914a0f493a3dc80495a3Igor Murashkin    if (remoteCb != NULL) {
593cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        remoteCb->onResultReceived(result.mMetadata, result.mResultExtras);
594e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
595e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
596e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
597e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// TODO: move to Camera2ClientBase
598e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinbool CameraDeviceClient::enforceRequestPermissions(CameraMetadata& metadata) {
599e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
600e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    const int pid = IPCThreadState::self()->getCallingPid();
601e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    const int selfPid = getpid();
602e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    camera_metadata_entry_t entry;
603e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
604e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /**
605e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     * Mixin default important security values
606e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     * - android.led.transmit = defaulted ON
607e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     */
608e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    CameraMetadata staticInfo = mDevice->info();
609e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    entry = staticInfo.find(ANDROID_LED_AVAILABLE_LEDS);
610e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    for(size_t i = 0; i < entry.count; ++i) {
611e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        uint8_t led = entry.data.u8[i];
612e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
613e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        switch(led) {
614e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            case ANDROID_LED_AVAILABLE_LEDS_TRANSMIT: {
615e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                uint8_t transmitDefault = ANDROID_LED_TRANSMIT_ON;
616e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                if (!metadata.exists(ANDROID_LED_TRANSMIT)) {
617e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                    metadata.update(ANDROID_LED_TRANSMIT,
618e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                    &transmitDefault, 1);
619e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                }
620e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                break;
621e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            }
622e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
623e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
624e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
625e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // We can do anything!
626e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (pid == selfPid) {
627e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return true;
628e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
629e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
630e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /**
631e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     * Permission check special fields in the request
632e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     * - android.led.transmit = android.permission.CAMERA_DISABLE_TRANSMIT
633e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     */
634e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    entry = metadata.find(ANDROID_LED_TRANSMIT);
635e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (entry.count > 0 && entry.data.u8[0] != ANDROID_LED_TRANSMIT_ON) {
636e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        String16 permissionString =
637e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            String16("android.permission.CAMERA_DISABLE_TRANSMIT_LED");
638e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (!checkCallingPermission(permissionString)) {
639e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            const int uid = IPCThreadState::self()->getCallingUid();
640e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGE("Permission Denial: "
641e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                  "can't disable transmit LED pid=%d, uid=%d", pid, uid);
642e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return false;
643e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
644e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
645e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
646e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return true;
647e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
648e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
649f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkinstatus_t CameraDeviceClient::getRotationTransformLocked(int32_t* transform) {
650f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    ALOGV("%s: begin", __FUNCTION__);
651f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
652f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    const CameraMetadata& staticInfo = mDevice->info();
6535698d4461a260dbf208484383f692b03c6473e74Ruben Brunk    return CameraUtils::getRotationTransform(staticInfo, transform);
654f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin}
655f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
656e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin} // namespace android
657