Camera2Device.cpp revision f1e98d857ec377f2c9b916073d40732e6ebb7ced
161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala/*
261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * you may not use this file except in compliance with the License.
661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * You may obtain a copy of the License at
761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
1061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
1161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
1261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * See the License for the specific language governing permissions and
1461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * limitations under the License.
1561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala */
1661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
17852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala#define LOG_TAG "Camera2-Device"
18852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA
1961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala//#define LOG_NDEBUG 0
202c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala//#define LOG_NNDEBUG 0  // Per-frame verbose logging
212c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala
222c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#ifdef LOG_NNDEBUG
232c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#define ALOGVV(...) ALOGV(__VA_ARGS__)
242c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#else
252c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#define ALOGVV(...) ((void)0)
262c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#endif
2761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <utils/Log.h>
29852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala#include <utils/Trace.h>
304c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala#include <utils/Timers.h>
3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "Camera2Device.h"
3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android {
3461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
35f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::Camera2Device(int id):
36f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mId(id),
377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        mHal2Device(NULL)
3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{
39852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
40c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Created device for camera %d", __FUNCTION__, id);
4161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Device::~Camera2Device()
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{
45852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
468dcdb9553defafa1166c64b496e1ee390e4eadfaIgor Murashkin    ALOGV("%s: Tearing down for camera id %d", __FUNCTION__, mId);
477adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    disconnect();
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
5071381051e2d048b2705c447b3d59db6e972493eeIgor Murashkinint Camera2Device::getId() const {
5171381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin    return mId;
5271381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin}
5371381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin
54f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::initialize(camera_module_t *module)
5561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{
56852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
57c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Initializing device for camera %d", __FUNCTION__, mId);
587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (mHal2Device != NULL) {
597adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        ALOGE("%s: Already initialized!", __FUNCTION__);
607adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        return INVALID_OPERATION;
617adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    }
626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    status_t res;
64f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    char name[10];
65f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    snprintf(name, sizeof(name), "%d", mId);
66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
677adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    camera2_device_t *device;
687adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala
69f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = module->common.methods->open(&module->common, name,
707adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala            reinterpret_cast<hw_device_t**>(&device));
7161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
7261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    if (res != OK) {
73f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Could not open camera %d: %s (%d)", __FUNCTION__,
74f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                mId, strerror(-res), res);
7561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        return res;
7661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    }
7761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
787adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    if (device->common.version != CAMERA_DEVICE_API_VERSION_2_0) {
79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Could not open camera %d: "
80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "Camera device is not version %x, reports %x instead",
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mId, CAMERA_DEVICE_API_VERSION_2_0,
827adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala                device->common.version);
837adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        device->common.close(&device->common);
8461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        return BAD_VALUE;
8561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    }
8661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_info info;
88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = module->get_camera_info(mId, &info);
89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK ) return res;
90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
917adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    if (info.device_version != device->common.version) {
92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: HAL reporting mismatched camera_info version (%x)"
93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                " and device version (%x).", __FUNCTION__,
947adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala                device->common.version, info.device_version);
957adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        device->common.close(&device->common);
96f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return BAD_VALUE;
97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
997adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    res = mRequestQueue.setConsumerDevice(device);
1006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
1016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to connect request queue to device: %s (%d)",
1026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, strerror(-res), res);
1037adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        device->common.close(&device->common);
1046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
1056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1067adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    res = mFrameQueue.setProducerDevice(device);
1076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
1086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to connect frame queue to device: %s (%d)",
1096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, strerror(-res), res);
1107adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        device->common.close(&device->common);
1116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
1126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
113f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1147adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    res = device->ops->get_metadata_vendor_tag_ops(device, &mVendorTagOps);
1156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK ) {
1166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to retrieve tag ops from device: %s (%d)",
1176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, strerror(-res), res);
1187adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        device->common.close(&device->common);
1196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
1206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
121314079efa77c07255b2a2794eba470fccd1541fbShuzhen Wang    res = set_camera_metadata_vendor_tag_ops(mVendorTagOps);
122314079efa77c07255b2a2794eba470fccd1541fbShuzhen Wang    if (res != OK) {
123314079efa77c07255b2a2794eba470fccd1541fbShuzhen Wang        ALOGE("%s: Camera %d: Unable to set tag ops: %s (%d)",
124314079efa77c07255b2a2794eba470fccd1541fbShuzhen Wang            __FUNCTION__, mId, strerror(-res), res);
1257adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        device->common.close(&device->common);
1267adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        return res;
1277adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    }
1287adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    res = device->ops->set_notify_callback(device, notificationCallback,
1297adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala            NULL);
1307adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    if (res != OK) {
1317adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to initialize notification callback!",
1327adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala                __FUNCTION__, mId);
1337adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        device->common.close(&device->common);
134314079efa77c07255b2a2794eba470fccd1541fbShuzhen Wang        return res;
135314079efa77c07255b2a2794eba470fccd1541fbShuzhen Wang    }
1367adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala
1377adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    mDeviceInfo = info.static_camera_characteristics;
1387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    mHal2Device = device;
139160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
140f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
141f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
142f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1437adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvalastatus_t Camera2Device::disconnect() {
144852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
1457adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    status_t res = OK;
1467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (mHal2Device) {
1477adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        ALOGV("%s: Closing device for camera %d", __FUNCTION__, mId);
1487adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala
1497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        int inProgressCount = mHal2Device->ops->get_in_progress_count(mHal2Device);
1507adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        if (inProgressCount > 0) {
1517adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala            ALOGW("%s: Closing camera device %d with %d requests in flight!",
1527adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala                    __FUNCTION__, mId, inProgressCount);
1537adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        }
154c62bb787e53fc4b400219567585b365a5792412cEino-Ville Talvala        mReprocessStreams.clear();
1557adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        mStreams.clear();
1567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        res = mHal2Device->common.close(&mHal2Device->common);
1577adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        if (res != OK) {
1587adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala            ALOGE("%s: Could not close camera %d: %s (%d)",
1597adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala                    __FUNCTION__,
1607adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala                    mId, strerror(-res), res);
1617adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        }
1627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        mHal2Device = NULL;
1637adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        ALOGV("%s: Shutdown complete", __FUNCTION__);
1647adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    }
1657adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    return res;
1667adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala}
1677adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala
1683297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::dump(int fd, const Vector<String16>& args) {
169852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
1703297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    String8 result;
17197197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    int detailLevel = 0;
17297197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    int n = args.size();
17397197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    String16 detailOption("-d");
17497197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    for (int i = 0; i + 1 < n; i++) {
17597197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        if (args[i] == detailOption) {
17697197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala            String8 levelStr(args[i+1]);
17797197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala            detailLevel = atoi(levelStr.string());
17897197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        }
17997197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    }
1803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
181603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    result.appendFormat("  Camera2Device[%d] dump (detail level %d):\n",
182603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala            mId, detailLevel);
1833297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
18497197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    if (detailLevel > 0) {
18597197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        result = "    Request queue contents:\n";
18697197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        write(fd, result.string(), result.size());
18797197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        mRequestQueue.dump(fd, args);
1883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
18997197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        result = "    Frame queue contents:\n";
19097197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        write(fd, result.string(), result.size());
19197197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        mFrameQueue.dump(fd, args);
19297197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    }
1933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "    Active streams:\n";
1953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    write(fd, result.string(), result.size());
1963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    for (StreamList::iterator s = mStreams.begin(); s != mStreams.end(); s++) {
1973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        (*s)->dump(fd, args);
1983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
1993297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "    HAL device dump:\n";
2013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    write(fd, result.string(), result.size());
2023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t res;
2047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = mHal2Device->ops->dump(mHal2Device, fd);
2053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    return res;
2073297daae9681004775012faba9181d65e097e00cEino-Ville Talvala}
2083297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
209bd02dd1bf1f34eb4e100d0d058f1fe5a2790d67eIgor Murashkinconst CameraMetadata& Camera2Device::info() const {
2109e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGVV("%s: E", __FUNCTION__);
2116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return mDeviceInfo;
2136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
2146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
215cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t Camera2Device::capture(CameraMetadata &request) {
216852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
217d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
218d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
219cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    mRequestQueue.enqueue(request.release());
220d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
221d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
222d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
223d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
224cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t Camera2Device::setStreamingRequest(const CameraMetadata &request) {
225852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
2266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
227cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    CameraMetadata streamRequest(request);
228cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return mRequestQueue.setStreamSlot(streamRequest.release());
229cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
2306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
231cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t Camera2Device::clearStreamingRequest() {
232852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
233cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return mRequestQueue.setStreamSlot(NULL);
234f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
235f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2364c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Device::waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) {
2374c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    ATRACE_CALL();
2384c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    return mRequestQueue.waitForDequeue(requestId, timeout);
2394c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala}
2404c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala
2416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::createStream(sp<ANativeWindow> consumer,
242d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t width, uint32_t height, int format, size_t size, int *id) {
243852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
2446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
2456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
2466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    sp<StreamAdapter> stream = new StreamAdapter(mHal2Device);
2486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
249d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = stream->connectToDevice(consumer, width, height, format, size);
2506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
2516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to create stream (%d x %d, format %x):"
2526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                "%s (%d)",
2536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, width, height, format, strerror(-res), res);
2546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
2556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    *id = stream->getId();
2586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mStreams.push_back(stream);
2606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
2616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
2626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
26369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::createReprocessStreamFromStream(int outputId, int *id) {
264852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
26569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
26669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
26769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
26869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    bool found = false;
26969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    StreamList::iterator streamI;
27069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    for (streamI = mStreams.begin();
27169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         streamI != mStreams.end(); streamI++) {
27269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if ((*streamI)->getId() == outputId) {
27369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            found = true;
27469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
27569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
27669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
27769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!found) {
27869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Output stream %d doesn't exist; can't create "
27969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                "reprocess stream from it!", __FUNCTION__, mId, outputId);
28069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return BAD_VALUE;
28169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
28269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
2837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    sp<ReprocessStreamAdapter> stream = new ReprocessStreamAdapter(mHal2Device);
28469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
28569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = stream->connectToDevice((*streamI));
28669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
28769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to create reprocessing stream from "\
28869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                "stream %d: %s (%d)", __FUNCTION__, mId, outputId,
28969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                strerror(-res), res);
29069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return res;
29169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
29269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
29369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    *id = stream->getId();
29469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
29569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mReprocessStreams.push_back(stream);
29669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
29769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
29869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
29969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
300d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::getStreamInfo(int id,
301d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t *width, uint32_t *height, uint32_t *format) {
302852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
303d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
304d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    bool found = false;
305d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    StreamList::iterator streamI;
306d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    for (streamI = mStreams.begin();
307d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         streamI != mStreams.end(); streamI++) {
308d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if ((*streamI)->getId() == id) {
309d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            found = true;
310d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
311d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
312d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
313d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (!found) {
314d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Stream %d does not exist",
315d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mId, id);
316d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return BAD_VALUE;
317d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
318d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
319d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (width) *width = (*streamI)->getWidth();
320d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (height) *height = (*streamI)->getHeight();
321d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (format) *format = (*streamI)->getFormat();
322d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
323d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
324d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
325d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
326c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalastatus_t Camera2Device::setStreamTransform(int id,
327c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        int transform) {
328852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
329c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
330c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    bool found = false;
331c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    StreamList::iterator streamI;
332c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    for (streamI = mStreams.begin();
333c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala         streamI != mStreams.end(); streamI++) {
334c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        if ((*streamI)->getId() == id) {
335c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            found = true;
336c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            break;
337c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        }
338c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
339c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (!found) {
340c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Camera %d: Stream %d does not exist",
341c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                __FUNCTION__, mId, id);
342c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return BAD_VALUE;
343c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
344c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
345c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    return (*streamI)->setTransform(transform);
346c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala}
347c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
3486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::deleteStream(int id) {
349852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
3506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
3516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    bool found = false;
3526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    for (StreamList::iterator streamI = mStreams.begin();
3536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         streamI != mStreams.end(); streamI++) {
3546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if ((*streamI)->getId() == id) {
3559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            status_t res = (*streamI)->release();
3564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            if (res != OK) {
3579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Unable to release stream %d from HAL device: "
3584ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                        "%s (%d)", __FUNCTION__, id, strerror(-res), res);
3594ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                return res;
3604ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            }
3616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            mStreams.erase(streamI);
3626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            found = true;
3636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            break;
3646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
3656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
3666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (!found) {
3676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to find stream %d to delete",
3686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, id);
3696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return BAD_VALUE;
3706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
3716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
3726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
3736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
37469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::deleteReprocessStream(int id) {
375852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
37669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
37769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    bool found = false;
37869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    for (ReprocessStreamList::iterator streamI = mReprocessStreams.begin();
37969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         streamI != mReprocessStreams.end(); streamI++) {
38069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if ((*streamI)->getId() == id) {
38169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            status_t res = (*streamI)->release();
38269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            if (res != OK) {
38369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                ALOGE("%s: Unable to release reprocess stream %d from "
38469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                        "HAL device: %s (%d)", __FUNCTION__, id,
38569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                        strerror(-res), res);
38669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                return res;
38769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            }
38869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mReprocessStreams.erase(streamI);
38969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            found = true;
39069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
39169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
39269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
39369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!found) {
39469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to find stream %d to delete",
39569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, mId, id);
39669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return BAD_VALUE;
39769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
39869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
39969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
40069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
40169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
4026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::createDefaultRequest(int templateId,
403cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        CameraMetadata *request) {
404852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
405cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t err;
4066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
407cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_t *rawRequest;
4087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    err = mHal2Device->ops->construct_default_request(
4097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        mHal2Device, templateId, &rawRequest);
410cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    request->acquire(rawRequest);
411cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return err;
412d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
413d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
414d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::waitUntilDrained() {
415852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
416d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    static const uint32_t kSleepTime = 50000; // 50 ms
417d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    static const uint32_t kMaxSleepTime = 10000000; // 10 s
4187adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting wait", __FUNCTION__, mId);
419d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mRequestQueue.getBufferCount() ==
420d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS) return INVALID_OPERATION;
421d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
422d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // TODO: Set up notifications from HAL, instead of sleeping here
423d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    uint32_t totalTime = 0;
4247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    while (mHal2Device->ops->get_in_progress_count(mHal2Device) > 0) {
425d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        usleep(kSleepTime);
426d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        totalTime += kSleepTime;
427d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (totalTime > kMaxSleepTime) {
4287adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala            ALOGE("%s: Waited %d us, %d requests still in flight", __FUNCTION__,
429f0eeb53e4763fe5063d3ce880f72d52f136fc3c5Alex Ray                    totalTime, mHal2Device->ops->get_in_progress_count(mHal2Device));
430d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return TIMED_OUT;
431d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
432d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
4337adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    ALOGV("%s: Camera %d: HAL is idle", __FUNCTION__, mId);
434d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
4356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
4366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
437160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalastatus_t Camera2Device::setNotifyCallback(NotificationListener *listener) {
438852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
439160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    status_t res;
4407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = mHal2Device->ops->set_notify_callback(mHal2Device, notificationCallback,
441160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            reinterpret_cast<void*>(listener) );
442160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    if (res != OK) {
443160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        ALOGE("%s: Unable to set notification callback!", __FUNCTION__);
444160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    }
445160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    return res;
446160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
447160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
44846910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvalabool Camera2Device::willNotify3A() {
44946910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    return true;
45046910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala}
45146910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala
452160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Device::notificationCallback(int32_t msg_type,
453160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        int32_t ext1,
454160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        int32_t ext2,
455160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        int32_t ext3,
456160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        void *user) {
457852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
458160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    NotificationListener *listener = reinterpret_cast<NotificationListener*>(user);
459160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Notification %d, arguments %d, %d, %d", __FUNCTION__, msg_type,
460160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            ext1, ext2, ext3);
461160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    if (listener != NULL) {
462160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        switch (msg_type) {
463160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            case CAMERA2_MSG_ERROR:
464160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                listener->notifyError(ext1, ext2, ext3);
465160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                break;
466160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            case CAMERA2_MSG_SHUTTER: {
467f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                // TODO: Only needed for camera2 API, which is unsupported
468f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                // by HAL2 directly.
469f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                // nsecs_t timestamp = (nsecs_t)ext2 | ((nsecs_t)(ext3) << 32 );
470f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                // listener->notifyShutter(requestId, timestamp);
471160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                break;
472160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            }
473160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            case CAMERA2_MSG_AUTOFOCUS:
474160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                listener->notifyAutoFocus(ext1, ext2);
475160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                break;
476160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            case CAMERA2_MSG_AUTOEXPOSURE:
477160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                listener->notifyAutoExposure(ext1, ext2);
478160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                break;
479160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            case CAMERA2_MSG_AUTOWB:
480160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                listener->notifyAutoWhitebalance(ext1, ext2);
481160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                break;
482160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            default:
483160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                ALOGE("%s: Unknown notification %d (arguments %d, %d, %d)!",
484160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                        __FUNCTION__, msg_type, ext1, ext2, ext3);
485160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        }
486160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    }
487160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
488160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
489c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvalastatus_t Camera2Device::waitForNextFrame(nsecs_t timeout) {
490c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    return mFrameQueue.waitForBuffer(timeout);
4918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
4928ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
493cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t Camera2Device::getNextFrame(CameraMetadata *frame) {
494852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
495cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
496cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_t *rawFrame;
497cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mFrameQueue.dequeue(&rawFrame);
498cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (rawFrame  == NULL) {
499cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return NOT_ENOUGH_DATA;
500cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    } else if (res == OK) {
501cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        frame->acquire(rawFrame);
502cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
503cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return res;
5048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
5058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
506174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerAutofocus(uint32_t id) {
507852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
508174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t res;
509174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id);
5107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = mHal2Device->ops->trigger_action(mHal2Device,
511174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            CAMERA2_TRIGGER_AUTOFOCUS, id, 0);
512174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (res != OK) {
513174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        ALOGE("%s: Error triggering autofocus (id %d)",
514174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                __FUNCTION__, id);
515174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
516174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    return res;
517174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala}
518174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
519174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerCancelAutofocus(uint32_t id) {
520852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
521174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t res;
522174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    ALOGV("%s: Canceling autofocus, id %d", __FUNCTION__, id);
5237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = mHal2Device->ops->trigger_action(mHal2Device,
524174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            CAMERA2_TRIGGER_CANCEL_AUTOFOCUS, id, 0);
525174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (res != OK) {
526174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        ALOGE("%s: Error canceling autofocus (id %d)",
527174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                __FUNCTION__, id);
528174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
529174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    return res;
530174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala}
531174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
532174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerPrecaptureMetering(uint32_t id) {
533852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
534174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t res;
535174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id);
5367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = mHal2Device->ops->trigger_action(mHal2Device,
537174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            CAMERA2_TRIGGER_PRECAPTURE_METERING, id, 0);
538174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (res != OK) {
539174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        ALOGE("%s: Error triggering precapture metering (id %d)",
540174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                __FUNCTION__, id);
541174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
542174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    return res;
543174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala}
544174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
54569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::pushReprocessBuffer(int reprocessStreamId,
54669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        buffer_handle_t *buffer, wp<BufferReleasedListener> listener) {
547852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
54869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
54969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    bool found = false;
55069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res = OK;
55169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    for (ReprocessStreamList::iterator streamI = mReprocessStreams.begin();
55269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         streamI != mReprocessStreams.end(); streamI++) {
55369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if ((*streamI)->getId() == reprocessStreamId) {
55469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            res = (*streamI)->pushIntoStream(buffer, listener);
55569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            if (res != OK) {
55669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                ALOGE("%s: Unable to push buffer to reprocess stream %d: %s (%d)",
55769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                        __FUNCTION__, reprocessStreamId, strerror(-res), res);
55869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                return res;
55969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            }
56069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            found = true;
56169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
56269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
56369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
56469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!found) {
56569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to find reprocess stream %d",
56669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, mId, reprocessStreamId);
56769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = BAD_VALUE;
56869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
56969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return res;
57069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
57169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
572abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvalastatus_t Camera2Device::flush() {
573abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    ATRACE_CALL();
574abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
575abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    mRequestQueue.clear();
576abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    return waitUntilDrained();
577abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala}
578abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
579160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala/**
580f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala * Camera2Device::MetadataQueue
581f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala */
582f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
583f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue::MetadataQueue():
5847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            mHal2Device(NULL),
585f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mFrameCount(0),
5864c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala            mLatestRequestId(0),
587f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mCount(0),
588f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mStreamSlotCount(0),
589c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala            mSignalConsumer(true)
590f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
591852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
592f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_request_queue_src_ops::dequeue_request = consumer_dequeue;
593f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_request_queue_src_ops::request_count = consumer_buffer_count;
594f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_request_queue_src_ops::free_request = consumer_free;
595f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
596f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_frame_queue_dst_ops::dequeue_frame = producer_dequeue;
597f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_frame_queue_dst_ops::cancel_frame = producer_cancel;
598f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_frame_queue_dst_ops::enqueue_frame = producer_enqueue;
599f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
600f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
601f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue::~MetadataQueue() {
602852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
603abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    clear();
604f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
605f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
6066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala// Connect to camera2 HAL as consumer (input requests/reprocessing)
6076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setConsumerDevice(camera2_device_t *d) {
608852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
6096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
6106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = d->ops->set_request_queue_src_ops(d,
6116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            this);
6126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) return res;
6137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    mHal2Device = d;
6146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
615f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
616f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
6176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setProducerDevice(camera2_device_t *d) {
618852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
6196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
6206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = d->ops->set_frame_queue_dst_ops(d,
6216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            this);
6226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return res;
623f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
624f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
625f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala// Real interfaces
626f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::enqueue(camera_metadata_t *buf) {
627852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
6282c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala    ALOGVV("%s: E", __FUNCTION__);
629f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
630f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
631f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mCount++;
632f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mEntries.push_back(buf);
633f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
6346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return signalConsumerLocked();
635f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
636f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
637f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::getBufferCount() {
638852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
639f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
640f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mStreamSlotCount > 0) {
641f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS;
642f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
643f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return mCount;
644f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
645f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
646f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::dequeue(camera_metadata_t **buf,
647f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool incrementCount)
648f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
649852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
6502c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala    ALOGVV("%s: E", __FUNCTION__);
6516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
652f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
653f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
654f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mCount == 0) {
655f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (mStreamSlotCount == 0) {
6562c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala            ALOGVV("%s: Empty", __FUNCTION__);
657f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            *buf = NULL;
658f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mSignalConsumer = true;
659f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            return OK;
660f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
6612c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala        ALOGVV("%s: Streaming %d frames to queue", __FUNCTION__,
662f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mStreamSlotCount);
663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (List<camera_metadata_t*>::iterator slotEntry = mStreamSlot.begin();
665f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                slotEntry != mStreamSlot.end();
666f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                slotEntry++ ) {
667f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            size_t entries = get_camera_metadata_entry_count(*slotEntry);
668f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            size_t dataBytes = get_camera_metadata_data_count(*slotEntry);
669f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            camera_metadata_t *copy =
671f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    allocate_camera_metadata(entries, dataBytes);
672f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            append_camera_metadata(copy, *slotEntry);
673f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mEntries.push_back(copy);
674f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
675f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mCount = mStreamSlotCount;
676f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
6772c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala    ALOGVV("MetadataQueue: deque (%d buffers)", mCount);
678f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_t *b = *(mEntries.begin());
679f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mEntries.erase(mEntries.begin());
680f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
681f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (incrementCount) {
682852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala        ATRACE_INT("cam2_request", mFrameCount);
6836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        camera_metadata_entry_t frameCount;
6846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = find_camera_metadata_entry(b,
685f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ANDROID_REQUEST_FRAME_COUNT,
6866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &frameCount);
6876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
6886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Unable to add frame count: %s (%d)",
6896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
6906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        } else {
6916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            *frameCount.data.i32 = mFrameCount;
6926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
693f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mFrameCount++;
694f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
695f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
6964c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    // Check for request ID, and if present, signal waiters.
6974c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    camera_metadata_entry_t requestId;
6984c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    res = find_camera_metadata_entry(b,
6994c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala            ANDROID_REQUEST_ID,
7004c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala            &requestId);
7014c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    if (res == OK) {
7024c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        mLatestRequestId = requestId.data.i32[0];
7034c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        mNewRequestId.signal();
7044c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    }
7054c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala
706f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    *buf = b;
707f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mCount--;
708f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
70961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return OK;
71061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
71161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
712f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::waitForBuffer(nsecs_t timeout)
713f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
714f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
715f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
716f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    while (mCount == 0) {
717f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        res = notEmpty.waitRelative(mMutex,timeout);
718f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (res != OK) return res;
719f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
720f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
721f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
722f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
7234c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::waitForDequeue(int32_t id,
7244c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        nsecs_t timeout) {
7254c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    Mutex::Autolock l(mMutex);
7264c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    status_t res;
7274c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    while (mLatestRequestId != id) {
7284c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        nsecs_t startTime = systemTime();
7294c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala
7304c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        res = mNewRequestId.waitRelative(mMutex, timeout);
7314c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        if (res != OK) return res;
7324c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala
7334c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        timeout -= (systemTime() - startTime);
7344c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    }
7354c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala
7364c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    return OK;
7374c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala}
7384c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala
739f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setStreamSlot(camera_metadata_t *buf)
740f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
741852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
7426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
743f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
744f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (buf == NULL) {
745f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        freeBuffers(mStreamSlot.begin(), mStreamSlot.end());
746f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mStreamSlotCount = 0;
747f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return OK;
748f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
7496ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    camera_metadata_t *buf2 = clone_camera_metadata(buf);
7506ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    if (!buf2) {
7516ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        ALOGE("%s: Unable to clone metadata buffer!", __FUNCTION__);
7526ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        return NO_MEMORY;
7536ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    }
7546ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala
755f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mStreamSlotCount > 1) {
756f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*>::iterator deleter = ++mStreamSlot.begin();
757f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        freeBuffers(++mStreamSlot.begin(), mStreamSlot.end());
758f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mStreamSlotCount = 1;
759f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
760f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mStreamSlotCount == 1) {
761f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        free_camera_metadata( *(mStreamSlot.begin()) );
7626ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        *(mStreamSlot.begin()) = buf2;
763f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
7646ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        mStreamSlot.push_front(buf2);
765f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mStreamSlotCount = 1;
766f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
7676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return signalConsumerLocked();
768f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
769f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
770f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setStreamSlot(
771f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const List<camera_metadata_t*> &bufs)
772f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
773852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
7746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
775f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
7766ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala
777f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mStreamSlotCount > 0) {
778f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        freeBuffers(mStreamSlot.begin(), mStreamSlot.end());
779f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
7806ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    mStreamSlotCount = 0;
7816ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    for (List<camera_metadata_t*>::const_iterator r = bufs.begin();
7826ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala         r != bufs.end(); r++) {
7836ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        camera_metadata_t *r2 = clone_camera_metadata(*r);
7846ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        if (!r2) {
7856ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala            ALOGE("%s: Unable to clone metadata buffer!", __FUNCTION__);
7866ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala            return NO_MEMORY;
7876ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        }
7886ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        mStreamSlot.push_back(r2);
7896ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        mStreamSlotCount++;
7906ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    }
7916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return signalConsumerLocked();
7926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
793f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
794abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::clear()
795abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala{
796abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    ATRACE_CALL();
797abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
798abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
799abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    Mutex::Autolock l(mMutex);
800abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
801abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    // Clear streaming slot
802abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    freeBuffers(mStreamSlot.begin(), mStreamSlot.end());
803abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    mStreamSlotCount = 0;
804abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
805abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    // Clear request queue
806abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    freeBuffers(mEntries.begin(), mEntries.end());
807abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    mCount = 0;
808abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    return OK;
809abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala}
810abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
8113297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::dump(int fd,
812ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin        const Vector<String16>& /*args*/) {
813852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
8143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    String8 result;
8153297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t notLocked;
8163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    notLocked = mMutex.tryLock();
8173297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (notLocked) {
8183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    (Unable to lock queue mutex)\n");
8193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
8203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("      Current frame number: %d\n", mFrameCount);
8213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mStreamSlotCount == 0) {
8223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("      Stream slot: Empty\n");
8233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
8243297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
8253297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.appendFormat("      Stream slot: %d entries\n",
8263297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                mStreamSlot.size());
8273297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        int i = 0;
8283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        for (List<camera_metadata_t*>::iterator r = mStreamSlot.begin();
8293297daae9681004775012faba9181d65e097e00cEino-Ville Talvala             r != mStreamSlot.end(); r++) {
8303297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            result = String8::format("       Stream slot buffer %d:\n", i);
8313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            write(fd, result.string(), result.size());
832428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala            dump_indented_camera_metadata(*r, fd, 2, 10);
8333297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            i++;
8343297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        }
8353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
8363297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mEntries.size() == 0) {
8373297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "      Main queue is empty\n";
8383297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
8393297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
8403297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = String8::format("      Main queue has %d entries:\n",
8413297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                mEntries.size());
8423297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        int i = 0;
8433297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        for (List<camera_metadata_t*>::iterator r = mEntries.begin();
8443297daae9681004775012faba9181d65e097e00cEino-Ville Talvala             r != mEntries.end(); r++) {
8453297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            result = String8::format("       Queue entry %d:\n", i);
8463297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            write(fd, result.string(), result.size());
847428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala            dump_indented_camera_metadata(*r, fd, 2, 10);
8483297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            i++;
8493297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        }
8503297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
8513297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
8523297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (notLocked == 0) {
8533297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mMutex.unlock();
8543297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
8553297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
8563297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    return OK;
8573297daae9681004775012faba9181d65e097e00cEino-Ville Talvala}
8583297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
8596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::signalConsumerLocked() {
860852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
8616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res = OK;
8626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    notEmpty.signal();
8637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    if (mSignalConsumer && mHal2Device != NULL) {
8646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mSignalConsumer = false;
8656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mMutex.unlock();
8676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGV("%s: Signaling consumer", __FUNCTION__);
8687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        res = mHal2Device->ops->notify_request_queue_not_empty(mHal2Device);
8696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mMutex.lock();
8706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
8716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return res;
872f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
873f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
874f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::freeBuffers(
875f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*>::iterator start,
876f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*>::iterator end)
877f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
878852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
879f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    while (start != end) {
880f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        free_camera_metadata(*start);
881f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        start = mStreamSlot.erase(start);
882f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
883f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
884f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
885f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
886f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance(
887f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t *q)
888f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
889f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q);
890f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return const_cast<MetadataQueue*>(cmq);
891f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
892f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
893f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance(
894f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t *q)
895f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
896f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q);
897f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return const_cast<MetadataQueue*>(cmq);
898f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
899f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
900f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_buffer_count(
901f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t *q)
902f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
903f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue *queue = getInstance(q);
904f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return queue->getBufferCount();
905f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
906f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
907f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_dequeue(
908f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t *q,
909f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t **buffer)
910f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
911f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue *queue = getInstance(q);
912f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return queue->dequeue(buffer, true);
913f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
914f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
915f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_free(
916f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t *q,
917f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t *old_buffer)
918f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
919852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
920f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue *queue = getInstance(q);
921ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin    (void)queue;
922f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    free_camera_metadata(old_buffer);
923f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
924f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
925f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
926f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_dequeue(
927ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin        const camera2_frame_queue_dst_ops_t * /*q*/,
928f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        size_t entries, size_t bytes,
929f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t **buffer)
930f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
931852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
932f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_t *new_buffer =
933f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            allocate_camera_metadata(entries, bytes);
934f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (new_buffer == NULL) return NO_MEMORY;
935f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    *buffer = new_buffer;
936f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return OK;
937f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
938f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
939f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_cancel(
940ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin        const camera2_frame_queue_dst_ops_t * /*q*/,
941f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t *old_buffer)
942f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
943852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
944f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    free_camera_metadata(old_buffer);
945f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
946f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
947f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
948f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_enqueue(
949f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t *q,
950f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t *filled_buffer)
951f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
952f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue *queue = getInstance(q);
953f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return queue->enqueue(filled_buffer);
954f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
955f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala/**
9576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala * Camera2Device::StreamAdapter
9586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala */
9596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#ifndef container_of
9616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#define container_of(ptr, type, member) \
9626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    (type *)((char*)(ptr) - offsetof(type, member))
9636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#endif
9646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaCamera2Device::StreamAdapter::StreamAdapter(camera2_device_t *d):
9669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mState(RELEASED),
9677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        mHal2Device(d),
9686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mId(-1),
9693297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mWidth(0), mHeight(0), mFormat(0), mSize(0), mUsage(0),
9703297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mMaxProducerBuffers(0), mMaxConsumerBuffers(0),
9713297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mTotalBuffers(0),
9723297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mFormatRequested(0),
9733297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mActiveBuffers(0),
9743297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mFrameCount(0),
9753297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mLastTimestamp(0)
9766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala{
9776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera2_stream_ops::dequeue_buffer = dequeue_buffer;
9786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera2_stream_ops::enqueue_buffer = enqueue_buffer;
9796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera2_stream_ops::cancel_buffer = cancel_buffer;
9806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera2_stream_ops::set_crop = set_crop;
9816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
9826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaCamera2Device::StreamAdapter::~StreamAdapter() {
984852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
9859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mState != RELEASED) {
9869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        release();
9879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
9886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
9896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
990d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::StreamAdapter::connectToDevice(
991d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        sp<ANativeWindow> consumer,
992d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t width, uint32_t height, int format, size_t size) {
993852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
9946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
9959e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
9966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mState != RELEASED) return INVALID_OPERATION;
9986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (consumer == NULL) {
9996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Null consumer passed to stream adapter", __FUNCTION__);
10006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return BAD_VALUE;
10016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: New stream parameters %d x %d, format 0x%x, size %d",
10049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, width, height, format, size);
10059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
10066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mConsumerInterface = consumer;
10076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mWidth = width;
10086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mHeight = height;
1009d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    mSize = (format == HAL_PIXEL_FORMAT_BLOB) ? size : 0;
10106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mFormatRequested = format;
10116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    // Allocate device-side stream interface
10136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint32_t id;
10156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint32_t formatActual;
10166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint32_t usage;
10176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint32_t maxBuffers = 2;
10187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = mHal2Device->ops->allocate_stream(mHal2Device,
10196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            mWidth, mHeight, mFormatRequested, getStreamOps(),
10206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            &id, &formatActual, &usage, &maxBuffers);
10216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
10226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Device stream allocation failed: %s (%d)",
10236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, strerror(-res), res);
10246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
10256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Allocated stream id %d, actual format 0x%x, "
10289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            "usage 0x%x, producer wants %d buffers", __FUNCTION__,
10299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            id, formatActual, usage, maxBuffers);
10309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
10316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mId = id;
10326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mFormat = formatActual;
10336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mUsage = usage;
10346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mMaxProducerBuffers = maxBuffers;
10356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = ALLOCATED;
10376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    // Configure consumer-side ANativeWindow interface
10396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = native_window_api_connect(mConsumerInterface.get(),
10406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            NATIVE_WINDOW_API_CAMERA);
10416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
10426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to connect to native window for stream %d",
10436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId);
10446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
10466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = CONNECTED;
10496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = native_window_set_usage(mConsumerInterface.get(), mUsage);
10516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
10526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to configure usage %08x for stream %d",
10536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mUsage, mId);
10546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
10556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1057bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    res = native_window_set_scaling_mode(mConsumerInterface.get(),
1058bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala            NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
1059bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    if (res != OK) {
1060bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        ALOGE("%s: Unable to configure stream scaling: %s (%d)",
1061bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala                __FUNCTION__, strerror(-res), res);
1062bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        return res;
1063bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    }
1064bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala
1065c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = setTransform(0);
1066bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    if (res != OK) {
1067bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        return res;
1068bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    }
1069bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala
1070d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mFormat == HAL_PIXEL_FORMAT_BLOB) {
1071d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = native_window_set_buffers_geometry(mConsumerInterface.get(),
1072d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mSize, 1, mFormat);
1073d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
1074d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Unable to configure compressed stream buffer geometry"
1075d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %d x %d, size %d for stream %d",
1076d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mWidth, mHeight, mSize, mId);
1077d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
1078d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1079d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    } else {
1080d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = native_window_set_buffers_geometry(mConsumerInterface.get(),
1081d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mWidth, mHeight, mFormat);
1082d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
1083d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Unable to configure stream buffer geometry"
1084d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %d x %d, format 0x%x for stream %d",
1085d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mWidth, mHeight, mFormat, mId);
1086d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
1087d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
10886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    int maxConsumerBuffers;
10916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mConsumerInterface->query(mConsumerInterface.get(),
10926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &maxConsumerBuffers);
10936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
10946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to query consumer undequeued"
10956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                " buffer count for stream %d", __FUNCTION__, mId);
10966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
10976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mMaxConsumerBuffers = maxConsumerBuffers;
10996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
11009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Consumer wants %d buffers", __FUNCTION__,
11019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mMaxConsumerBuffers);
11026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
11033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mTotalBuffers = mMaxConsumerBuffers + mMaxProducerBuffers;
11043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mActiveBuffers = 0;
11053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mFrameCount = 0;
11063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mLastTimestamp = 0;
11076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
11086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = native_window_set_buffer_count(mConsumerInterface.get(),
11093297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mTotalBuffers);
11106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
11116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to set buffer count for stream %d",
11126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId);
11136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
11146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
11156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
11166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    // Register allocated buffers with HAL device
11173297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    buffer_handle_t *buffers = new buffer_handle_t[mTotalBuffers];
11183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    ANativeWindowBuffer **anwBuffers = new ANativeWindowBuffer*[mTotalBuffers];
11193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    uint32_t bufferIdx = 0;
11203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    for (; bufferIdx < mTotalBuffers; bufferIdx++) {
11211e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis        res = native_window_dequeue_buffer_and_wait(mConsumerInterface.get(),
11226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &anwBuffers[bufferIdx]);
11236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
11249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Unable to dequeue buffer %d for initial registration for "
11256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "stream %d", __FUNCTION__, bufferIdx, mId);
11266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            goto cleanUpBuffers;
11276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
11286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
11296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        buffers[bufferIdx] = anwBuffers[bufferIdx]->handle;
113069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGV("%s: Buffer %p allocated", __FUNCTION__, (void*)buffers[bufferIdx]);
11316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
11326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1133750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    ALOGV("%s: Registering %d buffers with camera HAL", __FUNCTION__, mTotalBuffers);
11347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = mHal2Device->ops->register_stream_buffers(mHal2Device,
11356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            mId,
11363297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mTotalBuffers,
11376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            buffers);
11386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
11396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to register buffers with HAL device for stream %d",
11406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId);
11416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    } else {
11426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = ACTIVE;
11436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
11446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
11456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalacleanUpBuffers:
1146750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    ALOGV("%s: Cleaning up %d buffers", __FUNCTION__, bufferIdx);
11473297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    for (uint32_t i = 0; i < bufferIdx; i++) {
11486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mConsumerInterface->cancelBuffer(mConsumerInterface.get(),
11491e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis                anwBuffers[i], -1);
11506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
11516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Unable to cancel buffer %d after registration",
11526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    __FUNCTION__, i);
11536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
11546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
11553297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    delete[] anwBuffers;
11563297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    delete[] buffers;
11576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
11586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return res;
11596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
11606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
11619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalastatus_t Camera2Device::StreamAdapter::release() {
1162852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
11636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
116402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala    ALOGV("%s: Releasing stream %d (%d x %d, format %d)", __FUNCTION__, mId,
116502f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala            mWidth, mHeight, mFormat);
11666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState >= ALLOCATED) {
11677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        res = mHal2Device->ops->release_stream(mHal2Device, mId);
11686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
11696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Unable to release stream %d",
11706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    __FUNCTION__, mId);
11716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
11726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
11736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
11746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState >= CONNECTED) {
11756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = native_window_api_disconnect(mConsumerInterface.get(),
11766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                NATIVE_WINDOW_API_CAMERA);
1177a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin
1178a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin        /* this is not an error. if client calling process dies,
1179a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin           the window will also die and all calls to it will return
1180a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin           DEAD_OBJECT, thus it's already "disconnected" */
1181a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin        if (res == DEAD_OBJECT) {
1182a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin            ALOGW("%s: While disconnecting stream %d from native window, the"
1183a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin                  " native window died from under us", __FUNCTION__, mId);
1184a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin        }
1185a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin        else if (res != OK) {
1186a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin            ALOGE("%s: Unable to disconnect stream %d from native window (error %d %s)",
1187a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin                    __FUNCTION__, mId, res, strerror(-res));
11886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
11896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
11906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
11916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mId = -1;
11929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mState = RELEASED;
11936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
11946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
11956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1196c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalastatus_t Camera2Device::StreamAdapter::setTransform(int transform) {
1197852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
1198c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    status_t res;
1199c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (mState < CONNECTED) {
1200c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Cannot set transform on unconnected stream", __FUNCTION__);
1201c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return INVALID_OPERATION;
1202c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1203c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = native_window_set_buffers_transform(mConsumerInterface.get(),
1204c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                                              transform);
1205c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (res != OK) {
1206c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Unable to configure stream transform to %x: %s (%d)",
1207c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                __FUNCTION__, transform, strerror(-res), res);
1208c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1209c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    return res;
1210c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala}
1211c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
12123297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::StreamAdapter::dump(int fd,
1213ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin        const Vector<String16>& /*args*/) {
1214852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
12153297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    String8 result = String8::format("      Stream %d: %d x %d, format 0x%x\n",
12163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mId, mWidth, mHeight, mFormat);
12173297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("        size %d, usage 0x%x, requested format 0x%x\n",
12183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mSize, mUsage, mFormatRequested);
12193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("        total buffers: %d, dequeued buffers: %d\n",
12203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mTotalBuffers, mActiveBuffers);
12213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("        frame count: %d, last timestamp %lld\n",
12223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mFrameCount, mLastTimestamp);
12233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    write(fd, result.string(), result.size());
12243297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    return OK;
12253297daae9681004775012faba9181d65e097e00cEino-Ville Talvala}
12263297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
12276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaconst camera2_stream_ops *Camera2Device::StreamAdapter::getStreamOps() {
12286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return static_cast<camera2_stream_ops *>(this);
12296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
12306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
12316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaANativeWindow* Camera2Device::StreamAdapter::toANW(
12326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const camera2_stream_ops_t *w) {
12336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return static_cast<const StreamAdapter*>(w)->mConsumerInterface.get();
12346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
12356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
12366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::dequeue_buffer(const camera2_stream_ops_t *w,
12376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        buffer_handle_t** buffer) {
1238852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
12396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    int res;
12403297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    StreamAdapter* stream =
12413297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w));
12423297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (stream->mState != ACTIVE) {
12433297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState);
12446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return INVALID_OPERATION;
12456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
12466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
12476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindow *a = toANW(w);
12486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindowBuffer* anb;
12491e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis    res = native_window_dequeue_buffer_and_wait(a, &anb);
1250750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    if (res != OK) {
1251750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala        ALOGE("Stream %d dequeue: Error from native_window: %s (%d)", stream->mId,
1252750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala                strerror(-res), res);
1253750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala        return res;
1254750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    }
12556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
12566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    *buffer = &(anb->handle);
12573297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    stream->mActiveBuffers++;
12583297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1259750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    ALOGVV("Stream %d dequeue: Buffer %p dequeued", stream->mId, (void*)(**buffer));
12606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return res;
12616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
12626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
12636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::enqueue_buffer(const camera2_stream_ops_t* w,
12646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        int64_t timestamp,
12656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        buffer_handle_t* buffer) {
1266852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
12673297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    StreamAdapter *stream =
12683297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w));
1269228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    stream->mFrameCount++;
1270228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGVV("Stream %d enqueue: Frame %d (%p) captured at %lld ns",
1271a289bf696e4b49e0a726fd07914f9dc178653efcJames Dong            stream->mId, stream->mFrameCount, (void*)(*buffer), timestamp);
1272bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    int state = stream->mState;
12736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (state != ACTIVE) {
12746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state);
12756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return INVALID_OPERATION;
12766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
12776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindow *a = toANW(w);
12786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t err;
1279228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
12806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    err = native_window_set_buffers_timestamp(a, timestamp);
1281bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    if (err != OK) {
1282bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        ALOGE("%s: Error setting timestamp on native window: %s (%d)",
1283bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala                __FUNCTION__, strerror(-err), err);
1284bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        return err;
1285bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    }
1286bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    err = a->queueBuffer(a,
12871e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis            container_of(buffer, ANativeWindowBuffer, handle), -1);
1288bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    if (err != OK) {
1289bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        ALOGE("%s: Error queueing buffer to native window: %s (%d)",
1290bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala                __FUNCTION__, strerror(-err), err);
129131d377b7622279034326fbd8b9803a738a39fb30James Dong        return err;
1292bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    }
129331d377b7622279034326fbd8b9803a738a39fb30James Dong
12943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    stream->mActiveBuffers--;
12953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    stream->mLastTimestamp = timestamp;
129631d377b7622279034326fbd8b9803a738a39fb30James Dong    return OK;
12976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
12986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
12996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::cancel_buffer(const camera2_stream_ops_t* w,
13006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        buffer_handle_t* buffer) {
1301852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
13023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    StreamAdapter *stream =
13033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w));
1304750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    ALOGVV("Stream %d cancel: Buffer %p",
1305750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala            stream->mId, (void*)(*buffer));
13063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (stream->mState != ACTIVE) {
13073297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState);
13086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return INVALID_OPERATION;
13096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
131031d377b7622279034326fbd8b9803a738a39fb30James Dong
13116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindow *a = toANW(w);
131231d377b7622279034326fbd8b9803a738a39fb30James Dong    int err = a->cancelBuffer(a,
13131e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis            container_of(buffer, ANativeWindowBuffer, handle), -1);
131431d377b7622279034326fbd8b9803a738a39fb30James Dong    if (err != OK) {
131531d377b7622279034326fbd8b9803a738a39fb30James Dong        ALOGE("%s: Error canceling buffer to native window: %s (%d)",
131631d377b7622279034326fbd8b9803a738a39fb30James Dong                __FUNCTION__, strerror(-err), err);
131731d377b7622279034326fbd8b9803a738a39fb30James Dong        return err;
131831d377b7622279034326fbd8b9803a738a39fb30James Dong    }
131931d377b7622279034326fbd8b9803a738a39fb30James Dong
132031d377b7622279034326fbd8b9803a738a39fb30James Dong    stream->mActiveBuffers--;
132131d377b7622279034326fbd8b9803a738a39fb30James Dong    return OK;
13226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
13236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
13246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::set_crop(const camera2_stream_ops_t* w,
13256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        int left, int top, int right, int bottom) {
1326852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
13276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    int state = static_cast<const StreamAdapter*>(w)->mState;
13286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (state != ACTIVE) {
13296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state);
13306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return INVALID_OPERATION;
13316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
13326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindow *a = toANW(w);
13336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    android_native_rect_t crop = { left, top, right, bottom };
13346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return native_window_set_crop(a, &crop);
13356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
13366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
133769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/**
133869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Camera2Device::ReprocessStreamAdapter
133969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala */
134069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
134169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#ifndef container_of
134269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#define container_of(ptr, type, member) \
134369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    (type *)((char*)(ptr) - offsetof(type, member))
134469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#endif
134569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
134669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCamera2Device::ReprocessStreamAdapter::ReprocessStreamAdapter(camera2_device_t *d):
134769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mState(RELEASED),
13487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        mHal2Device(d),
134969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mId(-1),
135069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mWidth(0), mHeight(0), mFormat(0),
135169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mActiveBuffers(0),
135269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mFrameCount(0)
135369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala{
1354852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
135569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    camera2_stream_in_ops::acquire_buffer = acquire_buffer;
135669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    camera2_stream_in_ops::release_buffer = release_buffer;
135769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
135869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
135969230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCamera2Device::ReprocessStreamAdapter::~ReprocessStreamAdapter() {
1360852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
136169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mState != RELEASED) {
136269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        release();
136369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
136469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
136569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
136669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::ReprocessStreamAdapter::connectToDevice(
136769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        const sp<StreamAdapter> &outputStream) {
1368852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
136969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
137069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
137169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
137269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mState != RELEASED) return INVALID_OPERATION;
137369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (outputStream == NULL) {
137469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Null base stream passed to reprocess stream adapter",
137569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__);
137669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return BAD_VALUE;
137769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
137869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
137969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mBaseStream = outputStream;
138069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mWidth = outputStream->getWidth();
138169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mHeight = outputStream->getHeight();
138269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mFormat = outputStream->getFormat();
138369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
138469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGV("%s: New reprocess stream parameters %d x %d, format 0x%x",
138569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            __FUNCTION__, mWidth, mHeight, mFormat);
138669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
138769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // Allocate device-side stream interface
138869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
138969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    uint32_t id;
13907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    res = mHal2Device->ops->allocate_reprocess_stream_from_stream(mHal2Device,
139169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            outputStream->getId(), getStreamOps(),
139269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &id);
139369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
139469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Device reprocess stream allocation failed: %s (%d)",
139569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, strerror(-res), res);
139669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return res;
139769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
139869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
139969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGV("%s: Allocated reprocess stream id %d based on stream %d",
140069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            __FUNCTION__, id, outputStream->getId());
140169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
140269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mId = id;
140369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
140469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mState = ACTIVE;
140569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
140669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
140769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
140869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
140969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::ReprocessStreamAdapter::release() {
1410852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
141169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
141269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGV("%s: Releasing stream %d", __FUNCTION__, mId);
141369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mState >= ACTIVE) {
14147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        res = mHal2Device->ops->release_reprocess_stream(mHal2Device, mId);
141569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) {
141669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("%s: Unable to release stream %d",
141769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    __FUNCTION__, mId);
141869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            return res;
141969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
142069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
142169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
142269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    List<QueueEntry>::iterator s;
142369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    for (s = mQueue.begin(); s != mQueue.end(); s++) {
142469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<BufferReleasedListener> listener = s->releaseListener.promote();
142569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (listener != 0) listener->onBufferReleased(s->handle);
142669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
142769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    for (s = mInFlightQueue.begin(); s != mInFlightQueue.end(); s++) {
142869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<BufferReleasedListener> listener = s->releaseListener.promote();
142969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (listener != 0) listener->onBufferReleased(s->handle);
143069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
143169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mQueue.clear();
143269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mInFlightQueue.clear();
143369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
143469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mState = RELEASED;
143569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
143669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
143769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
143869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::ReprocessStreamAdapter::pushIntoStream(
143969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    buffer_handle_t *handle, const wp<BufferReleasedListener> &releaseListener) {
1440852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
144169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // TODO: Some error checking here would be nice
144269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGV("%s: Pushing buffer %p to stream", __FUNCTION__, (void*)(*handle));
144369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
144469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    QueueEntry entry;
144569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    entry.handle = handle;
144669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    entry.releaseListener = releaseListener;
144769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mQueue.push_back(entry);
144869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
144969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
145069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
145169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::ReprocessStreamAdapter::dump(int fd,
1452ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin        const Vector<String16>& /*args*/) {
1453852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
145469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    String8 result =
145569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            String8::format("      Reprocess stream %d: %d x %d, fmt 0x%x\n",
145669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    mId, mWidth, mHeight, mFormat);
145769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    result.appendFormat("        acquired buffers: %d\n",
145869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mActiveBuffers);
145969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    result.appendFormat("        frame count: %d\n",
146069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mFrameCount);
146169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    write(fd, result.string(), result.size());
146269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
146369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
146469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
146569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst camera2_stream_in_ops *Camera2Device::ReprocessStreamAdapter::getStreamOps() {
146669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return static_cast<camera2_stream_in_ops *>(this);
146769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
146869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
146969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Device::ReprocessStreamAdapter::acquire_buffer(
147069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    const camera2_stream_in_ops_t *w,
147169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        buffer_handle_t** buffer) {
1472852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
1473ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin
147469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ReprocessStreamAdapter* stream =
147569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            const_cast<ReprocessStreamAdapter*>(
147669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                static_cast<const ReprocessStreamAdapter*>(w));
147769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (stream->mState != ACTIVE) {
147869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState);
147969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return INVALID_OPERATION;
148069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
148169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
148269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (stream->mQueue.empty()) {
148369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        *buffer = NULL;
148469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return OK;
148569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
148669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
148769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    QueueEntry &entry = *(stream->mQueue.begin());
148869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
148969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    *buffer = entry.handle;
149069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
149169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    stream->mInFlightQueue.push_back(entry);
149269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    stream->mQueue.erase(stream->mQueue.begin());
149369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
149469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    stream->mActiveBuffers++;
149569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
149669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGV("Stream %d acquire: Buffer %p acquired", stream->mId,
149769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            (void*)(**buffer));
149869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
149969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
150069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
150169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Device::ReprocessStreamAdapter::release_buffer(
150269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    const camera2_stream_in_ops_t* w,
150369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    buffer_handle_t* buffer) {
1504852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    ATRACE_CALL();
150569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ReprocessStreamAdapter *stream =
150669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            const_cast<ReprocessStreamAdapter*>(
150769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                static_cast<const ReprocessStreamAdapter*>(w) );
150869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    stream->mFrameCount++;
150969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGV("Reprocess stream %d release: Frame %d (%p)",
151069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            stream->mId, stream->mFrameCount, (void*)*buffer);
151169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    int state = stream->mState;
151269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (state != ACTIVE) {
151369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state);
151469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return INVALID_OPERATION;
151569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
151669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    stream->mActiveBuffers--;
151769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
151869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    List<QueueEntry>::iterator s;
151969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    for (s = stream->mInFlightQueue.begin(); s != stream->mInFlightQueue.end(); s++) {
152069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if ( s->handle == buffer ) break;
152169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
152269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (s == stream->mInFlightQueue.end()) {
152369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Can't find buffer %p in in-flight list!", __FUNCTION__,
152469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                buffer);
152569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return INVALID_OPERATION;
152669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
152769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
152869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    sp<BufferReleasedListener> listener = s->releaseListener.promote();
152969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (listener != 0) {
153069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        listener->onBufferReleased(s->handle);
153169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } else {
153269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Can't free buffer - missing listener", __FUNCTION__);
153369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
153469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    stream->mInFlightQueue.erase(s);
153569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
153669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
153769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
153861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
153961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}; // namespace android
1540