Camera3Device.cpp revision d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49d
17fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/* 27fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Copyright (C) 2013 The Android Open Source Project 37fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * 47fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 57fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * you may not use this file except in compliance with the License. 67fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * You may obtain a copy of the License at 77fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * 87fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 97fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * 107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * See the License for the specific language governing permissions and 147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * limitations under the License. 157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#define LOG_TAG "Camera3-Device" 187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA 197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala//#define LOG_NDEBUG 0 207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala//#define LOG_NNDEBUG 0 // Per-frame verbose logging 217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#ifdef LOG_NNDEBUG 237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#define ALOGVV(...) ALOGV(__VA_ARGS__) 247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#else 257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#define ALOGVV(...) ((void)0) 267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#endif 277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 28b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala// Convenience macro for transient errors 29b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala#define CLOGE(fmt, ...) ALOGE("Camera %d: %s: " fmt, mId, __FUNCTION__, \ 30b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala ##__VA_ARGS__) 31b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 32b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala// Convenience macros for transitioning to the error state 33b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala#define SET_ERR(fmt, ...) setErrorState( \ 34b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala "%s: " fmt, __FUNCTION__, \ 35b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala ##__VA_ARGS__) 36b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala#define SET_ERR_L(fmt, ...) setErrorStateLocked( \ 37b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala "%s: " fmt, __FUNCTION__, \ 38b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala ##__VA_ARGS__) 39b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 40e5729fac81c8a984e984fefc90afc64135817d4fColin Cross#include <inttypes.h> 41e5729fac81c8a984e984fefc90afc64135817d4fColin Cross 427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Log.h> 437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Trace.h> 447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Timers.h> 457b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 46ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin#include "utils/CameraTraces.h" 477b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3Device.h" 487b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3OutputStream.h" 497b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3InputStream.h" 507b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3ZslStream.h" 5116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala#include "device3/Camera3DummyStream.h" 52f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala#include "CameraService.h" 537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 54f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalausing namespace android::camera3; 557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 56f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalanamespace android { 577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville TalvalaCamera3Device::Camera3Device(int id): 597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mId(id), 609a17941fa70e43119d2c3464bc00a3cd30b2bd14Eino-Ville Talvala mIsConstrainedHighSpeedConfiguration(false), 61f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device(NULL), 627d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mStatus(STATUS_UNINITIALIZED), 63204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mUsePartialResult(false), 64204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mNumPartialResults(1), 6542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mNextResultFrameNumber(0), 66618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen mNextReprocessResultFrameNumber(0), 6742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mNextShutterFrameNumber(0), 687d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mListener(NULL) 697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{ 707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera3_callback_ops::notify = &sNotify; 727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera3_callback_ops::process_capture_result = &sProcessCaptureResult; 737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGV("%s: Created device for camera %d", __FUNCTION__, id); 747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville TalvalaCamera3Device::~Camera3Device() 777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{ 787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGV("%s: Tearing down for camera id %d", __FUNCTION__, mId); 807fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala disconnect(); 817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8371381051e2d048b2705c447b3d59db6e972493eeIgor Murashkinint Camera3Device::getId() const { 8471381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin return mId; 8571381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin} 8671381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin 87f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 88f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * CameraDeviceBase interface 89f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 90f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 91e074a93046ebe5cea0b55c3a479e082a426e1e07Yin-Chia Yehstatus_t Camera3Device::initialize(CameraModule *module) 927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{ 937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 94f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 95f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 96f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGV("%s: Initializing device for camera %d", __FUNCTION__, mId); 98f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mStatus != STATUS_UNINITIALIZED) { 99b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Already initialized!"); 1007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 1017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Open HAL device */ 1047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala status_t res; 1067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala String8 deviceName = String8::format("%d", mId); 1077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera3_device_t *device; 1097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 110213ce79e943a3b51d7859a184d8211c859c960a0Zhijun He ATRACE_BEGIN("camera3->open"); 111d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen res = module->open(deviceName.string(), 112d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen reinterpret_cast<hw_device_t**>(&device)); 113213ce79e943a3b51d7859a184d8211c859c960a0Zhijun He ATRACE_END(); 1147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) { 116b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Could not open camera: %s (%d)", strerror(-res), res); 1177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return res; 1187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Cross-check device version */ 12195dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He if (device->common.version < CAMERA_DEVICE_API_VERSION_3_0) { 122b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Could not open camera: " 12395dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He "Camera device should be at least %x, reports %x instead", 124b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CAMERA_DEVICE_API_VERSION_3_0, 1257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.version); 1267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 1277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return BAD_VALUE; 1287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala camera_info info; 131e074a93046ebe5cea0b55c3a479e082a426e1e07Yin-Chia Yeh res = CameraService::filterGetInfoErrorCode(module->getCameraInfo( 132f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala mId, &info)); 1337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) return res; 1347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (info.device_version != device->common.version) { 136b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("HAL reporting mismatched camera_info version (%x)" 137b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala " and device version (%x).", 13895dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He info.device_version, device->common.version); 1397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 1407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return BAD_VALUE; 1417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Initialize device with callback functions */ 1447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 14517a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->initialize"); 1467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = device->ops->initialize(device, this); 14717a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 14817a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala 1497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) { 150b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to initialize HAL device: %s (%d)", 151b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala strerror(-res), res); 1527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 1537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return BAD_VALUE; 1547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 156f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** Start up status tracker thread */ 157f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker = new StatusTracker(this); 158f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = mStatusTracker->run(String8::format("C3Dev-%d-Status", mId).string()); 159f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) { 160f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Unable to start status tracking thread: %s (%d)", 161f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala strerror(-res), res); 162f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala device->common.close(&device->common); 163f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker.clear(); 164f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 165f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 166f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Start up request queue thread */ 1687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 169f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread = new RequestThread(this, mStatusTracker, device); 170f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mRequestThread->run(String8::format("C3Dev-%d-ReqQueue", mId).string()); 1717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (res != OK) { 172b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to start request queue thread: %s (%d)", 173b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala strerror(-res), res); 1747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala device->common.close(&device->common); 175f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread.clear(); 1767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return res; 1777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala } 1787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1794d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mPreparerThread = new PreparerThread(); 1804d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 1817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** Everything is good to go */ 1827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 183cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh mDeviceVersion = device->common.version; 1847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mDeviceInfo = info.static_camera_characteristics; 1857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal3Device = device; 186f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus = STATUS_UNCONFIGURED; 187f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mNextStreamId = 0; 18816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala mDummyStreamId = NO_STREAM; 189ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala mNeedConfig = true; 190f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mPauseStateNotify = false; 1917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 192fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Will the HAL be sending in early partial result metadata? 193204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 194204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He camera_metadata_entry partialResultsCount = 195204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mDeviceInfo.find(ANDROID_REQUEST_PARTIAL_RESULT_COUNT); 196204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (partialResultsCount.count > 0) { 197204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mNumPartialResults = partialResultsCount.data.i32[0]; 198204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mUsePartialResult = (mNumPartialResults > 1); 199204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 200204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } else { 201204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He camera_metadata_entry partialResultsQuirk = 202204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mDeviceInfo.find(ANDROID_QUIRKS_USE_PARTIAL_RESULT); 203204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (partialResultsQuirk.count > 0 && partialResultsQuirk.data.u8[0] == 1) { 204204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mUsePartialResult = true; 205204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 206fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 207fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 208618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen camera_metadata_entry configs = 209618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen mDeviceInfo.find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS); 210618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen for (uint32_t i = 0; i < configs.count; i += 4) { 211618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen if (configs.data.i32[i] == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED && 212618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen configs.data.i32[i + 3] == 213618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT) { 214618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen mSupportedOpaqueInputSizes.add(Size(configs.data.i32[i + 1], 215618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen configs.data.i32[i + 2])); 216618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } 217618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } 218618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 2197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return OK; 2207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 2217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::disconnect() { 2237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 224f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 2257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 226f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 227f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 228214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala status_t res = OK; 229f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 230f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala { 231f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mLock); 232f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_UNINITIALIZED) return res; 233f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 234f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_ACTIVE || 235f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala (mStatus == STATUS_ERROR && mRequestThread != NULL)) { 236f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = mRequestThread->clearRepeatingRequests(); 237214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala if (res != OK) { 238f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't stop streaming"); 239214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala // Continue to close device even in case of error 240f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } else { 241f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout); 242f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) { 243f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Timeout waiting for HAL to drain"); 244f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Continue to close device even in case of error 245f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 246214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala } 247f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 248f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 249f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_ERROR) { 250f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala CLOGE("Shutting down in an error state"); 251f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 252f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 253f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatusTracker != NULL) { 254f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker->requestExit(); 255f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 256f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 257f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mRequestThread != NULL) { 258f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread->requestExit(); 259f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 260f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 261f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mOutputStreams.clear(); 262f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mInputStream.clear(); 263f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 264f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 265f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Joining done without holding mLock, otherwise deadlocks may ensue 266f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // as the threads try to access parent state 267f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mRequestThread != NULL && mStatus != STATUS_ERROR) { 268f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // HAL may be in a bad state, so waiting for request thread 269f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // (which may be stuck in the HAL processCaptureRequest call) 270f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // could be dangerous. 271f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread->join(); 272214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala } 273214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala 274f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatusTracker != NULL) { 275f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker->join(); 276f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 277f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 278f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala { 279f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mLock); 280f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 281f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread.clear(); 282f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker.clear(); 283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 284f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mHal3Device != NULL) { 285213ce79e943a3b51d7859a184d8211c859c960a0Zhijun He ATRACE_BEGIN("camera3->close"); 286f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mHal3Device->common.close(&mHal3Device->common); 287213ce79e943a3b51d7859a184d8211c859c960a0Zhijun He ATRACE_END(); 288f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mHal3Device = NULL; 289f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 290f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 291f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus = STATUS_UNINITIALIZED; 292f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 293f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 294f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: X", __FUNCTION__); 295214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala return res; 2967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 2977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 298f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// For dumping/debugging only - 299f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// try to acquire a lock a few times, eventually give up to proceed with 300f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// debug/dump operations 301f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalabool Camera3Device::tryLockSpinRightRound(Mutex& lock) { 302f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool gotLock = false; 303f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala for (size_t i = 0; i < kDumpLockAttempts; ++i) { 304f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (lock.tryLock() == NO_ERROR) { 305f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala gotLock = true; 306f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala break; 307f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } else { 308f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala usleep(kDumpSleepDuration); 309f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 310f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 311f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return gotLock; 312f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 313f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 314cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehCamera3Device::Size Camera3Device::getMaxJpegResolution() const { 315f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He int32_t maxJpegWidth = 0, maxJpegHeight = 0; 316cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 317cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_CONFIGURATION_SIZE = 4; 318cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_FORMAT_OFFSET = 0; 319cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_WIDTH_OFFSET = 1; 320cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_HEIGHT_OFFSET = 2; 321cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_IS_INPUT_OFFSET = 3; 322cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry_t availableStreamConfigs = 323cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh mDeviceInfo.find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS); 324cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (availableStreamConfigs.count == 0 || 325cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh availableStreamConfigs.count % STREAM_CONFIGURATION_SIZE != 0) { 326cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return Size(0, 0); 327cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 328cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 329cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh // Get max jpeg size (area-wise). 330cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i=0; i < availableStreamConfigs.count; i+= STREAM_CONFIGURATION_SIZE) { 331cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t format = availableStreamConfigs.data.i32[i + STREAM_FORMAT_OFFSET]; 332cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t width = availableStreamConfigs.data.i32[i + STREAM_WIDTH_OFFSET]; 333cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t height = availableStreamConfigs.data.i32[i + STREAM_HEIGHT_OFFSET]; 334cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t isInput = availableStreamConfigs.data.i32[i + STREAM_IS_INPUT_OFFSET]; 335cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT 336cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh && format == HAL_PIXEL_FORMAT_BLOB && 337cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh (width * height > maxJpegWidth * maxJpegHeight)) { 338cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh maxJpegWidth = width; 339cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh maxJpegHeight = height; 340cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 341cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 342cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } else { 343cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry availableJpegSizes = 344cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh mDeviceInfo.find(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 345cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (availableJpegSizes.count == 0 || availableJpegSizes.count % 2 != 0) { 346cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return Size(0, 0); 347cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 348cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 349cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh // Get max jpeg size (area-wise). 350cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i = 0; i < availableJpegSizes.count; i += 2) { 351cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if ((availableJpegSizes.data.i32[i] * availableJpegSizes.data.i32[i + 1]) 352cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh > (maxJpegWidth * maxJpegHeight)) { 353cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh maxJpegWidth = availableJpegSizes.data.i32[i]; 354cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh maxJpegHeight = availableJpegSizes.data.i32[i + 1]; 355cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 356f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 357f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 358cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return Size(maxJpegWidth, maxJpegHeight); 359cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh} 360cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 361cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yehssize_t Camera3Device::getJpegBufferSize(uint32_t width, uint32_t height) const { 362cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh // Get max jpeg size (area-wise). 363cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Size maxJpegResolution = getMaxJpegResolution(); 364cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (maxJpegResolution.width == 0) { 365cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh ALOGE("%s: Camera %d: Can't find find valid available jpeg sizes in static metadata!", 366cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh __FUNCTION__, mId); 367f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He return BAD_VALUE; 368f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 369f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 370f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He // Get max jpeg buffer size 371f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He ssize_t maxJpegBufferSize = 0; 372cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry jpegBufMaxSize = mDeviceInfo.find(ANDROID_JPEG_MAX_SIZE); 373cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (jpegBufMaxSize.count == 0) { 374f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He ALOGE("%s: Camera %d: Can't find maximum JPEG size in static metadata!", __FUNCTION__, mId); 375f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He return BAD_VALUE; 376f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 377cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh maxJpegBufferSize = jpegBufMaxSize.data.i32[0]; 3780c4e56d0baaa19fcf17234b38d634b7281e2ae37Yin-Chia Yeh assert(kMinJpegBufferSize < maxJpegBufferSize); 379f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 380f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He // Calculate final jpeg buffer size for the given resolution. 381cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh float scaleFactor = ((float) (width * height)) / 382cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh (maxJpegResolution.width * maxJpegResolution.height); 3830c4e56d0baaa19fcf17234b38d634b7281e2ae37Yin-Chia Yeh ssize_t jpegBufferSize = scaleFactor * (maxJpegBufferSize - kMinJpegBufferSize) + 3840c4e56d0baaa19fcf17234b38d634b7281e2ae37Yin-Chia Yeh kMinJpegBufferSize; 385f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He if (jpegBufferSize > maxJpegBufferSize) { 386f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He jpegBufferSize = maxJpegBufferSize; 387f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 388f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 389f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He return jpegBufferSize; 390f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He} 391f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 3927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::dump(int fd, const Vector<String16> &args) { 3937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 3947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)args; 395f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 396f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Try to lock, but continue in case of failure (to avoid blocking in 397f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // deadlocks) 398f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool gotInterfaceLock = tryLockSpinRightRound(mInterfaceLock); 399f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool gotLock = tryLockSpinRightRound(mLock); 400f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 401f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGW_IF(!gotInterfaceLock, 402f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala "Camera %d: %s: Unable to lock interface lock, proceeding anyway", 403f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, __FUNCTION__); 404f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGW_IF(!gotLock, 405f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala "Camera %d: %s: Unable to lock main lock, proceeding anyway", 406f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, __FUNCTION__); 407f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 408f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala String8 lines; 409f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 410f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const char *status = 411f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ERROR ? "ERROR" : 412f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_UNINITIALIZED ? "UNINITIALIZED" : 413f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus == STATUS_UNCONFIGURED ? "UNCONFIGURED" : 414f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus == STATUS_CONFIGURED ? "CONFIGURED" : 415f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ACTIVE ? "ACTIVE" : 416f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala "Unknown"; 417f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 418f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala lines.appendFormat(" Device status: %s\n", status); 419b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala if (mStatus == STATUS_ERROR) { 420b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala lines.appendFormat(" Error cause: %s\n", mErrorCause.string()); 421b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala } 422f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala lines.appendFormat(" Stream configuration:\n"); 4231fa8999c91d5df81949aa723000058380cd3faa2Zhijun He lines.appendFormat(" Operation mode: %s \n", mIsConstrainedHighSpeedConfiguration ? 4249a17941fa70e43119d2c3464bc00a3cd30b2bd14Eino-Ville Talvala "CONSTRAINED HIGH SPEED VIDEO" : "NORMAL"); 425f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 426f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream != NULL) { 427f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala write(fd, lines.string(), lines.size()); 428f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mInputStream->dump(fd, args); 429f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 430f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala lines.appendFormat(" No input stream.\n"); 431f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala write(fd, lines.string(), lines.size()); 432f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 433f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < mOutputStreams.size(); i++) { 434f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mOutputStreams[i]->dump(fd,args); 435f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 4367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 43742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala lines = String8(" In-flight requests:\n"); 43842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (mInFlightMap.size() == 0) { 43942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala lines.append(" None\n"); 44042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } else { 44142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala for (size_t i = 0; i < mInFlightMap.size(); i++) { 44242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightRequest r = mInFlightMap.valueAt(i); 443e5729fac81c8a984e984fefc90afc64135817d4fColin Cross lines.appendFormat(" Frame %d | Timestamp: %" PRId64 ", metadata" 44442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala " arrived: %s, buffers left: %d\n", mInFlightMap.keyAt(i), 44543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen r.shutterTimestamp, r.haveResultMetadata ? "true" : "false", 44642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala r.numBuffersLeft); 44742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 44842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 44942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala write(fd, lines.string(), lines.size()); 45042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 4511e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin { 4521e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin lines = String8(" Last request sent:\n"); 4531e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin write(fd, lines.string(), lines.size()); 4541e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 455f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala CameraMetadata lastRequest = getLatestRequestLocked(); 4561e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin lastRequest.dump(fd, /*verbosity*/2, /*indentation*/6); 4571e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin } 4581e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 459f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mHal3Device != NULL) { 46042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala lines = String8(" HAL device dump:\n"); 461f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala write(fd, lines.string(), lines.size()); 462f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device->ops->dump(mHal3Device, fd); 463f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 4647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 465f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (gotLock) mLock.unlock(); 466f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (gotInterfaceLock) mInterfaceLock.unlock(); 467f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 4687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return OK; 4697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 4707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaconst CameraMetadata& Camera3Device::info() const { 4727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ALOGVV("%s: E", __FUNCTION__); 473f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (CC_UNLIKELY(mStatus == STATUS_UNINITIALIZED || 474f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ERROR)) { 475b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala ALOGW("%s: Access to static info %s!", __FUNCTION__, 476f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mStatus == STATUS_ERROR ? 477f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala "when in error state" : "before init"); 478f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 4797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return mDeviceInfo; 4807fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 4817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 48290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::checkStatusOkToCaptureLocked() { 48390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei switch (mStatus) { 48490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_ERROR: 48590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("Device has encountered a serious error"); 48690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return INVALID_OPERATION; 48790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_UNINITIALIZED: 48890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("Device not initialized"); 48990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return INVALID_OPERATION; 49090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_UNCONFIGURED: 49190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_CONFIGURED: 49290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei case STATUS_ACTIVE: 49390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei // OK 49490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei break; 49590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei default: 49690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei SET_ERR_L("Unexpected status: %d", mStatus); 49790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return INVALID_OPERATION; 49890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 49990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return OK; 50090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 50190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 50290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::convertMetadataListToRequestListLocked( 50390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei const List<const CameraMetadata> &metadataList, RequestList *requestList) { 50490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (requestList == NULL) { 50590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("requestList cannot be NULL."); 50690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return BAD_VALUE; 50790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 50890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 509cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int32_t burstId = 0; 51090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei for (List<const CameraMetadata>::const_iterator it = metadataList.begin(); 51190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei it != metadataList.end(); ++it) { 51290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei sp<CaptureRequest> newRequest = setUpRequestLocked(*it); 51390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (newRequest == 0) { 51490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("Can't create capture request"); 51590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return BAD_VALUE; 51690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 517cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 518cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // Setup burst Id and request Id 519cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei newRequest->mResultExtras.burstId = burstId++; 520cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (it->exists(ANDROID_REQUEST_ID)) { 521cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (it->find(ANDROID_REQUEST_ID).count == 0) { 522cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CLOGE("RequestID entry exists; but must not be empty in metadata"); 523cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return BAD_VALUE; 524cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 525cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei newRequest->mResultExtras.requestId = it->find(ANDROID_REQUEST_ID).data.i32[0]; 526cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } else { 527cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CLOGE("RequestID does not exist in metadata"); 528cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return BAD_VALUE; 529cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 530cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 53190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei requestList->push_back(newRequest); 5322d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei 5332d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGV("%s: requestId = %" PRId32, __FUNCTION__, newRequest->mResultExtras.requestId); 53490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 53590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return OK; 53690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 53790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 538cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::capture(CameraMetadata &request, int64_t* /*lastFrameNumber*/) { 5397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 5404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 5412d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei List<const CameraMetadata> requests; 5422d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei requests.push_back(request); 5432d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei return captureList(requests, /*lastFrameNumber*/NULL); 5447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 5457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 54690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::submitRequestsHelper( 5472d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei const List<const CameraMetadata> &requests, bool repeating, 5482d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 5492d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber) { 55090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ATRACE_CALL(); 55190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei Mutex::Autolock il(mInterfaceLock); 55290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei Mutex::Autolock l(mLock); 55390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 55490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei status_t res = checkStatusOkToCaptureLocked(); 55590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (res != OK) { 55690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei // error logged by previous call 55790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return res; 55890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 55990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 56090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei RequestList requestList; 56190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 56290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei res = convertMetadataListToRequestListLocked(requests, /*out*/&requestList); 56390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (res != OK) { 56490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei // error logged by previous call 56590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return res; 56690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 56790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 56890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (repeating) { 5692d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei res = mRequestThread->setRepeatingRequests(requestList, lastFrameNumber); 57090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } else { 5712d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei res = mRequestThread->queueRequestList(requestList, lastFrameNumber); 57290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 57390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 57490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (res == OK) { 57590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei waitUntilStateThenRelock(/*active*/true, kActiveTimeout); 57690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei if (res != OK) { 57790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei SET_ERR_L("Can't transition to active in %f seconds!", 57890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei kActiveTimeout/1e9); 57990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 5802d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGV("Camera %d: Capture request %" PRId32 " enqueued", mId, 5812d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei (*(requestList.begin()))->mResultExtras.requestId); 58290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } else { 58390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei CLOGE("Cannot queue request. Impossible."); 58490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return BAD_VALUE; 58590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 58690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 58790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return res; 58890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 58990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 590cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::captureList(const List<const CameraMetadata> &requests, 591cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber) { 59290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ATRACE_CALL(); 59390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 594cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return submitRequestsHelper(requests, /*repeating*/false, lastFrameNumber); 59590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 5967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 597cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::setStreamingRequest(const CameraMetadata &request, 598cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t* /*lastFrameNumber*/) { 5997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 600f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 6012d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei List<const CameraMetadata> requests; 6022d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei requests.push_back(request); 6032d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei return setStreamingRequestList(requests, /*lastFrameNumber*/NULL); 604f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 605f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 606cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::setStreamingRequestList(const List<const CameraMetadata> &requests, 607cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber) { 60890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ATRACE_CALL(); 60990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 610cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return submitRequestsHelper(requests, /*repeating*/true, lastFrameNumber); 61190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 612f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 613f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::setUpRequestLocked( 614f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const CameraMetadata &request) { 615f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 616f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 617f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_UNCONFIGURED || mNeedConfig) { 618f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = configureStreamsLocked(); 6193ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // Stream configuration failed due to unsupported configuration. 6203ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // Device back to unconfigured state. Client might try other configuraitons 6213ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh if (res == BAD_VALUE && mStatus == STATUS_UNCONFIGURED) { 6223ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh CLOGE("No streams configured"); 6233ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return NULL; 6243ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh } 6253ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // Stream configuration failed for other reason. Fatal. 626f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 627b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't set up streams: %s (%d)", strerror(-res), res); 628f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 629f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 6303ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // Stream configuration successfully configure to empty stream configuration. 631f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_UNCONFIGURED) { 632f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala CLOGE("No streams configured"); 633f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return NULL; 634f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 635f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 636f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 637f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> newRequest = createCaptureRequest(request); 638f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return newRequest; 6397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 6407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 641cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::clearStreamingRequest(int64_t *lastFrameNumber) { 6427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 643f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 644f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 645f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 646f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 647f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 648b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 649f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 650f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 651b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device not initialized"); 652f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 653f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 654f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 655f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 656f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 657f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 658f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 659b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 660f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 661f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 662f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Clearing repeating request", mId); 663cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 6642d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei return mRequestThread->clearRepeatingRequests(lastFrameNumber); 6657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 6667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) { 6687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 669f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 6707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->waitUntilRequestProcessed(requestId, timeout); 6727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 6737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6745a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Device::createInputStream( 6755a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin uint32_t width, uint32_t height, int format, int *id) { 6765a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ATRACE_CALL(); 677f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 6785a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin Mutex::Autolock l(mLock); 679f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Creating new input stream %d: %d x %d, format %d", 680f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, mNextStreamId, width, height, format); 6815a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6825a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin status_t res; 6835a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin bool wasActive = false; 6845a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 6855a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin switch (mStatus) { 6865a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin case STATUS_ERROR: 6875a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: Device has encountered a serious error", __FUNCTION__); 6885a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 6895a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin case STATUS_UNINITIALIZED: 6905a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: Device not initialized", __FUNCTION__); 6915a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 692f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 693f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 6945a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin // OK 6955a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin break; 6965a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin case STATUS_ACTIVE: 6975a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); 698f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = internalPauseAndWaitLocked(); 6995a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (res != OK) { 700f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't pause captures to reconfigure streams!"); 7015a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return res; 7025a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 7035a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin wasActive = true; 7045a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin break; 7055a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin default: 706f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("%s: Unexpected status: %d", mStatus); 7075a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 7085a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 709f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala assert(mStatus != STATUS_ACTIVE); 7105a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 7115a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (mInputStream != 0) { 7125a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__); 7135a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 7145a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 7155a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 7165a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin sp<Camera3InputStream> newStream = new Camera3InputStream(mNextStreamId, 7175a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin width, height, format); 718f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala newStream->setStatusTracker(mStatusTracker); 7195a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 7205a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin mInputStream = newStream; 7215a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 7225a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin *id = mNextStreamId++; 7235a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 7245a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin // Continue captures if active at start 7255a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (wasActive) { 7265a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); 7275a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin res = configureStreamsLocked(); 7285a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin if (res != OK) { 7295a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)", 7305a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin __FUNCTION__, mNextStreamId, strerror(-res), res); 7315a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return res; 7325a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 733f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala internalResumeLocked(); 7345a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin } 7355a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 736f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Created input stream", mId); 7375a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return OK; 7385a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 7395a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 7402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinstatus_t Camera3Device::createZslStream( 7422fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin uint32_t width, uint32_t height, 7432fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int depth, 7442fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin /*out*/ 7452fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int *id, 7462fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3ZslStream>* zslStream) { 7472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ATRACE_CALL(); 748f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 7492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Mutex::Autolock l(mLock); 750f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Creating ZSL stream %d: %d x %d, depth %d", 751f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mId, mNextStreamId, width, height, depth); 7522fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7532fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin status_t res; 7542fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin bool wasActive = false; 7552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7562fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin switch (mStatus) { 7572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin case STATUS_ERROR: 7582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Device has encountered a serious error", __FUNCTION__); 7592fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 7602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin case STATUS_UNINITIALIZED: 7612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Device not initialized", __FUNCTION__); 7622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 763f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 764f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 7652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // OK 7662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin break; 7672fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin case STATUS_ACTIVE: 7682fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); 769f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = internalPauseAndWaitLocked(); 7702fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res != OK) { 771f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't pause captures to reconfigure streams!"); 7722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 7732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 7742fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin wasActive = true; 7752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin break; 7762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin default: 777f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 7782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 7792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 780f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala assert(mStatus != STATUS_ACTIVE); 7812fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7822fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (mInputStream != 0) { 7832fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__); 7842fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 7852fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 7862fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7872fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3ZslStream> newStream = new Camera3ZslStream(mNextStreamId, 7882fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin width, height, depth); 789f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala newStream->setStatusTracker(mStatusTracker); 7902fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 7912fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = mOutputStreams.add(mNextStreamId, newStream); 7922fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res < 0) { 7932fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Can't add new stream to set: %s (%d)", 7942fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__, strerror(-res), res); 7952fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 7962fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 7972fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mInputStream = newStream; 7982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 799e5e3d0823165dea9211a47232dbbbe361153fb49Yuvraj Pasi mNeedConfig = true; 800e5e3d0823165dea9211a47232dbbbe361153fb49Yuvraj Pasi 8012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin *id = mNextStreamId++; 8022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin *zslStream = newStream; 8032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 8042fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Continue captures if active at start 8052fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (wasActive) { 8062fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); 8072fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = configureStreamsLocked(); 8082fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res != OK) { 8092fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)", 8102fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__, mNextStreamId, strerror(-res), res); 8112fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 8122fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 813f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala internalResumeLocked(); 8142fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 8152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 816f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Created ZSL stream", mId); 8172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return OK; 8182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 8192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 820727d172137b4f32681c098de8e2623c0b65a6406Eino-Ville Talvalastatus_t Camera3Device::createStream(sp<Surface> consumer, 8213d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala uint32_t width, uint32_t height, int format, android_dataspace dataSpace, 822b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh camera3_stream_rotation_t rotation, int *id) { 8237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 824f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 825f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 826b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh ALOGV("Camera %d: Creating new stream %d: %d x %d, format %d, dataspace %d rotation %d", 827b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh mId, mNextStreamId, width, height, format, dataSpace, rotation); 8287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 829f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 830f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool wasActive = false; 831f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 832f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 833f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 834b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 835f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 836f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 837b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device not initialized"); 838f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 839f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 840f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 841f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 842f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 843f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 844f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); 845f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = internalPauseAndWaitLocked(); 846f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 847f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't pause captures to reconfigure streams!"); 848f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 849f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 850f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala wasActive = true; 851f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 852f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 853b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 854f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 855f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 856f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala assert(mStatus != STATUS_ACTIVE); 857f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 858f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<Camera3OutputStream> newStream; 859f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (format == HAL_PIXEL_FORMAT_BLOB) { 860f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He ssize_t jpegBufferSize = getJpegBufferSize(width, height); 86128c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He if (jpegBufferSize <= 0) { 862f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He SET_ERR_L("Invalid jpeg buffer size %zd", jpegBufferSize); 863f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He return BAD_VALUE; 864f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He } 865f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He 866f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newStream = new Camera3OutputStream(mNextStreamId, consumer, 867b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh width, height, jpegBufferSize, format, dataSpace, rotation); 868f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 869f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newStream = new Camera3OutputStream(mNextStreamId, consumer, 870b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh width, height, format, dataSpace, rotation); 871f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 872f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala newStream->setStatusTracker(mStatusTracker); 873f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 874f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mOutputStreams.add(mNextStreamId, newStream); 875f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res < 0) { 876b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't add new stream to set: %s (%d)", strerror(-res), res); 877f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 878f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 879f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 880f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala *id = mNextStreamId++; 881ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala mNeedConfig = true; 882f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 883f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Continue captures if active at start 884f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (wasActive) { 885f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); 886f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = configureStreamsLocked(); 887f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 888b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Can't reconfigure device for new stream %d: %s (%d)", 889b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala mNextStreamId, strerror(-res), res); 890f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 891f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 892f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala internalResumeLocked(); 893f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 894f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("Camera %d: Created new stream", mId); 895f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 8967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 8977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createReprocessStreamFromStream(int outputId, int *id) { 8997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 9007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)outputId; (void)id; 9017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 902b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Unimplemented"); 9037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 9047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 9057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 9067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 9077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::getStreamInfo(int id, 908d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala uint32_t *width, uint32_t *height, 909d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala uint32_t *format, android_dataspace *dataSpace) { 9107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 911f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 912f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 913f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 914f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 915f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 916b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 917f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 918f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 919b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device not initialized!"); 920f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 921f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 922f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 923f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 924f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 925f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 926f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 927b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 928f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 929f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 9307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 931f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ssize_t idx = mOutputStreams.indexOfKey(id); 932f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (idx == NAME_NOT_FOUND) { 933b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Stream %d is unknown", id); 934f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return idx; 935f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 936f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 937f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (width) *width = mOutputStreams[idx]->getWidth(); 938f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (height) *height = mOutputStreams[idx]->getHeight(); 939f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (format) *format = mOutputStreams[idx]->getFormat(); 940d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala if (dataSpace) *dataSpace = mOutputStreams[idx]->getDataSpace(); 941f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 9427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 9437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 9447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setStreamTransform(int id, 9457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala int transform) { 9467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 947f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 948f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 949f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 950f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 951f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 952b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 953f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 954f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 955b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device not initialized"); 956f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 957f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 958f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 959f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 960f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 961f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 962f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 963b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 964f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 965f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 9667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 967f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ssize_t idx = mOutputStreams.indexOfKey(id); 968f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (idx == NAME_NOT_FOUND) { 969b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Stream %d does not exist", 970b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala id); 971f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return BAD_VALUE; 972f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 973f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 974f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return mOutputStreams.editValueAt(idx)->setTransform(transform); 9757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 9767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 9777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteStream(int id) { 9787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 979f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 980f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 981f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 9827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 983e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin ALOGV("%s: Camera %d: Deleting stream %d", __FUNCTION__, mId, id); 984e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin 985f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // CameraDevice semantics require device to already be idle before 986f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // deleteStream is called, unlike for createStream. 987f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus == STATUS_ACTIVE) { 9885282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGV("%s: Camera %d: Device not idle", __FUNCTION__, mId); 9895282713a976184e41451315f1286d8075b257d58Igor Murashkin return -EBUSY; 990f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 991f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 9922fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3StreamInterface> deletedStream; 9935f44635dc35814b98b4dc2b255355a93122fec59Zhijun He ssize_t outputStreamIdx = mOutputStreams.indexOfKey(id); 994f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream != NULL && id == mInputStream->getId()) { 995f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala deletedStream = mInputStream; 996f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mInputStream.clear(); 997f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 9985f44635dc35814b98b4dc2b255355a93122fec59Zhijun He if (outputStreamIdx == NAME_NOT_FOUND) { 999b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Stream %d does not exist", id); 1000f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return BAD_VALUE; 1001f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 10025f44635dc35814b98b4dc2b255355a93122fec59Zhijun He } 10035f44635dc35814b98b4dc2b255355a93122fec59Zhijun He 10045f44635dc35814b98b4dc2b255355a93122fec59Zhijun He // Delete output stream or the output part of a bi-directional stream. 10055f44635dc35814b98b4dc2b255355a93122fec59Zhijun He if (outputStreamIdx != NAME_NOT_FOUND) { 10065f44635dc35814b98b4dc2b255355a93122fec59Zhijun He deletedStream = mOutputStreams.editValueAt(outputStreamIdx); 1007f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mOutputStreams.removeItem(id); 1008f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1009f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1010f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Free up the stream endpoint so that it can be used by some other stream 1011f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = deletedStream->disconnect(); 1012f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1013b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't disconnect deleted stream %d", id); 1014f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // fall through since we want to still list the stream as deleted. 1015f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1016f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDeletedStreams.add(deletedStream); 1017ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala mNeedConfig = true; 1018f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1019f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 10207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 10217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 10227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteReprocessStream(int id) { 10237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 10247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)id; 10257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1026b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Unimplemented"); 10277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 10287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 10297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 10301fa8999c91d5df81949aa723000058380cd3faa2Zhijun Hestatus_t Camera3Device::configureStreams(bool isConstrainedHighSpeed) { 1031e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin ATRACE_CALL(); 1032e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin ALOGV("%s: E", __FUNCTION__); 1033e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin 1034e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin Mutex::Autolock il(mInterfaceLock); 1035e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin Mutex::Autolock l(mLock); 10361fa8999c91d5df81949aa723000058380cd3faa2Zhijun He mIsConstrainedHighSpeedConfiguration = isConstrainedHighSpeed; 1037e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin 1038e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin return configureStreamsLocked(); 1039e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin} 10407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1041618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chenstatus_t Camera3Device::getInputBufferProducer( 1042618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen sp<IGraphicBufferProducer> *producer) { 1043618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen Mutex::Autolock il(mInterfaceLock); 1044618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen Mutex::Autolock l(mLock); 1045618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 1046618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen if (producer == NULL) { 1047618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen return BAD_VALUE; 1048618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } else if (mInputStream == NULL) { 1049618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen return INVALID_OPERATION; 1050618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } 1051618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 1052618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen return mInputStream->getInputBufferProducer(producer); 1053618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen} 1054618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 10557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createDefaultRequest(int templateId, 10567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala CameraMetadata *request) { 10577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1058fe7e0c6154309f2491463ee6ca4920d225289638Alex Ray ALOGV("%s: for template %d", __FUNCTION__, templateId); 1059f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1060f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 1061f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1062f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 1063f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 1064b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device has encountered a serious error"); 1065f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1066f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 1067b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Device is not initialized!"); 1068f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1069f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 1070f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 1071f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 1072f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // OK 1073f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 1074f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 1075b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d", mStatus); 1076f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1077f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 10787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1079a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He if (!mRequestTemplateCache[templateId].isEmpty()) { 1080a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He *request = mRequestTemplateCache[templateId]; 1081a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He return OK; 1082a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He } 1083a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He 10847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera_metadata_t *rawRequest; 108517a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->construct_default_request_settings"); 10867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala rawRequest = mHal3Device->ops->construct_default_request_settings( 10877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal3Device, templateId); 108817a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 1089b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala if (rawRequest == NULL) { 10900336d3649f13506a7daf425690d225beac9d214fYin-Chia Yeh ALOGI("%s: template %d is not supported on this camera device", 10910336d3649f13506a7daf425690d225beac9d214fYin-Chia Yeh __FUNCTION__, templateId); 10920336d3649f13506a7daf425690d225beac9d214fYin-Chia Yeh return BAD_VALUE; 1093b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala } 10947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala *request = rawRequest; 1095a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He mRequestTemplateCache[templateId] = rawRequest; 10967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 10977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return OK; 10987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 10997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilDrained() { 11017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1102f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1103f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mLock); 11047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 110569a374897392c8bd70f441b7284f6f578c651ec9Zhijun He return waitUntilDrainedLocked(); 110669a374897392c8bd70f441b7284f6f578c651ec9Zhijun He} 110769a374897392c8bd70f441b7284f6f578c651ec9Zhijun He 110869a374897392c8bd70f441b7284f6f578c651ec9Zhijun Hestatus_t Camera3Device::waitUntilDrainedLocked() { 1109f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala switch (mStatus) { 1110f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_UNINITIALIZED: 1111f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_UNCONFIGURED: 1112f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ALOGV("%s: Already idle", __FUNCTION__); 1113f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 1114f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala case STATUS_CONFIGURED: 1115f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // To avoid race conditions, check with tracker to be sure 1116f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ERROR: 1117f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala case STATUS_ACTIVE: 1118f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Need to verify shut down 1119f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 1120f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala default: 1121b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unexpected status: %d",mStatus); 1122f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1123f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1124f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1125f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Waiting until idle", __FUNCTION__, mId); 1126f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout); 11279c8a091436052fb0f3290356abe1ac55b7bae8a2Eino-Ville Talvala if (res != OK) { 11289c8a091436052fb0f3290356abe1ac55b7bae8a2Eino-Ville Talvala SET_ERR_L("Error waiting for HAL to drain: %s (%d)", strerror(-res), 11299c8a091436052fb0f3290356abe1ac55b7bae8a2Eino-Ville Talvala res); 11309c8a091436052fb0f3290356abe1ac55b7bae8a2Eino-Ville Talvala } 1131f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 1132f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 1133f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1134f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// Pause to reconfigure 1135f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::internalPauseAndWaitLocked() { 1136f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread->setPaused(true); 1137f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mPauseStateNotify = true; 1138f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1139f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Internal wait until idle", __FUNCTION__, mId); 1140f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout); 1141f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) { 1142f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't idle device in %f seconds!", 1143f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala kShutdownTimeout/1e9); 1144f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1145f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1146f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 1147f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 1148f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1149f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// Resume after internalPauseAndWaitLocked 1150f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::internalResumeLocked() { 1151f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t res; 1152f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1153f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestThread->setPaused(false); 1154f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1155f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = waitUntilStateThenRelock(/*active*/ true, kActiveTimeout); 1156f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) { 1157f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala SET_ERR_L("Can't transition to active in %f seconds!", 1158f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala kActiveTimeout/1e9); 1159f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1160f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mPauseStateNotify = false; 1161f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return OK; 1162f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 1163f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1164f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::waitUntilStateThenRelock(bool active, 1165f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala nsecs_t timeout) { 1166f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t res = OK; 1167f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (active == (mStatus == STATUS_ACTIVE)) { 1168f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Desired state already reached 1169f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 1170f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1171f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1172f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool stateSeen = false; 1173f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala do { 1174f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRecentStatusUpdates.clear(); 1175f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1176f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala res = mStatusChanged.waitRelative(mLock, timeout); 1177f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res != OK) break; 1178f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1179f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Check state change history during wait 1180f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala for (size_t i = 0; i < mRecentStatusUpdates.size(); i++) { 1181f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (active == (mRecentStatusUpdates[i] == STATUS_ACTIVE) ) { 1182f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala stateSeen = true; 1183f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala break; 1184f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1185f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1186f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } while (!stateSeen); 1187f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1188f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return res; 11897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 11907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1191f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 11927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setNotifyCallback(NotificationListener *listener) { 11937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 11947d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 11957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 11967d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (listener != NULL && mListener != NULL) { 11977d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ALOGW("%s: Replacing old callback listener", __FUNCTION__); 11987d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 11997d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mListener = listener; 12004d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mRequestThread->setNotificationListener(listener); 12014d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mPreparerThread->setNotificationListener(listener); 12027d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 12037d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return OK; 12047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 12057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 120646910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvalabool Camera3Device::willNotify3A() { 120746910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala return false; 120846910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala} 120946910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala 12107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitForNextFrame(nsecs_t timeout) { 12117d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala status_t res; 12127d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 12137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 12147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala while (mResultQueue.empty()) { 12157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala res = mResultSignal.waitRelative(mOutputLock, timeout); 12167d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (res == TIMED_OUT) { 12177d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return res; 12187d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } else if (res != OK) { 1219e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGW("%s: Camera %d: No frame in %" PRId64 " ns: %s (%d)", 1220b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala __FUNCTION__, mId, timeout, strerror(-res), res); 12217d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return res; 12227d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 12237d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 12247d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return OK; 12257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 12267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1227cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::getNextResult(CaptureResult *frame) { 12287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 12297d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 12307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 12317d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (mResultQueue.empty()) { 12327d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return NOT_ENOUGH_DATA; 12337d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 12347d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 1235cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (frame == NULL) { 1236cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGE("%s: argument cannot be NULL", __FUNCTION__); 1237cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei return BAD_VALUE; 1238cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } 1239cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 1240cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResult &result = *(mResultQueue.begin()); 1241cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei frame->mResultExtras = result.mResultExtras; 1242cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei frame->mMetadata.acquire(result.mMetadata); 12437d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala mResultQueue.erase(mResultQueue.begin()); 12447d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 12457d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return OK; 12467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 12477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 12487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerAutofocus(uint32_t id) { 12497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1250f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 12517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 12524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id); 12534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in this trigger into the next request and only the next request. 12544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[] = { 12554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 12564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER, 12574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_START 12584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 12594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 12604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_ID, 12614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin static_cast<int32_t>(id) 1262741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 12634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 12644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 12654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->queueTrigger(trigger, 12664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin sizeof(trigger)/sizeof(trigger[0])); 12677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 12687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 12697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerCancelAutofocus(uint32_t id) { 12707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1271f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 12727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 12734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Triggering cancel autofocus, id %d", __FUNCTION__, id); 12744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in this trigger into the next request and only the next request. 12754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[] = { 12764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 12774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER, 12784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_CANCEL 12794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 12804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 12814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER_ID, 12824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin static_cast<int32_t>(id) 1283741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 12844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 12854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 12864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->queueTrigger(trigger, 12874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin sizeof(trigger)/sizeof(trigger[0])); 12887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 12897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 12907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerPrecaptureMetering(uint32_t id) { 12917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 1292f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 12937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 12944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id); 12954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in this trigger into the next request and only the next request. 12964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[] = { 12974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 12984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, 12994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START 13004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }, 13014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin { 13024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AE_PRECAPTURE_ID, 13034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin static_cast<int32_t>(id) 1304741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 13054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 13064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 13074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return mRequestThread->queueTrigger(trigger, 13084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin sizeof(trigger)/sizeof(trigger[0])); 13097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 13107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 13117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::pushReprocessBuffer(int reprocessStreamId, 13127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala buffer_handle_t *buffer, wp<BufferReleasedListener> listener) { 13137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala ATRACE_CALL(); 13147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala (void)reprocessStreamId; (void)buffer; (void)listener; 13157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1316b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Unimplemented"); 13177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala return INVALID_OPERATION; 13187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 13197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1320cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::flush(int64_t *frameNumber) { 1321abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala ATRACE_CALL(); 1322abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala ALOGV("%s: Camera %d: Flushing all requests", __FUNCTION__, mId); 1323f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1324abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 13251754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala NotificationListener* listener; 13261754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala { 13271754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala Mutex::Autolock l(mOutputLock); 13281754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala listener = mListener; 13291754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 13301754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 13317ef20390ba4375c4b08edd14923846086987a8c8Zhijun He { 13327ef20390ba4375c4b08edd14923846086987a8c8Zhijun He Mutex::Autolock l(mLock); 13331754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala mRequestThread->clear(listener, /*out*/frameNumber); 13347ef20390ba4375c4b08edd14923846086987a8c8Zhijun He } 13357ef20390ba4375c4b08edd14923846086987a8c8Zhijun He 1336491e341211b4772c75f719158f6b397e1c40497dZhijun He status_t res; 1337491e341211b4772c75f719158f6b397e1c40497dZhijun He if (mHal3Device->common.version >= CAMERA_DEVICE_API_VERSION_3_1) { 1338491e341211b4772c75f719158f6b397e1c40497dZhijun He res = mHal3Device->ops->flush(mHal3Device); 1339491e341211b4772c75f719158f6b397e1c40497dZhijun He } else { 13407ef20390ba4375c4b08edd14923846086987a8c8Zhijun He Mutex::Autolock l(mLock); 134169a374897392c8bd70f441b7284f6f578c651ec9Zhijun He res = waitUntilDrainedLocked(); 1342491e341211b4772c75f719158f6b397e1c40497dZhijun He } 1343491e341211b4772c75f719158f6b397e1c40497dZhijun He 1344491e341211b4772c75f719158f6b397e1c40497dZhijun He return res; 1345abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala} 1346abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 13474d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvalastatus_t Camera3Device::prepare(int streamId) { 13484d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ATRACE_CALL(); 13494d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Camera %d: Preparing stream %d", __FUNCTION__, mId, streamId); 1350261394e3edbe10f4f145f543187dcfbabf702c11Eino-Ville Talvala Mutex::Autolock il(mInterfaceLock); 1351261394e3edbe10f4f145f543187dcfbabf702c11Eino-Ville Talvala Mutex::Autolock l(mLock); 13524d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 13534d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala sp<Camera3StreamInterface> stream; 13544d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ssize_t outputStreamIdx = mOutputStreams.indexOfKey(streamId); 13554d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (outputStreamIdx == NAME_NOT_FOUND) { 13564d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala CLOGE("Stream %d does not exist", streamId); 13574d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return BAD_VALUE; 13584d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 13594d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 13604d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala stream = mOutputStreams.editValueAt(outputStreamIdx); 13614d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 13624d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (stream->isUnpreparable() || stream->hasOutstandingBuffers() ) { 1363261394e3edbe10f4f145f543187dcfbabf702c11Eino-Ville Talvala CLOGE("Stream %d has already been a request target", streamId); 13644d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return BAD_VALUE; 13654d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 13664d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 13674d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (mRequestThread->isStreamPending(stream)) { 1368261394e3edbe10f4f145f543187dcfbabf702c11Eino-Ville Talvala CLOGE("Stream %d is already a target in a pending request", streamId); 13694d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return BAD_VALUE; 13704d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 13714d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 13724d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return mPreparerThread->prepare(stream); 13734d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 13744d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 1375204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun Heuint32_t Camera3Device::getDeviceVersion() { 1376204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He ATRACE_CALL(); 1377204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He Mutex::Autolock il(mInterfaceLock); 1378204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He return mDeviceVersion; 1379204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He} 1380204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 1381f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 1382f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Methods called by subclasses 1383f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 1384f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1385f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid Camera3Device::notifyStatus(bool idle) { 1386f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala { 1387f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Need mLock to safely update state and synchronize to current 1388f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // state of methods in flight. 1389f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mLock); 1390f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // We can get various system-idle notices from the status tracker 1391f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // while starting up. Only care about them if we've actually sent 1392f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // in some requests recently. 1393f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus != STATUS_ACTIVE && mStatus != STATUS_CONFIGURED) { 1394f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return; 1395f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1396f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Now %s", __FUNCTION__, mId, 1397f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala idle ? "idle" : "active"); 1398f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus = idle ? STATUS_CONFIGURED : STATUS_ACTIVE; 1399f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRecentStatusUpdates.add(mStatus); 1400f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusChanged.signal(); 1401f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1402f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Skip notifying listener if we're doing some user-transparent 1403f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // state changes 1404f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mPauseStateNotify) return; 1405f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1406f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala NotificationListener *listener; 1407f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala { 1408f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mOutputLock); 1409f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala listener = mListener; 1410f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1411f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (idle && listener != NULL) { 1412f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala listener->notifyIdle(); 1413f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1414f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 1415f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1416f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala/** 1417f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera3Device private methods 1418f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 1419f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1420f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::createCaptureRequest( 1421f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const CameraMetadata &request) { 1422f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ATRACE_CALL(); 1423f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 1424f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1425f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> newRequest = new CaptureRequest; 1426f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings = request; 1427f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1428f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera_metadata_entry_t inputStreams = 1429f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.find(ANDROID_REQUEST_INPUT_STREAMS); 1430f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (inputStreams.count > 0) { 1431f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream == NULL || 1432d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He mInputStream->getId() != inputStreams.data.i32[0]) { 1433b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Request references unknown input stream %d", 1434b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala inputStreams.data.u8[0]); 1435f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1436f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1437f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Lazy completion of stream configuration (allocation/registration) 1438f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // on first use 1439f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream->isConfiguring()) { 1440f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mInputStream->finishConfiguration(mHal3Device); 1441f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1442b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to finish configuring input stream %d:" 1443f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala " %s (%d)", 1444b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala mInputStream->getId(), strerror(-res), res); 1445f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1446f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1447f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 14484d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // Check if stream is being prepared 14494d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (mInputStream->isPreparing()) { 14504d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala CLOGE("Request references an input stream that's being prepared!"); 14514d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return NULL; 14524d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 1453f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1454f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mInputStream = mInputStream; 1455f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.erase(ANDROID_REQUEST_INPUT_STREAMS); 1456f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1457f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1458f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera_metadata_entry_t streams = 1459f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.find(ANDROID_REQUEST_OUTPUT_STREAMS); 1460f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (streams.count == 0) { 1461b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Zero output streams specified!"); 1462f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1463f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1464f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1465f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < streams.count; i++) { 1466d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He int idx = mOutputStreams.indexOfKey(streams.data.i32[i]); 1467f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (idx == NAME_NOT_FOUND) { 1468b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Request references unknown stream %d", 1469b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala streams.data.u8[i]); 1470f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1471f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 14722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3OutputStreamInterface> stream = 14732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mOutputStreams.editValueAt(idx); 1474f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1475f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Lazy completion of stream configuration (allocation/registration) 1476f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // on first use 1477f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (stream->isConfiguring()) { 1478f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = stream->finishConfiguration(mHal3Device); 1479f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 1480b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to finish configuring stream %d: %s (%d)", 1481b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala stream->getId(), strerror(-res), res); 1482f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 1483f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1484f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 14854d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // Check if stream is being prepared 14864d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (stream->isPreparing()) { 14874d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala CLOGE("Request references an output stream that's being prepared!"); 14884d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return NULL; 14894d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 1490f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1491f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mOutputStreams.push(stream); 1492f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1493f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala newRequest->mSettings.erase(ANDROID_REQUEST_OUTPUT_STREAMS); 1494f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1495f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return newRequest; 14967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 14977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1498618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chenbool Camera3Device::isOpaqueInputSizeSupported(uint32_t width, uint32_t height) { 1499618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen for (uint32_t i = 0; i < mSupportedOpaqueInputSizes.size(); i++) { 1500618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen Size size = mSupportedOpaqueInputSizes[i]; 1501618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen if (size.width == width && size.height == height) { 1502618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen return true; 1503618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } 1504618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } 1505618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 1506618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen return false; 1507618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen} 1508618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 1509f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::configureStreamsLocked() { 1510f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ATRACE_CALL(); 1511f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 15127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1513f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatus != STATUS_UNCONFIGURED && mStatus != STATUS_CONFIGURED) { 1514b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala CLOGE("Not idle"); 1515f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1516f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1517f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1518ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala if (!mNeedConfig) { 1519ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala ALOGV("%s: Skipping config, no stream changes", __FUNCTION__); 1520ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala return OK; 1521ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala } 1522ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala 152316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // Workaround for device HALv3.2 or older spec bug - zero streams requires 152416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // adding a dummy stream instead. 152516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // TODO: Bug: 17321404 for fixing the HAL spec and removing this workaround. 152616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala if (mOutputStreams.size() == 0) { 152716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala addDummyStreamLocked(); 152816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala } else { 152916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala tryRemoveDummyStreamLocked(); 153016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala } 153116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 1532f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Start configuring the streams 1533f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Starting stream configuration", __FUNCTION__, mId); 1534f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1535f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_configuration config; 15361fa8999c91d5df81949aa723000058380cd3faa2Zhijun He config.operation_mode = mIsConstrainedHighSpeedConfiguration ? 15371fa8999c91d5df81949aa723000058380cd3faa2Zhijun He CAMERA3_STREAM_CONFIGURATION_CONSTRAINED_HIGH_SPEED_MODE : 15381fa8999c91d5df81949aa723000058380cd3faa2Zhijun He CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE; 1539f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala config.num_streams = (mInputStream != NULL) + mOutputStreams.size(); 1540f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1541f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<camera3_stream_t*> streams; 1542f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala streams.setCapacity(config.num_streams); 1543f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1544f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mInputStream != NULL) { 1545f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_t *inputStream; 1546f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala inputStream = mInputStream->startConfiguration(); 1547f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (inputStream == NULL) { 1548b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't start input stream configuration"); 1549f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1550f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1551f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala streams.add(inputStream); 1552f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1553f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1554f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < mOutputStreams.size(); i++) { 15552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 15562fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Don't configure bidi streams twice, nor add them twice to the list 15572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (mOutputStreams[i].get() == 15582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin static_cast<Camera3StreamInterface*>(mInputStream.get())) { 15592fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 15602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin config.num_streams--; 15612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin continue; 15622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 15632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1564f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_stream_t *outputStream; 1565f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputStream = mOutputStreams.editValueAt(i)->startConfiguration(); 1566f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (outputStream == NULL) { 1567b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Can't start output stream configuration"); 1568f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return INVALID_OPERATION; 1569f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1570f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala streams.add(outputStream); 1571f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1572f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1573f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala config.streams = streams.editArray(); 1574f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1575f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Do the HAL configuration; will potentially touch stream 1576f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // max_buffers, usage, priv fields. 157717a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->configure_streams"); 1578f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mHal3Device->ops->configure_streams(mHal3Device, &config); 157917a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 1580f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 15811754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (res == BAD_VALUE) { 15821754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // HAL rejected this set of streams as unsupported, clean up config 15831754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // attempt and return to unconfigured state 15841754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (mInputStream != NULL && mInputStream->isConfiguring()) { 15851754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala res = mInputStream->cancelConfiguration(); 15861754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (res != OK) { 15871754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala SET_ERR_L("Can't cancel configuring input stream %d: %s (%d)", 15881754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala mInputStream->getId(), strerror(-res), res); 15891754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala return res; 15901754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 15911754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 15921754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 15931754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala for (size_t i = 0; i < mOutputStreams.size(); i++) { 15941754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala sp<Camera3OutputStreamInterface> outputStream = 15951754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala mOutputStreams.editValueAt(i); 15961754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (outputStream->isConfiguring()) { 15971754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala res = outputStream->cancelConfiguration(); 15981754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (res != OK) { 15991754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala SET_ERR_L( 16001754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala "Can't cancel configuring output stream %d: %s (%d)", 16011754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala outputStream->getId(), strerror(-res), res); 16021754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala return res; 16031754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 16041754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 16051754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 16061754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 16071754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Return state to that at start of call, so that future configures 16081754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // properly clean things up 16091754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala mStatus = STATUS_UNCONFIGURED; 16101754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala mNeedConfig = true; 16111754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 16121754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ALOGV("%s: Camera %d: Stream configuration failed", __FUNCTION__, mId); 16131754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala return BAD_VALUE; 16141754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } else if (res != OK) { 16151754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Some other kind of error from configure_streams - this is not 16161754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // expected 1617b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR_L("Unable to configure streams with HAL: %s (%d)", 1618b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala strerror(-res), res); 1619f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return res; 1620f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 1621f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 16224c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala // Finish all stream configuration immediately. 16234c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala // TODO: Try to relax this later back to lazy completion, which should be 16244c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala // faster 16254c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala 1626073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin if (mInputStream != NULL && mInputStream->isConfiguring()) { 16274c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala res = mInputStream->finishConfiguration(mHal3Device); 16284c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala if (res != OK) { 16294c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala SET_ERR_L("Can't finish configuring input stream %d: %s (%d)", 16304c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala mInputStream->getId(), strerror(-res), res); 16314c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala return res; 16324c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala } 16334c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala } 16344c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala 16354c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala for (size_t i = 0; i < mOutputStreams.size(); i++) { 1636073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin sp<Camera3OutputStreamInterface> outputStream = 1637073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin mOutputStreams.editValueAt(i); 1638073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin if (outputStream->isConfiguring()) { 1639073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin res = outputStream->finishConfiguration(mHal3Device); 1640073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin if (res != OK) { 1641073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin SET_ERR_L("Can't finish configuring output stream %d: %s (%d)", 1642073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin outputStream->getId(), strerror(-res), res); 1643073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin return res; 1644073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin } 16454c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala } 16464c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala } 16474c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala 1648f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Request thread needs to know to avoid using repeat-last-settings protocol 1649f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // across configure_streams() calls 1650f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestThread->configurationComplete(); 1651f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1652f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Update device state 1653f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1654ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala mNeedConfig = false; 1655f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 165616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala if (mDummyStreamId == NO_STREAM) { 1657f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus = STATUS_CONFIGURED; 1658f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } else { 1659f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatus = STATUS_UNCONFIGURED; 1660f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 1661f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1662f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: Camera %d: Stream configuration complete", __FUNCTION__, mId); 1663f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 16640a21051b91c2e07e49eb6fa568c505aee967ab9dZhijun He // tear down the deleted streams after configure streams. 16650a21051b91c2e07e49eb6fa568c505aee967ab9dZhijun He mDeletedStreams.clear(); 16660a21051b91c2e07e49eb6fa568c505aee967ab9dZhijun He 1667f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 16687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 16697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 167016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvalastatus_t Camera3Device::addDummyStreamLocked() { 167116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala ATRACE_CALL(); 167216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala status_t res; 167316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 167416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala if (mDummyStreamId != NO_STREAM) { 167516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // Should never be adding a second dummy stream when one is already 167616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // active 167716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala SET_ERR_L("%s: Camera %d: A dummy stream already exists!", 167816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala __FUNCTION__, mId); 167916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala return INVALID_OPERATION; 168016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala } 168116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 168216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala ALOGV("%s: Camera %d: Adding a dummy stream", __FUNCTION__, mId); 168316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 168416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala sp<Camera3OutputStreamInterface> dummyStream = 168516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala new Camera3DummyStream(mNextStreamId); 168616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 168716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala res = mOutputStreams.add(mNextStreamId, dummyStream); 168816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala if (res < 0) { 168916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala SET_ERR_L("Can't add dummy stream to set: %s (%d)", strerror(-res), res); 169016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala return res; 169116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala } 169216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 169316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala mDummyStreamId = mNextStreamId; 169416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala mNextStreamId++; 169516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 169616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala return OK; 169716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala} 169816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 169916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvalastatus_t Camera3Device::tryRemoveDummyStreamLocked() { 170016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala ATRACE_CALL(); 170116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala status_t res; 170216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 170316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala if (mDummyStreamId == NO_STREAM) return OK; 170416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala if (mOutputStreams.size() == 1) return OK; 170516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 170616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala ALOGV("%s: Camera %d: Removing the dummy stream", __FUNCTION__, mId); 170716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 170816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // Ok, have a dummy stream and there's at least one other output stream, 170916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // so remove the dummy 171016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 171116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala sp<Camera3StreamInterface> deletedStream; 171216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala ssize_t outputStreamIdx = mOutputStreams.indexOfKey(mDummyStreamId); 171316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala if (outputStreamIdx == NAME_NOT_FOUND) { 171416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala SET_ERR_L("Dummy stream %d does not appear to exist", mDummyStreamId); 171516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala return INVALID_OPERATION; 171616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala } 171716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 171816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala deletedStream = mOutputStreams.editValueAt(outputStreamIdx); 171916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala mOutputStreams.removeItemsAt(outputStreamIdx); 172016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 172116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // Free up the stream endpoint so that it can be used by some other stream 172216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala res = deletedStream->disconnect(); 172316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala if (res != OK) { 172416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala SET_ERR_L("Can't disconnect deleted dummy stream %d", mDummyStreamId); 172516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // fall through since we want to still list the stream as deleted. 172616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala } 172716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala mDeletedStreams.add(deletedStream); 172816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala mDummyStreamId = NO_STREAM; 172916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 173016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala return res; 173116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala} 173216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 1733b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorState(const char *fmt, ...) { 1734b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala Mutex::Autolock l(mLock); 1735b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_list args; 1736b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_start(args, fmt); 1737b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1738b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala setErrorStateLockedV(fmt, args); 1739b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1740b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_end(args); 1741b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 1742b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1743b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateV(const char *fmt, va_list args) { 1744b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala Mutex::Autolock l(mLock); 1745b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala setErrorStateLockedV(fmt, args); 1746b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 1747b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1748b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateLocked(const char *fmt, ...) { 1749b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_list args; 1750b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_start(args, fmt); 1751b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1752b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala setErrorStateLockedV(fmt, args); 1753b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1754b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_end(args); 1755b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 1756b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1757b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateLockedV(const char *fmt, va_list args) { 175842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Print out all error messages to log 175942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala String8 errorCause = String8::formatV(fmt, args); 176042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ALOGE("Camera %d: %s", mId, errorCause.string()); 176142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 176242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // But only do error state transition steps for the first error 1763b05eeaedacaff92b6e5ac89f99b0fccdf7643f09Zhijun He if (mStatus == STATUS_ERROR || mStatus == STATUS_UNINITIALIZED) return; 1764b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 176542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mErrorCause = errorCause; 176642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 176742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mRequestThread->setPaused(true); 1768b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala mStatus = STATUS_ERROR; 17691754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 17701754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Notify upstream about a device error 17711754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (mListener != NULL) { 17721754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala mListener->notifyError(ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE, 17731754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala CaptureResultExtras()); 17741754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 17751754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 17761754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Save stack trace. View by dumping it later. 17771754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala CameraTraces::saveTrace(); 17781754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // TODO: consider adding errorCause and client pid/procname 1779b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 1780f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1781f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 178242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala * In-flight request management 178342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala */ 178442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 1785cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::registerInFlight(uint32_t frameNumber, 1786d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen int32_t numBuffers, CaptureResultExtras resultExtras, bool hasInput, 1787d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen const AeTriggerCancelOverride_t &aeTriggerCancelOverride) { 178842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ATRACE_CALL(); 178942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex::Autolock l(mInFlightLock); 179042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 179142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ssize_t res; 1792d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen res = mInFlightMap.add(frameNumber, InFlightRequest(numBuffers, resultExtras, hasInput, 1793d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen aeTriggerCancelOverride)); 179442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (res < 0) return res; 179542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 179642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return OK; 179742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala} 179842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 179942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala/** 1800fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * Check if all 3A fields are ready, and send off a partial 3A-only result 1801fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * to the output frame queue 1802fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala */ 1803204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun Hebool Camera3Device::processPartial3AResult( 1804cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei uint32_t frameNumber, 1805cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei const CameraMetadata& partial, const CaptureResultExtras& resultExtras) { 1806fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1807fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Check if all 3A states are present 1808fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // The full list of fields is 1809fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.afMode 1810fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.awbMode 1811fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.aeState 1812fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.awbState 1813fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.afState 1814fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.afTriggerID 1815fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.control.aePrecaptureID 1816fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // TODO: Add android.control.aeMode 1817fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1818fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool gotAllStates = true; 1819fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1820fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint8_t afMode; 1821fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint8_t awbMode; 1822fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint8_t aeState; 1823fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint8_t afState; 1824fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint8_t awbState; 1825fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1826fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AF_MODE, 1827fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &afMode, frameNumber); 1828fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1829fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AWB_MODE, 1830fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &awbMode, frameNumber); 1831fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1832fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AE_STATE, 1833fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &aeState, frameNumber); 1834fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1835fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AF_STATE, 1836fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &afState, frameNumber); 1837fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1838fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AWB_STATE, 1839fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &awbState, frameNumber); 1840fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1841fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (!gotAllStates) return false; 1842fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1843184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala ALOGVV("%s: Camera %d: Frame %d, Request ID %d: AF mode %d, AWB mode %d, " 1844fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala "AF state %d, AE state %d, AWB state %d, " 1845fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala "AF trigger %d, AE precapture trigger %d", 18462d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei __FUNCTION__, mId, frameNumber, resultExtras.requestId, 1847fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala afMode, awbMode, 1848fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala afState, aeState, awbState, 1849741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh resultExtras.afTriggerId, resultExtras.precaptureTriggerId); 1850fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1851fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Got all states, so construct a minimal result to send 1852fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // In addition to the above fields, this means adding in 1853fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // android.request.frameCount 1854184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala // android.request.requestId 1855204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // android.quirks.partialResult (for HAL version below HAL3.2) 1856fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1857184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala const size_t kMinimal3AResultEntries = 10; 1858fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1859fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala Mutex::Autolock l(mOutputLock); 1860fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1861cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResult captureResult; 1862cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei captureResult.mResultExtras = resultExtras; 1863cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei captureResult.mMetadata = CameraMetadata(kMinimal3AResultEntries, /*dataCapacity*/ 0); 1864cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // TODO: change this to sp<CaptureResult>. This will need other changes, including, 1865cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // but not limited to CameraDeviceBase::getNextResult 1866cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResult& min3AResult = 1867cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei *mResultQueue.insert(mResultQueue.end(), captureResult); 1868cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 1869cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_REQUEST_FRAME_COUNT, 1870cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei // TODO: This is problematic casting. Need to fix CameraMetadata. 1871cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei reinterpret_cast<int32_t*>(&frameNumber), frameNumber)) { 1872fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1873fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1874fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1875cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int32_t requestId = resultExtras.requestId; 1876cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_REQUEST_ID, 1877184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala &requestId, frameNumber)) { 1878184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala return false; 1879184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala } 1880184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala 1881204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (mDeviceVersion < CAMERA_DEVICE_API_VERSION_3_2) { 1882204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He static const uint8_t partialResult = ANDROID_QUIRKS_PARTIAL_RESULT_PARTIAL; 1883204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (!insert3AResult(min3AResult.mMetadata, ANDROID_QUIRKS_PARTIAL_RESULT, 1884204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He &partialResult, frameNumber)) { 1885204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He return false; 1886204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 1887fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1888fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1889cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AF_MODE, 1890fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &afMode, frameNumber)) { 1891fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1892fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1893fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1894cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AWB_MODE, 1895fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &awbMode, frameNumber)) { 1896fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1897fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1898fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1899cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AE_STATE, 1900fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &aeState, frameNumber)) { 1901fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1902fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1903fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1904cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AF_STATE, 1905fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &afState, frameNumber)) { 1906fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1907fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1908fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1909cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AWB_STATE, 1910fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala &awbState, frameNumber)) { 1911fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1912fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1913fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1914cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AF_TRIGGER_ID, 1915741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh &resultExtras.afTriggerId, frameNumber)) { 1916fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1917fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1918fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1919cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AE_PRECAPTURE_ID, 1920741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh &resultExtras.precaptureTriggerId, frameNumber)) { 1921fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1922fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1923fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1924204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // We only send the aggregated partial when all 3A related metadata are available 1925204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // For both API1 and API2. 1926204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // TODO: we probably should pass through all partials to API2 unconditionally. 1927fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala mResultSignal.signal(); 1928fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1929fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return true; 1930fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala} 1931fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1932fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalatemplate<typename T> 1933fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalabool Camera3Device::get3AResult(const CameraMetadata& result, int32_t tag, 1934cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei T* value, uint32_t frameNumber) { 1935fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala (void) frameNumber; 1936fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1937fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala camera_metadata_ro_entry_t entry; 1938fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1939fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala entry = result.find(tag); 1940fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (entry.count == 0) { 1941fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala ALOGVV("%s: Camera %d: Frame %d: No %s provided by HAL!", __FUNCTION__, 1942fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala mId, frameNumber, get_camera_metadata_tag_name(tag)); 1943fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1944fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1945fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1946fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (sizeof(T) == sizeof(uint8_t)) { 1947fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala *value = entry.data.u8[0]; 1948fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } else if (sizeof(T) == sizeof(int32_t)) { 1949fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala *value = entry.data.i32[0]; 1950fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } else { 1951fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala ALOGE("%s: Unexpected type", __FUNCTION__); 1952fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1953fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1954fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return true; 1955fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala} 1956fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1957fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalatemplate<typename T> 1958fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalabool Camera3Device::insert3AResult(CameraMetadata& result, int32_t tag, 1959cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei const T* value, uint32_t frameNumber) { 1960fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala if (result.update(tag, value, 1) != NO_ERROR) { 1961fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala mResultQueue.erase(--mResultQueue.end(), mResultQueue.end()); 1962fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala SET_ERR("Frame %d: Failed to set %s in partial metadata", 1963fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala frameNumber, get_camera_metadata_tag_name(tag)); 1964fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return false; 1965fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 1966fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala return true; 1967fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala} 1968fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 196943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chenvoid Camera3Device::returnOutputBuffers( 197043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen const camera3_stream_buffer_t *outputBuffers, size_t numBuffers, 197143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen nsecs_t timestamp) { 197243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen for (size_t i = 0; i < numBuffers; i++) 197343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen { 197443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen Camera3Stream *stream = Camera3Stream::cast(outputBuffers[i].stream); 197543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen status_t res = stream->returnBuffer(outputBuffers[i], timestamp); 197643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Note: stream may be deallocated at this point, if this buffer was 197743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // the last reference to it. 197843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (res != OK) { 197943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ALOGE("Can't return buffer to its stream: %s (%d)", 198043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen strerror(-res), res); 198143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 198243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 198343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen} 198443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 198543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 198643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chenvoid Camera3Device::removeInFlightRequestIfReadyLocked(int idx) { 198743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 198843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen const InFlightRequest &request = mInFlightMap.valueAt(idx); 198943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen const uint32_t frameNumber = mInFlightMap.keyAt(idx); 199043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 199143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen nsecs_t sensorTimestamp = request.sensorTimestamp; 199243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen nsecs_t shutterTimestamp = request.shutterTimestamp; 199343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 199443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Check if it's okay to remove the request from InFlightMap: 199543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // In the case of a successful request: 199643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // all input and output buffers, all result metadata, shutter callback 199743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // arrived. 199843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // In the case of a unsuccessful request: 199943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // all input and output buffers arrived. 200043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (request.numBuffersLeft == 0 && 200143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen (request.requestStatus != OK || 200243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen (request.haveResultMetadata && shutterTimestamp != 0))) { 200343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ATRACE_ASYNC_END("frame capture", frameNumber); 200443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 200543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Sanity check - if sensor timestamp matches shutter timestamp 200643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (request.requestStatus == OK && 200743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen sensorTimestamp != shutterTimestamp) { 200843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen SET_ERR("sensor timestamp (%" PRId64 200943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ") for frame %d doesn't match shutter timestamp (%" PRId64 ")", 201043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen sensorTimestamp, frameNumber, shutterTimestamp); 201143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 201243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 201343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // for an unsuccessful request, it may have pending output buffers to 201443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // return. 201543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen assert(request.requestStatus != OK || 201643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen request.pendingOutputBuffers.size() == 0); 201743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen returnOutputBuffers(request.pendingOutputBuffers.array(), 201843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen request.pendingOutputBuffers.size(), 0); 201943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 202043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen mInFlightMap.removeItemsAt(idx, 1); 202143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 202243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ALOGVV("%s: removed frame %d from InFlightMap", __FUNCTION__, frameNumber); 202343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 202443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 202543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Sanity check - if we have too many in-flight frames, something has 202643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // likely gone wrong 202743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (mInFlightMap.size() > kInFlightWarnLimit) { 202843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen CLOGE("In-flight list too large: %zu", mInFlightMap.size()); 202943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 203043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen} 203143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 203243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 203343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chenvoid Camera3Device::sendCaptureResult(CameraMetadata &pendingMetadata, 203443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen CaptureResultExtras &resultExtras, 203543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen CameraMetadata &collectedPartialResult, 2036618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen uint32_t frameNumber, 2037d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen bool reprocess, 2038d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen const AeTriggerCancelOverride_t &aeTriggerCancelOverride) { 203943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (pendingMetadata.isEmpty()) 204043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen return; 204143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 204243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen Mutex::Autolock l(mOutputLock); 204343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 204443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // TODO: need to track errors for tighter bounds on expected frame number 2045618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen if (reprocess) { 2046618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen if (frameNumber < mNextReprocessResultFrameNumber) { 2047618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen SET_ERR("Out-of-order reprocess capture result metadata submitted! " 204843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen "(got frame number %d, expecting %d)", 2049618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen frameNumber, mNextReprocessResultFrameNumber); 2050618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen return; 2051618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } 2052618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen mNextReprocessResultFrameNumber = frameNumber + 1; 2053618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } else { 2054618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen if (frameNumber < mNextResultFrameNumber) { 2055618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen SET_ERR("Out-of-order capture result metadata submitted! " 2056618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen "(got frame number %d, expecting %d)", 2057618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen frameNumber, mNextResultFrameNumber); 2058618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen return; 2059618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen } 2060618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen mNextResultFrameNumber = frameNumber + 1; 206143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 206243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 206343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen CaptureResult captureResult; 206443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen captureResult.mResultExtras = resultExtras; 206543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen captureResult.mMetadata = pendingMetadata; 206643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 206743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (captureResult.mMetadata.update(ANDROID_REQUEST_FRAME_COUNT, 206843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen (int32_t*)&frameNumber, 1) != OK) { 206943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen SET_ERR("Failed to set frame# in metadata (%d)", 207043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen frameNumber); 207143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen return; 207243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } else { 207343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ALOGVV("%s: Camera %d: Set frame# in metadata (%d)", 207443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen __FUNCTION__, mId, frameNumber); 207543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 207643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 207743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Append any previous partials to form a complete result 207843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (mUsePartialResult && !collectedPartialResult.isEmpty()) { 207943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen captureResult.mMetadata.append(collectedPartialResult); 208043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 208143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 208243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen captureResult.mMetadata.sort(); 208343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 208443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Check that there's a timestamp in the result metadata 208543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen camera_metadata_entry entry = 208643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen captureResult.mMetadata.find(ANDROID_SENSOR_TIMESTAMP); 208743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (entry.count == 0) { 208843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen SET_ERR("No timestamp provided by HAL for frame %d!", 208943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen frameNumber); 209043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen return; 209143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 209243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 2093d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen overrideResultForPrecaptureCancel(&captureResult.mMetadata, aeTriggerCancelOverride); 2094d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 209543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Valid result, insert into queue 209643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen List<CaptureResult>::iterator queuedResult = 209743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen mResultQueue.insert(mResultQueue.end(), CaptureResult(captureResult)); 209843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ALOGVV("%s: result requestId = %" PRId32 ", frameNumber = %" PRId64 209943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ", burstId = %" PRId32, __FUNCTION__, 210043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen queuedResult->mResultExtras.requestId, 210143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen queuedResult->mResultExtras.frameNumber, 210243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen queuedResult->mResultExtras.burstId); 210343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 210443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen mResultSignal.signal(); 210543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen} 210643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 2107fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala/** 2108f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera HAL device callback methods 2109f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 2110f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 21117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::processCaptureResult(const camera3_capture_result *result) { 21127d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala ATRACE_CALL(); 21137d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 21147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala status_t res; 21157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 211642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t frameNumber = result->frame_number; 2117f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He if (result->result == NULL && result->num_output_buffers == 0 && 2118f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He result->input_buffer == NULL) { 211942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("No result data provided by HAL for frame %d", 212042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 21217d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return; 21227d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 2123204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 2124204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // For HAL3.2 or above, If HAL doesn't support partial, it must always set 2125204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // partial_result to 1 when metadata is included in this result. 2126204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (!mUsePartialResult && 2127204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2 && 2128204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He result->result != NULL && 2129204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He result->partial_result != 1) { 2130204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He SET_ERR("Result is malformed for frame %d: partial_result %u must be 1" 2131204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He " if partial result is not supported", 2132204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He frameNumber, result->partial_result); 2133204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He return; 2134204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 2135204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 2136204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He bool isPartialResult = false; 2137204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He CameraMetadata collectedPartialResult; 2138cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResultExtras resultExtras; 2139c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He bool hasInputBufferInRequest = false; 21407d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 214143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Get shutter timestamp and resultExtras from list of in-flight requests, 214243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // where it was added by the shutter notification for this frame. If the 214343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // shutter timestamp isn't received yet, append the output buffers to the 214443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // in-flight request and they will be returned when the shutter timestamp 214543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // arrives. Update the in-flight status and remove the in-flight entry if 214643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // all result data and shutter timestamp have been received. 214743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen nsecs_t shutterTimestamp = 0; 214843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 214942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala { 215042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex::Autolock l(mInFlightLock); 215142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ssize_t idx = mInFlightMap.indexOfKey(frameNumber); 215242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (idx == NAME_NOT_FOUND) { 215342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Unknown frame number for capture result: %d", 215442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 215542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return; 215642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 215742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightRequest &request = mInFlightMap.editValueAt(idx); 215843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ALOGVV("%s: got InFlightRequest requestId = %" PRId32 215943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ", frameNumber = %" PRId64 ", burstId = %" PRId32 216043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ", partialResultCount = %d", 216143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen __FUNCTION__, request.resultExtras.requestId, 216243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen request.resultExtras.frameNumber, request.resultExtras.burstId, 216343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen result->partial_result); 216443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Always update the partial count to the latest one if it's not 0 216543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // (buffers only). When framework aggregates adjacent partial results 216643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // into one, the latest partial count will be used. 216743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (result->partial_result != 0) 216843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen request.resultExtras.partialResultCount = result->partial_result; 2169fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 2170fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Check if this result carries only partial metadata 2171204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (mUsePartialResult && result->result != NULL) { 2172204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 2173204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (result->partial_result > mNumPartialResults || result->partial_result < 1) { 2174204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He SET_ERR("Result is malformed for frame %d: partial_result %u must be in" 2175204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He " the range of [1, %d] when metadata is included in the result", 2176204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He frameNumber, result->partial_result, mNumPartialResults); 2177204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He return; 2178204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 2179204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He isPartialResult = (result->partial_result < mNumPartialResults); 21805d76e1a639c1bae9ea7d9af1124abf1c94353344Zhijun He if (isPartialResult) { 21815d76e1a639c1bae9ea7d9af1124abf1c94353344Zhijun He request.partialResult.collectedResult.append(result->result); 21825d76e1a639c1bae9ea7d9af1124abf1c94353344Zhijun He } 2183204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } else { 2184204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He camera_metadata_ro_entry_t partialResultEntry; 2185204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He res = find_camera_metadata_ro_entry(result->result, 2186204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He ANDROID_QUIRKS_PARTIAL_RESULT, &partialResultEntry); 2187204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (res != NAME_NOT_FOUND && 2188204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He partialResultEntry.count > 0 && 2189204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He partialResultEntry.data.u8[0] == 2190204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He ANDROID_QUIRKS_PARTIAL_RESULT_PARTIAL) { 2191204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // A partial result. Flag this as such, and collect this 2192204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // set of metadata into the in-flight entry. 2193204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He isPartialResult = true; 2194204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He request.partialResult.collectedResult.append( 2195204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He result->result); 2196204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He request.partialResult.collectedResult.erase( 2197204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He ANDROID_QUIRKS_PARTIAL_RESULT); 2198204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 2199204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } 2200204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 2201204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (isPartialResult) { 2202fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Fire off a 3A-only result if possible 2203204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (!request.partialResult.haveSent3A) { 2204204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He request.partialResult.haveSent3A = 2205204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He processPartial3AResult(frameNumber, 2206204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He request.partialResult.collectedResult, 2207cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei request.resultExtras); 2208fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 2209fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 2210fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 2211fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 221243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen shutterTimestamp = request.shutterTimestamp; 2213c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He hasInputBufferInRequest = request.hasInputBuffer; 2214cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 2215fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Did we get the (final) result metadata for this capture? 2216204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (result->result != NULL && !isPartialResult) { 221742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (request.haveResultMetadata) { 221842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Called multiple times with metadata for frame %d", 221942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 222042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return; 222142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 2222204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He if (mUsePartialResult && 2223204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He !request.partialResult.collectedResult.isEmpty()) { 2224204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He collectedPartialResult.acquire( 2225204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He request.partialResult.collectedResult); 2226fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 222742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala request.haveResultMetadata = true; 222842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 222942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 2230c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He uint32_t numBuffersReturned = result->num_output_buffers; 2231c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He if (result->input_buffer != NULL) { 2232c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He if (hasInputBufferInRequest) { 2233c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He numBuffersReturned += 1; 2234c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He } else { 2235c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He ALOGW("%s: Input buffer should be NULL if there is no input" 2236c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He " buffer sent in the request", 2237c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He __FUNCTION__); 2238c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He } 2239c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He } 2240c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He request.numBuffersLeft -= numBuffersReturned; 224142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (request.numBuffersLeft < 0) { 224242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("Too many buffers returned for frame %d", 224342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala frameNumber); 224442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return; 224542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 224642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 224743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen camera_metadata_ro_entry_t entry; 224843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen res = find_camera_metadata_ro_entry(result->result, 224943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ANDROID_SENSOR_TIMESTAMP, &entry); 225043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (res == OK && entry.count == 1) { 225143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen request.sensorTimestamp = entry.data.i64[0]; 225242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 2253fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 225443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // If shutter event isn't received yet, append the output buffers to 225543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // the in-flight request. Otherwise, return the output buffers to 225643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // streams. 225743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (shutterTimestamp == 0) { 225843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen request.pendingOutputBuffers.appendArray(result->output_buffers, 225943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen result->num_output_buffers); 2260d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin } else { 226143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen returnOutputBuffers(result->output_buffers, 226243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen result->num_output_buffers, shutterTimestamp); 2263d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin } 22647d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 226543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (result->result != NULL && !isPartialResult) { 226643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (shutterTimestamp == 0) { 226743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen request.pendingMetadata = result->result; 226843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen request.partialResult.collectedResult = collectedPartialResult; 226943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } else { 227043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen CameraMetadata metadata; 227143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen metadata = result->result; 227243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen sendCaptureResult(metadata, request.resultExtras, 2273d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen collectedPartialResult, frameNumber, hasInputBufferInRequest, 2274d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request.aeTriggerCancelOverride); 227543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 22767d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 227742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 227843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen removeInFlightRequestIfReadyLocked(idx); 227943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } // scope for mInFlightLock 22807d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 2281f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He if (result->input_buffer != NULL) { 2282c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He if (hasInputBufferInRequest) { 2283c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He Camera3Stream *stream = 2284c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He Camera3Stream::cast(result->input_buffer->stream); 2285c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He res = stream->returnInputBuffer(*(result->input_buffer)); 2286c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He // Note: stream may be deallocated at this point, if this buffer was the 2287c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He // last reference to it. 2288c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He if (res != OK) { 2289c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He ALOGE("%s: RequestThread: Can't return input buffer for frame %d to" 2290c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He " its stream:%s (%d)", __FUNCTION__, 2291c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He frameNumber, strerror(-res), res); 22920ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He } 22930ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He } else { 22940ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He ALOGW("%s: Input buffer should be NULL if there is no input" 22950ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He " buffer sent in the request, skipping input buffer return.", 22960ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He __FUNCTION__); 2297f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He } 2298f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He } 22997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 23007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 23017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::notify(const camera3_notify_msg *msg) { 230217a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_CALL(); 23037d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala NotificationListener *listener; 23047d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala { 23057d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex::Autolock l(mOutputLock); 23067d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala listener = mListener; 23077d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 23087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 23097d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala if (msg == NULL) { 231042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("HAL sent NULL notify message!"); 23117d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala return; 23127d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 23137d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 23147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala switch (msg->type) { 23157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala case CAMERA3_MSG_ERROR: { 23161754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala notifyError(msg->message.error, listener); 23171754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala break; 23181754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 23191754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala case CAMERA3_MSG_SHUTTER: { 23201754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala notifyShutter(msg->message.shutter, listener); 23211754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala break; 23221754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 23231754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala default: 23241754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala SET_ERR("Unknown notify message from HAL: %d", 23251754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala msg->type); 23261754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 23271754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala} 23281754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 23291754351d9199721e7e7943461689e399ef015260Eino-Ville Talvalavoid Camera3Device::notifyError(const camera3_error_msg_t &msg, 23301754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala NotificationListener *listener) { 23311754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 23321754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Map camera HAL error codes to ICameraDeviceCallback error codes 23331754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Index into this with the HAL error code 23341754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala static const ICameraDeviceCallbacks::CameraErrorCode 23351754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala halErrorMap[CAMERA3_MSG_NUM_ERRORS] = { 23361754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // 0 = Unused error code 23371754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ICameraDeviceCallbacks::ERROR_CAMERA_INVALID_ERROR, 23381754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // 1 = CAMERA3_MSG_ERROR_DEVICE 23391754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE, 23401754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // 2 = CAMERA3_MSG_ERROR_REQUEST 23411754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST, 23421754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // 3 = CAMERA3_MSG_ERROR_RESULT 23431754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ICameraDeviceCallbacks::ERROR_CAMERA_RESULT, 23441754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // 4 = CAMERA3_MSG_ERROR_BUFFER 23451754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER 23461754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala }; 23471754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 23481754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ICameraDeviceCallbacks::CameraErrorCode errorCode = 23491754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ((msg.error_code >= 0) && 23501754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala (msg.error_code < CAMERA3_MSG_NUM_ERRORS)) ? 23511754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala halErrorMap[msg.error_code] : 23521754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ICameraDeviceCallbacks::ERROR_CAMERA_INVALID_ERROR; 23531754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 23541754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala int streamId = 0; 23551754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (msg.error_stream != NULL) { 23561754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala Camera3Stream *stream = 23571754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala Camera3Stream::cast(msg.error_stream); 23581754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala streamId = stream->getId(); 23591754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 23601754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ALOGV("Camera %d: %s: HAL error, frame %d, stream %d: %d", 23611754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala mId, __FUNCTION__, msg.frame_number, 23621754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala streamId, msg.error_code); 23631d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He 23641754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala CaptureResultExtras resultExtras; 23651754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala switch (errorCode) { 23661754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala case ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE: 23671754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // SET_ERR calls notifyError 23681754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala SET_ERR("Camera HAL reported serious device error"); 23691754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala break; 23701754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala case ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST: 23711754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala case ICameraDeviceCallbacks::ERROR_CAMERA_RESULT: 23721754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala case ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER: 23731d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He { 23741d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He Mutex::Autolock l(mInFlightLock); 23751754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ssize_t idx = mInFlightMap.indexOfKey(msg.frame_number); 23761d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He if (idx >= 0) { 2377cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei InFlightRequest &r = mInFlightMap.editValueAt(idx); 23781754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala r.requestStatus = msg.error_code; 2379cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei resultExtras = r.resultExtras; 2380cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } else { 23811754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala resultExtras.frameNumber = msg.frame_number; 23821754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ALOGE("Camera %d: %s: cannot find in-flight request on " 23831754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala "frame %" PRId64 " error", mId, __FUNCTION__, 23841754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala resultExtras.frameNumber); 23851d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He } 23861d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He } 238742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (listener != NULL) { 23881754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala listener->notifyError(errorCode, resultExtras); 2389cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei } else { 2390cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGE("Camera %d: %s: no listener available", mId, __FUNCTION__); 239142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 23927d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala break; 23931754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala default: 23941754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // SET_ERR calls notifyError 23951754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala SET_ERR("Unknown error message from HAL: %d", msg.error_code); 23961754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala break; 23971754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 23981754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala} 23991754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 24001754351d9199721e7e7943461689e399ef015260Eino-Ville Talvalavoid Camera3Device::notifyShutter(const camera3_shutter_msg_t &msg, 24011754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala NotificationListener *listener) { 24021754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ssize_t idx; 24031754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Verify ordering of shutter notifications 24041754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala { 24051754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala Mutex::Autolock l(mOutputLock); 24061754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // TODO: need to track errors for tighter bounds on expected frame number. 24071754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (msg.frame_number < mNextShutterFrameNumber) { 24081754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala SET_ERR("Shutter notification out-of-order. Expected " 24091754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala "notification for frame %d, got frame %d", 24101754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala mNextShutterFrameNumber, msg.frame_number); 24111754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala return; 24127d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 24131754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala mNextShutterFrameNumber = msg.frame_number + 1; 24141754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 241542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 24161754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Set timestamp for the request in the in-flight tracking 24171754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // and get the request ID to send upstream 24181754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala { 24191754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala Mutex::Autolock l(mInFlightLock); 24201754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala idx = mInFlightMap.indexOfKey(msg.frame_number); 24211754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (idx >= 0) { 24221754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala InFlightRequest &r = mInFlightMap.editValueAt(idx); 242343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 242443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen ALOGVV("Camera %d: %s: Shutter fired for frame %d (id %d) at %" PRId64, 242543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen mId, __FUNCTION__, 242643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen msg.frame_number, r.resultExtras.requestId, msg.timestamp); 242743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Call listener, if any 242843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen if (listener != NULL) { 242943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen listener->notifyShutter(r.resultExtras, msg.timestamp); 243043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen } 243143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 243243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen r.shutterTimestamp = msg.timestamp; 243343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 243443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // send pending result and buffers 243543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen sendCaptureResult(r.pendingMetadata, r.resultExtras, 2436618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen r.partialResult.collectedResult, msg.frame_number, 2437d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen r.hasInputBuffer, r.aeTriggerCancelOverride); 243843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen returnOutputBuffers(r.pendingOutputBuffers.array(), 243943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen r.pendingOutputBuffers.size(), r.shutterTimestamp); 244043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen r.pendingOutputBuffers.clear(); 244143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 244243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen removeInFlightRequestIfReadyLocked(idx); 24437d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 24441754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 24451754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (idx < 0) { 24461754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala SET_ERR("Shutter notification for non-existent frame number %d", 24471754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala msg.frame_number); 24487d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 24497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 24507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 24511754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 2452f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville TalvalaCameraMetadata Camera3Device::getLatestRequestLocked() { 24531e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin ALOGV("%s", __FUNCTION__); 24541e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 24551e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin CameraMetadata retVal; 24561e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 24571e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin if (mRequestThread != NULL) { 24581e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin retVal = mRequestThread->getLatestRequest(); 24591e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin } 24601e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 24611e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin return retVal; 24621e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin} 24631e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 2464cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 24657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/** 2466f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * RequestThread inner class methods 2467f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 2468f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2469f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville TalvalaCamera3Device::RequestThread::RequestThread(wp<Camera3Device> parent, 2470f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker, 2471f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *hal3Device) : 24724d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Thread(/*canCallJava*/false), 2473f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mParent(parent), 2474f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker(statusTracker), 2475f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mHal3Device(hal3Device), 247642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala mId(getId(parent)), 2477f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mReconfigured(false), 2478f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDoPause(false), 2479f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused(true), 24804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mFrameNumber(0), 2481cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei mLatestRequestId(NAME_NOT_FOUND), 2482c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh mCurrentAfTriggerId(0), 2483c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh mCurrentPreCaptureTriggerId(0), 24842d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei mRepeatingLastFrameNumber(NO_IN_FLIGHT_REPEATING_FRAMES) { 2485f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusId = statusTracker->addComponent(); 2486d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 2487d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen mAeLockAvailable = false; 2488d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen sp<Camera3Device> p = parent.promote(); 2489d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen if (p != NULL) { 2490d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen camera_metadata_ro_entry aeLockAvailable = 2491d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen p->info().find(ANDROID_CONTROL_AE_LOCK_AVAILABLE); 2492d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen if (aeLockAvailable.count > 0) { 2493d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen mAeLockAvailable = (aeLockAvailable.data.u8[0] == 2494d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE); 2495d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen } 2496d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen } 2497f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2498f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 24994d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvalavoid Camera3Device::RequestThread::setNotificationListener( 25001754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala NotificationListener *listener) { 25011754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala Mutex::Autolock l(mRequestLock); 25021754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala mListener = listener; 25031754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala} 25041754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 2505f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::configurationComplete() { 2506f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 2507f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mReconfigured = true; 2508f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2509f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 251090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::RequestThread::queueRequestList( 25112d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei List<sp<CaptureRequest> > &requests, 25122d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 25132d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber) { 251490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei Mutex::Autolock l(mRequestLock); 251590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei for (List<sp<CaptureRequest> >::iterator it = requests.begin(); it != requests.end(); 251690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei ++it) { 251790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei mRequestQueue.push_back(*it); 251890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei } 251990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 25202d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (lastFrameNumber != NULL) { 25212d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber = mFrameNumber + mRequestQueue.size() - 1; 25222d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGV("%s: requestId %d, mFrameNumber %" PRId32 ", lastFrameNumber %" PRId64 ".", 25232d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei __FUNCTION__, (*(requests.begin()))->mResultExtras.requestId, mFrameNumber, 25242d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber); 25252d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 2526cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 252790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei unpauseForNewRequests(); 252890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 252990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei return OK; 253090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei} 253190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 25324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTrigger( 25344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger[], 25354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin size_t count) { 25364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock l(mTriggerMutex); 25384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t ret; 25394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < count; ++i) { 25414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ret = queueTriggerLocked(trigger[i]); 25424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (ret != OK) { 25444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return ret; 25454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 25464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 25474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 25494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 25504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 255142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvalaint Camera3Device::RequestThread::getId(const wp<Camera3Device> &device) { 255242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala sp<Camera3Device> d = device.promote(); 255342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (d != NULL) return d->mId; 255442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return 0; 255542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala} 255642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 25574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTriggerLocked( 25584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger) { 25594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t tag = trigger.metadataTag; 25614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ssize_t index = mTriggerMap.indexOfKey(tag); 25624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin switch (trigger.getTagType()) { 25644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_BYTE: 25654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // fall-through 25664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_INT32: 25674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 25684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin default: 256942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala ALOGE("%s: Type not supported: 0x%x", __FUNCTION__, 257042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala trigger.getTagType()); 25714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return INVALID_OPERATION; 25724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 25734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 25754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Collect only the latest trigger, since we only have 1 field 25764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * in the request settings per trigger tag, and can't send more than 1 25774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * trigger per request. 25784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 25794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (index != NAME_NOT_FOUND) { 25804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerMap.editValueAt(index) = trigger; 25814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } else { 25824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerMap.add(tag, trigger); 25834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 25844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 25854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 25864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 25874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2588f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::setRepeatingRequests( 25892d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei const RequestList &requests, 25902d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 25912d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber) { 2592f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 25932d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (lastFrameNumber != NULL) { 25942d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber = mRepeatingLastFrameNumber; 25952d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 2596f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRepeatingRequests.clear(); 2597f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRepeatingRequests.insert(mRepeatingRequests.begin(), 2598f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala requests.begin(), requests.end()); 259926fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala 260026fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala unpauseForNewRequests(); 260126fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala 26022d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei mRepeatingLastFrameNumber = NO_IN_FLIGHT_REPEATING_FRAMES; 2603f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 2604f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2605f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 26068684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yehbool Camera3Device::RequestThread::isRepeatingRequestLocked(const sp<CaptureRequest> requestIn) { 26078684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh if (mRepeatingRequests.empty()) { 26088684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh return false; 26098684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh } 26108684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh int32_t requestId = requestIn->mResultExtras.requestId; 26118684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh const RequestList &repeatRequests = mRepeatingRequests; 26128684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh // All repeating requests are guaranteed to have same id so only check first quest 26138684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh const sp<CaptureRequest> firstRequest = *repeatRequests.begin(); 26148684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh return (firstRequest->mResultExtras.requestId == requestId); 26158684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh} 26168684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh 26172d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Weistatus_t Camera3Device::RequestThread::clearRepeatingRequests(/*out*/int64_t *lastFrameNumber) { 2618f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 2619f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRepeatingRequests.clear(); 26202d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (lastFrameNumber != NULL) { 26212d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber = mRepeatingLastFrameNumber; 26222d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 26232d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei mRepeatingLastFrameNumber = NO_IN_FLIGHT_REPEATING_FRAMES; 2624f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return OK; 2625f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2626f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 26271754351d9199721e7e7943461689e399ef015260Eino-Ville Talvalastatus_t Camera3Device::RequestThread::clear( 26281754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala NotificationListener *listener, 26291754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala /*out*/int64_t *lastFrameNumber) { 2630abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala Mutex::Autolock l(mRequestLock); 26312d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGV("RequestThread::%s:", __FUNCTION__); 26321754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 2633abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala mRepeatingRequests.clear(); 26348684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh 26351754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Send errors for all requests pending in the request queue, including 26361754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // pending repeating requests 26371754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala if (listener != NULL) { 26381754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala for (RequestList::iterator it = mRequestQueue.begin(); 26391754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala it != mRequestQueue.end(); ++it) { 2640c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen // Abort the input buffers for reprocess requests. 2641c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen if ((*it)->mInputStream != NULL) { 2642c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen camera3_stream_buffer_t inputBuffer; 2643c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen status_t res = (*it)->mInputStream->getInputBuffer(&inputBuffer); 2644c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen if (res != OK) { 2645c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen ALOGW("%s: %d: couldn't get input buffer while clearing the request " 2646c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen "list: %s (%d)", __FUNCTION__, __LINE__, strerror(-res), res); 2647c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen } else { 2648c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen res = (*it)->mInputStream->returnInputBuffer(inputBuffer); 2649c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen if (res != OK) { 2650c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen ALOGE("%s: %d: couldn't return input buffer while clearing the request " 2651c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen "list: %s (%d)", __FUNCTION__, __LINE__, strerror(-res), res); 2652c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen } 2653c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen } 2654c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen } 26551754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Set the frame number this request would have had, if it 26561754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // had been submitted; this frame number will not be reused. 26571754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // The requestId and burstId fields were set when the request was 26581754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // submitted originally (in convertMetadataListToRequestListLocked) 26591754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala (*it)->mResultExtras.frameNumber = mFrameNumber++; 26601754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala listener->notifyError(ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST, 26611754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala (*it)->mResultExtras); 26628684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh } 26638684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh } 2664abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala mRequestQueue.clear(); 2665abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala mTriggerMap.clear(); 26662d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (lastFrameNumber != NULL) { 26672d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei *lastFrameNumber = mRepeatingLastFrameNumber; 26682d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 26692d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei mRepeatingLastFrameNumber = NO_IN_FLIGHT_REPEATING_FRAMES; 2670abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala return OK; 2671abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala} 2672abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 2673f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::setPaused(bool paused) { 2674f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mPauseLock); 2675f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDoPause = paused; 2676f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mDoPauseSignal.signal(); 2677f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2678f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 26794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::waitUntilRequestProcessed( 26804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t requestId, nsecs_t timeout) { 26814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock l(mLatestRequestMutex); 26824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res; 26834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin while (mLatestRequestId != requestId) { 26844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin nsecs_t startTime = systemTime(); 26854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = mLatestRequestSignal.waitRelative(mLatestRequestMutex, timeout); 26874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) return res; 26884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin timeout -= (systemTime() - startTime); 26904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 26914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 26924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 26934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 26944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2695f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid Camera3Device::RequestThread::requestExit() { 2696f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Call parent to set up shutdown 2697f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Thread::requestExit(); 2698f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // The exit from any possible waits 2699f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mDoPauseSignal.signal(); 2700f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestSignal.signal(); 2701f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 27024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2703d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 2704d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen/** 2705d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * For devices <= CAMERA_DEVICE_API_VERSION_3_2, AE_PRECAPTURE_TRIGGER_CANCEL is not supported so 2706d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * we need to override AE_PRECAPTURE_TRIGGER_CANCEL to AE_PRECAPTURE_TRIGGER_IDLE and AE_LOCK_OFF 2707d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * to AE_LOCK_ON to start cancelling AE precapture. If AE lock is not available, it still overrides 2708d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * AE_PRECAPTURE_TRIGGER_CANCEL to AE_PRECAPTURE_TRIGGER_IDLE but doesn't add AE_LOCK_ON to the 2709d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * request. 2710d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen */ 2711d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chenvoid Camera3Device::RequestThread::handleAePrecaptureCancelRequest(sp<CaptureRequest> request) { 2712d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mAeTriggerCancelOverride.applyAeLock = false; 2713d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mAeTriggerCancelOverride.applyAePrecaptureTrigger = false; 2714d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 2715d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen if (mHal3Device->common.version > CAMERA_DEVICE_API_VERSION_3_2) { 2716d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen return; 2717d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen } 2718d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 2719d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen camera_metadata_entry_t aePrecaptureTrigger = 2720d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mSettings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER); 2721d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen if (aePrecaptureTrigger.count > 0 && 2722d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen aePrecaptureTrigger.data.u8[0] == ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL) { 2723d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // Always override CANCEL to IDLE 2724d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen uint8_t aePrecaptureTrigger = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE; 2725d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mSettings.update(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, &aePrecaptureTrigger, 1); 2726d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mAeTriggerCancelOverride.applyAePrecaptureTrigger = true; 2727d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mAeTriggerCancelOverride.aePrecaptureTrigger = 2728d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL; 2729d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 2730d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen if (mAeLockAvailable == true) { 2731d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen camera_metadata_entry_t aeLock = request->mSettings.find(ANDROID_CONTROL_AE_LOCK); 2732d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen if (aeLock.count == 0 || aeLock.data.u8[0] == ANDROID_CONTROL_AE_LOCK_OFF) { 2733d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_ON; 2734d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mSettings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 2735d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mAeTriggerCancelOverride.applyAeLock = true; 2736d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen request->mAeTriggerCancelOverride.aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 2737d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen } 2738d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen } 2739d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen } 2740d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen} 2741d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 2742d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen/** 2743d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * Override result metadata for cancelling AE precapture trigger applied in 2744d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * handleAePrecaptureCancelRequest(). 2745d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen */ 2746d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chenvoid Camera3Device::overrideResultForPrecaptureCancel( 2747d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen CameraMetadata *result, const AeTriggerCancelOverride_t &aeTriggerCancelOverride) { 2748d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen if (aeTriggerCancelOverride.applyAeLock) { 2749d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // Only devices <= v3.2 should have this override 2750d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen assert(mDeviceVersion <= CAMERA_DEVICE_API_VERSION_3_2); 2751d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen result->update(ANDROID_CONTROL_AE_LOCK, &aeTriggerCancelOverride.aeLock, 1); 2752d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen } 2753d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 2754d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen if (aeTriggerCancelOverride.applyAePrecaptureTrigger) { 2755d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // Only devices <= v3.2 should have this override 2756d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen assert(mDeviceVersion <= CAMERA_DEVICE_API_VERSION_3_2); 2757d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen result->update(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, 2758d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen &aeTriggerCancelOverride.aePrecaptureTrigger, 1); 2759d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen } 2760d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen} 2761d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 2762f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::threadLoop() { 2763f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2764f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 2765f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2766f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Handle paused state. 2767f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (waitIfPaused()) { 2768f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 2769f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2770f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2771f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Get work to do 2772f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2773f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> nextRequest = waitForNextRequest(); 2774f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (nextRequest == NULL) { 2775f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 2776f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2777f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2778f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Create request to HAL 2779f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_capture_request_t request = camera3_capture_request_t(); 27802d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei request.frame_number = nextRequest->mResultExtras.frameNumber; 27814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Vector<camera3_stream_buffer_t> outputBuffers; 2782f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2783f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Get the request ID, if any 2784f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala int requestId; 2785f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala camera_metadata_entry_t requestIdEntry = 2786f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala nextRequest->mSettings.find(ANDROID_REQUEST_ID); 2787f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (requestIdEntry.count > 0) { 2788f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala requestId = requestIdEntry.data.i32[0]; 2789f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } else { 2790f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGW("%s: Did not have android.request.id set in the request", 2791f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala __FUNCTION__); 2792f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala requestId = NAME_NOT_FOUND; 2793f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 2794f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 27954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Insert any queued triggers (before metadata is locked) 27964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t triggerCount; 27974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = insertTriggers(nextRequest); 27984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res < 0) { 2799b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR("RequestThread: Unable to insert triggers " 2800b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala "(capture request %d, HAL device: %s (%d)", 28012d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei request.frame_number, strerror(-res), res); 28024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin cleanUpFailedRequest(request, nextRequest, outputBuffers); 28034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return false; 28044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 28054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin triggerCount = res; 28064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 28074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin bool triggersMixedIn = (triggerCount > 0 || mPrevTriggers > 0); 28084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 28094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // If the request is the same as last, or we had triggers last time 28104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (mPrevRequest != nextRequest || triggersMixedIn) { 28114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 28122f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala * HAL workaround: 28132f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala * Insert a dummy trigger ID if a trigger is set but no trigger ID is 28142f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala */ 28152f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala res = addDummyTriggerIds(nextRequest); 28162f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (res != OK) { 28172f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala SET_ERR("RequestThread: Unable to insert dummy trigger IDs " 28182f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala "(capture request %d, HAL device: %s (%d)", 28192d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei request.frame_number, strerror(-res), res); 28202f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 28212f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala return false; 28222f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala } 28232f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 28242f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala /** 28254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * The request should be presorted so accesses in HAL 28264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * are O(logn). Sidenote, sorting a sorted metadata is nop. 28274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 28284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin nextRequest->mSettings.sort(); 2829f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.settings = nextRequest->mSettings.getAndLock(); 2830f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPrevRequest = nextRequest; 28314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGVV("%s: Request settings are NEW", __FUNCTION__); 28324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 28334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin IF_ALOGV() { 28344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin camera_metadata_ro_entry_t e = camera_metadata_ro_entry_t(); 28354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin find_camera_metadata_ro_entry( 28364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin request.settings, 28374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ANDROID_CONTROL_AF_TRIGGER, 28384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &e 28394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ); 28404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (e.count > 0) { 28414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Request (frame num %d) had AF trigger 0x%x", 28424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, 28432d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei request.frame_number, 28444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin e.data.u8[0]); 28454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 28464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 28474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } else { 28484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // leave request.settings NULL to indicate 'reuse latest given' 28494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGVV("%s: Request settings are REUSED", 28504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__); 28514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 2852f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2853f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He uint32_t totalNumBuffers = 0; 2854f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2855f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Fill in buffers 2856f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (nextRequest->mInputStream != NULL) { 2857c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen request.input_buffer = &nextRequest->mInputBuffer; 2858f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He totalNumBuffers += 1; 2859f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } else { 2860f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.input_buffer = NULL; 2861f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2862f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 2863f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputBuffers.insertAt(camera3_stream_buffer_t(), 0, 2864f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mOutputStreams.size()); 2865f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.output_buffers = outputBuffers.array(); 2866f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < nextRequest->mOutputStreams.size(); i++) { 2867f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = nextRequest->mOutputStreams.editItemAt(i)-> 2868f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala getBuffer(&outputBuffers.editItemAt(i)); 2869f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 28701754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Can't get output buffer from gralloc queue - this could be due to 28711754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // abandoned queue or other consumer misbehavior, so not a fatal 28721754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // error 287307d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala ALOGE("RequestThread: Can't get output buffer, skipping request:" 287407d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala " %s (%d)", strerror(-res), res); 28750ec23d3f89d804cc1d9dea8f0585dc6d57bfd5c2Eino-Ville Talvala { 28760ec23d3f89d804cc1d9dea8f0585dc6d57bfd5c2Eino-Ville Talvala Mutex::Autolock l(mRequestLock); 28770ec23d3f89d804cc1d9dea8f0585dc6d57bfd5c2Eino-Ville Talvala if (mListener != NULL) { 28780ec23d3f89d804cc1d9dea8f0585dc6d57bfd5c2Eino-Ville Talvala mListener->notifyError( 28790ec23d3f89d804cc1d9dea8f0585dc6d57bfd5c2Eino-Ville Talvala ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST, 28800ec23d3f89d804cc1d9dea8f0585dc6d57bfd5c2Eino-Ville Talvala nextRequest->mResultExtras); 28810ec23d3f89d804cc1d9dea8f0585dc6d57bfd5c2Eino-Ville Talvala } 28821754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 2883f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 2884f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 2885f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2886f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala request.num_output_buffers++; 2887f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2888f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He totalNumBuffers += request.num_output_buffers; 2889f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 289042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Log request in the in-flight queue 289142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala sp<Camera3Device> parent = mParent.promote(); 289242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (parent == NULL) { 28931754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Should not happen, and nowhere to send errors to, so just log it 289442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala CLOGE("RequestThread: Parent is gone"); 289542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 289642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return false; 289742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 289842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 2899cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei res = parent->registerInFlight(request.frame_number, 2900c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He totalNumBuffers, nextRequest->mResultExtras, 2901d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen /*hasInput*/request.input_buffer != NULL, 2902d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen nextRequest->mAeTriggerCancelOverride); 29032d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ALOGVV("%s: registered in flight requestId = %" PRId32 ", frameNumber = %" PRId64 29042d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei ", burstId = %" PRId32 ".", 2905cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei __FUNCTION__, 2906cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei nextRequest->mResultExtras.requestId, nextRequest->mResultExtras.frameNumber, 2907cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei nextRequest->mResultExtras.burstId); 290842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala if (res != OK) { 290942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala SET_ERR("RequestThread: Unable to register new in-flight request:" 291042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala " %s (%d)", strerror(-res), res); 291142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 291242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala return false; 291342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 29144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2915cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He // Inform waitUntilRequestProcessed thread of a new request ID 2916cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He { 2917cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He Mutex::Autolock al(mLatestRequestMutex); 2918cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He 2919cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He mLatestRequestId = requestId; 2920cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He mLatestRequestSignal.signal(); 2921cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He } 2922cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He 2923f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Submit request and block until ready for next one 292417a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_ASYNC_BEGIN("frame capture", request.frame_number); 292517a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->process_capture_request"); 2926f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mHal3Device->ops->process_capture_request(mHal3Device, &request); 292717a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 292817a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala 2929f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (res != OK) { 29301754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Should only get a failure here for malformed requests or device-level 29311754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // errors, so consider all errors fatal. Bad metadata failures should 29321754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // come through notify. 2933b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR("RequestThread: Unable to submit capture request %d to HAL" 2934f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala " device: %s (%d)", request.frame_number, strerror(-res), res); 2935f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala cleanUpFailedRequest(request, nextRequest, outputBuffers); 2936f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return false; 2937f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 2938f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 29391e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin // Update the latest request sent to HAL 29401e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin if (request.settings != NULL) { // Don't update them if they were unchanged 29411e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin Mutex::Autolock al(mLatestRequestMutex); 29421e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 29431e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin camera_metadata_t* cloned = clone_camera_metadata(request.settings); 29441e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin mLatestRequest.acquire(cloned); 29451e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin } 29461e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 2947f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (request.settings != NULL) { 2948f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mSettings.unlock(request.settings); 2949f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 29504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2951e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala // Unset as current request 2952e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala { 2953e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala Mutex::Autolock l(mRequestLock); 2954e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala mNextRequest.clear(); 2955e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala } 2956e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala 29574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Remove any previously queued triggers (after unlock) 29584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = removeTriggers(mPrevRequest); 29594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 2960b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala SET_ERR("RequestThread: Unable to remove triggers " 29614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin "(capture request %d, HAL device: %s (%d)", 29624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin request.frame_number, strerror(-res), res); 29634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return false; 29644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 29654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mPrevTriggers = triggerCount; 29664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2967f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 2968f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 2969f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 29701e479c0f4cb3e2174dde0b02e5656fb658f73495Igor MurashkinCameraMetadata Camera3Device::RequestThread::getLatestRequest() const { 29711e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin Mutex::Autolock al(mLatestRequestMutex); 29721e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 29731e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin ALOGV("RequestThread::%s", __FUNCTION__); 29741e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 29751e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin return mLatestRequest; 29761e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin} 29771e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 29784d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvalabool Camera3Device::RequestThread::isStreamPending( 29794d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala sp<Camera3StreamInterface>& stream) { 29804d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Mutex::Autolock l(mRequestLock); 29814d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 2982e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala if (mNextRequest != nullptr) { 2983e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala for (const auto& s : mNextRequest->mOutputStreams) { 2984e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala if (stream == s) return true; 2985e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala } 2986e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala if (stream == mNextRequest->mInputStream) return true; 2987e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala } 2988e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala 29894d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala for (const auto& request : mRequestQueue) { 29904d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala for (const auto& s : request->mOutputStreams) { 29914d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (stream == s) return true; 29924d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 29934d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (stream == request->mInputStream) return true; 29944d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 29954d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 29964d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala for (const auto& request : mRepeatingRequests) { 29974d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala for (const auto& s : request->mOutputStreams) { 29984d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (stream == s) return true; 29994d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 30004d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (stream == request->mInputStream) return true; 30014d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 30024d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 30034d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return false; 30044d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 3005cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 3006f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::cleanUpFailedRequest( 3007f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_capture_request_t &request, 3008f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> &nextRequest, 3009f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<camera3_stream_buffer_t> &outputBuffers) { 3010f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 3011f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (request.settings != NULL) { 3012f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mSettings.unlock(request.settings); 3013f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3014c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen if (nextRequest->mInputStream != NULL) { 3015c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen nextRequest->mInputBuffer.status = CAMERA3_BUFFER_STATUS_ERROR; 3016c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen nextRequest->mInputStream->returnInputBuffer(nextRequest->mInputBuffer); 3017f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3018f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala for (size_t i = 0; i < request.num_output_buffers; i++) { 3019f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputBuffers.editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR; 3020f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest->mOutputStreams.editItemAt(i)->returnBuffer( 3021f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala outputBuffers[i], 0); 3022f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3023e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala 3024e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala Mutex::Autolock l(mRequestLock); 3025e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala mNextRequest.clear(); 3026f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 3027f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 3028f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> 3029f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Camera3Device::RequestThread::waitForNextRequest() { 3030f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 3031f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> nextRequest; 3032f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 3033f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Optimized a bit for the simple steady-state case (single repeating 3034f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // request), to avoid putting that request in the queue temporarily. 3035f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mRequestLock); 3036f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 3037f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala while (mRequestQueue.empty()) { 3038f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (!mRepeatingRequests.empty()) { 3039f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Always atomically enqueue all requests in a repeating request 3040f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // list. Guarantees a complete in-sequence set of captures to 3041f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // application. 3042f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const RequestList &requests = mRepeatingRequests; 3043f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList::const_iterator firstRequest = 3044f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala requests.begin(); 3045f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest = *firstRequest; 3046f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestQueue.insert(mRequestQueue.end(), 3047f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala ++firstRequest, 3048f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala requests.end()); 3049f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // No need to wait any longer 3050cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 30512d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei mRepeatingLastFrameNumber = mFrameNumber + requests.size() - 1; 3052cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 3053f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala break; 3054f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3055f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 3056f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mRequestSignal.waitRelative(mRequestLock, kRequestTimeout); 3057f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 3058f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if ((mRequestQueue.empty() && mRepeatingRequests.empty()) || 3059f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala exitPending()) { 3060f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock pl(mPauseLock); 3061f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mPaused == false) { 3062f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: RequestThread: Going idle", __FUNCTION__); 3063f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused = true; 3064f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Let the tracker know 3065f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 3066f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 3067f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE); 3068f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 3069f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3070f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Stop waiting for now and let thread management happen 3071f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return NULL; 3072f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3073f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3074f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 3075f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (nextRequest == NULL) { 3076f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Don't have a repeating request already in hand, so queue 3077f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // must have an entry now. 3078f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList::iterator firstRequest = 3079f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestQueue.begin(); 3080f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala nextRequest = *firstRequest; 3081f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mRequestQueue.erase(firstRequest); 3082f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3083f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 308426fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // In case we've been unpaused by setPaused clearing mDoPause, need to 308526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // update internal pause state (capture/setRepeatingRequest unpause 308626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // directly). 3087f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock pl(mPauseLock); 3088f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mPaused) { 3089f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: RequestThread: Unpaused", __FUNCTION__); 3090f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 3091f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 3092f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->markComponentActive(mStatusId); 3093f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 3094f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 3095f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused = false; 3096f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 3097f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Check if we've reconfigured since last time, and reset the preview 3098f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // request if so. Can't use 'NULL request == repeat' across configure calls. 3099f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mReconfigured) { 3100f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPrevRequest.clear(); 3101f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mReconfigured = false; 3102f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3103f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 31042d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei if (nextRequest != NULL) { 31052d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei nextRequest->mResultExtras.frameNumber = mFrameNumber++; 3106c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh nextRequest->mResultExtras.afTriggerId = mCurrentAfTriggerId; 3107c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh nextRequest->mResultExtras.precaptureTriggerId = mCurrentPreCaptureTriggerId; 3108c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen 3109c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen // Since RequestThread::clear() removes buffers from the input stream, 3110c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen // get the right buffer here before unlocking mRequestLock 3111c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen if (nextRequest->mInputStream != NULL) { 3112c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen res = nextRequest->mInputStream->getInputBuffer(&nextRequest->mInputBuffer); 3113c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen if (res != OK) { 3114c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen // Can't get input buffer from gralloc queue - this could be due to 3115c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen // disconnected queue or other producer misbehavior, so not a fatal 3116c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen // error 3117c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen ALOGE("%s: Can't get input buffer, skipping request:" 3118c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen " %s (%d)", __FUNCTION__, strerror(-res), res); 3119c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen if (mListener != NULL) { 3120c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen mListener->notifyError( 3121c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST, 3122c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen nextRequest->mResultExtras); 3123c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen } 3124c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen return NULL; 3125c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen } 3126c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen } 31272d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei } 3128d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 3129d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen handleAePrecaptureCancelRequest(nextRequest); 3130d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 3131e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala mNextRequest = nextRequest; 3132e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala 3133f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return nextRequest; 3134f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 3135f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 3136f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::waitIfPaused() { 3137f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t res; 3138f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex::Autolock l(mPauseLock); 3139f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala while (mDoPause) { 3140f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala if (mPaused == false) { 3141f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala mPaused = true; 3142f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: RequestThread: Paused", __FUNCTION__); 3143f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Let the tracker know 3144f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 3145f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 3146f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE); 3147f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 3148f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3149f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 3150f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala res = mDoPauseSignal.waitRelative(mPauseLock, kRequestTimeout); 3151f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (res == TIMED_OUT || exitPending()) { 3152f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return true; 3153f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3154f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } 3155f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // We don't set mPaused to false here, because waitForNextRequest needs 3156f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // to further manage the paused state in case of starvation. 3157f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala return false; 3158f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala} 3159f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 316026fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvalavoid Camera3Device::RequestThread::unpauseForNewRequests() { 316126fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // With work to do, mark thread as unpaused. 316226fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // If paused by request (setPaused), don't resume, to avoid 316326fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala // extra signaling/waiting overhead to waitUntilPaused 3164f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mRequestSignal.signal(); 316526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala Mutex::Autolock p(mPauseLock); 316626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala if (!mDoPause) { 3167f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala ALOGV("%s: RequestThread: Going active", __FUNCTION__); 3168f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mPaused) { 3169f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 3170f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 3171f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->markComponentActive(mStatusId); 3172f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 3173f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 317426fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala mPaused = false; 317526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala } 317626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala} 317726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala 3178b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::RequestThread::setErrorState(const char *fmt, ...) { 3179b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala sp<Camera3Device> parent = mParent.promote(); 3180b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala if (parent != NULL) { 3181b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_list args; 3182b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_start(args, fmt); 3183b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 3184b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala parent->setErrorStateV(fmt, args); 3185b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 3186b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala va_end(args); 3187b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala } 3188b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala} 3189b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 31904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::insertTriggers( 31914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const sp<CaptureRequest> &request) { 31924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 31934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock al(mTriggerMutex); 31944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3195741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh sp<Camera3Device> parent = mParent.promote(); 3196741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh if (parent == NULL) { 3197741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh CLOGE("RequestThread: Parent is gone"); 3198741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh return DEAD_OBJECT; 3199741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 3200741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh 32014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin CameraMetadata &metadata = request->mSettings; 32024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin size_t count = mTriggerMap.size(); 32034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 32044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < count; ++i) { 32054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger = mTriggerMap.valueAt(i); 32064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t tag = trigger.metadataTag; 3207741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh 3208741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh if (tag == ANDROID_CONTROL_AF_TRIGGER_ID || tag == ANDROID_CONTROL_AE_PRECAPTURE_ID) { 3209741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh bool isAeTrigger = (trigger.metadataTag == ANDROID_CONTROL_AE_PRECAPTURE_ID); 3210741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh uint32_t triggerId = static_cast<uint32_t>(trigger.entryValue); 3211c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh if (isAeTrigger) { 3212c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh request->mResultExtras.precaptureTriggerId = triggerId; 3213c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh mCurrentPreCaptureTriggerId = triggerId; 3214c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh } else { 3215c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh request->mResultExtras.afTriggerId = triggerId; 3216c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh mCurrentAfTriggerId = triggerId; 3217c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh } 3218741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh if (parent->mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 3219741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh continue; // Trigger ID tag is deprecated since device HAL 3.2 3220741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 3221741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh } 3222741ace8776f052245e33a47a0b99400f75996f45Yin-Chia Yeh 32234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin camera_metadata_entry entry = metadata.find(tag); 32244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 32254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (entry.count > 0) { 32264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 32274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Already has an entry for this trigger in the request. 32284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Rewrite it with our requested trigger value. 32294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 32304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger oldTrigger = trigger; 32314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 32324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin oldTrigger.entryValue = entry.data.u8[0]; 32334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 32344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerReplacedMap.add(tag, oldTrigger); 32354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } else { 32364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 32374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * More typical, no trigger entry, so we just add it 32384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 32394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerRemovedMap.add(tag, trigger); 32404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 32414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 32424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res; 32434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 32444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin switch (trigger.getTagType()) { 32454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_BYTE: { 32464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue); 32474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 32484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &entryValue, 32494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 32504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 32514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 32524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_INT32: 32534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 32544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &trigger.entryValue, 32554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 32564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 32574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin default: 32584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Type not supported: 0x%x", 32594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, 32604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagType()); 32614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return INVALID_OPERATION; 32624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 32634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 32644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 32654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Failed to update request metadata with trigger tag %s" 32664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ", value %d", __FUNCTION__, trigger.getTagName(), 32674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.entryValue); 32684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return res; 32694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 32704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 32714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGV("%s: Mixed in trigger %s, value %d", __FUNCTION__, 32724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagName(), 32734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.entryValue); 32744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 32754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 32764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerMap.clear(); 32774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 32784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return count; 32794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 32804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 32814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::removeTriggers( 32824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const sp<CaptureRequest> &request) { 32834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex::Autolock al(mTriggerMutex); 32844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 32854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin CameraMetadata &metadata = request->mSettings; 32864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 32874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 32884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Replace all old entries with their old values. 32894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 32904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < mTriggerReplacedMap.size(); ++i) { 32914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger = mTriggerReplacedMap.valueAt(i); 32924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 32934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res; 32944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 32954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t tag = trigger.metadataTag; 32964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin switch (trigger.getTagType()) { 32974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_BYTE: { 32984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue); 32994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 33004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &entryValue, 33014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 33024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 33034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 33044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin case TYPE_INT32: 33054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin res = metadata.update(tag, 33064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin &trigger.entryValue, 33074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /*count*/1); 33084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin break; 33094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin default: 33104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Type not supported: 0x%x", 33114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin __FUNCTION__, 33124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagType()); 33134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return INVALID_OPERATION; 33144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 33154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 33164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 33174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Failed to restore request metadata with trigger tag %s" 33184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ", trigger value %d", __FUNCTION__, 33194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagName(), trigger.entryValue); 33204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return res; 33214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 33224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 33234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerReplacedMap.clear(); 33244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 33254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 33264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Remove all new entries. 33274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 33284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin for (size_t i = 0; i < mTriggerRemovedMap.size(); ++i) { 33294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin RequestTrigger trigger = mTriggerRemovedMap.valueAt(i); 33304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t res = metadata.erase(trigger.metadataTag); 33314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 33324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin if (res != OK) { 33334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ALOGE("%s: Failed to erase metadata with trigger tag %s" 33344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin ", trigger value %d", __FUNCTION__, 33354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin trigger.getTagName(), trigger.entryValue); 33364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return res; 33374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 33384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 33394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mTriggerRemovedMap.clear(); 33404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 33414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return OK; 33424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin} 33434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 33442f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvalastatus_t Camera3Device::RequestThread::addDummyTriggerIds( 33452f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala const sp<CaptureRequest> &request) { 33462f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // Trigger ID 0 has special meaning in the HAL2 spec, so avoid it here 33472f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala static const int32_t dummyTriggerId = 1; 33482f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala status_t res; 33492f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 33502f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala CameraMetadata &metadata = request->mSettings; 33512f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 33522f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // If AF trigger is active, insert a dummy AF trigger ID if none already 33532f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // exists 33542f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala camera_metadata_entry afTrigger = metadata.find(ANDROID_CONTROL_AF_TRIGGER); 33552f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala camera_metadata_entry afId = metadata.find(ANDROID_CONTROL_AF_TRIGGER_ID); 33562f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (afTrigger.count > 0 && 33572f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala afTrigger.data.u8[0] != ANDROID_CONTROL_AF_TRIGGER_IDLE && 33582f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala afId.count == 0) { 33592f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala res = metadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, &dummyTriggerId, 1); 33602f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (res != OK) return res; 33612f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala } 33622f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 33632f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // If AE precapture trigger is active, insert a dummy precapture trigger ID 33642f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // if none already exists 33652f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala camera_metadata_entry pcTrigger = 33662f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER); 33672f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala camera_metadata_entry pcId = metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_ID); 33682f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (pcTrigger.count > 0 && 33692f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala pcTrigger.data.u8[0] != ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE && 33702f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala pcId.count == 0) { 33712f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala res = metadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, 33722f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala &dummyTriggerId, 1); 33732f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala if (res != OK) return res; 33742f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala } 33752f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 33762f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala return OK; 33772f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala} 33784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 33794d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala/** 33804d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala * PreparerThread inner class methods 33814d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala */ 33824d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 33834d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville TalvalaCamera3Device::PreparerThread::PreparerThread() : 33844d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Thread(/*canCallJava*/false), mActive(false), mCancelNow(false) { 33854d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 33864d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 33874d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville TalvalaCamera3Device::PreparerThread::~PreparerThread() { 33884d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Thread::requestExitAndWait(); 33894d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (mCurrentStream != nullptr) { 33904d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream->cancelPrepare(); 33914d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ATRACE_ASYNC_END("stream prepare", mCurrentStream->getId()); 33924d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream.clear(); 33934d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 33944d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala clear(); 33954d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 33964d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 33974d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvalastatus_t Camera3Device::PreparerThread::prepare(sp<Camera3StreamInterface>& stream) { 33984d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala status_t res; 33994d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 34004d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Mutex::Autolock l(mLock); 34014d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 34024d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala res = stream->startPrepare(); 34034d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (res == OK) { 34044d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // No preparation needed, fire listener right off 34054d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Stream %d already prepared", __FUNCTION__, stream->getId()); 34064d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (mListener) { 34074d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mListener->notifyPrepared(stream->getId()); 34084d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 34094d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return OK; 34104d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } else if (res != NOT_ENOUGH_DATA) { 34114d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return res; 34124d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 34134d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 34144d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // Need to prepare, start up thread if necessary 34154d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (!mActive) { 34164d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // mRunning will change to false before the thread fully shuts down, so wait to be sure it 34174d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // isn't running 34184d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Thread::requestExitAndWait(); 34194d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala res = Thread::run("C3PrepThread", PRIORITY_BACKGROUND); 34204d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (res != OK) { 34214d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGE("%s: Unable to start preparer stream: %d (%s)", __FUNCTION__, res, strerror(-res)); 34224d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (mListener) { 34234d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mListener->notifyPrepared(stream->getId()); 34244d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 34254d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return res; 34264d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 34274d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCancelNow = false; 34284d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mActive = true; 34294d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Preparer stream started", __FUNCTION__); 34304d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 34314d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 34324d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // queue up the work 34334d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mPendingStreams.push_back(stream); 34344d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Stream %d queued for preparing", __FUNCTION__, stream->getId()); 34354d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 34364d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return OK; 34374d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 34384d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 34394d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvalastatus_t Camera3Device::PreparerThread::clear() { 34404d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala status_t res; 34414d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 34424d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Mutex::Autolock l(mLock); 34434d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 34444d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala for (const auto& stream : mPendingStreams) { 34454d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala stream->cancelPrepare(); 34464d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 34474d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mPendingStreams.clear(); 34484d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCancelNow = true; 34494d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 34504d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return OK; 34514d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 34524d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 34534d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvalavoid Camera3Device::PreparerThread::setNotificationListener(NotificationListener *listener) { 34544d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Mutex::Autolock l(mLock); 34554d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mListener = listener; 34564d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 34574d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 34584d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvalabool Camera3Device::PreparerThread::threadLoop() { 34594d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala status_t res; 34604d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala { 34614d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Mutex::Autolock l(mLock); 34624d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (mCurrentStream == nullptr) { 34634d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // End thread if done with work 34644d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (mPendingStreams.empty()) { 34654d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Preparer stream out of work", __FUNCTION__); 34664d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // threadLoop _must not_ re-acquire mLock after it sets mActive to false; would 34674d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // cause deadlock with prepare()'s requestExitAndWait triggered by !mActive. 34684d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mActive = false; 34694d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return false; 34704d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 34714d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 34724d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // Get next stream to prepare 34734d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala auto it = mPendingStreams.begin(); 34744d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream = *it; 34754d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mPendingStreams.erase(it); 34764d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ATRACE_ASYNC_BEGIN("stream prepare", mCurrentStream->getId()); 34774d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Preparing stream %d", __FUNCTION__, mCurrentStream->getId()); 34784d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } else if (mCancelNow) { 34794d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream->cancelPrepare(); 34804d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ATRACE_ASYNC_END("stream prepare", mCurrentStream->getId()); 34814d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Cancelling stream %d prepare", __FUNCTION__, mCurrentStream->getId()); 34824d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream.clear(); 34834d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCancelNow = false; 34844d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return true; 34854d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 34864d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 34874d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 34884d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala res = mCurrentStream->prepareNextBuffer(); 34894d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (res == NOT_ENOUGH_DATA) return true; 34904d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (res != OK) { 34914d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // Something bad happened; try to recover by cancelling prepare and 34924d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // signalling listener anyway 34934d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGE("%s: Stream %d returned error %d (%s) during prepare", __FUNCTION__, 34944d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream->getId(), res, strerror(-res)); 34954d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream->cancelPrepare(); 34964d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 34974d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 34984d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // This stream has finished, notify listener 34994d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Mutex::Autolock l(mLock); 35004d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala if (mListener) { 35014d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ALOGV("%s: Stream %d prepare done, signaling listener", __FUNCTION__, 35024d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream->getId()); 35034d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mListener->notifyPrepared(mCurrentStream->getId()); 35044d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala } 35054d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 35064d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ATRACE_ASYNC_END("stream prepare", mCurrentStream->getId()); 35074d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala mCurrentStream.clear(); 35084d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 35094d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala return true; 35104d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala} 35114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3512f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/** 35137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Static callback forwarding methods from HAL to instance 35147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 35157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 35167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sProcessCaptureResult(const camera3_callback_ops *cb, 35177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_capture_result *result) { 35187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala Camera3Device *d = 35197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb)); 3520d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 35217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala d->processCaptureResult(result); 35227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 35237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 35247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sNotify(const camera3_callback_ops *cb, 35257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_notify_msg *msg) { 35267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala Camera3Device *d = 35277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb)); 35287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala d->notify(msg); 35297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 35307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 35317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android 3532