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