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