Camera3Device.cpp revision 4d2f2e8414df33337d4f09e5235719dfcc705674
17fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/* 27fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Copyright (C) 2013 The Android Open Source Project 37fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * 47fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 57fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * you may not use this file except in compliance with the License. 67fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * You may obtain a copy of the License at 77fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * 87fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 97fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * 107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * See the License for the specific language governing permissions and 147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * limitations under the License. 157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#define LOG_TAG "Camera3-Device" 187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA 197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala//#define LOG_NDEBUG 0 207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala//#define LOG_NNDEBUG 0 // Per-frame verbose logging 217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#ifdef LOG_NNDEBUG 237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#define ALOGVV(...) ALOGV(__VA_ARGS__) 247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#else 257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#define ALOGVV(...) ((void)0) 267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#endif 277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Log.h> 297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Trace.h> 307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Timers.h> 317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include "Camera3Device.h" 32f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala#include "camera3/Camera3OutputStream.h" 337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 34f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalausing namespace android::camera3; 357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 36f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalanamespace android { 377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville TalvalaCamera3Device::Camera3Device(int id): 397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mId(id), 40f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device(NULL), 417d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mStatus(STATUS_UNINITIALIZED), 427d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mListener(NULL) 437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{ 447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera3_callback_ops::notify = &sNotify; 467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera3_callback_ops::process_capture_result = &sProcessCaptureResult; 477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGV("%s: Created device for camera %d", __FUNCTION__, id); 487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville TalvalaCamera3Device::~Camera3Device() 517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{ 527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGV("%s: Tearing down for camera id %d", __FUNCTION__, mId); 547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala disconnect(); 557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5771381051e2d048b2705c447b3d59db6e972493eeIgor Murashkinint Camera3Device::getId() const { 5871381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin return mId; 5971381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin} 6071381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin 61f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 62f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * CameraDeviceBase interface 63f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 64f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::initialize(camera_module_t *module) 667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{ 677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 68f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 69f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGV("%s: Initializing device for camera %d", __FUNCTION__, mId); 71f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mStatus != STATUS_UNINITIALIZED) { 727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGE("%s: Already initialized!", __FUNCTION__); 737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Open HAL device */ 777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala status_t res; 797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala String8 deviceName = String8::format("%d", mId); 807fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera3_device_t *device; 827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = module->common.methods->open(&module->common, deviceName.string(), 847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala reinterpret_cast<hw_device_t**>(&device)); 857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) { 877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGE("%s: Could not open camera %d: %s (%d)", __FUNCTION__, 887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mId, strerror(-res), res); 89f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus = STATUS_ERROR; 907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return res; 917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Cross-check device version */ 947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (device->common.version != CAMERA_DEVICE_API_VERSION_3_0) { 967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGE("%s: Could not open camera %d: " 977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala "Camera device is not version %x, reports %x instead", 987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala __FUNCTION__, mId, CAMERA_DEVICE_API_VERSION_3_0, 997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.version); 1007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 101f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus = STATUS_ERROR; 1027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return BAD_VALUE; 1037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera_info info; 1067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = module->get_camera_info(mId, &info); 1077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) return res; 1087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (info.device_version != device->common.version) { 1107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGE("%s: HAL reporting mismatched camera_info version (%x)" 1117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala " and device version (%x).", __FUNCTION__, 1127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.version, info.device_version); 1137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 114f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus = STATUS_ERROR; 1157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return BAD_VALUE; 1167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Initialize device with callback functions */ 1197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = device->ops->initialize(device, this); 1217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) { 1227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to initialize HAL device: %s (%d)", 1237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 1247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 125f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus = STATUS_ERROR; 1267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return BAD_VALUE; 1277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Get vendor metadata tags */ 1307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mVendorTagOps.get_camera_vendor_section_name = NULL; 1327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->ops->get_metadata_vendor_tag_ops(device, &mVendorTagOps); 1347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (mVendorTagOps.get_camera_vendor_section_name != NULL) { 1367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = set_camera_metadata_vendor_tag_ops(&mVendorTagOps); 1377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) { 1387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set tag ops: %s (%d)", 1397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 1407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 141f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus = STATUS_ERROR; 1427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return res; 1437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Start up request queue thread */ 1477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 148f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread = new RequestThread(this, device); 149f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mRequestThread->run(String8::format("C3Dev-%d-ReqQueue", mId).string()); 1507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) { 1517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to start request queue thread: %s (%d)", 1527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 1537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 154f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread.clear(); 155f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus = STATUS_ERROR; 1567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return res; 1577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Everything is good to go */ 1607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mDeviceInfo = info.static_camera_characteristics; 1627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal3Device = device; 163f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus = STATUS_IDLE; 164f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mNextStreamId = 0; 1657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return OK; 1677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 1687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::disconnect() { 1707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 171f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 1727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 173f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 174f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 175f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 176f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mStatus == STATUS_UNINITIALIZED) return OK; 177f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 178f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mStatus == STATUS_ACTIVE || 179f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala (mStatus == STATUS_ERROR && mRequestThread != NULL)) { 180f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mRequestThread->clearRepeatingRequests(); 181f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 182f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Can't stop streaming", __FUNCTION__); 183f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 184f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 185f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = waitUntilDrainedLocked(); 186f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 187f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Timeout waiting for HAL to drain", __FUNCTION__); 188f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 189f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 190f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 191f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala assert(mStatus == STATUS_IDLE || mStatus == STATUS_ERROR); 192f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 193f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mRequestThread != NULL) { 194f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread->requestExit(); 195f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mOutputStreams.clear(); 198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mInputStream.clear(); 199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mRequestThread != NULL) { 201f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread->join(); 202f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread.clear(); 203f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 204f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 205f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mHal3Device != NULL) { 206f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device->common.close(&mHal3Device->common); 207f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device = NULL; 208f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 209f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 210f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus = STATUS_UNINITIALIZED; 211f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 212f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: X", __FUNCTION__); 213f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 2147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 2157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::dump(int fd, const Vector<String16> &args) { 2177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 2187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)args; 219f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala String8 lines; 220f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 221f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const char *status = 222f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ERROR ? "ERROR" : 223f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_UNINITIALIZED ? "UNINITIALIZED" : 224f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_IDLE ? "IDLE" : 225f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ACTIVE ? "ACTIVE" : 226f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala "Unknown"; 227f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala lines.appendFormat(" Device status: %s\n", status); 228f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala lines.appendFormat(" Stream configuration:\n"); 229f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 230f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream != NULL) { 231f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala write(fd, lines.string(), lines.size()); 232f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mInputStream->dump(fd, args); 233f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 234f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala lines.appendFormat(" No input stream.\n"); 235f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala write(fd, lines.string(), lines.size()); 236f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 237f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < mOutputStreams.size(); i++) { 238f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mOutputStreams[i]->dump(fd,args); 239f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 241f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mHal3Device != NULL) { 242f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala lines = String8(" HAL device dump:\n"); 243f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala write(fd, lines.string(), lines.size()); 244f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device->ops->dump(mHal3Device, fd); 245f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return OK; 2487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 2497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaconst CameraMetadata& Camera3Device::info() const { 2517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGVV("%s: E", __FUNCTION__); 252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (CC_UNLIKELY(mStatus == STATUS_UNINITIALIZED || 253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ERROR)) { 254f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Access to static info %s!", __FUNCTION__, 255f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ERROR ? 256f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala "when in error state" : "before init"); 257f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return mDeviceInfo; 2597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 2607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::capture(CameraMetadata &request) { 2627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 263f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 264f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // TODO: take ownership of the request 2664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 267f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 268f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 269f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Device has encountered a serious error", __FUNCTION__); 270f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 271f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 272f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Device not initialized", __FUNCTION__); 273f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 274f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_IDLE: 275f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 276f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 277f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 278f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 279f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus); 280f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 281f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> newRequest = setUpRequestLocked(request); 284f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (newRequest == NULL) { 285f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Can't create capture request", __FUNCTION__); 286f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return BAD_VALUE; 287f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 288f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 289f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return mRequestThread->queueRequest(newRequest); 2907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 2917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setStreamingRequest(const CameraMetadata &request) { 2947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 295f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 296f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 297f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 298f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 299f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Device has encountered a serious error", __FUNCTION__); 300f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 301f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 302f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Device not initialized", __FUNCTION__); 303f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 304f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_IDLE: 305f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 306f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 307f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 308f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 309f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus); 310f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 311f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 313f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> newRepeatingRequest = setUpRequestLocked(request); 314f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (newRepeatingRequest == NULL) { 315f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Can't create repeating request", __FUNCTION__); 316f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return BAD_VALUE; 317f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 318f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 319f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList newRepeatingRequests; 320f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRepeatingRequests.push_back(newRepeatingRequest); 321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 322f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return mRequestThread->setRepeatingRequests(newRepeatingRequests); 323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 326f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::setUpRequestLocked( 327f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const CameraMetadata &request) { 328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 330f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mStatus == STATUS_IDLE) { 331f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = configureStreamsLocked(); 332f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 333f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Can't set up streams: %s (%d)", 334f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala __FUNCTION__, strerror(-res), res); 335f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 336f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 337f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 338f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 339f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> newRequest = createCaptureRequest(request); 340f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return newRequest; 3417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 3427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::clearStreamingRequest() { 3447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 345f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 346f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 347f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 348f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 349f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Device has encountered a serious error", __FUNCTION__); 350f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 351f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 352f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Device not initialized", __FUNCTION__); 353f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 354f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_IDLE: 355f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 356f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 357f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 358f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 359f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus); 360f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 361f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 363f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return mRequestThread->clearRepeatingRequests(); 3647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 3657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) { 3677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 3687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->waitUntilRequestProcessed(requestId, timeout); 3707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 3717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createStream(sp<ANativeWindow> consumer, 3737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala uint32_t width, uint32_t height, int format, size_t size, int *id) { 3747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 375f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 3767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 377f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 378f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool wasActive = false; 379f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 380f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 381f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 382f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Device has encountered a serious error", __FUNCTION__); 383f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 384f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 385f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Device not initialized", __FUNCTION__); 386f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 387f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_IDLE: 388f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 389f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 390f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 391f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); 392f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread->setPaused(true); 393f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = waitUntilDrainedLocked(); 394f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 395f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Can't pause captures to reconfigure streams!", 396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala __FUNCTION__); 397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus = STATUS_ERROR; 398f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 399f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala wasActive = true; 401f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus); 404f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 405f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 406f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala assert(mStatus == STATUS_IDLE); 407f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 408f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<Camera3OutputStream> newStream; 409f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (format == HAL_PIXEL_FORMAT_BLOB) { 410f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newStream = new Camera3OutputStream(mNextStreamId, consumer, 411f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala width, height, size, format); 412f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 413f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newStream = new Camera3OutputStream(mNextStreamId, consumer, 414f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala width, height, format); 415f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 416f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 417f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mOutputStreams.add(mNextStreamId, newStream); 418f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res < 0) { 419f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Can't add new stream to set: %s (%d)", 420f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala __FUNCTION__, strerror(-res), res); 421f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 422f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 423f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 424f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala *id = mNextStreamId++; 425f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 426f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Continue captures if active at start 427f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (wasActive) { 428f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); 429f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = configureStreamsLocked(); 430f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 431f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)", 432f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala __FUNCTION__, mNextStreamId, strerror(-res), res); 433f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 434f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 435f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread->setPaused(false); 436f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 437f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 438f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 4397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 4407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createReprocessStreamFromStream(int outputId, int *id) { 4427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 4437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)outputId; (void)id; 4447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGE("%s: Unimplemented", __FUNCTION__); 4467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 4477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 4487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::getStreamInfo(int id, 4517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala uint32_t *width, uint32_t *height, uint32_t *format) { 4527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 453f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 454f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 455f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 456f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 457f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Device has encountered a serious error", __FUNCTION__); 458f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 459f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 460f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Device not initialized!", __FUNCTION__); 461f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 462f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_IDLE: 463f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 464f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 465f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 466f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 467f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus); 468f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 469f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 4707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 471f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ssize_t idx = mOutputStreams.indexOfKey(id); 472f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (idx == NAME_NOT_FOUND) { 473f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Stream %d is unknown", __FUNCTION__, id); 474f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return idx; 475f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 476f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 477f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (width) *width = mOutputStreams[idx]->getWidth(); 478f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (height) *height = mOutputStreams[idx]->getHeight(); 479f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (format) *format = mOutputStreams[idx]->getFormat(); 480f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 481f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 4827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 4837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setStreamTransform(int id, 4857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala int transform) { 4867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 487f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 488f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 489f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 490f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 491f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Device has encountered a serious error", __FUNCTION__); 492f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 493f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 494f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Device not initialized", __FUNCTION__); 495f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 496f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_IDLE: 497f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 498f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 499f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 500f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 501f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus); 502f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 503f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 5047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 505f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ssize_t idx = mOutputStreams.indexOfKey(id); 506f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (idx == NAME_NOT_FOUND) { 507f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Stream %d does not exist", 508f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala __FUNCTION__, id); 509f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return BAD_VALUE; 510f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 511f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 512f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return mOutputStreams.editValueAt(idx)->setTransform(transform); 5137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 5147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteStream(int id) { 5167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 517f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 518f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 5197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 520f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // CameraDevice semantics require device to already be idle before 521f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // deleteStream is called, unlike for createStream. 522f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mStatus != STATUS_IDLE) { 523f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Device not idle", __FUNCTION__); 524f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 525f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 526f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 527f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<Camera3Stream> deletedStream; 528f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream != NULL && id == mInputStream->getId()) { 529f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala deletedStream = mInputStream; 530f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mInputStream.clear(); 531f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 532f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ssize_t idx = mOutputStreams.indexOfKey(id); 533f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (idx == NAME_NOT_FOUND) { 534f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Stream %d does not exist", 535f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala __FUNCTION__, id); 536f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return BAD_VALUE; 537f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 538f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala deletedStream = mOutputStreams.editValueAt(idx); 539f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mOutputStreams.removeItem(id); 540f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 541f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 542f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Free up the stream endpoint so that it can be used by some other stream 543f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = deletedStream->disconnect(); 544f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 545f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Can't disconnect deleted stream", __FUNCTION__); 546f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // fall through since we want to still list the stream as deleted. 547f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 548f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDeletedStreams.add(deletedStream); 549f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 550f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 5517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 5527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteReprocessStream(int id) { 5547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 5557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)id; 5567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGE("%s: Unimplemented", __FUNCTION__); 5587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 5597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 5607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createDefaultRequest(int templateId, 5637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala CameraMetadata *request) { 5647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 5657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 566f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 567f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 568f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 569f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 570f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Device has encountered a serious error", __FUNCTION__); 571f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 572f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 573f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Device is not initialized!", __FUNCTION__); 574f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 575f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_IDLE: 576f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 577f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 578f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 579f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 580f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus); 581f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 582f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 5837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera_metadata_t *rawRequest; 5857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala rawRequest = mHal3Device->ops->construct_default_request_settings( 5867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal3Device, templateId); 5877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (rawRequest == NULL) return DEAD_OBJECT; 5887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala *request = rawRequest; 5897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return OK; 5917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 5927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilDrained() { 5947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 595f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 5967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 597f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return waitUntilDrainedLocked(); 598f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 599f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 600f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::waitUntilDrainedLocked() { 601f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ATRACE_CALL(); 602f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 603f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 604f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 605f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 606f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_IDLE: 607f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: Already idle", __FUNCTION__); 608f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 609f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 610f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 611f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Need to shut down 612f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 613f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 614f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus); 615f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 616f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 617f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 618f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mRequestThread != NULL) { 619f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mRequestThread->waitUntilPaused(kShutdownTimeout); 620f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 621f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Can't stop request thread in %f seconds!", 622f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala __FUNCTION__, kShutdownTimeout/1e9); 623f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus = STATUS_ERROR; 624f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 625f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 626f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 627f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream != NULL) { 628f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mInputStream->waitUntilIdle(kShutdownTimeout); 629f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 630f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Can't idle input stream %d in %f seconds!", 631f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala __FUNCTION__, mInputStream->getId(), kShutdownTimeout/1e9); 632f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus = STATUS_ERROR; 633f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 634f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 635f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 636f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < mOutputStreams.size(); i++) { 637f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mOutputStreams.editValueAt(i)->waitUntilIdle(kShutdownTimeout); 638f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 639f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Can't idle output stream %d in %f seconds!", 640f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala __FUNCTION__, mOutputStreams.keyAt(i), 641f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala kShutdownTimeout/1e9); 642f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus = STATUS_ERROR; 643f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 644f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 645f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 646f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 647f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mStatus != STATUS_ERROR) { 648f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus = STATUS_IDLE; 649f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 650f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 651f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 6527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 6537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setNotifyCallback(NotificationListener *listener) { 6557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 6567d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 6577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6587d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (listener != NULL && mListener != NULL) { 6597d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ALOGW("%s: Replacing old callback listener", __FUNCTION__); 6607d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 6617d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mListener = listener; 6627d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 6637d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return OK; 6647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 6657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitForNextFrame(nsecs_t timeout) { 6677d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ATRACE_CALL(); 6687d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala status_t res; 6697d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 6707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6717d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala while (mResultQueue.empty()) { 6727d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala res = mResultSignal.waitRelative(mOutputLock, timeout); 6737d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (res == TIMED_OUT) { 6747d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return res; 6757d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } else if (res != OK) { 6767d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ALOGE("%s: Camera %d: Error waiting for frame: %s (%d)", 6777d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 6787d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return res; 6797d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 6807d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 6817d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return OK; 6827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 6837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::getNextFrame(CameraMetadata *frame) { 6857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 6867d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 6877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6887d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (mResultQueue.empty()) { 6897d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return NOT_ENOUGH_DATA; 6907d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 6917d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 6927d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala CameraMetadata &result = *(mResultQueue.begin()); 6937d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala frame->acquire(result); 6947d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mResultQueue.erase(mResultQueue.begin()); 6957d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 6967d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return OK; 6977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 6987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerAutofocus(uint32_t id) { 7007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 7017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 7024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id); 7034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in this trigger into the next request and only the next request. 7044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[] = { 7054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 7064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER, 7074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_START 7084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 7094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 7104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_ID, 7114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin static_cast<int32_t>(id) 7124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 7134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 7144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 7154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->queueTrigger(trigger, 7164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin sizeof(trigger)/sizeof(trigger[0])); 7177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 7187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 7197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerCancelAutofocus(uint32_t id) { 7207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 7217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 7224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Triggering cancel autofocus, id %d", __FUNCTION__, id); 7234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in this trigger into the next request and only the next request. 7244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[] = { 7254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 7264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER, 7274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_CANCEL 7284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 7294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 7304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_ID, 7314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin static_cast<int32_t>(id) 7324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 7334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 7344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 7354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->queueTrigger(trigger, 7364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin sizeof(trigger)/sizeof(trigger[0])); 7377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 7387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 7397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerPrecaptureMetering(uint32_t id) { 7407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 7417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 7424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id); 7434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in this trigger into the next request and only the next request. 7444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[] = { 7454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 7464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, 7474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START 7484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 7494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 7504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AE_PRECAPTURE_ID, 7514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin static_cast<int32_t>(id) 7524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 7534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 7544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 7554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->queueTrigger(trigger, 7564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin sizeof(trigger)/sizeof(trigger[0])); 7577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 7587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 7597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::pushReprocessBuffer(int reprocessStreamId, 7607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala buffer_handle_t *buffer, wp<BufferReleasedListener> listener) { 7617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 7627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)reprocessStreamId; (void)buffer; (void)listener; 7637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 7647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGE("%s: Unimplemented", __FUNCTION__); 7657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 7667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 7677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 768f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 769f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera3Device private methods 770f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 771f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 772f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::createCaptureRequest( 773f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const CameraMetadata &request) { 774f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ATRACE_CALL(); 775f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 776f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 777f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> newRequest = new CaptureRequest; 778f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings = request; 779f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 780f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera_metadata_entry_t inputStreams = 781f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.find(ANDROID_REQUEST_INPUT_STREAMS); 782f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (inputStreams.count > 0) { 783f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream == NULL || 784f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mInputStream->getId() != inputStreams.data.u8[0]) { 785f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Request references unknown input stream %d", 786f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala __FUNCTION__, inputStreams.data.u8[0]); 787f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 788f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 789f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Lazy completion of stream configuration (allocation/registration) 790f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // on first use 791f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream->isConfiguring()) { 792f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mInputStream->finishConfiguration(mHal3Device); 793f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 794f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Unable to finish configuring input stream %d:" 795f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala " %s (%d)", 796f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala __FUNCTION__, mInputStream->getId(), 797f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala strerror(-res), res); 798f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 799f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 800f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 801f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 802f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mInputStream = mInputStream; 803f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.erase(ANDROID_REQUEST_INPUT_STREAMS); 804f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 805f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 806f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera_metadata_entry_t streams = 807f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.find(ANDROID_REQUEST_OUTPUT_STREAMS); 808f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (streams.count == 0) { 809f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Zero output streams specified!", __FUNCTION__); 810f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 811f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 812f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 813f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < streams.count; i++) { 814f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala int idx = mOutputStreams.indexOfKey(streams.data.u8[i]); 815f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (idx == NAME_NOT_FOUND) { 816f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Request references unknown stream %d", 817f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala __FUNCTION__, streams.data.u8[i]); 818f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 819f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 820f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<Camera3OutputStream> stream = mOutputStreams.editValueAt(idx); 821f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 822f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Lazy completion of stream configuration (allocation/registration) 823f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // on first use 824f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (stream->isConfiguring()) { 825f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = stream->finishConfiguration(mHal3Device); 826f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 827f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Unable to finish configuring stream %d: %s (%d)", 828f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala __FUNCTION__, stream->getId(), strerror(-res), res); 829f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 830f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 831f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 832f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 833f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mOutputStreams.push(stream); 834f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 835f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.erase(ANDROID_REQUEST_OUTPUT_STREAMS); 836f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 837f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return newRequest; 8387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 8397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 840f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::configureStreamsLocked() { 841f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ATRACE_CALL(); 842f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 8437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 844f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mStatus != STATUS_IDLE) { 845f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Not idle", __FUNCTION__); 846f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 847f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 848f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 849f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Start configuring the streams 850f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 851f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_configuration config; 852f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 853f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala config.num_streams = (mInputStream != NULL) + mOutputStreams.size(); 854f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 855f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<camera3_stream_t*> streams; 856f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala streams.setCapacity(config.num_streams); 857f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 858f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream != NULL) { 859f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_t *inputStream; 860f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala inputStream = mInputStream->startConfiguration(); 861f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (inputStream == NULL) { 862f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Can't start input stream configuration", 863f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala __FUNCTION__); 864f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // TODO: Make sure the error flow here is correct 865f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 866f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 867f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala streams.add(inputStream); 868f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 869f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 870f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < mOutputStreams.size(); i++) { 871f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_t *outputStream; 872f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputStream = mOutputStreams.editValueAt(i)->startConfiguration(); 873f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (outputStream == NULL) { 874f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Can't start output stream configuration", 875f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala __FUNCTION__); 876f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // TODO: Make sure the error flow here is correct 877f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 878f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 879f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala streams.add(outputStream); 880f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 881f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 882f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala config.streams = streams.editArray(); 883f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 884f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Do the HAL configuration; will potentially touch stream 885f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // max_buffers, usage, priv fields. 886f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 887f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mHal3Device->ops->configure_streams(mHal3Device, &config); 888f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 889f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 890f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("%s: Unable to configure streams with HAL: %s (%d)", 891f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala __FUNCTION__, strerror(-res), res); 892f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 893f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 894f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 895f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Request thread needs to know to avoid using repeat-last-settings protocol 896f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // across configure_streams() calls 897f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread->configurationComplete(); 898f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 899f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Finish configuring the streams lazily on first reference 900f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 901f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus = STATUS_ACTIVE; 902f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 903f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 9047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 9057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 906f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 907f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 908f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera HAL device callback methods 909f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 910f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 9117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::processCaptureResult(const camera3_capture_result *result) { 9127d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ATRACE_CALL(); 9137d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 9147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala status_t res; 9157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 9167d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (result->result == NULL) { 9177d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // TODO: Report error upstream 9187d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ALOGW("%s: No metadata for frame %d", __FUNCTION__, 9197d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala result->frame_number); 9207d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return; 9217d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 9227d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 9237d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala nsecs_t timestamp = 0; 9247d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala AlgState cur3aState; 9257d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala AlgState new3aState; 9267d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala int32_t aeTriggerId = 0; 9277d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala int32_t afTriggerId = 0; 9287d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 9297d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala NotificationListener *listener; 9307d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 9317d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala { 9327d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 9337d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 9347d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // Push result metadata into queue 9357d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mResultQueue.push_back(CameraMetadata()); 936d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin // Lets avoid copies! Too bad there's not a #back method 937d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin CameraMetadata &captureResult = *(--mResultQueue.end()); 9387d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 9397d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala captureResult = result->result; 940d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin if (captureResult.update(ANDROID_REQUEST_FRAME_COUNT, 941d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin (int32_t*)&result->frame_number, 1) != OK) { 942d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin ALOGE("%s: Camera %d: Failed to set frame# in metadata (%d)", 943d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin __FUNCTION__, mId, result->frame_number); 944d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin // TODO: Report error upstream 945d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin } else { 946d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin ALOGVV("%s: Camera %d: Set frame# in metadata (%d)", 947d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin __FUNCTION__, mId, result->frame_number); 948d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin } 9497d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 9507d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // Get timestamp from result metadata 9517d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 9527d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala camera_metadata_entry entry = 9537d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala captureResult.find(ANDROID_SENSOR_TIMESTAMP); 9547d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (entry.count == 0) { 9557d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ALOGE("%s: Camera %d: No timestamp provided by HAL for frame %d!", 9567d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala __FUNCTION__, mId, result->frame_number); 9577d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // TODO: Report error upstream 9587d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } else { 9597d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala timestamp = entry.data.i64[0]; 9607d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 9617d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 9627d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // Get 3A states from result metadata 9637d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 9647d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala entry = captureResult.find(ANDROID_CONTROL_AE_STATE); 9657d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (entry.count == 0) { 9667d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ALOGE("%s: Camera %d: No AE state provided by HAL for frame %d!", 9677d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala __FUNCTION__, mId, result->frame_number); 9687d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } else { 9697d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala new3aState.aeState = 9707d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala static_cast<camera_metadata_enum_android_control_ae_state>( 9717d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala entry.data.u8[0]); 9727d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 9737d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 9747d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala entry = captureResult.find(ANDROID_CONTROL_AF_STATE); 9757d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (entry.count == 0) { 9767d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ALOGE("%s: Camera %d: No AF state provided by HAL for frame %d!", 9777d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala __FUNCTION__, mId, result->frame_number); 9787d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } else { 9797d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala new3aState.afState = 9807d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala static_cast<camera_metadata_enum_android_control_af_state>( 9817d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala entry.data.u8[0]); 9827d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 9837d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 9847d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala entry = captureResult.find(ANDROID_CONTROL_AWB_STATE); 9857d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (entry.count == 0) { 9867d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ALOGE("%s: Camera %d: No AWB state provided by HAL for frame %d!", 9877d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala __FUNCTION__, mId, result->frame_number); 9887d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } else { 9897d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala new3aState.awbState = 9907d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala static_cast<camera_metadata_enum_android_control_awb_state>( 9917d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala entry.data.u8[0]); 9927d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 9937d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 9947d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala entry = captureResult.find(ANDROID_CONTROL_AF_TRIGGER_ID); 9957d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (entry.count == 0) { 9967d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ALOGE("%s: Camera %d: No AF trigger ID provided by HAL for frame %d!", 9977d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala __FUNCTION__, mId, result->frame_number); 9987d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } else { 9997d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala afTriggerId = entry.data.i32[0]; 10007d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 10017d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 10027d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala entry = captureResult.find(ANDROID_CONTROL_AE_PRECAPTURE_ID); 10037d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (entry.count == 0) { 10047d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ALOGE("%s: Camera %d: No AE precapture trigger ID provided by HAL" 10057d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala " for frame %d!", __FUNCTION__, mId, result->frame_number); 10067d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } else { 10077d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala aeTriggerId = entry.data.i32[0]; 10087d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 10097d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 10107d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala listener = mListener; 10117d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala cur3aState = m3AState; 10127d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 10137d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala m3AState = new3aState; 10147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } // scope for mOutputLock 10157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 10167d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // Return completed buffers to their streams 10177d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala for (size_t i = 0; i < result->num_output_buffers; i++) { 10187d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Camera3Stream *stream = 10197d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Camera3Stream::cast(result->output_buffers[i].stream); 10207d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala res = stream->returnBuffer(result->output_buffers[i], timestamp); 10217d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // Note: stream may be deallocated at this point, if this buffer was the 10227d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // last reference to it. 10237d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (res != OK) { 10247d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ALOGE("%s: Camera %d: Can't return buffer %d for frame %d to its" 10257d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala " stream:%s (%d)", __FUNCTION__, mId, i, 10267d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala result->frame_number, strerror(-res), res); 10277d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // TODO: Report error upstream 10287d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 10297d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 10307d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 10317d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // Dispatch any 3A change events to listeners 10327d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (listener != NULL) { 10337d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (new3aState.aeState != cur3aState.aeState) { 10344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGVV("%s: AE state changed from 0x%x to 0x%x", 10354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, cur3aState.aeState, new3aState.aeState); 10367d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala listener->notifyAutoExposure(new3aState.aeState, aeTriggerId); 10377d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 10387d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (new3aState.afState != cur3aState.afState) { 10394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGVV("%s: AF state changed from 0x%x to 0x%x", 10404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, cur3aState.afState, new3aState.afState); 10417d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala listener->notifyAutoFocus(new3aState.afState, afTriggerId); 10427d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 10437d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (new3aState.awbState != cur3aState.awbState) { 10447d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala listener->notifyAutoWhitebalance(new3aState.awbState, aeTriggerId); 10457d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 10467d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 10477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 10487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 10497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 10507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::notify(const camera3_notify_msg *msg) { 10517d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala NotificationListener *listener; 10527d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala { 10537d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 10547d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (mListener == NULL) return; 10557d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala listener = mListener; 10567d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 10577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 10587d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (msg == NULL) { 10597d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ALOGE("%s: Camera %d: HAL sent NULL notify message!", 10607d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala __FUNCTION__, mId); 10617d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return; 10627d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 10637d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 10647d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala switch (msg->type) { 10657d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala case CAMERA3_MSG_ERROR: { 10667d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala int streamId = 0; 10677d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (msg->message.error.error_stream != NULL) { 10687d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Camera3Stream *stream = 10697d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Camera3Stream::cast( 10707d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala msg->message.error.error_stream); 10717d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala streamId = stream->getId(); 10727d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 10737d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala listener->notifyError(msg->message.error.error_code, 10747d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala msg->message.error.frame_number, streamId); 10757d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala break; 10767d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 10777d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala case CAMERA3_MSG_SHUTTER: { 10787d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala listener->notifyShutter(msg->message.shutter.frame_number, 10797d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala msg->message.shutter.timestamp); 10807d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala break; 10817d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 10827d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala default: 10837d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ALOGE("%s: Camera %d: Unknown notify message from HAL: %d", 10847d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala __FUNCTION__, mId, msg->type); 10857d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 10867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 10877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 10887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/** 1089f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * RequestThread inner class methods 1090f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 1091f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1092f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville TalvalaCamera3Device::RequestThread::RequestThread(wp<Camera3Device> parent, 1093f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *hal3Device) : 1094f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Thread(false), 1095f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mParent(parent), 1096f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device(hal3Device), 1097f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mReconfigured(false), 1098f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDoPause(false), 1099f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused(true), 11004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mFrameNumber(0), 11014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mLatestRequestId(NAME_NOT_FOUND) { 1102f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 1103f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1104f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::configurationComplete() { 1105f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 1106f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mReconfigured = true; 1107f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 1108f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1109f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::queueRequest( 1110f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> request) { 1111f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 1112f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestQueue.push_back(request); 1113f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1114f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 1115f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 1116f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 11174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 11184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTrigger( 11194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[], 11204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin size_t count) { 11214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 11224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock l(mTriggerMutex); 11234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t ret; 11244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 11254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < count; ++i) { 11264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ret = queueTriggerLocked(trigger[i]); 11274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 11284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (ret != OK) { 11294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return ret; 11304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 11314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 11324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 11334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 11344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 11354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 11364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTriggerLocked( 11374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger) { 11384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 11394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t tag = trigger.metadataTag; 11404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ssize_t index = mTriggerMap.indexOfKey(tag); 11414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 11424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin switch (trigger.getTagType()) { 11434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_BYTE: 11444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // fall-through 11454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_INT32: 11464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 11474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin default: 11484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Type not supported: 0x%x", 11494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, 11504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagType()); 11514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return INVALID_OPERATION; 11524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 11534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 11544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 11554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Collect only the latest trigger, since we only have 1 field 11564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * in the request settings per trigger tag, and can't send more than 1 11574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * trigger per request. 11584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 11594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (index != NAME_NOT_FOUND) { 11604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerMap.editValueAt(index) = trigger; 11614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } else { 11624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerMap.add(tag, trigger); 11634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 11644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 11654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 11664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 11674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 1168f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::setRepeatingRequests( 1169f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const RequestList &requests) { 1170f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 1171f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRepeatingRequests.clear(); 1172f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRepeatingRequests.insert(mRepeatingRequests.begin(), 1173f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala requests.begin(), requests.end()); 1174f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 1175f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 1176f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1177f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::clearRepeatingRequests() { 1178f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 1179f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRepeatingRequests.clear(); 1180f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 1181f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 1182f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1183f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::setPaused(bool paused) { 1184f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mPauseLock); 1185f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDoPause = paused; 1186f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDoPauseSignal.signal(); 1187f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 1188f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1189f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::waitUntilPaused(nsecs_t timeout) { 1190f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 1191f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mPauseLock); 1192f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala while (!mPaused) { 1193f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mPausedSignal.waitRelative(mPauseLock, timeout); 1194f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res == TIMED_OUT) { 1195f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 1196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 1199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 1200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 12014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::waitUntilRequestProcessed( 12024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t requestId, nsecs_t timeout) { 12034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock l(mLatestRequestMutex); 12044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res; 12054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin while (mLatestRequestId != requestId) { 12064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin nsecs_t startTime = systemTime(); 12074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 12084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = mLatestRequestSignal.waitRelative(mLatestRequestMutex, timeout); 12094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) return res; 12104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 12114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin timeout -= (systemTime() - startTime); 12124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 12134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 12144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 12154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 12164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 12174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 12184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 1219f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::threadLoop() { 1220f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1221f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 1222f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1223f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Handle paused state. 1224f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (waitIfPaused()) { 1225f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 1226f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1227f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1228f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Get work to do 1229f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1230f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> nextRequest = waitForNextRequest(); 1231f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (nextRequest == NULL) { 1232f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 1233f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1234f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1235f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Create request to HAL 1236f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_capture_request_t request = camera3_capture_request_t(); 12374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Vector<camera3_stream_buffer_t> outputBuffers; 1238f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 12394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Insert any queued triggers (before metadata is locked) 12404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t triggerCount; 12414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = insertTriggers(nextRequest); 12424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res < 0) { 12434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("RequestThread: Unable to insert triggers " 12444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin "(capture request %d, HAL device: %s (%d)", 12454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin (mFrameNumber+1), strerror(-res), res); 12464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin cleanUpFailedRequest(request, nextRequest, outputBuffers); 12474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return false; 12484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 12494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin triggerCount = res; 12504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 12514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin bool triggersMixedIn = (triggerCount > 0 || mPrevTriggers > 0); 12524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 12534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // If the request is the same as last, or we had triggers last time 12544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (mPrevRequest != nextRequest || triggersMixedIn) { 12554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 12564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * The request should be presorted so accesses in HAL 12574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * are O(logn). Sidenote, sorting a sorted metadata is nop. 12584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 12594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin nextRequest->mSettings.sort(); 1260f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.settings = nextRequest->mSettings.getAndLock(); 1261f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPrevRequest = nextRequest; 12624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGVV("%s: Request settings are NEW", __FUNCTION__); 12634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 12644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin IF_ALOGV() { 12654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin camera_metadata_ro_entry_t e = camera_metadata_ro_entry_t(); 12664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin find_camera_metadata_ro_entry( 12674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin request.settings, 12684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER, 12694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &e 12704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ); 12714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (e.count > 0) { 12724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Request (frame num %d) had AF trigger 0x%x", 12734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, 12744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mFrameNumber+1, 12754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin e.data.u8[0]); 12764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 12774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 12784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } else { 12794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // leave request.settings NULL to indicate 'reuse latest given' 12804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGVV("%s: Request settings are REUSED", 12814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__); 12824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 1283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1284f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_buffer_t inputBuffer; 1285f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1286f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Fill in buffers 1287f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1288f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (nextRequest->mInputStream != NULL) { 1289f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.input_buffer = &inputBuffer; 1290f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = nextRequest->mInputStream->getBuffer(&inputBuffer); 1291f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1292f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("RequestThread: Can't get input buffer, skipping request:" 1293f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala " %s (%d)", strerror(-res), res); 1294f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 1295f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 1296f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1297f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 1298f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.input_buffer = NULL; 1299f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1300f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1301f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputBuffers.insertAt(camera3_stream_buffer_t(), 0, 1302f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mOutputStreams.size()); 1303f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.output_buffers = outputBuffers.array(); 1304f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < nextRequest->mOutputStreams.size(); i++) { 1305f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = nextRequest->mOutputStreams.editItemAt(i)-> 1306f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala getBuffer(&outputBuffers.editItemAt(i)); 1307f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1308f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("RequestThread: Can't get output buffer, skipping request:" 1309f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala "%s (%d)", strerror(-res), res); 1310f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 1311f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 1312f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1313f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.num_output_buffers++; 1314f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1315f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1316f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.frame_number = mFrameNumber++; 1317f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 13184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 1319f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Submit request and block until ready for next one 1320f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mHal3Device->ops->process_capture_request(mHal3Device, &request); 1322f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGE("RequestThread: Unable to submit capture request %d to HAL" 1324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala " device: %s (%d)", request.frame_number, strerror(-res), res); 1325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 1326f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return false; 1327f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (request.settings != NULL) { 1330f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mSettings.unlock(request.settings); 1331f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 13324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 13334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Remove any previously queued triggers (after unlock) 13344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = removeTriggers(mPrevRequest); 13354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 13364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("RequestThread: Unable to remove triggers " 13374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin "(capture request %d, HAL device: %s (%d)", 13384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin request.frame_number, strerror(-res), res); 13394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return false; 13404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 13414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mPrevTriggers = triggerCount; 13424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 13434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Read android.request.id from the request settings metadata 13444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // - inform waitUntilRequestProcessed thread of a new request ID 13454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 13464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock al(mLatestRequestMutex); 13474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 13484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin camera_metadata_entry_t requestIdEntry = 13494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin nextRequest->mSettings.find(ANDROID_REQUEST_ID); 13504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (requestIdEntry.count > 0) { 13514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mLatestRequestId = requestIdEntry.data.i32[0]; 13524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } else { 13534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGW("%s: Did not have android.request.id set in the request", 13544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__); 13554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mLatestRequestId = NAME_NOT_FOUND; 13564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 13574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 13584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mLatestRequestSignal.signal(); 13594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 13604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 1361f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 1362f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 1363f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1364f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::cleanUpFailedRequest( 1365f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_capture_request_t &request, 1366f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> &nextRequest, 1367f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<camera3_stream_buffer_t> &outputBuffers) { 1368f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1369f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (request.settings != NULL) { 1370f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mSettings.unlock(request.settings); 1371f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1372f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (request.input_buffer != NULL) { 1373f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.input_buffer->status = CAMERA3_BUFFER_STATUS_ERROR; 1374f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mInputStream->returnBuffer(*(request.input_buffer), 0); 1375f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1376f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < request.num_output_buffers; i++) { 1377f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputBuffers.editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR; 1378f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mOutputStreams.editItemAt(i)->returnBuffer( 1379f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputBuffers[i], 0); 1380f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1381f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // TODO: Report error upstream 1382f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 1383f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1384f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> 1385f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Camera3Device::RequestThread::waitForNextRequest() { 1386f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 1387f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> nextRequest; 1388f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1389f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Optimized a bit for the simple steady-state case (single repeating 1390f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // request), to avoid putting that request in the queue temporarily. 1391f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 1392f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1393f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala while (mRequestQueue.empty()) { 1394f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (!mRepeatingRequests.empty()) { 1395f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Always atomically enqueue all requests in a repeating request 1396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // list. Guarantees a complete in-sequence set of captures to 1397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // application. 1398f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const RequestList &requests = mRepeatingRequests; 1399f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList::const_iterator firstRequest = 1400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala requests.begin(); 1401f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest = *firstRequest; 1402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestQueue.insert(mRequestQueue.end(), 1403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ++firstRequest, 1404f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala requests.end()); 1405f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // No need to wait any longer 1406f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 1407f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1408f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1409f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mRequestSignal.waitRelative(mRequestLock, kRequestTimeout); 1410f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1411f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res == TIMED_OUT) { 1412f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Signal that we're paused by starvation 1413f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock pl(mPauseLock); 1414f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mPaused == false) { 1415f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused = true; 1416f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPausedSignal.signal(); 1417f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1418f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Stop waiting for now and let thread management happen 1419f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1420f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1421f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1422f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1423f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (nextRequest == NULL) { 1424f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Don't have a repeating request already in hand, so queue 1425f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // must have an entry now. 1426f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList::iterator firstRequest = 1427f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestQueue.begin(); 1428f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest = *firstRequest; 1429f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestQueue.erase(firstRequest); 1430f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1431f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1432f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Not paused 1433f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock pl(mPauseLock); 1434f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused = false; 1435f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1436f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Check if we've reconfigured since last time, and reset the preview 1437f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // request if so. Can't use 'NULL request == repeat' across configure calls. 1438f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mReconfigured) { 1439f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPrevRequest.clear(); 1440f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mReconfigured = false; 1441f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1442f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1443f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return nextRequest; 1444f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 1445f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1446f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::waitIfPaused() { 1447f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 1448f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mPauseLock); 1449f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala while (mDoPause) { 1450f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Signal that we're paused by request 1451f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mPaused == false) { 1452f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused = true; 1453f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPausedSignal.signal(); 1454f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1455f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mDoPauseSignal.waitRelative(mPauseLock, kRequestTimeout); 1456f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res == TIMED_OUT) { 1457f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 1458f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1459f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1460f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // We don't set mPaused to false here, because waitForNextRequest needs 1461f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // to further manage the paused state in case of starvation. 1462f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return false; 1463f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 1464f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 14654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::insertTriggers( 14664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const sp<CaptureRequest> &request) { 14674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 14684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock al(mTriggerMutex); 14694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 14704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin CameraMetadata &metadata = request->mSettings; 14714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin size_t count = mTriggerMap.size(); 14724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 14734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < count; ++i) { 14744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger = mTriggerMap.valueAt(i); 14754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 14764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t tag = trigger.metadataTag; 14774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin camera_metadata_entry entry = metadata.find(tag); 14784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 14794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (entry.count > 0) { 14804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 14814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Already has an entry for this trigger in the request. 14824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Rewrite it with our requested trigger value. 14834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 14844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger oldTrigger = trigger; 14854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 14864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin oldTrigger.entryValue = entry.data.u8[0]; 14874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 14884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerReplacedMap.add(tag, oldTrigger); 14894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } else { 14904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 14914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * More typical, no trigger entry, so we just add it 14924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 14934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerRemovedMap.add(tag, trigger); 14944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 14954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 14964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res; 14974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 14984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin switch (trigger.getTagType()) { 14994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_BYTE: { 15004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue); 15014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 15024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &entryValue, 15034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 15044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 15054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 15064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_INT32: 15074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 15084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &trigger.entryValue, 15094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 15104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 15114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin default: 15124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Type not supported: 0x%x", 15134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, 15144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagType()); 15154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return INVALID_OPERATION; 15164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 15174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 15194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Failed to update request metadata with trigger tag %s" 15204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ", value %d", __FUNCTION__, trigger.getTagName(), 15214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.entryValue); 15224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return res; 15234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 15244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Mixed in trigger %s, value %d", __FUNCTION__, 15264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagName(), 15274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.entryValue); 15284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 15294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerMap.clear(); 15314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return count; 15334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 15344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::removeTriggers( 15364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const sp<CaptureRequest> &request) { 15374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock al(mTriggerMutex); 15384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin CameraMetadata &metadata = request->mSettings; 15404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 15424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Replace all old entries with their old values. 15434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 15444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < mTriggerReplacedMap.size(); ++i) { 15454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger = mTriggerReplacedMap.valueAt(i); 15464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res; 15484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t tag = trigger.metadataTag; 15504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin switch (trigger.getTagType()) { 15514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_BYTE: { 15524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue); 15534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 15544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &entryValue, 15554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 15564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 15574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 15584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_INT32: 15594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 15604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &trigger.entryValue, 15614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 15624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 15634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin default: 15644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Type not supported: 0x%x", 15654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, 15664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagType()); 15674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return INVALID_OPERATION; 15684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 15694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 15714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Failed to restore request metadata with trigger tag %s" 15724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ", trigger value %d", __FUNCTION__, 15734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagName(), trigger.entryValue); 15744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return res; 15754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 15764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 15774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerReplacedMap.clear(); 15784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 15804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Remove all new entries. 15814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 15824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < mTriggerRemovedMap.size(); ++i) { 15834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger = mTriggerRemovedMap.valueAt(i); 15844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res = metadata.erase(trigger.metadataTag); 15854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 15874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Failed to erase metadata with trigger tag %s" 15884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ", trigger value %d", __FUNCTION__, 15894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagName(), trigger.entryValue); 15904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return res; 15914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 15924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 15934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerRemovedMap.clear(); 15944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 15964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 15974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 1600f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 16017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Static callback forwarding methods from HAL to instance 16027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 16037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 16047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sProcessCaptureResult(const camera3_callback_ops *cb, 16057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_capture_result *result) { 16067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala Camera3Device *d = 16077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb)); 16087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala d->processCaptureResult(result); 16097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 16107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 16117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sNotify(const camera3_callback_ops *cb, 16127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_notify_msg *msg) { 16137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala Camera3Device *d = 16147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb)); 16157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala d->notify(msg); 16167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 16177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 16187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android 1619