CameraDeviceClient.cpp revision cb0652e5a850b2fcd919e977247e87239efaf70e
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>
267b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/CameraDeviceBase.h"
287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api2/CameraDeviceClient.h"
297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
31e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
32e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinnamespace android {
33e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinusing namespace camera2;
34e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
35e7ee7637747371635a85fedd24d2190bb1f38651Igor MurashkinCameraDeviceClientBase::CameraDeviceClientBase(
36e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        const sp<CameraService>& cameraService,
37e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        const sp<ICameraDeviceCallbacks>& remoteCallback,
38e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        const String16& clientPackageName,
39e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        int cameraId,
40e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        int cameraFacing,
41e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        int clientPid,
42e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        uid_t clientUid,
43e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        int servicePid) :
44e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    BasicClient(cameraService, remoteCallback->asBinder(), clientPackageName,
45e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                cameraId, cameraFacing, clientPid, clientUid, servicePid),
46e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mRemoteCallback(remoteCallback) {
47e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
48e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
49e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// Interface used by CameraService
50e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
51e7ee7637747371635a85fedd24d2190bb1f38651Igor MurashkinCameraDeviceClient::CameraDeviceClient(const sp<CameraService>& cameraService,
52e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                   const sp<ICameraDeviceCallbacks>& remoteCallback,
53e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                   const String16& clientPackageName,
54e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                   int cameraId,
55e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                   int cameraFacing,
56e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                   int clientPid,
57e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                   uid_t clientUid,
58e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                   int servicePid) :
59e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Camera2ClientBase(cameraService, remoteCallback, clientPackageName,
60e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                cameraId, cameraFacing, clientPid, clientUid, servicePid),
61e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mRequestIdCounter(0) {
62e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
63e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ATRACE_CALL();
64e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGI("CameraDeviceClient %d: Opened", cameraId);
65e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
66e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
67e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraDeviceClient::initialize(camera_module_t *module)
68e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
69e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ATRACE_CALL();
70e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    status_t res;
71e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
72e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    res = Camera2ClientBase::initialize(module);
73e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (res != OK) {
74e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return res;
75e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
76e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
77e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    String8 threadName;
787b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala    mFrameProcessor = new FrameProcessorBase(mDevice);
79e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    threadName = String8::format("CDU-%d-FrameProc", mCameraId);
80e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mFrameProcessor->run(threadName.string());
81e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
82e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mFrameProcessor->registerListener(FRAME_PROCESSOR_LISTENER_MIN_ID,
83e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                      FRAME_PROCESSOR_LISTENER_MAX_ID,
84184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala                                      /*listener*/this,
85184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala                                      /*quirkSendPartials*/true);
86e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
87e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return OK;
88e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
89e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
90e7ee7637747371635a85fedd24d2190bb1f38651Igor MurashkinCameraDeviceClient::~CameraDeviceClient() {
91e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
92e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
93e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraDeviceClient::submitRequest(sp<CaptureRequest> request,
94cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                         bool streaming,
95cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                         /*out*/
96cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                         int64_t* lastFrameNumber) {
97cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    List<sp<CaptureRequest> > requestList;
98cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    requestList.push_back(request);
99cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    return submitRequestList(requestList, streaming, lastFrameNumber);
10090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei}
10190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
10290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t CameraDeviceClient::submitRequestList(List<sp<CaptureRequest> > requests,
103cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                               bool streaming, int64_t* lastFrameNumber) {
10490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    ATRACE_CALL();
105cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    ALOGV("%s-start of function. Request list size %d", __FUNCTION__, requests.size());
10690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
10790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    status_t res;
10890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
10990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
11090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    Mutex::Autolock icl(mBinderSerializationLock);
11190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
11290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    if (!mDevice.get()) return DEAD_OBJECT;
11390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
11490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    if (requests.empty()) {
11590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        ALOGE("%s: Camera %d: Sent null request. Rejecting request.",
11690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei              __FUNCTION__, mCameraId);
11790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        return BAD_VALUE;
11890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    }
11990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
12090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    List<const CameraMetadata> metadataRequestList;
12190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    int32_t requestId = mRequestIdCounter;
12290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    uint32_t loopCounter = 0;
12390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
12490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    for (List<sp<CaptureRequest> >::iterator it = requests.begin(); it != requests.end(); ++it) {
12590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        sp<CaptureRequest> request = *it;
12690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        if (request == 0) {
12790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            ALOGE("%s: Camera %d: Sent null request.",
12890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                    __FUNCTION__, mCameraId);
12990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            return BAD_VALUE;
13090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        }
13190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
13290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        CameraMetadata metadata(request->mMetadata);
13390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        if (metadata.isEmpty()) {
13490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            ALOGE("%s: Camera %d: Sent empty metadata packet. Rejecting request.",
13590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                   __FUNCTION__, mCameraId);
13690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            return BAD_VALUE;
13790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        } else if (request->mSurfaceList.isEmpty()) {
13890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            ALOGE("%s: Camera %d: Requests must have at least one surface target. "
13990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                  "Rejecting request.", __FUNCTION__, mCameraId);
14090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            return BAD_VALUE;
14190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        }
14290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
14390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        if (!enforceRequestPermissions(metadata)) {
14490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            // Callee logs
14590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            return PERMISSION_DENIED;
14690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        }
14790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
14890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        /**
14990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei         * Write in the output stream IDs which we calculate from
15090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei         * the capture request's list of surface targets
15190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei         */
15290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        Vector<int32_t> outputStreamIds;
15390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        outputStreamIds.setCapacity(request->mSurfaceList.size());
154cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        for (size_t i = 0; i < request->mSurfaceList.size(); ++i) {
155cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            sp<Surface> surface = request->mSurfaceList[i];
15690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            if (surface == 0) continue;
15790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
15890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            sp<IGraphicBufferProducer> gbp = surface->getIGraphicBufferProducer();
15990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            int idx = mStreamMap.indexOfKey(gbp->asBinder());
16090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
16190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            // Trying to submit request with surface that wasn't created
16290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            if (idx == NAME_NOT_FOUND) {
16390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                ALOGE("%s: Camera %d: Tried to submit a request with a surface that"
16490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                      " we have not called createStream on",
16590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                      __FUNCTION__, mCameraId);
16690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                return BAD_VALUE;
16790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            }
16890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
16990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            int streamId = mStreamMap.valueAt(idx);
17090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            outputStreamIds.push_back(streamId);
17190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            ALOGV("%s: Camera %d: Appending output stream %d to request",
17290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                  __FUNCTION__, mCameraId, streamId);
17390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        }
17490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
17590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        metadata.update(ANDROID_REQUEST_OUTPUT_STREAMS, &outputStreamIds[0],
17690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                        outputStreamIds.size());
17790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
17890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        metadata.update(ANDROID_REQUEST_ID, &requestId, /*size*/1);
17990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        loopCounter++; // loopCounter starts from 1
18090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        ALOGV("%s: Camera %d: Creating request with ID %d (%d of %d)",
18190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei              __FUNCTION__, mCameraId, requestId, loopCounter, requests.size());
18290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
18390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        metadataRequestList.push_back(metadata);
18490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    }
18590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    mRequestIdCounter++;
18690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
18790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    if (streaming) {
188cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        res = mDevice->setStreamingRequestList(metadataRequestList, lastFrameNumber);
18990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        if (res != OK) {
19090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            ALOGE("%s: Camera %d:  Got error %d after trying to set streaming "
19190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                  "request", __FUNCTION__, mCameraId, res);
19290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        } else {
19390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            mStreamingRequestList.push_back(requestId);
19490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        }
19590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    } else {
196cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        res = mDevice->captureList(metadataRequestList, lastFrameNumber);
19790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        if (res != OK) {
19890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            ALOGE("%s: Camera %d: Got error %d after trying to set capture",
19990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                __FUNCTION__, mCameraId, res);
20090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        }
201cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        ALOGV("%s: requestId = %d ", __FUNCTION__, requestId);
20290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    }
20390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
20490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    ALOGV("%s: Camera %d: End of function", __FUNCTION__, mCameraId);
20590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    if (res == OK) {
20690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        return requestId;
20790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    }
208e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
209e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return res;
210e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
211e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
212cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t CameraDeviceClient::cancelRequest(int requestId, int64_t* lastFrameNumber) {
213e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ATRACE_CALL();
214e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("%s, requestId = %d", __FUNCTION__, requestId);
215e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
216e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    status_t res;
217e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
218e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
219e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
220e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
221e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
222e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (!mDevice.get()) return DEAD_OBJECT;
223e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
224e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Vector<int>::iterator it, end;
225e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    for (it = mStreamingRequestList.begin(), end = mStreamingRequestList.end();
226e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin         it != end; ++it) {
227e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (*it == requestId) {
228e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            break;
229e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
230e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
231e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
232e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (it == end) {
233e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: Camera%d: Did not find request id %d in list of streaming "
234e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              "requests", __FUNCTION__, mCameraId, requestId);
235e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return BAD_VALUE;
236e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
237e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
238cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    res = mDevice->clearStreamingRequest(lastFrameNumber);
239e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
240e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (res == OK) {
241e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGV("%s: Camera %d: Successfully cleared streaming request",
242e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              __FUNCTION__, mCameraId);
243e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        mStreamingRequestList.erase(it);
244e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
245e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
246e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return res;
247e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
248e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
249e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraDeviceClient::deleteStream(int streamId) {
250e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ATRACE_CALL();
251e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("%s (streamId = 0x%x)", __FUNCTION__, streamId);
252e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
253e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    status_t res;
254e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
255e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
256e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
257e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
258e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (!mDevice.get()) return DEAD_OBJECT;
259e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
260e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Guard against trying to delete non-created streams
261e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ssize_t index = NAME_NOT_FOUND;
262e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    for (size_t i = 0; i < mStreamMap.size(); ++i) {
263e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (streamId == mStreamMap.valueAt(i)) {
264e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            index = i;
265e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            break;
266e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
267e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
268e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
269e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (index == NAME_NOT_FOUND) {
270e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGW("%s: Camera %d: Invalid stream ID (%d) specified, no stream "
271e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              "created yet", __FUNCTION__, mCameraId, streamId);
272e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return BAD_VALUE;
273e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
274e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
275e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Also returns BAD_VALUE if stream ID was not valid
276e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    res = mDevice->deleteStream(streamId);
277e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
278e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (res == BAD_VALUE) {
279e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: Camera %d: Unexpected BAD_VALUE when deleting stream, but we"
280e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              " already checked and the stream ID (%d) should be valid.",
281e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              __FUNCTION__, mCameraId, streamId);
282e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    } else if (res == OK) {
283e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        mStreamMap.removeItemsAt(index);
284e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
285e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
286e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
287e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return res;
288e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
289e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
290e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraDeviceClient::createStream(int width, int height, int format,
291e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                      const sp<IGraphicBufferProducer>& bufferProducer)
292e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
293e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ATRACE_CALL();
294e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("%s (w = %d, h = %d, f = 0x%x)", __FUNCTION__, width, height, format);
295e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
296e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    status_t res;
297e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
298e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
299e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
300e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
301e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (!mDevice.get()) return DEAD_OBJECT;
302e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
303e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Don't create multiple streams for the same target surface
304e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
305e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ssize_t index = mStreamMap.indexOfKey(bufferProducer->asBinder());
306e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (index != NAME_NOT_FOUND) {
307e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGW("%s: Camera %d: Buffer producer already has a stream for it "
308e5729fac81c8a984e984fefc90afc64135817d4fColin Cross                  "(ID %zd)",
309e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                  __FUNCTION__, mCameraId, index);
310e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return ALREADY_EXISTS;
311e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
312e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
313e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
3141da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    // HACK b/10949105
3151da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    // Query consumer usage bits to set async operation mode for
3161da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    // GLConsumer using controlledByApp parameter.
3171da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    bool useAsync = false;
3181da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    int32_t consumerUsage;
3191da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    if ((res = bufferProducer->query(NATIVE_WINDOW_CONSUMER_USAGE_BITS,
3201da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala            &consumerUsage)) != OK) {
3211da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala        ALOGE("%s: Camera %d: Failed to query consumer usage", __FUNCTION__,
3221da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala              mCameraId);
3231da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala        return res;
3241da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    }
3251da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    if (consumerUsage & GraphicBuffer::USAGE_HW_TEXTURE) {
3261da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala        ALOGW("%s: Camera %d: Forcing asynchronous mode for stream",
3271da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala                __FUNCTION__, mCameraId);
3281da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala        useAsync = true;
3291da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala    }
3301da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala
331e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    sp<IBinder> binder;
332e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    sp<ANativeWindow> anw;
333e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (bufferProducer != 0) {
334e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        binder = bufferProducer->asBinder();
3351da3b602130d71ac3bff1a1fdecdc5e0d7b9d701Eino-Ville Talvala        anw = new Surface(bufferProducer, useAsync);
336e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
337e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
338e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // TODO: remove w,h,f since we are ignoring them
339e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
340e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ((res = anw->query(anw.get(), NATIVE_WINDOW_WIDTH, &width)) != OK) {
341e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: Camera %d: Failed to query Surface width", __FUNCTION__,
342e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              mCameraId);
343e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return res;
344e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
345e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ((res = anw->query(anw.get(), NATIVE_WINDOW_HEIGHT, &height)) != OK) {
346e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: Camera %d: Failed to query Surface height", __FUNCTION__,
347e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              mCameraId);
348e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return res;
349e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
350e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ((res = anw->query(anw.get(), NATIVE_WINDOW_FORMAT, &format)) != OK) {
351e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGE("%s: Camera %d: Failed to query Surface format", __FUNCTION__,
352e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              mCameraId);
353e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return res;
354e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
355e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
356e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // FIXME: remove this override since the default format should be
357e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    //       IMPLEMENTATION_DEFINED. b/9487482
3581581101ce2a8c1b8d0b07b643ad891595221d781Igor Murashkin    if (format >= HAL_PIXEL_FORMAT_RGBA_8888 &&
3591581101ce2a8c1b8d0b07b643ad891595221d781Igor Murashkin        format <= HAL_PIXEL_FORMAT_BGRA_8888) {
360e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGW("%s: Camera %d: Overriding format 0x%x to IMPLEMENTATION_DEFINED",
361e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              __FUNCTION__, mCameraId, format);
362e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED;
363e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
364e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
365e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // TODO: add startConfigure/stopConfigure call to CameraDeviceBase
366e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // this will make it so Camera3Device doesn't call configure_streams
367e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // after each call, but only once we are done with all.
368e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
369e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    int streamId = -1;
370c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala    if (format == HAL_PIXEL_FORMAT_BLOB) {
371c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala        // JPEG buffers need to be sized for maximum possible compressed size
372c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala        CameraMetadata staticInfo = mDevice->info();
373c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala        camera_metadata_entry_t entry = staticInfo.find(ANDROID_JPEG_MAX_SIZE);
374c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala        if (entry.count == 0) {
375c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala            ALOGE("%s: Camera %d: Can't find maximum JPEG size in "
376c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala                    "static metadata!", __FUNCTION__, mCameraId);
377c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala            return INVALID_OPERATION;
378c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala        }
379c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala        int32_t maxJpegSize = entry.data.i32[0];
380c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala        res = mDevice->createStream(anw, width, height, format, maxJpegSize,
381c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala                &streamId);
382c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala    } else {
383c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala        // All other streams are a known size
384c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala        res = mDevice->createStream(anw, width, height, format, /*size*/0,
385c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala                &streamId);
386c7ba4a5c938d191bf0e477fc9b9aa4f0cba986efEino-Ville Talvala    }
387e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
388e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (res == OK) {
389e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        mStreamMap.add(bufferProducer->asBinder(), streamId);
390e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
391e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGV("%s: Camera %d: Successfully created a new stream ID %d",
392e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin              __FUNCTION__, mCameraId, streamId);
393f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
394f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        /**
395f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin         * Set the stream transform flags to automatically
396f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin         * rotate the camera stream for preview use cases.
397f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin         */
398f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        int32_t transform = 0;
399f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        res = getRotationTransformLocked(&transform);
400f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
401f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        if (res != OK) {
402f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin            // Error logged by getRotationTransformLocked.
403f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin            return res;
404f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        }
405f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
406f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        res = mDevice->setStreamTransform(streamId, transform);
407f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        if (res != OK) {
408f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin            ALOGE("%s: Failed to set stream transform (stream id %d)",
409f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin                  __FUNCTION__, streamId);
410f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin            return res;
411f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        }
412f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
413e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return streamId;
414e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
415e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
416e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return res;
417e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
418e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
419e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// Create a request object from a template.
420e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraDeviceClient::createDefaultRequest(int templateId,
421e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                                  /*out*/
422e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                                  CameraMetadata* request)
423e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
424e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ATRACE_CALL();
425e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("%s (templateId = 0x%x)", __FUNCTION__, templateId);
426e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
427e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    status_t res;
428e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
429e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
430e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
431e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
432e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (!mDevice.get()) return DEAD_OBJECT;
433e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
434e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    CameraMetadata metadata;
435e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ( (res = mDevice->createDefaultRequest(templateId, &metadata) ) == OK &&
436e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        request != NULL) {
437e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
438e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        request->swap(metadata);
439e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
440e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
441e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return res;
442e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
443e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
444099b457f3203fa51387e21bd450495abb973ab31Igor Murashkinstatus_t CameraDeviceClient::getCameraInfo(/*out*/CameraMetadata* info)
445e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
446e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ATRACE_CALL();
447e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("%s", __FUNCTION__);
448e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
449e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    status_t res = OK;
450e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
451e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
452e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
453e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
454e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
455e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (!mDevice.get()) return DEAD_OBJECT;
456e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
457099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin    if (info != NULL) {
458099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin        *info = mDevice->info(); // static camera metadata
459099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin        // TODO: merge with device-specific camera metadata
460099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin    }
461e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
462e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return res;
463e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
464e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
4652ab500c632569e2f131a1a2288459933da70c4eeZhijun Hestatus_t CameraDeviceClient::waitUntilIdle()
4662ab500c632569e2f131a1a2288459933da70c4eeZhijun He{
4672ab500c632569e2f131a1a2288459933da70c4eeZhijun He    ATRACE_CALL();
4682ab500c632569e2f131a1a2288459933da70c4eeZhijun He    ALOGV("%s", __FUNCTION__);
4692ab500c632569e2f131a1a2288459933da70c4eeZhijun He
4702ab500c632569e2f131a1a2288459933da70c4eeZhijun He    status_t res = OK;
4712ab500c632569e2f131a1a2288459933da70c4eeZhijun He    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
4722ab500c632569e2f131a1a2288459933da70c4eeZhijun He
4732ab500c632569e2f131a1a2288459933da70c4eeZhijun He    Mutex::Autolock icl(mBinderSerializationLock);
4742ab500c632569e2f131a1a2288459933da70c4eeZhijun He
4752ab500c632569e2f131a1a2288459933da70c4eeZhijun He    if (!mDevice.get()) return DEAD_OBJECT;
4762ab500c632569e2f131a1a2288459933da70c4eeZhijun He
4772ab500c632569e2f131a1a2288459933da70c4eeZhijun He    // FIXME: Also need check repeating burst.
4782ab500c632569e2f131a1a2288459933da70c4eeZhijun He    if (!mStreamingRequestList.isEmpty()) {
4792ab500c632569e2f131a1a2288459933da70c4eeZhijun He        ALOGE("%s: Camera %d: Try to waitUntilIdle when there are active streaming requests",
4802ab500c632569e2f131a1a2288459933da70c4eeZhijun He              __FUNCTION__, mCameraId);
4812ab500c632569e2f131a1a2288459933da70c4eeZhijun He        return INVALID_OPERATION;
4822ab500c632569e2f131a1a2288459933da70c4eeZhijun He    }
4832ab500c632569e2f131a1a2288459933da70c4eeZhijun He    res = mDevice->waitUntilDrained();
4842ab500c632569e2f131a1a2288459933da70c4eeZhijun He    ALOGV("%s Done", __FUNCTION__);
4852ab500c632569e2f131a1a2288459933da70c4eeZhijun He
4862ab500c632569e2f131a1a2288459933da70c4eeZhijun He    return res;
4872ab500c632569e2f131a1a2288459933da70c4eeZhijun He}
4882ab500c632569e2f131a1a2288459933da70c4eeZhijun He
489cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t CameraDeviceClient::flush(int64_t* lastFrameNumber) {
490abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    ATRACE_CALL();
491abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    ALOGV("%s", __FUNCTION__);
492abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
493abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    status_t res = OK;
494abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
495abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
496abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    Mutex::Autolock icl(mBinderSerializationLock);
497abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
498abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    if (!mDevice.get()) return DEAD_OBJECT;
499abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
500cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    return mDevice->flush(lastFrameNumber);
501abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala}
502abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
503e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t CameraDeviceClient::dump(int fd, const Vector<String16>& args) {
504e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    String8 result;
505e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    result.appendFormat("CameraDeviceClient[%d] (%p) PID: %d, dump:\n",
506e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            mCameraId,
507e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            getRemoteCallback()->asBinder().get(),
508e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            mClientPid);
509e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    result.append("  State: ");
510e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
511e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // TODO: print dynamic/request section from most recent requests
512e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mFrameProcessor->dump(fd, args);
513e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
514e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return dumpDevice(fd, args);
515e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
516e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
517cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weivoid CameraDeviceClient::notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode,
518cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                     const CaptureResultExtras& resultExtras) {
519f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Thread safe. Don't bother locking.
520f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    sp<ICameraDeviceCallbacks> remoteCb = getRemoteCallback();
521f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
522f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (remoteCb != 0) {
523cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        remoteCb->onDeviceError(errorCode, resultExtras);
524f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
525f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
526f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
527f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid CameraDeviceClient::notifyIdle() {
528f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Thread safe. Don't bother locking.
529f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    sp<ICameraDeviceCallbacks> remoteCb = getRemoteCallback();
530f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
531f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (remoteCb != 0) {
532f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        remoteCb->onDeviceIdle();
533f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
534f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
535f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
536cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weivoid CameraDeviceClient::notifyShutter(const CaptureResultExtras& resultExtras,
537f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        nsecs_t timestamp) {
538f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Thread safe. Don't bother locking.
539f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    sp<ICameraDeviceCallbacks> remoteCb = getRemoteCallback();
540f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (remoteCb != 0) {
541cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        remoteCb->onCaptureStarted(resultExtras, timestamp);
542f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
543f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
544f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
545e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// TODO: refactor the code below this with IProCameraUser.
546e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// it's 100% copy-pasted, so lets not change it right now to make it easier.
547e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
548e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinvoid CameraDeviceClient::detachDevice() {
549e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (mDevice == 0) return;
550e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
551e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("Camera %d: Stopping processors", mCameraId);
552e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
553e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mFrameProcessor->removeListener(FRAME_PROCESSOR_LISTENER_MIN_ID,
554e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                    FRAME_PROCESSOR_LISTENER_MAX_ID,
555e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                    /*listener*/this);
556e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mFrameProcessor->requestExit();
557e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("Camera %d: Waiting for threads", mCameraId);
558e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    mFrameProcessor->join();
559e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("Camera %d: Disconnecting device", mCameraId);
560e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
561e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // WORKAROUND: HAL refuses to disconnect while there's streams in flight
562e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
563e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        mDevice->clearStreamingRequest();
564e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
565e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        status_t code;
566e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if ((code = mDevice->waitUntilDrained()) != OK) {
567e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGE("%s: waitUntilDrained failed with code 0x%x", __FUNCTION__,
568e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                  code);
569e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
570e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
571e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
572e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    Camera2ClientBase::detachDevice();
573e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
574e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
575e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin/** Device-related methods */
576cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weivoid CameraDeviceClient::onResultAvailable(const CaptureResult& result) {
577e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ATRACE_CALL();
578e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("%s", __FUNCTION__);
579e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
5804fb55c15da1a563ab925914a0f493a3dc80495a3Igor Murashkin    // Thread-safe. No lock necessary.
5814fb55c15da1a563ab925914a0f493a3dc80495a3Igor Murashkin    sp<ICameraDeviceCallbacks> remoteCb = mRemoteCallback;
5824fb55c15da1a563ab925914a0f493a3dc80495a3Igor Murashkin    if (remoteCb != NULL) {
583cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        remoteCb->onResultReceived(result.mMetadata, result.mResultExtras);
584e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
585e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
586e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
587e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// TODO: move to Camera2ClientBase
588e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinbool CameraDeviceClient::enforceRequestPermissions(CameraMetadata& metadata) {
589e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
590e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    const int pid = IPCThreadState::self()->getCallingPid();
591e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    const int selfPid = getpid();
592e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    camera_metadata_entry_t entry;
593e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
594e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /**
595e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     * Mixin default important security values
596e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     * - android.led.transmit = defaulted ON
597e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     */
598e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    CameraMetadata staticInfo = mDevice->info();
599e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    entry = staticInfo.find(ANDROID_LED_AVAILABLE_LEDS);
600e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    for(size_t i = 0; i < entry.count; ++i) {
601e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        uint8_t led = entry.data.u8[i];
602e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
603e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        switch(led) {
604e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            case ANDROID_LED_AVAILABLE_LEDS_TRANSMIT: {
605e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                uint8_t transmitDefault = ANDROID_LED_TRANSMIT_ON;
606e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                if (!metadata.exists(ANDROID_LED_TRANSMIT)) {
607e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                    metadata.update(ANDROID_LED_TRANSMIT,
608e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                    &transmitDefault, 1);
609e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                }
610e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                break;
611e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            }
612e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
613e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
614e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
615e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // We can do anything!
616e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (pid == selfPid) {
617e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return true;
618e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
619e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
620e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    /**
621e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     * Permission check special fields in the request
622e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     * - android.led.transmit = android.permission.CAMERA_DISABLE_TRANSMIT
623e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin     */
624e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    entry = metadata.find(ANDROID_LED_TRANSMIT);
625e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    if (entry.count > 0 && entry.data.u8[0] != ANDROID_LED_TRANSMIT_ON) {
626e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        String16 permissionString =
627e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            String16("android.permission.CAMERA_DISABLE_TRANSMIT_LED");
628e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (!checkCallingPermission(permissionString)) {
629e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            const int uid = IPCThreadState::self()->getCallingUid();
630e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGE("Permission Denial: "
631e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                  "can't disable transmit LED pid=%d, uid=%d", pid, uid);
632e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return false;
633e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
634e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
635e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
636e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    return true;
637e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
638e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
639f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkinstatus_t CameraDeviceClient::getRotationTransformLocked(int32_t* transform) {
640f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    ALOGV("%s: begin", __FUNCTION__);
641f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
642f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    if (transform == NULL) {
643f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        ALOGW("%s: null transform", __FUNCTION__);
644f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        return BAD_VALUE;
645f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    }
646f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
647f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    *transform = 0;
648f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
649f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    const CameraMetadata& staticInfo = mDevice->info();
650f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    camera_metadata_ro_entry_t entry = staticInfo.find(ANDROID_SENSOR_ORIENTATION);
651f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    if (entry.count == 0) {
652f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        ALOGE("%s: Camera %d: Can't find android.sensor.orientation in "
653f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin                "static metadata!", __FUNCTION__, mCameraId);
654f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin        return INVALID_OPERATION;
655f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    }
656f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
657f0b7026fca225581c7711e4d802117869b66e9dcZhijun He    camera_metadata_ro_entry_t entryFacing = staticInfo.find(ANDROID_LENS_FACING);
658f0b7026fca225581c7711e4d802117869b66e9dcZhijun He    if (entry.count == 0) {
659f0b7026fca225581c7711e4d802117869b66e9dcZhijun He        ALOGE("%s: Camera %d: Can't find android.lens.facing in "
660f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                "static metadata!", __FUNCTION__, mCameraId);
661f0b7026fca225581c7711e4d802117869b66e9dcZhijun He        return INVALID_OPERATION;
662f0b7026fca225581c7711e4d802117869b66e9dcZhijun He    }
663f0b7026fca225581c7711e4d802117869b66e9dcZhijun He
664f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    int32_t& flags = *transform;
665f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
666f0b7026fca225581c7711e4d802117869b66e9dcZhijun He    bool mirror = (entryFacing.data.u8[0] == ANDROID_LENS_FACING_FRONT);
667f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    int orientation = entry.data.i32[0];
668f0b7026fca225581c7711e4d802117869b66e9dcZhijun He    if (!mirror) {
669f0b7026fca225581c7711e4d802117869b66e9dcZhijun He        switch (orientation) {
670f0b7026fca225581c7711e4d802117869b66e9dcZhijun He            case 0:
671f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                flags = 0;
672f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                break;
673f0b7026fca225581c7711e4d802117869b66e9dcZhijun He            case 90:
674f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                flags = NATIVE_WINDOW_TRANSFORM_ROT_90;
675f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                break;
676f0b7026fca225581c7711e4d802117869b66e9dcZhijun He            case 180:
677f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                flags = NATIVE_WINDOW_TRANSFORM_ROT_180;
678f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                break;
679f0b7026fca225581c7711e4d802117869b66e9dcZhijun He            case 270:
680f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                flags = NATIVE_WINDOW_TRANSFORM_ROT_270;
681f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                break;
682f0b7026fca225581c7711e4d802117869b66e9dcZhijun He            default:
683f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                ALOGE("%s: Invalid HAL android.sensor.orientation value: %d",
684f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                      __FUNCTION__, orientation);
685f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                return INVALID_OPERATION;
686f0b7026fca225581c7711e4d802117869b66e9dcZhijun He        }
687f0b7026fca225581c7711e4d802117869b66e9dcZhijun He    } else {
688f0b7026fca225581c7711e4d802117869b66e9dcZhijun He        switch (orientation) {
689f0b7026fca225581c7711e4d802117869b66e9dcZhijun He            case 0:
690f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                flags = HAL_TRANSFORM_FLIP_H;
691f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                break;
692f0b7026fca225581c7711e4d802117869b66e9dcZhijun He            case 90:
693f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                flags = HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
694f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                break;
695f0b7026fca225581c7711e4d802117869b66e9dcZhijun He            case 180:
696f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                flags = HAL_TRANSFORM_FLIP_V;
697f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                break;
698f0b7026fca225581c7711e4d802117869b66e9dcZhijun He            case 270:
699f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                flags = HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
700f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                break;
701f0b7026fca225581c7711e4d802117869b66e9dcZhijun He            default:
702f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                ALOGE("%s: Invalid HAL android.sensor.orientation value: %d",
703f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                      __FUNCTION__, orientation);
704f0b7026fca225581c7711e4d802117869b66e9dcZhijun He                return INVALID_OPERATION;
705f0b7026fca225581c7711e4d802117869b66e9dcZhijun He        }
706f0b7026fca225581c7711e4d802117869b66e9dcZhijun He
707f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    }
708f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
709f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    /**
710f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin     * This magic flag makes surfaceflinger un-rotate the buffers
711f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin     * to counter the extra global device UI rotation whenever the user
712f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin     * physically rotates the device.
713f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin     *
714f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin     * By doing this, the camera buffer always ends up aligned
715f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin     * with the physical camera for a "see through" effect.
716f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin     *
717f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin     * In essence, the buffer only gets rotated during preview use-cases.
718f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin     * The user is still responsible to re-create streams of the proper
719f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin     * aspect ratio, or the preview will end up looking non-uniformly
720f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin     * stretched.
721f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin     */
722f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    flags |= NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
723f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
724f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    ALOGV("%s: final transform = 0x%x", __FUNCTION__, flags);
725f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
726f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin    return OK;
727f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin}
728f8b2a6f7dea06234c7966798d9363d2d236488a6Igor Murashkin
729e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin} // namespace android
730