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