Camera3Device.cpp revision f7da096db8655531c2f2b7bddccd1064b1021155
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 28b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala// Convenience macro for transient errors 29b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala#define CLOGE(fmt, ...) ALOGE("Camera %d: %s: " fmt, mId, __FUNCTION__, \ 30b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala ##__VA_ARGS__) 31b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 32b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala// Convenience macros for transitioning to the error state 33b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala#define SET_ERR(fmt, ...) setErrorState( \ 34b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala "%s: " fmt, __FUNCTION__, \ 35b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala ##__VA_ARGS__) 36b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala#define SET_ERR_L(fmt, ...) setErrorStateLocked( \ 37b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala "%s: " fmt, __FUNCTION__, \ 38b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala ##__VA_ARGS__) 39b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 40e5729fac81c8a984e984fefc90afc64135817d4fColin Cross#include <inttypes.h> 41e5729fac81c8a984e984fefc90afc64135817d4fColin Cross 427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Log.h> 437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Trace.h> 447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Timers.h> 457b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 46ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin#include "utils/CameraTraces.h" 477b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3Device.h" 487b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3OutputStream.h" 497b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3InputStream.h" 507b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3ZslStream.h" 517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 52f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalausing namespace android::camera3; 537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 54f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalanamespace android { 557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville TalvalaCamera3Device::Camera3Device(int id): 577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mId(id), 58f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device(NULL), 597d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mStatus(STATUS_UNINITIALIZED), 60fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala mUsePartialResultQuirk(false), 6142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mNextResultFrameNumber(0), 6242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mNextShutterFrameNumber(0), 637d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mListener(NULL) 647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{ 657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera3_callback_ops::notify = &sNotify; 677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera3_callback_ops::process_capture_result = &sProcessCaptureResult; 687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGV("%s: Created device for camera %d", __FUNCTION__, id); 697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville TalvalaCamera3Device::~Camera3Device() 727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{ 737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGV("%s: Tearing down for camera id %d", __FUNCTION__, mId); 757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala disconnect(); 767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 7871381051e2d048b2705c447b3d59db6e972493eeIgor Murashkinint Camera3Device::getId() const { 7971381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin return mId; 8071381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin} 8171381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin 82f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 83f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * CameraDeviceBase interface 84f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 85f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::initialize(camera_module_t *module) 877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{ 887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 89f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 90f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 91f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGV("%s: Initializing device for camera %d", __FUNCTION__, mId); 93f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mStatus != STATUS_UNINITIALIZED) { 94b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Already initialized!"); 957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Open HAL device */ 997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala status_t res; 1017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala String8 deviceName = String8::format("%d", mId); 1027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera3_device_t *device; 1047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 105213ce79e943a3b51d7859a184d8211c859c960a0Zhijun He ATRACE_BEGIN("camera3->open"); 1067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = module->common.methods->open(&module->common, deviceName.string(), 1077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala reinterpret_cast<hw_device_t**>(&device)); 108213ce79e943a3b51d7859a184d8211c859c960a0Zhijun He ATRACE_END(); 1097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) { 111b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Could not open camera: %s (%d)", strerror(-res), res); 1127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return res; 1137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Cross-check device version */ 1167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11795dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He if (device->common.version < CAMERA_DEVICE_API_VERSION_3_0) { 118b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Could not open camera: " 11995dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He "Camera device should be at least %x, reports %x instead", 120b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CAMERA_DEVICE_API_VERSION_3_0, 1217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.version); 1227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 1237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return BAD_VALUE; 1247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera_info info; 1277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = module->get_camera_info(mId, &info); 1287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) return res; 1297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (info.device_version != device->common.version) { 131b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("HAL reporting mismatched camera_info version (%x)" 132b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala " and device version (%x).", 13395dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He info.device_version, device->common.version); 1347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 1357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return BAD_VALUE; 1367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Initialize device with callback functions */ 1397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 14017a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->initialize"); 1417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = device->ops->initialize(device, this); 14217a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 14317a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala 1447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) { 145b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to initialize HAL device: %s (%d)", 146b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala strerror(-res), res); 1477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 1487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return BAD_VALUE; 1497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 151f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** Start up status tracker thread */ 152f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker = new StatusTracker(this); 153f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = mStatusTracker->run(String8::format("C3Dev-%d-Status", mId).string()); 154f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) { 155f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Unable to start status tracking thread: %s (%d)", 156f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala strerror(-res), res); 157f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala device->common.close(&device->common); 158f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker.clear(); 159f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 160f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 161f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Start up request queue thread */ 1637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 164f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread = new RequestThread(this, mStatusTracker, device); 165f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mRequestThread->run(String8::format("C3Dev-%d-ReqQueue", mId).string()); 1667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) { 167b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to start request queue thread: %s (%d)", 168b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala strerror(-res), res); 1697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 170f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread.clear(); 1717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return res; 1727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Everything is good to go */ 1757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mDeviceInfo = info.static_camera_characteristics; 1777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal3Device = device; 178f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus = STATUS_UNCONFIGURED; 179f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mNextStreamId = 0; 180ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala mNeedConfig = true; 181f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mPauseStateNotify = false; 1827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 183fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala /** Check for quirks */ 184fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 185fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Will the HAL be sending in early partial result metadata? 186fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala camera_metadata_entry partialResultsQuirk = 187fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala mDeviceInfo.find(ANDROID_QUIRKS_USE_PARTIAL_RESULT); 188fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (partialResultsQuirk.count > 0 && partialResultsQuirk.data.u8[0] == 1) { 189fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala mUsePartialResultQuirk = true; 190fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 191fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return OK; 1937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 1947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::disconnect() { 1967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 197f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 201214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala status_t res = OK; 202f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 203f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala { 204f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mLock); 205f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_UNINITIALIZED) return res; 206f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 207f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_ACTIVE || 208f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala (mStatus == STATUS_ERROR && mRequestThread != NULL)) { 209f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = mRequestThread->clearRepeatingRequests(); 210214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala if (res != OK) { 211f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't stop streaming"); 212214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala // Continue to close device even in case of error 213f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } else { 214f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout); 215f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) { 216f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Timeout waiting for HAL to drain"); 217f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Continue to close device even in case of error 218f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 219214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala } 220f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 221f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 222f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_ERROR) { 223f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala CLOGE("Shutting down in an error state"); 224f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 225f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 226f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatusTracker != NULL) { 227f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker->requestExit(); 228f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 229f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 230f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mRequestThread != NULL) { 231f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread->requestExit(); 232f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 233f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 234f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mOutputStreams.clear(); 235f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mInputStream.clear(); 236f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 237f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 238f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Joining done without holding mLock, otherwise deadlocks may ensue 239f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // as the threads try to access parent state 240f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mRequestThread != NULL && mStatus != STATUS_ERROR) { 241f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // HAL may be in a bad state, so waiting for request thread 242f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // (which may be stuck in the HAL processCaptureRequest call) 243f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // could be dangerous. 244f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread->join(); 245214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala } 246214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala 247f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatusTracker != NULL) { 248f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker->join(); 249f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 250f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 251f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala { 252f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mLock); 253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 254f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread.clear(); 255f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker.clear(); 256f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 257f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mHal3Device != NULL) { 258213ce79e943a3b51d7859a184d8211c859c960a0Zhijun He ATRACE_BEGIN("camera3->close"); 259f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mHal3Device->common.close(&mHal3Device->common); 260213ce79e943a3b51d7859a184d8211c859c960a0Zhijun He ATRACE_END(); 261f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mHal3Device = NULL; 262f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 263f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 264f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus = STATUS_UNINITIALIZED; 265f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 266f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 267f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: X", __FUNCTION__); 268214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala return res; 2697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 2707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 271f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// For dumping/debugging only - 272f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// try to acquire a lock a few times, eventually give up to proceed with 273f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// debug/dump operations 274f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalabool Camera3Device::tryLockSpinRightRound(Mutex& lock) { 275f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool gotLock = false; 276f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala for (size_t i = 0; i < kDumpLockAttempts; ++i) { 277f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (lock.tryLock() == NO_ERROR) { 278f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala gotLock = true; 279f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala break; 280f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } else { 281f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala usleep(kDumpSleepDuration); 282f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 283f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 284f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return gotLock; 285f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 286f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 287f7da096db8655531c2f2b7bddccd1064b1021155Zhijun Hessize_t Camera3Device::getJpegBufferSize(uint32_t width, uint32_t height) const { 288f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He // TODO: replace below with availableStreamConfiguration for HAL3.2+. 289f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He camera_metadata_ro_entry availableJpegSizes = 290f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He mDeviceInfo.find(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 291f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He if (availableJpegSizes.count == 0 || availableJpegSizes.count % 2 != 0) { 292f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He ALOGE("%s: Camera %d: Can't find find valid available jpeg sizes in static metadata!", 293f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He __FUNCTION__, mId); 294f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He return BAD_VALUE; 295f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 296f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 297f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He // Get max jpeg size (area-wise). 298f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He int32_t maxJpegWidth = 0, maxJpegHeight = 0; 299f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He bool foundMax = false; 300f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He for (size_t i = 0; i < availableJpegSizes.count; i += 2) { 301f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He if ((availableJpegSizes.data.i32[i] * availableJpegSizes.data.i32[i + 1]) 302f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He > (maxJpegWidth * maxJpegHeight)) { 303f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He maxJpegWidth = availableJpegSizes.data.i32[i]; 304f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He maxJpegHeight = availableJpegSizes.data.i32[i + 1]; 305f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He foundMax = true; 306f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 307f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 308f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He if (!foundMax) { 309f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He return BAD_VALUE; 310f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 311f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 312f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He // Get max jpeg buffer size 313f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He ssize_t maxJpegBufferSize = 0; 314f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He camera_metadata_ro_entry jpegMaxSize = mDeviceInfo.find(ANDROID_JPEG_MAX_SIZE); 315f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He if (jpegMaxSize.count == 0) { 316f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He ALOGE("%s: Camera %d: Can't find maximum JPEG size in static metadata!", __FUNCTION__, mId); 317f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He return BAD_VALUE; 318f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 319f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He maxJpegBufferSize = jpegMaxSize.data.i32[0]; 320f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 321f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He // Calculate final jpeg buffer size for the given resolution. 322f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He float scaleFactor = ((float) (width * height)) / (maxJpegWidth * maxJpegHeight); 323f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He ssize_t jpegBufferSize = scaleFactor * maxJpegBufferSize; 324f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He // Bound the buffer size to [MIN_JPEG_BUFFER_SIZE, maxJpegBufferSize]. 325f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He if (jpegBufferSize > maxJpegBufferSize) { 326f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He jpegBufferSize = maxJpegBufferSize; 327f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } else if (jpegBufferSize < kMinJpegBufferSize) { 328f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He jpegBufferSize = kMinJpegBufferSize; 329f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 330f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 331f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He return jpegBufferSize; 332f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He} 333f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 3347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::dump(int fd, const Vector<String16> &args) { 3357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 3367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)args; 337f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 338f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Try to lock, but continue in case of failure (to avoid blocking in 339f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // deadlocks) 340f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool gotInterfaceLock = tryLockSpinRightRound(mInterfaceLock); 341f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool gotLock = tryLockSpinRightRound(mLock); 342f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 343f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGW_IF(!gotInterfaceLock, 344f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala "Camera %d: %s: Unable to lock interface lock, proceeding anyway", 345f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, __FUNCTION__); 346f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGW_IF(!gotLock, 347f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala "Camera %d: %s: Unable to lock main lock, proceeding anyway", 348f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, __FUNCTION__); 349f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 350f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala String8 lines; 351f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 352f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const char *status = 353f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ERROR ? "ERROR" : 354f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_UNINITIALIZED ? "UNINITIALIZED" : 355f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus == STATUS_UNCONFIGURED ? "UNCONFIGURED" : 356f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus == STATUS_CONFIGURED ? "CONFIGURED" : 357f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ACTIVE ? "ACTIVE" : 358f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala "Unknown"; 359f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 360f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala lines.appendFormat(" Device status: %s\n", status); 361b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala if (mStatus == STATUS_ERROR) { 362b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala lines.appendFormat(" Error cause: %s\n", mErrorCause.string()); 363b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala } 364f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala lines.appendFormat(" Stream configuration:\n"); 365f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 366f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream != NULL) { 367f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala write(fd, lines.string(), lines.size()); 368f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mInputStream->dump(fd, args); 369f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 370f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala lines.appendFormat(" No input stream.\n"); 371f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala write(fd, lines.string(), lines.size()); 372f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 373f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < mOutputStreams.size(); i++) { 374f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mOutputStreams[i]->dump(fd,args); 375f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 37742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala lines = String8(" In-flight requests:\n"); 37842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (mInFlightMap.size() == 0) { 37942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala lines.append(" None\n"); 38042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } else { 38142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala for (size_t i = 0; i < mInFlightMap.size(); i++) { 38242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightRequest r = mInFlightMap.valueAt(i); 383e5729fac81c8a984e984fefc90afc64135817d4fColin Cross lines.appendFormat(" Frame %d | Timestamp: %" PRId64 ", metadata" 38442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala " arrived: %s, buffers left: %d\n", mInFlightMap.keyAt(i), 38542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala r.captureTimestamp, r.haveResultMetadata ? "true" : "false", 38642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala r.numBuffersLeft); 38742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 38842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 38942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala write(fd, lines.string(), lines.size()); 39042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 3911e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin { 3921e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin lines = String8(" Last request sent:\n"); 3931e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin write(fd, lines.string(), lines.size()); 3941e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 395f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala CameraMetadata lastRequest = getLatestRequestLocked(); 3961e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin lastRequest.dump(fd, /*verbosity*/2, /*indentation*/6); 3971e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin } 3981e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 399f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mHal3Device != NULL) { 40042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala lines = String8(" HAL device dump:\n"); 401f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala write(fd, lines.string(), lines.size()); 402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device->ops->dump(mHal3Device, fd); 403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 4047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 405f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (gotLock) mLock.unlock(); 406f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (gotInterfaceLock) mInterfaceLock.unlock(); 407f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 4087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return OK; 4097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 4107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaconst CameraMetadata& Camera3Device::info() const { 4127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGVV("%s: E", __FUNCTION__); 413f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (CC_UNLIKELY(mStatus == STATUS_UNINITIALIZED || 414f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ERROR)) { 415b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala ALOGW("%s: Access to static info %s!", __FUNCTION__, 416f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ERROR ? 417f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala "when in error state" : "before init"); 418f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 4197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return mDeviceInfo; 4207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 4217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 42290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::checkStatusOkToCaptureLocked() { 42390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei switch (mStatus) { 42490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_ERROR: 42590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("Device has encountered a serious error"); 42690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return INVALID_OPERATION; 42790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_UNINITIALIZED: 42890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("Device not initialized"); 42990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return INVALID_OPERATION; 43090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_UNCONFIGURED: 43190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_CONFIGURED: 43290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_ACTIVE: 43390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei // OK 43490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei break; 43590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei default: 43690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei SET_ERR_L("Unexpected status: %d", mStatus); 43790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return INVALID_OPERATION; 43890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 43990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return OK; 44090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 44190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 44290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::convertMetadataListToRequestListLocked( 44390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei const List<const CameraMetadata> &metadataList, RequestList *requestList) { 44490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (requestList == NULL) { 44590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("requestList cannot be NULL."); 44690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return BAD_VALUE; 44790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 44890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 449cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int32_t burstId = 0; 45090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei for (List<const CameraMetadata>::const_iterator it = metadataList.begin(); 45190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei it != metadataList.end(); ++it) { 45290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei sp<CaptureRequest> newRequest = setUpRequestLocked(*it); 45390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (newRequest == 0) { 45490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("Can't create capture request"); 45590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return BAD_VALUE; 45690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 457cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 458cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // Setup burst Id and request Id 459cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei newRequest->mResultExtras.burstId = burstId++; 460cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (it->exists(ANDROID_REQUEST_ID)) { 461cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (it->find(ANDROID_REQUEST_ID).count == 0) { 462cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CLOGE("RequestID entry exists; but must not be empty in metadata"); 463cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return BAD_VALUE; 464cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 465cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei newRequest->mResultExtras.requestId = it->find(ANDROID_REQUEST_ID).data.i32[0]; 466cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } else { 467cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CLOGE("RequestID does not exist in metadata"); 468cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return BAD_VALUE; 469cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 470cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 47190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei requestList->push_back(newRequest); 4722d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei 4732d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGV("%s: requestId = %" PRId32, __FUNCTION__, newRequest->mResultExtras.requestId); 47490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 47590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return OK; 47690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 47790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 478cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::capture(CameraMetadata &request, int64_t* /*lastFrameNumber*/) { 4797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 4804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 4812d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei List<const CameraMetadata> requests; 4822d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei requests.push_back(request); 4832d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei return captureList(requests, /*lastFrameNumber*/NULL); 4847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 4857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 48690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::submitRequestsHelper( 4872d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei const List<const CameraMetadata> &requests, bool repeating, 4882d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 4892d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber) { 49090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ATRACE_CALL(); 49190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei Mutex::Autolock il(mInterfaceLock); 49290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei Mutex::Autolock l(mLock); 49390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 49490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei status_t res = checkStatusOkToCaptureLocked(); 49590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (res != OK) { 49690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei // error logged by previous call 49790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return res; 49890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 49990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 50090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei RequestList requestList; 50190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 50290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei res = convertMetadataListToRequestListLocked(requests, /*out*/&requestList); 50390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (res != OK) { 50490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei // error logged by previous call 50590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return res; 50690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 50790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 50890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (repeating) { 5092d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei res = mRequestThread->setRepeatingRequests(requestList, lastFrameNumber); 51090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } else { 5112d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei res = mRequestThread->queueRequestList(requestList, lastFrameNumber); 51290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 51390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 51490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (res == OK) { 51590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei waitUntilStateThenRelock(/*active*/true, kActiveTimeout); 51690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (res != OK) { 51790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei SET_ERR_L("Can't transition to active in %f seconds!", 51890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei kActiveTimeout/1e9); 51990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 5202d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGV("Camera %d: Capture request %" PRId32 " enqueued", mId, 5212d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei (*(requestList.begin()))->mResultExtras.requestId); 52290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } else { 52390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("Cannot queue request. Impossible."); 52490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return BAD_VALUE; 52590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 52690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 52790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return res; 52890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 52990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 530cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::captureList(const List<const CameraMetadata> &requests, 531cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber) { 53290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ATRACE_CALL(); 53390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 534cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return submitRequestsHelper(requests, /*repeating*/false, lastFrameNumber); 53590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 5367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 537cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::setStreamingRequest(const CameraMetadata &request, 538cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t* /*lastFrameNumber*/) { 5397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 540f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 5412d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei List<const CameraMetadata> requests; 5422d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei requests.push_back(request); 5432d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei return setStreamingRequestList(requests, /*lastFrameNumber*/NULL); 544f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 545f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 546cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::setStreamingRequestList(const List<const CameraMetadata> &requests, 547cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber) { 54890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ATRACE_CALL(); 54990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 550cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return submitRequestsHelper(requests, /*repeating*/true, lastFrameNumber); 55190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 552f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 553f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::setUpRequestLocked( 554f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const CameraMetadata &request) { 555f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 556f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 557f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_UNCONFIGURED || mNeedConfig) { 558f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = configureStreamsLocked(); 559f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 560b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't set up streams: %s (%d)", strerror(-res), res); 561f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 562f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 563f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_UNCONFIGURED) { 564f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala CLOGE("No streams configured"); 565f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return NULL; 566f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 567f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 568f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 569f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> newRequest = createCaptureRequest(request); 570f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return newRequest; 5717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 5727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 573cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::clearStreamingRequest(int64_t *lastFrameNumber) { 5747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 575f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 576f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 577f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 578f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 579f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 580b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 581f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 582f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 583b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device not initialized"); 584f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 585f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 586f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 587f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 588f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 589f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 590f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 591b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 592f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 593f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 594f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Clearing repeating request", mId); 595cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 5962d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei return mRequestThread->clearRepeatingRequests(lastFrameNumber); 5977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 5987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) { 6007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 601f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 6027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->waitUntilRequestProcessed(requestId, timeout); 6047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 6057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6065a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Device::createInputStream( 6075a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin uint32_t width, uint32_t height, int format, int *id) { 6085a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ATRACE_CALL(); 609f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 6105a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin Mutex::Autolock l(mLock); 611f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Creating new input stream %d: %d x %d, format %d", 612f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, mNextStreamId, width, height, format); 6135a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6145a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin status_t res; 6155a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin bool wasActive = false; 6165a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6175a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin switch (mStatus) { 6185a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin case STATUS_ERROR: 6195a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: Device has encountered a serious error", __FUNCTION__); 6205a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 6215a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin case STATUS_UNINITIALIZED: 6225a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: Device not initialized", __FUNCTION__); 6235a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 624f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 625f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 6265a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin // OK 6275a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin break; 6285a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin case STATUS_ACTIVE: 6295a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); 630f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = internalPauseAndWaitLocked(); 6315a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (res != OK) { 632f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't pause captures to reconfigure streams!"); 6335a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return res; 6345a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 6355a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin wasActive = true; 6365a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin break; 6375a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin default: 638f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("%s: Unexpected status: %d", mStatus); 6395a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 6405a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 641f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala assert(mStatus != STATUS_ACTIVE); 6425a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6435a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (mInputStream != 0) { 6445a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__); 6455a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 6465a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 6475a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6485a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin sp<Camera3InputStream> newStream = new Camera3InputStream(mNextStreamId, 6495a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin width, height, format); 650f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala newStream->setStatusTracker(mStatusTracker); 6515a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6525a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin mInputStream = newStream; 6535a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6545a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin *id = mNextStreamId++; 6555a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6565a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin // Continue captures if active at start 6575a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (wasActive) { 6585a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); 6595a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin res = configureStreamsLocked(); 6605a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (res != OK) { 6615a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)", 6625a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin __FUNCTION__, mNextStreamId, strerror(-res), res); 6635a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return res; 6645a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 665f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala internalResumeLocked(); 6665a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 6675a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 668f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Created input stream", mId); 6695a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return OK; 6705a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 6715a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 6732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinstatus_t Camera3Device::createZslStream( 6742fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin uint32_t width, uint32_t height, 6752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int depth, 6762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin /*out*/ 6772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int *id, 6782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3ZslStream>* zslStream) { 6792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ATRACE_CALL(); 680f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 6812fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Mutex::Autolock l(mLock); 682f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Creating ZSL stream %d: %d x %d, depth %d", 683f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, mNextStreamId, width, height, depth); 6842fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 6852fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin status_t res; 6862fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin bool wasActive = false; 6872fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 6882fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin switch (mStatus) { 6892fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin case STATUS_ERROR: 6902fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Device has encountered a serious error", __FUNCTION__); 6912fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 6922fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin case STATUS_UNINITIALIZED: 6932fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Device not initialized", __FUNCTION__); 6942fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 695f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 696f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 6972fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // OK 6982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin break; 6992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin case STATUS_ACTIVE: 7002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); 701f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = internalPauseAndWaitLocked(); 7022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res != OK) { 703f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't pause captures to reconfigure streams!"); 7042fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 7052fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 7062fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin wasActive = true; 7072fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin break; 7082fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin default: 709f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 7102fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 7112fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 712f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala assert(mStatus != STATUS_ACTIVE); 7132fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7142fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (mInputStream != 0) { 7152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__); 7162fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 7172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 7182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3ZslStream> newStream = new Camera3ZslStream(mNextStreamId, 7202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin width, height, depth); 721f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala newStream->setStatusTracker(mStatusTracker); 7222fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = mOutputStreams.add(mNextStreamId, newStream); 7242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res < 0) { 7252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Can't add new stream to set: %s (%d)", 7262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__, strerror(-res), res); 7272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 7282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 7292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mInputStream = newStream; 7302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 731e5e3d0823165dea9211a47232dbbbe361153fb49Yuvraj Pasi mNeedConfig = true; 732e5e3d0823165dea9211a47232dbbbe361153fb49Yuvraj Pasi 7332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin *id = mNextStreamId++; 7342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin *zslStream = newStream; 7352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Continue captures if active at start 7372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (wasActive) { 7382fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); 7392fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = configureStreamsLocked(); 7402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res != OK) { 7412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)", 7422fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__, mNextStreamId, strerror(-res), res); 7432fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 7442fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 745f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala internalResumeLocked(); 7462fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 7472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 748f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Created ZSL stream", mId); 7492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return OK; 7502fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 7512fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createStream(sp<ANativeWindow> consumer, 7537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala uint32_t width, uint32_t height, int format, size_t size, int *id) { 7547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 755f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 756f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 757e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGV("Camera %d: Creating new stream %d: %d x %d, format %d, size %zu", 758f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, mNextStreamId, width, height, format, size); 7597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 760f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 761f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool wasActive = false; 762f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 763f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 764f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 765b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 766f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 767f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 768b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device not initialized"); 769f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 770f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 771f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 772f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 773f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 774f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 775f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); 776f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = internalPauseAndWaitLocked(); 777f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 778f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't pause captures to reconfigure streams!"); 779f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 780f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 781f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala wasActive = true; 782f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 783f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 784b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 785f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 786f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 787f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala assert(mStatus != STATUS_ACTIVE); 788f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 789f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<Camera3OutputStream> newStream; 790f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (format == HAL_PIXEL_FORMAT_BLOB) { 791f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He ssize_t jpegBufferSize = getJpegBufferSize(width, height); 792f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He if (jpegBufferSize > 0) { 793f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He ALOGV("%s: Overwrite Jpeg output buffer size from %zu to %zu", 794f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He __FUNCTION__, size, jpegBufferSize); 795f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } else { 796f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He SET_ERR_L("Invalid jpeg buffer size %zd", jpegBufferSize); 797f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He return BAD_VALUE; 798f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 799f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 800f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newStream = new Camera3OutputStream(mNextStreamId, consumer, 801f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He width, height, jpegBufferSize, format); 802f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 803f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newStream = new Camera3OutputStream(mNextStreamId, consumer, 804f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala width, height, format); 805f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 806f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala newStream->setStatusTracker(mStatusTracker); 807f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 808f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mOutputStreams.add(mNextStreamId, newStream); 809f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res < 0) { 810b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't add new stream to set: %s (%d)", strerror(-res), res); 811f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 812f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 813f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 814f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala *id = mNextStreamId++; 815ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala mNeedConfig = true; 816f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 817f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Continue captures if active at start 818f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (wasActive) { 819f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); 820f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = configureStreamsLocked(); 821f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 822b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Can't reconfigure device for new stream %d: %s (%d)", 823b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala mNextStreamId, strerror(-res), res); 824f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 825f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 826f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala internalResumeLocked(); 827f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 828f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Created new stream", mId); 829f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 8307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 8317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createReprocessStreamFromStream(int outputId, int *id) { 8337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 8347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)outputId; (void)id; 8357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 836b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Unimplemented"); 8377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 8387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 8397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::getStreamInfo(int id, 8427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala uint32_t *width, uint32_t *height, uint32_t *format) { 8437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 844f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 845f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 846f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 847f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 848f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 849b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 850f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 851f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 852b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device not initialized!"); 853f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 854f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 855f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 856f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 857f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 858f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 859f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 860b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 861f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 862f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 8637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 864f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ssize_t idx = mOutputStreams.indexOfKey(id); 865f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (idx == NAME_NOT_FOUND) { 866b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Stream %d is unknown", id); 867f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return idx; 868f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 869f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 870f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (width) *width = mOutputStreams[idx]->getWidth(); 871f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (height) *height = mOutputStreams[idx]->getHeight(); 872f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (format) *format = mOutputStreams[idx]->getFormat(); 873f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 874f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 8757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 8767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setStreamTransform(int id, 8787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala int transform) { 8797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 880f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 881f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 882f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 883f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 884f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 885b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 886f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 887f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 888b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device not initialized"); 889f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 890f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 891f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 892f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 893f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 894f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 895f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 896b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 897f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 898f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 8997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 900f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ssize_t idx = mOutputStreams.indexOfKey(id); 901f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (idx == NAME_NOT_FOUND) { 902b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Stream %d does not exist", 903b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala id); 904f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return BAD_VALUE; 905f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 906f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 907f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return mOutputStreams.editValueAt(idx)->setTransform(transform); 9087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 9097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 9107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteStream(int id) { 9117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 912f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 913f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 914f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 9157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 916e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin ALOGV("%s: Camera %d: Deleting stream %d", __FUNCTION__, mId, id); 917e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin 918f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // CameraDevice semantics require device to already be idle before 919f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // deleteStream is called, unlike for createStream. 920f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_ACTIVE) { 9215282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGV("%s: Camera %d: Device not idle", __FUNCTION__, mId); 9225282713a976184e41451315f1286d8075b257d58Igor Murashkin return -EBUSY; 923f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 924f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 9252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3StreamInterface> deletedStream; 9265f44635dc35814b98b4dc2b255355a93122fec59Zhijun He ssize_t outputStreamIdx = mOutputStreams.indexOfKey(id); 927f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream != NULL && id == mInputStream->getId()) { 928f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala deletedStream = mInputStream; 929f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mInputStream.clear(); 930f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 9315f44635dc35814b98b4dc2b255355a93122fec59Zhijun He if (outputStreamIdx == NAME_NOT_FOUND) { 932b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Stream %d does not exist", id); 933f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return BAD_VALUE; 934f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 9355f44635dc35814b98b4dc2b255355a93122fec59Zhijun He } 9365f44635dc35814b98b4dc2b255355a93122fec59Zhijun He 9375f44635dc35814b98b4dc2b255355a93122fec59Zhijun He // Delete output stream or the output part of a bi-directional stream. 9385f44635dc35814b98b4dc2b255355a93122fec59Zhijun He if (outputStreamIdx != NAME_NOT_FOUND) { 9395f44635dc35814b98b4dc2b255355a93122fec59Zhijun He deletedStream = mOutputStreams.editValueAt(outputStreamIdx); 940f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mOutputStreams.removeItem(id); 941f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 942f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 943f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Free up the stream endpoint so that it can be used by some other stream 944f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = deletedStream->disconnect(); 945f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 946b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't disconnect deleted stream %d", id); 947f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // fall through since we want to still list the stream as deleted. 948f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 949f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDeletedStreams.add(deletedStream); 950ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala mNeedConfig = true; 951f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 952f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 9537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 9547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 9557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteReprocessStream(int id) { 9567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 9577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)id; 9587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 959b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Unimplemented"); 9607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 9617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 9627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 9637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 9647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createDefaultRequest(int templateId, 9657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala CameraMetadata *request) { 9667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 967fe7e0c6154309f2491463ee6ca4920d225289638Alex Ray ALOGV("%s: for template %d", __FUNCTION__, templateId); 968f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 969f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 970f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 971f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 972f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 973b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 974f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 975f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 976b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device is not initialized!"); 977f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 978f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 979f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 980f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 981f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 982f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 983f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 984b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 985f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 986f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 9877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 9887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera_metadata_t *rawRequest; 98917a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->construct_default_request_settings"); 9907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala rawRequest = mHal3Device->ops->construct_default_request_settings( 9917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal3Device, templateId); 99217a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 993b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala if (rawRequest == NULL) { 994b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("HAL is unable to construct default settings for template %d", 995b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala templateId); 996b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala return DEAD_OBJECT; 997b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala } 9987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala *request = rawRequest; 9997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 10007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return OK; 10017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 10027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 10037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilDrained() { 10047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1005f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1006f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 10077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 100869a374897392c8bd70f441b7284f6f578c651ec9Zhijun He return waitUntilDrainedLocked(); 100969a374897392c8bd70f441b7284f6f578c651ec9Zhijun He} 101069a374897392c8bd70f441b7284f6f578c651ec9Zhijun He 101169a374897392c8bd70f441b7284f6f578c651ec9Zhijun Hestatus_t Camera3Device::waitUntilDrainedLocked() { 1012f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 1013f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 1014f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 1015f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: Already idle", __FUNCTION__); 1016f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 1017f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 1018f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // To avoid race conditions, check with tracker to be sure 1019f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 1020f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 1021f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Need to verify shut down 1022f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 1023f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 1024b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d",mStatus); 1025f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1026f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1027f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1028f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Waiting until idle", __FUNCTION__, mId); 1029f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout); 1030f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 1031f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 1032f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1033f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// Pause to reconfigure 1034f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::internalPauseAndWaitLocked() { 1035f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread->setPaused(true); 1036f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mPauseStateNotify = true; 1037f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1038f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Internal wait until idle", __FUNCTION__, mId); 1039f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout); 1040f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) { 1041f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't idle device in %f seconds!", 1042f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala kShutdownTimeout/1e9); 1043f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1044f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1045f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 1046f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 1047f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1048f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// Resume after internalPauseAndWaitLocked 1049f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::internalResumeLocked() { 1050f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t res; 1051f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1052f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread->setPaused(false); 1053f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1054f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = waitUntilStateThenRelock(/*active*/ true, kActiveTimeout); 1055f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) { 1056f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't transition to active in %f seconds!", 1057f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala kActiveTimeout/1e9); 1058f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1059f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mPauseStateNotify = false; 1060f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return OK; 1061f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 1062f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1063f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::waitUntilStateThenRelock(bool active, 1064f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala nsecs_t timeout) { 1065f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t res = OK; 1066f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (active == (mStatus == STATUS_ACTIVE)) { 1067f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Desired state already reached 1068f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 1069f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1070f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1071f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool stateSeen = false; 1072f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala do { 1073f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRecentStatusUpdates.clear(); 1074f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1075f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = mStatusChanged.waitRelative(mLock, timeout); 1076f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) break; 1077f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1078f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Check state change history during wait 1079f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala for (size_t i = 0; i < mRecentStatusUpdates.size(); i++) { 1080f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (active == (mRecentStatusUpdates[i] == STATUS_ACTIVE) ) { 1081f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala stateSeen = true; 1082f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala break; 1083f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1084f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1085f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } while (!stateSeen); 1086f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1087f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 10887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 10897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1090f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 10917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setNotifyCallback(NotificationListener *listener) { 10927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 10937d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 10947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 10957d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (listener != NULL && mListener != NULL) { 10967d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ALOGW("%s: Replacing old callback listener", __FUNCTION__); 10977d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 10987d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mListener = listener; 10997d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 11007d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return OK; 11017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 11027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 110346910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvalabool Camera3Device::willNotify3A() { 110446910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala return false; 110546910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala} 110646910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala 11077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitForNextFrame(nsecs_t timeout) { 11087d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala status_t res; 11097d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 11107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11117d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala while (mResultQueue.empty()) { 11127d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala res = mResultSignal.waitRelative(mOutputLock, timeout); 11137d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (res == TIMED_OUT) { 11147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return res; 11157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } else if (res != OK) { 1116e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGW("%s: Camera %d: No frame in %" PRId64 " ns: %s (%d)", 1117b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala __FUNCTION__, mId, timeout, strerror(-res), res); 11187d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return res; 11197d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 11207d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 11217d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return OK; 11227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 11237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1124cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::getNextResult(CaptureResult *frame) { 11257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 11267d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 11277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11287d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (mResultQueue.empty()) { 11297d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return NOT_ENOUGH_DATA; 11307d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 11317d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 1132cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (frame == NULL) { 1133cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGE("%s: argument cannot be NULL", __FUNCTION__); 1134cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return BAD_VALUE; 1135cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 1136cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 1137cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResult &result = *(mResultQueue.begin()); 1138cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei frame->mResultExtras = result.mResultExtras; 1139cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei frame->mMetadata.acquire(result.mMetadata); 11407d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mResultQueue.erase(mResultQueue.begin()); 11417d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 11427d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return OK; 11437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 11447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerAutofocus(uint32_t id) { 11467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1147f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 11487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id); 11504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in this trigger into the next request and only the next request. 11514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[] = { 11524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 11534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER, 11544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_START 11554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 11564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 11574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_ID, 11584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin static_cast<int32_t>(id) 11594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 11604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 11614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 11624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->queueTrigger(trigger, 11634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin sizeof(trigger)/sizeof(trigger[0])); 11647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 11657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerCancelAutofocus(uint32_t id) { 11677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1168f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 11697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Triggering cancel autofocus, id %d", __FUNCTION__, id); 11714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in this trigger into the next request and only the next request. 11724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[] = { 11734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 11744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER, 11754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_CANCEL 11764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 11774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 11784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_ID, 11794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin static_cast<int32_t>(id) 11804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 11814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 11824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 11834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->queueTrigger(trigger, 11844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin sizeof(trigger)/sizeof(trigger[0])); 11857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 11867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerPrecaptureMetering(uint32_t id) { 11887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1189f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 11907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id); 11924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in this trigger into the next request and only the next request. 11934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[] = { 11944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 11954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, 11964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START 11974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 11984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 11994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AE_PRECAPTURE_ID, 12004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin static_cast<int32_t>(id) 12014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 12024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 12034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 12044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->queueTrigger(trigger, 12054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin sizeof(trigger)/sizeof(trigger[0])); 12067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 12077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 12087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::pushReprocessBuffer(int reprocessStreamId, 12097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala buffer_handle_t *buffer, wp<BufferReleasedListener> listener) { 12107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 12117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)reprocessStreamId; (void)buffer; (void)listener; 12127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1213b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Unimplemented"); 12147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 12157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 12167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1217cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::flush(int64_t *frameNumber) { 1218abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala ATRACE_CALL(); 1219abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala ALOGV("%s: Camera %d: Flushing all requests", __FUNCTION__, mId); 1220f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1221abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 12227ef20390ba4375c4b08edd14923846086987a8c8Zhijun He { 12237ef20390ba4375c4b08edd14923846086987a8c8Zhijun He Mutex::Autolock l(mLock); 12247ef20390ba4375c4b08edd14923846086987a8c8Zhijun He mRequestThread->clear(/*out*/frameNumber); 12257ef20390ba4375c4b08edd14923846086987a8c8Zhijun He } 12267ef20390ba4375c4b08edd14923846086987a8c8Zhijun He 1227491e341211b4772c75f719158f6b397e1c40497dZhijun He status_t res; 1228491e341211b4772c75f719158f6b397e1c40497dZhijun He if (mHal3Device->common.version >= CAMERA_DEVICE_API_VERSION_3_1) { 1229491e341211b4772c75f719158f6b397e1c40497dZhijun He res = mHal3Device->ops->flush(mHal3Device); 1230491e341211b4772c75f719158f6b397e1c40497dZhijun He } else { 12317ef20390ba4375c4b08edd14923846086987a8c8Zhijun He Mutex::Autolock l(mLock); 123269a374897392c8bd70f441b7284f6f578c651ec9Zhijun He res = waitUntilDrainedLocked(); 1233491e341211b4772c75f719158f6b397e1c40497dZhijun He } 1234491e341211b4772c75f719158f6b397e1c40497dZhijun He 1235491e341211b4772c75f719158f6b397e1c40497dZhijun He return res; 1236abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala} 1237abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 1238f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 1239f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Methods called by subclasses 1240f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 1241f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1242f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid Camera3Device::notifyStatus(bool idle) { 1243f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala { 1244f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Need mLock to safely update state and synchronize to current 1245f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // state of methods in flight. 1246f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mLock); 1247f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // We can get various system-idle notices from the status tracker 1248f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // while starting up. Only care about them if we've actually sent 1249f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // in some requests recently. 1250f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus != STATUS_ACTIVE && mStatus != STATUS_CONFIGURED) { 1251f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return; 1252f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1253f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Now %s", __FUNCTION__, mId, 1254f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala idle ? "idle" : "active"); 1255f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus = idle ? STATUS_CONFIGURED : STATUS_ACTIVE; 1256f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRecentStatusUpdates.add(mStatus); 1257f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusChanged.signal(); 1258f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1259f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Skip notifying listener if we're doing some user-transparent 1260f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // state changes 1261f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mPauseStateNotify) return; 1262f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1263f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala NotificationListener *listener; 1264f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala { 1265f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mOutputLock); 1266f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala listener = mListener; 1267f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1268f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (idle && listener != NULL) { 1269f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala listener->notifyIdle(); 1270f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1271f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 1272f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1273f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala/** 1274f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera3Device private methods 1275f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 1276f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1277f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::createCaptureRequest( 1278f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const CameraMetadata &request) { 1279f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ATRACE_CALL(); 1280f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 1281f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1282f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> newRequest = new CaptureRequest; 1283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings = request; 1284f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1285f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera_metadata_entry_t inputStreams = 1286f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.find(ANDROID_REQUEST_INPUT_STREAMS); 1287f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (inputStreams.count > 0) { 1288f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream == NULL || 1289d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He mInputStream->getId() != inputStreams.data.i32[0]) { 1290b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Request references unknown input stream %d", 1291b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala inputStreams.data.u8[0]); 1292f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1293f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1294f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Lazy completion of stream configuration (allocation/registration) 1295f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // on first use 1296f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream->isConfiguring()) { 1297f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mInputStream->finishConfiguration(mHal3Device); 1298f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1299b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to finish configuring input stream %d:" 1300f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala " %s (%d)", 1301b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala mInputStream->getId(), strerror(-res), res); 1302f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1303f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1304f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1305f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1306f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mInputStream = mInputStream; 1307f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.erase(ANDROID_REQUEST_INPUT_STREAMS); 1308f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1309f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1310f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera_metadata_entry_t streams = 1311f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.find(ANDROID_REQUEST_OUTPUT_STREAMS); 1312f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (streams.count == 0) { 1313b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Zero output streams specified!"); 1314f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1315f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1316f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1317f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < streams.count; i++) { 1318d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He int idx = mOutputStreams.indexOfKey(streams.data.i32[i]); 1319f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (idx == NAME_NOT_FOUND) { 1320b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Request references unknown stream %d", 1321b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala streams.data.u8[i]); 1322f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 13242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3OutputStreamInterface> stream = 13252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mOutputStreams.editValueAt(idx); 1326f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1327f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Lazy completion of stream configuration (allocation/registration) 1328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // on first use 1329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (stream->isConfiguring()) { 1330f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = stream->finishConfiguration(mHal3Device); 1331f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1332b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to finish configuring stream %d: %s (%d)", 1333b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala stream->getId(), strerror(-res), res); 1334f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1335f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1336f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1337f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1338f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mOutputStreams.push(stream); 1339f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1340f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.erase(ANDROID_REQUEST_OUTPUT_STREAMS); 1341f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1342f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return newRequest; 13437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 13447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1345f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::configureStreamsLocked() { 1346f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ATRACE_CALL(); 1347f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 13487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1349f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus != STATUS_UNCONFIGURED && mStatus != STATUS_CONFIGURED) { 1350b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Not idle"); 1351f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1352f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1353f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1354ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala if (!mNeedConfig) { 1355ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala ALOGV("%s: Skipping config, no stream changes", __FUNCTION__); 1356ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala return OK; 1357ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala } 1358ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala 1359f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Start configuring the streams 1360f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Starting stream configuration", __FUNCTION__, mId); 1361f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1362f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_configuration config; 1363f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1364f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala config.num_streams = (mInputStream != NULL) + mOutputStreams.size(); 1365f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1366f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<camera3_stream_t*> streams; 1367f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala streams.setCapacity(config.num_streams); 1368f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1369f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream != NULL) { 1370f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_t *inputStream; 1371f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala inputStream = mInputStream->startConfiguration(); 1372f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (inputStream == NULL) { 1373b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't start input stream configuration"); 1374f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1375f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1376f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala streams.add(inputStream); 1377f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1378f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1379f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < mOutputStreams.size(); i++) { 13802fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 13812fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Don't configure bidi streams twice, nor add them twice to the list 13822fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (mOutputStreams[i].get() == 13832fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin static_cast<Camera3StreamInterface*>(mInputStream.get())) { 13842fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 13852fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin config.num_streams--; 13862fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin continue; 13872fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 13882fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1389f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_t *outputStream; 1390f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputStream = mOutputStreams.editValueAt(i)->startConfiguration(); 1391f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (outputStream == NULL) { 1392b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't start output stream configuration"); 1393f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1394f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1395f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala streams.add(outputStream); 1396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1398f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala config.streams = streams.editArray(); 1399f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Do the HAL configuration; will potentially touch stream 1401f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // max_buffers, usage, priv fields. 140217a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->configure_streams"); 1403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mHal3Device->ops->configure_streams(mHal3Device, &config); 140417a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 1405f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1406f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1407b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to configure streams with HAL: %s (%d)", 1408b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala strerror(-res), res); 1409f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 1410f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1411f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 14124c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala // Finish all stream configuration immediately. 14134c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala // TODO: Try to relax this later back to lazy completion, which should be 14144c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala // faster 14154c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala 1416073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin if (mInputStream != NULL && mInputStream->isConfiguring()) { 14174c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala res = mInputStream->finishConfiguration(mHal3Device); 14184c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala if (res != OK) { 14194c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala SET_ERR_L("Can't finish configuring input stream %d: %s (%d)", 14204c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala mInputStream->getId(), strerror(-res), res); 14214c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala return res; 14224c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala } 14234c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala } 14244c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala 14254c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala for (size_t i = 0; i < mOutputStreams.size(); i++) { 1426073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin sp<Camera3OutputStreamInterface> outputStream = 1427073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin mOutputStreams.editValueAt(i); 1428073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin if (outputStream->isConfiguring()) { 1429073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin res = outputStream->finishConfiguration(mHal3Device); 1430073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin if (res != OK) { 1431073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin SET_ERR_L("Can't finish configuring output stream %d: %s (%d)", 1432073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin outputStream->getId(), strerror(-res), res); 1433073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin return res; 1434073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin } 14354c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala } 14364c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala } 14374c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala 1438f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Request thread needs to know to avoid using repeat-last-settings protocol 1439f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // across configure_streams() calls 1440f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread->configurationComplete(); 1441f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1442f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Update device state 1443f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1444ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala mNeedConfig = false; 1445f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1446f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (config.num_streams > 0) { 1447f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus = STATUS_CONFIGURED; 1448f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } else { 1449f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus = STATUS_UNCONFIGURED; 1450f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1451f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1452f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Stream configuration complete", __FUNCTION__, mId); 1453f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1454f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 14557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 14567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1457b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorState(const char *fmt, ...) { 1458b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala Mutex::Autolock l(mLock); 1459b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_list args; 1460b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_start(args, fmt); 1461b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1462b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala setErrorStateLockedV(fmt, args); 1463b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1464b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_end(args); 1465b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 1466b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1467b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateV(const char *fmt, va_list args) { 1468b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala Mutex::Autolock l(mLock); 1469b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala setErrorStateLockedV(fmt, args); 1470b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 1471b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1472b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateLocked(const char *fmt, ...) { 1473b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_list args; 1474b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_start(args, fmt); 1475b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1476b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala setErrorStateLockedV(fmt, args); 1477b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1478b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_end(args); 1479b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 1480b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1481b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateLockedV(const char *fmt, va_list args) { 148242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Print out all error messages to log 148342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala String8 errorCause = String8::formatV(fmt, args); 148442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ALOGE("Camera %d: %s", mId, errorCause.string()); 148542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 148642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // But only do error state transition steps for the first error 1487b05eeaedacaff92b6e5ac89f99b0fccdf7643f09Zhijun He if (mStatus == STATUS_ERROR || mStatus == STATUS_UNINITIALIZED) return; 1488b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1489ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin // Save stack trace. View by dumping it later. 1490ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin CameraTraces::saveTrace(); 1491ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin // TODO: consider adding errorCause and client pid/procname 1492ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin 149342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mErrorCause = errorCause; 149442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 149542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mRequestThread->setPaused(true); 1496b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala mStatus = STATUS_ERROR; 1497b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 1498f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1499f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 150042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala * In-flight request management 150142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala */ 150242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 1503cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::registerInFlight(uint32_t frameNumber, 1504cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int32_t numBuffers, CaptureResultExtras resultExtras) { 150542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ATRACE_CALL(); 150642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex::Autolock l(mInFlightLock); 150742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 150842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ssize_t res; 1509cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei res = mInFlightMap.add(frameNumber, InFlightRequest(numBuffers, resultExtras)); 151042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (res < 0) return res; 151142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 151242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return OK; 151342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala} 151442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 151542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala/** 1516fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * QUIRK(partial results) 1517fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * Check if all 3A fields are ready, and send off a partial 3A-only result 1518fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * to the output frame queue 1519fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala */ 1520184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvalabool Camera3Device::processPartial3AQuirk( 1521cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei uint32_t frameNumber, 1522cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei const CameraMetadata& partial, const CaptureResultExtras& resultExtras) { 1523fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1524fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Check if all 3A states are present 1525fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // The full list of fields is 1526fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.afMode 1527fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.awbMode 1528fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.aeState 1529fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.awbState 1530fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.afState 1531fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.afTriggerID 1532fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.aePrecaptureID 1533fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // TODO: Add android.control.aeMode 1534fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1535fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool gotAllStates = true; 1536fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1537fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint8_t afMode; 1538fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint8_t awbMode; 1539fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint8_t aeState; 1540fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint8_t afState; 1541fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint8_t awbState; 1542fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala int32_t afTriggerId; 1543fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala int32_t aeTriggerId; 1544fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1545fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AF_MODE, 1546fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &afMode, frameNumber); 1547fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1548fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AWB_MODE, 1549fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &awbMode, frameNumber); 1550fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1551fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AE_STATE, 1552fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &aeState, frameNumber); 1553fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1554fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AF_STATE, 1555fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &afState, frameNumber); 1556fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1557fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AWB_STATE, 1558fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &awbState, frameNumber); 1559fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1560fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AF_TRIGGER_ID, 1561fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &afTriggerId, frameNumber); 1562fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1563fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AE_PRECAPTURE_ID, 1564fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &aeTriggerId, frameNumber); 1565fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1566fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (!gotAllStates) return false; 1567fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1568184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala ALOGVV("%s: Camera %d: Frame %d, Request ID %d: AF mode %d, AWB mode %d, " 1569fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala "AF state %d, AE state %d, AWB state %d, " 1570fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala "AF trigger %d, AE precapture trigger %d", 15712d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei __FUNCTION__, mId, frameNumber, resultExtras.requestId, 1572fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala afMode, awbMode, 1573fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala afState, aeState, awbState, 1574fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala afTriggerId, aeTriggerId); 1575fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1576fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Got all states, so construct a minimal result to send 1577fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // In addition to the above fields, this means adding in 1578fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.request.frameCount 1579184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala // android.request.requestId 1580fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.quirks.partialResult 1581fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1582184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala const size_t kMinimal3AResultEntries = 10; 1583fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1584fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala Mutex::Autolock l(mOutputLock); 1585fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1586cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResult captureResult; 1587cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei captureResult.mResultExtras = resultExtras; 1588cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei captureResult.mMetadata = CameraMetadata(kMinimal3AResultEntries, /*dataCapacity*/ 0); 1589cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // TODO: change this to sp<CaptureResult>. This will need other changes, including, 1590cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // but not limited to CameraDeviceBase::getNextResult 1591cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResult& min3AResult = 1592cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei *mResultQueue.insert(mResultQueue.end(), captureResult); 1593cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 1594cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_REQUEST_FRAME_COUNT, 1595cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // TODO: This is problematic casting. Need to fix CameraMetadata. 1596cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reinterpret_cast<int32_t*>(&frameNumber), frameNumber)) { 1597fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1598fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1599fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1600cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int32_t requestId = resultExtras.requestId; 1601cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_REQUEST_ID, 1602184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala &requestId, frameNumber)) { 1603184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala return false; 1604184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala } 1605184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala 1606fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala static const uint8_t partialResult = ANDROID_QUIRKS_PARTIAL_RESULT_PARTIAL; 1607cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_QUIRKS_PARTIAL_RESULT, 1608fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &partialResult, frameNumber)) { 1609fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1610fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1611fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1612cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AF_MODE, 1613fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &afMode, frameNumber)) { 1614fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1615fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1616fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1617cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AWB_MODE, 1618fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &awbMode, frameNumber)) { 1619fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1620fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1621fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1622cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AE_STATE, 1623fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &aeState, frameNumber)) { 1624fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1625fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1626fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1627cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AF_STATE, 1628fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &afState, frameNumber)) { 1629fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1630fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1631fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1632cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AWB_STATE, 1633fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &awbState, frameNumber)) { 1634fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1635fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1636fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1637cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AF_TRIGGER_ID, 1638fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &afTriggerId, frameNumber)) { 1639fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1640fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1641fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1642cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AE_PRECAPTURE_ID, 1643fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &aeTriggerId, frameNumber)) { 1644fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1645fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1646fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1647fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala mResultSignal.signal(); 1648fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1649fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return true; 1650fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala} 1651fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1652fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalatemplate<typename T> 1653fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalabool Camera3Device::get3AResult(const CameraMetadata& result, int32_t tag, 1654cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei T* value, uint32_t frameNumber) { 1655fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala (void) frameNumber; 1656fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1657fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala camera_metadata_ro_entry_t entry; 1658fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1659fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala entry = result.find(tag); 1660fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (entry.count == 0) { 1661fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala ALOGVV("%s: Camera %d: Frame %d: No %s provided by HAL!", __FUNCTION__, 1662fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala mId, frameNumber, get_camera_metadata_tag_name(tag)); 1663fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1664fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1665fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1666fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (sizeof(T) == sizeof(uint8_t)) { 1667fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala *value = entry.data.u8[0]; 1668fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } else if (sizeof(T) == sizeof(int32_t)) { 1669fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala *value = entry.data.i32[0]; 1670fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } else { 1671fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala ALOGE("%s: Unexpected type", __FUNCTION__); 1672fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1673fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1674fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return true; 1675fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala} 1676fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1677fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalatemplate<typename T> 1678fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalabool Camera3Device::insert3AResult(CameraMetadata& result, int32_t tag, 1679cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei const T* value, uint32_t frameNumber) { 1680fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (result.update(tag, value, 1) != NO_ERROR) { 1681fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala mResultQueue.erase(--mResultQueue.end(), mResultQueue.end()); 1682fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala SET_ERR("Frame %d: Failed to set %s in partial metadata", 1683fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala frameNumber, get_camera_metadata_tag_name(tag)); 1684fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1685fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1686fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return true; 1687fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala} 1688fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1689fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala/** 1690f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera HAL device callback methods 1691f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 1692f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 16937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::processCaptureResult(const camera3_capture_result *result) { 16947d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ATRACE_CALL(); 16957d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 16967d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala status_t res; 16977d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 169842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t frameNumber = result->frame_number; 169942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (result->result == NULL && result->num_output_buffers == 0) { 170042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("No result data provided by HAL for frame %d", 170142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 17027d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return; 17037d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 1704fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool partialResultQuirk = false; 1705fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala CameraMetadata collectedQuirkResult; 1706cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResultExtras resultExtras; 17077d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 1708cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // Get capture timestamp and resultExtras from list of in-flight requests, 1709cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // where it was added by the shutter notification for this frame. 1710cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // Then update the in-flight status and remove the in-flight entry if 1711cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // all result data has been received. 17127d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala nsecs_t timestamp = 0; 171342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala { 171442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex::Autolock l(mInFlightLock); 171542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ssize_t idx = mInFlightMap.indexOfKey(frameNumber); 171642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (idx == NAME_NOT_FOUND) { 171742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Unknown frame number for capture result: %d", 171842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 171942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return; 172042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 172142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightRequest &request = mInFlightMap.editValueAt(idx); 1722cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGVV("%s: got InFlightRequest requestId = %" PRId32 ", frameNumber = %" PRId64 1723cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ", burstId = %" PRId32, 1724cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei __FUNCTION__, request.resultExtras.requestId, request.resultExtras.frameNumber, 1725cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei request.resultExtras.burstId); 1726fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1727fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Check if this result carries only partial metadata 1728fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (mUsePartialResultQuirk && result->result != NULL) { 1729fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala camera_metadata_ro_entry_t partialResultEntry; 1730fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala res = find_camera_metadata_ro_entry(result->result, 1731fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala ANDROID_QUIRKS_PARTIAL_RESULT, &partialResultEntry); 1732fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (res != NAME_NOT_FOUND && 1733fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala partialResultEntry.count > 0 && 1734fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala partialResultEntry.data.u8[0] == 1735fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala ANDROID_QUIRKS_PARTIAL_RESULT_PARTIAL) { 1736fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // A partial result. Flag this as such, and collect this 1737fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // set of metadata into the in-flight entry. 1738fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala partialResultQuirk = true; 1739fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala request.partialResultQuirk.collectedResult.append( 1740fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala result->result); 1741fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala request.partialResultQuirk.collectedResult.erase( 1742fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala ANDROID_QUIRKS_PARTIAL_RESULT); 1743fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Fire off a 3A-only result if possible 1744fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (!request.partialResultQuirk.haveSent3A) { 1745fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala request.partialResultQuirk.haveSent3A = 1746fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala processPartial3AQuirk(frameNumber, 1747cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei request.partialResultQuirk.collectedResult, 1748cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei request.resultExtras); 1749fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1750fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1751fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1752fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 175342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala timestamp = request.captureTimestamp; 1754cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei resultExtras = request.resultExtras; 1755cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 17561d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He /** 1757fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * One of the following must happen before it's legal to call process_capture_result, 1758fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * unless partial metadata is being provided: 17591d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He * - CAMERA3_MSG_SHUTTER (expected during normal operation) 17601d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He * - CAMERA3_MSG_ERROR (expected during flush) 17611d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He */ 1762fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (request.requestStatus == OK && timestamp == 0 && !partialResultQuirk) { 176342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Called before shutter notify for frame %d", 176442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 176542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return; 176642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 176742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 1768fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Did we get the (final) result metadata for this capture? 1769fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (result->result != NULL && !partialResultQuirk) { 177042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (request.haveResultMetadata) { 177142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Called multiple times with metadata for frame %d", 177242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 177342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return; 177442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 1775fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (mUsePartialResultQuirk && 1776fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala !request.partialResultQuirk.collectedResult.isEmpty()) { 1777fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala collectedQuirkResult.acquire( 1778fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala request.partialResultQuirk.collectedResult); 1779fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 178042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala request.haveResultMetadata = true; 178142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 178242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 178342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala request.numBuffersLeft -= result->num_output_buffers; 178442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 178542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (request.numBuffersLeft < 0) { 178642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Too many buffers returned for frame %d", 178742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 178842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return; 178942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 179042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 17911b05dfc8df5e741086747d076fc39c79fb4acb33Zhijun He // Check if everything has arrived for this result (buffers and metadata), remove it from 17921b05dfc8df5e741086747d076fc39c79fb4acb33Zhijun He // InFlightMap if both arrived or HAL reports error for this request (i.e. during flush). 17931b05dfc8df5e741086747d076fc39c79fb4acb33Zhijun He if ((request.requestStatus != OK) || 17941b05dfc8df5e741086747d076fc39c79fb4acb33Zhijun He (request.haveResultMetadata && request.numBuffersLeft == 0)) { 179517a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_ASYNC_END("frame capture", frameNumber); 179642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mInFlightMap.removeItemsAt(idx, 1); 179742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 179842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 179942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Sanity check - if we have too many in-flight frames, something has 180042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // likely gone wrong 180142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (mInFlightMap.size() > kInFlightWarnLimit) { 1802e5729fac81c8a984e984fefc90afc64135817d4fColin Cross CLOGE("In-flight list too large: %zu", mInFlightMap.size()); 180342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 180442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 180542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 180642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 180742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Process the result metadata, if provided 1808fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool gotResult = false; 1809fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (result->result != NULL && !partialResultQuirk) { 18107d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 18117d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 1812fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotResult = true; 1813fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 18143c76fa3e73374dfe7bb93e1b03fed30749e1e4b9Jianing Wei // TODO: need to track errors for tighter bounds on expected frame number 18153c76fa3e73374dfe7bb93e1b03fed30749e1e4b9Jianing Wei if (frameNumber < mNextResultFrameNumber) { 181642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Out-of-order capture result metadata submitted! " 181742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala "(got frame number %d, expecting %d)", 181842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber, mNextResultFrameNumber); 181942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return; 182042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 18213c76fa3e73374dfe7bb93e1b03fed30749e1e4b9Jianing Wei mNextResultFrameNumber = frameNumber + 1; 182242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 1823cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResult captureResult; 1824cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei captureResult.mResultExtras = resultExtras; 1825cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei captureResult.mMetadata = result->result; 1826fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1827cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (captureResult.mMetadata.update(ANDROID_REQUEST_FRAME_COUNT, 1828cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei (int32_t*)&frameNumber, 1) != OK) { 1829b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR("Failed to set frame# in metadata (%d)", 183042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 1831fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotResult = false; 1832d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin } else { 1833d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin ALOGVV("%s: Camera %d: Set frame# in metadata (%d)", 183442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala __FUNCTION__, mId, frameNumber); 1835d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin } 18367d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 1837fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Append any previous partials to form a complete result 1838fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (mUsePartialResultQuirk && !collectedQuirkResult.isEmpty()) { 1839cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei captureResult.mMetadata.append(collectedQuirkResult); 1840fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1841fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1842cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei captureResult.mMetadata.sort(); 1843fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 184442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Check that there's a timestamp in the result metadata 18457d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 18467d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala camera_metadata_entry entry = 1847cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei captureResult.mMetadata.find(ANDROID_SENSOR_TIMESTAMP); 18487d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (entry.count == 0) { 1849b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR("No timestamp provided by HAL for frame %d!", 185042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 1851fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotResult = false; 1852fe7e0c6154309f2491463ee6ca4920d225289638Alex Ray } else if (timestamp != entry.data.i64[0]) { 185342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Timestamp mismatch between shutter notify and result" 1854e5729fac81c8a984e984fefc90afc64135817d4fColin Cross " metadata for frame %d (%" PRId64 " vs %" PRId64 " respectively)", 185542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber, timestamp, entry.data.i64[0]); 1856fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotResult = false; 1857fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1858fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1859fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (gotResult) { 1860fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Valid result, insert into queue 1861cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei List<CaptureResult>::iterator queuedResult = 1862cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei mResultQueue.insert(mResultQueue.end(), CaptureResult(captureResult)); 1863cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGVV("%s: result requestId = %" PRId32 ", frameNumber = %" PRId64 1864cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ", burstId = %" PRId32, __FUNCTION__, 1865cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei queuedResult->mResultExtras.requestId, 1866cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei queuedResult->mResultExtras.frameNumber, 1867cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei queuedResult->mResultExtras.burstId); 18687d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 18697d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } // scope for mOutputLock 18707d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 187142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Return completed buffers to their streams with the timestamp 187242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 18737d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala for (size_t i = 0; i < result->num_output_buffers; i++) { 18747d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Camera3Stream *stream = 18757d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Camera3Stream::cast(result->output_buffers[i].stream); 18767d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala res = stream->returnBuffer(result->output_buffers[i], timestamp); 18777d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // Note: stream may be deallocated at this point, if this buffer was the 18787d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // last reference to it. 18797d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (res != OK) { 1880e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGE("Can't return buffer %zu for frame %d to its stream: " 188142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala " %s (%d)", i, frameNumber, strerror(-res), res); 18827d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 18837d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 18847d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 188546910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala // Finally, signal any waiters for new frames 188642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 1887fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (gotResult) { 18884345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin mResultSignal.signal(); 18894345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin } 18904345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin 18917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 18927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 18937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::notify(const camera3_notify_msg *msg) { 189417a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_CALL(); 18957d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala NotificationListener *listener; 18967d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala { 18977d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 18987d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala listener = mListener; 18997d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 19007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 19017d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (msg == NULL) { 190242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("HAL sent NULL notify message!"); 19037d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return; 19047d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 19057d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 19067d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala switch (msg->type) { 19077d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala case CAMERA3_MSG_ERROR: { 19087d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala int streamId = 0; 19097d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (msg->message.error.error_stream != NULL) { 19107d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Camera3Stream *stream = 19117d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Camera3Stream::cast( 19127d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala msg->message.error.error_stream); 19137d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala streamId = stream->getId(); 19147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 191517a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ALOGV("Camera %d: %s: HAL error, frame %d, stream %d: %d", 191617a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala mId, __FUNCTION__, msg->message.error.frame_number, 191717a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala streamId, msg->message.error.error_code); 19181d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He 1919cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResultExtras resultExtras; 19201d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He // Set request error status for the request in the in-flight tracking 19211d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He { 19221d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He Mutex::Autolock l(mInFlightLock); 19231d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He ssize_t idx = mInFlightMap.indexOfKey(msg->message.error.frame_number); 19241d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He if (idx >= 0) { 1925cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei InFlightRequest &r = mInFlightMap.editValueAt(idx); 1926cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei r.requestStatus = msg->message.error.error_code; 1927cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei resultExtras = r.resultExtras; 1928cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } else { 1929cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei resultExtras.frameNumber = msg->message.error.frame_number; 1930cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGE("Camera %d: %s: cannot find in-flight request on frame %" PRId64 1931cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei " error", mId, __FUNCTION__, resultExtras.frameNumber); 19321d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He } 19331d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He } 19341d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He 193542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (listener != NULL) { 1936cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (msg->message.error.error_code == CAMERA3_MSG_ERROR_DEVICE) { 1937cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei listener->notifyError(ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE, 1938cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei resultExtras); 1939cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } else { 1940cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei listener->notifyError(ICameraDeviceCallbacks::ERROR_CAMERA_SERVICE, 1941cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei resultExtras); 1942cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 1943cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } else { 1944cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGE("Camera %d: %s: no listener available", mId, __FUNCTION__); 194542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 19467d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala break; 19477d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 19487d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala case CAMERA3_MSG_SHUTTER: { 194942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ssize_t idx; 195042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t frameNumber = msg->message.shutter.frame_number; 195142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala nsecs_t timestamp = msg->message.shutter.timestamp; 195242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Verify ordering of shutter notifications 195342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala { 195442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex::Autolock l(mOutputLock); 19553c76fa3e73374dfe7bb93e1b03fed30749e1e4b9Jianing Wei // TODO: need to track errors for tighter bounds on expected frame number. 19563c76fa3e73374dfe7bb93e1b03fed30749e1e4b9Jianing Wei if (frameNumber < mNextShutterFrameNumber) { 195742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Shutter notification out-of-order. Expected " 195842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala "notification for frame %d, got frame %d", 195942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mNextShutterFrameNumber, frameNumber); 196042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala break; 196142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 19623c76fa3e73374dfe7bb93e1b03fed30749e1e4b9Jianing Wei mNextShutterFrameNumber = frameNumber + 1; 196342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 196442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 1965cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResultExtras resultExtras; 1966f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 196742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Set timestamp for the request in the in-flight tracking 1968f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // and get the request ID to send upstream 196942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala { 197042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex::Autolock l(mInFlightLock); 197142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala idx = mInFlightMap.indexOfKey(frameNumber); 197242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (idx >= 0) { 1973f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala InFlightRequest &r = mInFlightMap.editValueAt(idx); 1974f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala r.captureTimestamp = timestamp; 1975cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei resultExtras = r.resultExtras; 197642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 197742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 197842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (idx < 0) { 197942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Shutter notification for non-existent frame number %d", 198042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 198142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala break; 198242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 1983e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGVV("Camera %d: %s: Shutter fired for frame %d (id %d) at %" PRId64, 1984cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei mId, __FUNCTION__, frameNumber, resultExtras.requestId, timestamp); 198542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Call listener, if any 198642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (listener != NULL) { 1987cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei listener->notifyShutter(resultExtras, timestamp); 198842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 19897d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala break; 19907d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 19917d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala default: 199242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Unknown notify message from HAL: %d", 1993b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala msg->type); 19947d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 19957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 19967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1997f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville TalvalaCameraMetadata Camera3Device::getLatestRequestLocked() { 19981e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin ALOGV("%s", __FUNCTION__); 19991e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 20001e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin CameraMetadata retVal; 20011e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 20021e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin if (mRequestThread != NULL) { 20031e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin retVal = mRequestThread->getLatestRequest(); 20041e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin } 20051e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 20061e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin return retVal; 20071e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin} 20081e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 2009cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 20107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/** 2011f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * RequestThread inner class methods 2012f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 2013f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2014f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville TalvalaCamera3Device::RequestThread::RequestThread(wp<Camera3Device> parent, 2015f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker, 2016f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *hal3Device) : 2017f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Thread(false), 2018f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mParent(parent), 2019f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker(statusTracker), 2020f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device(hal3Device), 202142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mId(getId(parent)), 2022f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mReconfigured(false), 2023f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDoPause(false), 2024f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused(true), 20254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mFrameNumber(0), 2026cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei mLatestRequestId(NAME_NOT_FOUND), 20272d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei mRepeatingLastFrameNumber(NO_IN_FLIGHT_REPEATING_FRAMES) { 2028f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusId = statusTracker->addComponent(); 2029f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2030f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2031f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::configurationComplete() { 2032f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 2033f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mReconfigured = true; 2034f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2035f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 203690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::RequestThread::queueRequestList( 20372d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei List<sp<CaptureRequest> > &requests, 20382d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 20392d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber) { 204090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei Mutex::Autolock l(mRequestLock); 204190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei for (List<sp<CaptureRequest> >::iterator it = requests.begin(); it != requests.end(); 204290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ++it) { 204390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei mRequestQueue.push_back(*it); 204490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 204590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 20462d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (lastFrameNumber != NULL) { 20472d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber = mFrameNumber + mRequestQueue.size() - 1; 20482d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGV("%s: requestId %d, mFrameNumber %" PRId32 ", lastFrameNumber %" PRId64 ".", 20492d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei __FUNCTION__, (*(requests.begin()))->mResultExtras.requestId, mFrameNumber, 20502d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber); 20512d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 2052cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 205390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei unpauseForNewRequests(); 205490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 205590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return OK; 205690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 205790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 20584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 20594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTrigger( 20604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[], 20614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin size_t count) { 20624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 20634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock l(mTriggerMutex); 20644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t ret; 20654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 20664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < count; ++i) { 20674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ret = queueTriggerLocked(trigger[i]); 20684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 20694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (ret != OK) { 20704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return ret; 20714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 20724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 20734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 20744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 20754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 20764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 207742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvalaint Camera3Device::RequestThread::getId(const wp<Camera3Device> &device) { 207842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala sp<Camera3Device> d = device.promote(); 207942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (d != NULL) return d->mId; 208042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return 0; 208142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala} 208242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 20834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTriggerLocked( 20844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger) { 20854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 20864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t tag = trigger.metadataTag; 20874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ssize_t index = mTriggerMap.indexOfKey(tag); 20884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 20894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin switch (trigger.getTagType()) { 20904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_BYTE: 20914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // fall-through 20924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_INT32: 20934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 20944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin default: 209542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ALOGE("%s: Type not supported: 0x%x", __FUNCTION__, 209642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala trigger.getTagType()); 20974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return INVALID_OPERATION; 20984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 20994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 21004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 21014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Collect only the latest trigger, since we only have 1 field 21024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * in the request settings per trigger tag, and can't send more than 1 21034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * trigger per request. 21044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 21054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (index != NAME_NOT_FOUND) { 21064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerMap.editValueAt(index) = trigger; 21074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } else { 21084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerMap.add(tag, trigger); 21094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 21104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 21114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 21124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 21134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2114f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::setRepeatingRequests( 21152d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei const RequestList &requests, 21162d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 21172d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber) { 2118f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 21192d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (lastFrameNumber != NULL) { 21202d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber = mRepeatingLastFrameNumber; 21212d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 2122f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRepeatingRequests.clear(); 2123f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRepeatingRequests.insert(mRepeatingRequests.begin(), 2124f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala requests.begin(), requests.end()); 212526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala 212626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala unpauseForNewRequests(); 212726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala 21282d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei mRepeatingLastFrameNumber = NO_IN_FLIGHT_REPEATING_FRAMES; 2129f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 2130f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2131f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 21322d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Weistatus_t Camera3Device::RequestThread::clearRepeatingRequests(/*out*/int64_t *lastFrameNumber) { 2133f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 2134f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRepeatingRequests.clear(); 21352d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (lastFrameNumber != NULL) { 21362d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber = mRepeatingLastFrameNumber; 21372d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 21382d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei mRepeatingLastFrameNumber = NO_IN_FLIGHT_REPEATING_FRAMES; 2139f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 2140f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2141f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 21422d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Weistatus_t Camera3Device::RequestThread::clear(/*out*/int64_t *lastFrameNumber) { 2143abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala Mutex::Autolock l(mRequestLock); 21442d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGV("RequestThread::%s:", __FUNCTION__); 2145abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala mRepeatingRequests.clear(); 2146abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala mRequestQueue.clear(); 2147abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala mTriggerMap.clear(); 21482d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (lastFrameNumber != NULL) { 21492d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber = mRepeatingLastFrameNumber; 21502d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 21512d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei mRepeatingLastFrameNumber = NO_IN_FLIGHT_REPEATING_FRAMES; 2152abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala return OK; 2153abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala} 2154abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 2155f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::setPaused(bool paused) { 2156f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mPauseLock); 2157f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDoPause = paused; 2158f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDoPauseSignal.signal(); 2159f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2160f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 21614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::waitUntilRequestProcessed( 21624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t requestId, nsecs_t timeout) { 21634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock l(mLatestRequestMutex); 21644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res; 21654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin while (mLatestRequestId != requestId) { 21664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin nsecs_t startTime = systemTime(); 21674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 21684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = mLatestRequestSignal.waitRelative(mLatestRequestMutex, timeout); 21694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) return res; 21704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 21714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin timeout -= (systemTime() - startTime); 21724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 21734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 21744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 21754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 21764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2177f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid Camera3Device::RequestThread::requestExit() { 2178f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Call parent to set up shutdown 2179f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Thread::requestExit(); 2180f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // The exit from any possible waits 2181f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mDoPauseSignal.signal(); 2182f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestSignal.signal(); 2183f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 21844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2185f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::threadLoop() { 2186f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2187f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 2188f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2189f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Handle paused state. 2190f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (waitIfPaused()) { 2191f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 2192f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2193f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2194f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Get work to do 2195f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> nextRequest = waitForNextRequest(); 2197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (nextRequest == NULL) { 2198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 2199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2201f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Create request to HAL 2202f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_capture_request_t request = camera3_capture_request_t(); 22032d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei request.frame_number = nextRequest->mResultExtras.frameNumber; 22044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Vector<camera3_stream_buffer_t> outputBuffers; 2205f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2206f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Get the request ID, if any 2207f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala int requestId; 2208f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala camera_metadata_entry_t requestIdEntry = 2209f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala nextRequest->mSettings.find(ANDROID_REQUEST_ID); 2210f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (requestIdEntry.count > 0) { 2211f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala requestId = requestIdEntry.data.i32[0]; 2212f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } else { 2213f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGW("%s: Did not have android.request.id set in the request", 2214f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala __FUNCTION__); 2215f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala requestId = NAME_NOT_FOUND; 2216f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 2217f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 22184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Insert any queued triggers (before metadata is locked) 22194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t triggerCount; 22204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = insertTriggers(nextRequest); 22214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res < 0) { 2222b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR("RequestThread: Unable to insert triggers " 2223b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala "(capture request %d, HAL device: %s (%d)", 22242d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei request.frame_number, strerror(-res), res); 22254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin cleanUpFailedRequest(request, nextRequest, outputBuffers); 22264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return false; 22274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 22284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin triggerCount = res; 22294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 22304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin bool triggersMixedIn = (triggerCount > 0 || mPrevTriggers > 0); 22314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 22324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // If the request is the same as last, or we had triggers last time 22334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (mPrevRequest != nextRequest || triggersMixedIn) { 22344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 22352f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala * HAL workaround: 22362f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala * Insert a dummy trigger ID if a trigger is set but no trigger ID is 22372f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala */ 22382f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala res = addDummyTriggerIds(nextRequest); 22392f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (res != OK) { 22402f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala SET_ERR("RequestThread: Unable to insert dummy trigger IDs " 22412f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala "(capture request %d, HAL device: %s (%d)", 22422d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei request.frame_number, strerror(-res), res); 22432f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 22442f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala return false; 22452f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala } 22462f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 22472f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala /** 22484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * The request should be presorted so accesses in HAL 22494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * are O(logn). Sidenote, sorting a sorted metadata is nop. 22504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 22514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin nextRequest->mSettings.sort(); 2252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.settings = nextRequest->mSettings.getAndLock(); 2253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPrevRequest = nextRequest; 22544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGVV("%s: Request settings are NEW", __FUNCTION__); 22554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 22564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin IF_ALOGV() { 22574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin camera_metadata_ro_entry_t e = camera_metadata_ro_entry_t(); 22584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin find_camera_metadata_ro_entry( 22594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin request.settings, 22604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER, 22614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &e 22624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ); 22634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (e.count > 0) { 22644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Request (frame num %d) had AF trigger 0x%x", 22654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, 22662d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei request.frame_number, 22674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin e.data.u8[0]); 22684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 22694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 22704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } else { 22714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // leave request.settings NULL to indicate 'reuse latest given' 22724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGVV("%s: Request settings are REUSED", 22734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__); 22744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 2275f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2276f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_buffer_t inputBuffer; 2277f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2278f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Fill in buffers 2279f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2280f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (nextRequest->mInputStream != NULL) { 2281f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.input_buffer = &inputBuffer; 22825a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin res = nextRequest->mInputStream->getInputBuffer(&inputBuffer); 2283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 228407d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala ALOGE("RequestThread: Can't get input buffer, skipping request:" 2285f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala " %s (%d)", strerror(-res), res); 2286f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 2287f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 2288f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2289f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 2290f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.input_buffer = NULL; 2291f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2292f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2293f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputBuffers.insertAt(camera3_stream_buffer_t(), 0, 2294f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mOutputStreams.size()); 2295f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.output_buffers = outputBuffers.array(); 2296f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < nextRequest->mOutputStreams.size(); i++) { 2297f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = nextRequest->mOutputStreams.editItemAt(i)-> 2298f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala getBuffer(&outputBuffers.editItemAt(i)); 2299f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 230007d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala ALOGE("RequestThread: Can't get output buffer, skipping request:" 230107d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala " %s (%d)", strerror(-res), res); 2302f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 2303f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 2304f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2305f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.num_output_buffers++; 2306f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2307f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 230842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Log request in the in-flight queue 230942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala sp<Camera3Device> parent = mParent.promote(); 231042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (parent == NULL) { 231142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala CLOGE("RequestThread: Parent is gone"); 231242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 231342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return false; 231442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 231542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 2316cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei res = parent->registerInFlight(request.frame_number, 2317cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei request.num_output_buffers, nextRequest->mResultExtras); 23182d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGVV("%s: registered in flight requestId = %" PRId32 ", frameNumber = %" PRId64 23192d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ", burstId = %" PRId32 ".", 2320cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei __FUNCTION__, 2321cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei nextRequest->mResultExtras.requestId, nextRequest->mResultExtras.frameNumber, 2322cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei nextRequest->mResultExtras.burstId); 232342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (res != OK) { 232442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("RequestThread: Unable to register new in-flight request:" 232542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala " %s (%d)", strerror(-res), res); 232642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 232742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return false; 232842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 23294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2330cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He // Inform waitUntilRequestProcessed thread of a new request ID 2331cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He { 2332cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He Mutex::Autolock al(mLatestRequestMutex); 2333cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He 2334cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He mLatestRequestId = requestId; 2335cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He mLatestRequestSignal.signal(); 2336cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He } 2337cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He 2338f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Submit request and block until ready for next one 233917a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_ASYNC_BEGIN("frame capture", request.frame_number); 234017a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->process_capture_request"); 2341f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mHal3Device->ops->process_capture_request(mHal3Device, &request); 234217a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 234317a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala 2344f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 2345b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR("RequestThread: Unable to submit capture request %d to HAL" 2346f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala " device: %s (%d)", request.frame_number, strerror(-res), res); 2347f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 2348f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return false; 2349f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2350f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 23511e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin // Update the latest request sent to HAL 23521e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin if (request.settings != NULL) { // Don't update them if they were unchanged 23531e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin Mutex::Autolock al(mLatestRequestMutex); 23541e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 23551e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin camera_metadata_t* cloned = clone_camera_metadata(request.settings); 23561e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin mLatestRequest.acquire(cloned); 23571e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin } 23581e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 2359f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (request.settings != NULL) { 2360f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mSettings.unlock(request.settings); 2361f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 23624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 23634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Remove any previously queued triggers (after unlock) 23644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = removeTriggers(mPrevRequest); 23654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 2366b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR("RequestThread: Unable to remove triggers " 23674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin "(capture request %d, HAL device: %s (%d)", 23684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin request.frame_number, strerror(-res), res); 23694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return false; 23704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 23714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mPrevTriggers = triggerCount; 23724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 23735a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin // Return input buffer back to framework 23745a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (request.input_buffer != NULL) { 23755a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin Camera3Stream *stream = 23765a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin Camera3Stream::cast(request.input_buffer->stream); 23775a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin res = stream->returnInputBuffer(*(request.input_buffer)); 23785a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin // Note: stream may be deallocated at this point, if this buffer was the 23795a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin // last reference to it. 23805a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (res != OK) { 23815a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: RequestThread: Can't return input buffer for frame %d to" 23825a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin " its stream:%s (%d)", __FUNCTION__, 23835a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin request.frame_number, strerror(-res), res); 23845a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin // TODO: Report error upstream 23855a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 23865a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 23875a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 2388f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 2389f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2390f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 23911e479c0f4cb3e2174dde0b02e5656fb658f73495Igor MurashkinCameraMetadata Camera3Device::RequestThread::getLatestRequest() const { 23921e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin Mutex::Autolock al(mLatestRequestMutex); 23931e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 23941e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin ALOGV("RequestThread::%s", __FUNCTION__); 23951e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 23961e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin return mLatestRequest; 23971e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin} 23981e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 2399cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 2400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::cleanUpFailedRequest( 2401f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_capture_request_t &request, 2402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> &nextRequest, 2403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<camera3_stream_buffer_t> &outputBuffers) { 2404f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2405f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (request.settings != NULL) { 2406f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mSettings.unlock(request.settings); 2407f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2408f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (request.input_buffer != NULL) { 2409f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.input_buffer->status = CAMERA3_BUFFER_STATUS_ERROR; 24105a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin nextRequest->mInputStream->returnInputBuffer(*(request.input_buffer)); 2411f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2412f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < request.num_output_buffers; i++) { 2413f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputBuffers.editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR; 2414f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mOutputStreams.editItemAt(i)->returnBuffer( 2415f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputBuffers[i], 0); 2416f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2417f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2418f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2419f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> 2420f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Camera3Device::RequestThread::waitForNextRequest() { 2421f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 2422f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> nextRequest; 2423f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2424f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Optimized a bit for the simple steady-state case (single repeating 2425f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // request), to avoid putting that request in the queue temporarily. 2426f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 2427f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2428f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala while (mRequestQueue.empty()) { 2429f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (!mRepeatingRequests.empty()) { 2430f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Always atomically enqueue all requests in a repeating request 2431f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // list. Guarantees a complete in-sequence set of captures to 2432f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // application. 2433f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const RequestList &requests = mRepeatingRequests; 2434f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList::const_iterator firstRequest = 2435f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala requests.begin(); 2436f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest = *firstRequest; 2437f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestQueue.insert(mRequestQueue.end(), 2438f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ++firstRequest, 2439f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala requests.end()); 2440f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // No need to wait any longer 2441cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 24422d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei mRepeatingLastFrameNumber = mFrameNumber + requests.size() - 1; 2443cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 2444f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 2445f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2446f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2447f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mRequestSignal.waitRelative(mRequestLock, kRequestTimeout); 2448f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2449f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if ((mRequestQueue.empty() && mRepeatingRequests.empty()) || 2450f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala exitPending()) { 2451f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock pl(mPauseLock); 2452f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mPaused == false) { 2453f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: RequestThread: Going idle", __FUNCTION__); 2454f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused = true; 2455f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Let the tracker know 2456f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 2457f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 2458f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE); 2459f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 2460f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2461f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Stop waiting for now and let thread management happen 2462f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 2463f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2464f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2465f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2466f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (nextRequest == NULL) { 2467f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Don't have a repeating request already in hand, so queue 2468f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // must have an entry now. 2469f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList::iterator firstRequest = 2470f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestQueue.begin(); 2471f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest = *firstRequest; 2472f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestQueue.erase(firstRequest); 2473f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2474f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 247526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // In case we've been unpaused by setPaused clearing mDoPause, need to 247626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // update internal pause state (capture/setRepeatingRequest unpause 247726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // directly). 2478f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock pl(mPauseLock); 2479f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mPaused) { 2480f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: RequestThread: Unpaused", __FUNCTION__); 2481f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 2482f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 2483f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->markComponentActive(mStatusId); 2484f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 2485f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 2486f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused = false; 2487f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2488f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Check if we've reconfigured since last time, and reset the preview 2489f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // request if so. Can't use 'NULL request == repeat' across configure calls. 2490f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mReconfigured) { 2491f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPrevRequest.clear(); 2492f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mReconfigured = false; 2493f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2494f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 24952d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (nextRequest != NULL) { 24962d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei nextRequest->mResultExtras.frameNumber = mFrameNumber++; 24972d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 2498f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return nextRequest; 2499f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2500f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2501f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::waitIfPaused() { 2502f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 2503f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mPauseLock); 2504f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala while (mDoPause) { 2505f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mPaused == false) { 2506f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused = true; 2507f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: RequestThread: Paused", __FUNCTION__); 2508f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Let the tracker know 2509f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 2510f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 2511f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE); 2512f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 2513f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2514f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 2515f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mDoPauseSignal.waitRelative(mPauseLock, kRequestTimeout); 2516f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res == TIMED_OUT || exitPending()) { 2517f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 2518f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2519f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2520f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // We don't set mPaused to false here, because waitForNextRequest needs 2521f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // to further manage the paused state in case of starvation. 2522f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return false; 2523f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2524f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 252526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvalavoid Camera3Device::RequestThread::unpauseForNewRequests() { 252626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // With work to do, mark thread as unpaused. 252726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // If paused by request (setPaused), don't resume, to avoid 252826fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // extra signaling/waiting overhead to waitUntilPaused 2529f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestSignal.signal(); 253026fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala Mutex::Autolock p(mPauseLock); 253126fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala if (!mDoPause) { 2532f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: RequestThread: Going active", __FUNCTION__); 2533f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mPaused) { 2534f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 2535f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 2536f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->markComponentActive(mStatusId); 2537f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 2538f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 253926fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala mPaused = false; 254026fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala } 254126fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala} 254226fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala 2543b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::RequestThread::setErrorState(const char *fmt, ...) { 2544b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala sp<Camera3Device> parent = mParent.promote(); 2545b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala if (parent != NULL) { 2546b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_list args; 2547b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_start(args, fmt); 2548b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 2549b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala parent->setErrorStateV(fmt, args); 2550b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 2551b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_end(args); 2552b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala } 2553b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 2554b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 25554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::insertTriggers( 25564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const sp<CaptureRequest> &request) { 25574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock al(mTriggerMutex); 25594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin CameraMetadata &metadata = request->mSettings; 25614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin size_t count = mTriggerMap.size(); 25624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < count; ++i) { 25644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger = mTriggerMap.valueAt(i); 25654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t tag = trigger.metadataTag; 25674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin camera_metadata_entry entry = metadata.find(tag); 25684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (entry.count > 0) { 25704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 25714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Already has an entry for this trigger in the request. 25724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Rewrite it with our requested trigger value. 25734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 25744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger oldTrigger = trigger; 25754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin oldTrigger.entryValue = entry.data.u8[0]; 25774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerReplacedMap.add(tag, oldTrigger); 25794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } else { 25804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 25814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * More typical, no trigger entry, so we just add it 25824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 25834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerRemovedMap.add(tag, trigger); 25844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 25854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res; 25874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin switch (trigger.getTagType()) { 25894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_BYTE: { 25904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue); 25914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 25924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &entryValue, 25934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 25944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 25954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 25964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_INT32: 25974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 25984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &trigger.entryValue, 25994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 26004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 26014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin default: 26024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Type not supported: 0x%x", 26034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, 26044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagType()); 26054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return INVALID_OPERATION; 26064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 26074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 26094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Failed to update request metadata with trigger tag %s" 26104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ", value %d", __FUNCTION__, trigger.getTagName(), 26114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.entryValue); 26124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return res; 26134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 26144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Mixed in trigger %s, value %d", __FUNCTION__, 26164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagName(), 26174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.entryValue); 26184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 26194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerMap.clear(); 26214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return count; 26234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 26244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::removeTriggers( 26264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const sp<CaptureRequest> &request) { 26274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock al(mTriggerMutex); 26284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin CameraMetadata &metadata = request->mSettings; 26304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 26324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Replace all old entries with their old values. 26334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 26344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < mTriggerReplacedMap.size(); ++i) { 26354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger = mTriggerReplacedMap.valueAt(i); 26364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res; 26384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t tag = trigger.metadataTag; 26404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin switch (trigger.getTagType()) { 26414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_BYTE: { 26424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue); 26434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 26444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &entryValue, 26454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 26464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 26474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 26484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_INT32: 26494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 26504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &trigger.entryValue, 26514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 26524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 26534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin default: 26544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Type not supported: 0x%x", 26554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, 26564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagType()); 26574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return INVALID_OPERATION; 26584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 26594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 26614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Failed to restore request metadata with trigger tag %s" 26624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ", trigger value %d", __FUNCTION__, 26634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagName(), trigger.entryValue); 26644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return res; 26654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 26664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 26674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerReplacedMap.clear(); 26684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 26704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Remove all new entries. 26714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 26724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < mTriggerRemovedMap.size(); ++i) { 26734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger = mTriggerRemovedMap.valueAt(i); 26744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res = metadata.erase(trigger.metadataTag); 26754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 26774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Failed to erase metadata with trigger tag %s" 26784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ", trigger value %d", __FUNCTION__, 26794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagName(), trigger.entryValue); 26804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return res; 26814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 26824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 26834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerRemovedMap.clear(); 26844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 26864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 26874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26882f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvalastatus_t Camera3Device::RequestThread::addDummyTriggerIds( 26892f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala const sp<CaptureRequest> &request) { 26902f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // Trigger ID 0 has special meaning in the HAL2 spec, so avoid it here 26912f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala static const int32_t dummyTriggerId = 1; 26922f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala status_t res; 26932f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 26942f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala CameraMetadata &metadata = request->mSettings; 26952f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 26962f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // If AF trigger is active, insert a dummy AF trigger ID if none already 26972f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // exists 26982f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala camera_metadata_entry afTrigger = metadata.find(ANDROID_CONTROL_AF_TRIGGER); 26992f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala camera_metadata_entry afId = metadata.find(ANDROID_CONTROL_AF_TRIGGER_ID); 27002f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (afTrigger.count > 0 && 27012f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala afTrigger.data.u8[0] != ANDROID_CONTROL_AF_TRIGGER_IDLE && 27022f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala afId.count == 0) { 27032f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala res = metadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, &dummyTriggerId, 1); 27042f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (res != OK) return res; 27052f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala } 27062f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 27072f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // If AE precapture trigger is active, insert a dummy precapture trigger ID 27082f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // if none already exists 27092f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala camera_metadata_entry pcTrigger = 27102f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER); 27112f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala camera_metadata_entry pcId = metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_ID); 27122f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (pcTrigger.count > 0 && 27132f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala pcTrigger.data.u8[0] != ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE && 27142f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala pcId.count == 0) { 27152f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala res = metadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, 27162f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala &dummyTriggerId, 1); 27172f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (res != OK) return res; 27182f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala } 27192f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 27202f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala return OK; 27212f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala} 27224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2724f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 27257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Static callback forwarding methods from HAL to instance 27267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 27277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 27287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sProcessCaptureResult(const camera3_callback_ops *cb, 27297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_capture_result *result) { 27307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala Camera3Device *d = 27317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb)); 27327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala d->processCaptureResult(result); 27337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 27347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 27357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sNotify(const camera3_callback_ops *cb, 27367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_notify_msg *msg) { 27377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala Camera3Device *d = 27387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb)); 27397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala d->notify(msg); 27407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 27417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 27427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android 2743