Camera3Device.cpp revision e5729fac81c8a984e984fefc90afc64135817d4f
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
1057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = module->common.methods->open(&module->common, deviceName.string(),
1067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            reinterpret_cast<hw_device_t**>(&device));
1077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (res != OK) {
109b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Could not open camera: %s (%d)", strerror(-res), res);
1107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return res;
1117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Cross-check device version */
1147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (device->common.version != CAMERA_DEVICE_API_VERSION_3_0) {
116b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Could not open camera: "
1177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala                "Camera device is not version %x, reports %x instead",
118b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                CAMERA_DEVICE_API_VERSION_3_0,
1197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala                device->common.version);
1207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        device->common.close(&device->common);
1217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return BAD_VALUE;
1227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    camera_info info;
1257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = module->get_camera_info(mId, &info);
1267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (res != OK) return res;
1277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (info.device_version != device->common.version) {
129b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("HAL reporting mismatched camera_info version (%x)"
130b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                " and device version (%x).",
1317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala                device->common.version, info.device_version);
1327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        device->common.close(&device->common);
1337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return BAD_VALUE;
1347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Initialize device with callback functions */
1377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
13817a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_BEGIN("camera3->initialize");
1397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = device->ops->initialize(device, this);
14017a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_END();
14117a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala
1427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (res != OK) {
143b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Unable to initialize HAL device: %s (%d)",
144b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                strerror(-res), res);
1457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        device->common.close(&device->common);
1467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return BAD_VALUE;
1477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Get vendor metadata tags */
1507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    mVendorTagOps.get_camera_vendor_section_name = NULL;
1527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
15317a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_BEGIN("camera3->get_metadata_vendor_tag_ops");
1547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    device->ops->get_metadata_vendor_tag_ops(device, &mVendorTagOps);
15517a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_END();
1567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (mVendorTagOps.get_camera_vendor_section_name != NULL) {
1587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        res = set_camera_metadata_vendor_tag_ops(&mVendorTagOps);
1597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        if (res != OK) {
160b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unable to set tag ops: %s (%d)",
161b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    strerror(-res), res);
1627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            device->common.close(&device->common);
1637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            return res;
1647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        }
1657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
167f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /** Start up status tracker thread */
168f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mStatusTracker = new StatusTracker(this);
169f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    res = mStatusTracker->run(String8::format("C3Dev-%d-Status", mId).string());
170f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (res != OK) {
171f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        SET_ERR_L("Unable to start status tracking thread: %s (%d)",
172f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                strerror(-res), res);
173f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        device->common.close(&device->common);
174f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatusTracker.clear();
175f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        return res;
176f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
177f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Start up request queue thread */
1797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
180f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mRequestThread = new RequestThread(this, mStatusTracker, device);
181f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = mRequestThread->run(String8::format("C3Dev-%d-ReqQueue", mId).string());
1827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (res != OK) {
183b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Unable to start request queue thread: %s (%d)",
184b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                strerror(-res), res);
1857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        device->common.close(&device->common);
186f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mRequestThread.clear();
1877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return res;
1887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Everything is good to go */
1917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    mDeviceInfo = info.static_camera_characteristics;
1937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    mHal3Device = device;
194f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mStatus = STATUS_UNCONFIGURED;
195f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mNextStreamId = 0;
196ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    mNeedConfig = true;
197f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mPauseStateNotify = false;
1987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
199fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    /** Check for quirks */
200fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
201fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // Will the HAL be sending in early partial result metadata?
202fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    camera_metadata_entry partialResultsQuirk =
203fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            mDeviceInfo.find(ANDROID_QUIRKS_USE_PARTIAL_RESULT);
204fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (partialResultsQuirk.count > 0 && partialResultsQuirk.data.u8[0] == 1) {
205fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        mUsePartialResultQuirk = true;
206fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
207fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
2087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return OK;
2097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
2107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
2117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::disconnect() {
2127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
213f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
2147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
215f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
216f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
217214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala    status_t res = OK;
218f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
219f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    {
220f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        Mutex::Autolock l(mLock);
221f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mStatus == STATUS_UNINITIALIZED) return res;
222f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
223f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mStatus == STATUS_ACTIVE ||
224f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                (mStatus == STATUS_ERROR && mRequestThread != NULL)) {
225f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            res = mRequestThread->clearRepeatingRequests();
226214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala            if (res != OK) {
227f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                SET_ERR_L("Can't stop streaming");
228214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala                // Continue to close device even in case of error
229f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            } else {
230f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout);
231f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                if (res != OK) {
232f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    SET_ERR_L("Timeout waiting for HAL to drain");
233f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    // Continue to close device even in case of error
234f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                }
235214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala            }
236f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
237f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
238f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mStatus == STATUS_ERROR) {
239f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            CLOGE("Shutting down in an error state");
240f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
241f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
242f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mStatusTracker != NULL) {
243f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mStatusTracker->requestExit();
244f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
245f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
246f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mRequestThread != NULL) {
247f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mRequestThread->requestExit();
248f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
249f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
250f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mOutputStreams.clear();
251f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mInputStream.clear();
252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
254f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Joining done without holding mLock, otherwise deadlocks may ensue
255f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // as the threads try to access parent state
256f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (mRequestThread != NULL && mStatus != STATUS_ERROR) {
257f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // HAL may be in a bad state, so waiting for request thread
258f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // (which may be stuck in the HAL processCaptureRequest call)
259f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // could be dangerous.
260f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mRequestThread->join();
261214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala    }
262214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala
263f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (mStatusTracker != NULL) {
264f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatusTracker->join();
265f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
266f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
267f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    {
268f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        Mutex::Autolock l(mLock);
269f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
270f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mRequestThread.clear();
271f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatusTracker.clear();
272f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
273f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mHal3Device != NULL) {
274f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mHal3Device->common.close(&mHal3Device->common);
275f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mHal3Device = NULL;
276f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
277f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
278f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatus = STATUS_UNINITIALIZED;
279f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
280f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
281f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ALOGV("%s: X", __FUNCTION__);
282214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala    return res;
2837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
2847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
285f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// For dumping/debugging only -
286f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// try to acquire a lock a few times, eventually give up to proceed with
287f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// debug/dump operations
288f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalabool Camera3Device::tryLockSpinRightRound(Mutex& lock) {
289f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool gotLock = false;
290f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    for (size_t i = 0; i < kDumpLockAttempts; ++i) {
291f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (lock.tryLock() == NO_ERROR) {
292f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            gotLock = true;
293f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            break;
294f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        } else {
295f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            usleep(kDumpSleepDuration);
296f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
297f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
298f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return gotLock;
299f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
300f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
3017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::dump(int fd, const Vector<String16> &args) {
3027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
3037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    (void)args;
304f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
305f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Try to lock, but continue in case of failure (to avoid blocking in
306f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // deadlocks)
307f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool gotInterfaceLock = tryLockSpinRightRound(mInterfaceLock);
308f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool gotLock = tryLockSpinRightRound(mLock);
309f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
310f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGW_IF(!gotInterfaceLock,
311f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            "Camera %d: %s: Unable to lock interface lock, proceeding anyway",
312f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mId, __FUNCTION__);
313f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGW_IF(!gotLock,
314f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            "Camera %d: %s: Unable to lock main lock, proceeding anyway",
315f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mId, __FUNCTION__);
316f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
317f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    String8 lines;
318f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
319f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    const char *status =
320f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus == STATUS_ERROR         ? "ERROR" :
321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus == STATUS_UNINITIALIZED ? "UNINITIALIZED" :
322f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mStatus == STATUS_UNCONFIGURED  ? "UNCONFIGURED" :
323f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mStatus == STATUS_CONFIGURED    ? "CONFIGURED" :
324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus == STATUS_ACTIVE        ? "ACTIVE" :
325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            "Unknown";
326f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
327f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    lines.appendFormat("    Device status: %s\n", status);
328b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    if (mStatus == STATUS_ERROR) {
329b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        lines.appendFormat("    Error cause: %s\n", mErrorCause.string());
330b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    }
331f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    lines.appendFormat("    Stream configuration:\n");
332f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
333f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mInputStream != NULL) {
334f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        write(fd, lines.string(), lines.size());
335f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mInputStream->dump(fd, args);
336f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    } else {
337f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        lines.appendFormat("      No input stream.\n");
338f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        write(fd, lines.string(), lines.size());
339f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
340f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < mOutputStreams.size(); i++) {
341f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mOutputStreams[i]->dump(fd,args);
342f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
3437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
34442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    lines = String8("    In-flight requests:\n");
34542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (mInFlightMap.size() == 0) {
34642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        lines.append("      None\n");
34742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    } else {
34842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        for (size_t i = 0; i < mInFlightMap.size(); i++) {
34942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            InFlightRequest r = mInFlightMap.valueAt(i);
350e5729fac81c8a984e984fefc90afc64135817d4fColin Cross            lines.appendFormat("      Frame %d |  Timestamp: %" PRId64 ", metadata"
35142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    " arrived: %s, buffers left: %d\n", mInFlightMap.keyAt(i),
35242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    r.captureTimestamp, r.haveResultMetadata ? "true" : "false",
35342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    r.numBuffersLeft);
35442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
35542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    }
35642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    write(fd, lines.string(), lines.size());
35742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
3581e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    {
3591e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        lines = String8("    Last request sent:\n");
3601e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        write(fd, lines.string(), lines.size());
3611e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
362f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        CameraMetadata lastRequest = getLatestRequestLocked();
3631e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        lastRequest.dump(fd, /*verbosity*/2, /*indentation*/6);
3641e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    }
3651e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
366f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mHal3Device != NULL) {
36742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        lines = String8("    HAL device dump:\n");
368f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        write(fd, lines.string(), lines.size());
369f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mHal3Device->ops->dump(mHal3Device, fd);
370f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
3717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
372f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (gotLock) mLock.unlock();
373f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (gotInterfaceLock) mInterfaceLock.unlock();
374f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
3757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return OK;
3767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
3777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaconst CameraMetadata& Camera3Device::info() const {
3797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ALOGVV("%s: E", __FUNCTION__);
380f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (CC_UNLIKELY(mStatus == STATUS_UNINITIALIZED ||
381f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    mStatus == STATUS_ERROR)) {
382b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        ALOGW("%s: Access to static info %s!", __FUNCTION__,
383f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                mStatus == STATUS_ERROR ?
384f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                "when in error state" : "before init");
385f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
3867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return mDeviceInfo;
3877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
3887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::capture(CameraMetadata &request) {
3907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
391f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t res;
392f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
393f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
394f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
3954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // TODO: take ownership of the request
3964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
398f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
399b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
401f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
402b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device not initialized");
403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
404f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
405f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            // May be lazily configuring streams, will check during setup
406f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
407f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
408f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
409f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
410f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
411b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
412f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
413f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
4147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
415f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> newRequest = setUpRequestLocked(request);
416f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (newRequest == NULL) {
417b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Can't create capture request");
418f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return BAD_VALUE;
419f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
420f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
421f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    res = mRequestThread->queueRequest(newRequest);
422f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (res == OK) {
423f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        waitUntilStateThenRelock(/*active*/ true, kActiveTimeout);
424f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (res != OK) {
425f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            SET_ERR_L("Can't transition to active in %f seconds!",
426f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    kActiveTimeout/1e9);
427f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
428f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGV("Camera %d: Capture request enqueued", mId);
429f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
430f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return res;
4317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
4327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setStreamingRequest(const CameraMetadata &request) {
4357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
436f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t res;
437f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
438f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
439f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
440f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
441f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
442b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
443f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
444f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
445b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device not initialized");
446f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
447f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
448f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            // May be lazily configuring streams, will check during setup
449f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
450f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
451f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
452f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
453f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
454b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
455f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
456f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
4577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
458f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> newRepeatingRequest = setUpRequestLocked(request);
459f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (newRepeatingRequest == NULL) {
460b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Can't create repeating request");
461f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return BAD_VALUE;
462f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
463f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
464f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    RequestList newRepeatingRequests;
465f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    newRepeatingRequests.push_back(newRepeatingRequest);
466f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
467f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    res = mRequestThread->setRepeatingRequests(newRepeatingRequests);
468f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (res == OK) {
469f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        waitUntilStateThenRelock(/*active*/ true, kActiveTimeout);
470f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (res != OK) {
471f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            SET_ERR_L("Can't transition to active in %f seconds!",
472f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    kActiveTimeout/1e9);
473f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
474f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGV("Camera %d: Repeating request set", mId);
475f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
476f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return res;
477f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
478f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
479f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
480f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::setUpRequestLocked(
481f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        const CameraMetadata &request) {
482f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
483f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
484f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (mStatus == STATUS_UNCONFIGURED || mNeedConfig) {
485f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = configureStreamsLocked();
486f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
487b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Can't set up streams: %s (%d)", strerror(-res), res);
488f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return NULL;
489f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
490f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mStatus == STATUS_UNCONFIGURED) {
491f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            CLOGE("No streams configured");
492f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            return NULL;
493f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
494f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
495f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
496f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> newRequest = createCaptureRequest(request);
497f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return newRequest;
4987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
4997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::clearStreamingRequest() {
5017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
502f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
503f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
504f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
505f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
506f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
507b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
508f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
509f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
510b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device not initialized");
511f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
512f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
513f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
514f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
515f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
516f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
517f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
518b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
519f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
520f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
521f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Clearing repeating request", mId);
522f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return mRequestThread->clearRepeatingRequests();
5237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
5247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) {
5267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
527f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
5287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return mRequestThread->waitUntilRequestProcessed(requestId, timeout);
5307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
5317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5325a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Device::createInputStream(
5335a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        uint32_t width, uint32_t height, int format, int *id) {
5345a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    ATRACE_CALL();
535f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
5365a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    Mutex::Autolock l(mLock);
537f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Creating new input stream %d: %d x %d, format %d",
538f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mId, mNextStreamId, width, height, format);
5395a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5405a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    status_t res;
5415a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    bool wasActive = false;
5425a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5435a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    switch (mStatus) {
5445a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        case STATUS_ERROR:
5455a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            ALOGE("%s: Device has encountered a serious error", __FUNCTION__);
5465a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            return INVALID_OPERATION;
5475a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        case STATUS_UNINITIALIZED:
5485a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            ALOGE("%s: Device not initialized", __FUNCTION__);
5495a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            return INVALID_OPERATION;
550f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
551f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
5525a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            // OK
5535a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            break;
5545a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        case STATUS_ACTIVE:
5555a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__);
556f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            res = internalPauseAndWaitLocked();
5575a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            if (res != OK) {
558f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                SET_ERR_L("Can't pause captures to reconfigure streams!");
5595a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin                return res;
5605a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            }
5615a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            wasActive = true;
5625a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            break;
5635a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        default:
564f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            SET_ERR_L("%s: Unexpected status: %d", mStatus);
5655a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            return INVALID_OPERATION;
5665a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    }
567f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    assert(mStatus != STATUS_ACTIVE);
5685a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5695a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    if (mInputStream != 0) {
5705a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__);
5715a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        return INVALID_OPERATION;
5725a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    }
5735a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5745a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    sp<Camera3InputStream> newStream = new Camera3InputStream(mNextStreamId,
5755a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin                width, height, format);
576f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    newStream->setStatusTracker(mStatusTracker);
5775a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5785a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    mInputStream = newStream;
5795a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5805a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    *id = mNextStreamId++;
5815a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5825a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    // Continue captures if active at start
5835a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    if (wasActive) {
5845a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__);
5855a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        res = configureStreamsLocked();
5865a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        if (res != OK) {
5875a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)",
5885a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin                    __FUNCTION__, mNextStreamId, strerror(-res), res);
5895a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            return res;
5905a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        }
591f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        internalResumeLocked();
5925a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    }
5935a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
594f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Created input stream", mId);
5955a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    return OK;
5965a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin}
5975a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
5992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinstatus_t Camera3Device::createZslStream(
6002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            uint32_t width, uint32_t height,
6012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            int depth,
6022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            /*out*/
6032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            int *id,
6042fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            sp<Camera3ZslStream>* zslStream) {
6052fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    ATRACE_CALL();
606f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
6072fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    Mutex::Autolock l(mLock);
608f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Creating ZSL stream %d: %d x %d, depth %d",
609f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mId, mNextStreamId, width, height, depth);
6102fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6112fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    status_t res;
6122fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    bool wasActive = false;
6132fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6142fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    switch (mStatus) {
6152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        case STATUS_ERROR:
6162fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            ALOGE("%s: Device has encountered a serious error", __FUNCTION__);
6172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            return INVALID_OPERATION;
6182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        case STATUS_UNINITIALIZED:
6192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            ALOGE("%s: Device not initialized", __FUNCTION__);
6202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            return INVALID_OPERATION;
621f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
622f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
6232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            // OK
6242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            break;
6252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        case STATUS_ACTIVE:
6262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__);
627f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            res = internalPauseAndWaitLocked();
6282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            if (res != OK) {
629f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                SET_ERR_L("Can't pause captures to reconfigure streams!");
6302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                return res;
6312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            }
6322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            wasActive = true;
6332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            break;
6342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        default:
635f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
6362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            return INVALID_OPERATION;
6372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    }
638f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    assert(mStatus != STATUS_ACTIVE);
6392fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    if (mInputStream != 0) {
6412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__);
6422fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        return INVALID_OPERATION;
6432fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    }
6442fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6452fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    sp<Camera3ZslStream> newStream = new Camera3ZslStream(mNextStreamId,
6462fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                width, height, depth);
647f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    newStream->setStatusTracker(mStatusTracker);
6482fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    res = mOutputStreams.add(mNextStreamId, newStream);
6502fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    if (res < 0) {
6512fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        ALOGE("%s: Can't add new stream to set: %s (%d)",
6522fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                __FUNCTION__, strerror(-res), res);
6532fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        return res;
6542fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    }
6552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    mInputStream = newStream;
6562fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    *id = mNextStreamId++;
6582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    *zslStream = newStream;
6592fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    // Continue captures if active at start
6612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    if (wasActive) {
6622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__);
6632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        res = configureStreamsLocked();
6642fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        if (res != OK) {
6652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)",
6662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                    __FUNCTION__, mNextStreamId, strerror(-res), res);
6672fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            return res;
6682fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        }
669f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        internalResumeLocked();
6702fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    }
6712fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
672f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Created ZSL stream", mId);
6732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    return OK;
6742fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin}
6752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createStream(sp<ANativeWindow> consumer,
6777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        uint32_t width, uint32_t height, int format, size_t size, int *id) {
6787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
679f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
680f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
681e5729fac81c8a984e984fefc90afc64135817d4fColin Cross    ALOGV("Camera %d: Creating new stream %d: %d x %d, format %d, size %zu",
682f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mId, mNextStreamId, width, height, format, size);
6837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
684f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
685f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    bool wasActive = false;
686f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
687f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
688f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
689b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
690f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
691f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
692b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device not initialized");
693f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
694f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
695f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
696f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
697f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
698f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
699f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__);
700f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            res = internalPauseAndWaitLocked();
701f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            if (res != OK) {
702f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                SET_ERR_L("Can't pause captures to reconfigure streams!");
703f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                return res;
704f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            }
705f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            wasActive = true;
706f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
707f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
708b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
709f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
710f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
711f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    assert(mStatus != STATUS_ACTIVE);
712f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
713f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<Camera3OutputStream> newStream;
714f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (format == HAL_PIXEL_FORMAT_BLOB) {
715f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newStream = new Camera3OutputStream(mNextStreamId, consumer,
716f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                width, height, size, format);
717f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    } else {
718f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newStream = new Camera3OutputStream(mNextStreamId, consumer,
719f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                width, height, format);
720f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
721f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    newStream->setStatusTracker(mStatusTracker);
722f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
723f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = mOutputStreams.add(mNextStreamId, newStream);
724f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (res < 0) {
725b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Can't add new stream to set: %s (%d)", strerror(-res), res);
726f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return res;
727f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
728f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
729f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    *id = mNextStreamId++;
730ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    mNeedConfig = true;
731f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
732f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Continue captures if active at start
733f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (wasActive) {
734f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__);
735f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = configureStreamsLocked();
736f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
737b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Can't reconfigure device for new stream %d: %s (%d)",
738b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    mNextStreamId, strerror(-res), res);
739f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return res;
740f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
741f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        internalResumeLocked();
742f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
743f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Created new stream", mId);
744f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
7457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
7467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createReprocessStreamFromStream(int outputId, int *id) {
7487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
7497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    (void)outputId; (void)id;
7507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
751b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    CLOGE("Unimplemented");
7527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return INVALID_OPERATION;
7537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
7547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::getStreamInfo(int id,
7577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        uint32_t *width, uint32_t *height, uint32_t *format) {
7587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
759f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
760f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
761f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
762f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
763f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
764b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
765f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
766f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
767b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device not initialized!");
768f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
769f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
770f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
771f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
772f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
773f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
774f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
775b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
776f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
777f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
7787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
779f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ssize_t idx = mOutputStreams.indexOfKey(id);
780f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (idx == NAME_NOT_FOUND) {
781b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Stream %d is unknown", id);
782f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return idx;
783f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
784f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
785f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (width) *width  = mOutputStreams[idx]->getWidth();
786f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (height) *height = mOutputStreams[idx]->getHeight();
787f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (format) *format = mOutputStreams[idx]->getFormat();
788f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
789f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
7907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
7917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setStreamTransform(int id,
7937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        int transform) {
7947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
795f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
796f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
797f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
798f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
799f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
800b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
801f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
802f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
803b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device not initialized");
804f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
805f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
806f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
807f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
808f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
809f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
810f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
811b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
812f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
813f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
8147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
815f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ssize_t idx = mOutputStreams.indexOfKey(id);
816f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (idx == NAME_NOT_FOUND) {
817b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Stream %d does not exist",
818b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                id);
819f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return BAD_VALUE;
820f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
821f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
822f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return mOutputStreams.editValueAt(idx)->setTransform(transform);
8237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
8247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteStream(int id) {
8267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
827f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
828f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
829f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
8307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
831e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin    ALOGV("%s: Camera %d: Deleting stream %d", __FUNCTION__, mId, id);
832e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin
833f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // CameraDevice semantics require device to already be idle before
834f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // deleteStream is called, unlike for createStream.
835f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (mStatus == STATUS_ACTIVE) {
8365282713a976184e41451315f1286d8075b257d58Igor Murashkin        ALOGV("%s: Camera %d: Device not idle", __FUNCTION__, mId);
8375282713a976184e41451315f1286d8075b257d58Igor Murashkin        return -EBUSY;
838f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
839f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
8402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    sp<Camera3StreamInterface> deletedStream;
841f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mInputStream != NULL && id == mInputStream->getId()) {
842f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        deletedStream = mInputStream;
843f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mInputStream.clear();
844f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    } else {
845f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ssize_t idx = mOutputStreams.indexOfKey(id);
846f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (idx == NAME_NOT_FOUND) {
847b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Stream %d does not exist", id);
848f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return BAD_VALUE;
849f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
850f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        deletedStream = mOutputStreams.editValueAt(idx);
851f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mOutputStreams.removeItem(id);
852f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
853f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
854f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Free up the stream endpoint so that it can be used by some other stream
855f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = deletedStream->disconnect();
856f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (res != OK) {
857b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Can't disconnect deleted stream %d", id);
858f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // fall through since we want to still list the stream as deleted.
859f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
860f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mDeletedStreams.add(deletedStream);
861ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    mNeedConfig = true;
862f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
863f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return res;
8647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
8657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteReprocessStream(int id) {
8677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
8687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    (void)id;
8697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
870b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    CLOGE("Unimplemented");
8717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return INVALID_OPERATION;
8727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
8737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createDefaultRequest(int templateId,
8767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        CameraMetadata *request) {
8777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
878fe7e0c6154309f2491463ee6ca4920d225289638Alex Ray    ALOGV("%s: for template %d", __FUNCTION__, templateId);
879f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
880f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
881f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
882f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
883f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
884b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
885f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
886f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
887b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device is not initialized!");
888f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
889f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
890f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
891f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
892f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
893f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
894f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
895b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
896f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
897f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
8987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    const camera_metadata_t *rawRequest;
90017a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_BEGIN("camera3->construct_default_request_settings");
9017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    rawRequest = mHal3Device->ops->construct_default_request_settings(
9027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        mHal3Device, templateId);
90317a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_END();
904b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    if (rawRequest == NULL) {
905b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("HAL is unable to construct default settings for template %d",
906b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                templateId);
907b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        return DEAD_OBJECT;
908b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    }
9097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    *request = rawRequest;
9107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
9117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return OK;
9127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
9137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
9147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilDrained() {
9157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
916f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
917f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
9187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
919f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
920f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
921f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
922f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGV("%s: Already idle", __FUNCTION__);
923f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return OK;
924f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
925f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            // To avoid race conditions, check with tracker to be sure
926f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
927f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
928f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            // Need to verify shut down
929f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
930f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
931b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d",mStatus);
932f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
933f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
934f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
935f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("%s: Camera %d: Waiting until idle", __FUNCTION__, mId);
936f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout);
937f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return res;
938f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
939f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
940f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// Pause to reconfigure
941f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::internalPauseAndWaitLocked() {
942f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mRequestThread->setPaused(true);
943f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mPauseStateNotify = true;
944f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
945f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("%s: Camera %d: Internal wait until idle", __FUNCTION__, mId);
946f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout);
947f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (res != OK) {
948f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        SET_ERR_L("Can't idle device in %f seconds!",
949f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                kShutdownTimeout/1e9);
950f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
951f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
952f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return res;
953f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
954f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
955f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// Resume after internalPauseAndWaitLocked
956f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::internalResumeLocked() {
957f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t res;
958f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
959f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mRequestThread->setPaused(false);
960f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
961f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    res = waitUntilStateThenRelock(/*active*/ true, kActiveTimeout);
962f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (res != OK) {
963f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        SET_ERR_L("Can't transition to active in %f seconds!",
964f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                kActiveTimeout/1e9);
965f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
966f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mPauseStateNotify = false;
967f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return OK;
968f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
969f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
970f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::waitUntilStateThenRelock(bool active,
971f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        nsecs_t timeout) {
972f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t res = OK;
973f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (active == (mStatus == STATUS_ACTIVE)) {
974f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Desired state already reached
975f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        return res;
976f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
977f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
978f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool stateSeen = false;
979f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    do {
980f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mRecentStatusUpdates.clear();
981f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
982f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        res = mStatusChanged.waitRelative(mLock, timeout);
983f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (res != OK) break;
984f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
985f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Check state change history during wait
986f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        for (size_t i = 0; i < mRecentStatusUpdates.size(); i++) {
987f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            if (active == (mRecentStatusUpdates[i] == STATUS_ACTIVE) ) {
988f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                stateSeen = true;
989f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                break;
990f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            }
991f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
992f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    } while (!stateSeen);
993f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
994f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return res;
9957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
9967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
997f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
9987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setNotifyCallback(NotificationListener *listener) {
9997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
10007d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex::Autolock l(mOutputLock);
10017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10027d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    if (listener != NULL && mListener != NULL) {
10037d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        ALOGW("%s: Replacing old callback listener", __FUNCTION__);
10047d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
10057d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    mListener = listener;
10067d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
10077d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    return OK;
10087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
10097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
101046910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvalabool Camera3Device::willNotify3A() {
101146910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    return false;
101246910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala}
101346910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala
10147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitForNextFrame(nsecs_t timeout) {
10157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    status_t res;
10167d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex::Autolock l(mOutputLock);
10177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10187d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    while (mResultQueue.empty()) {
10197d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        res = mResultSignal.waitRelative(mOutputLock, timeout);
10207d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (res == TIMED_OUT) {
10217d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            return res;
10227d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        } else if (res != OK) {
1023e5729fac81c8a984e984fefc90afc64135817d4fColin Cross            ALOGW("%s: Camera %d: No frame in %" PRId64 " ns: %s (%d)",
1024b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    __FUNCTION__, mId, timeout, strerror(-res), res);
10257d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            return res;
10267d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
10277d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
10287d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    return OK;
10297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
10307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::getNextFrame(CameraMetadata *frame) {
10327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
10337d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex::Autolock l(mOutputLock);
10347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10357d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    if (mResultQueue.empty()) {
10367d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        return NOT_ENOUGH_DATA;
10377d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
10387d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
10397d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    CameraMetadata &result = *(mResultQueue.begin());
10407d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    frame->acquire(result);
10417d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    mResultQueue.erase(mResultQueue.begin());
10427d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
10437d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    return OK;
10447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
10457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerAutofocus(uint32_t id) {
10477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
1048f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
10497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id);
10514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Mix-in this trigger into the next request and only the next request.
10524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    RequestTrigger trigger[] = {
10534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
10544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER,
10554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER_START
10564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
10574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
10584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER_ID,
10594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            static_cast<int32_t>(id)
10604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
10614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
10624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
10634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return mRequestThread->queueTrigger(trigger,
10644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                        sizeof(trigger)/sizeof(trigger[0]));
10657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
10667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerCancelAutofocus(uint32_t id) {
10687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
1069f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
10707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    ALOGV("%s: Triggering cancel autofocus, id %d", __FUNCTION__, id);
10724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Mix-in this trigger into the next request and only the next request.
10734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    RequestTrigger trigger[] = {
10744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
10754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER,
10764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER_CANCEL
10774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
10784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
10794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER_ID,
10804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            static_cast<int32_t>(id)
10814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
10824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
10834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
10844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return mRequestThread->queueTrigger(trigger,
10854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                        sizeof(trigger)/sizeof(trigger[0]));
10867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
10877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerPrecaptureMetering(uint32_t id) {
10897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
1090f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
10917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id);
10934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Mix-in this trigger into the next request and only the next request.
10944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    RequestTrigger trigger[] = {
10954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
10964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,
10974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START
10984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
10994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
11004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AE_PRECAPTURE_ID,
11014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            static_cast<int32_t>(id)
11024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
11034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
11044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
11054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return mRequestThread->queueTrigger(trigger,
11064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                        sizeof(trigger)/sizeof(trigger[0]));
11077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
11087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
11097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::pushReprocessBuffer(int reprocessStreamId,
11107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        buffer_handle_t *buffer, wp<BufferReleasedListener> listener) {
11117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
11127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    (void)reprocessStreamId; (void)buffer; (void)listener;
11137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1114b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    CLOGE("Unimplemented");
11157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return INVALID_OPERATION;
11167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
11177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1118abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvalastatus_t Camera3Device::flush() {
1119abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    ATRACE_CALL();
1120abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    ALOGV("%s: Camera %d: Flushing all requests", __FUNCTION__, mId);
1121f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
1122abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    Mutex::Autolock l(mLock);
1123abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
1124abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    mRequestThread->clear();
1125abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    return mHal3Device->ops->flush(mHal3Device);
1126abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala}
1127abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
1128f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/**
1129f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Methods called by subclasses
1130f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */
1131f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1132f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid Camera3Device::notifyStatus(bool idle) {
1133f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    {
1134f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Need mLock to safely update state and synchronize to current
1135f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // state of methods in flight.
1136f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        Mutex::Autolock l(mLock);
1137f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // We can get various system-idle notices from the status tracker
1138f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // while starting up. Only care about them if we've actually sent
1139f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // in some requests recently.
1140f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mStatus != STATUS_ACTIVE && mStatus != STATUS_CONFIGURED) {
1141f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            return;
1142f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
1143f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGV("%s: Camera %d: Now %s", __FUNCTION__, mId,
1144f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                idle ? "idle" : "active");
1145f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatus = idle ? STATUS_CONFIGURED : STATUS_ACTIVE;
1146f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mRecentStatusUpdates.add(mStatus);
1147f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatusChanged.signal();
1148f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1149f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Skip notifying listener if we're doing some user-transparent
1150f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // state changes
1151f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mPauseStateNotify) return;
1152f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
1153f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    NotificationListener *listener;
1154f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    {
1155f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        Mutex::Autolock l(mOutputLock);
1156f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        listener = mListener;
1157f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
1158f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (idle && listener != NULL) {
1159f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        listener->notifyIdle();
1160f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
1161f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
1162f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1163f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala/**
1164f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera3Device private methods
1165f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */
1166f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1167f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::createCaptureRequest(
1168f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        const CameraMetadata &request) {
1169f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ATRACE_CALL();
1170f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
1171f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1172f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> newRequest = new CaptureRequest;
1173f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    newRequest->mSettings = request;
1174f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1175f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera_metadata_entry_t inputStreams =
1176f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            newRequest->mSettings.find(ANDROID_REQUEST_INPUT_STREAMS);
1177f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (inputStreams.count > 0) {
1178f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (mInputStream == NULL ||
1179d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He                mInputStream->getId() != inputStreams.data.i32[0]) {
1180b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Request references unknown input stream %d",
1181b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    inputStreams.data.u8[0]);
1182f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return NULL;
1183f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1184f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Lazy completion of stream configuration (allocation/registration)
1185f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // on first use
1186f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (mInputStream->isConfiguring()) {
1187f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            res = mInputStream->finishConfiguration(mHal3Device);
1188f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            if (res != OK) {
1189b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                SET_ERR_L("Unable to finish configuring input stream %d:"
1190f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                        " %s (%d)",
1191b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                        mInputStream->getId(), strerror(-res), res);
1192f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                return NULL;
1193f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            }
1194f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1195f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newRequest->mInputStream = mInputStream;
1197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newRequest->mSettings.erase(ANDROID_REQUEST_INPUT_STREAMS);
1198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera_metadata_entry_t streams =
1201f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            newRequest->mSettings.find(ANDROID_REQUEST_OUTPUT_STREAMS);
1202f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (streams.count == 0) {
1203b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Zero output streams specified!");
1204f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return NULL;
1205f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1206f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1207f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < streams.count; i++) {
1208d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He        int idx = mOutputStreams.indexOfKey(streams.data.i32[i]);
1209f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (idx == NAME_NOT_FOUND) {
1210b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Request references unknown stream %d",
1211b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    streams.data.u8[i]);
1212f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return NULL;
1213f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
12142fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        sp<Camera3OutputStreamInterface> stream =
12152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                mOutputStreams.editValueAt(idx);
1216f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1217f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Lazy completion of stream configuration (allocation/registration)
1218f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // on first use
1219f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (stream->isConfiguring()) {
1220f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            res = stream->finishConfiguration(mHal3Device);
1221f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            if (res != OK) {
1222b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                SET_ERR_L("Unable to finish configuring stream %d: %s (%d)",
1223b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                        stream->getId(), strerror(-res), res);
1224f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                return NULL;
1225f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            }
1226f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1227f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1228f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newRequest->mOutputStreams.push(stream);
1229f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1230f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    newRequest->mSettings.erase(ANDROID_REQUEST_OUTPUT_STREAMS);
1231f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1232f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return newRequest;
12337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
12347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1235f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::configureStreamsLocked() {
1236f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ATRACE_CALL();
1237f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
12387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1239f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (mStatus != STATUS_UNCONFIGURED && mStatus != STATUS_CONFIGURED) {
1240b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Not idle");
1241f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return INVALID_OPERATION;
1242f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1243f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1244ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    if (!mNeedConfig) {
1245ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala        ALOGV("%s: Skipping config, no stream changes", __FUNCTION__);
1246ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala        return OK;
1247ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    }
1248ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala
1249f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Start configuring the streams
1250f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("%s: Camera %d: Starting stream configuration", __FUNCTION__, mId);
1251f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_stream_configuration config;
1253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1254f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    config.num_streams = (mInputStream != NULL) + mOutputStreams.size();
1255f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1256f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Vector<camera3_stream_t*> streams;
1257f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    streams.setCapacity(config.num_streams);
1258f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1259f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mInputStream != NULL) {
1260f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_stream_t *inputStream;
1261f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        inputStream = mInputStream->startConfiguration();
1262f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (inputStream == NULL) {
1263b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Can't start input stream configuration");
1264f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
1265f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1266f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        streams.add(inputStream);
1267f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1268f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1269f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < mOutputStreams.size(); i++) {
12702fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
12712fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        // Don't configure bidi streams twice, nor add them twice to the list
12722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        if (mOutputStreams[i].get() ==
12732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            static_cast<Camera3StreamInterface*>(mInputStream.get())) {
12742fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
12752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            config.num_streams--;
12762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            continue;
12772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        }
12782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
1279f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_stream_t *outputStream;
1280f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        outputStream = mOutputStreams.editValueAt(i)->startConfiguration();
1281f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (outputStream == NULL) {
1282b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Can't start output stream configuration");
1283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
1284f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1285f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        streams.add(outputStream);
1286f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1287f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1288f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    config.streams = streams.editArray();
1289f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1290f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Do the HAL configuration; will potentially touch stream
1291f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // max_buffers, usage, priv fields.
129217a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_BEGIN("camera3->configure_streams");
1293f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = mHal3Device->ops->configure_streams(mHal3Device, &config);
129417a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_END();
1295f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1296f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (res != OK) {
1297b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Unable to configure streams with HAL: %s (%d)",
1298b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                strerror(-res), res);
1299f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return res;
1300f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1301f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
13024c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    // Finish all stream configuration immediately.
13034c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    // TODO: Try to relax this later back to lazy completion, which should be
13044c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    // faster
13054c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala
1306073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin    if (mInputStream != NULL && mInputStream->isConfiguring()) {
13074c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala        res = mInputStream->finishConfiguration(mHal3Device);
13084c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala        if (res != OK) {
13094c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala            SET_ERR_L("Can't finish configuring input stream %d: %s (%d)",
13104c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala                    mInputStream->getId(), strerror(-res), res);
13114c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala            return res;
13124c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala        }
13134c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    }
13144c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala
13154c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    for (size_t i = 0; i < mOutputStreams.size(); i++) {
1316073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin        sp<Camera3OutputStreamInterface> outputStream =
1317073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin            mOutputStreams.editValueAt(i);
1318073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin        if (outputStream->isConfiguring()) {
1319073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin            res = outputStream->finishConfiguration(mHal3Device);
1320073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin            if (res != OK) {
1321073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin                SET_ERR_L("Can't finish configuring output stream %d: %s (%d)",
1322073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin                        outputStream->getId(), strerror(-res), res);
1323073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin                return res;
1324073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin            }
13254c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala        }
13264c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    }
13274c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala
1328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Request thread needs to know to avoid using repeat-last-settings protocol
1329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // across configure_streams() calls
1330f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRequestThread->configurationComplete();
1331f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1332f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Update device state
1333f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1334ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    mNeedConfig = false;
1335f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1336f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (config.num_streams > 0) {
1337f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatus = STATUS_CONFIGURED;
1338f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    } else {
1339f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatus = STATUS_UNCONFIGURED;
1340f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
1341f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1342f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("%s: Camera %d: Stream configuration complete", __FUNCTION__, mId);
1343f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1344f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
13457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
13467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1347b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorState(const char *fmt, ...) {
1348b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    Mutex::Autolock l(mLock);
1349b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_list args;
1350b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_start(args, fmt);
1351b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1352b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    setErrorStateLockedV(fmt, args);
1353b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1354b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_end(args);
1355b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala}
1356b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1357b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateV(const char *fmt, va_list args) {
1358b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    Mutex::Autolock l(mLock);
1359b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    setErrorStateLockedV(fmt, args);
1360b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala}
1361b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1362b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateLocked(const char *fmt, ...) {
1363b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_list args;
1364b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_start(args, fmt);
1365b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1366b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    setErrorStateLockedV(fmt, args);
1367b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1368b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_end(args);
1369b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala}
1370b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1371b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateLockedV(const char *fmt, va_list args) {
137242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Print out all error messages to log
137342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    String8 errorCause = String8::formatV(fmt, args);
137442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    ALOGE("Camera %d: %s", mId, errorCause.string());
137542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
137642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // But only do error state transition steps for the first error
1377b05eeaedacaff92b6e5ac89f99b0fccdf7643f09Zhijun He    if (mStatus == STATUS_ERROR || mStatus == STATUS_UNINITIALIZED) return;
1378b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1379ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin    // Save stack trace. View by dumping it later.
1380ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin    CameraTraces::saveTrace();
1381ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin    // TODO: consider adding errorCause and client pid/procname
1382ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkin
138342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    mErrorCause = errorCause;
138442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
138542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    mRequestThread->setPaused(true);
1386b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    mStatus = STATUS_ERROR;
1387b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala}
1388f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1389f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/**
139042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala * In-flight request management
139142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala */
139242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
139342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvalastatus_t Camera3Device::registerInFlight(int32_t frameNumber,
1394f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        int32_t requestId, int32_t numBuffers) {
139542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    ATRACE_CALL();
139642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    Mutex::Autolock l(mInFlightLock);
139742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
139842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    ssize_t res;
1399f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    res = mInFlightMap.add(frameNumber, InFlightRequest(requestId, numBuffers));
140042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (res < 0) return res;
140142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
140242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    return OK;
140342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala}
140442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
140542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala/**
1406fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * QUIRK(partial results)
1407fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * Check if all 3A fields are ready, and send off a partial 3A-only result
1408fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * to the output frame queue
1409fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala */
1410184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvalabool Camera3Device::processPartial3AQuirk(
1411184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala        int32_t frameNumber, int32_t requestId,
1412fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        const CameraMetadata& partial) {
1413fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1414fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // Check if all 3A states are present
1415fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // The full list of fields is
1416fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.control.afMode
1417fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.control.awbMode
1418fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.control.aeState
1419fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.control.awbState
1420fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.control.afState
1421fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.control.afTriggerID
1422fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.control.aePrecaptureID
1423fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // TODO: Add android.control.aeMode
1424fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1425fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    bool gotAllStates = true;
1426fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1427fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    uint8_t afMode;
1428fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    uint8_t awbMode;
1429fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    uint8_t aeState;
1430fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    uint8_t afState;
1431fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    uint8_t awbState;
1432fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    int32_t afTriggerId;
1433fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    int32_t aeTriggerId;
1434fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1435fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AF_MODE,
1436fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        &afMode, frameNumber);
1437fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1438fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AWB_MODE,
1439fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        &awbMode, frameNumber);
1440fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1441fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AE_STATE,
1442fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        &aeState, frameNumber);
1443fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1444fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AF_STATE,
1445fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        &afState, frameNumber);
1446fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1447fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AWB_STATE,
1448fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        &awbState, frameNumber);
1449fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1450fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AF_TRIGGER_ID,
1451fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        &afTriggerId, frameNumber);
1452fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1453fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    gotAllStates &= get3AResult(partial, ANDROID_CONTROL_AE_PRECAPTURE_ID,
1454fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        &aeTriggerId, frameNumber);
1455fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1456fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (!gotAllStates) return false;
1457fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1458184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala    ALOGVV("%s: Camera %d: Frame %d, Request ID %d: AF mode %d, AWB mode %d, "
1459fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        "AF state %d, AE state %d, AWB state %d, "
1460fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        "AF trigger %d, AE precapture trigger %d",
1461184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala        __FUNCTION__, mId, frameNumber, requestId,
1462fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        afMode, awbMode,
1463fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        afState, aeState, awbState,
1464fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        afTriggerId, aeTriggerId);
1465fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1466fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // Got all states, so construct a minimal result to send
1467fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // In addition to the above fields, this means adding in
1468fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.request.frameCount
1469184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala    //   android.request.requestId
1470fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    //   android.quirks.partialResult
1471fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1472184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala    const size_t kMinimal3AResultEntries = 10;
1473fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1474fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    Mutex::Autolock l(mOutputLock);
1475fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1476fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    CameraMetadata& min3AResult =
1477fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            *mResultQueue.insert(
1478fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                mResultQueue.end(),
1479fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                CameraMetadata(kMinimal3AResultEntries, /*dataCapacity*/ 0));
1480fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1481fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (!insert3AResult(min3AResult, ANDROID_REQUEST_FRAME_COUNT,
1482fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &frameNumber, frameNumber)) {
1483fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1484fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1485fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1486184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala    if (!insert3AResult(min3AResult, ANDROID_REQUEST_ID,
1487184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala            &requestId, frameNumber)) {
1488184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala        return false;
1489184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala    }
1490184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala
1491fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    static const uint8_t partialResult = ANDROID_QUIRKS_PARTIAL_RESULT_PARTIAL;
1492fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (!insert3AResult(min3AResult, ANDROID_QUIRKS_PARTIAL_RESULT,
1493fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &partialResult, frameNumber)) {
1494fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1495fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1496fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1497fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (!insert3AResult(min3AResult, ANDROID_CONTROL_AF_MODE,
1498fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &afMode, frameNumber)) {
1499fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1500fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1501fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1502fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (!insert3AResult(min3AResult, ANDROID_CONTROL_AWB_MODE,
1503fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &awbMode, frameNumber)) {
1504fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1505fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1506fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1507fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (!insert3AResult(min3AResult, ANDROID_CONTROL_AE_STATE,
1508fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &aeState, frameNumber)) {
1509fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1510fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1511fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1512fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (!insert3AResult(min3AResult, ANDROID_CONTROL_AF_STATE,
1513fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &afState, frameNumber)) {
1514fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1515fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1516fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1517fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (!insert3AResult(min3AResult, ANDROID_CONTROL_AWB_STATE,
1518fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &awbState, frameNumber)) {
1519fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1520fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1521fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1522fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (!insert3AResult(min3AResult, ANDROID_CONTROL_AF_TRIGGER_ID,
1523fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &afTriggerId, frameNumber)) {
1524fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1525fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1526fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1527fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (!insert3AResult(min3AResult, ANDROID_CONTROL_AE_PRECAPTURE_ID,
1528fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            &aeTriggerId, frameNumber)) {
1529fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1530fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1531fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1532fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    mResultSignal.signal();
1533fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1534fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    return true;
1535fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala}
1536fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1537fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalatemplate<typename T>
1538fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalabool Camera3Device::get3AResult(const CameraMetadata& result, int32_t tag,
1539fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        T* value, int32_t frameNumber) {
1540fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    (void) frameNumber;
1541fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1542fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    camera_metadata_ro_entry_t entry;
1543fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1544fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    entry = result.find(tag);
1545fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (entry.count == 0) {
1546fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        ALOGVV("%s: Camera %d: Frame %d: No %s provided by HAL!", __FUNCTION__,
1547fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            mId, frameNumber, get_camera_metadata_tag_name(tag));
1548fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1549fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1550fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1551fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (sizeof(T) == sizeof(uint8_t)) {
1552fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        *value = entry.data.u8[0];
1553fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    } else if (sizeof(T) == sizeof(int32_t)) {
1554fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        *value = entry.data.i32[0];
1555fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    } else {
1556fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        ALOGE("%s: Unexpected type", __FUNCTION__);
1557fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1558fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1559fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    return true;
1560fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala}
1561fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1562fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalatemplate<typename T>
1563fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvalabool Camera3Device::insert3AResult(CameraMetadata& result, int32_t tag,
1564fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        const T* value, int32_t frameNumber) {
1565fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (result.update(tag, value, 1) != NO_ERROR) {
1566fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        mResultQueue.erase(--mResultQueue.end(), mResultQueue.end());
1567fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        SET_ERR("Frame %d: Failed to set %s in partial metadata",
1568fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                frameNumber, get_camera_metadata_tag_name(tag));
1569fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        return false;
1570fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
1571fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    return true;
1572fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala}
1573fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1574fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala/**
1575f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera HAL device callback methods
1576f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */
1577f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
15787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::processCaptureResult(const camera3_capture_result *result) {
15797d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    ATRACE_CALL();
15807d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
15817d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    status_t res;
15827d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
158342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t frameNumber = result->frame_number;
158442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (result->result == NULL && result->num_output_buffers == 0) {
158542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        SET_ERR("No result data provided by HAL for frame %d",
158642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                frameNumber);
15877d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        return;
15887d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
1589fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    bool partialResultQuirk = false;
1590fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    CameraMetadata collectedQuirkResult;
15917d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
159242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Get capture timestamp from list of in-flight requests, where it was added
159342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // by the shutter notification for this frame. Then update the in-flight
159442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // status and remove the in-flight entry if all result data has been
159542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // received.
15967d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    nsecs_t timestamp = 0;
159742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    {
159842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        Mutex::Autolock l(mInFlightLock);
159942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        ssize_t idx = mInFlightMap.indexOfKey(frameNumber);
160042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        if (idx == NAME_NOT_FOUND) {
160142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Unknown frame number for capture result: %d",
160242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber);
160342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            return;
160442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
160542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        InFlightRequest &request = mInFlightMap.editValueAt(idx);
1606fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1607fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        // Check if this result carries only partial metadata
1608fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        if (mUsePartialResultQuirk && result->result != NULL) {
1609fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            camera_metadata_ro_entry_t partialResultEntry;
1610fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            res = find_camera_metadata_ro_entry(result->result,
1611fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    ANDROID_QUIRKS_PARTIAL_RESULT, &partialResultEntry);
1612fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            if (res != NAME_NOT_FOUND &&
1613fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    partialResultEntry.count > 0 &&
1614fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    partialResultEntry.data.u8[0] ==
1615fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    ANDROID_QUIRKS_PARTIAL_RESULT_PARTIAL) {
1616fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                // A partial result. Flag this as such, and collect this
1617fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                // set of metadata into the in-flight entry.
1618fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                partialResultQuirk = true;
1619fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                request.partialResultQuirk.collectedResult.append(
1620fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    result->result);
1621fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                request.partialResultQuirk.collectedResult.erase(
1622fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    ANDROID_QUIRKS_PARTIAL_RESULT);
1623fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                // Fire off a 3A-only result if possible
1624fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                if (!request.partialResultQuirk.haveSent3A) {
1625fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    request.partialResultQuirk.haveSent3A =
1626fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                            processPartial3AQuirk(frameNumber,
1627184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala                                    request.requestId,
1628184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala                                    request.partialResultQuirk.collectedResult);
1629fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                }
1630fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            }
1631fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        }
1632fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
163342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        timestamp = request.captureTimestamp;
16341d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He        /**
1635fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala         * One of the following must happen before it's legal to call process_capture_result,
1636fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala         * unless partial metadata is being provided:
16371d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He         * - CAMERA3_MSG_SHUTTER (expected during normal operation)
16381d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He         * - CAMERA3_MSG_ERROR (expected during flush)
16391d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He         */
1640fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        if (request.requestStatus == OK && timestamp == 0 && !partialResultQuirk) {
164142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Called before shutter notify for frame %d",
164242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber);
164342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            return;
164442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
164542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
1646fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        // Did we get the (final) result metadata for this capture?
1647fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        if (result->result != NULL && !partialResultQuirk) {
164842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            if (request.haveResultMetadata) {
164942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                SET_ERR("Called multiple times with metadata for frame %d",
165042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                        frameNumber);
165142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                return;
165242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
1653fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            if (mUsePartialResultQuirk &&
1654fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    !request.partialResultQuirk.collectedResult.isEmpty()) {
1655fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                collectedQuirkResult.acquire(
1656fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    request.partialResultQuirk.collectedResult);
1657fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            }
165842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            request.haveResultMetadata = true;
165942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
166042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
166142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        request.numBuffersLeft -= result->num_output_buffers;
166242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
166342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        if (request.numBuffersLeft < 0) {
166442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Too many buffers returned for frame %d",
166542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber);
166642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            return;
166742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
166842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
1669fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        // Check if everything has arrived for this result (buffers and metadata)
167042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        if (request.haveResultMetadata && request.numBuffersLeft == 0) {
167117a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala            ATRACE_ASYNC_END("frame capture", frameNumber);
167242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            mInFlightMap.removeItemsAt(idx, 1);
167342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
167442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
167542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Sanity check - if we have too many in-flight frames, something has
167642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // likely gone wrong
167742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        if (mInFlightMap.size() > kInFlightWarnLimit) {
1678e5729fac81c8a984e984fefc90afc64135817d4fColin Cross            CLOGE("In-flight list too large: %zu", mInFlightMap.size());
167942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
168042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
168142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    }
168242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
168342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Process the result metadata, if provided
1684fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    bool gotResult = false;
1685fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (result->result != NULL && !partialResultQuirk) {
16867d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        Mutex::Autolock l(mOutputLock);
16877d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
1688fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        gotResult = true;
1689fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
169042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        if (frameNumber != mNextResultFrameNumber) {
169142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Out-of-order capture result metadata submitted! "
169242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    "(got frame number %d, expecting %d)",
169342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber, mNextResultFrameNumber);
169442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            return;
169542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
169642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        mNextResultFrameNumber++;
169742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
1698fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        CameraMetadata captureResult;
16997d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        captureResult = result->result;
1700fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1701d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin        if (captureResult.update(ANDROID_REQUEST_FRAME_COUNT,
170242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                        (int32_t*)&frameNumber, 1) != OK) {
1703b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR("Failed to set frame# in metadata (%d)",
170442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber);
1705fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            gotResult = false;
1706d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin        } else {
1707d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin            ALOGVV("%s: Camera %d: Set frame# in metadata (%d)",
170842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    __FUNCTION__, mId, frameNumber);
1709d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin        }
17107d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
1711fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        // Append any previous partials to form a complete result
1712fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        if (mUsePartialResultQuirk && !collectedQuirkResult.isEmpty()) {
1713fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            captureResult.append(collectedQuirkResult);
1714fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        }
1715fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1716fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        captureResult.sort();
1717fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
171842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Check that there's a timestamp in the result metadata
17197d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
17207d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        camera_metadata_entry entry =
17217d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                captureResult.find(ANDROID_SENSOR_TIMESTAMP);
17227d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (entry.count == 0) {
1723b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR("No timestamp provided by HAL for frame %d!",
172442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber);
1725fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            gotResult = false;
1726fe7e0c6154309f2491463ee6ca4920d225289638Alex Ray        } else if (timestamp != entry.data.i64[0]) {
172742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Timestamp mismatch between shutter notify and result"
1728e5729fac81c8a984e984fefc90afc64135817d4fColin Cross                    " metadata for frame %d (%" PRId64 " vs %" PRId64 " respectively)",
172942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber, timestamp, entry.data.i64[0]);
1730fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            gotResult = false;
1731fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        }
1732fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1733fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        if (gotResult) {
1734fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            // Valid result, insert into queue
1735fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            CameraMetadata& queuedResult =
1736fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                *mResultQueue.insert(mResultQueue.end(), CameraMetadata());
1737fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            queuedResult.swap(captureResult);
17387d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
17397d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    } // scope for mOutputLock
17407d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
174142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Return completed buffers to their streams with the timestamp
174242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
17437d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    for (size_t i = 0; i < result->num_output_buffers; i++) {
17447d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        Camera3Stream *stream =
17457d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                Camera3Stream::cast(result->output_buffers[i].stream);
17467d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        res = stream->returnBuffer(result->output_buffers[i], timestamp);
17477d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        // Note: stream may be deallocated at this point, if this buffer was the
17487d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        // last reference to it.
17497d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (res != OK) {
1750e5729fac81c8a984e984fefc90afc64135817d4fColin Cross            ALOGE("Can't return buffer %zu for frame %d to its stream: "
175142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    " %s (%d)", i, frameNumber, strerror(-res), res);
17527d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
17537d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
17547d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
175546910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    // Finally, signal any waiters for new frames
175642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
1757fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (gotResult) {
17584345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin        mResultSignal.signal();
17594345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin    }
17604345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin
17617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
17627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
176346910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala
176446910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala
17657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::notify(const camera3_notify_msg *msg) {
176617a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_CALL();
17677d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    NotificationListener *listener;
17687d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    {
17697d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        Mutex::Autolock l(mOutputLock);
17707d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        listener = mListener;
17717d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
17727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
17737d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    if (msg == NULL) {
177442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        SET_ERR("HAL sent NULL notify message!");
17757d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        return;
17767d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
17777d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
17787d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    switch (msg->type) {
17797d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        case CAMERA3_MSG_ERROR: {
17807d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            int streamId = 0;
17817d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            if (msg->message.error.error_stream != NULL) {
17827d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                Camera3Stream *stream =
17837d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                        Camera3Stream::cast(
17847d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                                  msg->message.error.error_stream);
17857d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                streamId = stream->getId();
17867d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            }
178717a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala            ALOGV("Camera %d: %s: HAL error, frame %d, stream %d: %d",
178817a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala                    mId, __FUNCTION__, msg->message.error.frame_number,
178917a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala                    streamId, msg->message.error.error_code);
17901d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He
17911d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He            // Set request error status for the request in the in-flight tracking
17921d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He            {
17931d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                Mutex::Autolock l(mInFlightLock);
17941d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                ssize_t idx = mInFlightMap.indexOfKey(msg->message.error.frame_number);
17951d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                if (idx >= 0) {
17961d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                    mInFlightMap.editValueAt(idx).requestStatus = msg->message.error.error_code;
17971d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                }
17981d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He            }
17991d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He
180042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            if (listener != NULL) {
180142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                listener->notifyError(msg->message.error.error_code,
180242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                        msg->message.error.frame_number, streamId);
180342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
18047d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            break;
18057d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
18067d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        case CAMERA3_MSG_SHUTTER: {
180742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            ssize_t idx;
180842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            uint32_t frameNumber = msg->message.shutter.frame_number;
180942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            nsecs_t timestamp = msg->message.shutter.timestamp;
181042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            // Verify ordering of shutter notifications
181142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            {
181242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                Mutex::Autolock l(mOutputLock);
181342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                if (frameNumber != mNextShutterFrameNumber) {
181442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    SET_ERR("Shutter notification out-of-order. Expected "
181542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                            "notification for frame %d, got frame %d",
181642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                            mNextShutterFrameNumber, frameNumber);
181742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    break;
181842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                }
181942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                mNextShutterFrameNumber++;
182042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
182142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
1822f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            int32_t requestId = -1;
1823f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
182442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            // Set timestamp for the request in the in-flight tracking
1825f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            // and get the request ID to send upstream
182642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            {
182742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                Mutex::Autolock l(mInFlightLock);
182842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                idx = mInFlightMap.indexOfKey(frameNumber);
182942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                if (idx >= 0) {
1830f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    InFlightRequest &r = mInFlightMap.editValueAt(idx);
1831f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    r.captureTimestamp = timestamp;
1832f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    requestId = r.requestId;
183342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                }
183442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
183542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            if (idx < 0) {
183642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                SET_ERR("Shutter notification for non-existent frame number %d",
183742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                        frameNumber);
183842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                break;
183942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
1840e5729fac81c8a984e984fefc90afc64135817d4fColin Cross            ALOGVV("Camera %d: %s: Shutter fired for frame %d (id %d) at %" PRId64,
1841f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    mId, __FUNCTION__, frameNumber, requestId, timestamp);
184242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            // Call listener, if any
184342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            if (listener != NULL) {
1844f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                listener->notifyShutter(requestId, timestamp);
184542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
18467d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            break;
18477d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
18487d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        default:
184942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Unknown notify message from HAL: %d",
1850b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    msg->type);
18517d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
18527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
18537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1854f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville TalvalaCameraMetadata Camera3Device::getLatestRequestLocked() {
18551e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    ALOGV("%s", __FUNCTION__);
18561e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
18571e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    CameraMetadata retVal;
18581e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
18591e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    if (mRequestThread != NULL) {
18601e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        retVal = mRequestThread->getLatestRequest();
18611e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    }
18621e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
18631e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    return retVal;
18641e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin}
18651e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
18667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/**
1867f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * RequestThread inner class methods
1868f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */
1869f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1870f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville TalvalaCamera3Device::RequestThread::RequestThread(wp<Camera3Device> parent,
1871f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        sp<StatusTracker> statusTracker,
1872f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_device_t *hal3Device) :
1873f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Thread(false),
1874f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mParent(parent),
1875f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatusTracker(statusTracker),
1876f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mHal3Device(hal3Device),
187742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        mId(getId(parent)),
1878f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mReconfigured(false),
1879f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mDoPause(false),
1880f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mPaused(true),
18814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mFrameNumber(0),
18824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mLatestRequestId(NAME_NOT_FOUND) {
1883f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mStatusId = statusTracker->addComponent();
1884f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1885f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1886f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::configurationComplete() {
1887f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
1888f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mReconfigured = true;
1889f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1890f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1891f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::queueRequest(
1892f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         sp<CaptureRequest> request) {
1893f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
1894f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRequestQueue.push_back(request);
1895f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
189626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    unpauseForNewRequests();
189726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala
1898f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
1899f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1900f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
19014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
19024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTrigger(
19034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger[],
19044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        size_t count) {
19054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
19064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Mutex::Autolock l(mTriggerMutex);
19074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    status_t ret;
19084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
19094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    for (size_t i = 0; i < count; ++i) {
19104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ret = queueTriggerLocked(trigger[i]);
19114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
19124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (ret != OK) {
19134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return ret;
19144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
19154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
19164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
19174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return OK;
19184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
19194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
192042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvalaint Camera3Device::RequestThread::getId(const wp<Camera3Device> &device) {
192142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    sp<Camera3Device> d = device.promote();
192242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (d != NULL) return d->mId;
192342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    return 0;
192442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala}
192542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
19264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTriggerLocked(
19274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger) {
19284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
19294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    uint32_t tag = trigger.metadataTag;
19304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    ssize_t index = mTriggerMap.indexOfKey(tag);
19314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
19324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    switch (trigger.getTagType()) {
19334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        case TYPE_BYTE:
19344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // fall-through
19354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        case TYPE_INT32:
19364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            break;
19374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        default:
193842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            ALOGE("%s: Type not supported: 0x%x", __FUNCTION__,
193942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    trigger.getTagType());
19404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return INVALID_OPERATION;
19414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
19424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
19434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
19444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Collect only the latest trigger, since we only have 1 field
19454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * in the request settings per trigger tag, and can't send more than 1
19464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * trigger per request.
19474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
19484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    if (index != NAME_NOT_FOUND) {
19494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mTriggerMap.editValueAt(index) = trigger;
19504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    } else {
19514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mTriggerMap.add(tag, trigger);
19524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
19534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
19544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return OK;
19554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
19564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
1957f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::setRepeatingRequests(
1958f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        const RequestList &requests) {
1959f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
1960f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRepeatingRequests.clear();
1961f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRepeatingRequests.insert(mRepeatingRequests.begin(),
1962f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            requests.begin(), requests.end());
196326fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala
196426fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    unpauseForNewRequests();
196526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala
1966f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
1967f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1968f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1969f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::clearRepeatingRequests() {
1970f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
1971f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRepeatingRequests.clear();
1972f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
1973f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1974f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1975abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvalastatus_t Camera3Device::RequestThread::clear() {
1976abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    Mutex::Autolock l(mRequestLock);
1977abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    mRepeatingRequests.clear();
1978abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    mRequestQueue.clear();
1979abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    mTriggerMap.clear();
1980abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    return OK;
1981abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala}
1982abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
1983f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::setPaused(bool paused) {
1984f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mPauseLock);
1985f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mDoPause = paused;
1986f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mDoPauseSignal.signal();
1987f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1988f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
19894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::waitUntilRequestProcessed(
19904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t requestId, nsecs_t timeout) {
19914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Mutex::Autolock l(mLatestRequestMutex);
19924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    status_t res;
19934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    while (mLatestRequestId != requestId) {
19944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        nsecs_t startTime = systemTime();
19954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
19964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        res = mLatestRequestSignal.waitRelative(mLatestRequestMutex, timeout);
19974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (res != OK) return res;
19984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
19994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        timeout -= (systemTime() - startTime);
20004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
20014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
20024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return OK;
20034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
20044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2005f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid Camera3Device::RequestThread::requestExit() {
2006f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Call parent to set up shutdown
2007f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Thread::requestExit();
2008f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // The exit from any possible waits
2009f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mDoPauseSignal.signal();
2010f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mRequestSignal.signal();
2011f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
20124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2013f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::threadLoop() {
2014f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2015f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
2016f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2017f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Handle paused state.
2018f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (waitIfPaused()) {
2019f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return true;
2020f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2021f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2022f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Get work to do
2023f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2024f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> nextRequest = waitForNextRequest();
2025f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (nextRequest == NULL) {
2026f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return true;
2027f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2028f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2029f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Create request to HAL
2030f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_capture_request_t request = camera3_capture_request_t();
20314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Vector<camera3_stream_buffer_t> outputBuffers;
2032f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2033f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Get the request ID, if any
2034f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    int requestId;
2035f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    camera_metadata_entry_t requestIdEntry =
2036f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            nextRequest->mSettings.find(ANDROID_REQUEST_ID);
2037f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (requestIdEntry.count > 0) {
2038f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        requestId = requestIdEntry.data.i32[0];
2039f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    } else {
2040f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGW("%s: Did not have android.request.id set in the request",
2041f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                __FUNCTION__);
2042f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        requestId = NAME_NOT_FOUND;
2043f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
2044f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
20454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Insert any queued triggers (before metadata is locked)
20464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    int32_t triggerCount;
20474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    res = insertTriggers(nextRequest);
20484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    if (res < 0) {
2049b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR("RequestThread: Unable to insert triggers "
2050b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                "(capture request %d, HAL device: %s (%d)",
2051b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                (mFrameNumber+1), strerror(-res), res);
20524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        cleanUpFailedRequest(request, nextRequest, outputBuffers);
20534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        return false;
20544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
20554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    triggerCount = res;
20564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
20574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    bool triggersMixedIn = (triggerCount > 0 || mPrevTriggers > 0);
20584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
20594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // If the request is the same as last, or we had triggers last time
20604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    if (mPrevRequest != nextRequest || triggersMixedIn) {
20614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        /**
20622f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala         * HAL workaround:
20632f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala         * Insert a dummy trigger ID if a trigger is set but no trigger ID is
20642f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala         */
20652f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        res = addDummyTriggerIds(nextRequest);
20662f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        if (res != OK) {
20672f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            SET_ERR("RequestThread: Unable to insert dummy trigger IDs "
20682f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala                    "(capture request %d, HAL device: %s (%d)",
20692f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala                    (mFrameNumber+1), strerror(-res), res);
20702f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            cleanUpFailedRequest(request, nextRequest, outputBuffers);
20712f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            return false;
20722f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        }
20732f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
20742f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        /**
20754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * The request should be presorted so accesses in HAL
20764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         *   are O(logn). Sidenote, sorting a sorted metadata is nop.
20774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
20784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        nextRequest->mSettings.sort();
2079f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.settings = nextRequest->mSettings.getAndLock();
2080f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mPrevRequest = nextRequest;
20814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ALOGVV("%s: Request settings are NEW", __FUNCTION__);
20824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
20834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        IF_ALOGV() {
20844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            camera_metadata_ro_entry_t e = camera_metadata_ro_entry_t();
20854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            find_camera_metadata_ro_entry(
20864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                    request.settings,
20874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                    ANDROID_CONTROL_AF_TRIGGER,
20884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                    &e
20894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            );
20904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            if (e.count > 0) {
20914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                ALOGV("%s: Request (frame num %d) had AF trigger 0x%x",
20924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      __FUNCTION__,
20934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      mFrameNumber+1,
20944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      e.data.u8[0]);
20954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            }
20964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
20974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    } else {
20984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // leave request.settings NULL to indicate 'reuse latest given'
20994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ALOGVV("%s: Request settings are REUSED",
21004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin               __FUNCTION__);
21014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
2102f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2103f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_stream_buffer_t inputBuffer;
2104f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2105f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Fill in buffers
2106f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2107f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (nextRequest->mInputStream != NULL) {
2108f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.input_buffer = &inputBuffer;
21095a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        res = nextRequest->mInputStream->getInputBuffer(&inputBuffer);
2110f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
211107d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala            ALOGE("RequestThread: Can't get input buffer, skipping request:"
2112f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    " %s (%d)", strerror(-res), res);
2113f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            cleanUpFailedRequest(request, nextRequest, outputBuffers);
2114f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return true;
2115f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
2116f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    } else {
2117f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.input_buffer = NULL;
2118f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2119f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2120f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    outputBuffers.insertAt(camera3_stream_buffer_t(), 0,
2121f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            nextRequest->mOutputStreams.size());
2122f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    request.output_buffers = outputBuffers.array();
2123f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < nextRequest->mOutputStreams.size(); i++) {
2124f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = nextRequest->mOutputStreams.editItemAt(i)->
2125f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                getBuffer(&outputBuffers.editItemAt(i));
2126f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
212707d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala            ALOGE("RequestThread: Can't get output buffer, skipping request:"
212807d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala                    " %s (%d)", strerror(-res), res);
2129f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            cleanUpFailedRequest(request, nextRequest, outputBuffers);
2130f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return true;
2131f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
2132f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.num_output_buffers++;
2133f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2134f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2135f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    request.frame_number = mFrameNumber++;
2136f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
213742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Log request in the in-flight queue
213842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    sp<Camera3Device> parent = mParent.promote();
213942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (parent == NULL) {
214042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        CLOGE("RequestThread: Parent is gone");
214142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        cleanUpFailedRequest(request, nextRequest, outputBuffers);
214242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        return false;
214342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    }
214442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
2145f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    res = parent->registerInFlight(request.frame_number, requestId,
214642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            request.num_output_buffers);
214742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (res != OK) {
214842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        SET_ERR("RequestThread: Unable to register new in-flight request:"
214942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                " %s (%d)", strerror(-res), res);
215042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        cleanUpFailedRequest(request, nextRequest, outputBuffers);
215142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        return false;
215242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    }
21534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2154cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He    // Inform waitUntilRequestProcessed thread of a new request ID
2155cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He    {
2156cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He        Mutex::Autolock al(mLatestRequestMutex);
2157cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He
2158cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He        mLatestRequestId = requestId;
2159cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He        mLatestRequestSignal.signal();
2160cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He    }
2161cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He
2162f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Submit request and block until ready for next one
216317a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_ASYNC_BEGIN("frame capture", request.frame_number);
216417a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_BEGIN("camera3->process_capture_request");
2165f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = mHal3Device->ops->process_capture_request(mHal3Device, &request);
216617a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_END();
216717a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala
2168f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (res != OK) {
2169b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR("RequestThread: Unable to submit capture request %d to HAL"
2170f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                " device: %s (%d)", request.frame_number, strerror(-res), res);
2171f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        cleanUpFailedRequest(request, nextRequest, outputBuffers);
2172f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return false;
2173f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2174f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
21751e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    // Update the latest request sent to HAL
21761e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    if (request.settings != NULL) { // Don't update them if they were unchanged
21771e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        Mutex::Autolock al(mLatestRequestMutex);
21781e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
21791e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        camera_metadata_t* cloned = clone_camera_metadata(request.settings);
21801e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        mLatestRequest.acquire(cloned);
21811e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    }
21821e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
2183f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (request.settings != NULL) {
2184f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest->mSettings.unlock(request.settings);
2185f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
21864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Remove any previously queued triggers (after unlock)
21884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    res = removeTriggers(mPrevRequest);
21894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    if (res != OK) {
2190b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR("RequestThread: Unable to remove triggers "
21914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              "(capture request %d, HAL device: %s (%d)",
21924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              request.frame_number, strerror(-res), res);
21934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        return false;
21944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
21954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    mPrevTriggers = triggerCount;
21964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21975a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    // Return input buffer back to framework
21985a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    if (request.input_buffer != NULL) {
21995a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        Camera3Stream *stream =
22005a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            Camera3Stream::cast(request.input_buffer->stream);
22015a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        res = stream->returnInputBuffer(*(request.input_buffer));
22025a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        // Note: stream may be deallocated at this point, if this buffer was the
22035a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        // last reference to it.
22045a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        if (res != OK) {
22055a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            ALOGE("%s: RequestThread: Can't return input buffer for frame %d to"
22065a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin                    "  its stream:%s (%d)",  __FUNCTION__,
22075a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin                    request.frame_number, strerror(-res), res);
22085a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            // TODO: Report error upstream
22095a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        }
22105a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    }
22115a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
2212f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return true;
2213f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
2214f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
22151e479c0f4cb3e2174dde0b02e5656fb658f73495Igor MurashkinCameraMetadata Camera3Device::RequestThread::getLatestRequest() const {
22161e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    Mutex::Autolock al(mLatestRequestMutex);
22171e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
22181e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    ALOGV("RequestThread::%s", __FUNCTION__);
22191e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
22201e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    return mLatestRequest;
22211e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin}
22221e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
2223f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::cleanUpFailedRequest(
2224f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_capture_request_t &request,
2225f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<CaptureRequest> &nextRequest,
2226f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Vector<camera3_stream_buffer_t> &outputBuffers) {
2227f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2228f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (request.settings != NULL) {
2229f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest->mSettings.unlock(request.settings);
2230f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2231f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (request.input_buffer != NULL) {
2232f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.input_buffer->status = CAMERA3_BUFFER_STATUS_ERROR;
22335a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        nextRequest->mInputStream->returnInputBuffer(*(request.input_buffer));
2234f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2235f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < request.num_output_buffers; i++) {
2236f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        outputBuffers.editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR;
2237f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest->mOutputStreams.editItemAt(i)->returnBuffer(
2238f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            outputBuffers[i], 0);
2239f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2240f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
2241f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2242f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest>
2243f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Camera3Device::RequestThread::waitForNextRequest() {
2244f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
2245f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> nextRequest;
2246f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2247f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Optimized a bit for the simple steady-state case (single repeating
2248f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // request), to avoid putting that request in the queue temporarily.
2249f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
2250f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2251f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    while (mRequestQueue.empty()) {
2252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (!mRepeatingRequests.empty()) {
2253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // Always atomically enqueue all requests in a repeating request
2254f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // list. Guarantees a complete in-sequence set of captures to
2255f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // application.
2256f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            const RequestList &requests = mRepeatingRequests;
2257f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            RequestList::const_iterator firstRequest =
2258f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    requests.begin();
2259f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            nextRequest = *firstRequest;
2260f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mRequestQueue.insert(mRequestQueue.end(),
2261f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    ++firstRequest,
2262f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    requests.end());
2263f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // No need to wait any longer
2264f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
2265f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
2266f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2267f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = mRequestSignal.waitRelative(mRequestLock, kRequestTimeout);
2268f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2269f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if ((mRequestQueue.empty() && mRepeatingRequests.empty()) ||
2270f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                exitPending()) {
2271f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            Mutex::Autolock pl(mPauseLock);
2272f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            if (mPaused == false) {
2273f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                ALOGV("%s: RequestThread: Going idle", __FUNCTION__);
2274f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                mPaused = true;
2275f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                // Let the tracker know
2276f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                sp<StatusTracker> statusTracker = mStatusTracker.promote();
2277f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                if (statusTracker != 0) {
2278f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE);
2279f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                }
2280f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            }
2281f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // Stop waiting for now and let thread management happen
2282f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return NULL;
2283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
2284f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2285f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2286f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (nextRequest == NULL) {
2287f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Don't have a repeating request already in hand, so queue
2288f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // must have an entry now.
2289f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList::iterator firstRequest =
2290f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                mRequestQueue.begin();
2291f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest = *firstRequest;
2292f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mRequestQueue.erase(firstRequest);
2293f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2294f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
229526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // In case we've been unpaused by setPaused clearing mDoPause, need to
229626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // update internal pause state (capture/setRepeatingRequest unpause
229726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // directly).
2298f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock pl(mPauseLock);
2299f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (mPaused) {
2300f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGV("%s: RequestThread: Unpaused", __FUNCTION__);
2301f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        sp<StatusTracker> statusTracker = mStatusTracker.promote();
2302f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (statusTracker != 0) {
2303f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            statusTracker->markComponentActive(mStatusId);
2304f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
2305f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
2306f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mPaused = false;
2307f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2308f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Check if we've reconfigured since last time, and reset the preview
2309f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // request if so. Can't use 'NULL request == repeat' across configure calls.
2310f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mReconfigured) {
2311f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mPrevRequest.clear();
2312f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mReconfigured = false;
2313f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2314f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2315f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return nextRequest;
2316f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
2317f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2318f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::waitIfPaused() {
2319f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
2320f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mPauseLock);
2321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    while (mDoPause) {
2322f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (mPaused == false) {
2323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mPaused = true;
2324f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            ALOGV("%s: RequestThread: Paused", __FUNCTION__);
2325f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            // Let the tracker know
2326f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            sp<StatusTracker> statusTracker = mStatusTracker.promote();
2327f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            if (statusTracker != 0) {
2328f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE);
2329f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            }
2330f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
2331f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
2332f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = mDoPauseSignal.waitRelative(mPauseLock, kRequestTimeout);
2333f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (res == TIMED_OUT || exitPending()) {
2334f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return true;
2335f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
2336f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2337f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // We don't set mPaused to false here, because waitForNextRequest needs
2338f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // to further manage the paused state in case of starvation.
2339f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return false;
2340f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
2341f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
234226fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvalavoid Camera3Device::RequestThread::unpauseForNewRequests() {
234326fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // With work to do, mark thread as unpaused.
234426fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // If paused by request (setPaused), don't resume, to avoid
234526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // extra signaling/waiting overhead to waitUntilPaused
2346f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mRequestSignal.signal();
234726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    Mutex::Autolock p(mPauseLock);
234826fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    if (!mDoPause) {
2349f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGV("%s: RequestThread: Going active", __FUNCTION__);
2350f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mPaused) {
2351f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            sp<StatusTracker> statusTracker = mStatusTracker.promote();
2352f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            if (statusTracker != 0) {
2353f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                statusTracker->markComponentActive(mStatusId);
2354f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            }
2355f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
235626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala        mPaused = false;
235726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    }
235826fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala}
235926fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala
2360b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::RequestThread::setErrorState(const char *fmt, ...) {
2361b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    sp<Camera3Device> parent = mParent.promote();
2362b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    if (parent != NULL) {
2363b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        va_list args;
2364b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        va_start(args, fmt);
2365b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
2366b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        parent->setErrorStateV(fmt, args);
2367b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
2368b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        va_end(args);
2369b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    }
2370b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala}
2371b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
23724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::insertTriggers(
23734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        const sp<CaptureRequest> &request) {
23744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
23754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Mutex::Autolock al(mTriggerMutex);
23764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
23774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    CameraMetadata &metadata = request->mSettings;
23784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    size_t count = mTriggerMap.size();
23794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
23804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    for (size_t i = 0; i < count; ++i) {
23814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger = mTriggerMap.valueAt(i);
23824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
23834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        uint32_t tag = trigger.metadataTag;
23844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        camera_metadata_entry entry = metadata.find(tag);
23854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
23864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (entry.count > 0) {
23874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            /**
23884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             * Already has an entry for this trigger in the request.
23894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             * Rewrite it with our requested trigger value.
23904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             */
23914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            RequestTrigger oldTrigger = trigger;
23924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
23934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            oldTrigger.entryValue = entry.data.u8[0];
23944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
23954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            mTriggerReplacedMap.add(tag, oldTrigger);
23964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        } else {
23974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            /**
23984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             * More typical, no trigger entry, so we just add it
23994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             */
24004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            mTriggerRemovedMap.add(tag, trigger);
24014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
24024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t res;
24044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        switch (trigger.getTagType()) {
24064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            case TYPE_BYTE: {
24074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue);
24084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                res = metadata.update(tag,
24094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      &entryValue,
24104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      /*count*/1);
24114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                break;
24124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            }
24134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            case TYPE_INT32:
24144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                res = metadata.update(tag,
24154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      &trigger.entryValue,
24164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      /*count*/1);
24174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                break;
24184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            default:
24194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                ALOGE("%s: Type not supported: 0x%x",
24204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      __FUNCTION__,
24214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      trigger.getTagType());
24224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                return INVALID_OPERATION;
24234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
24244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (res != OK) {
24264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ALOGE("%s: Failed to update request metadata with trigger tag %s"
24274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  ", value %d", __FUNCTION__, trigger.getTagName(),
24284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  trigger.entryValue);
24294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return res;
24304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
24314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ALOGV("%s: Mixed in trigger %s, value %d", __FUNCTION__,
24334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              trigger.getTagName(),
24344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              trigger.entryValue);
24354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
24364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    mTriggerMap.clear();
24384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return count;
24404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
24414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::removeTriggers(
24434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        const sp<CaptureRequest> &request) {
24444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Mutex::Autolock al(mTriggerMutex);
24454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    CameraMetadata &metadata = request->mSettings;
24474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
24494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Replace all old entries with their old values.
24504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
24514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    for (size_t i = 0; i < mTriggerReplacedMap.size(); ++i) {
24524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger = mTriggerReplacedMap.valueAt(i);
24534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t res;
24554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        uint32_t tag = trigger.metadataTag;
24574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        switch (trigger.getTagType()) {
24584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            case TYPE_BYTE: {
24594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue);
24604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                res = metadata.update(tag,
24614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      &entryValue,
24624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      /*count*/1);
24634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                break;
24644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            }
24654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            case TYPE_INT32:
24664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                res = metadata.update(tag,
24674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      &trigger.entryValue,
24684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      /*count*/1);
24694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                break;
24704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            default:
24714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                ALOGE("%s: Type not supported: 0x%x",
24724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      __FUNCTION__,
24734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      trigger.getTagType());
24744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                return INVALID_OPERATION;
24754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
24764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (res != OK) {
24784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ALOGE("%s: Failed to restore request metadata with trigger tag %s"
24794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  ", trigger value %d", __FUNCTION__,
24804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  trigger.getTagName(), trigger.entryValue);
24814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return res;
24824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
24834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
24844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    mTriggerReplacedMap.clear();
24854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
24874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Remove all new entries.
24884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
24894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    for (size_t i = 0; i < mTriggerRemovedMap.size(); ++i) {
24904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger = mTriggerRemovedMap.valueAt(i);
24914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t res = metadata.erase(trigger.metadataTag);
24924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
24934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (res != OK) {
24944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ALOGE("%s: Failed to erase metadata with trigger tag %s"
24954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  ", trigger value %d", __FUNCTION__,
24964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  trigger.getTagName(), trigger.entryValue);
24974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return res;
24984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
24994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
25004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    mTriggerRemovedMap.clear();
25014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return OK;
25034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
25044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25052f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvalastatus_t Camera3Device::RequestThread::addDummyTriggerIds(
25062f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        const sp<CaptureRequest> &request) {
25072f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    // Trigger ID 0 has special meaning in the HAL2 spec, so avoid it here
25082f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    static const int32_t dummyTriggerId = 1;
25092f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    status_t res;
25102f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
25112f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    CameraMetadata &metadata = request->mSettings;
25122f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
25132f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    // If AF trigger is active, insert a dummy AF trigger ID if none already
25142f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    // exists
25152f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    camera_metadata_entry afTrigger = metadata.find(ANDROID_CONTROL_AF_TRIGGER);
25162f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    camera_metadata_entry afId = metadata.find(ANDROID_CONTROL_AF_TRIGGER_ID);
25172f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    if (afTrigger.count > 0 &&
25182f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            afTrigger.data.u8[0] != ANDROID_CONTROL_AF_TRIGGER_IDLE &&
25192f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            afId.count == 0) {
25202f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        res = metadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, &dummyTriggerId, 1);
25212f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        if (res != OK) return res;
25222f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    }
25232f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
25242f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    // If AE precapture trigger is active, insert a dummy precapture trigger ID
25252f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    // if none already exists
25262f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    camera_metadata_entry pcTrigger =
25272f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER);
25282f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    camera_metadata_entry pcId = metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_ID);
25292f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    if (pcTrigger.count > 0 &&
25302f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            pcTrigger.data.u8[0] != ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE &&
25312f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            pcId.count == 0) {
25322f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        res = metadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID,
25332f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala                &dummyTriggerId, 1);
25342f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        if (res != OK) return res;
25352f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    }
25362f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
25372f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    return OK;
25382f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala}
25394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
25404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2541f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/**
25427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Static callback forwarding methods from HAL to instance
25437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */
25447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
25457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sProcessCaptureResult(const camera3_callback_ops *cb,
25467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const camera3_capture_result *result) {
25477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    Camera3Device *d =
25487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb));
25497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    d->processCaptureResult(result);
25507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
25517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
25527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sNotify(const camera3_callback_ops *cb,
25537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const camera3_notify_msg *msg) {
25547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    Camera3Device *d =
25557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb));
25567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    d->notify(msg);
25577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
25587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
25597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android
2560