Camera3Device.cpp revision f67e23ef637d0b53a0d4bebb68c654234df3da94
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" 51f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala#include "CameraService.h" 527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 53f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalausing namespace android::camera3; 547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 55f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalanamespace android { 567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville TalvalaCamera3Device::Camera3Device(int id): 587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mId(id), 59f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device(NULL), 607d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mStatus(STATUS_UNINITIALIZED), 61204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mUsePartialResult(false), 62204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mNumPartialResults(1), 6342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mNextResultFrameNumber(0), 6442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mNextShutterFrameNumber(0), 657d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mListener(NULL) 667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{ 677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera3_callback_ops::notify = &sNotify; 697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera3_callback_ops::process_capture_result = &sProcessCaptureResult; 707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGV("%s: Created device for camera %d", __FUNCTION__, id); 717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville TalvalaCamera3Device::~Camera3Device() 747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{ 757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGV("%s: Tearing down for camera id %d", __FUNCTION__, mId); 777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala disconnect(); 787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8071381051e2d048b2705c447b3d59db6e972493eeIgor Murashkinint Camera3Device::getId() const { 8171381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin return mId; 8271381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin} 8371381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin 84f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 85f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * CameraDeviceBase interface 86f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 87f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::initialize(camera_module_t *module) 897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{ 907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 91f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 92f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 93f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGV("%s: Initializing device for camera %d", __FUNCTION__, mId); 95f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mStatus != STATUS_UNINITIALIZED) { 96b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Already initialized!"); 977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Open HAL device */ 1017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala status_t res; 1037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala String8 deviceName = String8::format("%d", mId); 1047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera3_device_t *device; 1067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 107213ce79e943a3b51d7859a184d8211c859c960a0Zhijun He ATRACE_BEGIN("camera3->open"); 108f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala res = CameraService::filterOpenErrorCode(module->common.methods->open( 109f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala &module->common, deviceName.string(), 110f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala reinterpret_cast<hw_device_t**>(&device))); 111213ce79e943a3b51d7859a184d8211c859c960a0Zhijun He ATRACE_END(); 1127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) { 114b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Could not open camera: %s (%d)", strerror(-res), res); 1157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return res; 1167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Cross-check device version */ 11995dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He if (device->common.version < CAMERA_DEVICE_API_VERSION_3_0) { 120b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Could not open camera: " 12195dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He "Camera device should be at least %x, reports %x instead", 122b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CAMERA_DEVICE_API_VERSION_3_0, 1237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.version); 1247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 1257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return BAD_VALUE; 1267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera_info info; 129f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala res = CameraService::filterGetInfoErrorCode(module->get_camera_info( 130f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala mId, &info)); 1317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) return res; 1327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (info.device_version != device->common.version) { 134b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("HAL reporting mismatched camera_info version (%x)" 135b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala " and device version (%x).", 13695dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He info.device_version, device->common.version); 1377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 1387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return BAD_VALUE; 1397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Initialize device with callback functions */ 1427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 14317a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->initialize"); 1447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = device->ops->initialize(device, this); 14517a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 14617a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala 1477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) { 148b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to initialize HAL device: %s (%d)", 149b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala strerror(-res), res); 1507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 1517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return BAD_VALUE; 1527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 154f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** Start up status tracker thread */ 155f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker = new StatusTracker(this); 156f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = mStatusTracker->run(String8::format("C3Dev-%d-Status", mId).string()); 157f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) { 158f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Unable to start status tracking thread: %s (%d)", 159f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala strerror(-res), res); 160f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala device->common.close(&device->common); 161f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker.clear(); 162f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 163f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 164f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Start up request queue thread */ 1667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 167f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread = new RequestThread(this, mStatusTracker, device); 168f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mRequestThread->run(String8::format("C3Dev-%d-ReqQueue", mId).string()); 1697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) { 170b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to start request queue thread: %s (%d)", 171b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala strerror(-res), res); 1727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 173f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread.clear(); 1747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return res; 1757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Everything is good to go */ 1787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 179cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh mDeviceVersion = device->common.version; 1807fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mDeviceInfo = info.static_camera_characteristics; 1817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal3Device = device; 182f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus = STATUS_UNCONFIGURED; 183f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mNextStreamId = 0; 184ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala mNeedConfig = true; 185f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mPauseStateNotify = false; 1867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 187fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Will the HAL be sending in early partial result metadata? 188204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 189204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He camera_metadata_entry partialResultsCount = 190204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mDeviceInfo.find(ANDROID_REQUEST_PARTIAL_RESULT_COUNT); 191204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (partialResultsCount.count > 0) { 192204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mNumPartialResults = partialResultsCount.data.i32[0]; 193204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mUsePartialResult = (mNumPartialResults > 1); 194204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 195204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } else { 196204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He camera_metadata_entry partialResultsQuirk = 197204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mDeviceInfo.find(ANDROID_QUIRKS_USE_PARTIAL_RESULT); 198204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (partialResultsQuirk.count > 0 && partialResultsQuirk.data.u8[0] == 1) { 199204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mUsePartialResult = true; 200204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 201fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 202fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 2037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return OK; 2047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 2057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::disconnect() { 2077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 208f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 2097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 210f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 211f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 212214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala status_t res = OK; 213f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 214f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala { 215f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mLock); 216f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_UNINITIALIZED) return res; 217f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 218f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_ACTIVE || 219f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala (mStatus == STATUS_ERROR && mRequestThread != NULL)) { 220f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = mRequestThread->clearRepeatingRequests(); 221214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala if (res != OK) { 222f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't stop streaming"); 223214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala // Continue to close device even in case of error 224f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } else { 225f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout); 226f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) { 227f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Timeout waiting for HAL to drain"); 228f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Continue to close device even in case of error 229f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 230214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala } 231f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 232f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 233f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_ERROR) { 234f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala CLOGE("Shutting down in an error state"); 235f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 236f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 237f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatusTracker != NULL) { 238f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker->requestExit(); 239f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 240f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 241f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mRequestThread != NULL) { 242f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread->requestExit(); 243f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 244f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 245f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mOutputStreams.clear(); 246f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mInputStream.clear(); 247f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 248f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 249f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Joining done without holding mLock, otherwise deadlocks may ensue 250f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // as the threads try to access parent state 251f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mRequestThread != NULL && mStatus != STATUS_ERROR) { 252f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // HAL may be in a bad state, so waiting for request thread 253f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // (which may be stuck in the HAL processCaptureRequest call) 254f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // could be dangerous. 255f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread->join(); 256214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala } 257214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala 258f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatusTracker != NULL) { 259f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker->join(); 260f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 261f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 262f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala { 263f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mLock); 264f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 265f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread.clear(); 266f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker.clear(); 267f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 268f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mHal3Device != NULL) { 269213ce79e943a3b51d7859a184d8211c859c960a0Zhijun He ATRACE_BEGIN("camera3->close"); 270f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mHal3Device->common.close(&mHal3Device->common); 271213ce79e943a3b51d7859a184d8211c859c960a0Zhijun He ATRACE_END(); 272f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mHal3Device = NULL; 273f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 274f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 275f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus = STATUS_UNINITIALIZED; 276f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 277f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 278f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: X", __FUNCTION__); 279214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala return res; 2807fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 2817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 282f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// For dumping/debugging only - 283f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// try to acquire a lock a few times, eventually give up to proceed with 284f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// debug/dump operations 285f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalabool Camera3Device::tryLockSpinRightRound(Mutex& lock) { 286f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool gotLock = false; 287f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala for (size_t i = 0; i < kDumpLockAttempts; ++i) { 288f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (lock.tryLock() == NO_ERROR) { 289f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala gotLock = true; 290f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala break; 291f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } else { 292f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala usleep(kDumpSleepDuration); 293f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 294f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 295f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return gotLock; 296f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 297f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 298cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehCamera3Device::Size Camera3Device::getMaxJpegResolution() const { 299f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He int32_t maxJpegWidth = 0, maxJpegHeight = 0; 300cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 301cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_CONFIGURATION_SIZE = 4; 302cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_FORMAT_OFFSET = 0; 303cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_WIDTH_OFFSET = 1; 304cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_HEIGHT_OFFSET = 2; 305cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_IS_INPUT_OFFSET = 3; 306cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry_t availableStreamConfigs = 307cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh mDeviceInfo.find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS); 308cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (availableStreamConfigs.count == 0 || 309cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh availableStreamConfigs.count % STREAM_CONFIGURATION_SIZE != 0) { 310cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return Size(0, 0); 311cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 312cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 313cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh // Get max jpeg size (area-wise). 314cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i=0; i < availableStreamConfigs.count; i+= STREAM_CONFIGURATION_SIZE) { 315cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t format = availableStreamConfigs.data.i32[i + STREAM_FORMAT_OFFSET]; 316cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t width = availableStreamConfigs.data.i32[i + STREAM_WIDTH_OFFSET]; 317cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t height = availableStreamConfigs.data.i32[i + STREAM_HEIGHT_OFFSET]; 318cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t isInput = availableStreamConfigs.data.i32[i + STREAM_IS_INPUT_OFFSET]; 319cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT 320cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh && format == HAL_PIXEL_FORMAT_BLOB && 321cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh (width * height > maxJpegWidth * maxJpegHeight)) { 322cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh maxJpegWidth = width; 323cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh maxJpegHeight = height; 324cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 325cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 326cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } else { 327cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry availableJpegSizes = 328cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh mDeviceInfo.find(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 329cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (availableJpegSizes.count == 0 || availableJpegSizes.count % 2 != 0) { 330cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return Size(0, 0); 331cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 332cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 333cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh // Get max jpeg size (area-wise). 334cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i = 0; i < availableJpegSizes.count; i += 2) { 335cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if ((availableJpegSizes.data.i32[i] * availableJpegSizes.data.i32[i + 1]) 336cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh > (maxJpegWidth * maxJpegHeight)) { 337cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh maxJpegWidth = availableJpegSizes.data.i32[i]; 338cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh maxJpegHeight = availableJpegSizes.data.i32[i + 1]; 339cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 340f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 341f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 342cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return Size(maxJpegWidth, maxJpegHeight); 343cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh} 344cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 345cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yehssize_t Camera3Device::getJpegBufferSize(uint32_t width, uint32_t height) const { 346cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh // Get max jpeg size (area-wise). 347cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Size maxJpegResolution = getMaxJpegResolution(); 348cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (maxJpegResolution.width == 0) { 349cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh ALOGE("%s: Camera %d: Can't find find valid available jpeg sizes in static metadata!", 350cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh __FUNCTION__, mId); 351f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He return BAD_VALUE; 352f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 353f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 354f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He // Get max jpeg buffer size 355f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He ssize_t maxJpegBufferSize = 0; 356cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry jpegBufMaxSize = mDeviceInfo.find(ANDROID_JPEG_MAX_SIZE); 357cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (jpegBufMaxSize.count == 0) { 358f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He ALOGE("%s: Camera %d: Can't find maximum JPEG size in static metadata!", __FUNCTION__, mId); 359f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He return BAD_VALUE; 360f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 361cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh maxJpegBufferSize = jpegBufMaxSize.data.i32[0]; 362f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 363f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He // Calculate final jpeg buffer size for the given resolution. 364cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh float scaleFactor = ((float) (width * height)) / 365cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh (maxJpegResolution.width * maxJpegResolution.height); 366f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He ssize_t jpegBufferSize = scaleFactor * maxJpegBufferSize; 367f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He // Bound the buffer size to [MIN_JPEG_BUFFER_SIZE, maxJpegBufferSize]. 368f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He if (jpegBufferSize > maxJpegBufferSize) { 369f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He jpegBufferSize = maxJpegBufferSize; 370f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } else if (jpegBufferSize < kMinJpegBufferSize) { 371f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He jpegBufferSize = kMinJpegBufferSize; 372f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 373f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 374f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He return jpegBufferSize; 375f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He} 376f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 3777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::dump(int fd, const Vector<String16> &args) { 3787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 3797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)args; 380f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 381f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Try to lock, but continue in case of failure (to avoid blocking in 382f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // deadlocks) 383f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool gotInterfaceLock = tryLockSpinRightRound(mInterfaceLock); 384f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool gotLock = tryLockSpinRightRound(mLock); 385f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 386f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGW_IF(!gotInterfaceLock, 387f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala "Camera %d: %s: Unable to lock interface lock, proceeding anyway", 388f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, __FUNCTION__); 389f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGW_IF(!gotLock, 390f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala "Camera %d: %s: Unable to lock main lock, proceeding anyway", 391f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, __FUNCTION__); 392f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 393f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala String8 lines; 394f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 395f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const char *status = 396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ERROR ? "ERROR" : 397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_UNINITIALIZED ? "UNINITIALIZED" : 398f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus == STATUS_UNCONFIGURED ? "UNCONFIGURED" : 399f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus == STATUS_CONFIGURED ? "CONFIGURED" : 400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ACTIVE ? "ACTIVE" : 401f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala "Unknown"; 402f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala lines.appendFormat(" Device status: %s\n", status); 404b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala if (mStatus == STATUS_ERROR) { 405b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala lines.appendFormat(" Error cause: %s\n", mErrorCause.string()); 406b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala } 407f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala lines.appendFormat(" Stream configuration:\n"); 408f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 409f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream != NULL) { 410f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala write(fd, lines.string(), lines.size()); 411f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mInputStream->dump(fd, args); 412f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 413f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala lines.appendFormat(" No input stream.\n"); 414f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala write(fd, lines.string(), lines.size()); 415f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 416f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < mOutputStreams.size(); i++) { 417f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mOutputStreams[i]->dump(fd,args); 418f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 4197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 42042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala lines = String8(" In-flight requests:\n"); 42142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (mInFlightMap.size() == 0) { 42242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala lines.append(" None\n"); 42342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } else { 42442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala for (size_t i = 0; i < mInFlightMap.size(); i++) { 42542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightRequest r = mInFlightMap.valueAt(i); 426e5729fac81c8a984e984fefc90afc64135817d4fColin Cross lines.appendFormat(" Frame %d | Timestamp: %" PRId64 ", metadata" 42742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala " arrived: %s, buffers left: %d\n", mInFlightMap.keyAt(i), 42842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala r.captureTimestamp, r.haveResultMetadata ? "true" : "false", 42942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala r.numBuffersLeft); 43042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 43142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 43242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala write(fd, lines.string(), lines.size()); 43342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 4341e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin { 4351e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin lines = String8(" Last request sent:\n"); 4361e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin write(fd, lines.string(), lines.size()); 4371e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 438f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala CameraMetadata lastRequest = getLatestRequestLocked(); 4391e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin lastRequest.dump(fd, /*verbosity*/2, /*indentation*/6); 4401e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin } 4411e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 442f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mHal3Device != NULL) { 44342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala lines = String8(" HAL device dump:\n"); 444f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala write(fd, lines.string(), lines.size()); 445f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device->ops->dump(mHal3Device, fd); 446f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 4477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 448f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (gotLock) mLock.unlock(); 449f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (gotInterfaceLock) mInterfaceLock.unlock(); 450f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 4517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return OK; 4527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 4537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaconst CameraMetadata& Camera3Device::info() const { 4557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGVV("%s: E", __FUNCTION__); 456f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (CC_UNLIKELY(mStatus == STATUS_UNINITIALIZED || 457f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ERROR)) { 458b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala ALOGW("%s: Access to static info %s!", __FUNCTION__, 459f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ERROR ? 460f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala "when in error state" : "before init"); 461f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 4627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return mDeviceInfo; 4637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 4647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 46590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::checkStatusOkToCaptureLocked() { 46690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei switch (mStatus) { 46790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_ERROR: 46890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("Device has encountered a serious error"); 46990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return INVALID_OPERATION; 47090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_UNINITIALIZED: 47190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("Device not initialized"); 47290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return INVALID_OPERATION; 47390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_UNCONFIGURED: 47490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_CONFIGURED: 47590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_ACTIVE: 47690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei // OK 47790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei break; 47890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei default: 47990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei SET_ERR_L("Unexpected status: %d", mStatus); 48090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return INVALID_OPERATION; 48190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 48290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return OK; 48390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 48490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 48590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::convertMetadataListToRequestListLocked( 48690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei const List<const CameraMetadata> &metadataList, RequestList *requestList) { 48790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (requestList == NULL) { 48890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("requestList cannot be NULL."); 48990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return BAD_VALUE; 49090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 49190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 492cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int32_t burstId = 0; 49390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei for (List<const CameraMetadata>::const_iterator it = metadataList.begin(); 49490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei it != metadataList.end(); ++it) { 49590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei sp<CaptureRequest> newRequest = setUpRequestLocked(*it); 49690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (newRequest == 0) { 49790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("Can't create capture request"); 49890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return BAD_VALUE; 49990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 500cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 501cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // Setup burst Id and request Id 502cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei newRequest->mResultExtras.burstId = burstId++; 503cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (it->exists(ANDROID_REQUEST_ID)) { 504cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (it->find(ANDROID_REQUEST_ID).count == 0) { 505cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CLOGE("RequestID entry exists; but must not be empty in metadata"); 506cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return BAD_VALUE; 507cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 508cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei newRequest->mResultExtras.requestId = it->find(ANDROID_REQUEST_ID).data.i32[0]; 509cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } else { 510cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CLOGE("RequestID does not exist in metadata"); 511cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return BAD_VALUE; 512cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 513cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 51490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei requestList->push_back(newRequest); 5152d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei 5162d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGV("%s: requestId = %" PRId32, __FUNCTION__, newRequest->mResultExtras.requestId); 51790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 51890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return OK; 51990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 52090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 521cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::capture(CameraMetadata &request, int64_t* /*lastFrameNumber*/) { 5227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 5234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 5242d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei List<const CameraMetadata> requests; 5252d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei requests.push_back(request); 5262d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei return captureList(requests, /*lastFrameNumber*/NULL); 5277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 5287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 52990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::submitRequestsHelper( 5302d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei const List<const CameraMetadata> &requests, bool repeating, 5312d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 5322d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber) { 53390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ATRACE_CALL(); 53490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei Mutex::Autolock il(mInterfaceLock); 53590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei Mutex::Autolock l(mLock); 53690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 53790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei status_t res = checkStatusOkToCaptureLocked(); 53890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (res != OK) { 53990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei // error logged by previous call 54090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return res; 54190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 54290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 54390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei RequestList requestList; 54490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 54590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei res = convertMetadataListToRequestListLocked(requests, /*out*/&requestList); 54690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (res != OK) { 54790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei // error logged by previous call 54890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return res; 54990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 55090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 55190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (repeating) { 5522d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei res = mRequestThread->setRepeatingRequests(requestList, lastFrameNumber); 55390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } else { 5542d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei res = mRequestThread->queueRequestList(requestList, lastFrameNumber); 55590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 55690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 55790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (res == OK) { 55890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei waitUntilStateThenRelock(/*active*/true, kActiveTimeout); 55990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (res != OK) { 56090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei SET_ERR_L("Can't transition to active in %f seconds!", 56190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei kActiveTimeout/1e9); 56290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 5632d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGV("Camera %d: Capture request %" PRId32 " enqueued", mId, 5642d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei (*(requestList.begin()))->mResultExtras.requestId); 56590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } else { 56690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("Cannot queue request. Impossible."); 56790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return BAD_VALUE; 56890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 56990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 57090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return res; 57190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 57290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 573cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::captureList(const List<const CameraMetadata> &requests, 574cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber) { 57590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ATRACE_CALL(); 57690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 577cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return submitRequestsHelper(requests, /*repeating*/false, lastFrameNumber); 57890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 5797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 580cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::setStreamingRequest(const CameraMetadata &request, 581cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t* /*lastFrameNumber*/) { 5827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 583f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 5842d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei List<const CameraMetadata> requests; 5852d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei requests.push_back(request); 5862d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei return setStreamingRequestList(requests, /*lastFrameNumber*/NULL); 587f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 588f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 589cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::setStreamingRequestList(const List<const CameraMetadata> &requests, 590cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber) { 59190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ATRACE_CALL(); 59290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 593cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return submitRequestsHelper(requests, /*repeating*/true, lastFrameNumber); 59490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 595f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 596f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::setUpRequestLocked( 597f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const CameraMetadata &request) { 598f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 599f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 600f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_UNCONFIGURED || mNeedConfig) { 601f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = configureStreamsLocked(); 602f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 603b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't set up streams: %s (%d)", strerror(-res), res); 604f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 605f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 606f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_UNCONFIGURED) { 607f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala CLOGE("No streams configured"); 608f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return NULL; 609f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 610f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 611f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 612f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> newRequest = createCaptureRequest(request); 613f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return newRequest; 6147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 6157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 616cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::clearStreamingRequest(int64_t *lastFrameNumber) { 6177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 618f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 619f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 620f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 621f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 622f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 623b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 624f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 625f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 626b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device not initialized"); 627f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 628f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 629f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 630f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 631f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 632f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 633f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 634b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 635f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 636f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 637f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Clearing repeating request", mId); 638cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 6392d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei return mRequestThread->clearRepeatingRequests(lastFrameNumber); 6407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 6417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) { 6437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 644f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 6457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->waitUntilRequestProcessed(requestId, timeout); 6477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 6487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6495a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Device::createInputStream( 6505a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin uint32_t width, uint32_t height, int format, int *id) { 6515a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ATRACE_CALL(); 652f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 6535a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin Mutex::Autolock l(mLock); 654f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Creating new input stream %d: %d x %d, format %d", 655f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, mNextStreamId, width, height, format); 6565a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6575a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin status_t res; 6585a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin bool wasActive = false; 6595a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6605a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin switch (mStatus) { 6615a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin case STATUS_ERROR: 6625a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: Device has encountered a serious error", __FUNCTION__); 6635a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 6645a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin case STATUS_UNINITIALIZED: 6655a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: Device not initialized", __FUNCTION__); 6665a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 667f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 668f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 6695a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin // OK 6705a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin break; 6715a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin case STATUS_ACTIVE: 6725a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); 673f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = internalPauseAndWaitLocked(); 6745a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (res != OK) { 675f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't pause captures to reconfigure streams!"); 6765a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return res; 6775a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 6785a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin wasActive = true; 6795a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin break; 6805a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin default: 681f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("%s: Unexpected status: %d", mStatus); 6825a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 6835a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 684f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala assert(mStatus != STATUS_ACTIVE); 6855a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6865a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (mInputStream != 0) { 6875a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__); 6885a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 6895a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 6905a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6915a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin sp<Camera3InputStream> newStream = new Camera3InputStream(mNextStreamId, 6925a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin width, height, format); 693f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala newStream->setStatusTracker(mStatusTracker); 6945a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6955a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin mInputStream = newStream; 6965a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6975a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin *id = mNextStreamId++; 6985a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6995a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin // Continue captures if active at start 7005a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (wasActive) { 7015a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); 7025a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin res = configureStreamsLocked(); 7035a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (res != OK) { 7045a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)", 7055a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin __FUNCTION__, mNextStreamId, strerror(-res), res); 7065a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return res; 7075a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 708f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala internalResumeLocked(); 7095a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 7105a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 711f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Created input stream", mId); 7125a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return OK; 7135a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 7145a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 7152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7162fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinstatus_t Camera3Device::createZslStream( 7172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin uint32_t width, uint32_t height, 7182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int depth, 7192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin /*out*/ 7202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int *id, 7212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3ZslStream>* zslStream) { 7222fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ATRACE_CALL(); 723f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 7242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Mutex::Autolock l(mLock); 725f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Creating ZSL stream %d: %d x %d, depth %d", 726f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, mNextStreamId, width, height, depth); 7272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin status_t res; 7292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin bool wasActive = false; 7302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin switch (mStatus) { 7322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin case STATUS_ERROR: 7332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Device has encountered a serious error", __FUNCTION__); 7342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 7352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin case STATUS_UNINITIALIZED: 7362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Device not initialized", __FUNCTION__); 7372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 738f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 739f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 7402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // OK 7412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin break; 7422fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin case STATUS_ACTIVE: 7432fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); 744f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = internalPauseAndWaitLocked(); 7452fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res != OK) { 746f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't pause captures to reconfigure streams!"); 7472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 7482fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 7492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin wasActive = true; 7502fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin break; 7512fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin default: 752f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 7532fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 7542fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 755f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala assert(mStatus != STATUS_ACTIVE); 7562fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (mInputStream != 0) { 7582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__); 7592fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 7602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 7612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3ZslStream> newStream = new Camera3ZslStream(mNextStreamId, 7632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin width, height, depth); 764f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala newStream->setStatusTracker(mStatusTracker); 7652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = mOutputStreams.add(mNextStreamId, newStream); 7672fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res < 0) { 7682fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Can't add new stream to set: %s (%d)", 7692fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__, strerror(-res), res); 7702fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 7712fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 7722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mInputStream = newStream; 7732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 774e5e3d0823165dea9211a47232dbbbe361153fb49Yuvraj Pasi mNeedConfig = true; 775e5e3d0823165dea9211a47232dbbbe361153fb49Yuvraj Pasi 7762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin *id = mNextStreamId++; 7772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin *zslStream = newStream; 7782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Continue captures if active at start 7802fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (wasActive) { 7812fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); 7822fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = configureStreamsLocked(); 7832fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res != OK) { 7842fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)", 7852fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__, mNextStreamId, strerror(-res), res); 7862fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 7872fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 788f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala internalResumeLocked(); 7892fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 7902fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 791f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Created ZSL stream", mId); 7922fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return OK; 7932fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 7942fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createStream(sp<ANativeWindow> consumer, 7967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala uint32_t width, uint32_t height, int format, size_t size, int *id) { 7977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 798f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 799f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 800e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGV("Camera %d: Creating new stream %d: %d x %d, format %d, size %zu", 801f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, mNextStreamId, width, height, format, size); 8027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 803f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 804f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool wasActive = false; 805f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 806f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 807f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 808b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 809f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 810f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 811b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device not initialized"); 812f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 813f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 814f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 815f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 816f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 817f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 818f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); 819f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = internalPauseAndWaitLocked(); 820f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 821f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't pause captures to reconfigure streams!"); 822f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 823f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 824f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala wasActive = true; 825f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 826f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 827b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 828f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 829f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 830f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala assert(mStatus != STATUS_ACTIVE); 831f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 832f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<Camera3OutputStream> newStream; 833f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (format == HAL_PIXEL_FORMAT_BLOB) { 834f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He ssize_t jpegBufferSize = getJpegBufferSize(width, height); 835f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He if (jpegBufferSize > 0) { 836f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He ALOGV("%s: Overwrite Jpeg output buffer size from %zu to %zu", 837f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He __FUNCTION__, size, jpegBufferSize); 838f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } else { 839f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He SET_ERR_L("Invalid jpeg buffer size %zd", jpegBufferSize); 840f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He return BAD_VALUE; 841f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 842f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 843f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newStream = new Camera3OutputStream(mNextStreamId, consumer, 844f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He width, height, jpegBufferSize, format); 845f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 846f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newStream = new Camera3OutputStream(mNextStreamId, consumer, 847f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala width, height, format); 848f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 849f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala newStream->setStatusTracker(mStatusTracker); 850f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 851f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mOutputStreams.add(mNextStreamId, newStream); 852f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res < 0) { 853b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't add new stream to set: %s (%d)", strerror(-res), res); 854f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 855f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 856f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 857f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala *id = mNextStreamId++; 858ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala mNeedConfig = true; 859f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 860f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Continue captures if active at start 861f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (wasActive) { 862f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); 863f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = configureStreamsLocked(); 864f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 865b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Can't reconfigure device for new stream %d: %s (%d)", 866b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala mNextStreamId, strerror(-res), res); 867f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 868f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 869f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala internalResumeLocked(); 870f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 871f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Created new stream", mId); 872f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 8737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 8747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createReprocessStreamFromStream(int outputId, int *id) { 8767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 8777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)outputId; (void)id; 8787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 879b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Unimplemented"); 8807fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 8817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 8827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::getStreamInfo(int id, 8857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala uint32_t *width, uint32_t *height, uint32_t *format) { 8867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 887f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 888f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 889f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 890f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 891f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 892b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 893f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 894f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 895b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device not initialized!"); 896f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 897f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 898f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 899f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 900f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 901f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 902f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 903b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 904f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 905f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 9067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 907f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ssize_t idx = mOutputStreams.indexOfKey(id); 908f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (idx == NAME_NOT_FOUND) { 909b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Stream %d is unknown", id); 910f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return idx; 911f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 912f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 913f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (width) *width = mOutputStreams[idx]->getWidth(); 914f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (height) *height = mOutputStreams[idx]->getHeight(); 915f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (format) *format = mOutputStreams[idx]->getFormat(); 916f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 917f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 9187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 9197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 9207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setStreamTransform(int id, 9217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala int transform) { 9227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 923f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 924f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 925f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 926f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 927f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 928b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 929f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 930f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 931b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device not initialized"); 932f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 933f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 934f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 935f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 936f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 937f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 938f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 939b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 940f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 941f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 9427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 943f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ssize_t idx = mOutputStreams.indexOfKey(id); 944f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (idx == NAME_NOT_FOUND) { 945b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Stream %d does not exist", 946b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala id); 947f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return BAD_VALUE; 948f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 949f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 950f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return mOutputStreams.editValueAt(idx)->setTransform(transform); 9517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 9527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 9537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteStream(int id) { 9547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 955f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 956f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 957f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 9587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 959e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin ALOGV("%s: Camera %d: Deleting stream %d", __FUNCTION__, mId, id); 960e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin 961f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // CameraDevice semantics require device to already be idle before 962f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // deleteStream is called, unlike for createStream. 963f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_ACTIVE) { 9645282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGV("%s: Camera %d: Device not idle", __FUNCTION__, mId); 9655282713a976184e41451315f1286d8075b257d58Igor Murashkin return -EBUSY; 966f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 967f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 9682fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3StreamInterface> deletedStream; 9695f44635dc35814b98b4dc2b255355a93122fec59Zhijun He ssize_t outputStreamIdx = mOutputStreams.indexOfKey(id); 970f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream != NULL && id == mInputStream->getId()) { 971f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala deletedStream = mInputStream; 972f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mInputStream.clear(); 973f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 9745f44635dc35814b98b4dc2b255355a93122fec59Zhijun He if (outputStreamIdx == NAME_NOT_FOUND) { 975b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Stream %d does not exist", id); 976f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return BAD_VALUE; 977f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 9785f44635dc35814b98b4dc2b255355a93122fec59Zhijun He } 9795f44635dc35814b98b4dc2b255355a93122fec59Zhijun He 9805f44635dc35814b98b4dc2b255355a93122fec59Zhijun He // Delete output stream or the output part of a bi-directional stream. 9815f44635dc35814b98b4dc2b255355a93122fec59Zhijun He if (outputStreamIdx != NAME_NOT_FOUND) { 9825f44635dc35814b98b4dc2b255355a93122fec59Zhijun He deletedStream = mOutputStreams.editValueAt(outputStreamIdx); 983f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mOutputStreams.removeItem(id); 984f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 985f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 986f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Free up the stream endpoint so that it can be used by some other stream 987f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = deletedStream->disconnect(); 988f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 989b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't disconnect deleted stream %d", id); 990f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // fall through since we want to still list the stream as deleted. 991f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 992f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDeletedStreams.add(deletedStream); 993ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala mNeedConfig = true; 994f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 995f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 9967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 9977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 9987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteReprocessStream(int id) { 9997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 10007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)id; 10017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1002b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Unimplemented"); 10037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 10047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 10057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 10067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 10077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createDefaultRequest(int templateId, 10087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala CameraMetadata *request) { 10097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1010fe7e0c6154309f2491463ee6ca4920d225289638Alex Ray ALOGV("%s: for template %d", __FUNCTION__, templateId); 1011f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1012f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 1013f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1014f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 1015f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 1016b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 1017f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1018f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 1019b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device is not initialized!"); 1020f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1021f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 1022f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 1023f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 1024f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 1025f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 1026f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 1027b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 1028f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1029f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 10307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 10317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera_metadata_t *rawRequest; 103217a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->construct_default_request_settings"); 10337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala rawRequest = mHal3Device->ops->construct_default_request_settings( 10347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal3Device, templateId); 103517a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 1036b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala if (rawRequest == NULL) { 1037b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("HAL is unable to construct default settings for template %d", 1038b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala templateId); 1039b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala return DEAD_OBJECT; 1040b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala } 10417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala *request = rawRequest; 10427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 10437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return OK; 10447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 10457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 10467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilDrained() { 10477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1048f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1049f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 10507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 105169a374897392c8bd70f441b7284f6f578c651ec9Zhijun He return waitUntilDrainedLocked(); 105269a374897392c8bd70f441b7284f6f578c651ec9Zhijun He} 105369a374897392c8bd70f441b7284f6f578c651ec9Zhijun He 105469a374897392c8bd70f441b7284f6f578c651ec9Zhijun Hestatus_t Camera3Device::waitUntilDrainedLocked() { 1055f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 1056f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 1057f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 1058f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: Already idle", __FUNCTION__); 1059f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 1060f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 1061f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // To avoid race conditions, check with tracker to be sure 1062f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 1063f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 1064f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Need to verify shut down 1065f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 1066f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 1067b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d",mStatus); 1068f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1069f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1070f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1071f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Waiting until idle", __FUNCTION__, mId); 1072f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout); 1073f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 1074f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 1075f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1076f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// Pause to reconfigure 1077f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::internalPauseAndWaitLocked() { 1078f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread->setPaused(true); 1079f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mPauseStateNotify = true; 1080f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1081f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Internal wait until idle", __FUNCTION__, mId); 1082f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout); 1083f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) { 1084f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't idle device in %f seconds!", 1085f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala kShutdownTimeout/1e9); 1086f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1087f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1088f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 1089f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 1090f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1091f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// Resume after internalPauseAndWaitLocked 1092f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::internalResumeLocked() { 1093f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t res; 1094f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1095f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread->setPaused(false); 1096f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1097f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = waitUntilStateThenRelock(/*active*/ true, kActiveTimeout); 1098f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) { 1099f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't transition to active in %f seconds!", 1100f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala kActiveTimeout/1e9); 1101f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1102f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mPauseStateNotify = false; 1103f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return OK; 1104f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 1105f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1106f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::waitUntilStateThenRelock(bool active, 1107f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala nsecs_t timeout) { 1108f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t res = OK; 1109f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (active == (mStatus == STATUS_ACTIVE)) { 1110f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Desired state already reached 1111f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 1112f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1113f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1114f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool stateSeen = false; 1115f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala do { 1116f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRecentStatusUpdates.clear(); 1117f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1118f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = mStatusChanged.waitRelative(mLock, timeout); 1119f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) break; 1120f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1121f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Check state change history during wait 1122f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala for (size_t i = 0; i < mRecentStatusUpdates.size(); i++) { 1123f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (active == (mRecentStatusUpdates[i] == STATUS_ACTIVE) ) { 1124f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala stateSeen = true; 1125f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala break; 1126f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1127f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1128f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } while (!stateSeen); 1129f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1130f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 11317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 11327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1133f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 11347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setNotifyCallback(NotificationListener *listener) { 11357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 11367d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 11377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11387d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (listener != NULL && mListener != NULL) { 11397d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ALOGW("%s: Replacing old callback listener", __FUNCTION__); 11407d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 11417d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mListener = listener; 11427d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 11437d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return OK; 11447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 11457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 114646910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvalabool Camera3Device::willNotify3A() { 114746910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala return false; 114846910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala} 114946910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala 11507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitForNextFrame(nsecs_t timeout) { 11517d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala status_t res; 11527d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 11537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11547d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala while (mResultQueue.empty()) { 11557d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala res = mResultSignal.waitRelative(mOutputLock, timeout); 11567d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (res == TIMED_OUT) { 11577d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return res; 11587d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } else if (res != OK) { 1159e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGW("%s: Camera %d: No frame in %" PRId64 " ns: %s (%d)", 1160b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala __FUNCTION__, mId, timeout, strerror(-res), res); 11617d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return res; 11627d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 11637d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 11647d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return OK; 11657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 11667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1167cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::getNextResult(CaptureResult *frame) { 11687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 11697d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 11707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11717d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (mResultQueue.empty()) { 11727d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return NOT_ENOUGH_DATA; 11737d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 11747d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 1175cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (frame == NULL) { 1176cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGE("%s: argument cannot be NULL", __FUNCTION__); 1177cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return BAD_VALUE; 1178cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 1179cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 1180cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResult &result = *(mResultQueue.begin()); 1181cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei frame->mResultExtras = result.mResultExtras; 1182cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei frame->mMetadata.acquire(result.mMetadata); 11837d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mResultQueue.erase(mResultQueue.begin()); 11847d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 11857d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return OK; 11867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 11877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerAutofocus(uint32_t id) { 11897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1190f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 11917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id); 11934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in this trigger into the next request and only the next request. 11944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[] = { 11954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 11964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER, 11974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_START 11984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 11994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 12004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_ID, 12014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin static_cast<int32_t>(id) 1202741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 12034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 12044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 12054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->queueTrigger(trigger, 12064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin sizeof(trigger)/sizeof(trigger[0])); 12077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 12087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 12097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerCancelAutofocus(uint32_t id) { 12107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1211f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 12127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 12134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Triggering cancel autofocus, id %d", __FUNCTION__, id); 12144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in this trigger into the next request and only the next request. 12154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[] = { 12164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 12174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER, 12184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_CANCEL 12194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 12204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 12214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_ID, 12224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin static_cast<int32_t>(id) 1223741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 12244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 12254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 12264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->queueTrigger(trigger, 12274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin sizeof(trigger)/sizeof(trigger[0])); 12287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 12297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 12307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerPrecaptureMetering(uint32_t id) { 12317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1232f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 12337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 12344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id); 12354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in this trigger into the next request and only the next request. 12364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[] = { 12374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 12384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, 12394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START 12404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 12414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 12424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AE_PRECAPTURE_ID, 12434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin static_cast<int32_t>(id) 1244741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 12454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 12464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 12474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->queueTrigger(trigger, 12484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin sizeof(trigger)/sizeof(trigger[0])); 12497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 12507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 12517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::pushReprocessBuffer(int reprocessStreamId, 12527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala buffer_handle_t *buffer, wp<BufferReleasedListener> listener) { 12537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 12547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)reprocessStreamId; (void)buffer; (void)listener; 12557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1256b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Unimplemented"); 12577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 12587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 12597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1260cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::flush(int64_t *frameNumber) { 1261abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala ATRACE_CALL(); 1262abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala ALOGV("%s: Camera %d: Flushing all requests", __FUNCTION__, mId); 1263f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1264abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 12657ef20390ba4375c4b08edd14923846086987a8c8Zhijun He { 12667ef20390ba4375c4b08edd14923846086987a8c8Zhijun He Mutex::Autolock l(mLock); 12677ef20390ba4375c4b08edd14923846086987a8c8Zhijun He mRequestThread->clear(/*out*/frameNumber); 12687ef20390ba4375c4b08edd14923846086987a8c8Zhijun He } 12697ef20390ba4375c4b08edd14923846086987a8c8Zhijun He 1270491e341211b4772c75f719158f6b397e1c40497dZhijun He status_t res; 1271491e341211b4772c75f719158f6b397e1c40497dZhijun He if (mHal3Device->common.version >= CAMERA_DEVICE_API_VERSION_3_1) { 1272491e341211b4772c75f719158f6b397e1c40497dZhijun He res = mHal3Device->ops->flush(mHal3Device); 1273491e341211b4772c75f719158f6b397e1c40497dZhijun He } else { 12747ef20390ba4375c4b08edd14923846086987a8c8Zhijun He Mutex::Autolock l(mLock); 127569a374897392c8bd70f441b7284f6f578c651ec9Zhijun He res = waitUntilDrainedLocked(); 1276491e341211b4772c75f719158f6b397e1c40497dZhijun He } 1277491e341211b4772c75f719158f6b397e1c40497dZhijun He 1278491e341211b4772c75f719158f6b397e1c40497dZhijun He return res; 1279abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala} 1280abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 1281204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun Heuint32_t Camera3Device::getDeviceVersion() { 1282204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He ATRACE_CALL(); 1283204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He Mutex::Autolock il(mInterfaceLock); 1284204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He return mDeviceVersion; 1285204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He} 1286204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 1287f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 1288f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Methods called by subclasses 1289f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 1290f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1291f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid Camera3Device::notifyStatus(bool idle) { 1292f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala { 1293f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Need mLock to safely update state and synchronize to current 1294f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // state of methods in flight. 1295f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mLock); 1296f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // We can get various system-idle notices from the status tracker 1297f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // while starting up. Only care about them if we've actually sent 1298f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // in some requests recently. 1299f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus != STATUS_ACTIVE && mStatus != STATUS_CONFIGURED) { 1300f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return; 1301f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1302f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Now %s", __FUNCTION__, mId, 1303f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala idle ? "idle" : "active"); 1304f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus = idle ? STATUS_CONFIGURED : STATUS_ACTIVE; 1305f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRecentStatusUpdates.add(mStatus); 1306f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusChanged.signal(); 1307f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1308f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Skip notifying listener if we're doing some user-transparent 1309f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // state changes 1310f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mPauseStateNotify) return; 1311f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1312f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala NotificationListener *listener; 1313f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala { 1314f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mOutputLock); 1315f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala listener = mListener; 1316f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1317f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (idle && listener != NULL) { 1318f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala listener->notifyIdle(); 1319f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1320f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 1321f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1322f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala/** 1323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera3Device private methods 1324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 1325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1326f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::createCaptureRequest( 1327f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const CameraMetadata &request) { 1328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ATRACE_CALL(); 1329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 1330f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1331f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> newRequest = new CaptureRequest; 1332f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings = request; 1333f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1334f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera_metadata_entry_t inputStreams = 1335f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.find(ANDROID_REQUEST_INPUT_STREAMS); 1336f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (inputStreams.count > 0) { 1337f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream == NULL || 1338d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He mInputStream->getId() != inputStreams.data.i32[0]) { 1339b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Request references unknown input stream %d", 1340b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala inputStreams.data.u8[0]); 1341f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1342f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1343f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Lazy completion of stream configuration (allocation/registration) 1344f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // on first use 1345f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream->isConfiguring()) { 1346f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mInputStream->finishConfiguration(mHal3Device); 1347f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1348b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to finish configuring input stream %d:" 1349f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala " %s (%d)", 1350b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala mInputStream->getId(), strerror(-res), res); 1351f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1352f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1353f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1354f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1355f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mInputStream = mInputStream; 1356f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.erase(ANDROID_REQUEST_INPUT_STREAMS); 1357f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1358f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1359f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera_metadata_entry_t streams = 1360f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.find(ANDROID_REQUEST_OUTPUT_STREAMS); 1361f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (streams.count == 0) { 1362b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Zero output streams specified!"); 1363f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1364f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1365f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1366f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < streams.count; i++) { 1367d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He int idx = mOutputStreams.indexOfKey(streams.data.i32[i]); 1368f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (idx == NAME_NOT_FOUND) { 1369b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Request references unknown stream %d", 1370b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala streams.data.u8[i]); 1371f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1372f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 13732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3OutputStreamInterface> stream = 13742fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mOutputStreams.editValueAt(idx); 1375f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1376f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Lazy completion of stream configuration (allocation/registration) 1377f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // on first use 1378f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (stream->isConfiguring()) { 1379f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = stream->finishConfiguration(mHal3Device); 1380f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1381b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to finish configuring stream %d: %s (%d)", 1382b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala stream->getId(), strerror(-res), res); 1383f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1384f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1385f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1386f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1387f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mOutputStreams.push(stream); 1388f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1389f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.erase(ANDROID_REQUEST_OUTPUT_STREAMS); 1390f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1391f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return newRequest; 13927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 13937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1394f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::configureStreamsLocked() { 1395f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ATRACE_CALL(); 1396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 13977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1398f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus != STATUS_UNCONFIGURED && mStatus != STATUS_CONFIGURED) { 1399b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Not idle"); 1400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1401f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1403ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala if (!mNeedConfig) { 1404ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala ALOGV("%s: Skipping config, no stream changes", __FUNCTION__); 1405ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala return OK; 1406ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala } 1407ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala 1408f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Start configuring the streams 1409f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Starting stream configuration", __FUNCTION__, mId); 1410f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1411f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_configuration config; 1412f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1413f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala config.num_streams = (mInputStream != NULL) + mOutputStreams.size(); 1414f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1415f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<camera3_stream_t*> streams; 1416f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala streams.setCapacity(config.num_streams); 1417f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1418f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream != NULL) { 1419f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_t *inputStream; 1420f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala inputStream = mInputStream->startConfiguration(); 1421f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (inputStream == NULL) { 1422b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't start input stream configuration"); 1423f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1424f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1425f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala streams.add(inputStream); 1426f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1427f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1428f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < mOutputStreams.size(); i++) { 14292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 14302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Don't configure bidi streams twice, nor add them twice to the list 14312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (mOutputStreams[i].get() == 14322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin static_cast<Camera3StreamInterface*>(mInputStream.get())) { 14332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 14342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin config.num_streams--; 14352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin continue; 14362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 14372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1438f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_t *outputStream; 1439f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputStream = mOutputStreams.editValueAt(i)->startConfiguration(); 1440f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (outputStream == NULL) { 1441b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't start output stream configuration"); 1442f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1443f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1444f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala streams.add(outputStream); 1445f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1446f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1447f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala config.streams = streams.editArray(); 1448f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1449f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Do the HAL configuration; will potentially touch stream 1450f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // max_buffers, usage, priv fields. 145117a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->configure_streams"); 1452f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mHal3Device->ops->configure_streams(mHal3Device, &config); 145317a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 1454f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1455f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1456b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to configure streams with HAL: %s (%d)", 1457b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala strerror(-res), res); 1458f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 1459f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1460f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 14614c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala // Finish all stream configuration immediately. 14624c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala // TODO: Try to relax this later back to lazy completion, which should be 14634c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala // faster 14644c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala 1465073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin if (mInputStream != NULL && mInputStream->isConfiguring()) { 14664c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala res = mInputStream->finishConfiguration(mHal3Device); 14674c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala if (res != OK) { 14684c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala SET_ERR_L("Can't finish configuring input stream %d: %s (%d)", 14694c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala mInputStream->getId(), strerror(-res), res); 14704c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala return res; 14714c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala } 14724c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala } 14734c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala 14744c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala for (size_t i = 0; i < mOutputStreams.size(); i++) { 1475073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin sp<Camera3OutputStreamInterface> outputStream = 1476073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin mOutputStreams.editValueAt(i); 1477073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin if (outputStream->isConfiguring()) { 1478073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin res = outputStream->finishConfiguration(mHal3Device); 1479073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin if (res != OK) { 1480073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin SET_ERR_L("Can't finish configuring output stream %d: %s (%d)", 1481073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin outputStream->getId(), strerror(-res), res); 1482073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin return res; 1483073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin } 14844c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala } 14854c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala } 14864c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala 1487f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Request thread needs to know to avoid using repeat-last-settings protocol 1488f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // across configure_streams() calls 1489f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread->configurationComplete(); 1490f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1491f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Update device state 1492f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1493ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala mNeedConfig = false; 1494f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1495f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (config.num_streams > 0) { 1496f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus = STATUS_CONFIGURED; 1497f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } else { 1498f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus = STATUS_UNCONFIGURED; 1499f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1500f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1501f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Stream configuration complete", __FUNCTION__, mId); 1502f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 15030a21051b91c2e07e49eb6fa568c505aee967ab9dZhijun He // tear down the deleted streams after configure streams. 15040a21051b91c2e07e49eb6fa568c505aee967ab9dZhijun He mDeletedStreams.clear(); 15050a21051b91c2e07e49eb6fa568c505aee967ab9dZhijun He 1506f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 15077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 15087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1509b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorState(const char *fmt, ...) { 1510b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala Mutex::Autolock l(mLock); 1511b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_list args; 1512b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_start(args, fmt); 1513b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1514b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala setErrorStateLockedV(fmt, args); 1515b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1516b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_end(args); 1517b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 1518b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1519b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateV(const char *fmt, va_list args) { 1520b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala Mutex::Autolock l(mLock); 1521b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala setErrorStateLockedV(fmt, args); 1522b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 1523b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1524b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateLocked(const char *fmt, ...) { 1525b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_list args; 1526b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_start(args, fmt); 1527b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1528b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala setErrorStateLockedV(fmt, args); 1529b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1530b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_end(args); 1531b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 1532b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1533b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateLockedV(const char *fmt, va_list args) { 153442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Print out all error messages to log 153542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala String8 errorCause = String8::formatV(fmt, args); 153642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ALOGE("Camera %d: %s", mId, errorCause.string()); 153742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 153842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // But only do error state transition steps for the first error 1539b05eeaedacaff92b6e5ac89f99b0fccdf7643f09Zhijun He if (mStatus == STATUS_ERROR || mStatus == STATUS_UNINITIALIZED) return; 1540b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1541ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin // Save stack trace. View by dumping it later. 1542ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin CameraTraces::saveTrace(); 1543ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin // TODO: consider adding errorCause and client pid/procname 1544ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin 154542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mErrorCause = errorCause; 154642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 154742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mRequestThread->setPaused(true); 1548b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala mStatus = STATUS_ERROR; 1549b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 1550f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1551f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 155242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala * In-flight request management 155342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala */ 155442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 1555cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::registerInFlight(uint32_t frameNumber, 1556c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He int32_t numBuffers, CaptureResultExtras resultExtras, bool hasInput) { 155742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ATRACE_CALL(); 155842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex::Autolock l(mInFlightLock); 155942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 156042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ssize_t res; 1561c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He res = mInFlightMap.add(frameNumber, InFlightRequest(numBuffers, resultExtras, hasInput)); 156242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (res < 0) return res; 156342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 156442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return OK; 156542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala} 156642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 156742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala/** 1568fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * Check if all 3A fields are ready, and send off a partial 3A-only result 1569fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * to the output frame queue 1570fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala */ 1571204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun Hebool Camera3Device::processPartial3AResult( 1572cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei uint32_t frameNumber, 1573cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei const CameraMetadata& partial, const CaptureResultExtras& resultExtras) { 1574fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1575fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Check if all 3A states are present 1576fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // The full list of fields is 1577fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.afMode 1578fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.awbMode 1579fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.aeState 1580fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.awbState 1581fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.afState 1582fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.afTriggerID 1583fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.aePrecaptureID 1584fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // TODO: Add android.control.aeMode 1585fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1586fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool gotAllStates = true; 1587fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1588fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint8_t afMode; 1589fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint8_t awbMode; 1590fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint8_t aeState; 1591fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint8_t afState; 1592fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint8_t awbState; 1593fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1594fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AF_MODE, 1595fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &afMode, frameNumber); 1596fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1597fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AWB_MODE, 1598fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &awbMode, frameNumber); 1599fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1600fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AE_STATE, 1601fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &aeState, frameNumber); 1602fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1603fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AF_STATE, 1604fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &afState, frameNumber); 1605fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1606fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AWB_STATE, 1607fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &awbState, frameNumber); 1608fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1609fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (!gotAllStates) return false; 1610fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1611184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala ALOGVV("%s: Camera %d: Frame %d, Request ID %d: AF mode %d, AWB mode %d, " 1612fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala "AF state %d, AE state %d, AWB state %d, " 1613fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala "AF trigger %d, AE precapture trigger %d", 16142d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei __FUNCTION__, mId, frameNumber, resultExtras.requestId, 1615fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala afMode, awbMode, 1616fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala afState, aeState, awbState, 1617741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh resultExtras.afTriggerId, resultExtras.precaptureTriggerId); 1618fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1619fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Got all states, so construct a minimal result to send 1620fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // In addition to the above fields, this means adding in 1621fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.request.frameCount 1622184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala // android.request.requestId 1623204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // android.quirks.partialResult (for HAL version below HAL3.2) 1624fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1625184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala const size_t kMinimal3AResultEntries = 10; 1626fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1627fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala Mutex::Autolock l(mOutputLock); 1628fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1629cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResult captureResult; 1630cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei captureResult.mResultExtras = resultExtras; 1631cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei captureResult.mMetadata = CameraMetadata(kMinimal3AResultEntries, /*dataCapacity*/ 0); 1632cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // TODO: change this to sp<CaptureResult>. This will need other changes, including, 1633cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // but not limited to CameraDeviceBase::getNextResult 1634cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResult& min3AResult = 1635cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei *mResultQueue.insert(mResultQueue.end(), captureResult); 1636cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 1637cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_REQUEST_FRAME_COUNT, 1638cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // TODO: This is problematic casting. Need to fix CameraMetadata. 1639cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reinterpret_cast<int32_t*>(&frameNumber), frameNumber)) { 1640fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1641fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1642fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1643cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int32_t requestId = resultExtras.requestId; 1644cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_REQUEST_ID, 1645184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala &requestId, frameNumber)) { 1646184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala return false; 1647184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala } 1648184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala 1649204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (mDeviceVersion < CAMERA_DEVICE_API_VERSION_3_2) { 1650204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He static const uint8_t partialResult = ANDROID_QUIRKS_PARTIAL_RESULT_PARTIAL; 1651204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (!insert3AResult(min3AResult.mMetadata, ANDROID_QUIRKS_PARTIAL_RESULT, 1652204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He &partialResult, frameNumber)) { 1653204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He return false; 1654204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 1655fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1656fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1657cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AF_MODE, 1658fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &afMode, frameNumber)) { 1659fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1660fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1661fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1662cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AWB_MODE, 1663fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &awbMode, frameNumber)) { 1664fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1665fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1666fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1667cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AE_STATE, 1668fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &aeState, frameNumber)) { 1669fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1670fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1671fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1672cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AF_STATE, 1673fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &afState, frameNumber)) { 1674fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1675fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1676fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1677cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AWB_STATE, 1678fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &awbState, frameNumber)) { 1679fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1680fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1681fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1682cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AF_TRIGGER_ID, 1683741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh &resultExtras.afTriggerId, frameNumber)) { 1684fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1685fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1686fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1687cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AE_PRECAPTURE_ID, 1688741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh &resultExtras.precaptureTriggerId, frameNumber)) { 1689fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1690fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1691fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1692204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // We only send the aggregated partial when all 3A related metadata are available 1693204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // For both API1 and API2. 1694204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // TODO: we probably should pass through all partials to API2 unconditionally. 1695fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala mResultSignal.signal(); 1696fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1697fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return true; 1698fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala} 1699fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1700fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalatemplate<typename T> 1701fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalabool Camera3Device::get3AResult(const CameraMetadata& result, int32_t tag, 1702cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei T* value, uint32_t frameNumber) { 1703fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala (void) frameNumber; 1704fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1705fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala camera_metadata_ro_entry_t entry; 1706fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1707fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala entry = result.find(tag); 1708fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (entry.count == 0) { 1709fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala ALOGVV("%s: Camera %d: Frame %d: No %s provided by HAL!", __FUNCTION__, 1710fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala mId, frameNumber, get_camera_metadata_tag_name(tag)); 1711fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1712fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1713fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1714fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (sizeof(T) == sizeof(uint8_t)) { 1715fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala *value = entry.data.u8[0]; 1716fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } else if (sizeof(T) == sizeof(int32_t)) { 1717fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala *value = entry.data.i32[0]; 1718fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } else { 1719fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala ALOGE("%s: Unexpected type", __FUNCTION__); 1720fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1721fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1722fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return true; 1723fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala} 1724fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1725fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalatemplate<typename T> 1726fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalabool Camera3Device::insert3AResult(CameraMetadata& result, int32_t tag, 1727cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei const T* value, uint32_t frameNumber) { 1728fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (result.update(tag, value, 1) != NO_ERROR) { 1729fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala mResultQueue.erase(--mResultQueue.end(), mResultQueue.end()); 1730fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala SET_ERR("Frame %d: Failed to set %s in partial metadata", 1731fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala frameNumber, get_camera_metadata_tag_name(tag)); 1732fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1733fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1734fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return true; 1735fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala} 1736fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1737fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala/** 1738f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera HAL device callback methods 1739f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 1740f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 17417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::processCaptureResult(const camera3_capture_result *result) { 17427d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ATRACE_CALL(); 17437d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 17447d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala status_t res; 17457d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 174642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t frameNumber = result->frame_number; 1747f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He if (result->result == NULL && result->num_output_buffers == 0 && 1748f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He result->input_buffer == NULL) { 174942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("No result data provided by HAL for frame %d", 175042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 17517d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return; 17527d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 1753204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 1754204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // For HAL3.2 or above, If HAL doesn't support partial, it must always set 1755204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // partial_result to 1 when metadata is included in this result. 1756204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (!mUsePartialResult && 1757204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2 && 1758204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He result->result != NULL && 1759204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He result->partial_result != 1) { 1760204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He SET_ERR("Result is malformed for frame %d: partial_result %u must be 1" 1761204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He " if partial result is not supported", 1762204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He frameNumber, result->partial_result); 1763204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He return; 1764204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 1765204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 1766204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He bool isPartialResult = false; 1767204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He CameraMetadata collectedPartialResult; 1768cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResultExtras resultExtras; 1769c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He bool hasInputBufferInRequest = false; 17707d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 1771cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // Get capture timestamp and resultExtras from list of in-flight requests, 1772cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // where it was added by the shutter notification for this frame. 1773cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // Then update the in-flight status and remove the in-flight entry if 1774cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // all result data has been received. 17757d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala nsecs_t timestamp = 0; 177642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala { 177742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex::Autolock l(mInFlightLock); 177842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ssize_t idx = mInFlightMap.indexOfKey(frameNumber); 177942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (idx == NAME_NOT_FOUND) { 178042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Unknown frame number for capture result: %d", 178142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 178242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return; 178342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 178442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightRequest &request = mInFlightMap.editValueAt(idx); 1785cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGVV("%s: got InFlightRequest requestId = %" PRId32 ", frameNumber = %" PRId64 1786cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ", burstId = %" PRId32, 1787cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei __FUNCTION__, request.resultExtras.requestId, request.resultExtras.frameNumber, 1788cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei request.resultExtras.burstId); 1789204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // Always update the partial count to the latest one. When framework aggregates adjacent 1790204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // partial results into one, the latest partial count will be used. 1791204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He request.resultExtras.partialResultCount = result->partial_result; 1792fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1793fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Check if this result carries only partial metadata 1794204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (mUsePartialResult && result->result != NULL) { 1795204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 1796204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (result->partial_result > mNumPartialResults || result->partial_result < 1) { 1797204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He SET_ERR("Result is malformed for frame %d: partial_result %u must be in" 1798204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He " the range of [1, %d] when metadata is included in the result", 1799204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He frameNumber, result->partial_result, mNumPartialResults); 1800204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He return; 1801204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 1802204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He isPartialResult = (result->partial_result < mNumPartialResults); 18035d76e1a639c1bae9ea7d9af1124abf1c94353344Zhijun He if (isPartialResult) { 18045d76e1a639c1bae9ea7d9af1124abf1c94353344Zhijun He request.partialResult.collectedResult.append(result->result); 18055d76e1a639c1bae9ea7d9af1124abf1c94353344Zhijun He } 1806204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } else { 1807204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He camera_metadata_ro_entry_t partialResultEntry; 1808204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He res = find_camera_metadata_ro_entry(result->result, 1809204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He ANDROID_QUIRKS_PARTIAL_RESULT, &partialResultEntry); 1810204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (res != NAME_NOT_FOUND && 1811204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He partialResultEntry.count > 0 && 1812204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He partialResultEntry.data.u8[0] == 1813204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He ANDROID_QUIRKS_PARTIAL_RESULT_PARTIAL) { 1814204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // A partial result. Flag this as such, and collect this 1815204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // set of metadata into the in-flight entry. 1816204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He isPartialResult = true; 1817204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He request.partialResult.collectedResult.append( 1818204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He result->result); 1819204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He request.partialResult.collectedResult.erase( 1820204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He ANDROID_QUIRKS_PARTIAL_RESULT); 1821204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 1822204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 1823204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 1824204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (isPartialResult) { 1825fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Fire off a 3A-only result if possible 1826204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (!request.partialResult.haveSent3A) { 1827204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He request.partialResult.haveSent3A = 1828204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He processPartial3AResult(frameNumber, 1829204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He request.partialResult.collectedResult, 1830cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei request.resultExtras); 1831fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1832fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1833fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1834fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 183542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala timestamp = request.captureTimestamp; 1836cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei resultExtras = request.resultExtras; 1837c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He hasInputBufferInRequest = request.hasInputBuffer; 1838cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 18391d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He /** 1840fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * One of the following must happen before it's legal to call process_capture_result, 1841fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * unless partial metadata is being provided: 18421d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He * - CAMERA3_MSG_SHUTTER (expected during normal operation) 18431d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He * - CAMERA3_MSG_ERROR (expected during flush) 18441d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He */ 1845204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (request.requestStatus == OK && timestamp == 0 && !isPartialResult) { 184642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Called before shutter notify for frame %d", 184742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 184842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return; 184942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 185042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 1851fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Did we get the (final) result metadata for this capture? 1852204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (result->result != NULL && !isPartialResult) { 185342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (request.haveResultMetadata) { 185442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Called multiple times with metadata for frame %d", 185542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 185642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return; 185742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 1858204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (mUsePartialResult && 1859204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He !request.partialResult.collectedResult.isEmpty()) { 1860204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He collectedPartialResult.acquire( 1861204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He request.partialResult.collectedResult); 1862fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 186342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala request.haveResultMetadata = true; 186442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 186542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 1866c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He uint32_t numBuffersReturned = result->num_output_buffers; 1867c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He if (result->input_buffer != NULL) { 1868c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He if (hasInputBufferInRequest) { 1869c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He numBuffersReturned += 1; 1870c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He } else { 1871c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He ALOGW("%s: Input buffer should be NULL if there is no input" 1872c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He " buffer sent in the request", 1873c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He __FUNCTION__); 1874c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He } 1875c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He } 1876c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He request.numBuffersLeft -= numBuffersReturned; 187742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (request.numBuffersLeft < 0) { 187842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Too many buffers returned for frame %d", 187942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 188042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return; 188142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 188242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 18831b05dfc8df5e741086747d076fc39c79fb4acb33Zhijun He // Check if everything has arrived for this result (buffers and metadata), remove it from 18841b05dfc8df5e741086747d076fc39c79fb4acb33Zhijun He // InFlightMap if both arrived or HAL reports error for this request (i.e. during flush). 18851b05dfc8df5e741086747d076fc39c79fb4acb33Zhijun He if ((request.requestStatus != OK) || 18861b05dfc8df5e741086747d076fc39c79fb4acb33Zhijun He (request.haveResultMetadata && request.numBuffersLeft == 0)) { 188717a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_ASYNC_END("frame capture", frameNumber); 188842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mInFlightMap.removeItemsAt(idx, 1); 188942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 189042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 189142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Sanity check - if we have too many in-flight frames, something has 189242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // likely gone wrong 189342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (mInFlightMap.size() > kInFlightWarnLimit) { 1894e5729fac81c8a984e984fefc90afc64135817d4fColin Cross CLOGE("In-flight list too large: %zu", mInFlightMap.size()); 189542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 189642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 189742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 189842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 189942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Process the result metadata, if provided 1900fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool gotResult = false; 1901204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (result->result != NULL && !isPartialResult) { 19027d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 19037d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 1904fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotResult = true; 1905fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 19063c76fa3e73374dfe7bb93e1b03fed30749e1e4b9Jianing Wei // TODO: need to track errors for tighter bounds on expected frame number 19073c76fa3e73374dfe7bb93e1b03fed30749e1e4b9Jianing Wei if (frameNumber < mNextResultFrameNumber) { 190842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Out-of-order capture result metadata submitted! " 190942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala "(got frame number %d, expecting %d)", 191042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber, mNextResultFrameNumber); 191142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return; 191242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 19133c76fa3e73374dfe7bb93e1b03fed30749e1e4b9Jianing Wei mNextResultFrameNumber = frameNumber + 1; 191442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 1915cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResult captureResult; 1916cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei captureResult.mResultExtras = resultExtras; 1917cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei captureResult.mMetadata = result->result; 1918fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1919cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (captureResult.mMetadata.update(ANDROID_REQUEST_FRAME_COUNT, 1920cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei (int32_t*)&frameNumber, 1) != OK) { 1921b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR("Failed to set frame# in metadata (%d)", 192242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 1923fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotResult = false; 1924d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin } else { 1925d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin ALOGVV("%s: Camera %d: Set frame# in metadata (%d)", 192642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala __FUNCTION__, mId, frameNumber); 1927d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin } 19287d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 1929fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Append any previous partials to form a complete result 1930204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (mUsePartialResult && !collectedPartialResult.isEmpty()) { 1931204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He captureResult.mMetadata.append(collectedPartialResult); 1932fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1933fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1934cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei captureResult.mMetadata.sort(); 1935fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 193642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Check that there's a timestamp in the result metadata 19377d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 19387d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala camera_metadata_entry entry = 1939cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei captureResult.mMetadata.find(ANDROID_SENSOR_TIMESTAMP); 19407d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (entry.count == 0) { 1941b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR("No timestamp provided by HAL for frame %d!", 194242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 1943fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotResult = false; 1944fe7e0c6154309f2491463ee6ca4920d225289638Alex Ray } else if (timestamp != entry.data.i64[0]) { 194542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Timestamp mismatch between shutter notify and result" 1946e5729fac81c8a984e984fefc90afc64135817d4fColin Cross " metadata for frame %d (%" PRId64 " vs %" PRId64 " respectively)", 194742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber, timestamp, entry.data.i64[0]); 1948fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotResult = false; 1949fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1950fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1951fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (gotResult) { 1952fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Valid result, insert into queue 1953cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei List<CaptureResult>::iterator queuedResult = 1954cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei mResultQueue.insert(mResultQueue.end(), CaptureResult(captureResult)); 1955cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGVV("%s: result requestId = %" PRId32 ", frameNumber = %" PRId64 1956cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ", burstId = %" PRId32, __FUNCTION__, 1957cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei queuedResult->mResultExtras.requestId, 1958cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei queuedResult->mResultExtras.frameNumber, 1959cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei queuedResult->mResultExtras.burstId); 19607d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 19617d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } // scope for mOutputLock 19627d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 196342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Return completed buffers to their streams with the timestamp 196442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 19657d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala for (size_t i = 0; i < result->num_output_buffers; i++) { 19667d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Camera3Stream *stream = 19677d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Camera3Stream::cast(result->output_buffers[i].stream); 19687d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala res = stream->returnBuffer(result->output_buffers[i], timestamp); 19697d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // Note: stream may be deallocated at this point, if this buffer was the 19707d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // last reference to it. 19717d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (res != OK) { 1972e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGE("Can't return buffer %zu for frame %d to its stream: " 197342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala " %s (%d)", i, frameNumber, strerror(-res), res); 19747d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 19757d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 19767d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 1977f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He if (result->input_buffer != NULL) { 1978c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He if (hasInputBufferInRequest) { 1979c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He Camera3Stream *stream = 1980c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He Camera3Stream::cast(result->input_buffer->stream); 1981c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He res = stream->returnInputBuffer(*(result->input_buffer)); 1982c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He // Note: stream may be deallocated at this point, if this buffer was the 1983c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He // last reference to it. 1984c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He if (res != OK) { 1985c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He ALOGE("%s: RequestThread: Can't return input buffer for frame %d to" 1986c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He " its stream:%s (%d)", __FUNCTION__, 1987c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He frameNumber, strerror(-res), res); 19880ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He } 19890ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He } else { 19900ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He ALOGW("%s: Input buffer should be NULL if there is no input" 19910ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He " buffer sent in the request, skipping input buffer return.", 19920ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He __FUNCTION__); 1993f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He } 1994f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He } 1995f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He 199646910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala // Finally, signal any waiters for new frames 199742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 1998fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (gotResult) { 19994345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin mResultSignal.signal(); 20004345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin } 20014345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin 20027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 20037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 20047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::notify(const camera3_notify_msg *msg) { 200517a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_CALL(); 20067d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala NotificationListener *listener; 20077d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala { 20087d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 20097d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala listener = mListener; 20107d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 20117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 20127d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (msg == NULL) { 201342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("HAL sent NULL notify message!"); 20147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return; 20157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 20167d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 20177d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala switch (msg->type) { 20187d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala case CAMERA3_MSG_ERROR: { 20197d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala int streamId = 0; 20207d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (msg->message.error.error_stream != NULL) { 20217d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Camera3Stream *stream = 20227d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Camera3Stream::cast( 20237d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala msg->message.error.error_stream); 20247d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala streamId = stream->getId(); 20257d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 202617a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ALOGV("Camera %d: %s: HAL error, frame %d, stream %d: %d", 202717a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala mId, __FUNCTION__, msg->message.error.frame_number, 202817a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala streamId, msg->message.error.error_code); 20291d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He 2030cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResultExtras resultExtras; 20311d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He // Set request error status for the request in the in-flight tracking 20321d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He { 20331d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He Mutex::Autolock l(mInFlightLock); 20341d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He ssize_t idx = mInFlightMap.indexOfKey(msg->message.error.frame_number); 20351d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He if (idx >= 0) { 2036cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei InFlightRequest &r = mInFlightMap.editValueAt(idx); 2037cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei r.requestStatus = msg->message.error.error_code; 2038cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei resultExtras = r.resultExtras; 2039cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } else { 2040cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei resultExtras.frameNumber = msg->message.error.frame_number; 2041cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGE("Camera %d: %s: cannot find in-flight request on frame %" PRId64 2042cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei " error", mId, __FUNCTION__, resultExtras.frameNumber); 20431d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He } 20441d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He } 20451d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He 204642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (listener != NULL) { 2047cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (msg->message.error.error_code == CAMERA3_MSG_ERROR_DEVICE) { 2048cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei listener->notifyError(ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE, 2049cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei resultExtras); 2050cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 2051cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } else { 2052cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGE("Camera %d: %s: no listener available", mId, __FUNCTION__); 205342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 20547d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala break; 20557d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 20567d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala case CAMERA3_MSG_SHUTTER: { 205742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ssize_t idx; 205842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t frameNumber = msg->message.shutter.frame_number; 205942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala nsecs_t timestamp = msg->message.shutter.timestamp; 206042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Verify ordering of shutter notifications 206142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala { 206242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex::Autolock l(mOutputLock); 20633c76fa3e73374dfe7bb93e1b03fed30749e1e4b9Jianing Wei // TODO: need to track errors for tighter bounds on expected frame number. 20643c76fa3e73374dfe7bb93e1b03fed30749e1e4b9Jianing Wei if (frameNumber < mNextShutterFrameNumber) { 206542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Shutter notification out-of-order. Expected " 206642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala "notification for frame %d, got frame %d", 206742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mNextShutterFrameNumber, frameNumber); 206842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala break; 206942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 20703c76fa3e73374dfe7bb93e1b03fed30749e1e4b9Jianing Wei mNextShutterFrameNumber = frameNumber + 1; 207142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 207242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 2073cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResultExtras resultExtras; 2074f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 207542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Set timestamp for the request in the in-flight tracking 2076f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // and get the request ID to send upstream 207742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala { 207842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex::Autolock l(mInFlightLock); 207942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala idx = mInFlightMap.indexOfKey(frameNumber); 208042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (idx >= 0) { 2081f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala InFlightRequest &r = mInFlightMap.editValueAt(idx); 2082f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala r.captureTimestamp = timestamp; 2083cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei resultExtras = r.resultExtras; 208442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 208542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 208642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (idx < 0) { 208742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Shutter notification for non-existent frame number %d", 208842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 208942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala break; 209042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 2091e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGVV("Camera %d: %s: Shutter fired for frame %d (id %d) at %" PRId64, 2092cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei mId, __FUNCTION__, frameNumber, resultExtras.requestId, timestamp); 209342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Call listener, if any 209442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (listener != NULL) { 2095cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei listener->notifyShutter(resultExtras, timestamp); 209642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 20977d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala break; 20987d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 20997d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala default: 210042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Unknown notify message from HAL: %d", 2101b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala msg->type); 21027d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 21037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 21047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2105f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville TalvalaCameraMetadata Camera3Device::getLatestRequestLocked() { 21061e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin ALOGV("%s", __FUNCTION__); 21071e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 21081e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin CameraMetadata retVal; 21091e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 21101e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin if (mRequestThread != NULL) { 21111e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin retVal = mRequestThread->getLatestRequest(); 21121e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin } 21131e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 21141e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin return retVal; 21151e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin} 21161e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 2117cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 21187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/** 2119f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * RequestThread inner class methods 2120f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 2121f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2122f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville TalvalaCamera3Device::RequestThread::RequestThread(wp<Camera3Device> parent, 2123f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker, 2124f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *hal3Device) : 2125f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Thread(false), 2126f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mParent(parent), 2127f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker(statusTracker), 2128f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device(hal3Device), 212942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mId(getId(parent)), 2130f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mReconfigured(false), 2131f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDoPause(false), 2132f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused(true), 21334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mFrameNumber(0), 2134cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei mLatestRequestId(NAME_NOT_FOUND), 21352d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei mRepeatingLastFrameNumber(NO_IN_FLIGHT_REPEATING_FRAMES) { 2136f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusId = statusTracker->addComponent(); 2137f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2138f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2139f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::configurationComplete() { 2140f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 2141f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mReconfigured = true; 2142f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2143f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 214490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::RequestThread::queueRequestList( 21452d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei List<sp<CaptureRequest> > &requests, 21462d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 21472d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber) { 214890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei Mutex::Autolock l(mRequestLock); 214990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei for (List<sp<CaptureRequest> >::iterator it = requests.begin(); it != requests.end(); 215090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ++it) { 215190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei mRequestQueue.push_back(*it); 215290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 215390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 21542d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (lastFrameNumber != NULL) { 21552d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber = mFrameNumber + mRequestQueue.size() - 1; 21562d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGV("%s: requestId %d, mFrameNumber %" PRId32 ", lastFrameNumber %" PRId64 ".", 21572d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei __FUNCTION__, (*(requests.begin()))->mResultExtras.requestId, mFrameNumber, 21582d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber); 21592d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 2160cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 216190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei unpauseForNewRequests(); 216290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 216390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return OK; 216490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 216590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 21664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 21674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTrigger( 21684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[], 21694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin size_t count) { 21704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 21714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock l(mTriggerMutex); 21724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t ret; 21734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 21744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < count; ++i) { 21754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ret = queueTriggerLocked(trigger[i]); 21764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 21774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (ret != OK) { 21784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return ret; 21794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 21804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 21814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 21824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 21834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 21844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 218542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvalaint Camera3Device::RequestThread::getId(const wp<Camera3Device> &device) { 218642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala sp<Camera3Device> d = device.promote(); 218742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (d != NULL) return d->mId; 218842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return 0; 218942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala} 219042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 21914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTriggerLocked( 21924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger) { 21934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 21944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t tag = trigger.metadataTag; 21954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ssize_t index = mTriggerMap.indexOfKey(tag); 21964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 21974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin switch (trigger.getTagType()) { 21984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_BYTE: 21994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // fall-through 22004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_INT32: 22014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 22024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin default: 220342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ALOGE("%s: Type not supported: 0x%x", __FUNCTION__, 220442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala trigger.getTagType()); 22054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return INVALID_OPERATION; 22064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 22074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 22084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 22094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Collect only the latest trigger, since we only have 1 field 22104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * in the request settings per trigger tag, and can't send more than 1 22114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * trigger per request. 22124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 22134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (index != NAME_NOT_FOUND) { 22144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerMap.editValueAt(index) = trigger; 22154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } else { 22164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerMap.add(tag, trigger); 22174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 22184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 22194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 22204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 22214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2222f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::setRepeatingRequests( 22232d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei const RequestList &requests, 22242d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 22252d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber) { 2226f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 22272d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (lastFrameNumber != NULL) { 22282d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber = mRepeatingLastFrameNumber; 22292d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 2230f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRepeatingRequests.clear(); 2231f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRepeatingRequests.insert(mRepeatingRequests.begin(), 2232f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala requests.begin(), requests.end()); 223326fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala 223426fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala unpauseForNewRequests(); 223526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala 22362d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei mRepeatingLastFrameNumber = NO_IN_FLIGHT_REPEATING_FRAMES; 2237f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 2238f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2239f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 22408684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yehbool Camera3Device::RequestThread::isRepeatingRequestLocked(const sp<CaptureRequest> requestIn) { 22418684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh if (mRepeatingRequests.empty()) { 22428684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh return false; 22438684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh } 22448684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh int32_t requestId = requestIn->mResultExtras.requestId; 22458684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh const RequestList &repeatRequests = mRepeatingRequests; 22468684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh // All repeating requests are guaranteed to have same id so only check first quest 22478684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh const sp<CaptureRequest> firstRequest = *repeatRequests.begin(); 22488684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh return (firstRequest->mResultExtras.requestId == requestId); 22498684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh} 22508684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh 22512d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Weistatus_t Camera3Device::RequestThread::clearRepeatingRequests(/*out*/int64_t *lastFrameNumber) { 2252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 2253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRepeatingRequests.clear(); 22542d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (lastFrameNumber != NULL) { 22552d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber = mRepeatingLastFrameNumber; 22562d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 22572d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei mRepeatingLastFrameNumber = NO_IN_FLIGHT_REPEATING_FRAMES; 2258f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 2259f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2260f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 22612d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Weistatus_t Camera3Device::RequestThread::clear(/*out*/int64_t *lastFrameNumber) { 2262abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala Mutex::Autolock l(mRequestLock); 22632d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGV("RequestThread::%s:", __FUNCTION__); 2264abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala mRepeatingRequests.clear(); 22658684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh 22668684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh // Decrement repeating frame count for those requests never sent to device 22678684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh // TODO: Remove this after we have proper error handling so these requests 22688684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh // will generate an error callback. This might be the only place calling 22698684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh // isRepeatingRequestLocked. If so, isRepeatingRequestLocked should also be removed. 22708684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh const RequestList &requests = mRequestQueue; 22718684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh for (RequestList::const_iterator it = requests.begin(); 22728684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh it != requests.end(); ++it) { 22738684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh if (isRepeatingRequestLocked(*it)) { 22748684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh mRepeatingLastFrameNumber--; 22758684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh } 22768684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh } 2277abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala mRequestQueue.clear(); 2278abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala mTriggerMap.clear(); 22792d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (lastFrameNumber != NULL) { 22802d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber = mRepeatingLastFrameNumber; 22812d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 22822d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei mRepeatingLastFrameNumber = NO_IN_FLIGHT_REPEATING_FRAMES; 2283abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala return OK; 2284abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala} 2285abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 2286f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::setPaused(bool paused) { 2287f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mPauseLock); 2288f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDoPause = paused; 2289f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDoPauseSignal.signal(); 2290f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2291f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 22924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::waitUntilRequestProcessed( 22934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t requestId, nsecs_t timeout) { 22944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock l(mLatestRequestMutex); 22954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res; 22964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin while (mLatestRequestId != requestId) { 22974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin nsecs_t startTime = systemTime(); 22984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 22994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = mLatestRequestSignal.waitRelative(mLatestRequestMutex, timeout); 23004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) return res; 23014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 23024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin timeout -= (systemTime() - startTime); 23034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 23044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 23054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 23064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 23074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2308f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid Camera3Device::RequestThread::requestExit() { 2309f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Call parent to set up shutdown 2310f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Thread::requestExit(); 2311f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // The exit from any possible waits 2312f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mDoPauseSignal.signal(); 2313f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestSignal.signal(); 2314f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 23154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2316f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::threadLoop() { 2317f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2318f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 2319f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2320f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Handle paused state. 2321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (waitIfPaused()) { 2322f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 2323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Get work to do 2326f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2327f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> nextRequest = waitForNextRequest(); 2328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (nextRequest == NULL) { 2329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 2330f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2331f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2332f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Create request to HAL 2333f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_capture_request_t request = camera3_capture_request_t(); 23342d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei request.frame_number = nextRequest->mResultExtras.frameNumber; 23354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Vector<camera3_stream_buffer_t> outputBuffers; 2336f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2337f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Get the request ID, if any 2338f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala int requestId; 2339f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala camera_metadata_entry_t requestIdEntry = 2340f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala nextRequest->mSettings.find(ANDROID_REQUEST_ID); 2341f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (requestIdEntry.count > 0) { 2342f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala requestId = requestIdEntry.data.i32[0]; 2343f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } else { 2344f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGW("%s: Did not have android.request.id set in the request", 2345f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala __FUNCTION__); 2346f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala requestId = NAME_NOT_FOUND; 2347f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 2348f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 23494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Insert any queued triggers (before metadata is locked) 23504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t triggerCount; 23514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = insertTriggers(nextRequest); 23524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res < 0) { 2353b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR("RequestThread: Unable to insert triggers " 2354b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala "(capture request %d, HAL device: %s (%d)", 23552d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei request.frame_number, strerror(-res), res); 23564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin cleanUpFailedRequest(request, nextRequest, outputBuffers); 23574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return false; 23584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 23594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin triggerCount = res; 23604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 23614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin bool triggersMixedIn = (triggerCount > 0 || mPrevTriggers > 0); 23624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 23634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // If the request is the same as last, or we had triggers last time 23644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (mPrevRequest != nextRequest || triggersMixedIn) { 23654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 23662f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala * HAL workaround: 23672f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala * Insert a dummy trigger ID if a trigger is set but no trigger ID is 23682f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala */ 23692f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala res = addDummyTriggerIds(nextRequest); 23702f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (res != OK) { 23712f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala SET_ERR("RequestThread: Unable to insert dummy trigger IDs " 23722f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala "(capture request %d, HAL device: %s (%d)", 23732d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei request.frame_number, strerror(-res), res); 23742f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 23752f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala return false; 23762f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala } 23772f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 23782f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala /** 23794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * The request should be presorted so accesses in HAL 23804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * are O(logn). Sidenote, sorting a sorted metadata is nop. 23814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 23824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin nextRequest->mSettings.sort(); 2383f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.settings = nextRequest->mSettings.getAndLock(); 2384f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPrevRequest = nextRequest; 23854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGVV("%s: Request settings are NEW", __FUNCTION__); 23864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 23874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin IF_ALOGV() { 23884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin camera_metadata_ro_entry_t e = camera_metadata_ro_entry_t(); 23894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin find_camera_metadata_ro_entry( 23904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin request.settings, 23914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER, 23924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &e 23934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ); 23944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (e.count > 0) { 23954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Request (frame num %d) had AF trigger 0x%x", 23964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, 23972d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei request.frame_number, 23984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin e.data.u8[0]); 23994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 24004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 24014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } else { 24024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // leave request.settings NULL to indicate 'reuse latest given' 24034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGVV("%s: Request settings are REUSED", 24044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__); 24054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 2406f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2407f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_buffer_t inputBuffer; 2408f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He uint32_t totalNumBuffers = 0; 2409f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2410f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Fill in buffers 2411f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2412f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (nextRequest->mInputStream != NULL) { 2413f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.input_buffer = &inputBuffer; 24145a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin res = nextRequest->mInputStream->getInputBuffer(&inputBuffer); 2415f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 241607d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala ALOGE("RequestThread: Can't get input buffer, skipping request:" 2417f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala " %s (%d)", strerror(-res), res); 2418f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 2419f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 2420f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2421f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He totalNumBuffers += 1; 2422f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 2423f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.input_buffer = NULL; 2424f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2425f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2426f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputBuffers.insertAt(camera3_stream_buffer_t(), 0, 2427f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mOutputStreams.size()); 2428f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.output_buffers = outputBuffers.array(); 2429f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < nextRequest->mOutputStreams.size(); i++) { 2430f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = nextRequest->mOutputStreams.editItemAt(i)-> 2431f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala getBuffer(&outputBuffers.editItemAt(i)); 2432f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 243307d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala ALOGE("RequestThread: Can't get output buffer, skipping request:" 243407d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala " %s (%d)", strerror(-res), res); 2435f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 2436f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 2437f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2438f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.num_output_buffers++; 2439f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2440f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He totalNumBuffers += request.num_output_buffers; 2441f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 244242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Log request in the in-flight queue 244342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala sp<Camera3Device> parent = mParent.promote(); 244442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (parent == NULL) { 244542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala CLOGE("RequestThread: Parent is gone"); 244642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 244742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return false; 244842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 244942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 2450cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei res = parent->registerInFlight(request.frame_number, 2451c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He totalNumBuffers, nextRequest->mResultExtras, 2452c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He /*hasInput*/request.input_buffer != NULL); 24532d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGVV("%s: registered in flight requestId = %" PRId32 ", frameNumber = %" PRId64 24542d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ", burstId = %" PRId32 ".", 2455cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei __FUNCTION__, 2456cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei nextRequest->mResultExtras.requestId, nextRequest->mResultExtras.frameNumber, 2457cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei nextRequest->mResultExtras.burstId); 245842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (res != OK) { 245942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("RequestThread: Unable to register new in-flight request:" 246042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala " %s (%d)", strerror(-res), res); 246142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 246242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return false; 246342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 24644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2465cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He // Inform waitUntilRequestProcessed thread of a new request ID 2466cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He { 2467cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He Mutex::Autolock al(mLatestRequestMutex); 2468cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He 2469cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He mLatestRequestId = requestId; 2470cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He mLatestRequestSignal.signal(); 2471cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He } 2472cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He 2473f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Submit request and block until ready for next one 247417a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_ASYNC_BEGIN("frame capture", request.frame_number); 247517a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->process_capture_request"); 2476f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mHal3Device->ops->process_capture_request(mHal3Device, &request); 247717a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 247817a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala 2479f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 2480b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR("RequestThread: Unable to submit capture request %d to HAL" 2481f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala " device: %s (%d)", request.frame_number, strerror(-res), res); 2482f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 2483f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return false; 2484f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2485f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 24861e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin // Update the latest request sent to HAL 24871e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin if (request.settings != NULL) { // Don't update them if they were unchanged 24881e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin Mutex::Autolock al(mLatestRequestMutex); 24891e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 24901e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin camera_metadata_t* cloned = clone_camera_metadata(request.settings); 24911e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin mLatestRequest.acquire(cloned); 24921e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin } 24931e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 2494f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (request.settings != NULL) { 2495f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mSettings.unlock(request.settings); 2496f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 24974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 24984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Remove any previously queued triggers (after unlock) 24994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = removeTriggers(mPrevRequest); 25004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 2501b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR("RequestThread: Unable to remove triggers " 25024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin "(capture request %d, HAL device: %s (%d)", 25034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin request.frame_number, strerror(-res), res); 25044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return false; 25054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 25064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mPrevTriggers = triggerCount; 25074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2508f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 2509f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2510f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 25111e479c0f4cb3e2174dde0b02e5656fb658f73495Igor MurashkinCameraMetadata Camera3Device::RequestThread::getLatestRequest() const { 25121e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin Mutex::Autolock al(mLatestRequestMutex); 25131e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 25141e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin ALOGV("RequestThread::%s", __FUNCTION__); 25151e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 25161e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin return mLatestRequest; 25171e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin} 25181e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 2519cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 2520f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::cleanUpFailedRequest( 2521f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_capture_request_t &request, 2522f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> &nextRequest, 2523f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<camera3_stream_buffer_t> &outputBuffers) { 2524f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2525f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (request.settings != NULL) { 2526f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mSettings.unlock(request.settings); 2527f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2528f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (request.input_buffer != NULL) { 2529f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.input_buffer->status = CAMERA3_BUFFER_STATUS_ERROR; 25305a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin nextRequest->mInputStream->returnInputBuffer(*(request.input_buffer)); 2531f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2532f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < request.num_output_buffers; i++) { 2533f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputBuffers.editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR; 2534f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mOutputStreams.editItemAt(i)->returnBuffer( 2535f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputBuffers[i], 0); 2536f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2537f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2538f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2539f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> 2540f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Camera3Device::RequestThread::waitForNextRequest() { 2541f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 2542f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> nextRequest; 2543f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2544f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Optimized a bit for the simple steady-state case (single repeating 2545f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // request), to avoid putting that request in the queue temporarily. 2546f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 2547f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2548f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala while (mRequestQueue.empty()) { 2549f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (!mRepeatingRequests.empty()) { 2550f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Always atomically enqueue all requests in a repeating request 2551f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // list. Guarantees a complete in-sequence set of captures to 2552f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // application. 2553f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const RequestList &requests = mRepeatingRequests; 2554f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList::const_iterator firstRequest = 2555f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala requests.begin(); 2556f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest = *firstRequest; 2557f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestQueue.insert(mRequestQueue.end(), 2558f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ++firstRequest, 2559f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala requests.end()); 2560f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // No need to wait any longer 2561cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 25622d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei mRepeatingLastFrameNumber = mFrameNumber + requests.size() - 1; 2563cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 2564f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 2565f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2566f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2567f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mRequestSignal.waitRelative(mRequestLock, kRequestTimeout); 2568f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2569f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if ((mRequestQueue.empty() && mRepeatingRequests.empty()) || 2570f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala exitPending()) { 2571f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock pl(mPauseLock); 2572f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mPaused == false) { 2573f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: RequestThread: Going idle", __FUNCTION__); 2574f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused = true; 2575f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Let the tracker know 2576f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 2577f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 2578f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE); 2579f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 2580f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2581f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Stop waiting for now and let thread management happen 2582f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 2583f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2584f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2585f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2586f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (nextRequest == NULL) { 2587f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Don't have a repeating request already in hand, so queue 2588f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // must have an entry now. 2589f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList::iterator firstRequest = 2590f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestQueue.begin(); 2591f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest = *firstRequest; 2592f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestQueue.erase(firstRequest); 2593f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2594f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 259526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // In case we've been unpaused by setPaused clearing mDoPause, need to 259626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // update internal pause state (capture/setRepeatingRequest unpause 259726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // directly). 2598f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock pl(mPauseLock); 2599f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mPaused) { 2600f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: RequestThread: Unpaused", __FUNCTION__); 2601f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 2602f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 2603f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->markComponentActive(mStatusId); 2604f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 2605f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 2606f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused = false; 2607f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2608f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Check if we've reconfigured since last time, and reset the preview 2609f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // request if so. Can't use 'NULL request == repeat' across configure calls. 2610f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mReconfigured) { 2611f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPrevRequest.clear(); 2612f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mReconfigured = false; 2613f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2614f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 26152d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (nextRequest != NULL) { 26162d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei nextRequest->mResultExtras.frameNumber = mFrameNumber++; 26172d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 2618f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return nextRequest; 2619f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2620f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2621f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::waitIfPaused() { 2622f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 2623f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mPauseLock); 2624f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala while (mDoPause) { 2625f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mPaused == false) { 2626f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused = true; 2627f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: RequestThread: Paused", __FUNCTION__); 2628f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Let the tracker know 2629f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 2630f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 2631f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE); 2632f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 2633f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2634f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 2635f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mDoPauseSignal.waitRelative(mPauseLock, kRequestTimeout); 2636f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res == TIMED_OUT || exitPending()) { 2637f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 2638f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2639f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2640f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // We don't set mPaused to false here, because waitForNextRequest needs 2641f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // to further manage the paused state in case of starvation. 2642f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return false; 2643f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2644f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 264526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvalavoid Camera3Device::RequestThread::unpauseForNewRequests() { 264626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // With work to do, mark thread as unpaused. 264726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // If paused by request (setPaused), don't resume, to avoid 264826fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // extra signaling/waiting overhead to waitUntilPaused 2649f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestSignal.signal(); 265026fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala Mutex::Autolock p(mPauseLock); 265126fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala if (!mDoPause) { 2652f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: RequestThread: Going active", __FUNCTION__); 2653f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mPaused) { 2654f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 2655f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 2656f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->markComponentActive(mStatusId); 2657f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 2658f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 265926fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala mPaused = false; 266026fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala } 266126fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala} 266226fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala 2663b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::RequestThread::setErrorState(const char *fmt, ...) { 2664b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala sp<Camera3Device> parent = mParent.promote(); 2665b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala if (parent != NULL) { 2666b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_list args; 2667b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_start(args, fmt); 2668b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 2669b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala parent->setErrorStateV(fmt, args); 2670b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 2671b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_end(args); 2672b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala } 2673b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 2674b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 26754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::insertTriggers( 26764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const sp<CaptureRequest> &request) { 26774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock al(mTriggerMutex); 26794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2680741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh sp<Camera3Device> parent = mParent.promote(); 2681741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh if (parent == NULL) { 2682741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh CLOGE("RequestThread: Parent is gone"); 2683741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh return DEAD_OBJECT; 2684741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 2685741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh 26864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin CameraMetadata &metadata = request->mSettings; 26874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin size_t count = mTriggerMap.size(); 26884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < count; ++i) { 26904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger = mTriggerMap.valueAt(i); 26914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t tag = trigger.metadataTag; 2692741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh 2693741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh if (tag == ANDROID_CONTROL_AF_TRIGGER_ID || tag == ANDROID_CONTROL_AE_PRECAPTURE_ID) { 2694741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh bool isAeTrigger = (trigger.metadataTag == ANDROID_CONTROL_AE_PRECAPTURE_ID); 2695741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh uint32_t triggerId = static_cast<uint32_t>(trigger.entryValue); 2696741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh isAeTrigger ? request->mResultExtras.precaptureTriggerId = triggerId : 2697741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh request->mResultExtras.afTriggerId = triggerId; 2698741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh if (parent->mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 2699741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh continue; // Trigger ID tag is deprecated since device HAL 3.2 2700741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 2701741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 2702741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh 27034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin camera_metadata_entry entry = metadata.find(tag); 27044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (entry.count > 0) { 27064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 27074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Already has an entry for this trigger in the request. 27084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Rewrite it with our requested trigger value. 27094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 27104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger oldTrigger = trigger; 27114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin oldTrigger.entryValue = entry.data.u8[0]; 27134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerReplacedMap.add(tag, oldTrigger); 27154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } else { 27164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 27174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * More typical, no trigger entry, so we just add it 27184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 27194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerRemovedMap.add(tag, trigger); 27204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 27214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res; 27234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin switch (trigger.getTagType()) { 27254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_BYTE: { 27264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue); 27274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 27284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &entryValue, 27294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 27304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 27314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 27324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_INT32: 27334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 27344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &trigger.entryValue, 27354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 27364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 27374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin default: 27384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Type not supported: 0x%x", 27394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, 27404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagType()); 27414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return INVALID_OPERATION; 27424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 27434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 27454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Failed to update request metadata with trigger tag %s" 27464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ", value %d", __FUNCTION__, trigger.getTagName(), 27474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.entryValue); 27484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return res; 27494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 27504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Mixed in trigger %s, value %d", __FUNCTION__, 27524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagName(), 27534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.entryValue); 27544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 27554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerMap.clear(); 27574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return count; 27594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 27604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::removeTriggers( 27624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const sp<CaptureRequest> &request) { 27634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock al(mTriggerMutex); 27644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin CameraMetadata &metadata = request->mSettings; 27664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 27684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Replace all old entries with their old values. 27694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 27704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < mTriggerReplacedMap.size(); ++i) { 27714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger = mTriggerReplacedMap.valueAt(i); 27724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res; 27744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t tag = trigger.metadataTag; 27764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin switch (trigger.getTagType()) { 27774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_BYTE: { 27784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue); 27794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 27804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &entryValue, 27814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 27824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 27834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 27844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_INT32: 27854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 27864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &trigger.entryValue, 27874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 27884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 27894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin default: 27904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Type not supported: 0x%x", 27914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, 27924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagType()); 27934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return INVALID_OPERATION; 27944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 27954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 27974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Failed to restore request metadata with trigger tag %s" 27984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ", trigger value %d", __FUNCTION__, 27994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagName(), trigger.entryValue); 28004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return res; 28014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 28024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 28034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerReplacedMap.clear(); 28044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 28054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 28064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Remove all new entries. 28074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 28084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < mTriggerRemovedMap.size(); ++i) { 28094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger = mTriggerRemovedMap.valueAt(i); 28104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res = metadata.erase(trigger.metadataTag); 28114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 28124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 28134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Failed to erase metadata with trigger tag %s" 28144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ", trigger value %d", __FUNCTION__, 28154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagName(), trigger.entryValue); 28164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return res; 28174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 28184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 28194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerRemovedMap.clear(); 28204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 28214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 28224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 28234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 28242f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvalastatus_t Camera3Device::RequestThread::addDummyTriggerIds( 28252f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala const sp<CaptureRequest> &request) { 28262f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // Trigger ID 0 has special meaning in the HAL2 spec, so avoid it here 28272f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala static const int32_t dummyTriggerId = 1; 28282f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala status_t res; 28292f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 28302f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala CameraMetadata &metadata = request->mSettings; 28312f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 28322f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // If AF trigger is active, insert a dummy AF trigger ID if none already 28332f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // exists 28342f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala camera_metadata_entry afTrigger = metadata.find(ANDROID_CONTROL_AF_TRIGGER); 28352f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala camera_metadata_entry afId = metadata.find(ANDROID_CONTROL_AF_TRIGGER_ID); 28362f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (afTrigger.count > 0 && 28372f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala afTrigger.data.u8[0] != ANDROID_CONTROL_AF_TRIGGER_IDLE && 28382f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala afId.count == 0) { 28392f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala res = metadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, &dummyTriggerId, 1); 28402f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (res != OK) return res; 28412f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala } 28422f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 28432f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // If AE precapture trigger is active, insert a dummy precapture trigger ID 28442f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // if none already exists 28452f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala camera_metadata_entry pcTrigger = 28462f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER); 28472f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala camera_metadata_entry pcId = metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_ID); 28482f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (pcTrigger.count > 0 && 28492f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala pcTrigger.data.u8[0] != ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE && 28502f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala pcId.count == 0) { 28512f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala res = metadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, 28522f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala &dummyTriggerId, 1); 28532f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (res != OK) return res; 28542f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala } 28552f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 28562f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala return OK; 28572f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala} 28584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 28594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2860f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 28617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Static callback forwarding methods from HAL to instance 28627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 28637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 28647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sProcessCaptureResult(const camera3_callback_ops *cb, 28657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_capture_result *result) { 28667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala Camera3Device *d = 28677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb)); 28687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala d->processCaptureResult(result); 28697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 28707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 28717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sNotify(const camera3_callback_ops *cb, 28727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_notify_msg *msg) { 28737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala Camera3Device *d = 28747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb)); 28757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala d->notify(msg); 28767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 28777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 28787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android 2879