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 46d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/camera2/ICameraDeviceUser.h> 47d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 48ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin#include "utils/CameraTraces.h" 49f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala#include "mediautils/SchedulingPolicyService.h" 507b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3Device.h" 517b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3OutputStream.h" 527b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3InputStream.h" 537b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3ZslStream.h" 5416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala#include "device3/Camera3DummyStream.h" 55f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala#include "CameraService.h" 567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 57f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalausing namespace android::camera3; 587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 59f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalanamespace android { 607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville TalvalaCamera3Device::Camera3Device(int id): 627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mId(id), 639a17941fa70e43119d2c3464bc00a3cd30b2bd14Eino-Ville Talvala mIsConstrainedHighSpeedConfiguration(false), 64f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device(NULL), 657d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mStatus(STATUS_UNINITIALIZED), 66183f056393423b344e73f388f21d30379a38e519Ruben Brunk mStatusWaiters(0), 67204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mUsePartialResult(false), 68204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mNumPartialResults(1), 69c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang mTimestampOffset(0), 7042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mNextResultFrameNumber(0), 71618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen mNextReprocessResultFrameNumber(0), 7242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mNextShutterFrameNumber(0), 733df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen mNextReprocessShutterFrameNumber(0), 747d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mListener(NULL) 757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{ 767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera3_callback_ops::notify = &sNotify; 787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera3_callback_ops::process_capture_result = &sProcessCaptureResult; 797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGV("%s: Created device for camera %d", __FUNCTION__, id); 807fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville TalvalaCamera3Device::~Camera3Device() 837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{ 847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGV("%s: Tearing down for camera id %d", __FUNCTION__, mId); 867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala disconnect(); 877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8971381051e2d048b2705c447b3d59db6e972493eeIgor Murashkinint Camera3Device::getId() const { 9071381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin return mId; 9171381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin} 9271381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin 93f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 94f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * CameraDeviceBase interface 95f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 96f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 97e074a93046ebe5cea0b55c3a479e082a426e1e07Yin-Chia Yehstatus_t Camera3Device::initialize(CameraModule *module) 987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{ 997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 100f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 101f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 102f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGV("%s: Initializing device for camera %d", __FUNCTION__, mId); 104f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mStatus != STATUS_UNINITIALIZED) { 105b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Already initialized!"); 1067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 1077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Open HAL device */ 1107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala status_t res; 1127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala String8 deviceName = String8::format("%d", mId); 1137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera3_device_t *device; 1157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 116213ce79e943a3b51d7859a184d8211c859c960a0Zhijun He ATRACE_BEGIN("camera3->open"); 117d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen res = module->open(deviceName.string(), 118d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen reinterpret_cast<hw_device_t**>(&device)); 119213ce79e943a3b51d7859a184d8211c859c960a0Zhijun He ATRACE_END(); 1207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) { 122b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Could not open camera: %s (%d)", strerror(-res), res); 1237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return res; 1247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Cross-check device version */ 12795dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He if (device->common.version < CAMERA_DEVICE_API_VERSION_3_0) { 128b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Could not open camera: " 12995dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He "Camera device should be at least %x, reports %x instead", 130b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CAMERA_DEVICE_API_VERSION_3_0, 1317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.version); 1327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 1337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return BAD_VALUE; 1347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera_info info; 137d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = module->getCameraInfo(mId, &info); 1387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) return res; 1397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (info.device_version != device->common.version) { 141b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("HAL reporting mismatched camera_info version (%x)" 142b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala " and device version (%x).", 14395dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He info.device_version, device->common.version); 1447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 1457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return BAD_VALUE; 1467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Initialize device with callback functions */ 1497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 15017a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->initialize"); 1517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = device->ops->initialize(device, this); 15217a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 15317a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala 1547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) { 155b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to initialize HAL device: %s (%d)", 156b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala strerror(-res), res); 1577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 1587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return BAD_VALUE; 1597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 161f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** Start up status tracker thread */ 162f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker = new StatusTracker(this); 163f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = mStatusTracker->run(String8::format("C3Dev-%d-Status", mId).string()); 164f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) { 165f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Unable to start status tracking thread: %s (%d)", 166f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala strerror(-res), res); 167f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala device->common.close(&device->common); 168f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker.clear(); 169f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 170f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 171f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 172125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He /** Create buffer manager */ 173125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He mBufferManager = new Camera3BufferManager(); 174125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 175ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen bool aeLockAvailable = false; 176ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen camera_metadata_ro_entry aeLockAvailableEntry; 177ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen res = find_camera_metadata_ro_entry(info.static_camera_characteristics, 178ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen ANDROID_CONTROL_AE_LOCK_AVAILABLE, &aeLockAvailableEntry); 179ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen if (res == OK && aeLockAvailableEntry.count > 0) { 180ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen aeLockAvailable = (aeLockAvailableEntry.data.u8[0] == 181ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE); 182ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen } 1837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 184ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen /** Start up request queue thread */ 185ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen mRequestThread = new RequestThread(this, mStatusTracker, device, aeLockAvailable); 186f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mRequestThread->run(String8::format("C3Dev-%d-ReqQueue", mId).string()); 1877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) { 188b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to start request queue thread: %s (%d)", 189b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala strerror(-res), res); 1907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 191f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread.clear(); 1927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return res; 1937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1954d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mPreparerThread = new PreparerThread(); 1964d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 1977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Everything is good to go */ 1987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 199cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh mDeviceVersion = device->common.version; 2007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mDeviceInfo = info.static_camera_characteristics; 2017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal3Device = device; 202183f056393423b344e73f388f21d30379a38e519Ruben Brunk 2034c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh // Determine whether we need to derive sensitivity boost values for older devices. 2044c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh // If post-RAW sensitivity boost range is listed, so should post-raw sensitivity control 2054c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh // be listed (as the default value 100) 2064c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh if (mDeviceVersion < CAMERA_DEVICE_API_VERSION_3_4 && 2074c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh mDeviceInfo.exists(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE)) { 2084c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh mDerivePostRawSensKey = true; 2094c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh } 2104c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh 211183f056393423b344e73f388f21d30379a38e519Ruben Brunk internalUpdateStatusLocked(STATUS_UNCONFIGURED); 212f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mNextStreamId = 0; 21316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala mDummyStreamId = NO_STREAM; 214ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala mNeedConfig = true; 215f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mPauseStateNotify = false; 2167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 217c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang // Measure the clock domain offset between camera and video/hw_composer 218c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang camera_metadata_entry timestampSource = 219c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang mDeviceInfo.find(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE); 220c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang if (timestampSource.count > 0 && timestampSource.data.u8[0] == 221c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME) { 222c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang mTimestampOffset = getMonoToBoottimeOffset(); 223c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang } 224c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang 225fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Will the HAL be sending in early partial result metadata? 226204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 227204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He camera_metadata_entry partialResultsCount = 228204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mDeviceInfo.find(ANDROID_REQUEST_PARTIAL_RESULT_COUNT); 229204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (partialResultsCount.count > 0) { 230204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mNumPartialResults = partialResultsCount.data.i32[0]; 231204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mUsePartialResult = (mNumPartialResults > 1); 232204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 233204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } else { 234204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He camera_metadata_entry partialResultsQuirk = 235204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mDeviceInfo.find(ANDROID_QUIRKS_USE_PARTIAL_RESULT); 236204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (partialResultsQuirk.count > 0 && partialResultsQuirk.data.u8[0] == 1) { 237204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mUsePartialResult = true; 238204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 239fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 240fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 241618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen camera_metadata_entry configs = 242618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen mDeviceInfo.find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS); 243618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen for (uint32_t i = 0; i < configs.count; i += 4) { 244618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen if (configs.data.i32[i] == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED && 245618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen configs.data.i32[i + 3] == 246618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT) { 247618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen mSupportedOpaqueInputSizes.add(Size(configs.data.i32[i + 1], 248618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen configs.data.i32[i + 2])); 249618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } 250618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } 251618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 2527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return OK; 2537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 2547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::disconnect() { 2567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 257f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 2587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 259f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 260f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 261214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala status_t res = OK; 262f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 263f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala { 264f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mLock); 265f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_UNINITIALIZED) return res; 266f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 267f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_ACTIVE || 268f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala (mStatus == STATUS_ERROR && mRequestThread != NULL)) { 269f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = mRequestThread->clearRepeatingRequests(); 270214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala if (res != OK) { 271f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't stop streaming"); 272214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala // Continue to close device even in case of error 273f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } else { 274f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout); 275f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) { 276f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Timeout waiting for HAL to drain"); 277f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Continue to close device even in case of error 278f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 279214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala } 280f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 281f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 282f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_ERROR) { 283f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala CLOGE("Shutting down in an error state"); 284f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 285f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 286f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatusTracker != NULL) { 287f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker->requestExit(); 288f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 289f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 290f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mRequestThread != NULL) { 291f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread->requestExit(); 292f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 293f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 294f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mOutputStreams.clear(); 295f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mInputStream.clear(); 296f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 297f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 298f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Joining done without holding mLock, otherwise deadlocks may ensue 299f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // as the threads try to access parent state 300f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mRequestThread != NULL && mStatus != STATUS_ERROR) { 301f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // HAL may be in a bad state, so waiting for request thread 302f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // (which may be stuck in the HAL processCaptureRequest call) 303f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // could be dangerous. 304f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread->join(); 305214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala } 306214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala 307f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatusTracker != NULL) { 308f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker->join(); 309f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 310f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 311efff1c4ba2bf195d97de2fd5718b708e4b942901Eino-Ville Talvala camera3_device_t *hal3Device; 312f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala { 313f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mLock); 314f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 315f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread.clear(); 316f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker.clear(); 317125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He mBufferManager.clear(); 318f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 319efff1c4ba2bf195d97de2fd5718b708e4b942901Eino-Ville Talvala hal3Device = mHal3Device; 320efff1c4ba2bf195d97de2fd5718b708e4b942901Eino-Ville Talvala } 321efff1c4ba2bf195d97de2fd5718b708e4b942901Eino-Ville Talvala 322efff1c4ba2bf195d97de2fd5718b708e4b942901Eino-Ville Talvala // Call close without internal mutex held, as the HAL close may need to 323efff1c4ba2bf195d97de2fd5718b708e4b942901Eino-Ville Talvala // wait on assorted callbacks,etc, to complete before it can return. 324efff1c4ba2bf195d97de2fd5718b708e4b942901Eino-Ville Talvala if (hal3Device != NULL) { 325efff1c4ba2bf195d97de2fd5718b708e4b942901Eino-Ville Talvala ATRACE_BEGIN("camera3->close"); 326efff1c4ba2bf195d97de2fd5718b708e4b942901Eino-Ville Talvala hal3Device->common.close(&hal3Device->common); 327efff1c4ba2bf195d97de2fd5718b708e4b942901Eino-Ville Talvala ATRACE_END(); 328efff1c4ba2bf195d97de2fd5718b708e4b942901Eino-Ville Talvala } 329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 330efff1c4ba2bf195d97de2fd5718b708e4b942901Eino-Ville Talvala { 331efff1c4ba2bf195d97de2fd5718b708e4b942901Eino-Ville Talvala Mutex::Autolock l(mLock); 332efff1c4ba2bf195d97de2fd5718b708e4b942901Eino-Ville Talvala mHal3Device = NULL; 333183f056393423b344e73f388f21d30379a38e519Ruben Brunk internalUpdateStatusLocked(STATUS_UNINITIALIZED); 334f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 335f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 336f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: X", __FUNCTION__); 337214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala return res; 3387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 3397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 340f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// For dumping/debugging only - 341f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// try to acquire a lock a few times, eventually give up to proceed with 342f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// debug/dump operations 343f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalabool Camera3Device::tryLockSpinRightRound(Mutex& lock) { 344f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool gotLock = false; 345f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala for (size_t i = 0; i < kDumpLockAttempts; ++i) { 346f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (lock.tryLock() == NO_ERROR) { 347f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala gotLock = true; 348f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala break; 349f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } else { 350f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala usleep(kDumpSleepDuration); 351f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 352f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 353f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return gotLock; 354f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 355f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 356cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehCamera3Device::Size Camera3Device::getMaxJpegResolution() const { 357f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He int32_t maxJpegWidth = 0, maxJpegHeight = 0; 358cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 359cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_CONFIGURATION_SIZE = 4; 360cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_FORMAT_OFFSET = 0; 361cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_WIDTH_OFFSET = 1; 362cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_HEIGHT_OFFSET = 2; 363cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_IS_INPUT_OFFSET = 3; 364cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry_t availableStreamConfigs = 365cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh mDeviceInfo.find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS); 366cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (availableStreamConfigs.count == 0 || 367cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh availableStreamConfigs.count % STREAM_CONFIGURATION_SIZE != 0) { 368cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return Size(0, 0); 369cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 370cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 371cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh // Get max jpeg size (area-wise). 372cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i=0; i < availableStreamConfigs.count; i+= STREAM_CONFIGURATION_SIZE) { 373cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t format = availableStreamConfigs.data.i32[i + STREAM_FORMAT_OFFSET]; 374cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t width = availableStreamConfigs.data.i32[i + STREAM_WIDTH_OFFSET]; 375cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t height = availableStreamConfigs.data.i32[i + STREAM_HEIGHT_OFFSET]; 376cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t isInput = availableStreamConfigs.data.i32[i + STREAM_IS_INPUT_OFFSET]; 377cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT 378cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh && format == HAL_PIXEL_FORMAT_BLOB && 379cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh (width * height > maxJpegWidth * maxJpegHeight)) { 380cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh maxJpegWidth = width; 381cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh maxJpegHeight = height; 382cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 383cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 384cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } else { 385cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry availableJpegSizes = 386cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh mDeviceInfo.find(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 387cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (availableJpegSizes.count == 0 || availableJpegSizes.count % 2 != 0) { 388cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return Size(0, 0); 389cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 390cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 391cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh // Get max jpeg size (area-wise). 392cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i = 0; i < availableJpegSizes.count; i += 2) { 393cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if ((availableJpegSizes.data.i32[i] * availableJpegSizes.data.i32[i + 1]) 394cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh > (maxJpegWidth * maxJpegHeight)) { 395cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh maxJpegWidth = availableJpegSizes.data.i32[i]; 396cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh maxJpegHeight = availableJpegSizes.data.i32[i + 1]; 397cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 398f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 399f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 400cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return Size(maxJpegWidth, maxJpegHeight); 401cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh} 402cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 403c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wangnsecs_t Camera3Device::getMonoToBoottimeOffset() { 404c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang // try three times to get the clock offset, choose the one 405c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang // with the minimum gap in measurements. 406c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang const int tries = 3; 407c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang nsecs_t bestGap, measured; 408c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang for (int i = 0; i < tries; ++i) { 409c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang const nsecs_t tmono = systemTime(SYSTEM_TIME_MONOTONIC); 410c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang const nsecs_t tbase = systemTime(SYSTEM_TIME_BOOTTIME); 411c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang const nsecs_t tmono2 = systemTime(SYSTEM_TIME_MONOTONIC); 412c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang const nsecs_t gap = tmono2 - tmono; 413c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang if (i == 0 || gap < bestGap) { 414c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang bestGap = gap; 415c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang measured = tbase - ((tmono + tmono2) >> 1); 416c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang } 417c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang } 418c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang return measured; 419c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang} 420c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang 4212cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala/** 4222cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala * Map Android N dataspace definitions back to Android M definitions, for 4232cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala * use with HALv3.3 or older. 4242cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala * 4252cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala * Only map where correspondences exist, and otherwise preserve the value. 4262cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala */ 4272cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvalaandroid_dataspace Camera3Device::mapToLegacyDataspace(android_dataspace dataSpace) { 4282cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala switch (dataSpace) { 4292cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala case HAL_DATASPACE_V0_SRGB_LINEAR: 4302cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala return HAL_DATASPACE_SRGB_LINEAR; 4312cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala case HAL_DATASPACE_V0_SRGB: 4322cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala return HAL_DATASPACE_SRGB; 4332cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala case HAL_DATASPACE_V0_JFIF: 4342cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala return HAL_DATASPACE_JFIF; 4352cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala case HAL_DATASPACE_V0_BT601_625: 4362cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala return HAL_DATASPACE_BT601_625; 4372cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala case HAL_DATASPACE_V0_BT601_525: 4382cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala return HAL_DATASPACE_BT601_525; 4392cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala case HAL_DATASPACE_V0_BT709: 4402cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala return HAL_DATASPACE_BT709; 4412cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala default: 4422cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala return dataSpace; 4432cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala } 4442cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala} 4452cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala 446cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yehssize_t Camera3Device::getJpegBufferSize(uint32_t width, uint32_t height) const { 447cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh // Get max jpeg size (area-wise). 448cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Size maxJpegResolution = getMaxJpegResolution(); 449cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (maxJpegResolution.width == 0) { 45095a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala ALOGE("%s: Camera %d: Can't find valid available jpeg sizes in static metadata!", 451cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh __FUNCTION__, mId); 452f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He return BAD_VALUE; 453f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 454f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 455f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He // Get max jpeg buffer size 456f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He ssize_t maxJpegBufferSize = 0; 457cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry jpegBufMaxSize = mDeviceInfo.find(ANDROID_JPEG_MAX_SIZE); 458cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (jpegBufMaxSize.count == 0) { 459f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He ALOGE("%s: Camera %d: Can't find maximum JPEG size in static metadata!", __FUNCTION__, mId); 460f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He return BAD_VALUE; 461f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 462cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh maxJpegBufferSize = jpegBufMaxSize.data.i32[0]; 4630c4e56d0baaa19fcf17234b38d634b7281e2ae37Yin-Chia Yeh assert(kMinJpegBufferSize < maxJpegBufferSize); 464f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 465f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He // Calculate final jpeg buffer size for the given resolution. 466cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh float scaleFactor = ((float) (width * height)) / 467cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh (maxJpegResolution.width * maxJpegResolution.height); 4680c4e56d0baaa19fcf17234b38d634b7281e2ae37Yin-Chia Yeh ssize_t jpegBufferSize = scaleFactor * (maxJpegBufferSize - kMinJpegBufferSize) + 4690c4e56d0baaa19fcf17234b38d634b7281e2ae37Yin-Chia Yeh kMinJpegBufferSize; 470f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He if (jpegBufferSize > maxJpegBufferSize) { 471f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He jpegBufferSize = maxJpegBufferSize; 472f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 473f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 474f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He return jpegBufferSize; 475f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He} 476f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 47795a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvalassize_t Camera3Device::getPointCloudBufferSize() const { 47895a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala const int FLOATS_PER_POINT=4; 47995a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala camera_metadata_ro_entry maxPointCount = mDeviceInfo.find(ANDROID_DEPTH_MAX_DEPTH_SAMPLES); 48095a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala if (maxPointCount.count == 0) { 48195a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala ALOGE("%s: Camera %d: Can't find maximum depth point cloud size in static metadata!", 48295a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala __FUNCTION__, mId); 48395a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala return BAD_VALUE; 48495a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala } 48595a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala ssize_t maxBytesForPointCloud = sizeof(android_depth_points) + 48695a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala maxPointCount.data.i32[0] * sizeof(float) * FLOATS_PER_POINT; 48795a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala return maxBytesForPointCloud; 48895a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala} 48995a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala 490d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalassize_t Camera3Device::getRawOpaqueBufferSize(int32_t width, int32_t height) const { 491e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh const int PER_CONFIGURATION_SIZE = 3; 492e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh const int WIDTH_OFFSET = 0; 493e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh const int HEIGHT_OFFSET = 1; 494e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh const int SIZE_OFFSET = 2; 495e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh camera_metadata_ro_entry rawOpaqueSizes = 496e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh mDeviceInfo.find(ANDROID_SENSOR_OPAQUE_RAW_SIZE); 497bc57b12030cbd4885d9231e721bbfed1b6522212Aurimas Liutikas size_t count = rawOpaqueSizes.count; 498e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh if (count == 0 || (count % PER_CONFIGURATION_SIZE)) { 49902bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala ALOGE("%s: Camera %d: bad opaque RAW size static metadata length(%zu)!", 500e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh __FUNCTION__, mId, count); 501e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh return BAD_VALUE; 502e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh } 50395a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala 504e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh for (size_t i = 0; i < count; i += PER_CONFIGURATION_SIZE) { 505e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh if (width == rawOpaqueSizes.data.i32[i + WIDTH_OFFSET] && 506e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh height == rawOpaqueSizes.data.i32[i + HEIGHT_OFFSET]) { 507e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh return rawOpaqueSizes.data.i32[i + SIZE_OFFSET]; 508e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh } 509e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh } 510e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh 511e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh ALOGE("%s: Camera %d: cannot find size for %dx%d opaque RAW image!", 512e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh __FUNCTION__, mId, width, height); 513e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh return BAD_VALUE; 514e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh} 51595a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala 5167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::dump(int fd, const Vector<String16> &args) { 5177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 5187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)args; 519f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 520f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Try to lock, but continue in case of failure (to avoid blocking in 521f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // deadlocks) 522f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool gotInterfaceLock = tryLockSpinRightRound(mInterfaceLock); 523f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool gotLock = tryLockSpinRightRound(mLock); 524f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 525f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGW_IF(!gotInterfaceLock, 526f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala "Camera %d: %s: Unable to lock interface lock, proceeding anyway", 527f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, __FUNCTION__); 528f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGW_IF(!gotLock, 529f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala "Camera %d: %s: Unable to lock main lock, proceeding anyway", 530f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, __FUNCTION__); 531f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 5327e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala bool dumpTemplates = false; 5337e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala String16 templatesOption("-t"); 5347e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala int n = args.size(); 5357e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala for (int i = 0; i < n; i++) { 5367e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala if (args[i] == templatesOption) { 5377e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala dumpTemplates = true; 5387e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala } 5397e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala } 5407e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala 541f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala String8 lines; 542f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 543f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const char *status = 544f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ERROR ? "ERROR" : 545f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_UNINITIALIZED ? "UNINITIALIZED" : 546f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus == STATUS_UNCONFIGURED ? "UNCONFIGURED" : 547f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus == STATUS_CONFIGURED ? "CONFIGURED" : 548f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ACTIVE ? "ACTIVE" : 549f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala "Unknown"; 550f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 551f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala lines.appendFormat(" Device status: %s\n", status); 552b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala if (mStatus == STATUS_ERROR) { 553b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala lines.appendFormat(" Error cause: %s\n", mErrorCause.string()); 554b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala } 555f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala lines.appendFormat(" Stream configuration:\n"); 5561fa8999c91d5df81949aa723000058380cd3faa2Zhijun He lines.appendFormat(" Operation mode: %s \n", mIsConstrainedHighSpeedConfiguration ? 5579a17941fa70e43119d2c3464bc00a3cd30b2bd14Eino-Ville Talvala "CONSTRAINED HIGH SPEED VIDEO" : "NORMAL"); 558f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 559f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream != NULL) { 560f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala write(fd, lines.string(), lines.size()); 561f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mInputStream->dump(fd, args); 562f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 563f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala lines.appendFormat(" No input stream.\n"); 564f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala write(fd, lines.string(), lines.size()); 565f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 566f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < mOutputStreams.size(); i++) { 567f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mOutputStreams[i]->dump(fd,args); 568f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 5697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 570431503c11ca9e069584f70b0eef8b858a4a43546Zhijun He if (mBufferManager != NULL) { 571431503c11ca9e069584f70b0eef8b858a4a43546Zhijun He lines = String8(" Camera3 Buffer Manager:\n"); 572431503c11ca9e069584f70b0eef8b858a4a43546Zhijun He write(fd, lines.string(), lines.size()); 573431503c11ca9e069584f70b0eef8b858a4a43546Zhijun He mBufferManager->dump(fd, args); 574431503c11ca9e069584f70b0eef8b858a4a43546Zhijun He } 575125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 57642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala lines = String8(" In-flight requests:\n"); 57742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (mInFlightMap.size() == 0) { 57842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala lines.append(" None\n"); 57942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } else { 58042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala for (size_t i = 0; i < mInFlightMap.size(); i++) { 58142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightRequest r = mInFlightMap.valueAt(i); 582e5729fac81c8a984e984fefc90afc64135817d4fColin Cross lines.appendFormat(" Frame %d | Timestamp: %" PRId64 ", metadata" 58342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala " arrived: %s, buffers left: %d\n", mInFlightMap.keyAt(i), 58443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen r.shutterTimestamp, r.haveResultMetadata ? "true" : "false", 58542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala r.numBuffersLeft); 58642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 58742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 58842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala write(fd, lines.string(), lines.size()); 58942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 5901e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin { 5911e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin lines = String8(" Last request sent:\n"); 5921e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin write(fd, lines.string(), lines.size()); 5931e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 594f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala CameraMetadata lastRequest = getLatestRequestLocked(); 5951e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin lastRequest.dump(fd, /*verbosity*/2, /*indentation*/6); 5961e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin } 5971e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 5987e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala if (dumpTemplates) { 5997e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala const char *templateNames[] = { 6007e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala "TEMPLATE_PREVIEW", 6017e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala "TEMPLATE_STILL_CAPTURE", 6027e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala "TEMPLATE_VIDEO_RECORD", 6037e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala "TEMPLATE_VIDEO_SNAPSHOT", 6047e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala "TEMPLATE_ZERO_SHUTTER_LAG", 6057e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala "TEMPLATE_MANUAL" 6067e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala }; 6077e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala 6087e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala for (int i = 1; i < CAMERA3_TEMPLATE_COUNT; i++) { 6097e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala const camera_metadata_t *templateRequest; 6107e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala templateRequest = 6117e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala mHal3Device->ops->construct_default_request_settings( 6127e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala mHal3Device, i); 6137e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala lines = String8::format(" HAL Request %s:\n", templateNames[i-1]); 6147e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala if (templateRequest == NULL) { 6157e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala lines.append(" Not supported\n"); 6167e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala write(fd, lines.string(), lines.size()); 6177e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala } else { 6187e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala write(fd, lines.string(), lines.size()); 6197e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala dump_indented_camera_metadata(templateRequest, 6207e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala fd, /*verbosity*/2, /*indentation*/8); 6217e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala } 6227e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala } 6237e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala } 6247e7a62dc6c20b5ff761b87d99379797aa3fd7d9dEino-Ville Talvala 625f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mHal3Device != NULL) { 62642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala lines = String8(" HAL device dump:\n"); 627f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala write(fd, lines.string(), lines.size()); 628f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device->ops->dump(mHal3Device, fd); 629f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 6307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 631f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (gotLock) mLock.unlock(); 632f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (gotInterfaceLock) mInterfaceLock.unlock(); 633f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 6347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return OK; 6357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 6367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaconst CameraMetadata& Camera3Device::info() const { 6387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGVV("%s: E", __FUNCTION__); 639f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (CC_UNLIKELY(mStatus == STATUS_UNINITIALIZED || 640f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ERROR)) { 641b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala ALOGW("%s: Access to static info %s!", __FUNCTION__, 642f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ERROR ? 643f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala "when in error state" : "before init"); 644f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 6457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return mDeviceInfo; 6467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 6477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 64890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::checkStatusOkToCaptureLocked() { 64990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei switch (mStatus) { 65090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_ERROR: 65190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("Device has encountered a serious error"); 65290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return INVALID_OPERATION; 65390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_UNINITIALIZED: 65490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("Device not initialized"); 65590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return INVALID_OPERATION; 65690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_UNCONFIGURED: 65790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_CONFIGURED: 65890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_ACTIVE: 65990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei // OK 66090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei break; 66190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei default: 66290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei SET_ERR_L("Unexpected status: %d", mStatus); 66390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return INVALID_OPERATION; 66490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 66590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return OK; 66690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 66790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 66890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::convertMetadataListToRequestListLocked( 66990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei const List<const CameraMetadata> &metadataList, RequestList *requestList) { 67090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (requestList == NULL) { 67190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("requestList cannot be NULL."); 67290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return BAD_VALUE; 67390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 67490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 675cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int32_t burstId = 0; 67690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei for (List<const CameraMetadata>::const_iterator it = metadataList.begin(); 67790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei it != metadataList.end(); ++it) { 67890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei sp<CaptureRequest> newRequest = setUpRequestLocked(*it); 67990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (newRequest == 0) { 68090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("Can't create capture request"); 68190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return BAD_VALUE; 68290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 683cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 684cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // Setup burst Id and request Id 685cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei newRequest->mResultExtras.burstId = burstId++; 686cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (it->exists(ANDROID_REQUEST_ID)) { 687cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (it->find(ANDROID_REQUEST_ID).count == 0) { 688cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CLOGE("RequestID entry exists; but must not be empty in metadata"); 689cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return BAD_VALUE; 690cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 691cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei newRequest->mResultExtras.requestId = it->find(ANDROID_REQUEST_ID).data.i32[0]; 692cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } else { 693cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CLOGE("RequestID does not exist in metadata"); 694cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return BAD_VALUE; 695cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 696cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 69790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei requestList->push_back(newRequest); 6982d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei 6992d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGV("%s: requestId = %" PRId32, __FUNCTION__, newRequest->mResultExtras.requestId); 70090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 70185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 70285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Setup batch size if this is a high speed video recording request. 70385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (mIsConstrainedHighSpeedConfiguration && requestList->size() > 0) { 70485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen auto firstRequest = requestList->begin(); 70585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen for (auto& outputStream : (*firstRequest)->mOutputStreams) { 70685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (outputStream->isVideoStream()) { 70785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen (*firstRequest)->mBatchSize = requestList->size(); 70885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen break; 70985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 71085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 71185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 71285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 71390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return OK; 71490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 71590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 716cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::capture(CameraMetadata &request, int64_t* /*lastFrameNumber*/) { 7177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 7184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 7192d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei List<const CameraMetadata> requests; 7202d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei requests.push_back(request); 7212d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei return captureList(requests, /*lastFrameNumber*/NULL); 7227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 7237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 72490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::submitRequestsHelper( 7252d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei const List<const CameraMetadata> &requests, bool repeating, 7262d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 7272d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber) { 72890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ATRACE_CALL(); 72990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei Mutex::Autolock il(mInterfaceLock); 73090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei Mutex::Autolock l(mLock); 73190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 73290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei status_t res = checkStatusOkToCaptureLocked(); 73390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (res != OK) { 73490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei // error logged by previous call 73590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return res; 73690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 73790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 73890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei RequestList requestList; 73990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 74090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei res = convertMetadataListToRequestListLocked(requests, /*out*/&requestList); 74190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (res != OK) { 74290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei // error logged by previous call 74390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return res; 74490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 74590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 74690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (repeating) { 7472d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei res = mRequestThread->setRepeatingRequests(requestList, lastFrameNumber); 74890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } else { 7492d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei res = mRequestThread->queueRequestList(requestList, lastFrameNumber); 75090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 75190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 75290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (res == OK) { 75390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei waitUntilStateThenRelock(/*active*/true, kActiveTimeout); 75490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (res != OK) { 75590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei SET_ERR_L("Can't transition to active in %f seconds!", 75690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei kActiveTimeout/1e9); 75790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 7582d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGV("Camera %d: Capture request %" PRId32 " enqueued", mId, 7592d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei (*(requestList.begin()))->mResultExtras.requestId); 76090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } else { 76190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("Cannot queue request. Impossible."); 76290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return BAD_VALUE; 76390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 76490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 76590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return res; 76690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 76790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 768cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::captureList(const List<const CameraMetadata> &requests, 769cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber) { 77090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ATRACE_CALL(); 77190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 772cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return submitRequestsHelper(requests, /*repeating*/false, lastFrameNumber); 77390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 7747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 775cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::setStreamingRequest(const CameraMetadata &request, 776cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t* /*lastFrameNumber*/) { 7777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 778f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 7792d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei List<const CameraMetadata> requests; 7802d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei requests.push_back(request); 7812d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei return setStreamingRequestList(requests, /*lastFrameNumber*/NULL); 782f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 783f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 784cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::setStreamingRequestList(const List<const CameraMetadata> &requests, 785cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber) { 78690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ATRACE_CALL(); 78790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 788cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return submitRequestsHelper(requests, /*repeating*/true, lastFrameNumber); 78990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 790f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 791f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::setUpRequestLocked( 792f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const CameraMetadata &request) { 793f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 794f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 795f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_UNCONFIGURED || mNeedConfig) { 796f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = configureStreamsLocked(); 7979b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen // Stream configuration failed. Client might try other configuraitons. 798f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 7999b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen CLOGE("Can't set up streams: %s (%d)", strerror(-res), res); 800f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 8019b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen } else if (mStatus == STATUS_UNCONFIGURED) { 8029b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen // Stream configuration successfully configure to empty stream configuration. 803f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala CLOGE("No streams configured"); 804f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return NULL; 805f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 806f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 807f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 808f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> newRequest = createCaptureRequest(request); 809f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return newRequest; 8107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 8117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 812cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::clearStreamingRequest(int64_t *lastFrameNumber) { 8137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 814f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 815f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 816f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 817f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 818f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 819b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 820f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 821f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 822b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device not initialized"); 823f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 824f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 825f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 826f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 827f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 828f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 829f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 830b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 831f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 832f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 833f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Clearing repeating request", mId); 834cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 8352d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei return mRequestThread->clearRepeatingRequests(lastFrameNumber); 8367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 8377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) { 8397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 840f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 8417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->waitUntilRequestProcessed(requestId, timeout); 8437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 8447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8455a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Device::createInputStream( 8465a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin uint32_t width, uint32_t height, int format, int *id) { 8475a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ATRACE_CALL(); 848f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 8495a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin Mutex::Autolock l(mLock); 850f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Creating new input stream %d: %d x %d, format %d", 851f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, mNextStreamId, width, height, format); 8525a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 8535a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin status_t res; 8545a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin bool wasActive = false; 8555a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 8565a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin switch (mStatus) { 8575a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin case STATUS_ERROR: 8585a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: Device has encountered a serious error", __FUNCTION__); 8595a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 8605a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin case STATUS_UNINITIALIZED: 8615a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: Device not initialized", __FUNCTION__); 8625a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 863f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 864f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 8655a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin // OK 8665a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin break; 8675a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin case STATUS_ACTIVE: 8685a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); 869f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = internalPauseAndWaitLocked(); 8705a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (res != OK) { 871f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't pause captures to reconfigure streams!"); 8725a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return res; 8735a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 8745a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin wasActive = true; 8755a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin break; 8765a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin default: 877f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("%s: Unexpected status: %d", mStatus); 8785a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 8795a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 880f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala assert(mStatus != STATUS_ACTIVE); 8815a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 8825a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (mInputStream != 0) { 8835a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__); 8845a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 8855a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 8865a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 8875a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin sp<Camera3InputStream> newStream = new Camera3InputStream(mNextStreamId, 8885a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin width, height, format); 889f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala newStream->setStatusTracker(mStatusTracker); 8905a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 8915a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin mInputStream = newStream; 8925a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 8935a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin *id = mNextStreamId++; 8945a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 8955a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin // Continue captures if active at start 8965a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (wasActive) { 8975a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); 8985a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin res = configureStreamsLocked(); 8995a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (res != OK) { 9005a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)", 9015a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin __FUNCTION__, mNextStreamId, strerror(-res), res); 9025a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return res; 9035a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 904f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala internalResumeLocked(); 9055a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 9065a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 907f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Created input stream", mId); 9085a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return OK; 9095a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 9105a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 9112fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 9122fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinstatus_t Camera3Device::createZslStream( 9132fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin uint32_t width, uint32_t height, 9142fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int depth, 9152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin /*out*/ 9162fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int *id, 9172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3ZslStream>* zslStream) { 9182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ATRACE_CALL(); 919f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 9202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Mutex::Autolock l(mLock); 921f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Creating ZSL stream %d: %d x %d, depth %d", 922f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, mNextStreamId, width, height, depth); 9232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 9242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin status_t res; 9252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin bool wasActive = false; 9262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 9272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin switch (mStatus) { 9282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin case STATUS_ERROR: 9292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Device has encountered a serious error", __FUNCTION__); 9302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 9312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin case STATUS_UNINITIALIZED: 9322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Device not initialized", __FUNCTION__); 9332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 934f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 935f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 9362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // OK 9372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin break; 9382fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin case STATUS_ACTIVE: 9392fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); 940f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = internalPauseAndWaitLocked(); 9412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res != OK) { 942f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't pause captures to reconfigure streams!"); 9432fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 9442fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 9452fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin wasActive = true; 9462fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin break; 9472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin default: 948f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 9492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 9502fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 951f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala assert(mStatus != STATUS_ACTIVE); 9522fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 9532fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (mInputStream != 0) { 9542fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__); 9552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 9562fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 9572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 9582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3ZslStream> newStream = new Camera3ZslStream(mNextStreamId, 9592fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin width, height, depth); 960f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala newStream->setStatusTracker(mStatusTracker); 9612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 9622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = mOutputStreams.add(mNextStreamId, newStream); 9632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res < 0) { 9642fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Can't add new stream to set: %s (%d)", 9652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__, strerror(-res), res); 9662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 9672fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 9682fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mInputStream = newStream; 9692fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 970e5e3d0823165dea9211a47232dbbbe361153fb49Yuvraj Pasi mNeedConfig = true; 971e5e3d0823165dea9211a47232dbbbe361153fb49Yuvraj Pasi 9722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin *id = mNextStreamId++; 9732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin *zslStream = newStream; 9742fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 9752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Continue captures if active at start 9762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (wasActive) { 9772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); 9782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = configureStreamsLocked(); 9792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res != OK) { 9802fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)", 9812fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__, mNextStreamId, strerror(-res), res); 9822fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 9832fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 984f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala internalResumeLocked(); 9852fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 9862fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 987f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Created ZSL stream", mId); 9882fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return OK; 9892fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 9902fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 991727d172137b4f32681c098de8e2623c0b65a6406Eino-Ville Talvalastatus_t Camera3Device::createStream(sp<Surface> consumer, 9923d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala uint32_t width, uint32_t height, int format, android_dataspace dataSpace, 993125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He camera3_stream_rotation_t rotation, int *id, int streamSetId) { 9947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 995f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 996f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 997b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh ALOGV("Camera %d: Creating new stream %d: %d x %d, format %d, dataspace %d rotation %d", 998b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh mId, mNextStreamId, width, height, format, dataSpace, rotation); 9997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1000f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 1001f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool wasActive = false; 1002f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1003f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 1004f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 1005b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 1006f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1007f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 1008b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device not initialized"); 1009f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1010f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 1011f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 1012f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 1013f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 1014f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 1015f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); 1016f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = internalPauseAndWaitLocked(); 1017f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1018f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't pause captures to reconfigure streams!"); 1019f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 1020f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1021f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala wasActive = true; 1022f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 1023f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 1024b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 1025f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1026f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1027f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala assert(mStatus != STATUS_ACTIVE); 1028f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1029f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<Camera3OutputStream> newStream; 1030edd41ae47b99b98249e819ac72fb94264326a4ebZhijun He // Overwrite stream set id to invalid for HAL3.2 or lower, as buffer manager does support 1031125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He // such devices. 1032edd41ae47b99b98249e819ac72fb94264326a4ebZhijun He if (mDeviceVersion <= CAMERA_DEVICE_API_VERSION_3_2) { 1033125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He streamSetId = CAMERA3_STREAM_SET_ID_INVALID; 1034125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He } 10352cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala // Use legacy dataspace values for older HALs 10362cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala if (mDeviceVersion <= CAMERA_DEVICE_API_VERSION_3_3) { 10372cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala dataSpace = mapToLegacyDataspace(dataSpace); 10382cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala } 1039f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (format == HAL_PIXEL_FORMAT_BLOB) { 104095a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala ssize_t blobBufferSize; 104195a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala if (dataSpace != HAL_DATASPACE_DEPTH) { 104295a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala blobBufferSize = getJpegBufferSize(width, height); 104395a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala if (blobBufferSize <= 0) { 104495a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala SET_ERR_L("Invalid jpeg buffer size %zd", blobBufferSize); 104595a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala return BAD_VALUE; 104695a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala } 104795a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala } else { 104895a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala blobBufferSize = getPointCloudBufferSize(); 104995a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala if (blobBufferSize <= 0) { 105095a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala SET_ERR_L("Invalid point cloud buffer size %zd", blobBufferSize); 105195a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala return BAD_VALUE; 105295a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala } 1053f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 1054f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newStream = new Camera3OutputStream(mNextStreamId, consumer, 1055c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang width, height, blobBufferSize, format, dataSpace, rotation, 1056c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang mTimestampOffset, streamSetId); 1057e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh } else if (format == HAL_PIXEL_FORMAT_RAW_OPAQUE) { 1058e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh ssize_t rawOpaqueBufferSize = getRawOpaqueBufferSize(width, height); 1059e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh if (rawOpaqueBufferSize <= 0) { 1060e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh SET_ERR_L("Invalid RAW opaque buffer size %zd", rawOpaqueBufferSize); 1061e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh return BAD_VALUE; 1062e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh } 1063e9154ced1216ceb06a82140ed65051c0397e8abcYin-Chia Yeh newStream = new Camera3OutputStream(mNextStreamId, consumer, 1064c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang width, height, rawOpaqueBufferSize, format, dataSpace, rotation, 1065c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang mTimestampOffset, streamSetId); 1066f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 1067f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newStream = new Camera3OutputStream(mNextStreamId, consumer, 1068c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang width, height, format, dataSpace, rotation, 1069c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang mTimestampOffset, streamSetId); 1070f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1071f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala newStream->setStatusTracker(mStatusTracker); 1072f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1073125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He /** 1074edd41ae47b99b98249e819ac72fb94264326a4ebZhijun He * Camera3 Buffer manager is only supported by HAL3.3 onwards, as the older HALs ( < HAL3.2) 1075edd41ae47b99b98249e819ac72fb94264326a4ebZhijun He * requires buffers to be statically allocated for internal static buffer registration, while 1076edd41ae47b99b98249e819ac72fb94264326a4ebZhijun He * the buffers provided by buffer manager are really dynamically allocated. For HAL3.2, because 1077edd41ae47b99b98249e819ac72fb94264326a4ebZhijun He * not all HAL implementation supports dynamic buffer registeration, exlude it as well. 1078125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He */ 1079edd41ae47b99b98249e819ac72fb94264326a4ebZhijun He if (mDeviceVersion > CAMERA_DEVICE_API_VERSION_3_2) { 1080125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He newStream->setBufferManager(mBufferManager); 1081125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He } 1082125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 1083f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mOutputStreams.add(mNextStreamId, newStream); 1084f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res < 0) { 1085b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't add new stream to set: %s (%d)", strerror(-res), res); 1086f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 1087f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1088f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1089f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala *id = mNextStreamId++; 1090ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala mNeedConfig = true; 1091f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1092f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Continue captures if active at start 1093f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (wasActive) { 1094f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); 1095f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = configureStreamsLocked(); 1096f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1097b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Can't reconfigure device for new stream %d: %s (%d)", 1098b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala mNextStreamId, strerror(-res), res); 1099f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 1100f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1101f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala internalResumeLocked(); 1102f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1103f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Created new stream", mId); 1104f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 11057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 11067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createReprocessStreamFromStream(int outputId, int *id) { 11087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 11097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)outputId; (void)id; 11107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1111b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Unimplemented"); 11127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 11137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 11147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::getStreamInfo(int id, 1117d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala uint32_t *width, uint32_t *height, 1118d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala uint32_t *format, android_dataspace *dataSpace) { 11197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1120f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1121f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 1122f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1123f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 1124f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 1125b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 1126f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1127f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 1128b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device not initialized!"); 1129f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1130f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 1131f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 1132f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 1133f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 1134f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 1135f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 1136b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 1137f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1138f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 11397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1140f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ssize_t idx = mOutputStreams.indexOfKey(id); 1141f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (idx == NAME_NOT_FOUND) { 1142b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Stream %d is unknown", id); 1143f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return idx; 1144f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1145f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1146f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (width) *width = mOutputStreams[idx]->getWidth(); 1147f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (height) *height = mOutputStreams[idx]->getHeight(); 1148f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (format) *format = mOutputStreams[idx]->getFormat(); 1149d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala if (dataSpace) *dataSpace = mOutputStreams[idx]->getDataSpace(); 1150f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 11517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 11527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setStreamTransform(int id, 11547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala int transform) { 11557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1156f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1157f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 1158f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1159f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 1160f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 1161b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 1162f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1163f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 1164b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device not initialized"); 1165f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1166f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 1167f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 1168f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 1169f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 1170f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 1171f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 1172b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 1173f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1174f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 11757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1176f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ssize_t idx = mOutputStreams.indexOfKey(id); 1177f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (idx == NAME_NOT_FOUND) { 1178b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Stream %d does not exist", 1179b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala id); 1180f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return BAD_VALUE; 1181f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1182f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1183f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return mOutputStreams.editValueAt(idx)->setTransform(transform); 11847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 11857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteStream(int id) { 11877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1188f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1189f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 1190f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 11917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1192e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin ALOGV("%s: Camera %d: Deleting stream %d", __FUNCTION__, mId, id); 1193e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin 1194f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // CameraDevice semantics require device to already be idle before 1195f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // deleteStream is called, unlike for createStream. 1196f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_ACTIVE) { 11975282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGV("%s: Camera %d: Device not idle", __FUNCTION__, mId); 11985282713a976184e41451315f1286d8075b257d58Igor Murashkin return -EBUSY; 1199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 12012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3StreamInterface> deletedStream; 12025f44635dc35814b98b4dc2b255355a93122fec59Zhijun He ssize_t outputStreamIdx = mOutputStreams.indexOfKey(id); 1203f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream != NULL && id == mInputStream->getId()) { 1204f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala deletedStream = mInputStream; 1205f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mInputStream.clear(); 1206f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 12075f44635dc35814b98b4dc2b255355a93122fec59Zhijun He if (outputStreamIdx == NAME_NOT_FOUND) { 1208b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Stream %d does not exist", id); 1209f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return BAD_VALUE; 1210f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 12115f44635dc35814b98b4dc2b255355a93122fec59Zhijun He } 12125f44635dc35814b98b4dc2b255355a93122fec59Zhijun He 12135f44635dc35814b98b4dc2b255355a93122fec59Zhijun He // Delete output stream or the output part of a bi-directional stream. 12145f44635dc35814b98b4dc2b255355a93122fec59Zhijun He if (outputStreamIdx != NAME_NOT_FOUND) { 12155f44635dc35814b98b4dc2b255355a93122fec59Zhijun He deletedStream = mOutputStreams.editValueAt(outputStreamIdx); 1216f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mOutputStreams.removeItem(id); 1217f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1218f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1219f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Free up the stream endpoint so that it can be used by some other stream 1220f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = deletedStream->disconnect(); 1221f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1222b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't disconnect deleted stream %d", id); 1223f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // fall through since we want to still list the stream as deleted. 1224f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1225f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDeletedStreams.add(deletedStream); 1226ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala mNeedConfig = true; 1227f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1228f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 12297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 12307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 12317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteReprocessStream(int id) { 12327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 12337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)id; 12347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1235b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Unimplemented"); 12367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 12377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 12387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 12391fa8999c91d5df81949aa723000058380cd3faa2Zhijun Hestatus_t Camera3Device::configureStreams(bool isConstrainedHighSpeed) { 1240e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin ATRACE_CALL(); 1241e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin ALOGV("%s: E", __FUNCTION__); 1242e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin 1243e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin Mutex::Autolock il(mInterfaceLock); 1244e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin Mutex::Autolock l(mLock); 124517338fca4a51dfb32c1291f94b65d4b4f30b682dChien-Yu Chen 124617338fca4a51dfb32c1291f94b65d4b4f30b682dChien-Yu Chen if (mIsConstrainedHighSpeedConfiguration != isConstrainedHighSpeed) { 124717338fca4a51dfb32c1291f94b65d4b4f30b682dChien-Yu Chen mNeedConfig = true; 124817338fca4a51dfb32c1291f94b65d4b4f30b682dChien-Yu Chen mIsConstrainedHighSpeedConfiguration = isConstrainedHighSpeed; 124917338fca4a51dfb32c1291f94b65d4b4f30b682dChien-Yu Chen } 1250e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin 1251e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin return configureStreamsLocked(); 1252e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin} 12537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1254618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chenstatus_t Camera3Device::getInputBufferProducer( 1255618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen sp<IGraphicBufferProducer> *producer) { 1256618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen Mutex::Autolock il(mInterfaceLock); 1257618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen Mutex::Autolock l(mLock); 1258618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 1259618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen if (producer == NULL) { 1260618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen return BAD_VALUE; 1261618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } else if (mInputStream == NULL) { 1262618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen return INVALID_OPERATION; 1263618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } 1264618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 1265618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen return mInputStream->getInputBufferProducer(producer); 1266618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen} 1267618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 12687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createDefaultRequest(int templateId, 12697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala CameraMetadata *request) { 12707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1271fe7e0c6154309f2491463ee6ca4920d225289638Alex Ray ALOGV("%s: for template %d", __FUNCTION__, templateId); 12729cd140240c84789d00349c33e9c0b7a74d1543edChien-Yu Chen 12739cd140240c84789d00349c33e9c0b7a74d1543edChien-Yu Chen if (templateId <= 0 || templateId >= CAMERA3_TEMPLATE_COUNT) { 12749cd140240c84789d00349c33e9c0b7a74d1543edChien-Yu Chen android_errorWriteWithInfoLog(CameraService::SN_EVENT_LOG_ID, "26866110", 12759cd140240c84789d00349c33e9c0b7a74d1543edChien-Yu Chen IPCThreadState::self()->getCallingUid(), nullptr, 0); 12769cd140240c84789d00349c33e9c0b7a74d1543edChien-Yu Chen return BAD_VALUE; 12779cd140240c84789d00349c33e9c0b7a74d1543edChien-Yu Chen } 12789cd140240c84789d00349c33e9c0b7a74d1543edChien-Yu Chen 1279f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1280f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 1281f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1282f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 1283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 1284b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 1285f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1286f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 1287b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device is not initialized!"); 1288f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1289f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 1290f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 1291f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 1292f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 1293f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 1294f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 1295b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 1296f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1297f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 12987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1299a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He if (!mRequestTemplateCache[templateId].isEmpty()) { 1300a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He *request = mRequestTemplateCache[templateId]; 1301a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He return OK; 1302a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He } 1303a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He 13047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera_metadata_t *rawRequest; 130517a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->construct_default_request_settings"); 13067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala rawRequest = mHal3Device->ops->construct_default_request_settings( 13077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal3Device, templateId); 130817a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 1309b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala if (rawRequest == NULL) { 13100336d3649f13506a7daf425690d225beac9d214fYin-Chia Yeh ALOGI("%s: template %d is not supported on this camera device", 13110336d3649f13506a7daf425690d225beac9d214fYin-Chia Yeh __FUNCTION__, templateId); 13120336d3649f13506a7daf425690d225beac9d214fYin-Chia Yeh return BAD_VALUE; 1313b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala } 13144c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh 1315a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He mRequestTemplateCache[templateId] = rawRequest; 13167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 13174c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh // Derive some new keys for backward compatibility 13184c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh if (mDerivePostRawSensKey && !mRequestTemplateCache[templateId].exists( 13194c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST)) { 13204c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh int32_t defaultBoost[1] = {100}; 13214c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh mRequestTemplateCache[templateId].update( 13224c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST, 13234c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh defaultBoost, 1); 13244c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh } 13254c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh 13264c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh *request = mRequestTemplateCache[templateId]; 13277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return OK; 13287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 13297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 13307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilDrained() { 13317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1332f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1333f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 13347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 133569a374897392c8bd70f441b7284f6f578c651ec9Zhijun He return waitUntilDrainedLocked(); 133669a374897392c8bd70f441b7284f6f578c651ec9Zhijun He} 133769a374897392c8bd70f441b7284f6f578c651ec9Zhijun He 133869a374897392c8bd70f441b7284f6f578c651ec9Zhijun Hestatus_t Camera3Device::waitUntilDrainedLocked() { 1339f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 1340f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 1341f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 1342f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: Already idle", __FUNCTION__); 1343f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 1344f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 1345f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // To avoid race conditions, check with tracker to be sure 1346f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 1347f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 1348f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Need to verify shut down 1349f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 1350f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 1351b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d",mStatus); 1352f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1353f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1354f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1355f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Waiting until idle", __FUNCTION__, mId); 1356f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout); 13579c8a091436052fb0f3290356abe1ac55b7bae8a2Eino-Ville Talvala if (res != OK) { 13589c8a091436052fb0f3290356abe1ac55b7bae8a2Eino-Ville Talvala SET_ERR_L("Error waiting for HAL to drain: %s (%d)", strerror(-res), 13599c8a091436052fb0f3290356abe1ac55b7bae8a2Eino-Ville Talvala res); 13609c8a091436052fb0f3290356abe1ac55b7bae8a2Eino-Ville Talvala } 1361f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 1362f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 1363f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1364183f056393423b344e73f388f21d30379a38e519Ruben Brunk 1365183f056393423b344e73f388f21d30379a38e519Ruben Brunkvoid Camera3Device::internalUpdateStatusLocked(Status status) { 1366183f056393423b344e73f388f21d30379a38e519Ruben Brunk mStatus = status; 1367183f056393423b344e73f388f21d30379a38e519Ruben Brunk mRecentStatusUpdates.add(mStatus); 1368183f056393423b344e73f388f21d30379a38e519Ruben Brunk mStatusChanged.broadcast(); 1369183f056393423b344e73f388f21d30379a38e519Ruben Brunk} 1370183f056393423b344e73f388f21d30379a38e519Ruben Brunk 1371f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// Pause to reconfigure 1372f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::internalPauseAndWaitLocked() { 1373f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread->setPaused(true); 1374f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mPauseStateNotify = true; 1375f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1376f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Internal wait until idle", __FUNCTION__, mId); 1377f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout); 1378f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) { 1379f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't idle device in %f seconds!", 1380f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala kShutdownTimeout/1e9); 1381f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1382f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1383f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 1384f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 1385f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1386f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// Resume after internalPauseAndWaitLocked 1387f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::internalResumeLocked() { 1388f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t res; 1389f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1390f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread->setPaused(false); 1391f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1392f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = waitUntilStateThenRelock(/*active*/ true, kActiveTimeout); 1393f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) { 1394f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't transition to active in %f seconds!", 1395f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala kActiveTimeout/1e9); 1396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1397f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mPauseStateNotify = false; 1398f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return OK; 1399f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 1400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1401183f056393423b344e73f388f21d30379a38e519Ruben Brunkstatus_t Camera3Device::waitUntilStateThenRelock(bool active, nsecs_t timeout) { 1402f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t res = OK; 1403183f056393423b344e73f388f21d30379a38e519Ruben Brunk 1404183f056393423b344e73f388f21d30379a38e519Ruben Brunk size_t startIndex = 0; 1405183f056393423b344e73f388f21d30379a38e519Ruben Brunk if (mStatusWaiters == 0) { 1406183f056393423b344e73f388f21d30379a38e519Ruben Brunk // Clear the list of recent statuses if there are no existing threads waiting on updates to 1407183f056393423b344e73f388f21d30379a38e519Ruben Brunk // this status list 1408183f056393423b344e73f388f21d30379a38e519Ruben Brunk mRecentStatusUpdates.clear(); 1409183f056393423b344e73f388f21d30379a38e519Ruben Brunk } else { 1410183f056393423b344e73f388f21d30379a38e519Ruben Brunk // If other threads are waiting on updates to this status list, set the position of the 1411183f056393423b344e73f388f21d30379a38e519Ruben Brunk // first element that this list will check rather than clearing the list. 1412183f056393423b344e73f388f21d30379a38e519Ruben Brunk startIndex = mRecentStatusUpdates.size(); 1413f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1414f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1415183f056393423b344e73f388f21d30379a38e519Ruben Brunk mStatusWaiters++; 1416183f056393423b344e73f388f21d30379a38e519Ruben Brunk 1417f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool stateSeen = false; 1418f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala do { 1419183f056393423b344e73f388f21d30379a38e519Ruben Brunk if (active == (mStatus == STATUS_ACTIVE)) { 1420183f056393423b344e73f388f21d30379a38e519Ruben Brunk // Desired state is current 1421183f056393423b344e73f388f21d30379a38e519Ruben Brunk break; 1422183f056393423b344e73f388f21d30379a38e519Ruben Brunk } 1423f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1424f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = mStatusChanged.waitRelative(mLock, timeout); 1425f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) break; 1426f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1427183f056393423b344e73f388f21d30379a38e519Ruben Brunk // This is impossible, but if not, could result in subtle deadlocks and invalid state 1428183f056393423b344e73f388f21d30379a38e519Ruben Brunk // transitions. 1429183f056393423b344e73f388f21d30379a38e519Ruben Brunk LOG_ALWAYS_FATAL_IF(startIndex > mRecentStatusUpdates.size(), 1430183f056393423b344e73f388f21d30379a38e519Ruben Brunk "%s: Skipping status updates in Camera3Device, may result in deadlock.", 1431183f056393423b344e73f388f21d30379a38e519Ruben Brunk __FUNCTION__); 1432183f056393423b344e73f388f21d30379a38e519Ruben Brunk 1433183f056393423b344e73f388f21d30379a38e519Ruben Brunk // Encountered desired state since we began waiting 1434183f056393423b344e73f388f21d30379a38e519Ruben Brunk for (size_t i = startIndex; i < mRecentStatusUpdates.size(); i++) { 1435f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (active == (mRecentStatusUpdates[i] == STATUS_ACTIVE) ) { 1436f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala stateSeen = true; 1437f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala break; 1438f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1439f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1440f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } while (!stateSeen); 1441f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1442183f056393423b344e73f388f21d30379a38e519Ruben Brunk mStatusWaiters--; 1443183f056393423b344e73f388f21d30379a38e519Ruben Brunk 1444f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 14457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 14467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1447f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 14487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setNotifyCallback(NotificationListener *listener) { 14497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 14507d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 14517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 14527d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (listener != NULL && mListener != NULL) { 14537d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ALOGW("%s: Replacing old callback listener", __FUNCTION__); 14547d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 14557d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mListener = listener; 14564d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mRequestThread->setNotificationListener(listener); 14574d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mPreparerThread->setNotificationListener(listener); 14587d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 14597d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return OK; 14607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 14617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 146246910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvalabool Camera3Device::willNotify3A() { 146346910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala return false; 146446910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala} 146546910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala 14667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitForNextFrame(nsecs_t timeout) { 14677d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala status_t res; 14687d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 14697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 14707d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala while (mResultQueue.empty()) { 14717d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala res = mResultSignal.waitRelative(mOutputLock, timeout); 14727d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (res == TIMED_OUT) { 14737d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return res; 14747d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } else if (res != OK) { 1475e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGW("%s: Camera %d: No frame in %" PRId64 " ns: %s (%d)", 1476b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala __FUNCTION__, mId, timeout, strerror(-res), res); 14777d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return res; 14787d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 14797d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 14807d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return OK; 14817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 14827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1483cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::getNextResult(CaptureResult *frame) { 14847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 14857d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 14867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 14877d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (mResultQueue.empty()) { 14887d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return NOT_ENOUGH_DATA; 14897d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 14907d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 1491cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (frame == NULL) { 1492cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGE("%s: argument cannot be NULL", __FUNCTION__); 1493cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return BAD_VALUE; 1494cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 1495cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 1496cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResult &result = *(mResultQueue.begin()); 1497cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei frame->mResultExtras = result.mResultExtras; 1498cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei frame->mMetadata.acquire(result.mMetadata); 14997d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mResultQueue.erase(mResultQueue.begin()); 15007d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 15017d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return OK; 15027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 15037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 15047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerAutofocus(uint32_t id) { 15057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1506f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 15077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 15084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id); 15094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in this trigger into the next request and only the next request. 15104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[] = { 15114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 15124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER, 15134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_START 15144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 15154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 15164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_ID, 15174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin static_cast<int32_t>(id) 1518741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 15194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 15204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->queueTrigger(trigger, 15224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin sizeof(trigger)/sizeof(trigger[0])); 15237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 15247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 15257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerCancelAutofocus(uint32_t id) { 15267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1527f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 15287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 15294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Triggering cancel autofocus, id %d", __FUNCTION__, id); 15304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in this trigger into the next request and only the next request. 15314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[] = { 15324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 15334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER, 15344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_CANCEL 15354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 15364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 15374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_ID, 15384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin static_cast<int32_t>(id) 1539741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 15404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 15414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->queueTrigger(trigger, 15434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin sizeof(trigger)/sizeof(trigger[0])); 15447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 15457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 15467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerPrecaptureMetering(uint32_t id) { 15477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1548f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 15497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 15504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id); 15514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in this trigger into the next request and only the next request. 15524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[] = { 15534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 15544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, 15554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START 15564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 15574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 15584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AE_PRECAPTURE_ID, 15594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin static_cast<int32_t>(id) 1560741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 15614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 15624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 15634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->queueTrigger(trigger, 15644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin sizeof(trigger)/sizeof(trigger[0])); 15657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 15667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 15677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::pushReprocessBuffer(int reprocessStreamId, 15687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala buffer_handle_t *buffer, wp<BufferReleasedListener> listener) { 15697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 15707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)reprocessStreamId; (void)buffer; (void)listener; 15717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1572b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Unimplemented"); 15737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 15747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 15757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1576cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::flush(int64_t *frameNumber) { 1577abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala ATRACE_CALL(); 1578abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala ALOGV("%s: Camera %d: Flushing all requests", __FUNCTION__, mId); 1579f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1580abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 15811754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala NotificationListener* listener; 15821754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala { 15831754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala Mutex::Autolock l(mOutputLock); 15841754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala listener = mListener; 15851754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 15861754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 15877ef20390ba4375c4b08edd14923846086987a8c8Zhijun He { 15887ef20390ba4375c4b08edd14923846086987a8c8Zhijun He Mutex::Autolock l(mLock); 15891754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala mRequestThread->clear(listener, /*out*/frameNumber); 15907ef20390ba4375c4b08edd14923846086987a8c8Zhijun He } 15917ef20390ba4375c4b08edd14923846086987a8c8Zhijun He 1592491e341211b4772c75f719158f6b397e1c40497dZhijun He status_t res; 1593491e341211b4772c75f719158f6b397e1c40497dZhijun He if (mHal3Device->common.version >= CAMERA_DEVICE_API_VERSION_3_1) { 159485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen res = mRequestThread->flush(); 1595491e341211b4772c75f719158f6b397e1c40497dZhijun He } else { 15967ef20390ba4375c4b08edd14923846086987a8c8Zhijun He Mutex::Autolock l(mLock); 159769a374897392c8bd70f441b7284f6f578c651ec9Zhijun He res = waitUntilDrainedLocked(); 1598491e341211b4772c75f719158f6b397e1c40497dZhijun He } 1599491e341211b4772c75f719158f6b397e1c40497dZhijun He 1600491e341211b4772c75f719158f6b397e1c40497dZhijun He return res; 1601abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala} 1602abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 16034d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvalastatus_t Camera3Device::prepare(int streamId) { 1604c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk return prepare(camera3::Camera3StreamInterface::ALLOCATE_PIPELINE_MAX, streamId); 1605c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk} 1606c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk 1607c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunkstatus_t Camera3Device::prepare(int maxCount, int streamId) { 16084d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ATRACE_CALL(); 16094d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Camera %d: Preparing stream %d", __FUNCTION__, mId, streamId); 1610261394e3edbe10f4f145f543187dcfbabf702c11Eino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1611261394e3edbe10f4f145f543187dcfbabf702c11Eino-Ville Talvala Mutex::Autolock l(mLock); 16124d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 16134d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala sp<Camera3StreamInterface> stream; 16144d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ssize_t outputStreamIdx = mOutputStreams.indexOfKey(streamId); 16154d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (outputStreamIdx == NAME_NOT_FOUND) { 16164d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala CLOGE("Stream %d does not exist", streamId); 16174d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return BAD_VALUE; 16184d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 16194d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 16204d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala stream = mOutputStreams.editValueAt(outputStreamIdx); 16214d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 16224d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (stream->isUnpreparable() || stream->hasOutstandingBuffers() ) { 1623261394e3edbe10f4f145f543187dcfbabf702c11Eino-Ville Talvala CLOGE("Stream %d has already been a request target", streamId); 16244d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return BAD_VALUE; 16254d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 16264d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 16274d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (mRequestThread->isStreamPending(stream)) { 1628261394e3edbe10f4f145f543187dcfbabf702c11Eino-Ville Talvala CLOGE("Stream %d is already a target in a pending request", streamId); 16294d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return BAD_VALUE; 16304d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 16314d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 1632c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk return mPreparerThread->prepare(maxCount, stream); 16334d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 16344d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 1635b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvalastatus_t Camera3Device::tearDown(int streamId) { 1636b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala ATRACE_CALL(); 1637b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala ALOGV("%s: Camera %d: Tearing down stream %d", __FUNCTION__, mId, streamId); 1638b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1639b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala Mutex::Autolock l(mLock); 1640b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala 1641b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala // Teardown can only be accomplished on devices that don't require register_stream_buffers, 1642b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala // since we cannot call register_stream_buffers except right after configure_streams. 1643b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala if (mHal3Device->common.version < CAMERA_DEVICE_API_VERSION_3_2) { 1644b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala ALOGE("%s: Unable to tear down streams on device HAL v%x", 1645b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala __FUNCTION__, mHal3Device->common.version); 1646b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala return NO_INIT; 1647b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala } 1648b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala 1649b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala sp<Camera3StreamInterface> stream; 1650b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala ssize_t outputStreamIdx = mOutputStreams.indexOfKey(streamId); 1651b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala if (outputStreamIdx == NAME_NOT_FOUND) { 1652b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala CLOGE("Stream %d does not exist", streamId); 1653b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala return BAD_VALUE; 1654b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala } 1655b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala 1656b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala stream = mOutputStreams.editValueAt(outputStreamIdx); 1657b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala 1658b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala if (stream->hasOutstandingBuffers() || mRequestThread->isStreamPending(stream)) { 1659b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala CLOGE("Stream %d is a target of a in-progress request", streamId); 1660b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala return BAD_VALUE; 1661b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala } 1662b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala 1663b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala return stream->tearDown(); 1664b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala} 1665b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala 1666b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wangstatus_t Camera3Device::addBufferListenerForStream(int streamId, 1667b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang wp<Camera3StreamBufferListener> listener) { 1668b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang ATRACE_CALL(); 1669b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang ALOGV("%s: Camera %d: Adding buffer listener for stream %d", __FUNCTION__, mId, streamId); 1670b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang Mutex::Autolock il(mInterfaceLock); 1671b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang Mutex::Autolock l(mLock); 1672b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang 1673b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang sp<Camera3StreamInterface> stream; 1674b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang ssize_t outputStreamIdx = mOutputStreams.indexOfKey(streamId); 1675b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang if (outputStreamIdx == NAME_NOT_FOUND) { 1676b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang CLOGE("Stream %d does not exist", streamId); 1677b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang return BAD_VALUE; 1678b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang } 1679b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang 1680b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang stream = mOutputStreams.editValueAt(outputStreamIdx); 1681b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang stream->addBufferListener(listener); 1682b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang 1683b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang return OK; 1684b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang} 1685b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang 1686204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun Heuint32_t Camera3Device::getDeviceVersion() { 1687204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He ATRACE_CALL(); 1688204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He Mutex::Autolock il(mInterfaceLock); 1689204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He return mDeviceVersion; 1690204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He} 1691204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 1692f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 1693f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Methods called by subclasses 1694f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 1695f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1696f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid Camera3Device::notifyStatus(bool idle) { 1697f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala { 1698f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Need mLock to safely update state and synchronize to current 1699f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // state of methods in flight. 1700f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mLock); 1701f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // We can get various system-idle notices from the status tracker 1702f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // while starting up. Only care about them if we've actually sent 1703f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // in some requests recently. 1704f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus != STATUS_ACTIVE && mStatus != STATUS_CONFIGURED) { 1705f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return; 1706f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1707f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Now %s", __FUNCTION__, mId, 1708f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala idle ? "idle" : "active"); 1709183f056393423b344e73f388f21d30379a38e519Ruben Brunk internalUpdateStatusLocked(idle ? STATUS_CONFIGURED : STATUS_ACTIVE); 1710f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1711f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Skip notifying listener if we're doing some user-transparent 1712f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // state changes 1713f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mPauseStateNotify) return; 1714f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1715f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala NotificationListener *listener; 1716f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala { 1717f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mOutputLock); 1718f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala listener = mListener; 1719f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1720f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (idle && listener != NULL) { 1721f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala listener->notifyIdle(); 1722f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1723f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 1724f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1725f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala/** 1726f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera3Device private methods 1727f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 1728f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1729f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::createCaptureRequest( 1730f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const CameraMetadata &request) { 1731f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ATRACE_CALL(); 1732f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 1733f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1734f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> newRequest = new CaptureRequest; 1735f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings = request; 1736f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1737f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera_metadata_entry_t inputStreams = 1738f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.find(ANDROID_REQUEST_INPUT_STREAMS); 1739f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (inputStreams.count > 0) { 1740f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream == NULL || 1741d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He mInputStream->getId() != inputStreams.data.i32[0]) { 1742b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Request references unknown input stream %d", 1743b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala inputStreams.data.u8[0]); 1744f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1745f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1746f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Lazy completion of stream configuration (allocation/registration) 1747f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // on first use 1748f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream->isConfiguring()) { 1749f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mInputStream->finishConfiguration(mHal3Device); 1750f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1751b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to finish configuring input stream %d:" 1752f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala " %s (%d)", 1753b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala mInputStream->getId(), strerror(-res), res); 1754f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1755f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1756f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 17574d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // Check if stream is being prepared 17584d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (mInputStream->isPreparing()) { 17594d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala CLOGE("Request references an input stream that's being prepared!"); 17604d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return NULL; 17614d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 1762f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1763f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mInputStream = mInputStream; 1764f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.erase(ANDROID_REQUEST_INPUT_STREAMS); 1765f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1766f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1767f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera_metadata_entry_t streams = 1768f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.find(ANDROID_REQUEST_OUTPUT_STREAMS); 1769f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (streams.count == 0) { 1770b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Zero output streams specified!"); 1771f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1772f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1773f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1774f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < streams.count; i++) { 1775d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He int idx = mOutputStreams.indexOfKey(streams.data.i32[i]); 1776f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (idx == NAME_NOT_FOUND) { 1777b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Request references unknown stream %d", 1778b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala streams.data.u8[i]); 1779f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1780f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 17812fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3OutputStreamInterface> stream = 17822fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mOutputStreams.editValueAt(idx); 1783f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1784f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Lazy completion of stream configuration (allocation/registration) 1785f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // on first use 1786f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (stream->isConfiguring()) { 1787f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = stream->finishConfiguration(mHal3Device); 1788f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1789b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to finish configuring stream %d: %s (%d)", 1790b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala stream->getId(), strerror(-res), res); 1791f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1792f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1793f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 17944d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // Check if stream is being prepared 17954d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (stream->isPreparing()) { 17964d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala CLOGE("Request references an output stream that's being prepared!"); 17974d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return NULL; 17984d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 1799f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1800f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mOutputStreams.push(stream); 1801f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1802f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.erase(ANDROID_REQUEST_OUTPUT_STREAMS); 180385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen newRequest->mBatchSize = 1; 1804f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1805f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return newRequest; 18067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 18077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1808618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chenbool Camera3Device::isOpaqueInputSizeSupported(uint32_t width, uint32_t height) { 1809618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen for (uint32_t i = 0; i < mSupportedOpaqueInputSizes.size(); i++) { 1810618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen Size size = mSupportedOpaqueInputSizes[i]; 1811618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen if (size.width == width && size.height == height) { 1812618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen return true; 1813618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } 1814618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } 1815618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 1816618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen return false; 1817618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen} 1818618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 18199b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chenvoid Camera3Device::cancelStreamsConfigurationLocked() { 18209b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen int res = OK; 18219b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen if (mInputStream != NULL && mInputStream->isConfiguring()) { 18229b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen res = mInputStream->cancelConfiguration(); 18239b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen if (res != OK) { 18249b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen CLOGE("Can't cancel configuring input stream %d: %s (%d)", 18259b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen mInputStream->getId(), strerror(-res), res); 18269b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen } 18279b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen } 18289b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen 18299b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen for (size_t i = 0; i < mOutputStreams.size(); i++) { 18309b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen sp<Camera3OutputStreamInterface> outputStream = mOutputStreams.editValueAt(i); 18319b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen if (outputStream->isConfiguring()) { 18329b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen res = outputStream->cancelConfiguration(); 18339b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen if (res != OK) { 18349b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen CLOGE("Can't cancel configuring output stream %d: %s (%d)", 18359b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen outputStream->getId(), strerror(-res), res); 18369b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen } 18379b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen } 18389b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen } 18399b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen 18409b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen // Return state to that at start of call, so that future configures 18419b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen // properly clean things up 18429b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen internalUpdateStatusLocked(STATUS_UNCONFIGURED); 18439b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen mNeedConfig = true; 18449b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen} 18459b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen 1846f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::configureStreamsLocked() { 1847f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ATRACE_CALL(); 1848f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 18497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1850f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus != STATUS_UNCONFIGURED && mStatus != STATUS_CONFIGURED) { 1851b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Not idle"); 1852f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1853f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1854f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1855ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala if (!mNeedConfig) { 1856ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala ALOGV("%s: Skipping config, no stream changes", __FUNCTION__); 1857ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala return OK; 1858ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala } 1859ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala 186016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // Workaround for device HALv3.2 or older spec bug - zero streams requires 186116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // adding a dummy stream instead. 186216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // TODO: Bug: 17321404 for fixing the HAL spec and removing this workaround. 186316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala if (mOutputStreams.size() == 0) { 186416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala addDummyStreamLocked(); 186516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala } else { 186616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala tryRemoveDummyStreamLocked(); 186716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala } 186816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 1869f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Start configuring the streams 1870f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Starting stream configuration", __FUNCTION__, mId); 1871f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1872f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_configuration config; 18731fa8999c91d5df81949aa723000058380cd3faa2Zhijun He config.operation_mode = mIsConstrainedHighSpeedConfiguration ? 18741fa8999c91d5df81949aa723000058380cd3faa2Zhijun He CAMERA3_STREAM_CONFIGURATION_CONSTRAINED_HIGH_SPEED_MODE : 18751fa8999c91d5df81949aa723000058380cd3faa2Zhijun He CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE; 1876f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala config.num_streams = (mInputStream != NULL) + mOutputStreams.size(); 1877f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1878f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<camera3_stream_t*> streams; 1879f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala streams.setCapacity(config.num_streams); 1880f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1881f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream != NULL) { 1882f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_t *inputStream; 1883f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala inputStream = mInputStream->startConfiguration(); 1884f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (inputStream == NULL) { 18859b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen CLOGE("Can't start input stream configuration"); 18869b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen cancelStreamsConfigurationLocked(); 1887f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1888f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1889f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala streams.add(inputStream); 1890f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1891f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1892f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < mOutputStreams.size(); i++) { 18932fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 18942fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Don't configure bidi streams twice, nor add them twice to the list 18952fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (mOutputStreams[i].get() == 18962fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin static_cast<Camera3StreamInterface*>(mInputStream.get())) { 18972fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 18982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin config.num_streams--; 18992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin continue; 19002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 19012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1902f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_t *outputStream; 1903f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputStream = mOutputStreams.editValueAt(i)->startConfiguration(); 1904f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (outputStream == NULL) { 19059b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen CLOGE("Can't start output stream configuration"); 19069b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen cancelStreamsConfigurationLocked(); 1907f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1908f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1909f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala streams.add(outputStream); 1910f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1911f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1912f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala config.streams = streams.editArray(); 1913f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1914f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Do the HAL configuration; will potentially touch stream 1915f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // max_buffers, usage, priv fields. 191617a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->configure_streams"); 1917f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mHal3Device->ops->configure_streams(mHal3Device, &config); 191817a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 1919f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 19201754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (res == BAD_VALUE) { 19211754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // HAL rejected this set of streams as unsupported, clean up config 19221754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // attempt and return to unconfigured state 19239b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen CLOGE("Set of requested inputs/outputs not supported by HAL"); 19249b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen cancelStreamsConfigurationLocked(); 19251754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala return BAD_VALUE; 19261754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } else if (res != OK) { 19271754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Some other kind of error from configure_streams - this is not 19281754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // expected 1929b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to configure streams with HAL: %s (%d)", 1930b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala strerror(-res), res); 1931f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 1932f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1933f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 19344c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala // Finish all stream configuration immediately. 19354c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala // TODO: Try to relax this later back to lazy completion, which should be 19364c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala // faster 19374c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala 1938073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin if (mInputStream != NULL && mInputStream->isConfiguring()) { 19394c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala res = mInputStream->finishConfiguration(mHal3Device); 19404c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala if (res != OK) { 19419b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen CLOGE("Can't finish configuring input stream %d: %s (%d)", 19424c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala mInputStream->getId(), strerror(-res), res); 19439b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen cancelStreamsConfigurationLocked(); 19449b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen return BAD_VALUE; 19454c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala } 19464c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala } 19474c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala 19484c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala for (size_t i = 0; i < mOutputStreams.size(); i++) { 1949073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin sp<Camera3OutputStreamInterface> outputStream = 1950073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin mOutputStreams.editValueAt(i); 1951073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin if (outputStream->isConfiguring()) { 1952073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin res = outputStream->finishConfiguration(mHal3Device); 1953073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin if (res != OK) { 19549b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen CLOGE("Can't finish configuring output stream %d: %s (%d)", 1955073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin outputStream->getId(), strerror(-res), res); 19569b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen cancelStreamsConfigurationLocked(); 19579b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen return BAD_VALUE; 1958073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin } 19594c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala } 19604c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala } 19614c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala 1962f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Request thread needs to know to avoid using repeat-last-settings protocol 1963f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // across configure_streams() calls 1964c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen mRequestThread->configurationComplete(mIsConstrainedHighSpeedConfiguration); 1965f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1966f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala // Boost priority of request thread for high speed recording to SCHED_FIFO 1967f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala if (mIsConstrainedHighSpeedConfiguration) { 1968f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala pid_t requestThreadTid = mRequestThread->getTid(); 1969f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala res = requestPriority(getpid(), requestThreadTid, 19700f6778e333a0ee3750135e02c259f49382a6896aEino-Ville Talvala kConstrainedHighSpeedThreadPriority, /*asynchronous*/ false); 1971f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala if (res != OK) { 1972f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala ALOGW("Can't set realtime priority for request processing thread: %s (%d)", 1973f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala strerror(-res), res); 1974f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala } else { 1975f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala ALOGD("Set real time priority for request queue thread (tid %d)", requestThreadTid); 1976f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala } 1977f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala } else { 1978f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala // TODO: Set/restore normal priority for normal use cases 1979f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala } 1980f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala 1981f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Update device state 1982f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1983ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala mNeedConfig = false; 1984f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1985183f056393423b344e73f388f21d30379a38e519Ruben Brunk internalUpdateStatusLocked((mDummyStreamId == NO_STREAM) ? 1986183f056393423b344e73f388f21d30379a38e519Ruben Brunk STATUS_CONFIGURED : STATUS_UNCONFIGURED); 1987f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1988f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Stream configuration complete", __FUNCTION__, mId); 1989f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 19900a21051b91c2e07e49eb6fa568c505aee967ab9dZhijun He // tear down the deleted streams after configure streams. 19910a21051b91c2e07e49eb6fa568c505aee967ab9dZhijun He mDeletedStreams.clear(); 19920a21051b91c2e07e49eb6fa568c505aee967ab9dZhijun He 1993f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 19947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 19957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 199616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvalastatus_t Camera3Device::addDummyStreamLocked() { 199716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala ATRACE_CALL(); 199816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala status_t res; 199916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 200016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala if (mDummyStreamId != NO_STREAM) { 200116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // Should never be adding a second dummy stream when one is already 200216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // active 200316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala SET_ERR_L("%s: Camera %d: A dummy stream already exists!", 200416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala __FUNCTION__, mId); 200516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala return INVALID_OPERATION; 200616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala } 200716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 200816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala ALOGV("%s: Camera %d: Adding a dummy stream", __FUNCTION__, mId); 200916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 201016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala sp<Camera3OutputStreamInterface> dummyStream = 201116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala new Camera3DummyStream(mNextStreamId); 201216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 201316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala res = mOutputStreams.add(mNextStreamId, dummyStream); 201416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala if (res < 0) { 201516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala SET_ERR_L("Can't add dummy stream to set: %s (%d)", strerror(-res), res); 201616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala return res; 201716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala } 201816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 201916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala mDummyStreamId = mNextStreamId; 202016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala mNextStreamId++; 202116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 202216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala return OK; 202316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala} 202416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 202516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvalastatus_t Camera3Device::tryRemoveDummyStreamLocked() { 202616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala ATRACE_CALL(); 202716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala status_t res; 202816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 202916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala if (mDummyStreamId == NO_STREAM) return OK; 203016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala if (mOutputStreams.size() == 1) return OK; 203116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 203216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala ALOGV("%s: Camera %d: Removing the dummy stream", __FUNCTION__, mId); 203316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 203416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // Ok, have a dummy stream and there's at least one other output stream, 203516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // so remove the dummy 203616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 203716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala sp<Camera3StreamInterface> deletedStream; 203816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala ssize_t outputStreamIdx = mOutputStreams.indexOfKey(mDummyStreamId); 203916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala if (outputStreamIdx == NAME_NOT_FOUND) { 204016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala SET_ERR_L("Dummy stream %d does not appear to exist", mDummyStreamId); 204116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala return INVALID_OPERATION; 204216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala } 204316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 204416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala deletedStream = mOutputStreams.editValueAt(outputStreamIdx); 204516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala mOutputStreams.removeItemsAt(outputStreamIdx); 204616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 204716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // Free up the stream endpoint so that it can be used by some other stream 204816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala res = deletedStream->disconnect(); 204916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala if (res != OK) { 205016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala SET_ERR_L("Can't disconnect deleted dummy stream %d", mDummyStreamId); 205116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // fall through since we want to still list the stream as deleted. 205216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala } 205316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala mDeletedStreams.add(deletedStream); 205416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala mDummyStreamId = NO_STREAM; 205516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 205616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala return res; 205716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala} 205816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 2059b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorState(const char *fmt, ...) { 2060b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala Mutex::Autolock l(mLock); 2061b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_list args; 2062b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_start(args, fmt); 2063b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 2064b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala setErrorStateLockedV(fmt, args); 2065b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 2066b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_end(args); 2067b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 2068b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 2069b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateV(const char *fmt, va_list args) { 2070b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala Mutex::Autolock l(mLock); 2071b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala setErrorStateLockedV(fmt, args); 2072b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 2073b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 2074b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateLocked(const char *fmt, ...) { 2075b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_list args; 2076b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_start(args, fmt); 2077b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 2078b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala setErrorStateLockedV(fmt, args); 2079b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 2080b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_end(args); 2081b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 2082b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 2083b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateLockedV(const char *fmt, va_list args) { 208442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Print out all error messages to log 208542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala String8 errorCause = String8::formatV(fmt, args); 208642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ALOGE("Camera %d: %s", mId, errorCause.string()); 208742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 208842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // But only do error state transition steps for the first error 2089b05eeaedacaff92b6e5ac89f99b0fccdf7643f09Zhijun He if (mStatus == STATUS_ERROR || mStatus == STATUS_UNINITIALIZED) return; 2090b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 209142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mErrorCause = errorCause; 209242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 209342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mRequestThread->setPaused(true); 2094183f056393423b344e73f388f21d30379a38e519Ruben Brunk internalUpdateStatusLocked(STATUS_ERROR); 20951754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 20961754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Notify upstream about a device error 20971754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (mListener != NULL) { 2098d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mListener->notifyError(hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE, 20991754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala CaptureResultExtras()); 21001754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 21011754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 21021754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Save stack trace. View by dumping it later. 21031754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala CameraTraces::saveTrace(); 21041754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // TODO: consider adding errorCause and client pid/procname 2105b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 2106f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2107f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 210842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala * In-flight request management 210942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala */ 211042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 2111cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::registerInFlight(uint32_t frameNumber, 2112d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen int32_t numBuffers, CaptureResultExtras resultExtras, bool hasInput, 2113d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen const AeTriggerCancelOverride_t &aeTriggerCancelOverride) { 211442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ATRACE_CALL(); 211542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex::Autolock l(mInFlightLock); 211642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 211742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ssize_t res; 2118d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen res = mInFlightMap.add(frameNumber, InFlightRequest(numBuffers, resultExtras, hasInput, 2119d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen aeTriggerCancelOverride)); 212042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (res < 0) return res; 212142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 212242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return OK; 212342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala} 212442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 212543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chenvoid Camera3Device::returnOutputBuffers( 212643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen const camera3_stream_buffer_t *outputBuffers, size_t numBuffers, 212743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen nsecs_t timestamp) { 212843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen for (size_t i = 0; i < numBuffers; i++) 212943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen { 213043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen Camera3Stream *stream = Camera3Stream::cast(outputBuffers[i].stream); 213143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen status_t res = stream->returnBuffer(outputBuffers[i], timestamp); 213243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Note: stream may be deallocated at this point, if this buffer was 213343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // the last reference to it. 213443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (res != OK) { 213543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ALOGE("Can't return buffer to its stream: %s (%d)", 213643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen strerror(-res), res); 213743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 213843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 213943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen} 214043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 214143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 214243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chenvoid Camera3Device::removeInFlightRequestIfReadyLocked(int idx) { 214343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 214443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen const InFlightRequest &request = mInFlightMap.valueAt(idx); 214543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen const uint32_t frameNumber = mInFlightMap.keyAt(idx); 214643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 214743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen nsecs_t sensorTimestamp = request.sensorTimestamp; 214843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen nsecs_t shutterTimestamp = request.shutterTimestamp; 214943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 215043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Check if it's okay to remove the request from InFlightMap: 215143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // In the case of a successful request: 215243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // all input and output buffers, all result metadata, shutter callback 215343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // arrived. 215443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // In the case of a unsuccessful request: 215543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // all input and output buffers arrived. 215643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (request.numBuffersLeft == 0 && 215743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen (request.requestStatus != OK || 215843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen (request.haveResultMetadata && shutterTimestamp != 0))) { 215943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ATRACE_ASYNC_END("frame capture", frameNumber); 216043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 216143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Sanity check - if sensor timestamp matches shutter timestamp 216243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (request.requestStatus == OK && 216343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen sensorTimestamp != shutterTimestamp) { 216443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen SET_ERR("sensor timestamp (%" PRId64 216543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ") for frame %d doesn't match shutter timestamp (%" PRId64 ")", 216643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen sensorTimestamp, frameNumber, shutterTimestamp); 216743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 216843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 216943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // for an unsuccessful request, it may have pending output buffers to 217043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // return. 217143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen assert(request.requestStatus != OK || 217243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen request.pendingOutputBuffers.size() == 0); 217343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen returnOutputBuffers(request.pendingOutputBuffers.array(), 217443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen request.pendingOutputBuffers.size(), 0); 217543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 217643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen mInFlightMap.removeItemsAt(idx, 1); 217743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 217843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ALOGVV("%s: removed frame %d from InFlightMap", __FUNCTION__, frameNumber); 217943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 218043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 218143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Sanity check - if we have too many in-flight frames, something has 218243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // likely gone wrong 2183c96ac8dfcae66a45b7ae67b82dabdf19f60f859dChien-Yu Chen if (!mIsConstrainedHighSpeedConfiguration && mInFlightMap.size() > kInFlightWarnLimit) { 218443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen CLOGE("In-flight list too large: %zu", mInFlightMap.size()); 2185c96ac8dfcae66a45b7ae67b82dabdf19f60f859dChien-Yu Chen } else if (mIsConstrainedHighSpeedConfiguration && mInFlightMap.size() > 2186c96ac8dfcae66a45b7ae67b82dabdf19f60f859dChien-Yu Chen kInFlightWarnLimitHighSpeed) { 2187c96ac8dfcae66a45b7ae67b82dabdf19f60f859dChien-Yu Chen CLOGE("In-flight list too large for high speed configuration: %zu", 2188c96ac8dfcae66a45b7ae67b82dabdf19f60f859dChien-Yu Chen mInFlightMap.size()); 218943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 219043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen} 219143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 21925cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chenvoid Camera3Device::insertResultLocked(CaptureResult *result, uint32_t frameNumber, 21935cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen const AeTriggerCancelOverride_t &aeTriggerCancelOverride) { 21945cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen if (result == nullptr) return; 21955cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen 21965cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen if (result->mMetadata.update(ANDROID_REQUEST_FRAME_COUNT, 21975cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen (int32_t*)&frameNumber, 1) != OK) { 21985cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen SET_ERR("Failed to set frame number %d in metadata", frameNumber); 21995cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen return; 22005cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen } 22015cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen 22025cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen if (result->mMetadata.update(ANDROID_REQUEST_ID, &result->mResultExtras.requestId, 1) != OK) { 22035cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen SET_ERR("Failed to set request ID in metadata for frame %d", frameNumber); 22045cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen return; 22055cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen } 22065cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen 22075cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen overrideResultForPrecaptureCancel(&result->mMetadata, aeTriggerCancelOverride); 22085cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen 22095cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen // Valid result, insert into queue 22105cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen List<CaptureResult>::iterator queuedResult = 22115cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen mResultQueue.insert(mResultQueue.end(), CaptureResult(*result)); 22125cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen ALOGVV("%s: result requestId = %" PRId32 ", frameNumber = %" PRId64 22135cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen ", burstId = %" PRId32, __FUNCTION__, 22145cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen queuedResult->mResultExtras.requestId, 22155cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen queuedResult->mResultExtras.frameNumber, 22165cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen queuedResult->mResultExtras.burstId); 22175cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen 22185cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen mResultSignal.signal(); 22195cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen} 22205cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen 22215cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen 22225cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chenvoid Camera3Device::sendPartialCaptureResult(const camera_metadata_t * partialResult, 22235cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen const CaptureResultExtras &resultExtras, uint32_t frameNumber, 22245cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen const AeTriggerCancelOverride_t &aeTriggerCancelOverride) { 22255cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen Mutex::Autolock l(mOutputLock); 22265cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen 22275cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen CaptureResult captureResult; 22285cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen captureResult.mResultExtras = resultExtras; 22295cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen captureResult.mMetadata = partialResult; 22305cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen 22315cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen insertResultLocked(&captureResult, frameNumber, aeTriggerCancelOverride); 22325cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen} 22335cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen 223443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 223543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chenvoid Camera3Device::sendCaptureResult(CameraMetadata &pendingMetadata, 223643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen CaptureResultExtras &resultExtras, 223743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen CameraMetadata &collectedPartialResult, 2238618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen uint32_t frameNumber, 2239d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen bool reprocess, 2240d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen const AeTriggerCancelOverride_t &aeTriggerCancelOverride) { 224143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (pendingMetadata.isEmpty()) 224243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen return; 224343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 224443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen Mutex::Autolock l(mOutputLock); 224543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 224643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // TODO: need to track errors for tighter bounds on expected frame number 2247618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen if (reprocess) { 2248618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen if (frameNumber < mNextReprocessResultFrameNumber) { 2249618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen SET_ERR("Out-of-order reprocess capture result metadata submitted! " 225043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen "(got frame number %d, expecting %d)", 2251618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen frameNumber, mNextReprocessResultFrameNumber); 2252618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen return; 2253618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } 2254618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen mNextReprocessResultFrameNumber = frameNumber + 1; 2255618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } else { 2256618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen if (frameNumber < mNextResultFrameNumber) { 2257618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen SET_ERR("Out-of-order capture result metadata submitted! " 2258618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen "(got frame number %d, expecting %d)", 2259618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen frameNumber, mNextResultFrameNumber); 2260618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen return; 2261618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } 2262618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen mNextResultFrameNumber = frameNumber + 1; 226343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 226443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 226543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen CaptureResult captureResult; 226643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen captureResult.mResultExtras = resultExtras; 226743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen captureResult.mMetadata = pendingMetadata; 226843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 226943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Append any previous partials to form a complete result 227043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (mUsePartialResult && !collectedPartialResult.isEmpty()) { 227143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen captureResult.mMetadata.append(collectedPartialResult); 227243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 227343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 22744c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh // Derive some new keys for backward compaibility 22754c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh if (mDerivePostRawSensKey && !captureResult.mMetadata.exists( 22764c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST)) { 22774c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh int32_t defaultBoost[1] = {100}; 22784c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh captureResult.mMetadata.update( 22794c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST, 22804c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh defaultBoost, 1); 22814c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh } 22824c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh 228343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen captureResult.mMetadata.sort(); 228443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 228543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Check that there's a timestamp in the result metadata 22865cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen camera_metadata_entry entry = captureResult.mMetadata.find(ANDROID_SENSOR_TIMESTAMP); 228743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (entry.count == 0) { 228843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen SET_ERR("No timestamp provided by HAL for frame %d!", 228943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen frameNumber); 229043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen return; 229143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 229243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 22935cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen insertResultLocked(&captureResult, frameNumber, aeTriggerCancelOverride); 229443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen} 229543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 2296fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala/** 2297f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera HAL device callback methods 2298f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 2299f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 23007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::processCaptureResult(const camera3_capture_result *result) { 23017d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ATRACE_CALL(); 23027d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 23037d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala status_t res; 23047d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 230542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t frameNumber = result->frame_number; 2306f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He if (result->result == NULL && result->num_output_buffers == 0 && 2307f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He result->input_buffer == NULL) { 230842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("No result data provided by HAL for frame %d", 230942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 23107d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return; 23117d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 2312204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 2313204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // For HAL3.2 or above, If HAL doesn't support partial, it must always set 2314204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // partial_result to 1 when metadata is included in this result. 2315204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (!mUsePartialResult && 2316204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2 && 2317204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He result->result != NULL && 2318204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He result->partial_result != 1) { 2319204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He SET_ERR("Result is malformed for frame %d: partial_result %u must be 1" 2320204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He " if partial result is not supported", 2321204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He frameNumber, result->partial_result); 2322204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He return; 2323204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 2324204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 2325204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He bool isPartialResult = false; 2326204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He CameraMetadata collectedPartialResult; 2327cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResultExtras resultExtras; 2328c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He bool hasInputBufferInRequest = false; 23297d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 233043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Get shutter timestamp and resultExtras from list of in-flight requests, 233143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // where it was added by the shutter notification for this frame. If the 233243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // shutter timestamp isn't received yet, append the output buffers to the 233343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // in-flight request and they will be returned when the shutter timestamp 233443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // arrives. Update the in-flight status and remove the in-flight entry if 233543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // all result data and shutter timestamp have been received. 233643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen nsecs_t shutterTimestamp = 0; 233743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 233842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala { 233942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex::Autolock l(mInFlightLock); 234042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ssize_t idx = mInFlightMap.indexOfKey(frameNumber); 234142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (idx == NAME_NOT_FOUND) { 234242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Unknown frame number for capture result: %d", 234342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 234442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return; 234542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 234642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightRequest &request = mInFlightMap.editValueAt(idx); 234743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ALOGVV("%s: got InFlightRequest requestId = %" PRId32 234843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ", frameNumber = %" PRId64 ", burstId = %" PRId32 234943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ", partialResultCount = %d", 235043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen __FUNCTION__, request.resultExtras.requestId, 235143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen request.resultExtras.frameNumber, request.resultExtras.burstId, 235243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen result->partial_result); 235343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Always update the partial count to the latest one if it's not 0 235443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // (buffers only). When framework aggregates adjacent partial results 235543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // into one, the latest partial count will be used. 235643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (result->partial_result != 0) 235743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen request.resultExtras.partialResultCount = result->partial_result; 2358fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 2359fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Check if this result carries only partial metadata 2360204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (mUsePartialResult && result->result != NULL) { 2361204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 2362204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (result->partial_result > mNumPartialResults || result->partial_result < 1) { 2363204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He SET_ERR("Result is malformed for frame %d: partial_result %u must be in" 2364204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He " the range of [1, %d] when metadata is included in the result", 2365204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He frameNumber, result->partial_result, mNumPartialResults); 2366204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He return; 2367204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 2368204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He isPartialResult = (result->partial_result < mNumPartialResults); 23695d76e1a639c1bae9ea7d9af1124abf1c94353344Zhijun He if (isPartialResult) { 23705cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen request.collectedPartialResult.append(result->result); 23715d76e1a639c1bae9ea7d9af1124abf1c94353344Zhijun He } 2372204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } else { 2373204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He camera_metadata_ro_entry_t partialResultEntry; 2374204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He res = find_camera_metadata_ro_entry(result->result, 2375204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He ANDROID_QUIRKS_PARTIAL_RESULT, &partialResultEntry); 2376204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (res != NAME_NOT_FOUND && 2377204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He partialResultEntry.count > 0 && 2378204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He partialResultEntry.data.u8[0] == 2379204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He ANDROID_QUIRKS_PARTIAL_RESULT_PARTIAL) { 2380204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // A partial result. Flag this as such, and collect this 2381204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // set of metadata into the in-flight entry. 2382204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He isPartialResult = true; 23835cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen request.collectedPartialResult.append( 2384204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He result->result); 23855cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen request.collectedPartialResult.erase( 2386204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He ANDROID_QUIRKS_PARTIAL_RESULT); 2387204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 2388204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 2389204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 2390204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (isPartialResult) { 23915cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen // Send partial capture result 23925cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen sendPartialCaptureResult(result->result, request.resultExtras, frameNumber, 23935cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen request.aeTriggerCancelOverride); 2394fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 2395fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 2396fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 239743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen shutterTimestamp = request.shutterTimestamp; 2398c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He hasInputBufferInRequest = request.hasInputBuffer; 2399cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 2400fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Did we get the (final) result metadata for this capture? 2401204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (result->result != NULL && !isPartialResult) { 240242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (request.haveResultMetadata) { 240342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Called multiple times with metadata for frame %d", 240442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 240542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return; 240642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 2407204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (mUsePartialResult && 24085cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen !request.collectedPartialResult.isEmpty()) { 2409204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He collectedPartialResult.acquire( 24105cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen request.collectedPartialResult); 2411fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 241242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala request.haveResultMetadata = true; 241342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 241442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 2415c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He uint32_t numBuffersReturned = result->num_output_buffers; 2416c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He if (result->input_buffer != NULL) { 2417c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He if (hasInputBufferInRequest) { 2418c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He numBuffersReturned += 1; 2419c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He } else { 2420c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He ALOGW("%s: Input buffer should be NULL if there is no input" 2421c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He " buffer sent in the request", 2422c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He __FUNCTION__); 2423c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He } 2424c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He } 2425c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He request.numBuffersLeft -= numBuffersReturned; 242642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (request.numBuffersLeft < 0) { 242742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Too many buffers returned for frame %d", 242842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 242942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return; 243042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 243142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 243243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen camera_metadata_ro_entry_t entry; 243343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen res = find_camera_metadata_ro_entry(result->result, 243443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ANDROID_SENSOR_TIMESTAMP, &entry); 243543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (res == OK && entry.count == 1) { 243643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen request.sensorTimestamp = entry.data.i64[0]; 243742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 2438fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 243943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // If shutter event isn't received yet, append the output buffers to 244043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // the in-flight request. Otherwise, return the output buffers to 244143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // streams. 244243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (shutterTimestamp == 0) { 244343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen request.pendingOutputBuffers.appendArray(result->output_buffers, 244443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen result->num_output_buffers); 2445d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin } else { 244643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen returnOutputBuffers(result->output_buffers, 244743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen result->num_output_buffers, shutterTimestamp); 2448d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin } 24497d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 245043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (result->result != NULL && !isPartialResult) { 245143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (shutterTimestamp == 0) { 245243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen request.pendingMetadata = result->result; 24535cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen request.collectedPartialResult = collectedPartialResult; 245443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } else { 245543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen CameraMetadata metadata; 245643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen metadata = result->result; 245743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen sendCaptureResult(metadata, request.resultExtras, 2458d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen collectedPartialResult, frameNumber, hasInputBufferInRequest, 2459d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request.aeTriggerCancelOverride); 246043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 24617d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 246242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 246343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen removeInFlightRequestIfReadyLocked(idx); 246443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } // scope for mInFlightLock 24657d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 2466f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He if (result->input_buffer != NULL) { 2467c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He if (hasInputBufferInRequest) { 2468c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He Camera3Stream *stream = 2469c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He Camera3Stream::cast(result->input_buffer->stream); 2470c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He res = stream->returnInputBuffer(*(result->input_buffer)); 2471c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He // Note: stream may be deallocated at this point, if this buffer was the 2472c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He // last reference to it. 2473c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He if (res != OK) { 2474c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He ALOGE("%s: RequestThread: Can't return input buffer for frame %d to" 2475c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He " its stream:%s (%d)", __FUNCTION__, 2476c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He frameNumber, strerror(-res), res); 24770ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He } 24780ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He } else { 24790ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He ALOGW("%s: Input buffer should be NULL if there is no input" 24800ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He " buffer sent in the request, skipping input buffer return.", 24810ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He __FUNCTION__); 2482f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He } 2483f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He } 24847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 24857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 24867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::notify(const camera3_notify_msg *msg) { 248717a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_CALL(); 24887d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala NotificationListener *listener; 24897d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala { 24907d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 24917d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala listener = mListener; 24927d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 24937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 24947d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (msg == NULL) { 249542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("HAL sent NULL notify message!"); 24967d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return; 24977d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 24987d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 24997d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala switch (msg->type) { 25007d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala case CAMERA3_MSG_ERROR: { 25011754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala notifyError(msg->message.error, listener); 25021754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala break; 25031754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 25041754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala case CAMERA3_MSG_SHUTTER: { 25051754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala notifyShutter(msg->message.shutter, listener); 25061754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala break; 25071754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 25081754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala default: 25091754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala SET_ERR("Unknown notify message from HAL: %d", 25101754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala msg->type); 25111754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 25121754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala} 25131754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 25141754351d9199721e7e7943461689e399ef015260Eino-Ville Talvalavoid Camera3Device::notifyError(const camera3_error_msg_t &msg, 25151754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala NotificationListener *listener) { 25161754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 25171754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Map camera HAL error codes to ICameraDeviceCallback error codes 25181754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Index into this with the HAL error code 2519d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala static const int32_t halErrorMap[CAMERA3_MSG_NUM_ERRORS] = { 25201754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // 0 = Unused error code 2521d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_INVALID_ERROR, 25221754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // 1 = CAMERA3_MSG_ERROR_DEVICE 2523d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE, 25241754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // 2 = CAMERA3_MSG_ERROR_REQUEST 2525d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST, 25261754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // 3 = CAMERA3_MSG_ERROR_RESULT 2527d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT, 25281754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // 4 = CAMERA3_MSG_ERROR_BUFFER 2529d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER 25301754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala }; 25311754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 2532d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t errorCode = 25331754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ((msg.error_code >= 0) && 25341754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala (msg.error_code < CAMERA3_MSG_NUM_ERRORS)) ? 25351754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala halErrorMap[msg.error_code] : 2536d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_INVALID_ERROR; 25371754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 25381754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala int streamId = 0; 25391754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (msg.error_stream != NULL) { 25401754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala Camera3Stream *stream = 25411754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala Camera3Stream::cast(msg.error_stream); 25421754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala streamId = stream->getId(); 25431754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 25441754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ALOGV("Camera %d: %s: HAL error, frame %d, stream %d: %d", 25451754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala mId, __FUNCTION__, msg.frame_number, 25461754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala streamId, msg.error_code); 25471d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He 25481754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala CaptureResultExtras resultExtras; 25491754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala switch (errorCode) { 2550d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE: 25511754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // SET_ERR calls notifyError 25521754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala SET_ERR("Camera HAL reported serious device error"); 25531754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala break; 2554d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST: 2555d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT: 2556d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER: 25571d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He { 25581d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He Mutex::Autolock l(mInFlightLock); 25591754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ssize_t idx = mInFlightMap.indexOfKey(msg.frame_number); 25601d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He if (idx >= 0) { 2561cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei InFlightRequest &r = mInFlightMap.editValueAt(idx); 25621754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala r.requestStatus = msg.error_code; 2563cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei resultExtras = r.resultExtras; 2564cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } else { 25651754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala resultExtras.frameNumber = msg.frame_number; 25661754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ALOGE("Camera %d: %s: cannot find in-flight request on " 25671754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala "frame %" PRId64 " error", mId, __FUNCTION__, 25681754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala resultExtras.frameNumber); 25691d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He } 25701d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He } 2571e95bb6312b972117a0ee70eabf78fcd118018f61Eino-Ville Talvala resultExtras.errorStreamId = streamId; 257242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (listener != NULL) { 25731754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala listener->notifyError(errorCode, resultExtras); 2574cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } else { 2575cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGE("Camera %d: %s: no listener available", mId, __FUNCTION__); 257642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 25777d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala break; 25781754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala default: 25791754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // SET_ERR calls notifyError 25801754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala SET_ERR("Unknown error message from HAL: %d", msg.error_code); 25811754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala break; 25821754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 25831754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala} 25841754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 25851754351d9199721e7e7943461689e399ef015260Eino-Ville Talvalavoid Camera3Device::notifyShutter(const camera3_shutter_msg_t &msg, 25861754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala NotificationListener *listener) { 25871754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ssize_t idx; 258842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 25891754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Set timestamp for the request in the in-flight tracking 25901754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // and get the request ID to send upstream 25911754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala { 25921754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala Mutex::Autolock l(mInFlightLock); 25931754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala idx = mInFlightMap.indexOfKey(msg.frame_number); 25941754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (idx >= 0) { 25951754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala InFlightRequest &r = mInFlightMap.editValueAt(idx); 259643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 25973df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen // Verify ordering of shutter notifications 25983df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen { 25993df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen Mutex::Autolock l(mOutputLock); 26003df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen // TODO: need to track errors for tighter bounds on expected frame number. 26013df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen if (r.hasInputBuffer) { 26023df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen if (msg.frame_number < mNextReprocessShutterFrameNumber) { 26033df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen SET_ERR("Shutter notification out-of-order. Expected " 26043df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen "notification for frame %d, got frame %d", 26053df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen mNextReprocessShutterFrameNumber, msg.frame_number); 26063df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen return; 26073df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen } 26083df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen mNextReprocessShutterFrameNumber = msg.frame_number + 1; 26093df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen } else { 26103df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen if (msg.frame_number < mNextShutterFrameNumber) { 26113df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen SET_ERR("Shutter notification out-of-order. Expected " 26123df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen "notification for frame %d, got frame %d", 26133df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen mNextShutterFrameNumber, msg.frame_number); 26143df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen return; 26153df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen } 26163df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen mNextShutterFrameNumber = msg.frame_number + 1; 26173df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen } 26183df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen } 26193df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen 262043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ALOGVV("Camera %d: %s: Shutter fired for frame %d (id %d) at %" PRId64, 262143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen mId, __FUNCTION__, 262243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen msg.frame_number, r.resultExtras.requestId, msg.timestamp); 262343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Call listener, if any 262443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (listener != NULL) { 262543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen listener->notifyShutter(r.resultExtras, msg.timestamp); 262643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 262743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 262843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen r.shutterTimestamp = msg.timestamp; 262943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 263043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // send pending result and buffers 263143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen sendCaptureResult(r.pendingMetadata, r.resultExtras, 26325cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen r.collectedPartialResult, msg.frame_number, 2633d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen r.hasInputBuffer, r.aeTriggerCancelOverride); 263443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen returnOutputBuffers(r.pendingOutputBuffers.array(), 263543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen r.pendingOutputBuffers.size(), r.shutterTimestamp); 263643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen r.pendingOutputBuffers.clear(); 263743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 263843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen removeInFlightRequestIfReadyLocked(idx); 26397d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 26401754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 26411754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (idx < 0) { 26421754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala SET_ERR("Shutter notification for non-existent frame number %d", 26431754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala msg.frame_number); 26447d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 26457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 26467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 26471754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 2648f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville TalvalaCameraMetadata Camera3Device::getLatestRequestLocked() { 26491e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin ALOGV("%s", __FUNCTION__); 26501e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 26511e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin CameraMetadata retVal; 26521e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 26531e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin if (mRequestThread != NULL) { 26541e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin retVal = mRequestThread->getLatestRequest(); 26551e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin } 26561e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 26571e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin return retVal; 26581e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin} 26591e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 2660cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 26617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/** 2662f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * RequestThread inner class methods 2663f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 2664f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2665f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville TalvalaCamera3Device::RequestThread::RequestThread(wp<Camera3Device> parent, 2666f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker, 2667ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen camera3_device_t *hal3Device, 2668ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen bool aeLockAvailable) : 26694d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Thread(/*canCallJava*/false), 2670f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mParent(parent), 2671f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker(statusTracker), 2672f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device(hal3Device), 267377c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala mListener(nullptr), 267442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mId(getId(parent)), 2675f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mReconfigured(false), 2676f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDoPause(false), 2677f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused(true), 26784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mFrameNumber(0), 2679cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei mLatestRequestId(NAME_NOT_FOUND), 2680c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh mCurrentAfTriggerId(0), 2681c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh mCurrentPreCaptureTriggerId(0), 2682d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mRepeatingLastFrameNumber( 2683d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES), 2684c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen mAeLockAvailable(aeLockAvailable), 2685c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen mPrepareVideoStream(false) { 2686f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusId = statusTracker->addComponent(); 2687f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2688f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 26894d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvalavoid Camera3Device::RequestThread::setNotificationListener( 26901754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala NotificationListener *listener) { 26911754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala Mutex::Autolock l(mRequestLock); 26921754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala mListener = listener; 26931754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala} 26941754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 2695c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chenvoid Camera3Device::RequestThread::configurationComplete(bool isConstrainedHighSpeed) { 2696f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 2697f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mReconfigured = true; 2698c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen // Prepare video stream for high speed recording. 2699c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen mPrepareVideoStream = isConstrainedHighSpeed; 2700f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2701f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 270290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::RequestThread::queueRequestList( 27032d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei List<sp<CaptureRequest> > &requests, 27042d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 27052d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber) { 270690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei Mutex::Autolock l(mRequestLock); 270790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei for (List<sp<CaptureRequest> >::iterator it = requests.begin(); it != requests.end(); 270890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ++it) { 270990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei mRequestQueue.push_back(*it); 271090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 271190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 27122d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (lastFrameNumber != NULL) { 27132d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber = mFrameNumber + mRequestQueue.size() - 1; 27142d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGV("%s: requestId %d, mFrameNumber %" PRId32 ", lastFrameNumber %" PRId64 ".", 27152d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei __FUNCTION__, (*(requests.begin()))->mResultExtras.requestId, mFrameNumber, 27162d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber); 27172d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 2718cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 271990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei unpauseForNewRequests(); 272090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 272190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return OK; 272290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 272390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 27244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTrigger( 27264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[], 27274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin size_t count) { 27284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock l(mTriggerMutex); 27304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t ret; 27314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < count; ++i) { 27334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ret = queueTriggerLocked(trigger[i]); 27344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (ret != OK) { 27364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return ret; 27374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 27384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 27394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 27414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 27424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 274342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvalaint Camera3Device::RequestThread::getId(const wp<Camera3Device> &device) { 274442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala sp<Camera3Device> d = device.promote(); 274542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (d != NULL) return d->mId; 274642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return 0; 274742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala} 274842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 27494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTriggerLocked( 27504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger) { 27514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t tag = trigger.metadataTag; 27534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ssize_t index = mTriggerMap.indexOfKey(tag); 27544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin switch (trigger.getTagType()) { 27564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_BYTE: 27574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // fall-through 27584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_INT32: 27594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 27604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin default: 276142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ALOGE("%s: Type not supported: 0x%x", __FUNCTION__, 276242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala trigger.getTagType()); 27634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return INVALID_OPERATION; 27644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 27654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 27674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Collect only the latest trigger, since we only have 1 field 27684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * in the request settings per trigger tag, and can't send more than 1 27694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * trigger per request. 27704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 27714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (index != NAME_NOT_FOUND) { 27724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerMap.editValueAt(index) = trigger; 27734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } else { 27744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerMap.add(tag, trigger); 27754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 27764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 27774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 27784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 27794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2780f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::setRepeatingRequests( 27812d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei const RequestList &requests, 27822d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 27832d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber) { 2784f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 27852d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (lastFrameNumber != NULL) { 27862d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber = mRepeatingLastFrameNumber; 27872d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 2788f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRepeatingRequests.clear(); 2789f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRepeatingRequests.insert(mRepeatingRequests.begin(), 2790f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala requests.begin(), requests.end()); 279126fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala 279226fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala unpauseForNewRequests(); 279326fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala 2794d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mRepeatingLastFrameNumber = hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES; 2795f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 2796f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2797f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 27988684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yehbool Camera3Device::RequestThread::isRepeatingRequestLocked(const sp<CaptureRequest> requestIn) { 27998684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh if (mRepeatingRequests.empty()) { 28008684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh return false; 28018684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh } 28028684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh int32_t requestId = requestIn->mResultExtras.requestId; 28038684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh const RequestList &repeatRequests = mRepeatingRequests; 28048684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh // All repeating requests are guaranteed to have same id so only check first quest 28058684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh const sp<CaptureRequest> firstRequest = *repeatRequests.begin(); 28068684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh return (firstRequest->mResultExtras.requestId == requestId); 28078684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh} 28088684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh 28092d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Weistatus_t Camera3Device::RequestThread::clearRepeatingRequests(/*out*/int64_t *lastFrameNumber) { 2810f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 2811e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen return clearRepeatingRequestsLocked(lastFrameNumber); 2812e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen 2813e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen} 2814e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen 2815e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chenstatus_t Camera3Device::RequestThread::clearRepeatingRequestsLocked(/*out*/int64_t *lastFrameNumber) { 2816f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRepeatingRequests.clear(); 28172d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (lastFrameNumber != NULL) { 28182d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber = mRepeatingLastFrameNumber; 28192d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 2820d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mRepeatingLastFrameNumber = hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES; 2821f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 2822f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2823f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 28241754351d9199721e7e7943461689e399ef015260Eino-Ville Talvalastatus_t Camera3Device::RequestThread::clear( 28251754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala NotificationListener *listener, 28261754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala /*out*/int64_t *lastFrameNumber) { 2827abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala Mutex::Autolock l(mRequestLock); 28282d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGV("RequestThread::%s:", __FUNCTION__); 28291754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 2830abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala mRepeatingRequests.clear(); 28318684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh 28321754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Send errors for all requests pending in the request queue, including 28331754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // pending repeating requests 28341754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (listener != NULL) { 28351754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala for (RequestList::iterator it = mRequestQueue.begin(); 28361754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala it != mRequestQueue.end(); ++it) { 2837c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen // Abort the input buffers for reprocess requests. 2838c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen if ((*it)->mInputStream != NULL) { 2839c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen camera3_stream_buffer_t inputBuffer; 2840c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen status_t res = (*it)->mInputStream->getInputBuffer(&inputBuffer); 2841c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen if (res != OK) { 2842c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen ALOGW("%s: %d: couldn't get input buffer while clearing the request " 2843c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen "list: %s (%d)", __FUNCTION__, __LINE__, strerror(-res), res); 2844c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen } else { 2845c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen res = (*it)->mInputStream->returnInputBuffer(inputBuffer); 2846c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen if (res != OK) { 2847c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen ALOGE("%s: %d: couldn't return input buffer while clearing the request " 2848c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen "list: %s (%d)", __FUNCTION__, __LINE__, strerror(-res), res); 2849c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen } 2850c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen } 2851c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen } 28521754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Set the frame number this request would have had, if it 28531754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // had been submitted; this frame number will not be reused. 28541754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // The requestId and burstId fields were set when the request was 28551754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // submitted originally (in convertMetadataListToRequestListLocked) 28561754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala (*it)->mResultExtras.frameNumber = mFrameNumber++; 2857d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala listener->notifyError(hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST, 28581754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala (*it)->mResultExtras); 28598684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh } 28608684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh } 2861abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala mRequestQueue.clear(); 2862abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala mTriggerMap.clear(); 28632d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (lastFrameNumber != NULL) { 28642d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber = mRepeatingLastFrameNumber; 28652d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 2866d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mRepeatingLastFrameNumber = hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES; 2867abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala return OK; 2868abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala} 2869abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 287085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chenstatus_t Camera3Device::RequestThread::flush() { 287185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen ATRACE_CALL(); 287285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen Mutex::Autolock l(mFlushLock); 287385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 287485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (mHal3Device->common.version >= CAMERA_DEVICE_API_VERSION_3_1) { 287585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen return mHal3Device->ops->flush(mHal3Device); 287685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 287785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 287885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen return -ENOTSUP; 287985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen} 288085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 2881f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::setPaused(bool paused) { 2882f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mPauseLock); 2883f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDoPause = paused; 2884f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDoPauseSignal.signal(); 2885f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2886f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 28874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::waitUntilRequestProcessed( 28884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t requestId, nsecs_t timeout) { 28894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock l(mLatestRequestMutex); 28904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res; 28914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin while (mLatestRequestId != requestId) { 28924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin nsecs_t startTime = systemTime(); 28934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 28944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = mLatestRequestSignal.waitRelative(mLatestRequestMutex, timeout); 28954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) return res; 28964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 28974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin timeout -= (systemTime() - startTime); 28984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 28994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 29004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 29014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 29024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2903f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid Camera3Device::RequestThread::requestExit() { 2904f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Call parent to set up shutdown 2905f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Thread::requestExit(); 2906f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // The exit from any possible waits 2907f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mDoPauseSignal.signal(); 2908f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestSignal.signal(); 2909f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 29104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2911d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 2912d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen/** 2913d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * For devices <= CAMERA_DEVICE_API_VERSION_3_2, AE_PRECAPTURE_TRIGGER_CANCEL is not supported so 2914d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * we need to override AE_PRECAPTURE_TRIGGER_CANCEL to AE_PRECAPTURE_TRIGGER_IDLE and AE_LOCK_OFF 2915d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * to AE_LOCK_ON to start cancelling AE precapture. If AE lock is not available, it still overrides 2916d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * AE_PRECAPTURE_TRIGGER_CANCEL to AE_PRECAPTURE_TRIGGER_IDLE but doesn't add AE_LOCK_ON to the 2917d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * request. 2918d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen */ 2919d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chenvoid Camera3Device::RequestThread::handleAePrecaptureCancelRequest(sp<CaptureRequest> request) { 2920d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mAeTriggerCancelOverride.applyAeLock = false; 2921d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mAeTriggerCancelOverride.applyAePrecaptureTrigger = false; 2922d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 2923d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen if (mHal3Device->common.version > CAMERA_DEVICE_API_VERSION_3_2) { 2924d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen return; 2925d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen } 2926d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 2927d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen camera_metadata_entry_t aePrecaptureTrigger = 2928d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mSettings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER); 2929d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen if (aePrecaptureTrigger.count > 0 && 2930d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen aePrecaptureTrigger.data.u8[0] == ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL) { 2931d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // Always override CANCEL to IDLE 2932d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen uint8_t aePrecaptureTrigger = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE; 2933d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mSettings.update(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, &aePrecaptureTrigger, 1); 2934d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mAeTriggerCancelOverride.applyAePrecaptureTrigger = true; 2935d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mAeTriggerCancelOverride.aePrecaptureTrigger = 2936d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL; 2937d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 2938d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen if (mAeLockAvailable == true) { 2939d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen camera_metadata_entry_t aeLock = request->mSettings.find(ANDROID_CONTROL_AE_LOCK); 2940d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen if (aeLock.count == 0 || aeLock.data.u8[0] == ANDROID_CONTROL_AE_LOCK_OFF) { 2941d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_ON; 2942d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mSettings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 2943d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mAeTriggerCancelOverride.applyAeLock = true; 2944d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mAeTriggerCancelOverride.aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 2945d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen } 2946d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen } 2947d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen } 2948d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen} 2949d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 2950d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen/** 2951d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * Override result metadata for cancelling AE precapture trigger applied in 2952d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * handleAePrecaptureCancelRequest(). 2953d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen */ 2954d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chenvoid Camera3Device::overrideResultForPrecaptureCancel( 2955d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen CameraMetadata *result, const AeTriggerCancelOverride_t &aeTriggerCancelOverride) { 2956d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen if (aeTriggerCancelOverride.applyAeLock) { 2957d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // Only devices <= v3.2 should have this override 2958d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen assert(mDeviceVersion <= CAMERA_DEVICE_API_VERSION_3_2); 2959d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen result->update(ANDROID_CONTROL_AE_LOCK, &aeTriggerCancelOverride.aeLock, 1); 2960d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen } 2961d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 2962d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen if (aeTriggerCancelOverride.applyAePrecaptureTrigger) { 2963d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // Only devices <= v3.2 should have this override 2964d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen assert(mDeviceVersion <= CAMERA_DEVICE_API_VERSION_3_2); 2965d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen result->update(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, 2966d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen &aeTriggerCancelOverride.aePrecaptureTrigger, 1); 2967d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen } 2968d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen} 2969d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 2970e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chenvoid Camera3Device::RequestThread::checkAndStopRepeatingRequest() { 2971473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh bool surfaceAbandoned = false; 2972473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh int64_t lastFrameNumber = 0; 2973473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh { 2974473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh Mutex::Autolock l(mRequestLock); 2975473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh // Check all streams needed by repeating requests are still valid. Otherwise, stop 2976473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh // repeating requests. 2977473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh for (const auto& request : mRepeatingRequests) { 2978473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh for (const auto& s : request->mOutputStreams) { 2979473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh if (s->isAbandoned()) { 2980473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh surfaceAbandoned = true; 2981473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh clearRepeatingRequestsLocked(&lastFrameNumber); 2982473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh break; 2983473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh } 2984473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh } 2985473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh if (surfaceAbandoned) { 2986473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh break; 2987e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen } 2988e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen } 2989e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen } 2990473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh if (surfaceAbandoned) { 2991473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh mListener->notifyRepeatingRequestError(lastFrameNumber); 2992473fad9a5767e86ee9dbbffe0dfee10c7ad45a45Yin-Chia Yeh } 2993e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen} 2994e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen 2995f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::threadLoop() { 299685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen ATRACE_CALL(); 2997f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 2998f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2999f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Handle paused state. 3000f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (waitIfPaused()) { 3001f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 3002f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3003f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 300457ea29251d93c9423030de387573142064366a30Chien-Yu Chen // Wait for the next batch of requests. 300557ea29251d93c9423030de387573142064366a30Chien-Yu Chen waitForNextRequestBatch(); 300657ea29251d93c9423030de387573142064366a30Chien-Yu Chen if (mNextRequests.size() == 0) { 3007f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 3008f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3009f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 301085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Get the latest request ID, if any 301185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen int latestRequestId; 301257ea29251d93c9423030de387573142064366a30Chien-Yu Chen camera_metadata_entry_t requestIdEntry = mNextRequests[mNextRequests.size() - 1]. 301385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen captureRequest->mSettings.find(ANDROID_REQUEST_ID); 3014f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (requestIdEntry.count > 0) { 301585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen latestRequestId = requestIdEntry.data.i32[0]; 3016f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } else { 301785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen ALOGW("%s: Did not have android.request.id set in the request.", __FUNCTION__); 301885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen latestRequestId = NAME_NOT_FOUND; 3019f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 3020f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 302185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Prepare a batch of HAL requests and output buffers. 302257ea29251d93c9423030de387573142064366a30Chien-Yu Chen res = prepareHalRequests(); 302385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (res == TIMED_OUT) { 302485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Not a fatal error if getting output buffers time out. 302557ea29251d93c9423030de387573142064366a30Chien-Yu Chen cleanUpFailedRequests(/*sendRequestError*/ true); 3026e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen // Check if any stream is abandoned. 3027e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen checkAndStopRepeatingRequest(); 302885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen return true; 302985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } else if (res != OK) { 303057ea29251d93c9423030de387573142064366a30Chien-Yu Chen cleanUpFailedRequests(/*sendRequestError*/ false); 30314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return false; 30324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 30334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 303485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Inform waitUntilRequestProcessed thread of a new request ID 303585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen { 303685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen Mutex::Autolock al(mLatestRequestMutex); 303785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 303885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen mLatestRequestId = latestRequestId; 303985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen mLatestRequestSignal.signal(); 304085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 304185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 304285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Submit a batch of requests to HAL. 304385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Use flush lock only when submitting multilple requests in a batch. 304485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // TODO: The problem with flush lock is flush() will be blocked by process_capture_request() 304585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // which may take a long time to finish so synchronizing flush() and 304685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // process_capture_request() defeats the purpose of cancelling requests ASAP with flush(). 304785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // For now, only synchronize for high speed recording and we should figure something out for 304885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // removing the synchronization. 304957ea29251d93c9423030de387573142064366a30Chien-Yu Chen bool useFlushLock = mNextRequests.size() > 1; 305085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 305185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (useFlushLock) { 305285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen mFlushLock.lock(); 305385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 305485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 305585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen ALOGVV("%s: %d: submitting %d requests in a batch.", __FUNCTION__, __LINE__, 305657ea29251d93c9423030de387573142064366a30Chien-Yu Chen mNextRequests.size()); 305757ea29251d93c9423030de387573142064366a30Chien-Yu Chen for (auto& nextRequest : mNextRequests) { 305885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Submit request and block until ready for next one 305985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen ATRACE_ASYNC_BEGIN("frame capture", nextRequest.halRequest.frame_number); 306085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen ATRACE_BEGIN("camera3->process_capture_request"); 306185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen res = mHal3Device->ops->process_capture_request(mHal3Device, &nextRequest.halRequest); 306285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen ATRACE_END(); 30634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 30642f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (res != OK) { 306585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Should only get a failure here for malformed requests or device-level 306685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // errors, so consider all errors fatal. Bad metadata failures should 306785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // come through notify. 306885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen SET_ERR("RequestThread: Unable to submit capture request %d to HAL" 306985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen " device: %s (%d)", nextRequest.halRequest.frame_number, strerror(-res), 307085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen res); 307157ea29251d93c9423030de387573142064366a30Chien-Yu Chen cleanUpFailedRequests(/*sendRequestError*/ false); 307285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (useFlushLock) { 307385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen mFlushLock.unlock(); 307485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 30752f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala return false; 30762f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala } 30772f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 307885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Mark that the request has be submitted successfully. 307985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen nextRequest.submitted = true; 3080f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 308185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Update the latest request sent to HAL 308285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (nextRequest.halRequest.settings != NULL) { // Don't update if they were unchanged 308385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen Mutex::Autolock al(mLatestRequestMutex); 3084f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 308585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen camera_metadata_t* cloned = clone_camera_metadata(nextRequest.halRequest.settings); 308685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen mLatestRequest.acquire(cloned); 308785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 3088f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 308985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (nextRequest.halRequest.settings != NULL) { 309085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen nextRequest.captureRequest->mSettings.unlock(nextRequest.halRequest.settings); 309185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 309285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 309385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Remove any previously queued triggers (after unlock) 309485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen res = removeTriggers(mPrevRequest); 3095f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 309685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen SET_ERR("RequestThread: Unable to remove triggers " 309785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen "(capture request %d, HAL device: %s (%d)", 309885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen nextRequest.halRequest.frame_number, strerror(-res), res); 309957ea29251d93c9423030de387573142064366a30Chien-Yu Chen cleanUpFailedRequests(/*sendRequestError*/ false); 310085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (useFlushLock) { 310185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen mFlushLock.unlock(); 31021754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 310385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen return false; 3104f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3105f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3106f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 310785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (useFlushLock) { 310885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen mFlushLock.unlock(); 310942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 311042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 311185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Unset as current request 311285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen { 311385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen Mutex::Autolock l(mRequestLock); 311485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen mNextRequests.clear(); 311542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 31164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 311785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen return true; 311885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen} 3119cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He 312057ea29251d93c9423030de387573142064366a30Chien-Yu Chenstatus_t Camera3Device::RequestThread::prepareHalRequests() { 312185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen ATRACE_CALL(); 312285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 312357ea29251d93c9423030de387573142064366a30Chien-Yu Chen for (auto& nextRequest : mNextRequests) { 312485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen sp<CaptureRequest> captureRequest = nextRequest.captureRequest; 312585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen camera3_capture_request_t* halRequest = &nextRequest.halRequest; 312685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen Vector<camera3_stream_buffer_t>* outputBuffers = &nextRequest.outputBuffers; 312717a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala 312885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Prepare a request to HAL 312985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen halRequest->frame_number = captureRequest->mResultExtras.frameNumber; 3130f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 313185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Insert any queued triggers (before metadata is locked) 313285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen status_t res = insertTriggers(captureRequest); 31331e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 313485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (res < 0) { 313585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen SET_ERR("RequestThread: Unable to insert triggers " 313685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen "(capture request %d, HAL device: %s (%d)", 313785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen halRequest->frame_number, strerror(-res), res); 313885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen return INVALID_OPERATION; 313985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 314085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen int triggerCount = res; 314185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen bool triggersMixedIn = (triggerCount > 0 || mPrevTriggers > 0); 314285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen mPrevTriggers = triggerCount; 314385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 314485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // If the request is the same as last, or we had triggers last time 314585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (mPrevRequest != captureRequest || triggersMixedIn) { 314685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen /** 314785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen * HAL workaround: 314885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen * Insert a dummy trigger ID if a trigger is set but no trigger ID is 314985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen */ 315085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen res = addDummyTriggerIds(captureRequest); 315185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (res != OK) { 315285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen SET_ERR("RequestThread: Unable to insert dummy trigger IDs " 315385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen "(capture request %d, HAL device: %s (%d)", 315485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen halRequest->frame_number, strerror(-res), res); 315585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen return INVALID_OPERATION; 315685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 31571e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 315885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen /** 315985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen * The request should be presorted so accesses in HAL 316085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen * are O(logn). Sidenote, sorting a sorted metadata is nop. 316185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen */ 316285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen captureRequest->mSettings.sort(); 316385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen halRequest->settings = captureRequest->mSettings.getAndLock(); 316485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen mPrevRequest = captureRequest; 316585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen ALOGVV("%s: Request settings are NEW", __FUNCTION__); 316685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 316785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen IF_ALOGV() { 316885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen camera_metadata_ro_entry_t e = camera_metadata_ro_entry_t(); 316985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen find_camera_metadata_ro_entry( 317085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen halRequest->settings, 317185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen ANDROID_CONTROL_AF_TRIGGER, 317285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen &e 317385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen ); 317485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (e.count > 0) { 317585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen ALOGV("%s: Request (frame num %d) had AF trigger 0x%x", 317685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen __FUNCTION__, 317785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen halRequest->frame_number, 317885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen e.data.u8[0]); 317985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 318085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 318185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } else { 318285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // leave request.settings NULL to indicate 'reuse latest given' 318385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen ALOGVV("%s: Request settings are REUSED", 318485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen __FUNCTION__); 318585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 31864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 318785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen uint32_t totalNumBuffers = 0; 3188e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala 318985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Fill in buffers 319085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (captureRequest->mInputStream != NULL) { 319185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen halRequest->input_buffer = &captureRequest->mInputBuffer; 319285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen totalNumBuffers += 1; 319385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } else { 319485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen halRequest->input_buffer = NULL; 319585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 319685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 319785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen outputBuffers->insertAt(camera3_stream_buffer_t(), 0, 319885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen captureRequest->mOutputStreams.size()); 319985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen halRequest->output_buffers = outputBuffers->array(); 320085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen for (size_t i = 0; i < captureRequest->mOutputStreams.size(); i++) { 3201c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen sp<Camera3OutputStreamInterface> outputStream = captureRequest->mOutputStreams.editItemAt(i); 3202c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen 3203c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen // Prepare video buffers for high speed recording on the first video request. 3204c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen if (mPrepareVideoStream && outputStream->isVideoStream()) { 3205c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen // Only try to prepare video stream on the first video request. 3206c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen mPrepareVideoStream = false; 3207c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen 3208c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen res = outputStream->startPrepare(Camera3StreamInterface::ALLOCATE_PIPELINE_MAX); 3209c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen while (res == NOT_ENOUGH_DATA) { 3210c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen res = outputStream->prepareNextBuffer(); 3211c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen } 3212c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen if (res != OK) { 3213c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen ALOGW("%s: Preparing video buffers for high speed failed: %s (%d)", 3214c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen __FUNCTION__, strerror(-res), res); 3215c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen outputStream->cancelPrepare(); 3216c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen } 3217c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen } 3218c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen 3219c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen res = outputStream->getBuffer(&outputBuffers->editItemAt(i)); 322085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (res != OK) { 322185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Can't get output buffer from gralloc queue - this could be due to 322285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // abandoned queue or other consumer misbehavior, so not a fatal 322385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // error 322485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen ALOGE("RequestThread: Can't get output buffer, skipping request:" 322585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen " %s (%d)", strerror(-res), res); 322685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 322785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen return TIMED_OUT; 322885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 322985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen halRequest->num_output_buffers++; 323085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 323185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen totalNumBuffers += halRequest->num_output_buffers; 323285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 323385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Log request in the in-flight queue 323485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen sp<Camera3Device> parent = mParent.promote(); 323585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (parent == NULL) { 323685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Should not happen, and nowhere to send errors to, so just log it 323785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen CLOGE("RequestThread: Parent is gone"); 323885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen return INVALID_OPERATION; 323985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 324085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen res = parent->registerInFlight(halRequest->frame_number, 324185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen totalNumBuffers, captureRequest->mResultExtras, 324285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen /*hasInput*/halRequest->input_buffer != NULL, 324385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen captureRequest->mAeTriggerCancelOverride); 324485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen ALOGVV("%s: registered in flight requestId = %" PRId32 ", frameNumber = %" PRId64 324585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen ", burstId = %" PRId32 ".", 324685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen __FUNCTION__, 324785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen captureRequest->mResultExtras.requestId, captureRequest->mResultExtras.frameNumber, 324885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen captureRequest->mResultExtras.burstId); 324985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (res != OK) { 325085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen SET_ERR("RequestThread: Unable to register new in-flight request:" 325185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen " %s (%d)", strerror(-res), res); 325285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen return INVALID_OPERATION; 325385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 32544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 32554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 325685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen return OK; 3257f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 3258f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 32591e479c0f4cb3e2174dde0b02e5656fb658f73495Igor MurashkinCameraMetadata Camera3Device::RequestThread::getLatestRequest() const { 32601e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin Mutex::Autolock al(mLatestRequestMutex); 32611e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 32621e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin ALOGV("RequestThread::%s", __FUNCTION__); 32631e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 32641e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin return mLatestRequest; 32651e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin} 32661e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 32674d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvalabool Camera3Device::RequestThread::isStreamPending( 32684d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala sp<Camera3StreamInterface>& stream) { 32694d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Mutex::Autolock l(mRequestLock); 32704d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 327185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen for (const auto& nextRequest : mNextRequests) { 327257ea29251d93c9423030de387573142064366a30Chien-Yu Chen if (!nextRequest.submitted) { 327357ea29251d93c9423030de387573142064366a30Chien-Yu Chen for (const auto& s : nextRequest.captureRequest->mOutputStreams) { 327457ea29251d93c9423030de387573142064366a30Chien-Yu Chen if (stream == s) return true; 327557ea29251d93c9423030de387573142064366a30Chien-Yu Chen } 327657ea29251d93c9423030de387573142064366a30Chien-Yu Chen if (stream == nextRequest.captureRequest->mInputStream) return true; 3277e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala } 3278e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala } 3279e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala 32804d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala for (const auto& request : mRequestQueue) { 32814d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala for (const auto& s : request->mOutputStreams) { 32824d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (stream == s) return true; 32834d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 32844d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (stream == request->mInputStream) return true; 32854d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 32864d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 32874d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala for (const auto& request : mRepeatingRequests) { 32884d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala for (const auto& s : request->mOutputStreams) { 32894d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (stream == s) return true; 32904d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 32914d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (stream == request->mInputStream) return true; 32924d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 32934d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 32944d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return false; 32954d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 3296cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 329757ea29251d93c9423030de387573142064366a30Chien-Yu Chenvoid Camera3Device::RequestThread::cleanUpFailedRequests(bool sendRequestError) { 329857ea29251d93c9423030de387573142064366a30Chien-Yu Chen if (mNextRequests.empty()) { 329985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen return; 3300f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 330185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 330257ea29251d93c9423030de387573142064366a30Chien-Yu Chen for (auto& nextRequest : mNextRequests) { 330385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Skip the ones that have been submitted successfully. 330485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (nextRequest.submitted) { 330585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen continue; 330685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 330785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 330885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen sp<CaptureRequest> captureRequest = nextRequest.captureRequest; 330985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen camera3_capture_request_t* halRequest = &nextRequest.halRequest; 331085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen Vector<camera3_stream_buffer_t>* outputBuffers = &nextRequest.outputBuffers; 331185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 331285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (halRequest->settings != NULL) { 331385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen captureRequest->mSettings.unlock(halRequest->settings); 331485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 331585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 331685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (captureRequest->mInputStream != NULL) { 331785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen captureRequest->mInputBuffer.status = CAMERA3_BUFFER_STATUS_ERROR; 331885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen captureRequest->mInputStream->returnInputBuffer(captureRequest->mInputBuffer); 331985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 332085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 332185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen for (size_t i = 0; i < halRequest->num_output_buffers; i++) { 332285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen outputBuffers->editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR; 332385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen captureRequest->mOutputStreams.editItemAt(i)->returnBuffer((*outputBuffers)[i], 0); 332485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 332585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 332685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (sendRequestError) { 332785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen Mutex::Autolock l(mRequestLock); 332885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (mListener != NULL) { 332985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen mListener->notifyError( 3330d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST, 333185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen captureRequest->mResultExtras); 333285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 333385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 3334f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3335e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala 3336e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala Mutex::Autolock l(mRequestLock); 333785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen mNextRequests.clear(); 3338f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 3339f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 334057ea29251d93c9423030de387573142064366a30Chien-Yu Chenvoid Camera3Device::RequestThread::waitForNextRequestBatch() { 3341f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Optimized a bit for the simple steady-state case (single repeating 3342f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // request), to avoid putting that request in the queue temporarily. 3343f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 3344f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 334585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen assert(mNextRequests.empty()); 334685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 334785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen NextRequest nextRequest; 334885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen nextRequest.captureRequest = waitForNextRequestLocked(); 334985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (nextRequest.captureRequest == nullptr) { 335085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen return; 335185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 335285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 335385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen nextRequest.halRequest = camera3_capture_request_t(); 335485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen nextRequest.submitted = false; 335557ea29251d93c9423030de387573142064366a30Chien-Yu Chen mNextRequests.add(nextRequest); 335685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 335785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Wait for additional requests 335885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen const size_t batchSize = nextRequest.captureRequest->mBatchSize; 335985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 336085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen for (size_t i = 1; i < batchSize; i++) { 336185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen NextRequest additionalRequest; 336285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen additionalRequest.captureRequest = waitForNextRequestLocked(); 336385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen if (additionalRequest.captureRequest == nullptr) { 336485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen break; 336585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 336685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 336785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen additionalRequest.halRequest = camera3_capture_request_t(); 336885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen additionalRequest.submitted = false; 336957ea29251d93c9423030de387573142064366a30Chien-Yu Chen mNextRequests.add(additionalRequest); 337085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 337185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 337257ea29251d93c9423030de387573142064366a30Chien-Yu Chen if (mNextRequests.size() < batchSize) { 3373d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala ALOGE("RequestThread: only get %zu out of %zu requests. Skipping requests.", 337457ea29251d93c9423030de387573142064366a30Chien-Yu Chen mNextRequests.size(), batchSize); 337557ea29251d93c9423030de387573142064366a30Chien-Yu Chen cleanUpFailedRequests(/*sendRequestError*/true); 337685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen } 337785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 337885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen return; 337985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen} 338085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 338185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chensp<Camera3Device::CaptureRequest> 338285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen Camera3Device::RequestThread::waitForNextRequestLocked() { 338385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen status_t res; 338485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen sp<CaptureRequest> nextRequest; 338585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 3386f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala while (mRequestQueue.empty()) { 3387f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (!mRepeatingRequests.empty()) { 3388f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Always atomically enqueue all requests in a repeating request 3389f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // list. Guarantees a complete in-sequence set of captures to 3390f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // application. 3391f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const RequestList &requests = mRepeatingRequests; 3392f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList::const_iterator firstRequest = 3393f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala requests.begin(); 3394f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest = *firstRequest; 3395f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestQueue.insert(mRequestQueue.end(), 3396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ++firstRequest, 3397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala requests.end()); 3398f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // No need to wait any longer 3399cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 34002d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei mRepeatingLastFrameNumber = mFrameNumber + requests.size() - 1; 3401cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 3402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 3403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3404f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 3405f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mRequestSignal.waitRelative(mRequestLock, kRequestTimeout); 3406f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 3407f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if ((mRequestQueue.empty() && mRepeatingRequests.empty()) || 3408f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala exitPending()) { 3409f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock pl(mPauseLock); 3410f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mPaused == false) { 3411f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: RequestThread: Going idle", __FUNCTION__); 3412f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused = true; 3413f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Let the tracker know 3414f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 3415f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 3416f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE); 3417f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 3418f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3419f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Stop waiting for now and let thread management happen 3420f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 3421f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3422f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3423f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 3424f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (nextRequest == NULL) { 3425f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Don't have a repeating request already in hand, so queue 3426f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // must have an entry now. 3427f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList::iterator firstRequest = 3428f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestQueue.begin(); 3429f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest = *firstRequest; 3430f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestQueue.erase(firstRequest); 3431f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3432f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 343326fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // In case we've been unpaused by setPaused clearing mDoPause, need to 343426fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // update internal pause state (capture/setRepeatingRequest unpause 343526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // directly). 3436f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock pl(mPauseLock); 3437f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mPaused) { 3438f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: RequestThread: Unpaused", __FUNCTION__); 3439f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 3440f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 3441f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->markComponentActive(mStatusId); 3442f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 3443f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 3444f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused = false; 3445f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 3446f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Check if we've reconfigured since last time, and reset the preview 3447f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // request if so. Can't use 'NULL request == repeat' across configure calls. 3448f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mReconfigured) { 3449f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPrevRequest.clear(); 3450f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mReconfigured = false; 3451f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3452f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 34532d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (nextRequest != NULL) { 34542d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei nextRequest->mResultExtras.frameNumber = mFrameNumber++; 3455c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh nextRequest->mResultExtras.afTriggerId = mCurrentAfTriggerId; 3456c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh nextRequest->mResultExtras.precaptureTriggerId = mCurrentPreCaptureTriggerId; 3457c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen 3458c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen // Since RequestThread::clear() removes buffers from the input stream, 3459c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen // get the right buffer here before unlocking mRequestLock 3460c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen if (nextRequest->mInputStream != NULL) { 3461c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen res = nextRequest->mInputStream->getInputBuffer(&nextRequest->mInputBuffer); 3462c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen if (res != OK) { 3463c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen // Can't get input buffer from gralloc queue - this could be due to 3464c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen // disconnected queue or other producer misbehavior, so not a fatal 3465c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen // error 3466c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen ALOGE("%s: Can't get input buffer, skipping request:" 3467c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen " %s (%d)", __FUNCTION__, strerror(-res), res); 3468c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen if (mListener != NULL) { 3469c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen mListener->notifyError( 3470d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST, 3471c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen nextRequest->mResultExtras); 3472c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen } 3473c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen return NULL; 3474c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen } 3475c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen } 34762d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 3477d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 3478d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen handleAePrecaptureCancelRequest(nextRequest); 3479d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 3480f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return nextRequest; 3481f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 3482f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 3483f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::waitIfPaused() { 3484f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 3485f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mPauseLock); 3486f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala while (mDoPause) { 3487f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mPaused == false) { 3488f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused = true; 3489f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: RequestThread: Paused", __FUNCTION__); 3490f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Let the tracker know 3491f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 3492f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 3493f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE); 3494f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 3495f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3496f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 3497f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mDoPauseSignal.waitRelative(mPauseLock, kRequestTimeout); 3498f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res == TIMED_OUT || exitPending()) { 3499f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 3500f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3501f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3502f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // We don't set mPaused to false here, because waitForNextRequest needs 3503f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // to further manage the paused state in case of starvation. 3504f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return false; 3505f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 3506f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 350726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvalavoid Camera3Device::RequestThread::unpauseForNewRequests() { 350826fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // With work to do, mark thread as unpaused. 350926fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // If paused by request (setPaused), don't resume, to avoid 351026fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // extra signaling/waiting overhead to waitUntilPaused 3511f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestSignal.signal(); 351226fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala Mutex::Autolock p(mPauseLock); 351326fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala if (!mDoPause) { 3514f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: RequestThread: Going active", __FUNCTION__); 3515f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mPaused) { 3516f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 3517f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 3518f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->markComponentActive(mStatusId); 3519f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 3520f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 352126fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala mPaused = false; 352226fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala } 352326fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala} 352426fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala 3525b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::RequestThread::setErrorState(const char *fmt, ...) { 3526b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala sp<Camera3Device> parent = mParent.promote(); 3527b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala if (parent != NULL) { 3528b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_list args; 3529b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_start(args, fmt); 3530b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 3531b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala parent->setErrorStateV(fmt, args); 3532b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 3533b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_end(args); 3534b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala } 3535b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 3536b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 35374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::insertTriggers( 35384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const sp<CaptureRequest> &request) { 35394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 35404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock al(mTriggerMutex); 35414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3542741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh sp<Camera3Device> parent = mParent.promote(); 3543741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh if (parent == NULL) { 3544741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh CLOGE("RequestThread: Parent is gone"); 3545741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh return DEAD_OBJECT; 3546741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 3547741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh 35484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin CameraMetadata &metadata = request->mSettings; 35494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin size_t count = mTriggerMap.size(); 35504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 35514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < count; ++i) { 35524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger = mTriggerMap.valueAt(i); 35534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t tag = trigger.metadataTag; 3554741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh 3555741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh if (tag == ANDROID_CONTROL_AF_TRIGGER_ID || tag == ANDROID_CONTROL_AE_PRECAPTURE_ID) { 3556741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh bool isAeTrigger = (trigger.metadataTag == ANDROID_CONTROL_AE_PRECAPTURE_ID); 3557741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh uint32_t triggerId = static_cast<uint32_t>(trigger.entryValue); 3558c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh if (isAeTrigger) { 3559c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh request->mResultExtras.precaptureTriggerId = triggerId; 3560c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh mCurrentPreCaptureTriggerId = triggerId; 3561c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh } else { 3562c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh request->mResultExtras.afTriggerId = triggerId; 3563c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh mCurrentAfTriggerId = triggerId; 3564c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh } 3565741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh if (parent->mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 3566741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh continue; // Trigger ID tag is deprecated since device HAL 3.2 3567741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 3568741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 3569741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh 35704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin camera_metadata_entry entry = metadata.find(tag); 35714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 35724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (entry.count > 0) { 35734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 35744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Already has an entry for this trigger in the request. 35754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Rewrite it with our requested trigger value. 35764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 35774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger oldTrigger = trigger; 35784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 35794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin oldTrigger.entryValue = entry.data.u8[0]; 35804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 35814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerReplacedMap.add(tag, oldTrigger); 35824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } else { 35834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 35844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * More typical, no trigger entry, so we just add it 35854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 35864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerRemovedMap.add(tag, trigger); 35874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 35884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 35894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res; 35904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 35914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin switch (trigger.getTagType()) { 35924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_BYTE: { 35934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue); 35944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 35954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &entryValue, 35964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 35974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 35984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 35994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_INT32: 36004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 36014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &trigger.entryValue, 36024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 36034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 36044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin default: 36054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Type not supported: 0x%x", 36064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, 36074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagType()); 36084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return INVALID_OPERATION; 36094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 36104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 36114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 36124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Failed to update request metadata with trigger tag %s" 36134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ", value %d", __FUNCTION__, trigger.getTagName(), 36144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.entryValue); 36154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return res; 36164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 36174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 36184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Mixed in trigger %s, value %d", __FUNCTION__, 36194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagName(), 36204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.entryValue); 36214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 36224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 36234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerMap.clear(); 36244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 36254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return count; 36264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 36274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 36284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::removeTriggers( 36294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const sp<CaptureRequest> &request) { 36304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock al(mTriggerMutex); 36314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 36324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin CameraMetadata &metadata = request->mSettings; 36334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 36344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 36354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Replace all old entries with their old values. 36364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 36374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < mTriggerReplacedMap.size(); ++i) { 36384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger = mTriggerReplacedMap.valueAt(i); 36394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 36404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res; 36414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 36424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t tag = trigger.metadataTag; 36434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin switch (trigger.getTagType()) { 36444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_BYTE: { 36454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue); 36464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 36474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &entryValue, 36484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 36494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 36504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 36514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_INT32: 36524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 36534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &trigger.entryValue, 36544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 36554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 36564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin default: 36574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Type not supported: 0x%x", 36584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, 36594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagType()); 36604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return INVALID_OPERATION; 36614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 36624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 36634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 36644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Failed to restore request metadata with trigger tag %s" 36654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ", trigger value %d", __FUNCTION__, 36664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagName(), trigger.entryValue); 36674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return res; 36684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 36694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 36704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerReplacedMap.clear(); 36714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 36724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 36734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Remove all new entries. 36744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 36754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < mTriggerRemovedMap.size(); ++i) { 36764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger = mTriggerRemovedMap.valueAt(i); 36774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res = metadata.erase(trigger.metadataTag); 36784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 36794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 36804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Failed to erase metadata with trigger tag %s" 36814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ", trigger value %d", __FUNCTION__, 36824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagName(), trigger.entryValue); 36834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return res; 36844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 36854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 36864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerRemovedMap.clear(); 36874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 36884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 36894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 36904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 36912f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvalastatus_t Camera3Device::RequestThread::addDummyTriggerIds( 36922f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala const sp<CaptureRequest> &request) { 3693d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // Trigger ID 0 had special meaning in the HAL2 spec, so avoid it here 36942f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala static const int32_t dummyTriggerId = 1; 36952f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala status_t res; 36962f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 36972f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala CameraMetadata &metadata = request->mSettings; 36982f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 36992f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // If AF trigger is active, insert a dummy AF trigger ID if none already 37002f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // exists 37012f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala camera_metadata_entry afTrigger = metadata.find(ANDROID_CONTROL_AF_TRIGGER); 37022f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala camera_metadata_entry afId = metadata.find(ANDROID_CONTROL_AF_TRIGGER_ID); 37032f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (afTrigger.count > 0 && 37042f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala afTrigger.data.u8[0] != ANDROID_CONTROL_AF_TRIGGER_IDLE && 37052f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala afId.count == 0) { 37062f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala res = metadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, &dummyTriggerId, 1); 37072f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (res != OK) return res; 37082f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala } 37092f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 37102f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // If AE precapture trigger is active, insert a dummy precapture trigger ID 37112f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // if none already exists 37122f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala camera_metadata_entry pcTrigger = 37132f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER); 37142f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala camera_metadata_entry pcId = metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_ID); 37152f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (pcTrigger.count > 0 && 37162f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala pcTrigger.data.u8[0] != ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE && 37172f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala pcId.count == 0) { 37182f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala res = metadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, 37192f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala &dummyTriggerId, 1); 37202f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (res != OK) return res; 37212f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala } 37222f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 37232f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala return OK; 37242f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala} 37254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 37264d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala/** 37274d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala * PreparerThread inner class methods 37284d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala */ 37294d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 37304d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville TalvalaCamera3Device::PreparerThread::PreparerThread() : 373177c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala Thread(/*canCallJava*/false), mListener(nullptr), 373277c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala mActive(false), mCancelNow(false) { 37334d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 37344d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 37354d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville TalvalaCamera3Device::PreparerThread::~PreparerThread() { 37364d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Thread::requestExitAndWait(); 37374d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (mCurrentStream != nullptr) { 37384d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream->cancelPrepare(); 37394d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ATRACE_ASYNC_END("stream prepare", mCurrentStream->getId()); 37404d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream.clear(); 37414d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 37424d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala clear(); 37434d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 37444d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 3745c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunkstatus_t Camera3Device::PreparerThread::prepare(int maxCount, sp<Camera3StreamInterface>& stream) { 37464d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala status_t res; 37474d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 37484d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Mutex::Autolock l(mLock); 37494d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 3750c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk res = stream->startPrepare(maxCount); 37514d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (res == OK) { 37524d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // No preparation needed, fire listener right off 37534d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Stream %d already prepared", __FUNCTION__, stream->getId()); 37544d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (mListener) { 37554d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mListener->notifyPrepared(stream->getId()); 37564d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 37574d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return OK; 37584d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } else if (res != NOT_ENOUGH_DATA) { 37594d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return res; 37604d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 37614d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 37624d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // Need to prepare, start up thread if necessary 37634d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (!mActive) { 37644d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // mRunning will change to false before the thread fully shuts down, so wait to be sure it 37654d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // isn't running 37664d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Thread::requestExitAndWait(); 37674d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala res = Thread::run("C3PrepThread", PRIORITY_BACKGROUND); 37684d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (res != OK) { 37694d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGE("%s: Unable to start preparer stream: %d (%s)", __FUNCTION__, res, strerror(-res)); 37704d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (mListener) { 37714d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mListener->notifyPrepared(stream->getId()); 37724d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 37734d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return res; 37744d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 37754d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCancelNow = false; 37764d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mActive = true; 37774d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Preparer stream started", __FUNCTION__); 37784d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 37794d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 37804d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // queue up the work 37814d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mPendingStreams.push_back(stream); 37824d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Stream %d queued for preparing", __FUNCTION__, stream->getId()); 37834d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 37844d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return OK; 37854d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 37864d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 37874d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvalastatus_t Camera3Device::PreparerThread::clear() { 37884d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Mutex::Autolock l(mLock); 37894d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 37904d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala for (const auto& stream : mPendingStreams) { 37914d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala stream->cancelPrepare(); 37924d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 37934d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mPendingStreams.clear(); 37944d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCancelNow = true; 37954d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 37964d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return OK; 37974d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 37984d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 37994d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvalavoid Camera3Device::PreparerThread::setNotificationListener(NotificationListener *listener) { 38004d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Mutex::Autolock l(mLock); 38014d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mListener = listener; 38024d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 38034d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 38044d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvalabool Camera3Device::PreparerThread::threadLoop() { 38054d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala status_t res; 38064d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala { 38074d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Mutex::Autolock l(mLock); 38084d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (mCurrentStream == nullptr) { 38094d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // End thread if done with work 38104d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (mPendingStreams.empty()) { 38114d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Preparer stream out of work", __FUNCTION__); 38124d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // threadLoop _must not_ re-acquire mLock after it sets mActive to false; would 38134d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // cause deadlock with prepare()'s requestExitAndWait triggered by !mActive. 38144d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mActive = false; 38154d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return false; 38164d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 38174d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 38184d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // Get next stream to prepare 38194d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala auto it = mPendingStreams.begin(); 38204d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream = *it; 38214d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mPendingStreams.erase(it); 38224d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ATRACE_ASYNC_BEGIN("stream prepare", mCurrentStream->getId()); 38234d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Preparing stream %d", __FUNCTION__, mCurrentStream->getId()); 38244d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } else if (mCancelNow) { 38254d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream->cancelPrepare(); 38264d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ATRACE_ASYNC_END("stream prepare", mCurrentStream->getId()); 38274d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Cancelling stream %d prepare", __FUNCTION__, mCurrentStream->getId()); 38284d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream.clear(); 38294d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCancelNow = false; 38304d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return true; 38314d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 38324d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 38334d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 38344d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala res = mCurrentStream->prepareNextBuffer(); 38354d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (res == NOT_ENOUGH_DATA) return true; 38364d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (res != OK) { 38374d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // Something bad happened; try to recover by cancelling prepare and 38384d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // signalling listener anyway 38394d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGE("%s: Stream %d returned error %d (%s) during prepare", __FUNCTION__, 38404d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream->getId(), res, strerror(-res)); 38414d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream->cancelPrepare(); 38424d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 38434d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 38444d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // This stream has finished, notify listener 38454d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Mutex::Autolock l(mLock); 38464d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (mListener) { 38474d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Stream %d prepare done, signaling listener", __FUNCTION__, 38484d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream->getId()); 38494d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mListener->notifyPrepared(mCurrentStream->getId()); 38504d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 38514d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 38524d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ATRACE_ASYNC_END("stream prepare", mCurrentStream->getId()); 38534d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream.clear(); 38544d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 38554d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return true; 38564d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 38574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3858f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 38597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Static callback forwarding methods from HAL to instance 38607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 38617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 38627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sProcessCaptureResult(const camera3_callback_ops *cb, 38637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_capture_result *result) { 38647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala Camera3Device *d = 38657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb)); 3866d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 38677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala d->processCaptureResult(result); 38687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 38697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 38707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sNotify(const camera3_callback_ops *cb, 38717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_notify_msg *msg) { 38727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala Camera3Device *d = 38737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb)); 38747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala d->notify(msg); 38757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 38767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 38777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android 3878