Camera3Device.cpp revision 2d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4
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
2877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::dump(int fd, const Vector<String16> &args) {
2887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
2897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    (void)args;
290f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
291f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Try to lock, but continue in case of failure (to avoid blocking in
292f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // deadlocks)
293f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool gotInterfaceLock = tryLockSpinRightRound(mInterfaceLock);
294f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool gotLock = tryLockSpinRightRound(mLock);
295f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
296f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGW_IF(!gotInterfaceLock,
297f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            "Camera %d: %s: Unable to lock interface lock, proceeding anyway",
298f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mId, __FUNCTION__);
299f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGW_IF(!gotLock,
300f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            "Camera %d: %s: Unable to lock main lock, proceeding anyway",
301f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mId, __FUNCTION__);
302f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
303f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    String8 lines;
304f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
305f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    const char *status =
306f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus == STATUS_ERROR         ? "ERROR" :
307f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus == STATUS_UNINITIALIZED ? "UNINITIALIZED" :
308f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mStatus == STATUS_UNCONFIGURED  ? "UNCONFIGURED" :
309f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mStatus == STATUS_CONFIGURED    ? "CONFIGURED" :
310f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus == STATUS_ACTIVE        ? "ACTIVE" :
311f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            "Unknown";
312f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
313f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    lines.appendFormat("    Device status: %s\n", status);
314b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    if (mStatus == STATUS_ERROR) {
315b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        lines.appendFormat("    Error cause: %s\n", mErrorCause.string());
316b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    }
317f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    lines.appendFormat("    Stream configuration:\n");
318f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
319f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mInputStream != NULL) {
320f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        write(fd, lines.string(), lines.size());
321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mInputStream->dump(fd, args);
322f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    } else {
323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        lines.appendFormat("      No input stream.\n");
324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        write(fd, lines.string(), lines.size());
325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
326f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < mOutputStreams.size(); i++) {
327f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mOutputStreams[i]->dump(fd,args);
328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
3297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
33042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    lines = String8("    In-flight requests:\n");
33142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (mInFlightMap.size() == 0) {
33242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        lines.append("      None\n");
33342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    } else {
33442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        for (size_t i = 0; i < mInFlightMap.size(); i++) {
33542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            InFlightRequest r = mInFlightMap.valueAt(i);
336e5729fac81c8a984e984fefc90afc64135817d4fColin Cross            lines.appendFormat("      Frame %d |  Timestamp: %" PRId64 ", metadata"
33742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    " arrived: %s, buffers left: %d\n", mInFlightMap.keyAt(i),
33842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    r.captureTimestamp, r.haveResultMetadata ? "true" : "false",
33942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    r.numBuffersLeft);
34042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
34142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    }
34242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    write(fd, lines.string(), lines.size());
34342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
3441e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    {
3451e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        lines = String8("    Last request sent:\n");
3461e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        write(fd, lines.string(), lines.size());
3471e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
348f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        CameraMetadata lastRequest = getLatestRequestLocked();
3491e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        lastRequest.dump(fd, /*verbosity*/2, /*indentation*/6);
3501e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    }
3511e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
352f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mHal3Device != NULL) {
35342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        lines = String8("    HAL device dump:\n");
354f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        write(fd, lines.string(), lines.size());
355f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mHal3Device->ops->dump(mHal3Device, fd);
356f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
3577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
358f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (gotLock) mLock.unlock();
359f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (gotInterfaceLock) mInterfaceLock.unlock();
360f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
3617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return OK;
3627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
3637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaconst CameraMetadata& Camera3Device::info() const {
3657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ALOGVV("%s: E", __FUNCTION__);
366f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (CC_UNLIKELY(mStatus == STATUS_UNINITIALIZED ||
367f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    mStatus == STATUS_ERROR)) {
368b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        ALOGW("%s: Access to static info %s!", __FUNCTION__,
369f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                mStatus == STATUS_ERROR ?
370f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                "when in error state" : "before init");
371f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
3727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return mDeviceInfo;
3737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
3747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
37590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::checkStatusOkToCaptureLocked() {
37690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    switch (mStatus) {
37790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        case STATUS_ERROR:
37890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            CLOGE("Device has encountered a serious error");
37990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            return INVALID_OPERATION;
38090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        case STATUS_UNINITIALIZED:
38190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            CLOGE("Device not initialized");
38290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            return INVALID_OPERATION;
38390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        case STATUS_UNCONFIGURED:
38490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        case STATUS_CONFIGURED:
38590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        case STATUS_ACTIVE:
38690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            // OK
38790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            break;
38890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        default:
38990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            SET_ERR_L("Unexpected status: %d", mStatus);
39090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            return INVALID_OPERATION;
39190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    }
39290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    return OK;
39390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei}
39490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
39590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::convertMetadataListToRequestListLocked(
39690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        const List<const CameraMetadata> &metadataList, RequestList *requestList) {
39790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    if (requestList == NULL) {
39890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        CLOGE("requestList cannot be NULL.");
39990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        return BAD_VALUE;
40090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    }
40190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
402cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    int32_t burstId = 0;
40390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    for (List<const CameraMetadata>::const_iterator it = metadataList.begin();
40490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            it != metadataList.end(); ++it) {
40590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        sp<CaptureRequest> newRequest = setUpRequestLocked(*it);
40690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        if (newRequest == 0) {
40790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            CLOGE("Can't create capture request");
40890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            return BAD_VALUE;
40990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        }
410cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
411cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        // Setup burst Id and request Id
412cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        newRequest->mResultExtras.burstId = burstId++;
413cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        if (it->exists(ANDROID_REQUEST_ID)) {
414cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            if (it->find(ANDROID_REQUEST_ID).count == 0) {
415cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                CLOGE("RequestID entry exists; but must not be empty in metadata");
416cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                return BAD_VALUE;
417cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            }
418cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            newRequest->mResultExtras.requestId = it->find(ANDROID_REQUEST_ID).data.i32[0];
419cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        } else {
420cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            CLOGE("RequestID does not exist in metadata");
421cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            return BAD_VALUE;
422cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        }
423cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
42490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        requestList->push_back(newRequest);
4252d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei
4262d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        ALOGV("%s: requestId = %" PRId32, __FUNCTION__, newRequest->mResultExtras.requestId);
42790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    }
42890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    return OK;
42990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei}
43090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
431cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::capture(CameraMetadata &request, int64_t* /*lastFrameNumber*/) {
4327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
4334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
4342d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    List<const CameraMetadata> requests;
4352d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    requests.push_back(request);
4362d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    return captureList(requests, /*lastFrameNumber*/NULL);
4377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
4387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
43990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::submitRequestsHelper(
4402d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        const List<const CameraMetadata> &requests, bool repeating,
4412d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        /*out*/
4422d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        int64_t *lastFrameNumber) {
44390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    ATRACE_CALL();
44490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    Mutex::Autolock il(mInterfaceLock);
44590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    Mutex::Autolock l(mLock);
44690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
44790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    status_t res = checkStatusOkToCaptureLocked();
44890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    if (res != OK) {
44990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        // error logged by previous call
45090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        return res;
45190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    }
45290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
45390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    RequestList requestList;
45490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
45590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    res = convertMetadataListToRequestListLocked(requests, /*out*/&requestList);
45690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    if (res != OK) {
45790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        // error logged by previous call
45890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        return res;
45990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    }
46090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
46190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    if (repeating) {
4622d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        res = mRequestThread->setRepeatingRequests(requestList, lastFrameNumber);
46390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    } else {
4642d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        res = mRequestThread->queueRequestList(requestList, lastFrameNumber);
46590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    }
46690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
46790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    if (res == OK) {
46890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        waitUntilStateThenRelock(/*active*/true, kActiveTimeout);
46990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        if (res != OK) {
47090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            SET_ERR_L("Can't transition to active in %f seconds!",
47190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei                    kActiveTimeout/1e9);
47290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        }
4732d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        ALOGV("Camera %d: Capture request %" PRId32 " enqueued", mId,
4742d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei              (*(requestList.begin()))->mResultExtras.requestId);
47590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    } else {
47690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        CLOGE("Cannot queue request. Impossible.");
47790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        return BAD_VALUE;
47890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    }
47990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
48090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    return res;
48190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei}
48290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
483cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::captureList(const List<const CameraMetadata> &requests,
484cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                    int64_t *lastFrameNumber) {
48590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    ATRACE_CALL();
48690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
487cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    return submitRequestsHelper(requests, /*repeating*/false, lastFrameNumber);
48890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei}
4897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
490cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::setStreamingRequest(const CameraMetadata &request,
491cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                            int64_t* /*lastFrameNumber*/) {
4927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
493f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
4942d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    List<const CameraMetadata> requests;
4952d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    requests.push_back(request);
4962d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    return setStreamingRequestList(requests, /*lastFrameNumber*/NULL);
497f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
498f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
499cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::setStreamingRequestList(const List<const CameraMetadata> &requests,
500cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                                int64_t *lastFrameNumber) {
50190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    ATRACE_CALL();
50290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
503cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    return submitRequestsHelper(requests, /*repeating*/true, lastFrameNumber);
50490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei}
505f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
506f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::setUpRequestLocked(
507f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        const CameraMetadata &request) {
508f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
509f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
510f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (mStatus == STATUS_UNCONFIGURED || mNeedConfig) {
511f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = configureStreamsLocked();
512f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
513b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Can't set up streams: %s (%d)", strerror(-res), res);
514f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return NULL;
515f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
516f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mStatus == STATUS_UNCONFIGURED) {
517f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            CLOGE("No streams configured");
518f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            return NULL;
519f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
520f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
521f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
522f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> newRequest = createCaptureRequest(request);
523f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return newRequest;
5247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
5257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
526cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::clearStreamingRequest(int64_t *lastFrameNumber) {
5277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
528f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
529f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
530f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
531f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
532f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
533b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
534f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
535f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
536b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device not initialized");
537f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
538f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
539f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
540f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
541f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
542f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
543f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
544b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
545f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
546f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
547f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Clearing repeating request", mId);
548cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
5492d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    return mRequestThread->clearRepeatingRequests(lastFrameNumber);
5507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
5517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) {
5537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
554f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
5557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return mRequestThread->waitUntilRequestProcessed(requestId, timeout);
5577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
5587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5595a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Device::createInputStream(
5605a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        uint32_t width, uint32_t height, int format, int *id) {
5615a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    ATRACE_CALL();
562f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
5635a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    Mutex::Autolock l(mLock);
564f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Creating new input stream %d: %d x %d, format %d",
565f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mId, mNextStreamId, width, height, format);
5665a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5675a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    status_t res;
5685a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    bool wasActive = false;
5695a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5705a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    switch (mStatus) {
5715a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        case STATUS_ERROR:
5725a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            ALOGE("%s: Device has encountered a serious error", __FUNCTION__);
5735a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            return INVALID_OPERATION;
5745a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        case STATUS_UNINITIALIZED:
5755a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            ALOGE("%s: Device not initialized", __FUNCTION__);
5765a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            return INVALID_OPERATION;
577f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
578f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
5795a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            // OK
5805a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            break;
5815a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        case STATUS_ACTIVE:
5825a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__);
583f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            res = internalPauseAndWaitLocked();
5845a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            if (res != OK) {
585f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                SET_ERR_L("Can't pause captures to reconfigure streams!");
5865a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin                return res;
5875a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            }
5885a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            wasActive = true;
5895a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            break;
5905a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        default:
591f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            SET_ERR_L("%s: Unexpected status: %d", mStatus);
5925a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            return INVALID_OPERATION;
5935a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    }
594f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    assert(mStatus != STATUS_ACTIVE);
5955a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5965a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    if (mInputStream != 0) {
5975a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__);
5985a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        return INVALID_OPERATION;
5995a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    }
6005a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
6015a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    sp<Camera3InputStream> newStream = new Camera3InputStream(mNextStreamId,
6025a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin                width, height, format);
603f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    newStream->setStatusTracker(mStatusTracker);
6045a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
6055a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    mInputStream = newStream;
6065a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
6075a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    *id = mNextStreamId++;
6085a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
6095a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    // Continue captures if active at start
6105a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    if (wasActive) {
6115a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__);
6125a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        res = configureStreamsLocked();
6135a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        if (res != OK) {
6145a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)",
6155a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin                    __FUNCTION__, mNextStreamId, strerror(-res), res);
6165a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            return res;
6175a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        }
618f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        internalResumeLocked();
6195a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    }
6205a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
621f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Created input stream", mId);
6225a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    return OK;
6235a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin}
6245a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
6252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinstatus_t Camera3Device::createZslStream(
6272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            uint32_t width, uint32_t height,
6282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            int depth,
6292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            /*out*/
6302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            int *id,
6312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            sp<Camera3ZslStream>* zslStream) {
6322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    ATRACE_CALL();
633f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
6342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    Mutex::Autolock l(mLock);
635f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Creating ZSL stream %d: %d x %d, depth %d",
636f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mId, mNextStreamId, width, height, depth);
6372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6382fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    status_t res;
6392fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    bool wasActive = false;
6402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    switch (mStatus) {
6422fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        case STATUS_ERROR:
6432fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            ALOGE("%s: Device has encountered a serious error", __FUNCTION__);
6442fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            return INVALID_OPERATION;
6452fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        case STATUS_UNINITIALIZED:
6462fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            ALOGE("%s: Device not initialized", __FUNCTION__);
6472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            return INVALID_OPERATION;
648f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
649f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
6502fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            // OK
6512fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            break;
6522fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        case STATUS_ACTIVE:
6532fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__);
654f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            res = internalPauseAndWaitLocked();
6552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            if (res != OK) {
656f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                SET_ERR_L("Can't pause captures to reconfigure streams!");
6572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                return res;
6582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            }
6592fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            wasActive = true;
6602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            break;
6612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        default:
662f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
6632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            return INVALID_OPERATION;
6642fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    }
665f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    assert(mStatus != STATUS_ACTIVE);
6662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6672fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    if (mInputStream != 0) {
6682fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__);
6692fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        return INVALID_OPERATION;
6702fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    }
6712fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    sp<Camera3ZslStream> newStream = new Camera3ZslStream(mNextStreamId,
6732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                width, height, depth);
674f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    newStream->setStatusTracker(mStatusTracker);
6752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    res = mOutputStreams.add(mNextStreamId, newStream);
6772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    if (res < 0) {
6782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        ALOGE("%s: Can't add new stream to set: %s (%d)",
6792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                __FUNCTION__, strerror(-res), res);
6802fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        return res;
6812fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    }
6822fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    mInputStream = newStream;
6832fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6842fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    *id = mNextStreamId++;
6852fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    *zslStream = newStream;
6862fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6872fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    // Continue captures if active at start
6882fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    if (wasActive) {
6892fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__);
6902fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        res = configureStreamsLocked();
6912fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        if (res != OK) {
6922fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)",
6932fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                    __FUNCTION__, mNextStreamId, strerror(-res), res);
6942fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            return res;
6952fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        }
696f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        internalResumeLocked();
6972fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    }
6982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
699f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Created ZSL stream", mId);
7002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    return OK;
7012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin}
7022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
7037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createStream(sp<ANativeWindow> consumer,
7047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        uint32_t width, uint32_t height, int format, size_t size, int *id) {
7057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
706f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
707f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
708e5729fac81c8a984e984fefc90afc64135817d4fColin Cross    ALOGV("Camera %d: Creating new stream %d: %d x %d, format %d, size %zu",
709f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mId, mNextStreamId, width, height, format, size);
7107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
711f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
712f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    bool wasActive = false;
713f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
714f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
715f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
716b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
717f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
718f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
719b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device not initialized");
720f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
721f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
722f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
723f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
724f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
725f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
726f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__);
727f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            res = internalPauseAndWaitLocked();
728f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            if (res != OK) {
729f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                SET_ERR_L("Can't pause captures to reconfigure streams!");
730f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                return res;
731f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            }
732f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            wasActive = true;
733f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
734f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
735b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
736f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
737f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
738f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    assert(mStatus != STATUS_ACTIVE);
739f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
740f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<Camera3OutputStream> newStream;
741f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (format == HAL_PIXEL_FORMAT_BLOB) {
742f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newStream = new Camera3OutputStream(mNextStreamId, consumer,
743f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                width, height, size, format);
744f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    } else {
745f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newStream = new Camera3OutputStream(mNextStreamId, consumer,
746f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                width, height, format);
747f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
748f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    newStream->setStatusTracker(mStatusTracker);
749f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
750f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = mOutputStreams.add(mNextStreamId, newStream);
751f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (res < 0) {
752b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Can't add new stream to set: %s (%d)", strerror(-res), res);
753f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return res;
754f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
755f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
756f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    *id = mNextStreamId++;
757ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    mNeedConfig = true;
758f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
759f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Continue captures if active at start
760f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (wasActive) {
761f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__);
762f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = configureStreamsLocked();
763f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
764b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Can't reconfigure device for new stream %d: %s (%d)",
765b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    mNextStreamId, strerror(-res), res);
766f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return res;
767f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
768f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        internalResumeLocked();
769f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
770f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Created new stream", mId);
771f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
7727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
7737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createReprocessStreamFromStream(int outputId, int *id) {
7757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
7767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    (void)outputId; (void)id;
7777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
778b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    CLOGE("Unimplemented");
7797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return INVALID_OPERATION;
7807fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
7817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::getStreamInfo(int id,
7847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        uint32_t *width, uint32_t *height, uint32_t *format) {
7857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
786f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
787f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
788f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
789f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
790f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
791b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
792f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
793f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
794b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device not initialized!");
795f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
796f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
797f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
798f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
799f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
800f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
801f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
802b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
803f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
804f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
8057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
806f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ssize_t idx = mOutputStreams.indexOfKey(id);
807f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (idx == NAME_NOT_FOUND) {
808b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Stream %d is unknown", id);
809f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return idx;
810f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
811f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
812f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (width) *width  = mOutputStreams[idx]->getWidth();
813f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (height) *height = mOutputStreams[idx]->getHeight();
814f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (format) *format = mOutputStreams[idx]->getFormat();
815f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
816f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
8177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
8187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setStreamTransform(int id,
8207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        int transform) {
8217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
822f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
823f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
824f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
825f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
826f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
827b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
828f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
829f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
830b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device not initialized");
831f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
832f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
833f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
834f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
835f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
836f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
837f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
838b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
839f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
840f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
8417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
842f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ssize_t idx = mOutputStreams.indexOfKey(id);
843f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (idx == NAME_NOT_FOUND) {
844b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Stream %d does not exist",
845b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                id);
846f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return BAD_VALUE;
847f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
848f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
849f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return mOutputStreams.editValueAt(idx)->setTransform(transform);
8507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
8517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteStream(int id) {
8537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
854f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
855f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
856f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
8577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
858e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin    ALOGV("%s: Camera %d: Deleting stream %d", __FUNCTION__, mId, id);
859e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin
860f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // CameraDevice semantics require device to already be idle before
861f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // deleteStream is called, unlike for createStream.
862f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (mStatus == STATUS_ACTIVE) {
8635282713a976184e41451315f1286d8075b257d58Igor Murashkin        ALOGV("%s: Camera %d: Device not idle", __FUNCTION__, mId);
8645282713a976184e41451315f1286d8075b257d58Igor Murashkin        return -EBUSY;
865f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
866f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
8672fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    sp<Camera3StreamInterface> deletedStream;
8685f44635dc35814b98b4dc2b255355a93122fec59Zhijun He    ssize_t outputStreamIdx = mOutputStreams.indexOfKey(id);
869f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mInputStream != NULL && id == mInputStream->getId()) {
870f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        deletedStream = mInputStream;
871f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mInputStream.clear();
872f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    } else {
8735f44635dc35814b98b4dc2b255355a93122fec59Zhijun He        if (outputStreamIdx == NAME_NOT_FOUND) {
874b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Stream %d does not exist", id);
875f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return BAD_VALUE;
876f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
8775f44635dc35814b98b4dc2b255355a93122fec59Zhijun He    }
8785f44635dc35814b98b4dc2b255355a93122fec59Zhijun He
8795f44635dc35814b98b4dc2b255355a93122fec59Zhijun He    // Delete output stream or the output part of a bi-directional stream.
8805f44635dc35814b98b4dc2b255355a93122fec59Zhijun He    if (outputStreamIdx != NAME_NOT_FOUND) {
8815f44635dc35814b98b4dc2b255355a93122fec59Zhijun He        deletedStream = mOutputStreams.editValueAt(outputStreamIdx);
882f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mOutputStreams.removeItem(id);
883f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
884f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
885f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Free up the stream endpoint so that it can be used by some other stream
886f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = deletedStream->disconnect();
887f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (res != OK) {
888b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Can't disconnect deleted stream %d", id);
889f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // fall through since we want to still list the stream as deleted.
890f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
891f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mDeletedStreams.add(deletedStream);
892ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    mNeedConfig = true;
893f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
894f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return res;
8957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
8967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteReprocessStream(int id) {
8987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
8997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    (void)id;
9007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
901b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    CLOGE("Unimplemented");
9027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return INVALID_OPERATION;
9037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
9047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
9057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
9067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createDefaultRequest(int templateId,
9077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        CameraMetadata *request) {
9087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
909fe7e0c6154309f2491463ee6ca4920d225289638Alex Ray    ALOGV("%s: for template %d", __FUNCTION__, templateId);
910f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
911f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
912f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
913f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
914f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
915b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
916f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
917f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
918b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device is not initialized!");
919f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
920f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
921f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
922f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
923f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
924f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
925f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
926b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
927f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
928f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
9297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
9307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    const camera_metadata_t *rawRequest;
93117a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_BEGIN("camera3->construct_default_request_settings");
9327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    rawRequest = mHal3Device->ops->construct_default_request_settings(
9337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        mHal3Device, templateId);
93417a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_END();
935b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    if (rawRequest == NULL) {
936b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("HAL is unable to construct default settings for template %d",
937b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                templateId);
938b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        return DEAD_OBJECT;
939b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    }
9407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    *request = rawRequest;
9417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
9427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return OK;
9437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
9447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
9457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilDrained() {
9467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
947f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
948f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
9497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
95069a374897392c8bd70f441b7284f6f578c651ec9Zhijun He    return waitUntilDrainedLocked();
95169a374897392c8bd70f441b7284f6f578c651ec9Zhijun He}
95269a374897392c8bd70f441b7284f6f578c651ec9Zhijun He
95369a374897392c8bd70f441b7284f6f578c651ec9Zhijun Hestatus_t Camera3Device::waitUntilDrainedLocked() {
954f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
955f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
956f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
957f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGV("%s: Already idle", __FUNCTION__);
958f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return OK;
959f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
960f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            // To avoid race conditions, check with tracker to be sure
961f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
962f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
963f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            // Need to verify shut down
964f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
965f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
966b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d",mStatus);
967f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
968f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
969f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
970f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("%s: Camera %d: Waiting until idle", __FUNCTION__, mId);
971f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout);
972f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return res;
973f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
974f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
975f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// Pause to reconfigure
976f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::internalPauseAndWaitLocked() {
977f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mRequestThread->setPaused(true);
978f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mPauseStateNotify = true;
979f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
980f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("%s: Camera %d: Internal wait until idle", __FUNCTION__, mId);
981f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout);
982f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (res != OK) {
983f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        SET_ERR_L("Can't idle device in %f seconds!",
984f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                kShutdownTimeout/1e9);
985f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
986f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
987f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return res;
988f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
989f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
990f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// Resume after internalPauseAndWaitLocked
991f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::internalResumeLocked() {
992f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t res;
993f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
994f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mRequestThread->setPaused(false);
995f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
996f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    res = waitUntilStateThenRelock(/*active*/ true, kActiveTimeout);
997f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (res != OK) {
998f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        SET_ERR_L("Can't transition to active in %f seconds!",
999f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                kActiveTimeout/1e9);
1000f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1001f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mPauseStateNotify = false;
1002f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return OK;
1003f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
1004f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1005f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::waitUntilStateThenRelock(bool active,
1006f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        nsecs_t timeout) {
1007f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t res = OK;
1008f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (active == (mStatus == STATUS_ACTIVE)) {
1009f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Desired state already reached
1010f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        return res;
1011f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1012f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1013f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool stateSeen = false;
1014f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    do {
1015f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mRecentStatusUpdates.clear();
1016f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1017f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        res = mStatusChanged.waitRelative(mLock, timeout);
1018f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (res != OK) break;
1019f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1020f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Check state change history during wait
1021f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        for (size_t i = 0; i < mRecentStatusUpdates.size(); i++) {
1022f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            if (active == (mRecentStatusUpdates[i] == STATUS_ACTIVE) ) {
1023f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                stateSeen = true;
1024f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                break;
1025f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            }
1026f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
1027f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    } while (!stateSeen);
1028f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1029f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return res;
10307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
10317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1032f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
10337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setNotifyCallback(NotificationListener *listener) {
10347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
10357d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex::Autolock l(mOutputLock);
10367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10377d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    if (listener != NULL && mListener != NULL) {
10387d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        ALOGW("%s: Replacing old callback listener", __FUNCTION__);
10397d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
10407d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    mListener = listener;
10417d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
10427d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    return OK;
10437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
10447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
104546910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvalabool Camera3Device::willNotify3A() {
104646910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    return false;
104746910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala}
104846910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala
10497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitForNextFrame(nsecs_t timeout) {
10507d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    status_t res;
10517d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex::Autolock l(mOutputLock);
10527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10537d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    while (mResultQueue.empty()) {
10547d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        res = mResultSignal.waitRelative(mOutputLock, timeout);
10557d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (res == TIMED_OUT) {
10567d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            return res;
10577d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        } else if (res != OK) {
1058e5729fac81c8a984e984fefc90afc64135817d4fColin Cross            ALOGW("%s: Camera %d: No frame in %" PRId64 " ns: %s (%d)",
1059b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    __FUNCTION__, mId, timeout, strerror(-res), res);
10607d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            return res;
10617d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
10627d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
10637d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    return OK;
10647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
10657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1066cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::getNextResult(CaptureResult *frame) {
10677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
10687d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex::Autolock l(mOutputLock);
10697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10707d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    if (mResultQueue.empty()) {
10717d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        return NOT_ENOUGH_DATA;
10727d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
10737d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
1074cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    if (frame == NULL) {
1075cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        ALOGE("%s: argument cannot be NULL", __FUNCTION__);
1076cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        return BAD_VALUE;
1077cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    }
1078cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
1079cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    CaptureResult &result = *(mResultQueue.begin());
1080cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    frame->mResultExtras = result.mResultExtras;
1081cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    frame->mMetadata.acquire(result.mMetadata);
10827d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    mResultQueue.erase(mResultQueue.begin());
10837d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
10847d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    return OK;
10857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
10867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerAutofocus(uint32_t id) {
10887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
1089f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
10907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id);
10924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Mix-in this trigger into the next request and only the next request.
10934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    RequestTrigger trigger[] = {
10944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
10954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER,
10964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER_START
10974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
10984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
10994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER_ID,
11004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            static_cast<int32_t>(id)
11014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
11024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
11034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
11044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return mRequestThread->queueTrigger(trigger,
11054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                        sizeof(trigger)/sizeof(trigger[0]));
11067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
11077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
11087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerCancelAutofocus(uint32_t id) {
11097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
1110f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
11117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
11124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    ALOGV("%s: Triggering cancel autofocus, id %d", __FUNCTION__, id);
11134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Mix-in this trigger into the next request and only the next request.
11144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    RequestTrigger trigger[] = {
11154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
11164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER,
11174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER_CANCEL
11184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
11194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
11204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER_ID,
11214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            static_cast<int32_t>(id)
11224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
11234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
11244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
11254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return mRequestThread->queueTrigger(trigger,
11264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                        sizeof(trigger)/sizeof(trigger[0]));
11277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
11287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
11297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerPrecaptureMetering(uint32_t id) {
11307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
1131f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
11327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
11334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id);
11344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Mix-in this trigger into the next request and only the next request.
11354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    RequestTrigger trigger[] = {
11364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
11374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,
11384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START
11394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
11404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
11414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AE_PRECAPTURE_ID,
11424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            static_cast<int32_t>(id)
11434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
11444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
11454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
11464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return mRequestThread->queueTrigger(trigger,
11474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                        sizeof(trigger)/sizeof(trigger[0]));
11487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
11497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
11507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::pushReprocessBuffer(int reprocessStreamId,
11517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        buffer_handle_t *buffer, wp<BufferReleasedListener> listener) {
11527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
11537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    (void)reprocessStreamId; (void)buffer; (void)listener;
11547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1155b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    CLOGE("Unimplemented");
11567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return INVALID_OPERATION;
11577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
11587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1159cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::flush(int64_t *frameNumber) {
1160abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    ATRACE_CALL();
1161abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    ALOGV("%s: Camera %d: Flushing all requests", __FUNCTION__, mId);
1162f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
1163abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    Mutex::Autolock l(mLock);
1164abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
11652d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    mRequestThread->clear(/*out*/frameNumber);
1166491e341211b4772c75f719158f6b397e1c40497dZhijun He    status_t res;
1167491e341211b4772c75f719158f6b397e1c40497dZhijun He    if (mHal3Device->common.version >= CAMERA_DEVICE_API_VERSION_3_1) {
1168491e341211b4772c75f719158f6b397e1c40497dZhijun He        res = mHal3Device->ops->flush(mHal3Device);
1169491e341211b4772c75f719158f6b397e1c40497dZhijun He    } else {
117069a374897392c8bd70f441b7284f6f578c651ec9Zhijun He        res = waitUntilDrainedLocked();
1171491e341211b4772c75f719158f6b397e1c40497dZhijun He    }
1172491e341211b4772c75f719158f6b397e1c40497dZhijun He
1173491e341211b4772c75f719158f6b397e1c40497dZhijun He    return res;
1174abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala}
1175abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
1176f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/**
1177f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Methods called by subclasses
1178f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */
1179f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1180f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid Camera3Device::notifyStatus(bool idle) {
1181f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    {
1182f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Need mLock to safely update state and synchronize to current
1183f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // state of methods in flight.
1184f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        Mutex::Autolock l(mLock);
1185f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // We can get various system-idle notices from the status tracker
1186f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // while starting up. Only care about them if we've actually sent
1187f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // in some requests recently.
1188f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mStatus != STATUS_ACTIVE && mStatus != STATUS_CONFIGURED) {
1189f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            return;
1190f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
1191f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGV("%s: Camera %d: Now %s", __FUNCTION__, mId,
1192f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                idle ? "idle" : "active");
1193f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatus = idle ? STATUS_CONFIGURED : STATUS_ACTIVE;
1194f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mRecentStatusUpdates.add(mStatus);
1195f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatusChanged.signal();
1196f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1197f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Skip notifying listener if we're doing some user-transparent
1198f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // state changes
1199f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mPauseStateNotify) return;
1200f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
1201f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    NotificationListener *listener;
1202f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    {
1203f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        Mutex::Autolock l(mOutputLock);
1204f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        listener = mListener;
1205f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
1206f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (idle && listener != NULL) {
1207f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        listener->notifyIdle();
1208f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
1209f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
1210f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1211f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala/**
1212f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera3Device private methods
1213f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */
1214f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1215f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::createCaptureRequest(
1216f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        const CameraMetadata &request) {
1217f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ATRACE_CALL();
1218f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
1219f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1220f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> newRequest = new CaptureRequest;
1221f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    newRequest->mSettings = request;
1222f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1223f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera_metadata_entry_t inputStreams =
1224f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            newRequest->mSettings.find(ANDROID_REQUEST_INPUT_STREAMS);
1225f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (inputStreams.count > 0) {
1226f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (mInputStream == NULL ||
1227d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He                mInputStream->getId() != inputStreams.data.i32[0]) {
1228b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Request references unknown input stream %d",
1229b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    inputStreams.data.u8[0]);
1230f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return NULL;
1231f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1232f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Lazy completion of stream configuration (allocation/registration)
1233f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // on first use
1234f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (mInputStream->isConfiguring()) {
1235f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            res = mInputStream->finishConfiguration(mHal3Device);
1236f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            if (res != OK) {
1237b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                SET_ERR_L("Unable to finish configuring input stream %d:"
1238f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                        " %s (%d)",
1239b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                        mInputStream->getId(), strerror(-res), res);
1240f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                return NULL;
1241f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            }
1242f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1243f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1244f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newRequest->mInputStream = mInputStream;
1245f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newRequest->mSettings.erase(ANDROID_REQUEST_INPUT_STREAMS);
1246f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1247f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1248f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera_metadata_entry_t streams =
1249f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            newRequest->mSettings.find(ANDROID_REQUEST_OUTPUT_STREAMS);
1250f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (streams.count == 0) {
1251b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Zero output streams specified!");
1252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return NULL;
1253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1254f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1255f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < streams.count; i++) {
1256d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He        int idx = mOutputStreams.indexOfKey(streams.data.i32[i]);
1257f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (idx == NAME_NOT_FOUND) {
1258b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Request references unknown stream %d",
1259b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    streams.data.u8[i]);
1260f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return NULL;
1261f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
12622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        sp<Camera3OutputStreamInterface> stream =
12632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                mOutputStreams.editValueAt(idx);
1264f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1265f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Lazy completion of stream configuration (allocation/registration)
1266f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // on first use
1267f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (stream->isConfiguring()) {
1268f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            res = stream->finishConfiguration(mHal3Device);
1269f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            if (res != OK) {
1270b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                SET_ERR_L("Unable to finish configuring stream %d: %s (%d)",
1271b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                        stream->getId(), strerror(-res), res);
1272f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                return NULL;
1273f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            }
1274f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1275f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1276f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newRequest->mOutputStreams.push(stream);
1277f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1278f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    newRequest->mSettings.erase(ANDROID_REQUEST_OUTPUT_STREAMS);
1279f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1280f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return newRequest;
12817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
12827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::configureStreamsLocked() {
1284f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ATRACE_CALL();
1285f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
12867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1287f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (mStatus != STATUS_UNCONFIGURED && mStatus != STATUS_CONFIGURED) {
1288b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Not idle");
1289f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return INVALID_OPERATION;
1290f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1291f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1292ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    if (!mNeedConfig) {
1293ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala        ALOGV("%s: Skipping config, no stream changes", __FUNCTION__);
1294ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala        return OK;
1295ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    }
1296ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala
1297f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Start configuring the streams
1298f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("%s: Camera %d: Starting stream configuration", __FUNCTION__, mId);
1299f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1300f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_stream_configuration config;
1301f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1302f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    config.num_streams = (mInputStream != NULL) + mOutputStreams.size();
1303f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1304f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Vector<camera3_stream_t*> streams;
1305f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    streams.setCapacity(config.num_streams);
1306f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1307f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mInputStream != NULL) {
1308f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_stream_t *inputStream;
1309f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        inputStream = mInputStream->startConfiguration();
1310f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (inputStream == NULL) {
1311b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Can't start input stream configuration");
1312f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
1313f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1314f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        streams.add(inputStream);
1315f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1316f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1317f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < mOutputStreams.size(); i++) {
13182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
13192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        // Don't configure bidi streams twice, nor add them twice to the list
13202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        if (mOutputStreams[i].get() ==
13212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            static_cast<Camera3StreamInterface*>(mInputStream.get())) {
13222fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
13232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            config.num_streams--;
13242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            continue;
13252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        }
13262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
1327f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_stream_t *outputStream;
1328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        outputStream = mOutputStreams.editValueAt(i)->startConfiguration();
1329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (outputStream == NULL) {
1330b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Can't start output stream configuration");
1331f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
1332f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1333f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        streams.add(outputStream);
1334f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1335f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1336f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    config.streams = streams.editArray();
1337f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1338f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Do the HAL configuration; will potentially touch stream
1339f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // max_buffers, usage, priv fields.
134017a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_BEGIN("camera3->configure_streams");
1341f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = mHal3Device->ops->configure_streams(mHal3Device, &config);
134217a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_END();
1343f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1344f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (res != OK) {
1345b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Unable to configure streams with HAL: %s (%d)",
1346b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                strerror(-res), res);
1347f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return res;
1348f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1349f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
13504c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    // Finish all stream configuration immediately.
13514c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    // TODO: Try to relax this later back to lazy completion, which should be
13524c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    // faster
13534c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala
1354073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin    if (mInputStream != NULL && mInputStream->isConfiguring()) {
13554c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala        res = mInputStream->finishConfiguration(mHal3Device);
13564c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala        if (res != OK) {
13574c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala            SET_ERR_L("Can't finish configuring input stream %d: %s (%d)",
13584c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala                    mInputStream->getId(), strerror(-res), res);
13594c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala            return res;
13604c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala        }
13614c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    }
13624c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala
13634c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    for (size_t i = 0; i < mOutputStreams.size(); i++) {
1364073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin        sp<Camera3OutputStreamInterface> outputStream =
1365073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin            mOutputStreams.editValueAt(i);
1366073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin        if (outputStream->isConfiguring()) {
1367073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin            res = outputStream->finishConfiguration(mHal3Device);
1368073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin            if (res != OK) {
1369073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin                SET_ERR_L("Can't finish configuring output stream %d: %s (%d)",
1370073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin                        outputStream->getId(), strerror(-res), res);
1371073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin                return res;
1372073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin            }
13734c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala        }
13744c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    }
13754c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala
1376f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Request thread needs to know to avoid using repeat-last-settings protocol
1377f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // across configure_streams() calls
1378f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRequestThread->configurationComplete();
1379f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1380f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Update device state
1381f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1382ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    mNeedConfig = false;
1383f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1384f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (config.num_streams > 0) {
1385f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatus = STATUS_CONFIGURED;
1386f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    } else {
1387f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatus = STATUS_UNCONFIGURED;
1388f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
1389f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1390f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("%s: Camera %d: Stream configuration complete", __FUNCTION__, mId);
1391f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1392f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
13937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
13947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1395b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorState(const char *fmt, ...) {
1396b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    Mutex::Autolock l(mLock);
1397b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_list args;
1398b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_start(args, fmt);
1399b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1400b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    setErrorStateLockedV(fmt, args);
1401b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1402b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_end(args);
1403b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala}
1404b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1405b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateV(const char *fmt, va_list args) {
1406b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    Mutex::Autolock l(mLock);
1407b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    setErrorStateLockedV(fmt, args);
1408b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala}
1409b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1410b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateLocked(const char *fmt, ...) {
1411b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_list args;
1412b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_start(args, fmt);
1413b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1414b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    setErrorStateLockedV(fmt, args);
1415b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1416b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_end(args);
1417b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala}
1418b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1419b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateLockedV(const char *fmt, va_list args) {
142042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Print out all error messages to log
142142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    String8 errorCause = String8::formatV(fmt, args);
142242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    ALOGE("Camera %d: %s", mId, errorCause.string());
142342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
142442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // But only do error state transition steps for the first error
1425b05eeaedacaff92b6e5ac89f99b0fccdf7643f09Zhijun He    if (mStatus == STATUS_ERROR || mStatus == STATUS_UNINITIALIZED) return;
1426b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1427ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin    // Save stack trace. View by dumping it later.
1428ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin    CameraTraces::saveTrace();
1429ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin    // TODO: consider adding errorCause and client pid/procname
1430ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin
143142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    mErrorCause = errorCause;
143242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
143342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    mRequestThread->setPaused(true);
1434b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    mStatus = STATUS_ERROR;
1435b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala}
1436f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1437f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/**
143842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala * In-flight request management
143942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala */
144042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
1441cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weistatus_t Camera3Device::registerInFlight(uint32_t frameNumber,
1442cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        int32_t numBuffers, CaptureResultExtras resultExtras) {
144342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    ATRACE_CALL();
144442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    Mutex::Autolock l(mInFlightLock);
144542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
144642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    ssize_t res;
1447cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    res = mInFlightMap.add(frameNumber, InFlightRequest(numBuffers, resultExtras));
144842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (res < 0) return res;
144942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
145042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    return OK;
145142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala}
145242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
145342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala/**
1454fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * QUIRK(partial results)
1455fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * Check if all 3A fields are ready, and send off a partial 3A-only result
1456fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * to the output frame queue
1457fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala */
1458184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvalabool Camera3Device::processPartial3AQuirk(
1459cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        uint32_t frameNumber,
1460cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        const CameraMetadata& partial, const CaptureResultExtras& resultExtras) {
1461fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1462fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // Check if all 3A states are present
1463fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // The full list of fields is
1464fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.control.afMode
1465fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.control.awbMode
1466fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.control.aeState
1467fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.control.awbState
1468fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.control.afState
1469fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.control.afTriggerID
1470fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.control.aePrecaptureID
1471fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // TODO: Add android.control.aeMode
1472fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1473fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    bool gotAllStates = true;
1474fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1475fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    uint8_t afMode;
1476fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    uint8_t awbMode;
1477fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    uint8_t aeState;
1478fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    uint8_t afState;
1479fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    uint8_t awbState;
1480fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    int32_t afTriggerId;
1481fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    int32_t aeTriggerId;
1482fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1483fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AF_MODE,
1484fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        &afMode, frameNumber);
1485fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1486fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AWB_MODE,
1487fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        &awbMode, frameNumber);
1488fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1489fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AE_STATE,
1490fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        &aeState, frameNumber);
1491fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1492fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AF_STATE,
1493fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        &afState, frameNumber);
1494fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1495fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AWB_STATE,
1496fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        &awbState, frameNumber);
1497fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1498fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AF_TRIGGER_ID,
1499fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        &afTriggerId, frameNumber);
1500fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1501fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AE_PRECAPTURE_ID,
1502fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        &aeTriggerId, frameNumber);
1503fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1504fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (!gotAllStates) return false;
1505fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1506184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala    ALOGVV("%s: Camera %d: Frame %d, Request ID %d: AF mode %d, AWB mode %d, "
1507fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        "AF state %d, AE state %d, AWB state %d, "
1508fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        "AF trigger %d, AE precapture trigger %d",
15092d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        __FUNCTION__, mId, frameNumber, resultExtras.requestId,
1510fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        afMode, awbMode,
1511fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        afState, aeState, awbState,
1512fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        afTriggerId, aeTriggerId);
1513fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1514fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // Got all states, so construct a minimal result to send
1515fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // In addition to the above fields, this means adding in
1516fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.request.frameCount
1517184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala    //   android.request.requestId
1518fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.quirks.partialResult
1519fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1520184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala    const size_t kMinimal3AResultEntries = 10;
1521fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1522fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    Mutex::Autolock l(mOutputLock);
1523fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1524cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    CaptureResult captureResult;
1525cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    captureResult.mResultExtras = resultExtras;
1526cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    captureResult.mMetadata = CameraMetadata(kMinimal3AResultEntries, /*dataCapacity*/ 0);
1527cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    // TODO: change this to sp<CaptureResult>. This will need other changes, including,
1528cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    // but not limited to CameraDeviceBase::getNextResult
1529cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    CaptureResult& min3AResult =
1530cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            *mResultQueue.insert(mResultQueue.end(), captureResult);
1531cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
1532cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    if (!insert3AResult(min3AResult.mMetadata, ANDROID_REQUEST_FRAME_COUNT,
1533cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            // TODO: This is problematic casting. Need to fix CameraMetadata.
1534cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            reinterpret_cast<int32_t*>(&frameNumber), frameNumber)) {
1535fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1536fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1537fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1538cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    int32_t requestId = resultExtras.requestId;
1539cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    if (!insert3AResult(min3AResult.mMetadata, ANDROID_REQUEST_ID,
1540184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala            &requestId, frameNumber)) {
1541184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala        return false;
1542184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala    }
1543184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala
1544fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    static const uint8_t partialResult = ANDROID_QUIRKS_PARTIAL_RESULT_PARTIAL;
1545cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    if (!insert3AResult(min3AResult.mMetadata, ANDROID_QUIRKS_PARTIAL_RESULT,
1546fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &partialResult, frameNumber)) {
1547fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1548fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1549fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1550cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AF_MODE,
1551fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &afMode, frameNumber)) {
1552fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1553fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1554fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1555cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AWB_MODE,
1556fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &awbMode, frameNumber)) {
1557fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1558fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1559fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1560cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AE_STATE,
1561fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &aeState, frameNumber)) {
1562fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1563fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1564fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1565cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AF_STATE,
1566fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &afState, frameNumber)) {
1567fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1568fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1569fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1570cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AWB_STATE,
1571fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &awbState, frameNumber)) {
1572fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1573fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1574fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1575cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AF_TRIGGER_ID,
1576fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &afTriggerId, frameNumber)) {
1577fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1578fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1579fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1580cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    if (!insert3AResult(min3AResult.mMetadata, ANDROID_CONTROL_AE_PRECAPTURE_ID,
1581fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &aeTriggerId, frameNumber)) {
1582fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1583fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1584fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1585fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    mResultSignal.signal();
1586fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1587fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    return true;
1588fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala}
1589fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1590fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalatemplate<typename T>
1591fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalabool Camera3Device::get3AResult(const CameraMetadata& result, int32_t tag,
1592cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        T* value, uint32_t frameNumber) {
1593fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    (void) frameNumber;
1594fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1595fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    camera_metadata_ro_entry_t entry;
1596fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1597fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    entry = result.find(tag);
1598fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (entry.count == 0) {
1599fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        ALOGVV("%s: Camera %d: Frame %d: No %s provided by HAL!", __FUNCTION__,
1600fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            mId, frameNumber, get_camera_metadata_tag_name(tag));
1601fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1602fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1603fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1604fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (sizeof(T) == sizeof(uint8_t)) {
1605fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        *value = entry.data.u8[0];
1606fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    } else if (sizeof(T) == sizeof(int32_t)) {
1607fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        *value = entry.data.i32[0];
1608fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    } else {
1609fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        ALOGE("%s: Unexpected type", __FUNCTION__);
1610fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1611fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1612fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    return true;
1613fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala}
1614fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1615fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalatemplate<typename T>
1616fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalabool Camera3Device::insert3AResult(CameraMetadata& result, int32_t tag,
1617cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        const T* value, uint32_t frameNumber) {
1618fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (result.update(tag, value, 1) != NO_ERROR) {
1619fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        mResultQueue.erase(--mResultQueue.end(), mResultQueue.end());
1620fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        SET_ERR("Frame %d: Failed to set %s in partial metadata",
1621fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                frameNumber, get_camera_metadata_tag_name(tag));
1622fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1623fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1624fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    return true;
1625fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala}
1626fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1627fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala/**
1628f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera HAL device callback methods
1629f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */
1630f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
16317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::processCaptureResult(const camera3_capture_result *result) {
16327d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    ATRACE_CALL();
16337d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
16347d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    status_t res;
16357d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
163642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t frameNumber = result->frame_number;
163742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (result->result == NULL && result->num_output_buffers == 0) {
163842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        SET_ERR("No result data provided by HAL for frame %d",
163942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                frameNumber);
16407d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        return;
16417d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
1642fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    bool partialResultQuirk = false;
1643fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    CameraMetadata collectedQuirkResult;
1644cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    CaptureResultExtras resultExtras;
16457d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
1646cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    // Get capture timestamp and resultExtras from list of in-flight requests,
1647cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    // where it was added by the shutter notification for this frame.
1648cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    // Then update the in-flight status and remove the in-flight entry if
1649cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    // all result data has been received.
16507d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    nsecs_t timestamp = 0;
165142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    {
165242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        Mutex::Autolock l(mInFlightLock);
165342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        ssize_t idx = mInFlightMap.indexOfKey(frameNumber);
165442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        if (idx == NAME_NOT_FOUND) {
165542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Unknown frame number for capture result: %d",
165642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber);
165742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            return;
165842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
165942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        InFlightRequest &request = mInFlightMap.editValueAt(idx);
1660cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        ALOGVV("%s: got InFlightRequest requestId = %" PRId32 ", frameNumber = %" PRId64
1661cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                ", burstId = %" PRId32,
1662cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                __FUNCTION__, request.resultExtras.requestId, request.resultExtras.frameNumber,
1663cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                request.resultExtras.burstId);
1664fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1665fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        // Check if this result carries only partial metadata
1666fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        if (mUsePartialResultQuirk && result->result != NULL) {
1667fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            camera_metadata_ro_entry_t partialResultEntry;
1668fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            res = find_camera_metadata_ro_entry(result->result,
1669fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    ANDROID_QUIRKS_PARTIAL_RESULT, &partialResultEntry);
1670fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            if (res != NAME_NOT_FOUND &&
1671fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    partialResultEntry.count > 0 &&
1672fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    partialResultEntry.data.u8[0] ==
1673fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    ANDROID_QUIRKS_PARTIAL_RESULT_PARTIAL) {
1674fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                // A partial result. Flag this as such, and collect this
1675fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                // set of metadata into the in-flight entry.
1676fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                partialResultQuirk = true;
1677fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                request.partialResultQuirk.collectedResult.append(
1678fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    result->result);
1679fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                request.partialResultQuirk.collectedResult.erase(
1680fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    ANDROID_QUIRKS_PARTIAL_RESULT);
1681fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                // Fire off a 3A-only result if possible
1682fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                if (!request.partialResultQuirk.haveSent3A) {
1683fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    request.partialResultQuirk.haveSent3A =
1684fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                            processPartial3AQuirk(frameNumber,
1685cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                    request.partialResultQuirk.collectedResult,
1686cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                    request.resultExtras);
1687fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                }
1688fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            }
1689fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        }
1690fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
169142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        timestamp = request.captureTimestamp;
1692cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        resultExtras = request.resultExtras;
1693cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
16941d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He        /**
1695fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala         * One of the following must happen before it's legal to call process_capture_result,
1696fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala         * unless partial metadata is being provided:
16971d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He         * - CAMERA3_MSG_SHUTTER (expected during normal operation)
16981d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He         * - CAMERA3_MSG_ERROR (expected during flush)
16991d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He         */
1700fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        if (request.requestStatus == OK && timestamp == 0 && !partialResultQuirk) {
170142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Called before shutter notify for frame %d",
170242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber);
170342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            return;
170442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
170542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
1706fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        // Did we get the (final) result metadata for this capture?
1707fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        if (result->result != NULL && !partialResultQuirk) {
170842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            if (request.haveResultMetadata) {
170942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                SET_ERR("Called multiple times with metadata for frame %d",
171042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                        frameNumber);
171142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                return;
171242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
1713fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            if (mUsePartialResultQuirk &&
1714fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    !request.partialResultQuirk.collectedResult.isEmpty()) {
1715fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                collectedQuirkResult.acquire(
1716fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    request.partialResultQuirk.collectedResult);
1717fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            }
171842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            request.haveResultMetadata = true;
171942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
172042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
172142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        request.numBuffersLeft -= result->num_output_buffers;
172242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
172342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        if (request.numBuffersLeft < 0) {
172442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Too many buffers returned for frame %d",
172542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber);
172642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            return;
172742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
172842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
17291b05dfc8df5e741086747d076fc39c79fb4acb33Zhijun He        // Check if everything has arrived for this result (buffers and metadata), remove it from
17301b05dfc8df5e741086747d076fc39c79fb4acb33Zhijun He        // InFlightMap if both arrived or HAL reports error for this request (i.e. during flush).
17311b05dfc8df5e741086747d076fc39c79fb4acb33Zhijun He        if ((request.requestStatus != OK) ||
17321b05dfc8df5e741086747d076fc39c79fb4acb33Zhijun He                (request.haveResultMetadata && request.numBuffersLeft == 0)) {
173317a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala            ATRACE_ASYNC_END("frame capture", frameNumber);
173442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            mInFlightMap.removeItemsAt(idx, 1);
173542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
173642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
173742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Sanity check - if we have too many in-flight frames, something has
173842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // likely gone wrong
173942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        if (mInFlightMap.size() > kInFlightWarnLimit) {
1740e5729fac81c8a984e984fefc90afc64135817d4fColin Cross            CLOGE("In-flight list too large: %zu", mInFlightMap.size());
174142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
174242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
174342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    }
174442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
174542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Process the result metadata, if provided
1746fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    bool gotResult = false;
1747fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (result->result != NULL && !partialResultQuirk) {
17487d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        Mutex::Autolock l(mOutputLock);
17497d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
1750fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        gotResult = true;
1751fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
175242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        if (frameNumber != mNextResultFrameNumber) {
175342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Out-of-order capture result metadata submitted! "
175442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    "(got frame number %d, expecting %d)",
175542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber, mNextResultFrameNumber);
175642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            return;
175742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
175842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        mNextResultFrameNumber++;
175942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
1760cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        CaptureResult captureResult;
1761cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        captureResult.mResultExtras = resultExtras;
1762cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        captureResult.mMetadata = result->result;
1763fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1764cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        if (captureResult.mMetadata.update(ANDROID_REQUEST_FRAME_COUNT,
1765cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                (int32_t*)&frameNumber, 1) != OK) {
1766b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR("Failed to set frame# in metadata (%d)",
176742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber);
1768fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            gotResult = false;
1769d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin        } else {
1770d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin            ALOGVV("%s: Camera %d: Set frame# in metadata (%d)",
177142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    __FUNCTION__, mId, frameNumber);
1772d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin        }
17737d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
1774fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        // Append any previous partials to form a complete result
1775fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        if (mUsePartialResultQuirk && !collectedQuirkResult.isEmpty()) {
1776cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            captureResult.mMetadata.append(collectedQuirkResult);
1777fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        }
1778fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1779cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        captureResult.mMetadata.sort();
1780fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
178142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Check that there's a timestamp in the result metadata
17827d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
17837d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        camera_metadata_entry entry =
1784cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                captureResult.mMetadata.find(ANDROID_SENSOR_TIMESTAMP);
17857d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (entry.count == 0) {
1786b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR("No timestamp provided by HAL for frame %d!",
178742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber);
1788fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            gotResult = false;
1789fe7e0c6154309f2491463ee6ca4920d225289638Alex Ray        } else if (timestamp != entry.data.i64[0]) {
179042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Timestamp mismatch between shutter notify and result"
1791e5729fac81c8a984e984fefc90afc64135817d4fColin Cross                    " metadata for frame %d (%" PRId64 " vs %" PRId64 " respectively)",
179242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber, timestamp, entry.data.i64[0]);
1793fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            gotResult = false;
1794fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        }
1795fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1796fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        if (gotResult) {
1797fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            // Valid result, insert into queue
1798cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            List<CaptureResult>::iterator queuedResult =
1799cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    mResultQueue.insert(mResultQueue.end(), CaptureResult(captureResult));
1800cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            ALOGVV("%s: result requestId = %" PRId32 ", frameNumber = %" PRId64
1801cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                   ", burstId = %" PRId32, __FUNCTION__,
1802cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                   queuedResult->mResultExtras.requestId,
1803cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                   queuedResult->mResultExtras.frameNumber,
1804cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                   queuedResult->mResultExtras.burstId);
18057d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
18067d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    } // scope for mOutputLock
18077d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
180842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Return completed buffers to their streams with the timestamp
180942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
18107d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    for (size_t i = 0; i < result->num_output_buffers; i++) {
18117d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        Camera3Stream *stream =
18127d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                Camera3Stream::cast(result->output_buffers[i].stream);
18137d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        res = stream->returnBuffer(result->output_buffers[i], timestamp);
18147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        // Note: stream may be deallocated at this point, if this buffer was the
18157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        // last reference to it.
18167d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (res != OK) {
1817e5729fac81c8a984e984fefc90afc64135817d4fColin Cross            ALOGE("Can't return buffer %zu for frame %d to its stream: "
181842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    " %s (%d)", i, frameNumber, strerror(-res), res);
18197d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
18207d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
18217d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
182246910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    // Finally, signal any waiters for new frames
182342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
1824fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (gotResult) {
18254345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin        mResultSignal.signal();
18264345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin    }
18274345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin
18287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
18297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
18307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::notify(const camera3_notify_msg *msg) {
183117a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_CALL();
18327d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    NotificationListener *listener;
18337d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    {
18347d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        Mutex::Autolock l(mOutputLock);
18357d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        listener = mListener;
18367d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
18377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
18387d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    if (msg == NULL) {
183942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        SET_ERR("HAL sent NULL notify message!");
18407d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        return;
18417d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
18427d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
18437d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    switch (msg->type) {
18447d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        case CAMERA3_MSG_ERROR: {
18457d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            int streamId = 0;
18467d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            if (msg->message.error.error_stream != NULL) {
18477d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                Camera3Stream *stream =
18487d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                        Camera3Stream::cast(
18497d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                                  msg->message.error.error_stream);
18507d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                streamId = stream->getId();
18517d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            }
185217a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala            ALOGV("Camera %d: %s: HAL error, frame %d, stream %d: %d",
185317a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala                    mId, __FUNCTION__, msg->message.error.frame_number,
185417a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala                    streamId, msg->message.error.error_code);
18551d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He
1856cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            CaptureResultExtras resultExtras;
18571d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He            // Set request error status for the request in the in-flight tracking
18581d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He            {
18591d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                Mutex::Autolock l(mInFlightLock);
18601d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                ssize_t idx = mInFlightMap.indexOfKey(msg->message.error.frame_number);
18611d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                if (idx >= 0) {
1862cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    InFlightRequest &r = mInFlightMap.editValueAt(idx);
1863cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    r.requestStatus = msg->message.error.error_code;
1864cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    resultExtras = r.resultExtras;
1865cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                } else {
1866cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    resultExtras.frameNumber = msg->message.error.frame_number;
1867cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    ALOGE("Camera %d: %s: cannot find in-flight request on frame %" PRId64
1868cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                          " error", mId, __FUNCTION__, resultExtras.frameNumber);
18691d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                }
18701d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He            }
18711d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He
187242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            if (listener != NULL) {
1873cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                if (msg->message.error.error_code == CAMERA3_MSG_ERROR_DEVICE) {
1874cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    listener->notifyError(ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE,
1875cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                          resultExtras);
1876cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                } else {
1877cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    listener->notifyError(ICameraDeviceCallbacks::ERROR_CAMERA_SERVICE,
1878cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                          resultExtras);
1879cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                }
1880cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            } else {
1881cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                ALOGE("Camera %d: %s: no listener available", mId, __FUNCTION__);
188242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
18837d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            break;
18847d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
18857d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        case CAMERA3_MSG_SHUTTER: {
188642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            ssize_t idx;
188742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            uint32_t frameNumber = msg->message.shutter.frame_number;
188842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            nsecs_t timestamp = msg->message.shutter.timestamp;
188942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            // Verify ordering of shutter notifications
189042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            {
189142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                Mutex::Autolock l(mOutputLock);
189242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                if (frameNumber != mNextShutterFrameNumber) {
189342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    SET_ERR("Shutter notification out-of-order. Expected "
189442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                            "notification for frame %d, got frame %d",
189542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                            mNextShutterFrameNumber, frameNumber);
189642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    break;
189742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                }
189842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                mNextShutterFrameNumber++;
189942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
190042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
1901cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            CaptureResultExtras resultExtras;
1902f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
190342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            // Set timestamp for the request in the in-flight tracking
1904f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            // and get the request ID to send upstream
190542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            {
190642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                Mutex::Autolock l(mInFlightLock);
190742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                idx = mInFlightMap.indexOfKey(frameNumber);
190842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                if (idx >= 0) {
1909f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    InFlightRequest &r = mInFlightMap.editValueAt(idx);
1910f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    r.captureTimestamp = timestamp;
1911cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    resultExtras = r.resultExtras;
191242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                }
191342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
191442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            if (idx < 0) {
191542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                SET_ERR("Shutter notification for non-existent frame number %d",
191642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                        frameNumber);
191742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                break;
191842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
1919e5729fac81c8a984e984fefc90afc64135817d4fColin Cross            ALOGVV("Camera %d: %s: Shutter fired for frame %d (id %d) at %" PRId64,
1920cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    mId, __FUNCTION__, frameNumber, resultExtras.requestId, timestamp);
192142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            // Call listener, if any
192242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            if (listener != NULL) {
1923cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                listener->notifyShutter(resultExtras, timestamp);
192442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
19257d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            break;
19267d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
19277d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        default:
192842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Unknown notify message from HAL: %d",
1929b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    msg->type);
19307d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
19317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
19327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1933f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville TalvalaCameraMetadata Camera3Device::getLatestRequestLocked() {
19341e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    ALOGV("%s", __FUNCTION__);
19351e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
19361e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    CameraMetadata retVal;
19371e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
19381e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    if (mRequestThread != NULL) {
19391e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        retVal = mRequestThread->getLatestRequest();
19401e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    }
19411e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
19421e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    return retVal;
19431e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin}
19441e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
1945cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
19467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/**
1947f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * RequestThread inner class methods
1948f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */
1949f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1950f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville TalvalaCamera3Device::RequestThread::RequestThread(wp<Camera3Device> parent,
1951f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        sp<StatusTracker> statusTracker,
1952f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_device_t *hal3Device) :
1953f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Thread(false),
1954f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mParent(parent),
1955f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatusTracker(statusTracker),
1956f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mHal3Device(hal3Device),
195742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        mId(getId(parent)),
1958f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mReconfigured(false),
1959f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mDoPause(false),
1960f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mPaused(true),
19614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mFrameNumber(0),
1962cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        mLatestRequestId(NAME_NOT_FOUND),
19632d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        mRepeatingLastFrameNumber(NO_IN_FLIGHT_REPEATING_FRAMES) {
1964f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mStatusId = statusTracker->addComponent();
1965f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1966f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1967f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::configurationComplete() {
1968f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
1969f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mReconfigured = true;
1970f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1971f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
197290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Weistatus_t Camera3Device::RequestThread::queueRequestList(
19732d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        List<sp<CaptureRequest> > &requests,
19742d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        /*out*/
19752d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        int64_t *lastFrameNumber) {
197690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    Mutex::Autolock l(mRequestLock);
197790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    for (List<sp<CaptureRequest> >::iterator it = requests.begin(); it != requests.end();
197890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            ++it) {
197990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        mRequestQueue.push_back(*it);
198090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    }
198190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
19822d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    if (lastFrameNumber != NULL) {
19832d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        *lastFrameNumber = mFrameNumber + mRequestQueue.size() - 1;
19842d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        ALOGV("%s: requestId %d, mFrameNumber %" PRId32 ", lastFrameNumber %" PRId64 ".",
19852d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei              __FUNCTION__, (*(requests.begin()))->mResultExtras.requestId, mFrameNumber,
19862d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei              *lastFrameNumber);
19872d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    }
1988cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
198990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    unpauseForNewRequests();
199090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
199190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    return OK;
199290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei}
199390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
19944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
19954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTrigger(
19964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger[],
19974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        size_t count) {
19984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
19994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Mutex::Autolock l(mTriggerMutex);
20004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    status_t ret;
20014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
20024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    for (size_t i = 0; i < count; ++i) {
20034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ret = queueTriggerLocked(trigger[i]);
20044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
20054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (ret != OK) {
20064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return ret;
20074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
20084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
20094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
20104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return OK;
20114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
20124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
201342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvalaint Camera3Device::RequestThread::getId(const wp<Camera3Device> &device) {
201442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    sp<Camera3Device> d = device.promote();
201542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (d != NULL) return d->mId;
201642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    return 0;
201742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala}
201842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
20194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTriggerLocked(
20204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger) {
20214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
20224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    uint32_t tag = trigger.metadataTag;
20234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    ssize_t index = mTriggerMap.indexOfKey(tag);
20244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
20254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    switch (trigger.getTagType()) {
20264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        case TYPE_BYTE:
20274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // fall-through
20284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        case TYPE_INT32:
20294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            break;
20304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        default:
203142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            ALOGE("%s: Type not supported: 0x%x", __FUNCTION__,
203242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    trigger.getTagType());
20334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return INVALID_OPERATION;
20344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
20354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
20364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
20374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Collect only the latest trigger, since we only have 1 field
20384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * in the request settings per trigger tag, and can't send more than 1
20394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * trigger per request.
20404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
20414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    if (index != NAME_NOT_FOUND) {
20424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mTriggerMap.editValueAt(index) = trigger;
20434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    } else {
20444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mTriggerMap.add(tag, trigger);
20454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
20464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
20474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return OK;
20484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
20494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2050f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::setRepeatingRequests(
20512d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        const RequestList &requests,
20522d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        /*out*/
20532d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        int64_t *lastFrameNumber) {
2054f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
20552d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    if (lastFrameNumber != NULL) {
20562d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        *lastFrameNumber = mRepeatingLastFrameNumber;
20572d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    }
2058f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRepeatingRequests.clear();
2059f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRepeatingRequests.insert(mRepeatingRequests.begin(),
2060f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            requests.begin(), requests.end());
206126fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala
206226fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    unpauseForNewRequests();
206326fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala
20642d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    mRepeatingLastFrameNumber = NO_IN_FLIGHT_REPEATING_FRAMES;
2065f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
2066f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
2067f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
20682d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Weistatus_t Camera3Device::RequestThread::clearRepeatingRequests(/*out*/int64_t *lastFrameNumber) {
2069f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
2070f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRepeatingRequests.clear();
20712d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    if (lastFrameNumber != NULL) {
20722d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        *lastFrameNumber = mRepeatingLastFrameNumber;
20732d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    }
20742d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    mRepeatingLastFrameNumber = NO_IN_FLIGHT_REPEATING_FRAMES;
2075f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
2076f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
2077f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
20782d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Weistatus_t Camera3Device::RequestThread::clear(/*out*/int64_t *lastFrameNumber) {
2079abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    Mutex::Autolock l(mRequestLock);
20802d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    ALOGV("RequestThread::%s:", __FUNCTION__);
2081abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    mRepeatingRequests.clear();
2082abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    mRequestQueue.clear();
2083abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    mTriggerMap.clear();
20842d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    if (lastFrameNumber != NULL) {
20852d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        *lastFrameNumber = mRepeatingLastFrameNumber;
20862d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    }
20872d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    mRepeatingLastFrameNumber = NO_IN_FLIGHT_REPEATING_FRAMES;
2088abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    return OK;
2089abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala}
2090abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
2091f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::setPaused(bool paused) {
2092f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mPauseLock);
2093f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mDoPause = paused;
2094f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mDoPauseSignal.signal();
2095f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
2096f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
20974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::waitUntilRequestProcessed(
20984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t requestId, nsecs_t timeout) {
20994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Mutex::Autolock l(mLatestRequestMutex);
21004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    status_t res;
21014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    while (mLatestRequestId != requestId) {
21024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        nsecs_t startTime = systemTime();
21034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        res = mLatestRequestSignal.waitRelative(mLatestRequestMutex, timeout);
21054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (res != OK) return res;
21064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        timeout -= (systemTime() - startTime);
21084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
21094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return OK;
21114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
21124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2113f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid Camera3Device::RequestThread::requestExit() {
2114f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Call parent to set up shutdown
2115f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Thread::requestExit();
2116f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // The exit from any possible waits
2117f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mDoPauseSignal.signal();
2118f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mRequestSignal.signal();
2119f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
21204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2121f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::threadLoop() {
2122f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2123f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
2124f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2125f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Handle paused state.
2126f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (waitIfPaused()) {
2127f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return true;
2128f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2129f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2130f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Get work to do
2131f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2132f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> nextRequest = waitForNextRequest();
2133f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (nextRequest == NULL) {
2134f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return true;
2135f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2136f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2137f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Create request to HAL
2138f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_capture_request_t request = camera3_capture_request_t();
21392d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    request.frame_number = nextRequest->mResultExtras.frameNumber;
21404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Vector<camera3_stream_buffer_t> outputBuffers;
2141f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2142f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Get the request ID, if any
2143f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    int requestId;
2144f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    camera_metadata_entry_t requestIdEntry =
2145f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            nextRequest->mSettings.find(ANDROID_REQUEST_ID);
2146f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (requestIdEntry.count > 0) {
2147f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        requestId = requestIdEntry.data.i32[0];
2148f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    } else {
2149f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGW("%s: Did not have android.request.id set in the request",
2150f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                __FUNCTION__);
2151f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        requestId = NAME_NOT_FOUND;
2152f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
2153f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
21544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Insert any queued triggers (before metadata is locked)
21554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    int32_t triggerCount;
21564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    res = insertTriggers(nextRequest);
21574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    if (res < 0) {
2158b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR("RequestThread: Unable to insert triggers "
2159b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                "(capture request %d, HAL device: %s (%d)",
21602d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei                request.frame_number, strerror(-res), res);
21614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        cleanUpFailedRequest(request, nextRequest, outputBuffers);
21624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        return false;
21634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
21644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    triggerCount = res;
21654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    bool triggersMixedIn = (triggerCount > 0 || mPrevTriggers > 0);
21674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // If the request is the same as last, or we had triggers last time
21694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    if (mPrevRequest != nextRequest || triggersMixedIn) {
21704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        /**
21712f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala         * HAL workaround:
21722f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala         * Insert a dummy trigger ID if a trigger is set but no trigger ID is
21732f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala         */
21742f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        res = addDummyTriggerIds(nextRequest);
21752f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        if (res != OK) {
21762f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            SET_ERR("RequestThread: Unable to insert dummy trigger IDs "
21772f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala                    "(capture request %d, HAL device: %s (%d)",
21782d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei                    request.frame_number, strerror(-res), res);
21792f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            cleanUpFailedRequest(request, nextRequest, outputBuffers);
21802f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            return false;
21812f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        }
21822f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
21832f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        /**
21844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * The request should be presorted so accesses in HAL
21854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         *   are O(logn). Sidenote, sorting a sorted metadata is nop.
21864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
21874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        nextRequest->mSettings.sort();
2188f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.settings = nextRequest->mSettings.getAndLock();
2189f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mPrevRequest = nextRequest;
21904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ALOGVV("%s: Request settings are NEW", __FUNCTION__);
21914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        IF_ALOGV() {
21934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            camera_metadata_ro_entry_t e = camera_metadata_ro_entry_t();
21944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            find_camera_metadata_ro_entry(
21954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                    request.settings,
21964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                    ANDROID_CONTROL_AF_TRIGGER,
21974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                    &e
21984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            );
21994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            if (e.count > 0) {
22004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                ALOGV("%s: Request (frame num %d) had AF trigger 0x%x",
22014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      __FUNCTION__,
22022d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei                      request.frame_number,
22034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      e.data.u8[0]);
22044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            }
22054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
22064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    } else {
22074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // leave request.settings NULL to indicate 'reuse latest given'
22084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ALOGVV("%s: Request settings are REUSED",
22094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin               __FUNCTION__);
22104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
2211f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2212f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_stream_buffer_t inputBuffer;
2213f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2214f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Fill in buffers
2215f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2216f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (nextRequest->mInputStream != NULL) {
2217f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.input_buffer = &inputBuffer;
22185a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        res = nextRequest->mInputStream->getInputBuffer(&inputBuffer);
2219f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
222007d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala            ALOGE("RequestThread: Can't get input buffer, skipping request:"
2221f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    " %s (%d)", strerror(-res), res);
2222f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            cleanUpFailedRequest(request, nextRequest, outputBuffers);
2223f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return true;
2224f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
2225f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    } else {
2226f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.input_buffer = NULL;
2227f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2228f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2229f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    outputBuffers.insertAt(camera3_stream_buffer_t(), 0,
2230f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            nextRequest->mOutputStreams.size());
2231f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    request.output_buffers = outputBuffers.array();
2232f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < nextRequest->mOutputStreams.size(); i++) {
2233f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = nextRequest->mOutputStreams.editItemAt(i)->
2234f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                getBuffer(&outputBuffers.editItemAt(i));
2235f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
223607d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala            ALOGE("RequestThread: Can't get output buffer, skipping request:"
223707d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala                    " %s (%d)", strerror(-res), res);
2238f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            cleanUpFailedRequest(request, nextRequest, outputBuffers);
2239f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return true;
2240f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
2241f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.num_output_buffers++;
2242f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2243f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
224442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Log request in the in-flight queue
224542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    sp<Camera3Device> parent = mParent.promote();
224642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (parent == NULL) {
224742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        CLOGE("RequestThread: Parent is gone");
224842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        cleanUpFailedRequest(request, nextRequest, outputBuffers);
224942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        return false;
225042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    }
225142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
2252cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    res = parent->registerInFlight(request.frame_number,
2253cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            request.num_output_buffers, nextRequest->mResultExtras);
22542d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    ALOGVV("%s: registered in flight requestId = %" PRId32 ", frameNumber = %" PRId64
22552d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei           ", burstId = %" PRId32 ".",
2256cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            __FUNCTION__,
2257cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            nextRequest->mResultExtras.requestId, nextRequest->mResultExtras.frameNumber,
2258cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            nextRequest->mResultExtras.burstId);
225942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (res != OK) {
226042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        SET_ERR("RequestThread: Unable to register new in-flight request:"
226142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                " %s (%d)", strerror(-res), res);
226242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        cleanUpFailedRequest(request, nextRequest, outputBuffers);
226342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        return false;
226442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    }
22654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2266cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He    // Inform waitUntilRequestProcessed thread of a new request ID
2267cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He    {
2268cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He        Mutex::Autolock al(mLatestRequestMutex);
2269cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He
2270cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He        mLatestRequestId = requestId;
2271cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He        mLatestRequestSignal.signal();
2272cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He    }
2273cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He
2274f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Submit request and block until ready for next one
227517a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_ASYNC_BEGIN("frame capture", request.frame_number);
227617a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_BEGIN("camera3->process_capture_request");
2277f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = mHal3Device->ops->process_capture_request(mHal3Device, &request);
227817a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_END();
227917a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala
2280f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (res != OK) {
2281b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR("RequestThread: Unable to submit capture request %d to HAL"
2282f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                " device: %s (%d)", request.frame_number, strerror(-res), res);
2283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        cleanUpFailedRequest(request, nextRequest, outputBuffers);
2284f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return false;
2285f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2286f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
22871e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    // Update the latest request sent to HAL
22881e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    if (request.settings != NULL) { // Don't update them if they were unchanged
22891e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        Mutex::Autolock al(mLatestRequestMutex);
22901e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
22911e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        camera_metadata_t* cloned = clone_camera_metadata(request.settings);
22921e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        mLatestRequest.acquire(cloned);
22931e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    }
22941e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
2295f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (request.settings != NULL) {
2296f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest->mSettings.unlock(request.settings);
2297f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
22984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
22994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Remove any previously queued triggers (after unlock)
23004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    res = removeTriggers(mPrevRequest);
23014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    if (res != OK) {
2302b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR("RequestThread: Unable to remove triggers "
23034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              "(capture request %d, HAL device: %s (%d)",
23044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              request.frame_number, strerror(-res), res);
23054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        return false;
23064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
23074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    mPrevTriggers = triggerCount;
23084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
23095a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    // Return input buffer back to framework
23105a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    if (request.input_buffer != NULL) {
23115a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        Camera3Stream *stream =
23125a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            Camera3Stream::cast(request.input_buffer->stream);
23135a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        res = stream->returnInputBuffer(*(request.input_buffer));
23145a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        // Note: stream may be deallocated at this point, if this buffer was the
23155a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        // last reference to it.
23165a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        if (res != OK) {
23175a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            ALOGE("%s: RequestThread: Can't return input buffer for frame %d to"
23185a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin                    "  its stream:%s (%d)",  __FUNCTION__,
23195a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin                    request.frame_number, strerror(-res), res);
23205a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            // TODO: Report error upstream
23215a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        }
23225a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    }
23235a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
2324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return true;
2325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
2326f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
23271e479c0f4cb3e2174dde0b02e5656fb658f73495Igor MurashkinCameraMetadata Camera3Device::RequestThread::getLatestRequest() const {
23281e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    Mutex::Autolock al(mLatestRequestMutex);
23291e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
23301e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    ALOGV("RequestThread::%s", __FUNCTION__);
23311e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
23321e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    return mLatestRequest;
23331e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin}
23341e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
2335cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
2336f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::cleanUpFailedRequest(
2337f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_capture_request_t &request,
2338f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<CaptureRequest> &nextRequest,
2339f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Vector<camera3_stream_buffer_t> &outputBuffers) {
2340f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2341f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (request.settings != NULL) {
2342f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest->mSettings.unlock(request.settings);
2343f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2344f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (request.input_buffer != NULL) {
2345f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.input_buffer->status = CAMERA3_BUFFER_STATUS_ERROR;
23465a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        nextRequest->mInputStream->returnInputBuffer(*(request.input_buffer));
2347f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2348f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < request.num_output_buffers; i++) {
2349f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        outputBuffers.editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR;
2350f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest->mOutputStreams.editItemAt(i)->returnBuffer(
2351f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            outputBuffers[i], 0);
2352f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2353f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
2354f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2355f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest>
2356f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Camera3Device::RequestThread::waitForNextRequest() {
2357f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
2358f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> nextRequest;
2359f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2360f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Optimized a bit for the simple steady-state case (single repeating
2361f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // request), to avoid putting that request in the queue temporarily.
2362f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
2363f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2364f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    while (mRequestQueue.empty()) {
2365f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (!mRepeatingRequests.empty()) {
2366f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // Always atomically enqueue all requests in a repeating request
2367f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // list. Guarantees a complete in-sequence set of captures to
2368f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // application.
2369f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            const RequestList &requests = mRepeatingRequests;
2370f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            RequestList::const_iterator firstRequest =
2371f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    requests.begin();
2372f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            nextRequest = *firstRequest;
2373f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mRequestQueue.insert(mRequestQueue.end(),
2374f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    ++firstRequest,
2375f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    requests.end());
2376f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // No need to wait any longer
2377cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
23782d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei            mRepeatingLastFrameNumber = mFrameNumber + requests.size() - 1;
2379cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
2380f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
2381f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
2382f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2383f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = mRequestSignal.waitRelative(mRequestLock, kRequestTimeout);
2384f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2385f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if ((mRequestQueue.empty() && mRepeatingRequests.empty()) ||
2386f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                exitPending()) {
2387f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            Mutex::Autolock pl(mPauseLock);
2388f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            if (mPaused == false) {
2389f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                ALOGV("%s: RequestThread: Going idle", __FUNCTION__);
2390f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                mPaused = true;
2391f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                // Let the tracker know
2392f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                sp<StatusTracker> statusTracker = mStatusTracker.promote();
2393f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                if (statusTracker != 0) {
2394f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE);
2395f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                }
2396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            }
2397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // Stop waiting for now and let thread management happen
2398f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return NULL;
2399f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
2400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2401f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (nextRequest == NULL) {
2403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Don't have a repeating request already in hand, so queue
2404f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // must have an entry now.
2405f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList::iterator firstRequest =
2406f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                mRequestQueue.begin();
2407f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest = *firstRequest;
2408f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mRequestQueue.erase(firstRequest);
2409f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2410f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
241126fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // In case we've been unpaused by setPaused clearing mDoPause, need to
241226fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // update internal pause state (capture/setRepeatingRequest unpause
241326fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // directly).
2414f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock pl(mPauseLock);
2415f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (mPaused) {
2416f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGV("%s: RequestThread: Unpaused", __FUNCTION__);
2417f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        sp<StatusTracker> statusTracker = mStatusTracker.promote();
2418f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (statusTracker != 0) {
2419f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            statusTracker->markComponentActive(mStatusId);
2420f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
2421f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
2422f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mPaused = false;
2423f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2424f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Check if we've reconfigured since last time, and reset the preview
2425f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // request if so. Can't use 'NULL request == repeat' across configure calls.
2426f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mReconfigured) {
2427f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mPrevRequest.clear();
2428f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mReconfigured = false;
2429f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2430f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
24312d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    if (nextRequest != NULL) {
24322d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        nextRequest->mResultExtras.frameNumber = mFrameNumber++;
24332d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei    }
2434f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return nextRequest;
2435f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
2436f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2437f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::waitIfPaused() {
2438f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
2439f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mPauseLock);
2440f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    while (mDoPause) {
2441f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (mPaused == false) {
2442f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mPaused = true;
2443f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            ALOGV("%s: RequestThread: Paused", __FUNCTION__);
2444f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            // Let the tracker know
2445f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            sp<StatusTracker> statusTracker = mStatusTracker.promote();
2446f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            if (statusTracker != 0) {
2447f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE);
2448f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            }
2449f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
2450f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
2451f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = mDoPauseSignal.waitRelative(mPauseLock, kRequestTimeout);
2452f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (res == TIMED_OUT || exitPending()) {
2453f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return true;
2454f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
2455f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2456f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // We don't set mPaused to false here, because waitForNextRequest needs
2457f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // to further manage the paused state in case of starvation.
2458f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return false;
2459f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
2460f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
246126fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvalavoid Camera3Device::RequestThread::unpauseForNewRequests() {
246226fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // With work to do, mark thread as unpaused.
246326fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // If paused by request (setPaused), don't resume, to avoid
246426fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // extra signaling/waiting overhead to waitUntilPaused
2465f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mRequestSignal.signal();
246626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    Mutex::Autolock p(mPauseLock);
246726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    if (!mDoPause) {
2468f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGV("%s: RequestThread: Going active", __FUNCTION__);
2469f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mPaused) {
2470f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            sp<StatusTracker> statusTracker = mStatusTracker.promote();
2471f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            if (statusTracker != 0) {
2472f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                statusTracker->markComponentActive(mStatusId);
2473f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            }
2474f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
247526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala        mPaused = false;
247626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    }
247726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala}
247826fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala
2479b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::RequestThread::setErrorState(const char *fmt, ...) {
2480b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    sp<Camera3Device> parent = mParent.promote();
2481b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    if (parent != NULL) {
2482b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        va_list args;
2483b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        va_start(args, fmt);
2484b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
2485b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        parent->setErrorStateV(fmt, args);
2486b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
2487b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        va_end(args);
2488b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    }
2489b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala}
2490b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
24914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::insertTriggers(
24924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        const sp<CaptureRequest> &request) {
24934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Mutex::Autolock al(mTriggerMutex);
24954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    CameraMetadata &metadata = request->mSettings;
24974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    size_t count = mTriggerMap.size();
24984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    for (size_t i = 0; i < count; ++i) {
25004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger = mTriggerMap.valueAt(i);
25014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        uint32_t tag = trigger.metadataTag;
25034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        camera_metadata_entry entry = metadata.find(tag);
25044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (entry.count > 0) {
25064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            /**
25074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             * Already has an entry for this trigger in the request.
25084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             * Rewrite it with our requested trigger value.
25094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             */
25104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            RequestTrigger oldTrigger = trigger;
25114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            oldTrigger.entryValue = entry.data.u8[0];
25134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            mTriggerReplacedMap.add(tag, oldTrigger);
25154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        } else {
25164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            /**
25174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             * More typical, no trigger entry, so we just add it
25184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             */
25194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            mTriggerRemovedMap.add(tag, trigger);
25204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
25214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t res;
25234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        switch (trigger.getTagType()) {
25254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            case TYPE_BYTE: {
25264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue);
25274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                res = metadata.update(tag,
25284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      &entryValue,
25294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      /*count*/1);
25304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                break;
25314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            }
25324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            case TYPE_INT32:
25334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                res = metadata.update(tag,
25344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      &trigger.entryValue,
25354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      /*count*/1);
25364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                break;
25374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            default:
25384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                ALOGE("%s: Type not supported: 0x%x",
25394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      __FUNCTION__,
25404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      trigger.getTagType());
25414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                return INVALID_OPERATION;
25424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
25434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (res != OK) {
25454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ALOGE("%s: Failed to update request metadata with trigger tag %s"
25464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  ", value %d", __FUNCTION__, trigger.getTagName(),
25474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  trigger.entryValue);
25484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return res;
25494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
25504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ALOGV("%s: Mixed in trigger %s, value %d", __FUNCTION__,
25524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              trigger.getTagName(),
25534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              trigger.entryValue);
25544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
25554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    mTriggerMap.clear();
25574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return count;
25594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
25604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::removeTriggers(
25624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        const sp<CaptureRequest> &request) {
25634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Mutex::Autolock al(mTriggerMutex);
25644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    CameraMetadata &metadata = request->mSettings;
25664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
25684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Replace all old entries with their old values.
25694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
25704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    for (size_t i = 0; i < mTriggerReplacedMap.size(); ++i) {
25714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger = mTriggerReplacedMap.valueAt(i);
25724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t res;
25744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        uint32_t tag = trigger.metadataTag;
25764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        switch (trigger.getTagType()) {
25774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            case TYPE_BYTE: {
25784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue);
25794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                res = metadata.update(tag,
25804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      &entryValue,
25814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      /*count*/1);
25824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                break;
25834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            }
25844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            case TYPE_INT32:
25854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                res = metadata.update(tag,
25864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      &trigger.entryValue,
25874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      /*count*/1);
25884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                break;
25894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            default:
25904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                ALOGE("%s: Type not supported: 0x%x",
25914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      __FUNCTION__,
25924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      trigger.getTagType());
25934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                return INVALID_OPERATION;
25944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
25954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (res != OK) {
25974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ALOGE("%s: Failed to restore request metadata with trigger tag %s"
25984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  ", trigger value %d", __FUNCTION__,
25994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  trigger.getTagName(), trigger.entryValue);
26004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return res;
26014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
26024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
26034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    mTriggerReplacedMap.clear();
26044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
26054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
26064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Remove all new entries.
26074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
26084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    for (size_t i = 0; i < mTriggerRemovedMap.size(); ++i) {
26094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger = mTriggerRemovedMap.valueAt(i);
26104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t res = metadata.erase(trigger.metadataTag);
26114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
26124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (res != OK) {
26134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ALOGE("%s: Failed to erase metadata with trigger tag %s"
26144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  ", trigger value %d", __FUNCTION__,
26154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  trigger.getTagName(), trigger.entryValue);
26164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return res;
26174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
26184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
26194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    mTriggerRemovedMap.clear();
26204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
26214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return OK;
26224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
26234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
26242f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvalastatus_t Camera3Device::RequestThread::addDummyTriggerIds(
26252f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        const sp<CaptureRequest> &request) {
26262f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    // Trigger ID 0 has special meaning in the HAL2 spec, so avoid it here
26272f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    static const int32_t dummyTriggerId = 1;
26282f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    status_t res;
26292f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
26302f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    CameraMetadata &metadata = request->mSettings;
26312f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
26322f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    // If AF trigger is active, insert a dummy AF trigger ID if none already
26332f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    // exists
26342f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    camera_metadata_entry afTrigger = metadata.find(ANDROID_CONTROL_AF_TRIGGER);
26352f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    camera_metadata_entry afId = metadata.find(ANDROID_CONTROL_AF_TRIGGER_ID);
26362f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    if (afTrigger.count > 0 &&
26372f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            afTrigger.data.u8[0] != ANDROID_CONTROL_AF_TRIGGER_IDLE &&
26382f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            afId.count == 0) {
26392f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        res = metadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, &dummyTriggerId, 1);
26402f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        if (res != OK) return res;
26412f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    }
26422f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
26432f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    // If AE precapture trigger is active, insert a dummy precapture trigger ID
26442f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    // if none already exists
26452f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    camera_metadata_entry pcTrigger =
26462f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER);
26472f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    camera_metadata_entry pcId = metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_ID);
26482f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    if (pcTrigger.count > 0 &&
26492f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            pcTrigger.data.u8[0] != ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE &&
26502f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            pcId.count == 0) {
26512f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        res = metadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID,
26522f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala                &dummyTriggerId, 1);
26532f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        if (res != OK) return res;
26542f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    }
26552f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
26562f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    return OK;
26572f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala}
26584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
26594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2660f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/**
26617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Static callback forwarding methods from HAL to instance
26627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */
26637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
26647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sProcessCaptureResult(const camera3_callback_ops *cb,
26657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const camera3_capture_result *result) {
26667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    Camera3Device *d =
26677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb));
26687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    d->processCaptureResult(result);
26697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
26707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
26717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sNotify(const camera3_callback_ops *cb,
26727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const camera3_notify_msg *msg) {
26737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    Camera3Device *d =
26747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb));
26757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    d->notify(msg);
26767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
26777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
26787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android
2679