Camera3Device.cpp revision 4d2f2e8414df33337d4f09e5235719dfcc705674
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
287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Log.h>
297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Trace.h>
307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Timers.h>
317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include "Camera3Device.h"
32f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala#include "camera3/Camera3OutputStream.h"
337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
34f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalausing namespace android::camera3;
357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
36f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalanamespace android {
377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville TalvalaCamera3Device::Camera3Device(int id):
397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        mId(id),
40f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mHal3Device(NULL),
417d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        mStatus(STATUS_UNINITIALIZED),
427d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        mListener(NULL)
437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{
447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    camera3_callback_ops::notify = &sNotify;
467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    camera3_callback_ops::process_capture_result = &sProcessCaptureResult;
477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ALOGV("%s: Created device for camera %d", __FUNCTION__, id);
487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville TalvalaCamera3Device::~Camera3Device()
517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{
527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ALOGV("%s: Tearing down for camera id %d", __FUNCTION__, mId);
547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    disconnect();
557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5771381051e2d048b2705c447b3d59db6e972493eeIgor Murashkinint Camera3Device::getId() const {
5871381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin    return mId;
5971381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin}
6071381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin
61f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/**
62f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * CameraDeviceBase interface
63f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */
64f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::initialize(camera_module_t *module)
667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala{
677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
68f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
69f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ALOGV("%s: Initializing device for camera %d", __FUNCTION__, mId);
71f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mStatus != STATUS_UNINITIALIZED) {
727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        ALOGE("%s: Already initialized!", __FUNCTION__);
737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return INVALID_OPERATION;
747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Open HAL device */
777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    status_t res;
797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    String8 deviceName = String8::format("%d", mId);
807fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    camera3_device_t *device;
827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = module->common.methods->open(&module->common, deviceName.string(),
847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            reinterpret_cast<hw_device_t**>(&device));
857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (res != OK) {
877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        ALOGE("%s: Could not open camera %d: %s (%d)", __FUNCTION__,
887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala                mId, strerror(-res), res);
89f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mStatus = STATUS_ERROR;
907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return res;
917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Cross-check device version */
947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (device->common.version != CAMERA_DEVICE_API_VERSION_3_0) {
967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        ALOGE("%s: Could not open camera %d: "
977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala                "Camera device is not version %x, reports %x instead",
987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala                __FUNCTION__, mId, CAMERA_DEVICE_API_VERSION_3_0,
997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala                device->common.version);
1007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        device->common.close(&device->common);
101f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mStatus = STATUS_ERROR;
1027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return BAD_VALUE;
1037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    camera_info info;
1067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = module->get_camera_info(mId, &info);
1077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (res != OK) return res;
1087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (info.device_version != device->common.version) {
1107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        ALOGE("%s: HAL reporting mismatched camera_info version (%x)"
1117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala                " and device version (%x).", __FUNCTION__,
1127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala                device->common.version, info.device_version);
1137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        device->common.close(&device->common);
114f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mStatus = STATUS_ERROR;
1157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return BAD_VALUE;
1167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Initialize device with callback functions */
1197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = device->ops->initialize(device, this);
1217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (res != OK) {
1227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to initialize HAL device: %s (%d)",
1237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala                __FUNCTION__, mId, strerror(-res), res);
1247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        device->common.close(&device->common);
125f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mStatus = STATUS_ERROR;
1267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return BAD_VALUE;
1277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Get vendor metadata tags */
1307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    mVendorTagOps.get_camera_vendor_section_name = NULL;
1327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    device->ops->get_metadata_vendor_tag_ops(device, &mVendorTagOps);
1347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (mVendorTagOps.get_camera_vendor_section_name != NULL) {
1367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        res = set_camera_metadata_vendor_tag_ops(&mVendorTagOps);
1377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        if (res != OK) {
1387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to set tag ops: %s (%d)",
1397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala                    __FUNCTION__, mId, strerror(-res), res);
1407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            device->common.close(&device->common);
141f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus = STATUS_ERROR;
1427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            return res;
1437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        }
1447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Start up request queue thread */
1477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
148f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRequestThread = new RequestThread(this, device);
149f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = mRequestThread->run(String8::format("C3Dev-%d-ReqQueue", mId).string());
1507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (res != OK) {
1517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start request queue thread: %s (%d)",
1527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala                __FUNCTION__, mId, strerror(-res), res);
1537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        device->common.close(&device->common);
154f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mRequestThread.clear();
155f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mStatus = STATUS_ERROR;
1567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        return res;
1577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
1587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /** Everything is good to go */
1607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    mDeviceInfo = info.static_camera_characteristics;
1627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    mHal3Device = device;
163f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mStatus = STATUS_IDLE;
164f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mNextStreamId = 0;
1657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return OK;
1677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
1687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::disconnect() {
1707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
171f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
1727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
173f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
174f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
175f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
176f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mStatus == STATUS_UNINITIALIZED) return OK;
177f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
178f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mStatus == STATUS_ACTIVE ||
179f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            (mStatus == STATUS_ERROR && mRequestThread != NULL)) {
180f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = mRequestThread->clearRepeatingRequests();
181f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
182f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Can't stop streaming", __FUNCTION__);
183f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return res;
184f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
185f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = waitUntilDrainedLocked();
186f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
187f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Timeout waiting for HAL to drain", __FUNCTION__);
188f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return res;
189f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
190f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
191f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    assert(mStatus == STATUS_IDLE || mStatus == STATUS_ERROR);
192f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
193f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mRequestThread != NULL) {
194f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mRequestThread->requestExit();
195f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mOutputStreams.clear();
198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mInputStream.clear();
199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mRequestThread != NULL) {
201f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mRequestThread->join();
202f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mRequestThread.clear();
203f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
204f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
205f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mHal3Device != NULL) {
206f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mHal3Device->common.close(&mHal3Device->common);
207f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mHal3Device = NULL;
208f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
209f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
210f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mStatus = STATUS_UNINITIALIZED;
211f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
212f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ALOGV("%s: X", __FUNCTION__);
213f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
2147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
2157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
2167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::dump(int fd, const Vector<String16> &args) {
2177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
2187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    (void)args;
219f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    String8 lines;
220f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
221f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    const char *status =
222f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus == STATUS_ERROR         ? "ERROR" :
223f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus == STATUS_UNINITIALIZED ? "UNINITIALIZED" :
224f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus == STATUS_IDLE          ? "IDLE" :
225f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus == STATUS_ACTIVE        ? "ACTIVE" :
226f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            "Unknown";
227f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    lines.appendFormat("    Device status: %s\n", status);
228f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    lines.appendFormat("    Stream configuration:\n");
229f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
230f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mInputStream != NULL) {
231f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        write(fd, lines.string(), lines.size());
232f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mInputStream->dump(fd, args);
233f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    } else {
234f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        lines.appendFormat("      No input stream.\n");
235f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        write(fd, lines.string(), lines.size());
236f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
237f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < mOutputStreams.size(); i++) {
238f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mOutputStreams[i]->dump(fd,args);
239f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
241f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mHal3Device != NULL) {
242f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        lines = String8("     HAL device dump:\n");
243f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        write(fd, lines.string(), lines.size());
244f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mHal3Device->ops->dump(mHal3Device, fd);
245f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
2477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return OK;
2487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
2497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
2507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaconst CameraMetadata& Camera3Device::info() const {
2517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ALOGVV("%s: E", __FUNCTION__);
252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (CC_UNLIKELY(mStatus == STATUS_UNINITIALIZED ||
253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    mStatus == STATUS_ERROR)) {
254f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ALOGE("%s: Access to static info %s!", __FUNCTION__,
255f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                mStatus == STATUS_ERROR ?
256f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                "when in error state" : "before init");
257f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return mDeviceInfo;
2597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
2607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
2617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::capture(CameraMetadata &request) {
2627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
263f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
264f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
2654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // TODO: take ownership of the request
2664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
267f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
268f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
269f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Device has encountered a serious error", __FUNCTION__);
270f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
271f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
272f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Device not initialized", __FUNCTION__);
273f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
274f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_IDLE:
275f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
276f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
277f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
278f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
279f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus);
280f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
281f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
2827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> newRequest = setUpRequestLocked(request);
284f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (newRequest == NULL) {
285f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ALOGE("%s: Can't create capture request", __FUNCTION__);
286f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return BAD_VALUE;
287f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
288f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
289f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return mRequestThread->queueRequest(newRequest);
2907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
2917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
2927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
2937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setStreamingRequest(const CameraMetadata &request) {
2947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
295f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
296f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
297f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
298f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
299f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Device has encountered a serious error", __FUNCTION__);
300f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
301f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
302f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Device not initialized", __FUNCTION__);
303f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
304f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_IDLE:
305f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
306f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
307f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
308f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
309f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus);
310f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
311f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
3127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
313f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> newRepeatingRequest = setUpRequestLocked(request);
314f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (newRepeatingRequest == NULL) {
315f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ALOGE("%s: Can't create repeating request", __FUNCTION__);
316f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return BAD_VALUE;
317f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
318f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
319f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    RequestList newRepeatingRequests;
320f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    newRepeatingRequests.push_back(newRepeatingRequest);
321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
322f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return mRequestThread->setRepeatingRequests(newRepeatingRequests);
323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
326f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::setUpRequestLocked(
327f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        const CameraMetadata &request) {
328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
330f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mStatus == STATUS_IDLE) {
331f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = configureStreamsLocked();
332f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
333f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Can't set up streams: %s (%d)",
334f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
335f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return NULL;
336f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
337f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
338f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
339f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> newRequest = createCaptureRequest(request);
340f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return newRequest;
3417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
3427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::clearStreamingRequest() {
3447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
345f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
346f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
347f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
348f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
349f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Device has encountered a serious error", __FUNCTION__);
350f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
351f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
352f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Device not initialized", __FUNCTION__);
353f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
354f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_IDLE:
355f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
356f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
357f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
358f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
359f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus);
360f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
361f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
3627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
363f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return mRequestThread->clearRepeatingRequests();
3647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
3657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) {
3677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
3687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return mRequestThread->waitUntilRequestProcessed(requestId, timeout);
3707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
3717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createStream(sp<ANativeWindow> consumer,
3737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        uint32_t width, uint32_t height, int format, size_t size, int *id) {
3747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
375f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
3767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
377f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
378f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    bool wasActive = false;
379f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
380f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
381f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
382f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Device has encountered a serious error", __FUNCTION__);
383f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
384f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
385f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Device not initialized", __FUNCTION__);
386f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
387f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_IDLE:
388f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
389f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
390f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
391f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__);
392f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mRequestThread->setPaused(true);
393f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            res = waitUntilDrainedLocked();
394f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            if (res != OK) {
395f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                ALOGE("%s: Can't pause captures to reconfigure streams!",
396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                        __FUNCTION__);
397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                mStatus = STATUS_ERROR;
398f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                return res;
399f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            }
400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            wasActive = true;
401f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus);
404f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
405f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
406f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    assert(mStatus == STATUS_IDLE);
407f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
408f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<Camera3OutputStream> newStream;
409f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (format == HAL_PIXEL_FORMAT_BLOB) {
410f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newStream = new Camera3OutputStream(mNextStreamId, consumer,
411f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                width, height, size, format);
412f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    } else {
413f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newStream = new Camera3OutputStream(mNextStreamId, consumer,
414f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                width, height, format);
415f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
416f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
417f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = mOutputStreams.add(mNextStreamId, newStream);
418f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (res < 0) {
419f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ALOGE("%s: Can't add new stream to set: %s (%d)",
420f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                __FUNCTION__, strerror(-res), res);
421f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return res;
422f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
423f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
424f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    *id = mNextStreamId++;
425f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
426f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Continue captures if active at start
427f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (wasActive) {
428f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__);
429f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = configureStreamsLocked();
430f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
431f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)",
432f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    __FUNCTION__, mNextStreamId, strerror(-res), res);
433f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return res;
434f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
435f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mRequestThread->setPaused(false);
436f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
437f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
438f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
4397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
4407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createReprocessStreamFromStream(int outputId, int *id) {
4427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
4437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    (void)outputId; (void)id;
4447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ALOGE("%s: Unimplemented", __FUNCTION__);
4467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return INVALID_OPERATION;
4477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
4487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::getStreamInfo(int id,
4517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        uint32_t *width, uint32_t *height, uint32_t *format) {
4527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
453f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
454f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
455f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
456f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
457f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Device has encountered a serious error", __FUNCTION__);
458f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
459f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
460f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Device not initialized!", __FUNCTION__);
461f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
462f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_IDLE:
463f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
464f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
465f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
466f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
467f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus);
468f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
469f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
4707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
471f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ssize_t idx = mOutputStreams.indexOfKey(id);
472f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (idx == NAME_NOT_FOUND) {
473f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ALOGE("%s: Stream %d is unknown", __FUNCTION__, id);
474f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return idx;
475f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
476f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
477f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (width) *width  = mOutputStreams[idx]->getWidth();
478f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (height) *height = mOutputStreams[idx]->getHeight();
479f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (format) *format = mOutputStreams[idx]->getFormat();
480f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
481f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
4827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
4837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setStreamTransform(int id,
4857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        int transform) {
4867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
487f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
488f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
489f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
490f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
491f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Device has encountered a serious error", __FUNCTION__);
492f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
493f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
494f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Device not initialized", __FUNCTION__);
495f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
496f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_IDLE:
497f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
498f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
499f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
500f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
501f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus);
502f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
503f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
5047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
505f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ssize_t idx = mOutputStreams.indexOfKey(id);
506f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (idx == NAME_NOT_FOUND) {
507f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ALOGE("%s: Stream %d does not exist",
508f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                __FUNCTION__, id);
509f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return BAD_VALUE;
510f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
511f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
512f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return mOutputStreams.editValueAt(idx)->setTransform(transform);
5137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
5147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteStream(int id) {
5167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
517f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
518f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
5197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
520f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // CameraDevice semantics require device to already be idle before
521f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // deleteStream is called, unlike for createStream.
522f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mStatus != STATUS_IDLE) {
523f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ALOGE("%s: Device not idle", __FUNCTION__);
524f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return INVALID_OPERATION;
525f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
526f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
527f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<Camera3Stream> deletedStream;
528f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mInputStream != NULL && id == mInputStream->getId()) {
529f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        deletedStream = mInputStream;
530f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mInputStream.clear();
531f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    } else {
532f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ssize_t idx = mOutputStreams.indexOfKey(id);
533f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (idx == NAME_NOT_FOUND) {
534f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Stream %d does not exist",
535f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    __FUNCTION__, id);
536f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return BAD_VALUE;
537f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
538f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        deletedStream = mOutputStreams.editValueAt(idx);
539f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mOutputStreams.removeItem(id);
540f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
541f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
542f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Free up the stream endpoint so that it can be used by some other stream
543f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = deletedStream->disconnect();
544f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (res != OK) {
545f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ALOGE("%s: Can't disconnect deleted stream", __FUNCTION__);
546f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // fall through since we want to still list the stream as deleted.
547f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
548f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mDeletedStreams.add(deletedStream);
549f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
550f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return res;
5517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
5527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::deleteReprocessStream(int id) {
5547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
5557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    (void)id;
5567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ALOGE("%s: Unimplemented", __FUNCTION__);
5587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return INVALID_OPERATION;
5597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
5607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::createDefaultRequest(int templateId,
5637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        CameraMetadata *request) {
5647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
5657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
566f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
567f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
568f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
569f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
570f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Device has encountered a serious error", __FUNCTION__);
571f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
572f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
573f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Device is not initialized!", __FUNCTION__);
574f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
575f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_IDLE:
576f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
577f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // OK
578f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
579f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
580f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus);
581f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
582f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
5837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    const camera_metadata_t *rawRequest;
5857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    rawRequest = mHal3Device->ops->construct_default_request_settings(
5867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        mHal3Device, templateId);
5877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (rawRequest == NULL) return DEAD_OBJECT;
5887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    *request = rawRequest;
5897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return OK;
5917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
5927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitUntilDrained() {
5947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
595f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mLock);
5967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
597f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return waitUntilDrainedLocked();
598f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
599f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
600f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::waitUntilDrainedLocked() {
601f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ATRACE_CALL();
602f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
603f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
604f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    switch (mStatus) {
605f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_UNINITIALIZED:
606f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_IDLE:
607f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGV("%s: Already idle", __FUNCTION__);
608f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return OK;
609f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ERROR:
610f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        case STATUS_ACTIVE:
611f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // Need to shut down
612f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
613f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        default:
614f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus);
615f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
616f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
617f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
618f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mRequestThread != NULL) {
619f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = mRequestThread->waitUntilPaused(kShutdownTimeout);
620f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
621f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Can't stop request thread in %f seconds!",
622f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    __FUNCTION__, kShutdownTimeout/1e9);
623f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus = STATUS_ERROR;
624f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return res;
625f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
626f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
627f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mInputStream != NULL) {
628f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = mInputStream->waitUntilIdle(kShutdownTimeout);
629f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
630f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Can't idle input stream %d in %f seconds!",
631f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    __FUNCTION__, mInputStream->getId(), kShutdownTimeout/1e9);
632f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus = STATUS_ERROR;
633f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return res;
634f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
635f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
636f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < mOutputStreams.size(); i++) {
637f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = mOutputStreams.editValueAt(i)->waitUntilIdle(kShutdownTimeout);
638f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
639f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Can't idle output stream %d in %f seconds!",
640f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    __FUNCTION__, mOutputStreams.keyAt(i),
641f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    kShutdownTimeout/1e9);
642f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mStatus = STATUS_ERROR;
643f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return res;
644f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
645f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
646f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
647f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mStatus != STATUS_ERROR) {
648f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mStatus = STATUS_IDLE;
649f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
650f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
651f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
6527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
6537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
6547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::setNotifyCallback(NotificationListener *listener) {
6557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
6567d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex::Autolock l(mOutputLock);
6577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
6587d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    if (listener != NULL && mListener != NULL) {
6597d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        ALOGW("%s: Replacing old callback listener", __FUNCTION__);
6607d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
6617d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    mListener = listener;
6627d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
6637d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    return OK;
6647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
6657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
6667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::waitForNextFrame(nsecs_t timeout) {
6677d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    ATRACE_CALL();
6687d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    status_t res;
6697d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex::Autolock l(mOutputLock);
6707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
6717d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    while (mResultQueue.empty()) {
6727d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        res = mResultSignal.waitRelative(mOutputLock, timeout);
6737d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (res == TIMED_OUT) {
6747d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            return res;
6757d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        } else if (res != OK) {
6767d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            ALOGE("%s: Camera %d: Error waiting for frame: %s (%d)",
6777d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                    __FUNCTION__, mId, strerror(-res), res);
6787d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            return res;
6797d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
6807d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
6817d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    return OK;
6827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
6837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
6847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::getNextFrame(CameraMetadata *frame) {
6857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
6867d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex::Autolock l(mOutputLock);
6877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
6887d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    if (mResultQueue.empty()) {
6897d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        return NOT_ENOUGH_DATA;
6907d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
6917d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
6927d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    CameraMetadata &result = *(mResultQueue.begin());
6937d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    frame->acquire(result);
6947d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    mResultQueue.erase(mResultQueue.begin());
6957d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
6967d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    return OK;
6977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
6987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
6997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerAutofocus(uint32_t id) {
7007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
7017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id);
7034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Mix-in this trigger into the next request and only the next request.
7044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    RequestTrigger trigger[] = {
7054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
7064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER,
7074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER_START
7084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
7094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
7104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER_ID,
7114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            static_cast<int32_t>(id)
7124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
7134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
7144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
7154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return mRequestThread->queueTrigger(trigger,
7164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                        sizeof(trigger)/sizeof(trigger[0]));
7177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
7187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerCancelAutofocus(uint32_t id) {
7207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
7217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    ALOGV("%s: Triggering cancel autofocus, id %d", __FUNCTION__, id);
7234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Mix-in this trigger into the next request and only the next request.
7244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    RequestTrigger trigger[] = {
7254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
7264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER,
7274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER_CANCEL
7284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
7294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
7304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AF_TRIGGER_ID,
7314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            static_cast<int32_t>(id)
7324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
7334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
7344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
7354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return mRequestThread->queueTrigger(trigger,
7364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                        sizeof(trigger)/sizeof(trigger[0]));
7377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
7387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::triggerPrecaptureMetering(uint32_t id) {
7407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
7417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id);
7434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Mix-in this trigger into the next request and only the next request.
7444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    RequestTrigger trigger[] = {
7454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
7464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,
7474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START
7484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
7494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        {
7504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ANDROID_CONTROL_AE_PRECAPTURE_ID,
7514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            static_cast<int32_t>(id)
7524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        },
7534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
7544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
7554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return mRequestThread->queueTrigger(trigger,
7564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                        sizeof(trigger)/sizeof(trigger[0]));
7577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
7587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalastatus_t Camera3Device::pushReprocessBuffer(int reprocessStreamId,
7607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        buffer_handle_t *buffer, wp<BufferReleasedListener> listener) {
7617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ATRACE_CALL();
7627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    (void)reprocessStreamId; (void)buffer; (void)listener;
7637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    ALOGE("%s: Unimplemented", __FUNCTION__);
7657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    return INVALID_OPERATION;
7667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
7677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
768f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/**
769f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera3Device private methods
770f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */
771f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
772f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest> Camera3Device::createCaptureRequest(
773f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        const CameraMetadata &request) {
774f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ATRACE_CALL();
775f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
776f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
777f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> newRequest = new CaptureRequest;
778f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    newRequest->mSettings = request;
779f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
780f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera_metadata_entry_t inputStreams =
781f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            newRequest->mSettings.find(ANDROID_REQUEST_INPUT_STREAMS);
782f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (inputStreams.count > 0) {
783f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (mInputStream == NULL ||
784f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                mInputStream->getId() != inputStreams.data.u8[0]) {
785f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Request references unknown input stream %d",
786f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    __FUNCTION__, inputStreams.data.u8[0]);
787f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return NULL;
788f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
789f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Lazy completion of stream configuration (allocation/registration)
790f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // on first use
791f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (mInputStream->isConfiguring()) {
792f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            res = mInputStream->finishConfiguration(mHal3Device);
793f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            if (res != OK) {
794f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                ALOGE("%s: Unable to finish configuring input stream %d:"
795f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                        " %s (%d)",
796f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                        __FUNCTION__, mInputStream->getId(),
797f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                        strerror(-res), res);
798f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                return NULL;
799f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            }
800f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
801f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
802f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newRequest->mInputStream = mInputStream;
803f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newRequest->mSettings.erase(ANDROID_REQUEST_INPUT_STREAMS);
804f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
805f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
806f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera_metadata_entry_t streams =
807f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            newRequest->mSettings.find(ANDROID_REQUEST_OUTPUT_STREAMS);
808f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (streams.count == 0) {
809f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ALOGE("%s: Zero output streams specified!", __FUNCTION__);
810f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return NULL;
811f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
812f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
813f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < streams.count; i++) {
814f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        int idx = mOutputStreams.indexOfKey(streams.data.u8[i]);
815f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (idx == NAME_NOT_FOUND) {
816f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Request references unknown stream %d",
817f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    __FUNCTION__, streams.data.u8[i]);
818f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return NULL;
819f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
820f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<Camera3OutputStream> stream = mOutputStreams.editValueAt(idx);
821f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
822f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Lazy completion of stream configuration (allocation/registration)
823f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // on first use
824f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (stream->isConfiguring()) {
825f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            res = stream->finishConfiguration(mHal3Device);
826f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            if (res != OK) {
827f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                ALOGE("%s: Unable to finish configuring stream %d: %s (%d)",
828f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                        __FUNCTION__, stream->getId(), strerror(-res), res);
829f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                return NULL;
830f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            }
831f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
832f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
833f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        newRequest->mOutputStreams.push(stream);
834f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
835f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    newRequest->mSettings.erase(ANDROID_REQUEST_OUTPUT_STREAMS);
836f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
837f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return newRequest;
8387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
8397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
840f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::configureStreamsLocked() {
841f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    ATRACE_CALL();
842f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
8437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
844f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mStatus != STATUS_IDLE) {
845f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ALOGE("%s: Not idle", __FUNCTION__);
846f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return INVALID_OPERATION;
847f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
848f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
849f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Start configuring the streams
850f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
851f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_stream_configuration config;
852f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
853f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    config.num_streams = (mInputStream != NULL) + mOutputStreams.size();
854f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
855f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Vector<camera3_stream_t*> streams;
856f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    streams.setCapacity(config.num_streams);
857f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
858f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mInputStream != NULL) {
859f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_stream_t *inputStream;
860f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        inputStream = mInputStream->startConfiguration();
861f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (inputStream == NULL) {
862f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Can't start input stream configuration",
863f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    __FUNCTION__);
864f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // TODO: Make sure the error flow here is correct
865f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
866f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
867f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        streams.add(inputStream);
868f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
869f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
870f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < mOutputStreams.size(); i++) {
871f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_stream_t *outputStream;
872f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        outputStream = mOutputStreams.editValueAt(i)->startConfiguration();
873f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (outputStream == NULL) {
874f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("%s: Can't start output stream configuration",
875f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    __FUNCTION__);
876f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // TODO: Make sure the error flow here is correct
877f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return INVALID_OPERATION;
878f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
879f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        streams.add(outputStream);
880f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
881f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
882f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    config.streams = streams.editArray();
883f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
884f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Do the HAL configuration; will potentially touch stream
885f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // max_buffers, usage, priv fields.
886f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
887f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = mHal3Device->ops->configure_streams(mHal3Device, &config);
888f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
889f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (res != OK) {
890f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ALOGE("%s: Unable to configure streams with HAL: %s (%d)",
891f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                __FUNCTION__, strerror(-res), res);
892f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return res;
893f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
894f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
895f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Request thread needs to know to avoid using repeat-last-settings protocol
896f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // across configure_streams() calls
897f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRequestThread->configurationComplete();
898f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
899f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Finish configuring the streams lazily on first reference
900f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
901f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mStatus = STATUS_ACTIVE;
902f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
903f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
9047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
9057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
906f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
907f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/**
908f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Camera HAL device callback methods
909f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */
910f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
9117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::processCaptureResult(const camera3_capture_result *result) {
9127d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    ATRACE_CALL();
9137d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
9147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    status_t res;
9157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
9167d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    if (result->result == NULL) {
9177d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        // TODO: Report error upstream
9187d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        ALOGW("%s: No metadata for frame %d", __FUNCTION__,
9197d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                result->frame_number);
9207d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        return;
9217d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
9227d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
9237d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    nsecs_t timestamp = 0;
9247d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    AlgState cur3aState;
9257d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    AlgState new3aState;
9267d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    int32_t aeTriggerId = 0;
9277d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    int32_t afTriggerId = 0;
9287d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
9297d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    NotificationListener *listener;
9307d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
9317d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    {
9327d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        Mutex::Autolock l(mOutputLock);
9337d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
9347d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        // Push result metadata into queue
9357d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        mResultQueue.push_back(CameraMetadata());
936d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin        // Lets avoid copies! Too bad there's not a #back method
937d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin        CameraMetadata &captureResult = *(--mResultQueue.end());
9387d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
9397d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        captureResult = result->result;
940d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin        if (captureResult.update(ANDROID_REQUEST_FRAME_COUNT,
941d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin                (int32_t*)&result->frame_number, 1) != OK) {
942d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin            ALOGE("%s: Camera %d: Failed to set frame# in metadata (%d)",
943d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin                  __FUNCTION__, mId, result->frame_number);
944d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin            // TODO: Report error upstream
945d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin        } else {
946d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin            ALOGVV("%s: Camera %d: Set frame# in metadata (%d)",
947d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin                  __FUNCTION__, mId, result->frame_number);
948d2c90696403bb3c9e28d7b51d65c9468bdf8e78bIgor Murashkin        }
9497d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
9507d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        // Get timestamp from result metadata
9517d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
9527d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        camera_metadata_entry entry =
9537d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                captureResult.find(ANDROID_SENSOR_TIMESTAMP);
9547d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (entry.count == 0) {
9557d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            ALOGE("%s: Camera %d: No timestamp provided by HAL for frame %d!",
9567d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                    __FUNCTION__, mId, result->frame_number);
9577d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            // TODO: Report error upstream
9587d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        } else {
9597d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            timestamp = entry.data.i64[0];
9607d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
9617d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
9627d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        // Get 3A states from result metadata
9637d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
9647d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        entry = captureResult.find(ANDROID_CONTROL_AE_STATE);
9657d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (entry.count == 0) {
9667d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            ALOGE("%s: Camera %d: No AE state provided by HAL for frame %d!",
9677d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                    __FUNCTION__, mId, result->frame_number);
9687d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        } else {
9697d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            new3aState.aeState =
9707d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                    static_cast<camera_metadata_enum_android_control_ae_state>(
9717d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                        entry.data.u8[0]);
9727d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
9737d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
9747d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        entry = captureResult.find(ANDROID_CONTROL_AF_STATE);
9757d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (entry.count == 0) {
9767d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            ALOGE("%s: Camera %d: No AF state provided by HAL for frame %d!",
9777d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                    __FUNCTION__, mId, result->frame_number);
9787d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        } else {
9797d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            new3aState.afState =
9807d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                    static_cast<camera_metadata_enum_android_control_af_state>(
9817d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                        entry.data.u8[0]);
9827d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
9837d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
9847d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        entry = captureResult.find(ANDROID_CONTROL_AWB_STATE);
9857d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (entry.count == 0) {
9867d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            ALOGE("%s: Camera %d: No AWB state provided by HAL for frame %d!",
9877d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                    __FUNCTION__, mId, result->frame_number);
9887d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        } else {
9897d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            new3aState.awbState =
9907d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                    static_cast<camera_metadata_enum_android_control_awb_state>(
9917d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                        entry.data.u8[0]);
9927d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
9937d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
9947d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        entry = captureResult.find(ANDROID_CONTROL_AF_TRIGGER_ID);
9957d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (entry.count == 0) {
9967d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            ALOGE("%s: Camera %d: No AF trigger ID provided by HAL for frame %d!",
9977d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                    __FUNCTION__, mId, result->frame_number);
9987d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        } else {
9997d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            afTriggerId = entry.data.i32[0];
10007d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
10017d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
10027d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        entry = captureResult.find(ANDROID_CONTROL_AE_PRECAPTURE_ID);
10037d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (entry.count == 0) {
10047d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            ALOGE("%s: Camera %d: No AE precapture trigger ID provided by HAL"
10057d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                    " for frame %d!", __FUNCTION__, mId, result->frame_number);
10067d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        } else {
10077d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            aeTriggerId = entry.data.i32[0];
10087d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
10097d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
10107d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        listener = mListener;
10117d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        cur3aState = m3AState;
10127d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
10137d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        m3AState = new3aState;
10147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    } // scope for mOutputLock
10157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
10167d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    // Return completed buffers to their streams
10177d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    for (size_t i = 0; i < result->num_output_buffers; i++) {
10187d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        Camera3Stream *stream =
10197d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                Camera3Stream::cast(result->output_buffers[i].stream);
10207d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        res = stream->returnBuffer(result->output_buffers[i], timestamp);
10217d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        // Note: stream may be deallocated at this point, if this buffer was the
10227d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        // last reference to it.
10237d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (res != OK) {
10247d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            ALOGE("%s: Camera %d: Can't return buffer %d for frame %d to its"
10257d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                    "  stream:%s (%d)",  __FUNCTION__, mId, i,
10267d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                    result->frame_number, strerror(-res), res);
10277d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            // TODO: Report error upstream
10287d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
10297d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
10307d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
10317d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    // Dispatch any 3A change events to listeners
10327d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    if (listener != NULL) {
10337d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (new3aState.aeState != cur3aState.aeState) {
10344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ALOGVV("%s: AE state changed from 0x%x to 0x%x",
10354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                   __FUNCTION__, cur3aState.aeState, new3aState.aeState);
10367d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            listener->notifyAutoExposure(new3aState.aeState, aeTriggerId);
10377d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
10387d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (new3aState.afState != cur3aState.afState) {
10394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ALOGVV("%s: AF state changed from 0x%x to 0x%x",
10404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                   __FUNCTION__, cur3aState.afState, new3aState.afState);
10417d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            listener->notifyAutoFocus(new3aState.afState, afTriggerId);
10427d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
10437d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (new3aState.awbState != cur3aState.awbState) {
10447d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            listener->notifyAutoWhitebalance(new3aState.awbState, aeTriggerId);
10457d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
10467d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
10477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
10497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::notify(const camera3_notify_msg *msg) {
10517d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    NotificationListener *listener;
10527d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    {
10537d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        Mutex::Autolock l(mOutputLock);
10547d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        if (mListener == NULL) return;
10557d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        listener = mListener;
10567d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
10577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10587d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    if (msg == NULL) {
10597d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        ALOGE("%s: Camera %d: HAL sent NULL notify message!",
10607d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                __FUNCTION__, mId);
10617d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        return;
10627d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
10637d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
10647d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    switch (msg->type) {
10657d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        case CAMERA3_MSG_ERROR: {
10667d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            int streamId = 0;
10677d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            if (msg->message.error.error_stream != NULL) {
10687d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                Camera3Stream *stream =
10697d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                        Camera3Stream::cast(
10707d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                                  msg->message.error.error_stream);
10717d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                streamId = stream->getId();
10727d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            }
10737d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            listener->notifyError(msg->message.error.error_code,
10747d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                    msg->message.error.frame_number, streamId);
10757d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            break;
10767d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
10777d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        case CAMERA3_MSG_SHUTTER: {
10787d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            listener->notifyShutter(msg->message.shutter.frame_number,
10797d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                    msg->message.shutter.timestamp);
10807d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            break;
10817d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
10827d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        default:
10837d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown notify message from HAL: %d",
10847d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                    __FUNCTION__, mId, msg->type);
10857d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    }
10867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
10877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
10887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/**
1089f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * RequestThread inner class methods
1090f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */
1091f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1092f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville TalvalaCamera3Device::RequestThread::RequestThread(wp<Camera3Device> parent,
1093f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_device_t *hal3Device) :
1094f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Thread(false),
1095f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mParent(parent),
1096f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mHal3Device(hal3Device),
1097f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mReconfigured(false),
1098f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mDoPause(false),
1099f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mPaused(true),
11004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mFrameNumber(0),
11014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mLatestRequestId(NAME_NOT_FOUND) {
1102f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1103f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1104f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::configurationComplete() {
1105f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
1106f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mReconfigured = true;
1107f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1108f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1109f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::queueRequest(
1110f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         sp<CaptureRequest> request) {
1111f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
1112f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRequestQueue.push_back(request);
1113f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1114f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
1115f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1116f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
11174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
11184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTrigger(
11194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger[],
11204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        size_t count) {
11214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
11224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Mutex::Autolock l(mTriggerMutex);
11234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    status_t ret;
11244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
11254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    for (size_t i = 0; i < count; ++i) {
11264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ret = queueTriggerLocked(trigger[i]);
11274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
11284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (ret != OK) {
11294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return ret;
11304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
11314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
11324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
11334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return OK;
11344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
11354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
11364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::queueTriggerLocked(
11374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger) {
11384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
11394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    uint32_t tag = trigger.metadataTag;
11404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    ssize_t index = mTriggerMap.indexOfKey(tag);
11414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
11424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    switch (trigger.getTagType()) {
11434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        case TYPE_BYTE:
11444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // fall-through
11454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        case TYPE_INT32:
11464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            break;
11474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        default:
11484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ALOGE("%s: Type not supported: 0x%x",
11494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  __FUNCTION__,
11504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  trigger.getTagType());
11514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return INVALID_OPERATION;
11524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
11534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
11544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
11554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Collect only the latest trigger, since we only have 1 field
11564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * in the request settings per trigger tag, and can't send more than 1
11574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * trigger per request.
11584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
11594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    if (index != NAME_NOT_FOUND) {
11604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mTriggerMap.editValueAt(index) = trigger;
11614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    } else {
11624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mTriggerMap.add(tag, trigger);
11634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
11644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
11654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return OK;
11664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
11674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
1168f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::setRepeatingRequests(
1169f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        const RequestList &requests) {
1170f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
1171f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRepeatingRequests.clear();
1172f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRepeatingRequests.insert(mRepeatingRequests.begin(),
1173f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            requests.begin(), requests.end());
1174f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
1175f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1176f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1177f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::clearRepeatingRequests() {
1178f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
1179f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mRepeatingRequests.clear();
1180f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
1181f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1182f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1183f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::setPaused(bool paused) {
1184f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mPauseLock);
1185f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mDoPause = paused;
1186f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mDoPauseSignal.signal();
1187f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1188f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1189f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalastatus_t Camera3Device::RequestThread::waitUntilPaused(nsecs_t timeout) {
1190f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
1191f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mPauseLock);
1192f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    while (!mPaused) {
1193f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = mPausedSignal.waitRelative(mPauseLock, timeout);
1194f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res == TIMED_OUT) {
1195f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return res;
1196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return OK;
1199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
12014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::waitUntilRequestProcessed(
12024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t requestId, nsecs_t timeout) {
12034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Mutex::Autolock l(mLatestRequestMutex);
12044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    status_t res;
12054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    while (mLatestRequestId != requestId) {
12064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        nsecs_t startTime = systemTime();
12074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
12084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        res = mLatestRequestSignal.waitRelative(mLatestRequestMutex, timeout);
12094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (res != OK) return res;
12104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
12114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        timeout -= (systemTime() - startTime);
12124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
12134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
12144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return OK;
12154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
12164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
12174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
12184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
1219f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::threadLoop() {
1220f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1221f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
1222f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1223f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Handle paused state.
1224f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (waitIfPaused()) {
1225f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return true;
1226f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1227f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1228f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Get work to do
1229f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1230f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> nextRequest = waitForNextRequest();
1231f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (nextRequest == NULL) {
1232f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return true;
1233f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1234f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1235f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Create request to HAL
1236f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_capture_request_t request = camera3_capture_request_t();
12374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Vector<camera3_stream_buffer_t> outputBuffers;
1238f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
12394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Insert any queued triggers (before metadata is locked)
12404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    int32_t triggerCount;
12414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    res = insertTriggers(nextRequest);
12424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    if (res < 0) {
12434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ALOGE("RequestThread: Unable to insert triggers "
12444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              "(capture request %d, HAL device: %s (%d)",
12454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              (mFrameNumber+1), strerror(-res), res);
12464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        cleanUpFailedRequest(request, nextRequest, outputBuffers);
12474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        return false;
12484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
12494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    triggerCount = res;
12504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
12514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    bool triggersMixedIn = (triggerCount > 0 || mPrevTriggers > 0);
12524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
12534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // If the request is the same as last, or we had triggers last time
12544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    if (mPrevRequest != nextRequest || triggersMixedIn) {
12554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        /**
12564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * The request should be presorted so accesses in HAL
12574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         *   are O(logn). Sidenote, sorting a sorted metadata is nop.
12584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
12594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        nextRequest->mSettings.sort();
1260f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.settings = nextRequest->mSettings.getAndLock();
1261f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mPrevRequest = nextRequest;
12624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ALOGVV("%s: Request settings are NEW", __FUNCTION__);
12634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
12644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        IF_ALOGV() {
12654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            camera_metadata_ro_entry_t e = camera_metadata_ro_entry_t();
12664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            find_camera_metadata_ro_entry(
12674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                    request.settings,
12684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                    ANDROID_CONTROL_AF_TRIGGER,
12694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                    &e
12704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            );
12714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            if (e.count > 0) {
12724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                ALOGV("%s: Request (frame num %d) had AF trigger 0x%x",
12734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      __FUNCTION__,
12744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      mFrameNumber+1,
12754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      e.data.u8[0]);
12764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            }
12774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
12784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    } else {
12794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // leave request.settings NULL to indicate 'reuse latest given'
12804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ALOGVV("%s: Request settings are REUSED",
12814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin               __FUNCTION__);
12824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
1283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1284f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_stream_buffer_t inputBuffer;
1285f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1286f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Fill in buffers
1287f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1288f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (nextRequest->mInputStream != NULL) {
1289f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.input_buffer = &inputBuffer;
1290f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = nextRequest->mInputStream->getBuffer(&inputBuffer);
1291f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
1292f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("RequestThread: Can't get input buffer, skipping request:"
1293f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    " %s (%d)", strerror(-res), res);
1294f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            cleanUpFailedRequest(request, nextRequest, outputBuffers);
1295f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return true;
1296f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1297f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    } else {
1298f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.input_buffer = NULL;
1299f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1300f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1301f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    outputBuffers.insertAt(camera3_stream_buffer_t(), 0,
1302f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            nextRequest->mOutputStreams.size());
1303f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    request.output_buffers = outputBuffers.array();
1304f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < nextRequest->mOutputStreams.size(); i++) {
1305f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = nextRequest->mOutputStreams.editItemAt(i)->
1306f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                getBuffer(&outputBuffers.editItemAt(i));
1307f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res != OK) {
1308f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            ALOGE("RequestThread: Can't get output buffer, skipping request:"
1309f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    "%s (%d)", strerror(-res), res);
1310f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            cleanUpFailedRequest(request, nextRequest, outputBuffers);
1311f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return true;
1312f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1313f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.num_output_buffers++;
1314f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1315f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1316f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    request.frame_number = mFrameNumber++;
1317f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
13184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
1319f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Submit request and block until ready for next one
1320f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    res = mHal3Device->ops->process_capture_request(mHal3Device, &request);
1322f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (res != OK) {
1323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        ALOGE("RequestThread: Unable to submit capture request %d to HAL"
1324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                " device: %s (%d)", request.frame_number, strerror(-res), res);
1325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        cleanUpFailedRequest(request, nextRequest, outputBuffers);
1326f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        return false;
1327f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (request.settings != NULL) {
1330f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest->mSettings.unlock(request.settings);
1331f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
13324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
13334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Remove any previously queued triggers (after unlock)
13344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    res = removeTriggers(mPrevRequest);
13354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    if (res != OK) {
13364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ALOGE("RequestThread: Unable to remove triggers "
13374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              "(capture request %d, HAL device: %s (%d)",
13384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              request.frame_number, strerror(-res), res);
13394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        return false;
13404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
13414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    mPrevTriggers = triggerCount;
13424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
13434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Read android.request.id from the request settings metadata
13444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // - inform waitUntilRequestProcessed thread of a new request ID
13454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    {
13464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Mutex::Autolock al(mLatestRequestMutex);
13474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
13484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        camera_metadata_entry_t requestIdEntry =
13494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                nextRequest->mSettings.find(ANDROID_REQUEST_ID);
13504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (requestIdEntry.count > 0) {
13514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            mLatestRequestId = requestIdEntry.data.i32[0];
13524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        } else {
13534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ALOGW("%s: Did not have android.request.id set in the request",
13544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  __FUNCTION__);
13554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            mLatestRequestId = NAME_NOT_FOUND;
13564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
13574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
13584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        mLatestRequestSignal.signal();
13594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
13604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
1361f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return true;
1362f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1363f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1364f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalavoid Camera3Device::RequestThread::cleanUpFailedRequest(
1365f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_capture_request_t &request,
1366f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<CaptureRequest> &nextRequest,
1367f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Vector<camera3_stream_buffer_t> &outputBuffers) {
1368f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1369f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (request.settings != NULL) {
1370f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest->mSettings.unlock(request.settings);
1371f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1372f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (request.input_buffer != NULL) {
1373f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        request.input_buffer->status = CAMERA3_BUFFER_STATUS_ERROR;
1374f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest->mInputStream->returnBuffer(*(request.input_buffer), 0);
1375f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1376f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    for (size_t i = 0; i < request.num_output_buffers; i++) {
1377f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        outputBuffers.editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR;
1378f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest->mOutputStreams.editItemAt(i)->returnBuffer(
1379f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            outputBuffers[i], 0);
1380f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1381f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // TODO: Report error upstream
1382f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1383f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1384f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalasp<Camera3Device::CaptureRequest>
1385f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Camera3Device::RequestThread::waitForNextRequest() {
1386f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
1387f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> nextRequest;
1388f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1389f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Optimized a bit for the simple steady-state case (single repeating
1390f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // request), to avoid putting that request in the queue temporarily.
1391f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mRequestLock);
1392f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1393f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    while (mRequestQueue.empty()) {
1394f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (!mRepeatingRequests.empty()) {
1395f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // Always atomically enqueue all requests in a repeating request
1396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // list. Guarantees a complete in-sequence set of captures to
1397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // application.
1398f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            const RequestList &requests = mRepeatingRequests;
1399f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            RequestList::const_iterator firstRequest =
1400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    requests.begin();
1401f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            nextRequest = *firstRequest;
1402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mRequestQueue.insert(mRequestQueue.end(),
1403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    ++firstRequest,
1404f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                    requests.end());
1405f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // No need to wait any longer
1406f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            break;
1407f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1408f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1409f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = mRequestSignal.waitRelative(mRequestLock, kRequestTimeout);
1410f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1411f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res == TIMED_OUT) {
1412f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // Signal that we're paused by starvation
1413f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            Mutex::Autolock pl(mPauseLock);
1414f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            if (mPaused == false) {
1415f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                mPaused = true;
1416f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                mPausedSignal.signal();
1417f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            }
1418f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            // Stop waiting for now and let thread management happen
1419f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return NULL;
1420f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1421f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1422f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1423f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (nextRequest == NULL) {
1424f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Don't have a repeating request already in hand, so queue
1425f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // must have an entry now.
1426f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList::iterator firstRequest =
1427f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                mRequestQueue.begin();
1428f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        nextRequest = *firstRequest;
1429f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mRequestQueue.erase(firstRequest);
1430f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1431f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1432f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Not paused
1433f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock pl(mPauseLock);
1434f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    mPaused = false;
1435f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1436f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Check if we've reconfigured since last time, and reset the preview
1437f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // request if so. Can't use 'NULL request == repeat' across configure calls.
1438f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    if (mReconfigured) {
1439f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mPrevRequest.clear();
1440f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        mReconfigured = false;
1441f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1442f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1443f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return nextRequest;
1444f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1445f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1446f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvalabool Camera3Device::RequestThread::waitIfPaused() {
1447f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t res;
1448f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex::Autolock l(mPauseLock);
1449f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    while (mDoPause) {
1450f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Signal that we're paused by request
1451f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (mPaused == false) {
1452f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mPaused = true;
1453f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            mPausedSignal.signal();
1454f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1455f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        res = mDoPauseSignal.waitRelative(mPauseLock, kRequestTimeout);
1456f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        if (res == TIMED_OUT) {
1457f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala            return true;
1458f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        }
1459f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }
1460f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // We don't set mPaused to false here, because waitForNextRequest needs
1461f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // to further manage the paused state in case of starvation.
1462f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    return false;
1463f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala}
1464f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
14654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::insertTriggers(
14664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        const sp<CaptureRequest> &request) {
14674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
14684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Mutex::Autolock al(mTriggerMutex);
14694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
14704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    CameraMetadata &metadata = request->mSettings;
14714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    size_t count = mTriggerMap.size();
14724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
14734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    for (size_t i = 0; i < count; ++i) {
14744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger = mTriggerMap.valueAt(i);
14754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
14764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        uint32_t tag = trigger.metadataTag;
14774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        camera_metadata_entry entry = metadata.find(tag);
14784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
14794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (entry.count > 0) {
14804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            /**
14814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             * Already has an entry for this trigger in the request.
14824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             * Rewrite it with our requested trigger value.
14834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             */
14844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            RequestTrigger oldTrigger = trigger;
14854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
14864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            oldTrigger.entryValue = entry.data.u8[0];
14874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
14884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            mTriggerReplacedMap.add(tag, oldTrigger);
14894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        } else {
14904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            /**
14914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             * More typical, no trigger entry, so we just add it
14924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin             */
14934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            mTriggerRemovedMap.add(tag, trigger);
14944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
14954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
14964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t res;
14974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
14984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        switch (trigger.getTagType()) {
14994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            case TYPE_BYTE: {
15004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue);
15014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                res = metadata.update(tag,
15024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      &entryValue,
15034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      /*count*/1);
15044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                break;
15054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            }
15064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            case TYPE_INT32:
15074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                res = metadata.update(tag,
15084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      &trigger.entryValue,
15094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      /*count*/1);
15104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                break;
15114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            default:
15124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                ALOGE("%s: Type not supported: 0x%x",
15134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      __FUNCTION__,
15144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      trigger.getTagType());
15154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                return INVALID_OPERATION;
15164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
15174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
15184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (res != OK) {
15194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ALOGE("%s: Failed to update request metadata with trigger tag %s"
15204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  ", value %d", __FUNCTION__, trigger.getTagName(),
15214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  trigger.entryValue);
15224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return res;
15234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
15244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
15254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        ALOGV("%s: Mixed in trigger %s, value %d", __FUNCTION__,
15264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              trigger.getTagName(),
15274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin              trigger.entryValue);
15284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
15294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
15304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    mTriggerMap.clear();
15314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
15324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return count;
15334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
15344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
15354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkinstatus_t Camera3Device::RequestThread::removeTriggers(
15364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        const sp<CaptureRequest> &request) {
15374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    Mutex::Autolock al(mTriggerMutex);
15384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
15394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    CameraMetadata &metadata = request->mSettings;
15404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
15414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
15424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Replace all old entries with their old values.
15434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
15444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    for (size_t i = 0; i < mTriggerReplacedMap.size(); ++i) {
15454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger = mTriggerReplacedMap.valueAt(i);
15464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
15474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t res;
15484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
15494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        uint32_t tag = trigger.metadataTag;
15504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        switch (trigger.getTagType()) {
15514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            case TYPE_BYTE: {
15524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue);
15534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                res = metadata.update(tag,
15544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      &entryValue,
15554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      /*count*/1);
15564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                break;
15574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            }
15584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            case TYPE_INT32:
15594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                res = metadata.update(tag,
15604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      &trigger.entryValue,
15614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                                      /*count*/1);
15624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                break;
15634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            default:
15644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                ALOGE("%s: Type not supported: 0x%x",
15654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      __FUNCTION__,
15664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                      trigger.getTagType());
15674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                return INVALID_OPERATION;
15684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
15694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
15704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (res != OK) {
15714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ALOGE("%s: Failed to restore request metadata with trigger tag %s"
15724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  ", trigger value %d", __FUNCTION__,
15734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  trigger.getTagName(), trigger.entryValue);
15744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return res;
15754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
15764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
15774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    mTriggerReplacedMap.clear();
15784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
15794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
15804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Remove all new entries.
15814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
15824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    for (size_t i = 0; i < mTriggerRemovedMap.size(); ++i) {
15834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        RequestTrigger trigger = mTriggerRemovedMap.valueAt(i);
15844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t res = metadata.erase(trigger.metadataTag);
15854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
15864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        if (res != OK) {
15874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            ALOGE("%s: Failed to erase metadata with trigger tag %s"
15884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  ", trigger value %d", __FUNCTION__,
15894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin                  trigger.getTagName(), trigger.entryValue);
15904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return res;
15914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
15924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    }
15934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    mTriggerRemovedMap.clear();
15944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
15954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    return OK;
15964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin}
15974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
15984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
15994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
1600f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala/**
16017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Static callback forwarding methods from HAL to instance
16027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */
16037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
16047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sProcessCaptureResult(const camera3_callback_ops *cb,
16057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const camera3_capture_result *result) {
16067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    Camera3Device *d =
16077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb));
16087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    d->processCaptureResult(result);
16097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
16107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
16117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalavoid Camera3Device::sNotify(const camera3_callback_ops *cb,
16127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const camera3_notify_msg *msg) {
16137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    Camera3Device *d =
16147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb));
16157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    d->notify(msg);
16167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
16177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
16187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android
1619