Camera3Device.cpp revision 07d2169d46f3536add6044dbf106967a1982252f
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
407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Log.h>
417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Trace.h>
427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Timers.h>
437b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
447b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3Device.h"
457b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3OutputStream.h"
467b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3InputStream.h"
477b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3ZslStream.h"
487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
49f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalausing namespace android::camera3;
507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
51f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalanamespace android {
527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville TalvalaCamera3Device::Camera3Device(int id):
547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        mId(id),
55f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mHal3Device(NULL),
567d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        mStatus(STATUS_UNINITIALIZED),
5742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        mNextResultFrameNumber(0),
5842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        mNextShutterFrameNumber(0),
597d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        mListener(NULL)
607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{
617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    camera3_callback_ops::notify = &sNotify;
637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    camera3_callback_ops::process_capture_result = &sProcessCaptureResult;
647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ALOGV("%s: Created device for camera %d", __FUNCTION__, id);
657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville TalvalaCamera3Device::~Camera3Device()
687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{
697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ALOGV("%s: Tearing down for camera id %d", __FUNCTION__, mId);
717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    disconnect();
727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7471381051e2d048b2705c447b3d59db6e972493eeIgor Murashkinint Camera3Device::getId() const {
7571381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin    return mId;
7671381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin}
7771381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin
78f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/**
79f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * CameraDeviceBase interface
80f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */
81f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::initialize(camera_module_t *module)
837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{
847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
85f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
86f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
87f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ALOGV("%s: Initializing device for camera %d", __FUNCTION__, mId);
89f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mStatus != STATUS_UNINITIALIZED) {
90b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Already initialized!");
917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return INVALID_OPERATION;
927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Open HAL device */
957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    status_t res;
977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    String8 deviceName = String8::format("%d", mId);
987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    camera3_device_t *device;
1007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = module->common.methods->open(&module->common, deviceName.string(),
1027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            reinterpret_cast<hw_device_t**>(&device));
1037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (res != OK) {
105b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Could not open camera: %s (%d)", strerror(-res), res);
1067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return res;
1077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Cross-check device version */
1107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (device->common.version != CAMERA_DEVICE_API_VERSION_3_0) {
112b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Could not open camera: "
1137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala                "Camera device is not version %x, reports %x instead",
114b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                CAMERA_DEVICE_API_VERSION_3_0,
1157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala                device->common.version);
1167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        device->common.close(&device->common);
1177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return BAD_VALUE;
1187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    camera_info info;
1217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = module->get_camera_info(mId, &info);
1227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (res != OK) return res;
1237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (info.device_version != device->common.version) {
125b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("HAL reporting mismatched camera_info version (%x)"
126b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                " and device version (%x).",
1277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala                device->common.version, info.device_version);
1287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        device->common.close(&device->common);
1297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return BAD_VALUE;
1307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Initialize device with callback functions */
1337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
13417a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_BEGIN("camera3->initialize");
1357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = device->ops->initialize(device, this);
13617a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_END();
13717a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala
1387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (res != OK) {
139b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Unable to initialize HAL device: %s (%d)",
140b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                strerror(-res), res);
1417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        device->common.close(&device->common);
1427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return BAD_VALUE;
1437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Get vendor metadata tags */
1467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    mVendorTagOps.get_camera_vendor_section_name = NULL;
1487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
14917a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_BEGIN("camera3->get_metadata_vendor_tag_ops");
1507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    device->ops->get_metadata_vendor_tag_ops(device, &mVendorTagOps);
15117a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_END();
1527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (mVendorTagOps.get_camera_vendor_section_name != NULL) {
1547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        res = set_camera_metadata_vendor_tag_ops(&mVendorTagOps);
1557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        if (res != OK) {
156b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unable to set tag ops: %s (%d)",
157b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    strerror(-res), res);
1587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            device->common.close(&device->common);
1597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            return res;
1607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        }
1617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
163f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /** Start up status tracker thread */
164f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mStatusTracker = new StatusTracker(this);
165f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    res = mStatusTracker->run(String8::format("C3Dev-%d-Status", mId).string());
166f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (res != OK) {
167f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        SET_ERR_L("Unable to start status tracking thread: %s (%d)",
168f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                strerror(-res), res);
169f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        device->common.close(&device->common);
170f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatusTracker.clear();
171f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        return res;
172f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
173f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Start up request queue thread */
1757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
176f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mRequestThread = new RequestThread(this, mStatusTracker, device);
177f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = mRequestThread->run(String8::format("C3Dev-%d-ReqQueue", mId).string());
1787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (res != OK) {
179b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Unable to start request queue thread: %s (%d)",
180b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                strerror(-res), res);
1817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        device->common.close(&device->common);
182f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mRequestThread.clear();
1837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return res;
1847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Everything is good to go */
1877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    mDeviceInfo = info.static_camera_characteristics;
1897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    mHal3Device = device;
190f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mStatus = STATUS_UNCONFIGURED;
191f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mNextStreamId = 0;
192ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    mNeedConfig = true;
193f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mPauseStateNotify = false;
1947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return OK;
1967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
1977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::disconnect() {
1997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
200f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
2017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
202f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
203f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
204214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala    status_t res = OK;
205f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
206f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    {
207f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        Mutex::Autolock l(mLock);
208f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mStatus == STATUS_UNINITIALIZED) return res;
209f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
210f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mStatus == STATUS_ACTIVE ||
211f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                (mStatus == STATUS_ERROR && mRequestThread != NULL)) {
212f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            res = mRequestThread->clearRepeatingRequests();
213214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala            if (res != OK) {
214f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                SET_ERR_L("Can't stop streaming");
215214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala                // Continue to close device even in case of error
216f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            } else {
217f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout);
218f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                if (res != OK) {
219f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    SET_ERR_L("Timeout waiting for HAL to drain");
220f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    // Continue to close device even in case of error
221f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                }
222214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala            }
223f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
224f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
225f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mStatus == STATUS_ERROR) {
226f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            CLOGE("Shutting down in an error state");
227f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
228f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
229f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mStatusTracker != NULL) {
230f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mStatusTracker->requestExit();
231f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
232f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
233f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mRequestThread != NULL) {
234f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mRequestThread->requestExit();
235f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
236f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
237f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mOutputStreams.clear();
238f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mInputStream.clear();
239f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
240f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
241f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Joining done without holding mLock, otherwise deadlocks may ensue
242f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // as the threads try to access parent state
243f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (mRequestThread != NULL && mStatus != STATUS_ERROR) {
244f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // HAL may be in a bad state, so waiting for request thread
245f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // (which may be stuck in the HAL processCaptureRequest call)
246f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // could be dangerous.
247f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mRequestThread->join();
248214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala    }
249214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala
250f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (mStatusTracker != NULL) {
251f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatusTracker->join();
252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
254f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    {
255f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        Mutex::Autolock l(mLock);
256f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
257f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mRequestThread.clear();
258f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatusTracker.clear();
259f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
260f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mHal3Device != NULL) {
261f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mHal3Device->common.close(&mHal3Device->common);
262f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mHal3Device = NULL;
263f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
264f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
265f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatus = STATUS_UNINITIALIZED;
266f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
267f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
268f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ALOGV("%s: X", __FUNCTION__);
269214a17fd37ef85fc841d3157b1e9096e1aa1b42fEino-Ville Talvala    return res;
2707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
2717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
272f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// For dumping/debugging only -
273f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// try to acquire a lock a few times, eventually give up to proceed with
274f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// debug/dump operations
275f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalabool Camera3Device::tryLockSpinRightRound(Mutex& lock) {
276f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool gotLock = false;
277f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    for (size_t i = 0; i < kDumpLockAttempts; ++i) {
278f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (lock.tryLock() == NO_ERROR) {
279f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            gotLock = true;
280f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            break;
281f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        } else {
282f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            usleep(kDumpSleepDuration);
283f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
284f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
285f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return gotLock;
286f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
287f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
2887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::dump(int fd, const Vector<String16> &args) {
2897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
2907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    (void)args;
291f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
292f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Try to lock, but continue in case of failure (to avoid blocking in
293f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // deadlocks)
294f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool gotInterfaceLock = tryLockSpinRightRound(mInterfaceLock);
295f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool gotLock = tryLockSpinRightRound(mLock);
296f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
297f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGW_IF(!gotInterfaceLock,
298f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            "Camera %d: %s: Unable to lock interface lock, proceeding anyway",
299f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mId, __FUNCTION__);
300f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGW_IF(!gotLock,
301f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            "Camera %d: %s: Unable to lock main lock, proceeding anyway",
302f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mId, __FUNCTION__);
303f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
304f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    String8 lines;
305f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
306f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    const char *status =
307f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus == STATUS_ERROR         ? "ERROR" :
308f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus == STATUS_UNINITIALIZED ? "UNINITIALIZED" :
309f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mStatus == STATUS_UNCONFIGURED  ? "UNCONFIGURED" :
310f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mStatus == STATUS_CONFIGURED    ? "CONFIGURED" :
311f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus == STATUS_ACTIVE        ? "ACTIVE" :
312f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            "Unknown";
313f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
314f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    lines.appendFormat("    Device status: %s\n", status);
315b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    if (mStatus == STATUS_ERROR) {
316b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        lines.appendFormat("    Error cause: %s\n", mErrorCause.string());
317b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    }
318f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    lines.appendFormat("    Stream configuration:\n");
319f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
320f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mInputStream != NULL) {
321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        write(fd, lines.string(), lines.size());
322f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mInputStream->dump(fd, args);
323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    } else {
324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        lines.appendFormat("      No input stream.\n");
325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        write(fd, lines.string(), lines.size());
326f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
327f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < mOutputStreams.size(); i++) {
328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mOutputStreams[i]->dump(fd,args);
329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
3307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
33142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    lines = String8("    In-flight requests:\n");
33242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (mInFlightMap.size() == 0) {
33342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        lines.append("      None\n");
33442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    } else {
33542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        for (size_t i = 0; i < mInFlightMap.size(); i++) {
33642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            InFlightRequest r = mInFlightMap.valueAt(i);
33742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            lines.appendFormat("      Frame %d |  Timestamp: %lld, metadata"
33842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    " arrived: %s, buffers left: %d\n", mInFlightMap.keyAt(i),
33942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    r.captureTimestamp, r.haveResultMetadata ? "true" : "false",
34042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    r.numBuffersLeft);
34142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
34242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    }
34342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    write(fd, lines.string(), lines.size());
34442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
3451e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    {
3461e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        lines = String8("    Last request sent:\n");
3471e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        write(fd, lines.string(), lines.size());
3481e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
349f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        CameraMetadata lastRequest = getLatestRequestLocked();
3501e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        lastRequest.dump(fd, /*verbosity*/2, /*indentation*/6);
3511e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    }
3521e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
353f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mHal3Device != NULL) {
35442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        lines = String8("    HAL device dump:\n");
355f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        write(fd, lines.string(), lines.size());
356f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mHal3Device->ops->dump(mHal3Device, fd);
357f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
3587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
359f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (gotLock) mLock.unlock();
360f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (gotInterfaceLock) mInterfaceLock.unlock();
361f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
3627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return OK;
3637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
3647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaconst CameraMetadata& Camera3Device::info() const {
3667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ALOGVV("%s: E", __FUNCTION__);
367f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (CC_UNLIKELY(mStatus == STATUS_UNINITIALIZED ||
368f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    mStatus == STATUS_ERROR)) {
369b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        ALOGW("%s: Access to static info %s!", __FUNCTION__,
370f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                mStatus == STATUS_ERROR ?
371f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                "when in error state" : "before init");
372f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
3737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return mDeviceInfo;
3747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
3757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::capture(CameraMetadata &request) {
3777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
378f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t res;
379f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
380f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
381f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
3824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // TODO: take ownership of the request
3834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
384f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
385f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
386b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
387f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
388f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
389b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device not initialized");
390f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
391f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
392f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            // May be lazily configuring streams, will check during setup
393f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
394f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
395f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
398b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
399f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
4017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> newRequest = setUpRequestLocked(request);
403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (newRequest == NULL) {
404b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Can't create capture request");
405f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return BAD_VALUE;
406f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
407f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
408f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    res = mRequestThread->queueRequest(newRequest);
409f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (res == OK) {
410f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        waitUntilStateThenRelock(/*active*/ true, kActiveTimeout);
411f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (res != OK) {
412f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            SET_ERR_L("Can't transition to active in %f seconds!",
413f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    kActiveTimeout/1e9);
414f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
415f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGV("Camera %d: Capture request enqueued", mId);
416f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
417f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return res;
4187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
4197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setStreamingRequest(const CameraMetadata &request) {
4227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
423f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t res;
424f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
425f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
426f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
427f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
428f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
429b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
430f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
431f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
432b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device not initialized");
433f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
434f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
435f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            // May be lazily configuring streams, will check during setup
436f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
437f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
438f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
439f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
440f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
441b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
442f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
443f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
4447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
445f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> newRepeatingRequest = setUpRequestLocked(request);
446f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (newRepeatingRequest == NULL) {
447b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Can't create repeating request");
448f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return BAD_VALUE;
449f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
450f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
451f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    RequestList newRepeatingRequests;
452f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    newRepeatingRequests.push_back(newRepeatingRequest);
453f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
454f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    res = mRequestThread->setRepeatingRequests(newRepeatingRequests);
455f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (res == OK) {
456f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        waitUntilStateThenRelock(/*active*/ true, kActiveTimeout);
457f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (res != OK) {
458f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            SET_ERR_L("Can't transition to active in %f seconds!",
459f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    kActiveTimeout/1e9);
460f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
461f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGV("Camera %d: Repeating request set", mId);
462f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
463f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return res;
464f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
465f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
466f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
467f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::setUpRequestLocked(
468f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        const CameraMetadata &request) {
469f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
470f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
471f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (mStatus == STATUS_UNCONFIGURED || mNeedConfig) {
472f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = configureStreamsLocked();
473f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
474b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Can't set up streams: %s (%d)", strerror(-res), res);
475f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return NULL;
476f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
477f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mStatus == STATUS_UNCONFIGURED) {
478f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            CLOGE("No streams configured");
479f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            return NULL;
480f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
481f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
482f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
483f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> newRequest = createCaptureRequest(request);
484f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return newRequest;
4857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
4867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::clearStreamingRequest() {
4887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
489f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
490f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
491f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
492f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
493f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
494b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
495f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
496f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
497b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device not initialized");
498f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
499f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
500f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
501f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
502f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
503f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
504f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
505b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
506f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
507f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
508f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Clearing repeating request", mId);
509f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return mRequestThread->clearRepeatingRequests();
5107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
5117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) {
5137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
514f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
5157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return mRequestThread->waitUntilRequestProcessed(requestId, timeout);
5177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
5187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5195a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Device::createInputStream(
5205a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        uint32_t width, uint32_t height, int format, int *id) {
5215a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    ATRACE_CALL();
522f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
5235a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    Mutex::Autolock l(mLock);
524f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Creating new input stream %d: %d x %d, format %d",
525f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mId, mNextStreamId, width, height, format);
5265a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5275a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    status_t res;
5285a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    bool wasActive = false;
5295a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5305a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    switch (mStatus) {
5315a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        case STATUS_ERROR:
5325a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            ALOGE("%s: Device has encountered a serious error", __FUNCTION__);
5335a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            return INVALID_OPERATION;
5345a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        case STATUS_UNINITIALIZED:
5355a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            ALOGE("%s: Device not initialized", __FUNCTION__);
5365a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            return INVALID_OPERATION;
537f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
538f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
5395a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            // OK
5405a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            break;
5415a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        case STATUS_ACTIVE:
5425a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__);
543f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            res = internalPauseAndWaitLocked();
5445a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            if (res != OK) {
545f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                SET_ERR_L("Can't pause captures to reconfigure streams!");
5465a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin                return res;
5475a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            }
5485a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            wasActive = true;
5495a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            break;
5505a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        default:
551f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            SET_ERR_L("%s: Unexpected status: %d", mStatus);
5525a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            return INVALID_OPERATION;
5535a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    }
554f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    assert(mStatus != STATUS_ACTIVE);
5555a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5565a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    if (mInputStream != 0) {
5575a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__);
5585a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        return INVALID_OPERATION;
5595a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    }
5605a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5615a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    sp<Camera3InputStream> newStream = new Camera3InputStream(mNextStreamId,
5625a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin                width, height, format);
563f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    newStream->setStatusTracker(mStatusTracker);
5645a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5655a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    mInputStream = newStream;
5665a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5675a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    *id = mNextStreamId++;
5685a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5695a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    // Continue captures if active at start
5705a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    if (wasActive) {
5715a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__);
5725a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        res = configureStreamsLocked();
5735a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        if (res != OK) {
5745a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)",
5755a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin                    __FUNCTION__, mNextStreamId, strerror(-res), res);
5765a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            return res;
5775a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        }
578f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        internalResumeLocked();
5795a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    }
5805a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
581f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Created input stream", mId);
5825a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    return OK;
5835a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin}
5845a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
5852fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
5862fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinstatus_t Camera3Device::createZslStream(
5872fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            uint32_t width, uint32_t height,
5882fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            int depth,
5892fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            /*out*/
5902fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            int *id,
5912fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            sp<Camera3ZslStream>* zslStream) {
5922fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    ATRACE_CALL();
593f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
5942fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    Mutex::Autolock l(mLock);
595f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Creating ZSL stream %d: %d x %d, depth %d",
596f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mId, mNextStreamId, width, height, depth);
5972fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
5982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    status_t res;
5992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    bool wasActive = false;
6002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    switch (mStatus) {
6022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        case STATUS_ERROR:
6032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            ALOGE("%s: Device has encountered a serious error", __FUNCTION__);
6042fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            return INVALID_OPERATION;
6052fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        case STATUS_UNINITIALIZED:
6062fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            ALOGE("%s: Device not initialized", __FUNCTION__);
6072fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            return INVALID_OPERATION;
608f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
609f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
6102fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            // OK
6112fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            break;
6122fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        case STATUS_ACTIVE:
6132fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__);
614f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            res = internalPauseAndWaitLocked();
6152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            if (res != OK) {
616f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                SET_ERR_L("Can't pause captures to reconfigure streams!");
6172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                return res;
6182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            }
6192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            wasActive = true;
6202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            break;
6212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        default:
622f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
6232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            return INVALID_OPERATION;
6242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    }
625f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    assert(mStatus != STATUS_ACTIVE);
6262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    if (mInputStream != 0) {
6282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__);
6292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        return INVALID_OPERATION;
6302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    }
6312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    sp<Camera3ZslStream> newStream = new Camera3ZslStream(mNextStreamId,
6332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                width, height, depth);
634f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    newStream->setStatusTracker(mStatusTracker);
6352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    res = mOutputStreams.add(mNextStreamId, newStream);
6372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    if (res < 0) {
6382fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        ALOGE("%s: Can't add new stream to set: %s (%d)",
6392fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                __FUNCTION__, strerror(-res), res);
6402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        return res;
6412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    }
6422fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    mInputStream = newStream;
6432fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6442fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    *id = mNextStreamId++;
6452fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    *zslStream = newStream;
6462fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    // Continue captures if active at start
6482fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    if (wasActive) {
6492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__);
6502fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        res = configureStreamsLocked();
6512fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        if (res != OK) {
6522fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)",
6532fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                    __FUNCTION__, mNextStreamId, strerror(-res), res);
6542fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            return res;
6552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        }
656f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        internalResumeLocked();
6572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    }
6582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
659f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Created ZSL stream", mId);
6602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    return OK;
6612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin}
6622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
6637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createStream(sp<ANativeWindow> consumer,
6647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        uint32_t width, uint32_t height, int format, size_t size, int *id) {
6657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
666f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
667f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
668f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Creating new stream %d: %d x %d, format %d, size %d",
669f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            mId, mNextStreamId, width, height, format, size);
6707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
671f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
672f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    bool wasActive = false;
673f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
674f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
675f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
676b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
677f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
678f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
679b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device not initialized");
680f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
681f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
682f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
683f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
684f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
685f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
686f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__);
687f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            res = internalPauseAndWaitLocked();
688f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            if (res != OK) {
689f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                SET_ERR_L("Can't pause captures to reconfigure streams!");
690f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                return res;
691f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            }
692f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            wasActive = true;
693f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
694f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
695b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
696f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
697f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
698f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    assert(mStatus != STATUS_ACTIVE);
699f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
700f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<Camera3OutputStream> newStream;
701f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (format == HAL_PIXEL_FORMAT_BLOB) {
702f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newStream = new Camera3OutputStream(mNextStreamId, consumer,
703f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                width, height, size, format);
704f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    } else {
705f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newStream = new Camera3OutputStream(mNextStreamId, consumer,
706f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                width, height, format);
707f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
708f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    newStream->setStatusTracker(mStatusTracker);
709f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
710f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = mOutputStreams.add(mNextStreamId, newStream);
711f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (res < 0) {
712b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Can't add new stream to set: %s (%d)", strerror(-res), res);
713f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return res;
714f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
715f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
716f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    *id = mNextStreamId++;
717ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    mNeedConfig = true;
718f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
719f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Continue captures if active at start
720f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (wasActive) {
721f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__);
722f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = configureStreamsLocked();
723f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
724b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Can't reconfigure device for new stream %d: %s (%d)",
725b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    mNextStreamId, strerror(-res), res);
726f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return res;
727f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
728f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        internalResumeLocked();
729f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
730f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("Camera %d: Created new stream", mId);
731f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
7327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
7337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createReprocessStreamFromStream(int outputId, int *id) {
7357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
7367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    (void)outputId; (void)id;
7377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
738b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    CLOGE("Unimplemented");
7397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return INVALID_OPERATION;
7407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
7417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::getStreamInfo(int id,
7447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        uint32_t *width, uint32_t *height, uint32_t *format) {
7457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
746f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
747f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
748f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
749f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
750f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
751b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
752f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
753f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
754b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device not initialized!");
755f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
756f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
757f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
758f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
759f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
760f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
761f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
762b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
763f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
764f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
7657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
766f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ssize_t idx = mOutputStreams.indexOfKey(id);
767f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (idx == NAME_NOT_FOUND) {
768b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Stream %d is unknown", id);
769f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return idx;
770f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
771f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
772f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (width) *width  = mOutputStreams[idx]->getWidth();
773f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (height) *height = mOutputStreams[idx]->getHeight();
774f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (format) *format = mOutputStreams[idx]->getFormat();
775f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
776f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
7777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
7787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setStreamTransform(int id,
7807fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        int transform) {
7817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
782f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
783f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
784f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
785f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
786f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
787b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
788f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
789f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
790b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device not initialized");
791f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
792f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
793f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
794f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
795f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
796f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
797f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
798b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
799f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
800f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
8017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
802f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ssize_t idx = mOutputStreams.indexOfKey(id);
803f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (idx == NAME_NOT_FOUND) {
804b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Stream %d does not exist",
805b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                id);
806f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return BAD_VALUE;
807f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
808f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
809f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return mOutputStreams.editValueAt(idx)->setTransform(transform);
8107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
8117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteStream(int id) {
8137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
814f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
815f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
816f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
8177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
818e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin    ALOGV("%s: Camera %d: Deleting stream %d", __FUNCTION__, mId, id);
819e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin
820f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // CameraDevice semantics require device to already be idle before
821f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // deleteStream is called, unlike for createStream.
822f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (mStatus == STATUS_ACTIVE) {
8235282713a976184e41451315f1286d8075b257d58Igor Murashkin        ALOGV("%s: Camera %d: Device not idle", __FUNCTION__, mId);
8245282713a976184e41451315f1286d8075b257d58Igor Murashkin        return -EBUSY;
825f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
826f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
8272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    sp<Camera3StreamInterface> deletedStream;
828f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mInputStream != NULL && id == mInputStream->getId()) {
829f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        deletedStream = mInputStream;
830f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mInputStream.clear();
831f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    } else {
832f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ssize_t idx = mOutputStreams.indexOfKey(id);
833f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (idx == NAME_NOT_FOUND) {
834b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Stream %d does not exist", id);
835f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return BAD_VALUE;
836f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
837f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        deletedStream = mOutputStreams.editValueAt(idx);
838f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mOutputStreams.removeItem(id);
839f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
840f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
841f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Free up the stream endpoint so that it can be used by some other stream
842f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = deletedStream->disconnect();
843f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (res != OK) {
844b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Can't disconnect deleted stream %d", id);
845f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // fall through since we want to still list the stream as deleted.
846f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
847f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mDeletedStreams.add(deletedStream);
848ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    mNeedConfig = true;
849f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
850f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return res;
8517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
8527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteReprocessStream(int id) {
8547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
8557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    (void)id;
8567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
857b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    CLOGE("Unimplemented");
8587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return INVALID_OPERATION;
8597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
8607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createDefaultRequest(int templateId,
8637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        CameraMetadata *request) {
8647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
865fe7e0c6154309f2491463ee6ca4920d225289638Alex Ray    ALOGV("%s: for template %d", __FUNCTION__, templateId);
866f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
867f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
868f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
869f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
870f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
871b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device has encountered a serious error");
872f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
873f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
874b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Device is not initialized!");
875f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
876f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
877f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
878f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
879f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
880f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
881f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
882b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d", mStatus);
883f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
884f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
8857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    const camera_metadata_t *rawRequest;
88717a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_BEGIN("camera3->construct_default_request_settings");
8887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    rawRequest = mHal3Device->ops->construct_default_request_settings(
8897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        mHal3Device, templateId);
89017a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_END();
891b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    if (rawRequest == NULL) {
892b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("HAL is unable to construct default settings for template %d",
893b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                templateId);
894b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        return DEAD_OBJECT;
895b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    }
8967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    *request = rawRequest;
8977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return OK;
8997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
9007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
9017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilDrained() {
9027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
903f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
904f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
9057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
906f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
907f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
908f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_UNCONFIGURED:
909f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGV("%s: Already idle", __FUNCTION__);
910f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return OK;
911f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case STATUS_CONFIGURED:
912f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            // To avoid race conditions, check with tracker to be sure
913f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
914f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
915f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            // Need to verify shut down
916f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
917f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
918b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Unexpected status: %d",mStatus);
919f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
920f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
921f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
922f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("%s: Camera %d: Waiting until idle", __FUNCTION__, mId);
923f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout);
924f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return res;
925f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
926f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
927f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// Pause to reconfigure
928f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::internalPauseAndWaitLocked() {
929f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mRequestThread->setPaused(true);
930f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mPauseStateNotify = true;
931f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
932f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("%s: Camera %d: Internal wait until idle", __FUNCTION__, mId);
933f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t res = waitUntilStateThenRelock(/*active*/ false, kShutdownTimeout);
934f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (res != OK) {
935f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        SET_ERR_L("Can't idle device in %f seconds!",
936f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                kShutdownTimeout/1e9);
937f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
938f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
939f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return res;
940f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
941f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
942f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala// Resume after internalPauseAndWaitLocked
943f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::internalResumeLocked() {
944f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t res;
945f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
946f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mRequestThread->setPaused(false);
947f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
948f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    res = waitUntilStateThenRelock(/*active*/ true, kActiveTimeout);
949f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (res != OK) {
950f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        SET_ERR_L("Can't transition to active in %f seconds!",
951f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                kActiveTimeout/1e9);
952f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
953f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mPauseStateNotify = false;
954f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return OK;
955f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
956f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
957f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Device::waitUntilStateThenRelock(bool active,
958f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        nsecs_t timeout) {
959f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t res = OK;
960f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (active == (mStatus == STATUS_ACTIVE)) {
961f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Desired state already reached
962f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        return res;
963f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
964f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
965f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool stateSeen = false;
966f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    do {
967f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mRecentStatusUpdates.clear();
968f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
969f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        res = mStatusChanged.waitRelative(mLock, timeout);
970f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (res != OK) break;
971f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
972f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Check state change history during wait
973f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        for (size_t i = 0; i < mRecentStatusUpdates.size(); i++) {
974f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            if (active == (mRecentStatusUpdates[i] == STATUS_ACTIVE) ) {
975f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                stateSeen = true;
976f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                break;
977f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            }
978f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
979f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    } while (!stateSeen);
980f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
981f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return res;
9827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
9837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
984f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
9857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setNotifyCallback(NotificationListener *listener) {
9867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
9877d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex::Autolock l(mOutputLock);
9887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
9897d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    if (listener != NULL && mListener != NULL) {
9907d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        ALOGW("%s: Replacing old callback listener", __FUNCTION__);
9917d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
9927d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    mListener = listener;
9937d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
9947d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    return OK;
9957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
9967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
99746910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvalabool Camera3Device::willNotify3A() {
99846910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    return false;
99946910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala}
100046910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala
10017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitForNextFrame(nsecs_t timeout) {
10027d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    ATRACE_CALL();
10037d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    status_t res;
10047d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex::Autolock l(mOutputLock);
10057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10067d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    while (mResultQueue.empty()) {
10077d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        res = mResultSignal.waitRelative(mOutputLock, timeout);
10087d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (res == TIMED_OUT) {
10097d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            return res;
10107d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        } else if (res != OK) {
1011b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            ALOGW("%s: Camera %d: No frame in %lld ns: %s (%d)",
1012b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    __FUNCTION__, mId, timeout, strerror(-res), res);
10137d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            return res;
10147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
10157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
10167d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    return OK;
10177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
10187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::getNextFrame(CameraMetadata *frame) {
10207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
10217d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex::Autolock l(mOutputLock);
10227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10237d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    if (mResultQueue.empty()) {
10247d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        return NOT_ENOUGH_DATA;
10257d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
10267d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
10277d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    CameraMetadata &result = *(mResultQueue.begin());
10287d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    frame->acquire(result);
10297d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    mResultQueue.erase(mResultQueue.begin());
10307d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
10317d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    return OK;
10327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
10337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerAutofocus(uint32_t id) {
10357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
1036f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
10377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id);
10394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Mix-in this trigger into the next request and only the next request.
10404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    RequestTrigger trigger[] = {
10414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
10424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER,
10434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER_START
10444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
10454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
10464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER_ID,
10474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            static_cast<int32_t>(id)
10484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
10494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
10504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
10514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return mRequestThread->queueTrigger(trigger,
10524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                        sizeof(trigger)/sizeof(trigger[0]));
10537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
10547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerCancelAutofocus(uint32_t id) {
10567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
1057f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
10587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    ALOGV("%s: Triggering cancel autofocus, id %d", __FUNCTION__, id);
10604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Mix-in this trigger into the next request and only the next request.
10614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    RequestTrigger trigger[] = {
10624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
10634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER,
10644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER_CANCEL
10654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
10664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
10674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER_ID,
10684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            static_cast<int32_t>(id)
10694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
10704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
10714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
10724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return mRequestThread->queueTrigger(trigger,
10734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                        sizeof(trigger)/sizeof(trigger[0]));
10747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
10757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerPrecaptureMetering(uint32_t id) {
10777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
1078f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
10797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id);
10814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Mix-in this trigger into the next request and only the next request.
10824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    RequestTrigger trigger[] = {
10834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
10844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,
10854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START
10864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
10874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
10884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AE_PRECAPTURE_ID,
10894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            static_cast<int32_t>(id)
10904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
10914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
10924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
10934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return mRequestThread->queueTrigger(trigger,
10944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                        sizeof(trigger)/sizeof(trigger[0]));
10957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
10967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::pushReprocessBuffer(int reprocessStreamId,
10987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        buffer_handle_t *buffer, wp<BufferReleasedListener> listener) {
10997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
11007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    (void)reprocessStreamId; (void)buffer; (void)listener;
11017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1102b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    CLOGE("Unimplemented");
11037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return INVALID_OPERATION;
11047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
11057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1106abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvalastatus_t Camera3Device::flush() {
1107abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    ATRACE_CALL();
1108abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    ALOGV("%s: Camera %d: Flushing all requests", __FUNCTION__, mId);
1109f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex::Autolock il(mInterfaceLock);
1110abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    Mutex::Autolock l(mLock);
1111abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
1112abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    mRequestThread->clear();
1113abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    return mHal3Device->ops->flush(mHal3Device);
1114abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala}
1115abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
1116f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/**
1117f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Methods called by subclasses
1118f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */
1119f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1120f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid Camera3Device::notifyStatus(bool idle) {
1121f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    {
1122f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Need mLock to safely update state and synchronize to current
1123f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // state of methods in flight.
1124f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        Mutex::Autolock l(mLock);
1125f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // We can get various system-idle notices from the status tracker
1126f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // while starting up. Only care about them if we've actually sent
1127f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // in some requests recently.
1128f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mStatus != STATUS_ACTIVE && mStatus != STATUS_CONFIGURED) {
1129f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            return;
1130f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
1131f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGV("%s: Camera %d: Now %s", __FUNCTION__, mId,
1132f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                idle ? "idle" : "active");
1133f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatus = idle ? STATUS_CONFIGURED : STATUS_ACTIVE;
1134f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mRecentStatusUpdates.add(mStatus);
1135f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatusChanged.signal();
1136f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1137f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Skip notifying listener if we're doing some user-transparent
1138f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // state changes
1139f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mPauseStateNotify) return;
1140f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
1141f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    NotificationListener *listener;
1142f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    {
1143f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        Mutex::Autolock l(mOutputLock);
1144f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        listener = mListener;
1145f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
1146f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (idle && listener != NULL) {
1147f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        listener->notifyIdle();
1148f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
1149f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
1150f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1151f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala/**
1152f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera3Device private methods
1153f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */
1154f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1155f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::createCaptureRequest(
1156f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        const CameraMetadata &request) {
1157f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ATRACE_CALL();
1158f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
1159f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1160f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> newRequest = new CaptureRequest;
1161f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    newRequest->mSettings = request;
1162f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1163f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera_metadata_entry_t inputStreams =
1164f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            newRequest->mSettings.find(ANDROID_REQUEST_INPUT_STREAMS);
1165f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (inputStreams.count > 0) {
1166f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (mInputStream == NULL ||
1167d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He                mInputStream->getId() != inputStreams.data.i32[0]) {
1168b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Request references unknown input stream %d",
1169b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    inputStreams.data.u8[0]);
1170f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return NULL;
1171f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1172f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Lazy completion of stream configuration (allocation/registration)
1173f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // on first use
1174f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (mInputStream->isConfiguring()) {
1175f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            res = mInputStream->finishConfiguration(mHal3Device);
1176f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            if (res != OK) {
1177b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                SET_ERR_L("Unable to finish configuring input stream %d:"
1178f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                        " %s (%d)",
1179b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                        mInputStream->getId(), strerror(-res), res);
1180f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                return NULL;
1181f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            }
1182f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1183f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1184f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newRequest->mInputStream = mInputStream;
1185f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newRequest->mSettings.erase(ANDROID_REQUEST_INPUT_STREAMS);
1186f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1187f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1188f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera_metadata_entry_t streams =
1189f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            newRequest->mSettings.find(ANDROID_REQUEST_OUTPUT_STREAMS);
1190f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (streams.count == 0) {
1191b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Zero output streams specified!");
1192f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return NULL;
1193f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1194f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1195f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < streams.count; i++) {
1196d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He        int idx = mOutputStreams.indexOfKey(streams.data.i32[i]);
1197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (idx == NAME_NOT_FOUND) {
1198b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            CLOGE("Request references unknown stream %d",
1199b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    streams.data.u8[i]);
1200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return NULL;
1201f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
12022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        sp<Camera3OutputStreamInterface> stream =
12032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                mOutputStreams.editValueAt(idx);
1204f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1205f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Lazy completion of stream configuration (allocation/registration)
1206f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // on first use
1207f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (stream->isConfiguring()) {
1208f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            res = stream->finishConfiguration(mHal3Device);
1209f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            if (res != OK) {
1210b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                SET_ERR_L("Unable to finish configuring stream %d: %s (%d)",
1211b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                        stream->getId(), strerror(-res), res);
1212f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                return NULL;
1213f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            }
1214f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1215f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1216f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newRequest->mOutputStreams.push(stream);
1217f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1218f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    newRequest->mSettings.erase(ANDROID_REQUEST_OUTPUT_STREAMS);
1219f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1220f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return newRequest;
12217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
12227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1223f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::configureStreamsLocked() {
1224f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ATRACE_CALL();
1225f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
12267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1227f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (mStatus != STATUS_UNCONFIGURED && mStatus != STATUS_CONFIGURED) {
1228b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        CLOGE("Not idle");
1229f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return INVALID_OPERATION;
1230f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1231f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1232ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    if (!mNeedConfig) {
1233ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala        ALOGV("%s: Skipping config, no stream changes", __FUNCTION__);
1234ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala        return OK;
1235ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    }
1236ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala
1237f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Start configuring the streams
1238f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("%s: Camera %d: Starting stream configuration", __FUNCTION__, mId);
1239f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1240f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_stream_configuration config;
1241f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1242f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    config.num_streams = (mInputStream != NULL) + mOutputStreams.size();
1243f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1244f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Vector<camera3_stream_t*> streams;
1245f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    streams.setCapacity(config.num_streams);
1246f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1247f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mInputStream != NULL) {
1248f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_stream_t *inputStream;
1249f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        inputStream = mInputStream->startConfiguration();
1250f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (inputStream == NULL) {
1251b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Can't start input stream configuration");
1252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
1253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1254f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        streams.add(inputStream);
1255f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1256f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1257f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < mOutputStreams.size(); i++) {
12582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
12592fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        // Don't configure bidi streams twice, nor add them twice to the list
12602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        if (mOutputStreams[i].get() ==
12612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            static_cast<Camera3StreamInterface*>(mInputStream.get())) {
12622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
12632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            config.num_streams--;
12642fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            continue;
12652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        }
12662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
1267f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_stream_t *outputStream;
1268f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        outputStream = mOutputStreams.editValueAt(i)->startConfiguration();
1269f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (outputStream == NULL) {
1270b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR_L("Can't start output stream configuration");
1271f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
1272f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1273f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        streams.add(outputStream);
1274f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1275f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1276f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    config.streams = streams.editArray();
1277f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1278f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Do the HAL configuration; will potentially touch stream
1279f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // max_buffers, usage, priv fields.
128017a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_BEGIN("camera3->configure_streams");
1281f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = mHal3Device->ops->configure_streams(mHal3Device, &config);
128217a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_END();
1283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1284f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (res != OK) {
1285b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR_L("Unable to configure streams with HAL: %s (%d)",
1286b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                strerror(-res), res);
1287f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return res;
1288f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1289f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
12904c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    // Finish all stream configuration immediately.
12914c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    // TODO: Try to relax this later back to lazy completion, which should be
12924c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    // faster
12934c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala
1294073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin    if (mInputStream != NULL && mInputStream->isConfiguring()) {
12954c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala        res = mInputStream->finishConfiguration(mHal3Device);
12964c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala        if (res != OK) {
12974c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala            SET_ERR_L("Can't finish configuring input stream %d: %s (%d)",
12984c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala                    mInputStream->getId(), strerror(-res), res);
12994c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala            return res;
13004c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala        }
13014c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    }
13024c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala
13034c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    for (size_t i = 0; i < mOutputStreams.size(); i++) {
1304073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin        sp<Camera3OutputStreamInterface> outputStream =
1305073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin            mOutputStreams.editValueAt(i);
1306073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin        if (outputStream->isConfiguring()) {
1307073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin            res = outputStream->finishConfiguration(mHal3Device);
1308073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin            if (res != OK) {
1309073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin                SET_ERR_L("Can't finish configuring output stream %d: %s (%d)",
1310073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin                        outputStream->getId(), strerror(-res), res);
1311073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin                return res;
1312073f8570d8404b6d1ea3a1bd34954c6332ba991aIgor Murashkin            }
13134c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala        }
13144c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala    }
13154c95676d259f4449a7da5161dfd46c1d1f9498feEino-Ville Talvala
1316f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Request thread needs to know to avoid using repeat-last-settings protocol
1317f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // across configure_streams() calls
1318f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRequestThread->configurationComplete();
1319f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1320f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Update device state
1321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1322ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    mNeedConfig = false;
1323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1324f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (config.num_streams > 0) {
1325f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatus = STATUS_CONFIGURED;
1326f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    } else {
1327f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatus = STATUS_UNCONFIGURED;
1328f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
1329f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1330f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    ALOGV("%s: Camera %d: Stream configuration complete", __FUNCTION__, mId);
1331f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1332f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
13337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
13347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1335b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorState(const char *fmt, ...) {
1336b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    Mutex::Autolock l(mLock);
1337b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_list args;
1338b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_start(args, fmt);
1339b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1340b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    setErrorStateLockedV(fmt, args);
1341b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1342b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_end(args);
1343b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala}
1344b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1345b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateV(const char *fmt, va_list args) {
1346b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    Mutex::Autolock l(mLock);
1347b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    setErrorStateLockedV(fmt, args);
1348b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala}
1349b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1350b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateLocked(const char *fmt, ...) {
1351b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_list args;
1352b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_start(args, fmt);
1353b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1354b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    setErrorStateLockedV(fmt, args);
1355b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1356b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    va_end(args);
1357b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala}
1358b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1359b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::setErrorStateLockedV(const char *fmt, va_list args) {
136042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Print out all error messages to log
136142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    String8 errorCause = String8::formatV(fmt, args);
136242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    ALOGE("Camera %d: %s", mId, errorCause.string());
136342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
136442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // But only do error state transition steps for the first error
1365b05eeaedacaff92b6e5ac89f99b0fccdf7643f09Zhijun He    if (mStatus == STATUS_ERROR || mStatus == STATUS_UNINITIALIZED) return;
1366b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
136742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    mErrorCause = errorCause;
136842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
136942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    mRequestThread->setPaused(true);
1370b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    mStatus = STATUS_ERROR;
1371b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala}
1372f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1373f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/**
137442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala * In-flight request management
137542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala */
137642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
137742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvalastatus_t Camera3Device::registerInFlight(int32_t frameNumber,
1378f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        int32_t requestId, int32_t numBuffers) {
137942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    ATRACE_CALL();
138042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    Mutex::Autolock l(mInFlightLock);
138142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
138242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    ssize_t res;
1383f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    res = mInFlightMap.add(frameNumber, InFlightRequest(requestId, numBuffers));
138442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (res < 0) return res;
138542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
138642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    return OK;
138742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala}
138842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
138942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala/**
1390f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera HAL device callback methods
1391f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */
1392f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
13937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::processCaptureResult(const camera3_capture_result *result) {
13947d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    ATRACE_CALL();
13957d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
13967d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    status_t res;
13977d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
139842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t frameNumber = result->frame_number;
139942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (result->result == NULL && result->num_output_buffers == 0) {
140042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        SET_ERR("No result data provided by HAL for frame %d",
140142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                frameNumber);
14027d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        return;
14037d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
14047d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
140542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Get capture timestamp from list of in-flight requests, where it was added
140642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // by the shutter notification for this frame. Then update the in-flight
140742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // status and remove the in-flight entry if all result data has been
140842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // received.
14097d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    nsecs_t timestamp = 0;
141042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    {
141142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        Mutex::Autolock l(mInFlightLock);
141242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        ssize_t idx = mInFlightMap.indexOfKey(frameNumber);
141342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        if (idx == NAME_NOT_FOUND) {
141442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Unknown frame number for capture result: %d",
141542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber);
141642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            return;
141742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
141842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        InFlightRequest &request = mInFlightMap.editValueAt(idx);
141942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        timestamp = request.captureTimestamp;
14201d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He        /**
14211d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He         * One of the following must happen before it's legal to call process_capture_result:
14221d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He         * - CAMERA3_MSG_SHUTTER (expected during normal operation)
14231d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He         * - CAMERA3_MSG_ERROR (expected during flush)
14241d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He         */
14251d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He        if (request.requestStatus == OK && timestamp == 0) {
142642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Called before shutter notify for frame %d",
142742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber);
142842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            return;
142942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
143042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
143142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        if (result->result != NULL) {
143242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            if (request.haveResultMetadata) {
143342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                SET_ERR("Called multiple times with metadata for frame %d",
143442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                        frameNumber);
143542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                return;
143642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
143742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            request.haveResultMetadata = true;
143842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
143942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
144042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        request.numBuffersLeft -= result->num_output_buffers;
144142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
144242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        if (request.numBuffersLeft < 0) {
144342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Too many buffers returned for frame %d",
144442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber);
144542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            return;
144642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
144742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
144842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        if (request.haveResultMetadata && request.numBuffersLeft == 0) {
144917a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala            ATRACE_ASYNC_END("frame capture", frameNumber);
145042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            mInFlightMap.removeItemsAt(idx, 1);
145142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
145242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
145342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Sanity check - if we have too many in-flight frames, something has
145442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // likely gone wrong
145542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        if (mInFlightMap.size() > kInFlightWarnLimit) {
145642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            CLOGE("In-flight list too large: %d", mInFlightMap.size());
145742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
145842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
145942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    }
146042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
146142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Process the result metadata, if provided
146242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (result->result != NULL) {
14637d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        Mutex::Autolock l(mOutputLock);
14647d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
146542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        if (frameNumber != mNextResultFrameNumber) {
146642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Out-of-order capture result metadata submitted! "
146742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    "(got frame number %d, expecting %d)",
146842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber, mNextResultFrameNumber);
146942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            return;
147042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
147142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        mNextResultFrameNumber++;
147242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
147342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        CameraMetadata &captureResult =
147442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                *mResultQueue.insert(mResultQueue.end(), CameraMetadata());
14757d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
14767d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        captureResult = result->result;
1477d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin        if (captureResult.update(ANDROID_REQUEST_FRAME_COUNT,
147842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                        (int32_t*)&frameNumber, 1) != OK) {
1479b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR("Failed to set frame# in metadata (%d)",
148042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber);
1481d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin        } else {
1482d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin            ALOGVV("%s: Camera %d: Set frame# in metadata (%d)",
148342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    __FUNCTION__, mId, frameNumber);
1484d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin        }
14857d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
148642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Check that there's a timestamp in the result metadata
14877d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
14887d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        camera_metadata_entry entry =
14897d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                captureResult.find(ANDROID_SENSOR_TIMESTAMP);
14907d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (entry.count == 0) {
1491b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala            SET_ERR("No timestamp provided by HAL for frame %d!",
149242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber);
1493fe7e0c6154309f2491463ee6ca4920d225289638Alex Ray        } else if (timestamp != entry.data.i64[0]) {
149442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Timestamp mismatch between shutter notify and result"
149542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    " metadata for frame %d (%lld vs %lld respectively)",
149642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    frameNumber, timestamp, entry.data.i64[0]);
14977d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
14987d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    } // scope for mOutputLock
14997d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
150042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Return completed buffers to their streams with the timestamp
150142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
15027d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    for (size_t i = 0; i < result->num_output_buffers; i++) {
15037d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        Camera3Stream *stream =
15047d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                Camera3Stream::cast(result->output_buffers[i].stream);
15057d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        res = stream->returnBuffer(result->output_buffers[i], timestamp);
15067d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        // Note: stream may be deallocated at this point, if this buffer was the
15077d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        // last reference to it.
15087d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (res != OK) {
150907d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala            ALOGE("Can't return buffer %d for frame %d to its stream: "
151042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    " %s (%d)", i, frameNumber, strerror(-res), res);
15117d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
15127d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
15137d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
151446910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    // Finally, signal any waiters for new frames
151542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
15164345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin    if (result->result != NULL) {
15174345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin        mResultSignal.signal();
15184345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin    }
15194345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin
15207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
15217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
152246910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala
152346910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala
15247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::notify(const camera3_notify_msg *msg) {
152517a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_CALL();
15267d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    NotificationListener *listener;
15277d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    {
15287d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        Mutex::Autolock l(mOutputLock);
15297d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        listener = mListener;
15307d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
15317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
15327d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    if (msg == NULL) {
153342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        SET_ERR("HAL sent NULL notify message!");
15347d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        return;
15357d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
15367d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
15377d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    switch (msg->type) {
15387d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        case CAMERA3_MSG_ERROR: {
15397d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            int streamId = 0;
15407d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            if (msg->message.error.error_stream != NULL) {
15417d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                Camera3Stream *stream =
15427d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                        Camera3Stream::cast(
15437d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                                  msg->message.error.error_stream);
15447d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                streamId = stream->getId();
15457d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            }
154617a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala            ALOGV("Camera %d: %s: HAL error, frame %d, stream %d: %d",
154717a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala                    mId, __FUNCTION__, msg->message.error.frame_number,
154817a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala                    streamId, msg->message.error.error_code);
15491d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He
15501d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He            // Set request error status for the request in the in-flight tracking
15511d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He            {
15521d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                Mutex::Autolock l(mInFlightLock);
15531d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                ssize_t idx = mInFlightMap.indexOfKey(msg->message.error.frame_number);
15541d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                if (idx >= 0) {
15551d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                    mInFlightMap.editValueAt(idx).requestStatus = msg->message.error.error_code;
15561d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                }
15571d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He            }
15581d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He
155942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            if (listener != NULL) {
156042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                listener->notifyError(msg->message.error.error_code,
156142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                        msg->message.error.frame_number, streamId);
156242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
15637d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            break;
15647d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
15657d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        case CAMERA3_MSG_SHUTTER: {
156642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            ssize_t idx;
156742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            uint32_t frameNumber = msg->message.shutter.frame_number;
156842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            nsecs_t timestamp = msg->message.shutter.timestamp;
156942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            // Verify ordering of shutter notifications
157042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            {
157142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                Mutex::Autolock l(mOutputLock);
157242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                if (frameNumber != mNextShutterFrameNumber) {
157342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    SET_ERR("Shutter notification out-of-order. Expected "
157442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                            "notification for frame %d, got frame %d",
157542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                            mNextShutterFrameNumber, frameNumber);
157642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    break;
157742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                }
157842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                mNextShutterFrameNumber++;
157942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
158042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
1581f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            int32_t requestId = -1;
1582f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
158342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            // Set timestamp for the request in the in-flight tracking
1584f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            // and get the request ID to send upstream
158542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            {
158642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                Mutex::Autolock l(mInFlightLock);
158742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                idx = mInFlightMap.indexOfKey(frameNumber);
158842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                if (idx >= 0) {
1589f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    InFlightRequest &r = mInFlightMap.editValueAt(idx);
1590f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    r.captureTimestamp = timestamp;
1591f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    requestId = r.requestId;
159242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                }
159342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
159442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            if (idx < 0) {
159542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                SET_ERR("Shutter notification for non-existent frame number %d",
159642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                        frameNumber);
159742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                break;
159842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
1599f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            ALOGVV("Camera %d: %s: Shutter fired for frame %d (id %d) at %lld",
1600f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    mId, __FUNCTION__, frameNumber, requestId, timestamp);
160142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            // Call listener, if any
160242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            if (listener != NULL) {
1603f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                listener->notifyShutter(requestId, timestamp);
160442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            }
16057d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            break;
16067d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
16077d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        default:
160842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            SET_ERR("Unknown notify message from HAL: %d",
1609b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                    msg->type);
16107d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
16117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
16127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1613f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville TalvalaCameraMetadata Camera3Device::getLatestRequestLocked() {
16141e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    ALOGV("%s", __FUNCTION__);
16151e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
16161e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    CameraMetadata retVal;
16171e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
16181e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    if (mRequestThread != NULL) {
16191e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        retVal = mRequestThread->getLatestRequest();
16201e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    }
16211e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
16221e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    return retVal;
16231e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin}
16241e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
16257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/**
1626f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * RequestThread inner class methods
1627f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */
1628f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1629f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville TalvalaCamera3Device::RequestThread::RequestThread(wp<Camera3Device> parent,
1630f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        sp<StatusTracker> statusTracker,
1631f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_device_t *hal3Device) :
1632f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Thread(false),
1633f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mParent(parent),
1634f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mStatusTracker(statusTracker),
1635f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mHal3Device(hal3Device),
163642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        mId(getId(parent)),
1637f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mReconfigured(false),
1638f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mDoPause(false),
1639f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mPaused(true),
16404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mFrameNumber(0),
16414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mLatestRequestId(NAME_NOT_FOUND) {
1642f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mStatusId = statusTracker->addComponent();
1643f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1644f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1645f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::configurationComplete() {
1646f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
1647f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mReconfigured = true;
1648f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1649f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1650f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::queueRequest(
1651f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         sp<CaptureRequest> request) {
1652f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
1653f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRequestQueue.push_back(request);
1654f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
165526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    unpauseForNewRequests();
165626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala
1657f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
1658f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1659f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
16604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
16614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTrigger(
16624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger[],
16634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        size_t count) {
16644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
16654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Mutex::Autolock l(mTriggerMutex);
16664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    status_t ret;
16674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
16684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    for (size_t i = 0; i < count; ++i) {
16694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ret = queueTriggerLocked(trigger[i]);
16704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
16714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (ret != OK) {
16724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return ret;
16734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
16744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
16754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
16764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return OK;
16774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
16784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
167942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvalaint Camera3Device::RequestThread::getId(const wp<Camera3Device> &device) {
168042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    sp<Camera3Device> d = device.promote();
168142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (d != NULL) return d->mId;
168242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    return 0;
168342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala}
168442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
16854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTriggerLocked(
16864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger) {
16874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
16884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    uint32_t tag = trigger.metadataTag;
16894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    ssize_t index = mTriggerMap.indexOfKey(tag);
16904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
16914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    switch (trigger.getTagType()) {
16924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        case TYPE_BYTE:
16934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // fall-through
16944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        case TYPE_INT32:
16954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            break;
16964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        default:
169742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            ALOGE("%s: Type not supported: 0x%x", __FUNCTION__,
169842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                    trigger.getTagType());
16994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return INVALID_OPERATION;
17004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
17014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
17024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
17034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Collect only the latest trigger, since we only have 1 field
17044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * in the request settings per trigger tag, and can't send more than 1
17054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * trigger per request.
17064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
17074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    if (index != NAME_NOT_FOUND) {
17084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mTriggerMap.editValueAt(index) = trigger;
17094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    } else {
17104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mTriggerMap.add(tag, trigger);
17114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
17124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
17134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return OK;
17144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
17154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
1716f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::setRepeatingRequests(
1717f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        const RequestList &requests) {
1718f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
1719f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRepeatingRequests.clear();
1720f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRepeatingRequests.insert(mRepeatingRequests.begin(),
1721f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            requests.begin(), requests.end());
172226fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala
172326fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    unpauseForNewRequests();
172426fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala
1725f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
1726f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1727f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1728f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::clearRepeatingRequests() {
1729f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
1730f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRepeatingRequests.clear();
1731f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
1732f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1733f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1734abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvalastatus_t Camera3Device::RequestThread::clear() {
1735abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    Mutex::Autolock l(mRequestLock);
1736abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    mRepeatingRequests.clear();
1737abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    mRequestQueue.clear();
1738abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    mTriggerMap.clear();
1739abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    return OK;
1740abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala}
1741abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
1742f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::setPaused(bool paused) {
1743f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mPauseLock);
1744f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mDoPause = paused;
1745f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mDoPauseSignal.signal();
1746f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1747f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
17484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::waitUntilRequestProcessed(
17494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t requestId, nsecs_t timeout) {
17504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Mutex::Autolock l(mLatestRequestMutex);
17514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    status_t res;
17524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    while (mLatestRequestId != requestId) {
17534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        nsecs_t startTime = systemTime();
17544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
17554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        res = mLatestRequestSignal.waitRelative(mLatestRequestMutex, timeout);
17564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (res != OK) return res;
17574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
17584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        timeout -= (systemTime() - startTime);
17594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
17604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
17614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return OK;
17624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
17634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
1764f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalavoid Camera3Device::RequestThread::requestExit() {
1765f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Call parent to set up shutdown
1766f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Thread::requestExit();
1767f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // The exit from any possible waits
1768f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mDoPauseSignal.signal();
1769f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mRequestSignal.signal();
1770f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala}
17714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
1772f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::threadLoop() {
1773f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1774f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
1775f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1776f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Handle paused state.
1777f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (waitIfPaused()) {
1778f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return true;
1779f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1780f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1781f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Get work to do
1782f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1783f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> nextRequest = waitForNextRequest();
1784f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (nextRequest == NULL) {
1785f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return true;
1786f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1787f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1788f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Create request to HAL
1789f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_capture_request_t request = camera3_capture_request_t();
17904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Vector<camera3_stream_buffer_t> outputBuffers;
1791f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1792f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Get the request ID, if any
1793f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    int requestId;
1794f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    camera_metadata_entry_t requestIdEntry =
1795f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            nextRequest->mSettings.find(ANDROID_REQUEST_ID);
1796f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (requestIdEntry.count > 0) {
1797f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        requestId = requestIdEntry.data.i32[0];
1798f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    } else {
1799f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGW("%s: Did not have android.request.id set in the request",
1800f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                __FUNCTION__);
1801f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        requestId = NAME_NOT_FOUND;
1802f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
1803f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
18044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Insert any queued triggers (before metadata is locked)
18054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    int32_t triggerCount;
18064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    res = insertTriggers(nextRequest);
18074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    if (res < 0) {
1808b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR("RequestThread: Unable to insert triggers "
1809b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                "(capture request %d, HAL device: %s (%d)",
1810b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala                (mFrameNumber+1), strerror(-res), res);
18114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        cleanUpFailedRequest(request, nextRequest, outputBuffers);
18124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        return false;
18134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
18144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    triggerCount = res;
18154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
18164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    bool triggersMixedIn = (triggerCount > 0 || mPrevTriggers > 0);
18174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
18184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // If the request is the same as last, or we had triggers last time
18194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    if (mPrevRequest != nextRequest || triggersMixedIn) {
18204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        /**
18212f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala         * HAL workaround:
18222f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala         * Insert a dummy trigger ID if a trigger is set but no trigger ID is
18232f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala         */
18242f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        res = addDummyTriggerIds(nextRequest);
18252f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        if (res != OK) {
18262f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            SET_ERR("RequestThread: Unable to insert dummy trigger IDs "
18272f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala                    "(capture request %d, HAL device: %s (%d)",
18282f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala                    (mFrameNumber+1), strerror(-res), res);
18292f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            cleanUpFailedRequest(request, nextRequest, outputBuffers);
18302f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            return false;
18312f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        }
18322f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
18332f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        /**
18344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * The request should be presorted so accesses in HAL
18354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         *   are O(logn). Sidenote, sorting a sorted metadata is nop.
18364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
18374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        nextRequest->mSettings.sort();
1838f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.settings = nextRequest->mSettings.getAndLock();
1839f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mPrevRequest = nextRequest;
18404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ALOGVV("%s: Request settings are NEW", __FUNCTION__);
18414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
18424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        IF_ALOGV() {
18434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            camera_metadata_ro_entry_t e = camera_metadata_ro_entry_t();
18444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            find_camera_metadata_ro_entry(
18454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                    request.settings,
18464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                    ANDROID_CONTROL_AF_TRIGGER,
18474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                    &e
18484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            );
18494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            if (e.count > 0) {
18504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                ALOGV("%s: Request (frame num %d) had AF trigger 0x%x",
18514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      __FUNCTION__,
18524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      mFrameNumber+1,
18534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      e.data.u8[0]);
18544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            }
18554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
18564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    } else {
18574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // leave request.settings NULL to indicate 'reuse latest given'
18584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ALOGVV("%s: Request settings are REUSED",
18594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin               __FUNCTION__);
18604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
1861f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1862f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_stream_buffer_t inputBuffer;
1863f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1864f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Fill in buffers
1865f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1866f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (nextRequest->mInputStream != NULL) {
1867f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.input_buffer = &inputBuffer;
18685a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        res = nextRequest->mInputStream->getInputBuffer(&inputBuffer);
1869f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
187007d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala            ALOGE("RequestThread: Can't get input buffer, skipping request:"
1871f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    " %s (%d)", strerror(-res), res);
1872f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            cleanUpFailedRequest(request, nextRequest, outputBuffers);
1873f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return true;
1874f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1875f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    } else {
1876f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.input_buffer = NULL;
1877f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1878f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1879f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    outputBuffers.insertAt(camera3_stream_buffer_t(), 0,
1880f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            nextRequest->mOutputStreams.size());
1881f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    request.output_buffers = outputBuffers.array();
1882f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < nextRequest->mOutputStreams.size(); i++) {
1883f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = nextRequest->mOutputStreams.editItemAt(i)->
1884f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                getBuffer(&outputBuffers.editItemAt(i));
1885f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
188607d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala            ALOGE("RequestThread: Can't get output buffer, skipping request:"
188707d2169d46f3536add6044dbf106967a1982252fEino-Ville Talvala                    " %s (%d)", strerror(-res), res);
1888f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            cleanUpFailedRequest(request, nextRequest, outputBuffers);
1889f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return true;
1890f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1891f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.num_output_buffers++;
1892f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1893f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1894f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    request.frame_number = mFrameNumber++;
1895f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
189642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Log request in the in-flight queue
189742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    sp<Camera3Device> parent = mParent.promote();
189842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (parent == NULL) {
189942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        CLOGE("RequestThread: Parent is gone");
190042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        cleanUpFailedRequest(request, nextRequest, outputBuffers);
190142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        return false;
190242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    }
190342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
1904f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    res = parent->registerInFlight(request.frame_number, requestId,
190542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala            request.num_output_buffers);
190642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    if (res != OK) {
190742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        SET_ERR("RequestThread: Unable to register new in-flight request:"
190842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                " %s (%d)", strerror(-res), res);
190942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        cleanUpFailedRequest(request, nextRequest, outputBuffers);
191042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        return false;
191142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    }
19124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
1913f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Submit request and block until ready for next one
191417a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_ASYNC_BEGIN("frame capture", request.frame_number);
191517a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_BEGIN("camera3->process_capture_request");
1916f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = mHal3Device->ops->process_capture_request(mHal3Device, &request);
191717a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala    ATRACE_END();
191817a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala
1919f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (res != OK) {
1920b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR("RequestThread: Unable to submit capture request %d to HAL"
1921f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                " device: %s (%d)", request.frame_number, strerror(-res), res);
1922f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        cleanUpFailedRequest(request, nextRequest, outputBuffers);
1923f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return false;
1924f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1925f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
19261e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    // Update the latest request sent to HAL
19271e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    if (request.settings != NULL) { // Don't update them if they were unchanged
19281e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        Mutex::Autolock al(mLatestRequestMutex);
19291e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
19301e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        camera_metadata_t* cloned = clone_camera_metadata(request.settings);
19311e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        mLatestRequest.acquire(cloned);
19321e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    }
19331e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
1934f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (request.settings != NULL) {
1935f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest->mSettings.unlock(request.settings);
1936f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
19374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
19384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Remove any previously queued triggers (after unlock)
19394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    res = removeTriggers(mPrevRequest);
19404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    if (res != OK) {
1941b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        SET_ERR("RequestThread: Unable to remove triggers "
19424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              "(capture request %d, HAL device: %s (%d)",
19434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              request.frame_number, strerror(-res), res);
19444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        return false;
19454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
19464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    mPrevTriggers = triggerCount;
19474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
19484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Read android.request.id from the request settings metadata
19494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // - inform waitUntilRequestProcessed thread of a new request ID
19504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    {
19514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Mutex::Autolock al(mLatestRequestMutex);
19524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
1953f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        mLatestRequestId = requestId;
19544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mLatestRequestSignal.signal();
19554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
19564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
19575a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    // Return input buffer back to framework
19585a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    if (request.input_buffer != NULL) {
19595a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        Camera3Stream *stream =
19605a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            Camera3Stream::cast(request.input_buffer->stream);
19615a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        res = stream->returnInputBuffer(*(request.input_buffer));
19625a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        // Note: stream may be deallocated at this point, if this buffer was the
19635a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        // last reference to it.
19645a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        if (res != OK) {
19655a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            ALOGE("%s: RequestThread: Can't return input buffer for frame %d to"
19665a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin                    "  its stream:%s (%d)",  __FUNCTION__,
19675a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin                    request.frame_number, strerror(-res), res);
19685a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            // TODO: Report error upstream
19695a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        }
19705a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    }
19715a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
1972f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return true;
1973f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1974f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
19751e479c0f4cb3e2174dde0b02e5656fb658f73495Igor MurashkinCameraMetadata Camera3Device::RequestThread::getLatestRequest() const {
19761e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    Mutex::Autolock al(mLatestRequestMutex);
19771e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
19781e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    ALOGV("RequestThread::%s", __FUNCTION__);
19791e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
19801e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    return mLatestRequest;
19811e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin}
19821e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
1983f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::cleanUpFailedRequest(
1984f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_capture_request_t &request,
1985f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<CaptureRequest> &nextRequest,
1986f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Vector<camera3_stream_buffer_t> &outputBuffers) {
1987f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1988f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (request.settings != NULL) {
1989f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest->mSettings.unlock(request.settings);
1990f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1991f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (request.input_buffer != NULL) {
1992f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.input_buffer->status = CAMERA3_BUFFER_STATUS_ERROR;
19935a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin        nextRequest->mInputStream->returnInputBuffer(*(request.input_buffer));
1994f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1995f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < request.num_output_buffers; i++) {
1996f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        outputBuffers.editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR;
1997f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest->mOutputStreams.editItemAt(i)->returnBuffer(
1998f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            outputBuffers[i], 0);
1999f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2000f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
2001f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2002f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest>
2003f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Camera3Device::RequestThread::waitForNextRequest() {
2004f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
2005f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> nextRequest;
2006f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2007f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Optimized a bit for the simple steady-state case (single repeating
2008f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // request), to avoid putting that request in the queue temporarily.
2009f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
2010f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2011f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    while (mRequestQueue.empty()) {
2012f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (!mRepeatingRequests.empty()) {
2013f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // Always atomically enqueue all requests in a repeating request
2014f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // list. Guarantees a complete in-sequence set of captures to
2015f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // application.
2016f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            const RequestList &requests = mRepeatingRequests;
2017f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            RequestList::const_iterator firstRequest =
2018f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    requests.begin();
2019f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            nextRequest = *firstRequest;
2020f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mRequestQueue.insert(mRequestQueue.end(),
2021f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    ++firstRequest,
2022f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    requests.end());
2023f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // No need to wait any longer
2024f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
2025f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
2026f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2027f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = mRequestSignal.waitRelative(mRequestLock, kRequestTimeout);
2028f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2029f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if ((mRequestQueue.empty() && mRepeatingRequests.empty()) ||
2030f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                exitPending()) {
2031f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            Mutex::Autolock pl(mPauseLock);
2032f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            if (mPaused == false) {
2033f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                ALOGV("%s: RequestThread: Going idle", __FUNCTION__);
2034f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                mPaused = true;
2035f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                // Let the tracker know
2036f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                sp<StatusTracker> statusTracker = mStatusTracker.promote();
2037f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                if (statusTracker != 0) {
2038f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE);
2039f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                }
2040f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            }
2041f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // Stop waiting for now and let thread management happen
2042f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return NULL;
2043f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
2044f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2045f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2046f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (nextRequest == NULL) {
2047f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Don't have a repeating request already in hand, so queue
2048f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // must have an entry now.
2049f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList::iterator firstRequest =
2050f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                mRequestQueue.begin();
2051f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest = *firstRequest;
2052f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mRequestQueue.erase(firstRequest);
2053f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2054f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
205526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // In case we've been unpaused by setPaused clearing mDoPause, need to
205626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // update internal pause state (capture/setRepeatingRequest unpause
205726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // directly).
2058f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock pl(mPauseLock);
2059f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    if (mPaused) {
2060f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGV("%s: RequestThread: Unpaused", __FUNCTION__);
2061f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        sp<StatusTracker> statusTracker = mStatusTracker.promote();
2062f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (statusTracker != 0) {
2063f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            statusTracker->markComponentActive(mStatusId);
2064f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
2065f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
2066f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mPaused = false;
2067f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2068f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Check if we've reconfigured since last time, and reset the preview
2069f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // request if so. Can't use 'NULL request == repeat' across configure calls.
2070f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mReconfigured) {
2071f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mPrevRequest.clear();
2072f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mReconfigured = false;
2073f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2074f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2075f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return nextRequest;
2076f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
2077f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2078f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::waitIfPaused() {
2079f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
2080f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mPauseLock);
2081f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    while (mDoPause) {
2082f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (mPaused == false) {
2083f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mPaused = true;
2084f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            ALOGV("%s: RequestThread: Paused", __FUNCTION__);
2085f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            // Let the tracker know
2086f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            sp<StatusTracker> statusTracker = mStatusTracker.promote();
2087f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            if (statusTracker != 0) {
2088f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE);
2089f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            }
2090f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
2091f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
2092f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = mDoPauseSignal.waitRelative(mPauseLock, kRequestTimeout);
2093f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (res == TIMED_OUT || exitPending()) {
2094f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return true;
2095f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
2096f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2097f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // We don't set mPaused to false here, because waitForNextRequest needs
2098f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // to further manage the paused state in case of starvation.
2099f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return false;
2100f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
2101f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
210226fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvalavoid Camera3Device::RequestThread::unpauseForNewRequests() {
210326fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // With work to do, mark thread as unpaused.
210426fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // If paused by request (setPaused), don't resume, to avoid
210526fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    // extra signaling/waiting overhead to waitUntilPaused
2106f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    mRequestSignal.signal();
210726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    Mutex::Autolock p(mPauseLock);
210826fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    if (!mDoPause) {
2109f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGV("%s: RequestThread: Going active", __FUNCTION__);
2110f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        if (mPaused) {
2111f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            sp<StatusTracker> statusTracker = mStatusTracker.promote();
2112f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            if (statusTracker != 0) {
2113f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                statusTracker->markComponentActive(mStatusId);
2114f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            }
2115f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        }
211626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala        mPaused = false;
211726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala    }
211826fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala}
211926fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala
2120b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvalavoid Camera3Device::RequestThread::setErrorState(const char *fmt, ...) {
2121b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    sp<Camera3Device> parent = mParent.promote();
2122b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    if (parent != NULL) {
2123b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        va_list args;
2124b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        va_start(args, fmt);
2125b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
2126b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        parent->setErrorStateV(fmt, args);
2127b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
2128b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        va_end(args);
2129b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    }
2130b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala}
2131b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
21324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::insertTriggers(
21334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        const sp<CaptureRequest> &request) {
21344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Mutex::Autolock al(mTriggerMutex);
21364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    CameraMetadata &metadata = request->mSettings;
21384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    size_t count = mTriggerMap.size();
21394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    for (size_t i = 0; i < count; ++i) {
21414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger = mTriggerMap.valueAt(i);
21424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        uint32_t tag = trigger.metadataTag;
21444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        camera_metadata_entry entry = metadata.find(tag);
21454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (entry.count > 0) {
21474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            /**
21484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             * Already has an entry for this trigger in the request.
21494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             * Rewrite it with our requested trigger value.
21504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             */
21514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            RequestTrigger oldTrigger = trigger;
21524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            oldTrigger.entryValue = entry.data.u8[0];
21544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            mTriggerReplacedMap.add(tag, oldTrigger);
21564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        } else {
21574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            /**
21584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             * More typical, no trigger entry, so we just add it
21594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             */
21604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            mTriggerRemovedMap.add(tag, trigger);
21614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
21624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t res;
21644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        switch (trigger.getTagType()) {
21664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            case TYPE_BYTE: {
21674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue);
21684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                res = metadata.update(tag,
21694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      &entryValue,
21704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      /*count*/1);
21714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                break;
21724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            }
21734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            case TYPE_INT32:
21744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                res = metadata.update(tag,
21754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      &trigger.entryValue,
21764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      /*count*/1);
21774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                break;
21784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            default:
21794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                ALOGE("%s: Type not supported: 0x%x",
21804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      __FUNCTION__,
21814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      trigger.getTagType());
21824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                return INVALID_OPERATION;
21834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
21844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (res != OK) {
21864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ALOGE("%s: Failed to update request metadata with trigger tag %s"
21874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  ", value %d", __FUNCTION__, trigger.getTagName(),
21884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  trigger.entryValue);
21894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return res;
21904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
21914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ALOGV("%s: Mixed in trigger %s, value %d", __FUNCTION__,
21934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              trigger.getTagName(),
21944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              trigger.entryValue);
21954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
21964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    mTriggerMap.clear();
21984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
21994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return count;
22004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
22014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
22024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::removeTriggers(
22034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        const sp<CaptureRequest> &request) {
22044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Mutex::Autolock al(mTriggerMutex);
22054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
22064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    CameraMetadata &metadata = request->mSettings;
22074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
22084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
22094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Replace all old entries with their old values.
22104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
22114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    for (size_t i = 0; i < mTriggerReplacedMap.size(); ++i) {
22124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger = mTriggerReplacedMap.valueAt(i);
22134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
22144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t res;
22154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
22164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        uint32_t tag = trigger.metadataTag;
22174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        switch (trigger.getTagType()) {
22184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            case TYPE_BYTE: {
22194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue);
22204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                res = metadata.update(tag,
22214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      &entryValue,
22224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      /*count*/1);
22234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                break;
22244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            }
22254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            case TYPE_INT32:
22264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                res = metadata.update(tag,
22274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      &trigger.entryValue,
22284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      /*count*/1);
22294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                break;
22304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            default:
22314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                ALOGE("%s: Type not supported: 0x%x",
22324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      __FUNCTION__,
22334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      trigger.getTagType());
22344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                return INVALID_OPERATION;
22354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
22364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
22374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (res != OK) {
22384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ALOGE("%s: Failed to restore request metadata with trigger tag %s"
22394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  ", trigger value %d", __FUNCTION__,
22404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  trigger.getTagName(), trigger.entryValue);
22414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return res;
22424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
22434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
22444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    mTriggerReplacedMap.clear();
22454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
22464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
22474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Remove all new entries.
22484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
22494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    for (size_t i = 0; i < mTriggerRemovedMap.size(); ++i) {
22504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger = mTriggerRemovedMap.valueAt(i);
22514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t res = metadata.erase(trigger.metadataTag);
22524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
22534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (res != OK) {
22544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ALOGE("%s: Failed to erase metadata with trigger tag %s"
22554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  ", trigger value %d", __FUNCTION__,
22564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  trigger.getTagName(), trigger.entryValue);
22574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return res;
22584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
22594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
22604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    mTriggerRemovedMap.clear();
22614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
22624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return OK;
22634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
22644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
22652f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvalastatus_t Camera3Device::RequestThread::addDummyTriggerIds(
22662f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        const sp<CaptureRequest> &request) {
22672f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    // Trigger ID 0 has special meaning in the HAL2 spec, so avoid it here
22682f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    static const int32_t dummyTriggerId = 1;
22692f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    status_t res;
22702f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
22712f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    CameraMetadata &metadata = request->mSettings;
22722f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
22732f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    // If AF trigger is active, insert a dummy AF trigger ID if none already
22742f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    // exists
22752f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    camera_metadata_entry afTrigger = metadata.find(ANDROID_CONTROL_AF_TRIGGER);
22762f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    camera_metadata_entry afId = metadata.find(ANDROID_CONTROL_AF_TRIGGER_ID);
22772f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    if (afTrigger.count > 0 &&
22782f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            afTrigger.data.u8[0] != ANDROID_CONTROL_AF_TRIGGER_IDLE &&
22792f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            afId.count == 0) {
22802f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        res = metadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, &dummyTriggerId, 1);
22812f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        if (res != OK) return res;
22822f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    }
22832f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
22842f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    // If AE precapture trigger is active, insert a dummy precapture trigger ID
22852f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    // if none already exists
22862f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    camera_metadata_entry pcTrigger =
22872f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER);
22882f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    camera_metadata_entry pcId = metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_ID);
22892f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    if (pcTrigger.count > 0 &&
22902f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            pcTrigger.data.u8[0] != ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE &&
22912f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala            pcId.count == 0) {
22922f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        res = metadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID,
22932f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala                &dummyTriggerId, 1);
22942f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        if (res != OK) return res;
22952f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    }
22962f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
22972f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala    return OK;
22982f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala}
22994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
23004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2301f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/**
23027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Static callback forwarding methods from HAL to instance
23037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */
23047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
23057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sProcessCaptureResult(const camera3_callback_ops *cb,
23067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const camera3_capture_result *result) {
23077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    Camera3Device *d =
23087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb));
23097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    d->processCaptureResult(result);
23107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
23117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
23127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sNotify(const camera3_callback_ops *cb,
23137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const camera3_notify_msg *msg) {
23147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    Camera3Device *d =
23157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb));
23167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    d->notify(msg);
23177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
23187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
23197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android
2320