Camera2Device.cpp revision c94cd19694ea0befe2eb22735c50b00070f006d9
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
1761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define LOG_TAG "Camera2Device"
1861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala//#define LOG_NDEBUG 0
1961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <utils/Log.h>
2161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "Camera2Device.h"
2261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android {
2461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
25f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::Camera2Device(int id):
26f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mId(id),
2761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        mDevice(NULL)
2861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{
296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
3061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Device::~Camera2Device()
3361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{
346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    if (mDevice) {
3661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        status_t res;
3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        res = mDevice->common.close(&mDevice->common);
3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        if (res != OK) {
39f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ALOGE("%s: Could not close camera %d: %s (%d)",
40f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    __FUNCTION__,
41f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    mId, strerror(-res), res);
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        }
43f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mDevice = NULL;
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    }
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
47f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::initialize(camera_module_t *module)
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{
496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    status_t res;
52f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    char name[10];
53f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    snprintf(name, sizeof(name), "%d", mId);
54f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
55f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = module->common.methods->open(&module->common, name,
5661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            reinterpret_cast<hw_device_t**>(&mDevice));
5761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
5861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    if (res != OK) {
59f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Could not open camera %d: %s (%d)", __FUNCTION__,
60f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                mId, strerror(-res), res);
6161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        return res;
6261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    }
6361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
6461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    if (mDevice->common.version != CAMERA_DEVICE_API_VERSION_2_0) {
65f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Could not open camera %d: "
66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "Camera device is not version %x, reports %x instead",
67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mId, CAMERA_DEVICE_API_VERSION_2_0,
68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                mDevice->common.version);
6961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        return BAD_VALUE;
7061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    }
7161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_info info;
73f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = module->get_camera_info(mId, &info);
74f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK ) return res;
75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
76f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (info.device_version != mDevice->common.version) {
77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: HAL reporting mismatched camera_info version (%x)"
78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                " and device version (%x).", __FUNCTION__,
79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                mDevice->common.version, info.device_version);
80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return BAD_VALUE;
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDeviceInfo = info.static_camera_characteristics;
84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mRequestQueue.setConsumerDevice(mDevice);
866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to connect request queue to device: %s (%d)",
886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, strerror(-res), res);
896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mFrameQueue.setProducerDevice(mDevice);
926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to connect frame queue to device: %s (%d)",
946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, strerror(-res), res);
956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = mDevice->ops->get_metadata_vendor_tag_ops(mDevice, &mVendorTagOps);
996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK ) {
1006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to retrieve tag ops from device: %s (%d)",
1016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, strerror(-res), res);
1026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
1036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
105f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
107f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1083297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::dump(int fd, const Vector<String16>& args) {
1093297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1103297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    String8 result;
1113297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("  Camera2Device[%d] dump:\n", mId);
1133297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Static camera information metadata:\n");
1153297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    write(fd, result.string(), result.size());
1163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    dump_camera_metadata(mDeviceInfo, fd, 2);
1173297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "    Request queue contents:\n";
1193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    write(fd, result.string(), result.size());
1203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mRequestQueue.dump(fd, args);
1213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "    Frame queue contents:\n";
1233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    write(fd, result.string(), result.size());
1243297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mFrameQueue.dump(fd, args);
1253297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1263297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "    Active streams:\n";
1273297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    write(fd, result.string(), result.size());
1283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    for (StreamList::iterator s = mStreams.begin(); s != mStreams.end(); s++) {
1293297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        (*s)->dump(fd, args);
1303297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
1313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "    HAL device dump:\n";
1333297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    write(fd, result.string(), result.size());
1343297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t res;
1363297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    res = mDevice->ops->dump(mDevice, fd);
1373297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1383297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    return res;
1393297daae9681004775012faba9181d65e097e00cEino-Ville Talvala}
1403297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalacamera_metadata_t *Camera2Device::info() {
1426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
1436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return mDeviceInfo;
1456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
1466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
147d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::capture(camera_metadata_t* request) {
148d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
149d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
150d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    mRequestQueue.enqueue(request);
151d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
152d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
153d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
154d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
155d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::setStreamingRequest(camera_metadata_t* request) {
1566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
1576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
158f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mRequestQueue.setStreamSlot(request);
159f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
160f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
161f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::createStream(sp<ANativeWindow> consumer,
163d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t width, uint32_t height, int format, size_t size, int *id) {
1646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
1656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
1666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<StreamAdapter> stream = new StreamAdapter(mDevice);
1686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
169d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = stream->connectToDevice(consumer, width, height, format, size);
1706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
1716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to create stream (%d x %d, format %x):"
1726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                "%s (%d)",
1736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, width, height, format, strerror(-res), res);
1746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
1756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    *id = stream->getId();
1786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mStreams.push_back(stream);
1806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
1816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
1826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
183d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::getStreamInfo(int id,
184d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t *width, uint32_t *height, uint32_t *format) {
185d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
186d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    bool found = false;
187d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    StreamList::iterator streamI;
188d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    for (streamI = mStreams.begin();
189d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         streamI != mStreams.end(); streamI++) {
190d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if ((*streamI)->getId() == id) {
191d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            found = true;
192d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
193d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
194d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
195d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (!found) {
196d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Stream %d does not exist",
197d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mId, id);
198d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return BAD_VALUE;
199d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
200d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
201d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (width) *width = (*streamI)->getWidth();
202d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (height) *height = (*streamI)->getHeight();
203d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (format) *format = (*streamI)->getFormat();
204d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
205d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
206d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
207d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
208c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalastatus_t Camera2Device::setStreamTransform(int id,
209c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        int transform) {
210c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
211c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    bool found = false;
212c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    StreamList::iterator streamI;
213c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    for (streamI = mStreams.begin();
214c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala         streamI != mStreams.end(); streamI++) {
215c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        if ((*streamI)->getId() == id) {
216c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            found = true;
217c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            break;
218c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        }
219c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
220c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (!found) {
221c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Camera %d: Stream %d does not exist",
222c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                __FUNCTION__, mId, id);
223c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return BAD_VALUE;
224c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
225c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
226c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    return (*streamI)->setTransform(transform);
227c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala}
228c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
2296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::deleteStream(int id) {
2306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
2316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    bool found = false;
2326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    for (StreamList::iterator streamI = mStreams.begin();
2336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         streamI != mStreams.end(); streamI++) {
2346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if ((*streamI)->getId() == id) {
2354ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            status_t res = (*streamI)->disconnect();
2364ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            if (res != OK) {
2374ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                ALOGE("%s: Unable to disconnect stream %d from HAL device: "
2384ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                        "%s (%d)", __FUNCTION__, id, strerror(-res), res);
2394ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                return res;
2404ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            }
2416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            mStreams.erase(streamI);
2426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            found = true;
2436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            break;
2446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
2456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (!found) {
2476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to find stream %d to delete",
2486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, id);
2496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return BAD_VALUE;
2506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
2526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
2536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::createDefaultRequest(int templateId,
2556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        camera_metadata_t **request) {
2566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
257d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return mDevice->ops->construct_default_request(
258d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mDevice, templateId, request);
259d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
260d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
261d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::waitUntilDrained() {
262d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    static const uint32_t kSleepTime = 50000; // 50 ms
263d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    static const uint32_t kMaxSleepTime = 10000000; // 10 s
264d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
265d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mRequestQueue.getBufferCount() ==
266d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS) return INVALID_OPERATION;
267d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
268d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // TODO: Set up notifications from HAL, instead of sleeping here
269d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    uint32_t totalTime = 0;
270d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    while (mDevice->ops->get_in_progress_count(mDevice) > 0) {
271d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        usleep(kSleepTime);
272d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        totalTime += kSleepTime;
273d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (totalTime > kMaxSleepTime) {
274d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Waited %d us, requests still in flight", __FUNCTION__,
275d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    totalTime);
276d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return TIMED_OUT;
277d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
278d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
279d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
2806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
2816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
282f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala/**
283f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala * Camera2Device::MetadataQueue
284f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala */
285f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
286f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue::MetadataQueue():
287f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mDevice(NULL),
288f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mFrameCount(0),
289f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mCount(0),
290f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mStreamSlotCount(0),
291f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mSignalConsumer(true)
292f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
293f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_request_queue_src_ops::dequeue_request = consumer_dequeue;
294f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_request_queue_src_ops::request_count = consumer_buffer_count;
295f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_request_queue_src_ops::free_request = consumer_free;
296f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
297f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_frame_queue_dst_ops::dequeue_frame = producer_dequeue;
298f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_frame_queue_dst_ops::cancel_frame = producer_cancel;
299f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_frame_queue_dst_ops::enqueue_frame = producer_enqueue;
300f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
301f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
302f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue::~MetadataQueue() {
303f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
304f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    freeBuffers(mEntries.begin(), mEntries.end());
305f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    freeBuffers(mStreamSlot.begin(), mStreamSlot.end());
306f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
307f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala// Connect to camera2 HAL as consumer (input requests/reprocessing)
3096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setConsumerDevice(camera2_device_t *d) {
3106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
3116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = d->ops->set_request_queue_src_ops(d,
3126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            this);
3136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) return res;
314f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = d;
3156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
316f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
317f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setProducerDevice(camera2_device_t *d) {
3196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
3206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = d->ops->set_frame_queue_dst_ops(d,
3216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            this);
3226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return res;
323f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
324f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
325f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala// Real interfaces
326f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::enqueue(camera_metadata_t *buf) {
3276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
328f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
329f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
330f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mCount++;
331f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mEntries.push_back(buf);
332f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return signalConsumerLocked();
334f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
335f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
336f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::getBufferCount() {
337f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
338f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mStreamSlotCount > 0) {
339f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS;
340f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
341f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return mCount;
342f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
343f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
344f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::dequeue(camera_metadata_t **buf,
345f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool incrementCount)
346f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
3476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
3486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
349f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
350f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
351f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mCount == 0) {
352f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (mStreamSlotCount == 0) {
353f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ALOGV("%s: Empty", __FUNCTION__);
354f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            *buf = NULL;
355f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mSignalConsumer = true;
356f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            return OK;
357f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
358f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGV("%s: Streaming %d frames to queue", __FUNCTION__,
359f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mStreamSlotCount);
360f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
361f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (List<camera_metadata_t*>::iterator slotEntry = mStreamSlot.begin();
362f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                slotEntry != mStreamSlot.end();
363f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                slotEntry++ ) {
364f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            size_t entries = get_camera_metadata_entry_count(*slotEntry);
365f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            size_t dataBytes = get_camera_metadata_data_count(*slotEntry);
366f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
367f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            camera_metadata_t *copy =
368f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    allocate_camera_metadata(entries, dataBytes);
369f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            append_camera_metadata(copy, *slotEntry);
370f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mEntries.push_back(copy);
371f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
372f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mCount = mStreamSlotCount;
373f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
374f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    ALOGV("MetadataQueue: deque (%d buffers)", mCount);
375f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_t *b = *(mEntries.begin());
376f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mEntries.erase(mEntries.begin());
377f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
378f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (incrementCount) {
3796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        camera_metadata_entry_t frameCount;
3806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = find_camera_metadata_entry(b,
381f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ANDROID_REQUEST_FRAME_COUNT,
3826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &frameCount);
3836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
3846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Unable to add frame count: %s (%d)",
3856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
3866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        } else {
3876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            *frameCount.data.i32 = mFrameCount;
3886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
389f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mFrameCount++;
390f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
391f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
392f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    *buf = b;
393f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mCount--;
394f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
39561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return OK;
39661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
39761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
398f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::waitForBuffer(nsecs_t timeout)
399f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
400f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
401f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
402f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    while (mCount == 0) {
403f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        res = notEmpty.waitRelative(mMutex,timeout);
404f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (res != OK) return res;
405f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
406f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
407f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
408f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
409f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setStreamSlot(camera_metadata_t *buf)
410f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
4116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
412f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
413f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (buf == NULL) {
414f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        freeBuffers(mStreamSlot.begin(), mStreamSlot.end());
415f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mStreamSlotCount = 0;
416f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return OK;
417f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
4186ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    camera_metadata_t *buf2 = clone_camera_metadata(buf);
4196ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    if (!buf2) {
4206ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        ALOGE("%s: Unable to clone metadata buffer!", __FUNCTION__);
4216ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        return NO_MEMORY;
4226ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    }
4236ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala
424f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mStreamSlotCount > 1) {
425f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*>::iterator deleter = ++mStreamSlot.begin();
426f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        freeBuffers(++mStreamSlot.begin(), mStreamSlot.end());
427f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mStreamSlotCount = 1;
428f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
429f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mStreamSlotCount == 1) {
430f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        free_camera_metadata( *(mStreamSlot.begin()) );
4316ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        *(mStreamSlot.begin()) = buf2;
432f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
4336ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        mStreamSlot.push_front(buf2);
434f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mStreamSlotCount = 1;
435f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
4366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return signalConsumerLocked();
437f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
438f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
439f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setStreamSlot(
440f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const List<camera_metadata_t*> &bufs)
441f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
4426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
443f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
4446ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    status_t res;
4456ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala
446f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mStreamSlotCount > 0) {
447f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        freeBuffers(mStreamSlot.begin(), mStreamSlot.end());
448f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
4496ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    mStreamSlotCount = 0;
4506ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    for (List<camera_metadata_t*>::const_iterator r = bufs.begin();
4516ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala         r != bufs.end(); r++) {
4526ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        camera_metadata_t *r2 = clone_camera_metadata(*r);
4536ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        if (!r2) {
4546ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala            ALOGE("%s: Unable to clone metadata buffer!", __FUNCTION__);
4556ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala            return NO_MEMORY;
4566ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        }
4576ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        mStreamSlot.push_back(r2);
4586ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        mStreamSlotCount++;
4596ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    }
4606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return signalConsumerLocked();
4616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
462f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
4633297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::dump(int fd,
4643297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        const Vector<String16>& args) {
4653297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    String8 result;
4663297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t notLocked;
4673297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    notLocked = mMutex.tryLock();
4683297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (notLocked) {
4693297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    (Unable to lock queue mutex)\n");
4703297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
4713297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("      Current frame number: %d\n", mFrameCount);
4723297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mStreamSlotCount == 0) {
4733297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("      Stream slot: Empty\n");
4743297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
4753297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
4763297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.appendFormat("      Stream slot: %d entries\n",
4773297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                mStreamSlot.size());
4783297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        int i = 0;
4793297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        for (List<camera_metadata_t*>::iterator r = mStreamSlot.begin();
4803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala             r != mStreamSlot.end(); r++) {
4813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            result = String8::format("       Stream slot buffer %d:\n", i);
4823297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            write(fd, result.string(), result.size());
4833297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            dump_camera_metadata(*r, fd, 2);
4843297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            i++;
4853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        }
4863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
4873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mEntries.size() == 0) {
4883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "      Main queue is empty\n";
4893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
4903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
4913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = String8::format("      Main queue has %d entries:\n",
4923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                mEntries.size());
4933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        int i = 0;
4943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        for (List<camera_metadata_t*>::iterator r = mEntries.begin();
4953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala             r != mEntries.end(); r++) {
4963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            result = String8::format("       Queue entry %d:\n", i);
4973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            write(fd, result.string(), result.size());
4983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            dump_camera_metadata(*r, fd, 2);
4993297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            i++;
5003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        }
5013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
5023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
5033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (notLocked == 0) {
5043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mMutex.unlock();
5053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
5063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
5073297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    return OK;
5083297daae9681004775012faba9181d65e097e00cEino-Ville Talvala}
5093297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
5106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::signalConsumerLocked() {
5116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res = OK;
5126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    notEmpty.signal();
5136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mSignalConsumer && mDevice != NULL) {
5146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mSignalConsumer = false;
5156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mMutex.unlock();
5176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGV("%s: Signaling consumer", __FUNCTION__);
5186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->ops->notify_request_queue_not_empty(mDevice);
5196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mMutex.lock();
5206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return res;
522f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
523f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
524f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::freeBuffers(
525f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*>::iterator start,
526f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*>::iterator end)
527f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
528f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    while (start != end) {
529f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        free_camera_metadata(*start);
530f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        start = mStreamSlot.erase(start);
531f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
532f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
533f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
534f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
535f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance(
536f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t *q)
537f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
538f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q);
539f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return const_cast<MetadataQueue*>(cmq);
540f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
541f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
542f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance(
543f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t *q)
544f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
545f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q);
546f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return const_cast<MetadataQueue*>(cmq);
547f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
548f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
549f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_buffer_count(
550f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t *q)
551f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
552f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue *queue = getInstance(q);
553f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return queue->getBufferCount();
554f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
555f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
556f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_dequeue(
557f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t *q,
558f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t **buffer)
559f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
560f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue *queue = getInstance(q);
561f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return queue->dequeue(buffer, true);
562f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
563f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
564f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_free(
565f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t *q,
566f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t *old_buffer)
567f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
568f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue *queue = getInstance(q);
569f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    free_camera_metadata(old_buffer);
570f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
571f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
572f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
573f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_dequeue(
574f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t *q,
575f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        size_t entries, size_t bytes,
576f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t **buffer)
577f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
578f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_t *new_buffer =
579f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            allocate_camera_metadata(entries, bytes);
580f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (new_buffer == NULL) return NO_MEMORY;
581f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    *buffer = new_buffer;
582f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return OK;
583f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
584f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
585f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_cancel(
586f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t *q,
587f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t *old_buffer)
588f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
589f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    free_camera_metadata(old_buffer);
590f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
591f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
592f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
593f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_enqueue(
594f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t *q,
595f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t *filled_buffer)
596f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
597f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue *queue = getInstance(q);
598f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return queue->enqueue(filled_buffer);
599f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
600f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
6016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala/**
6026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala * Camera2Device::StreamAdapter
6036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala */
6046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#ifndef container_of
6066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#define container_of(ptr, type, member) \
6076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    (type *)((char*)(ptr) - offsetof(type, member))
6086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#endif
6096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaCamera2Device::StreamAdapter::StreamAdapter(camera2_device_t *d):
6116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState(DISCONNECTED),
6126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice(d),
6136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mId(-1),
6143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mWidth(0), mHeight(0), mFormat(0), mSize(0), mUsage(0),
6153297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mMaxProducerBuffers(0), mMaxConsumerBuffers(0),
6163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mTotalBuffers(0),
6173297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mFormatRequested(0),
6183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mActiveBuffers(0),
6193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mFrameCount(0),
6203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mLastTimestamp(0)
6216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala{
6226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera2_stream_ops::dequeue_buffer = dequeue_buffer;
6236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera2_stream_ops::enqueue_buffer = enqueue_buffer;
6246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera2_stream_ops::cancel_buffer = cancel_buffer;
6256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera2_stream_ops::set_crop = set_crop;
6266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
6276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaCamera2Device::StreamAdapter::~StreamAdapter() {
6296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    disconnect();
6306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
6316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
632d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::StreamAdapter::connectToDevice(
633d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        sp<ANativeWindow> consumer,
634d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t width, uint32_t height, int format, size_t size) {
6356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
6366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState != DISCONNECTED) return INVALID_OPERATION;
6386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (consumer == NULL) {
6396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Null consumer passed to stream adapter", __FUNCTION__);
6406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return BAD_VALUE;
6416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mConsumerInterface = consumer;
6446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mWidth = width;
6456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mHeight = height;
646d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    mSize = (format == HAL_PIXEL_FORMAT_BLOB) ? size : 0;
6476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mFormatRequested = format;
6486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    // Allocate device-side stream interface
6506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint32_t id;
6526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint32_t formatActual;
6536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint32_t usage;
6546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint32_t maxBuffers = 2;
6556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->ops->allocate_stream(mDevice,
6566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            mWidth, mHeight, mFormatRequested, getStreamOps(),
6576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            &id, &formatActual, &usage, &maxBuffers);
6586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
6596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Device stream allocation failed: %s (%d)",
6606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, strerror(-res), res);
6616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mId = id;
6656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mFormat = formatActual;
6666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mUsage = usage;
6676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mMaxProducerBuffers = maxBuffers;
6686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = ALLOCATED;
6706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    // Configure consumer-side ANativeWindow interface
6726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = native_window_api_connect(mConsumerInterface.get(),
6736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            NATIVE_WINDOW_API_CAMERA);
6746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
6756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to connect to native window for stream %d",
6766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId);
6776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = CONNECTED;
6826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = native_window_set_usage(mConsumerInterface.get(), mUsage);
6846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
6856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to configure usage %08x for stream %d",
6866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mUsage, mId);
6876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
690bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    res = native_window_set_scaling_mode(mConsumerInterface.get(),
691bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala            NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
692bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    if (res != OK) {
693bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        ALOGE("%s: Unable to configure stream scaling: %s (%d)",
694bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala                __FUNCTION__, strerror(-res), res);
695bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        return res;
696bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    }
697bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala
698c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = setTransform(0);
699bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    if (res != OK) {
700bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        return res;
701bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    }
702bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala
703d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mFormat == HAL_PIXEL_FORMAT_BLOB) {
704d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = native_window_set_buffers_geometry(mConsumerInterface.get(),
705d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mSize, 1, mFormat);
706d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
707d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Unable to configure compressed stream buffer geometry"
708d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %d x %d, size %d for stream %d",
709d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mWidth, mHeight, mSize, mId);
710d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
711d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
712d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    } else {
713d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = native_window_set_buffers_geometry(mConsumerInterface.get(),
714d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mWidth, mHeight, mFormat);
715d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
716d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Unable to configure stream buffer geometry"
717d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %d x %d, format 0x%x for stream %d",
718d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mWidth, mHeight, mFormat, mId);
719d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
720d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
7216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
7226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    int maxConsumerBuffers;
7246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mConsumerInterface->query(mConsumerInterface.get(),
7256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &maxConsumerBuffers);
7266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
7276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to query consumer undequeued"
7286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                " buffer count for stream %d", __FUNCTION__, mId);
7296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
7306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
7316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mMaxConsumerBuffers = maxConsumerBuffers;
7326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: Producer wants %d buffers, consumer wants %d", __FUNCTION__,
7346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            mMaxProducerBuffers, mMaxConsumerBuffers);
7356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7363297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mTotalBuffers = mMaxConsumerBuffers + mMaxProducerBuffers;
7373297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mActiveBuffers = 0;
7383297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mFrameCount = 0;
7393297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mLastTimestamp = 0;
7406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = native_window_set_buffer_count(mConsumerInterface.get(),
7423297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mTotalBuffers);
7436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
7446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to set buffer count for stream %d",
7456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId);
7466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
7476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
7486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    // Register allocated buffers with HAL device
7503297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    buffer_handle_t *buffers = new buffer_handle_t[mTotalBuffers];
7513297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    ANativeWindowBuffer **anwBuffers = new ANativeWindowBuffer*[mTotalBuffers];
7523297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    uint32_t bufferIdx = 0;
7533297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    for (; bufferIdx < mTotalBuffers; bufferIdx++) {
7546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mConsumerInterface->dequeueBuffer(mConsumerInterface.get(),
7556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &anwBuffers[bufferIdx]);
7566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
7576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Unable to dequeue buffer %d for initial registration for"
7586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "stream %d", __FUNCTION__, bufferIdx, mId);
7596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            goto cleanUpBuffers;
7606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
7616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mConsumerInterface->lockBuffer(mConsumerInterface.get(),
7636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                anwBuffers[bufferIdx]);
7646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
7656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Unable to lock buffer %d for initial registration for"
7666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "stream %d", __FUNCTION__, bufferIdx, mId);
7676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            bufferIdx++;
7686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            goto cleanUpBuffers;
7696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
7706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        buffers[bufferIdx] = anwBuffers[bufferIdx]->handle;
7726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
7736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->ops->register_stream_buffers(mDevice,
7756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            mId,
7763297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mTotalBuffers,
7776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            buffers);
7786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
7796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to register buffers with HAL device for stream %d",
7806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId);
7816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    } else {
7826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = ACTIVE;
7836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
7846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalacleanUpBuffers:
7863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    for (uint32_t i = 0; i < bufferIdx; i++) {
7876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mConsumerInterface->cancelBuffer(mConsumerInterface.get(),
7886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                anwBuffers[i]);
7896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
7906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Unable to cancel buffer %d after registration",
7916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    __FUNCTION__, i);
7926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
7936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
7943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    delete[] anwBuffers;
7953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    delete[] buffers;
7966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return res;
7986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
7996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::StreamAdapter::disconnect() {
8016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
8026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState >= ALLOCATED) {
8036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->ops->release_stream(mDevice, mId);
8046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
8056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Unable to release stream %d",
8066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    __FUNCTION__, mId);
8076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
8086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
8096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
8106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState >= CONNECTED) {
8116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = native_window_api_disconnect(mConsumerInterface.get(),
8126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                NATIVE_WINDOW_API_CAMERA);
8136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
8146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Unable to disconnect stream %d from native window",
8156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    __FUNCTION__, mId);
8166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
8176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
8186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
8196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mId = -1;
8206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = DISCONNECTED;
8216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
8226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
8236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
824c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalastatus_t Camera2Device::StreamAdapter::setTransform(int transform) {
825c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    status_t res;
826c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (mState < CONNECTED) {
827c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Cannot set transform on unconnected stream", __FUNCTION__);
828c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return INVALID_OPERATION;
829c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
830c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = native_window_set_buffers_transform(mConsumerInterface.get(),
831c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                                              transform);
832c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (res != OK) {
833c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Unable to configure stream transform to %x: %s (%d)",
834c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                __FUNCTION__, transform, strerror(-res), res);
835c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
836c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    return res;
837c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala}
838c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
8393297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::StreamAdapter::dump(int fd,
8403297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        const Vector<String16>& args) {
8413297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    String8 result = String8::format("      Stream %d: %d x %d, format 0x%x\n",
8423297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mId, mWidth, mHeight, mFormat);
8433297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("        size %d, usage 0x%x, requested format 0x%x\n",
8443297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mSize, mUsage, mFormatRequested);
8453297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("        total buffers: %d, dequeued buffers: %d\n",
8463297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mTotalBuffers, mActiveBuffers);
8473297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("        frame count: %d, last timestamp %lld\n",
8483297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mFrameCount, mLastTimestamp);
8493297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    write(fd, result.string(), result.size());
8503297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    return OK;
8513297daae9681004775012faba9181d65e097e00cEino-Ville Talvala}
8523297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
8536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaconst camera2_stream_ops *Camera2Device::StreamAdapter::getStreamOps() {
8546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return static_cast<camera2_stream_ops *>(this);
8556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
8566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaANativeWindow* Camera2Device::StreamAdapter::toANW(
8586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const camera2_stream_ops_t *w) {
8596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return static_cast<const StreamAdapter*>(w)->mConsumerInterface.get();
8606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
8616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::dequeue_buffer(const camera2_stream_ops_t *w,
8636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        buffer_handle_t** buffer) {
8646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    int res;
8653297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    StreamAdapter* stream =
8663297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w));
8673297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (stream->mState != ACTIVE) {
8683297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState);
8696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return INVALID_OPERATION;
8706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
8716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindow *a = toANW(w);
8736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindowBuffer* anb;
8746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = a->dequeueBuffer(a, &anb);
8756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) return res;
8766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = a->lockBuffer(a, anb);
8776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) return res;
8786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    *buffer = &(anb->handle);
8803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    stream->mActiveBuffers++;
8813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
8826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: Buffer %p", __FUNCTION__, *buffer);
8836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return res;
8846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
8856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::enqueue_buffer(const camera2_stream_ops_t* w,
8876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        int64_t timestamp,
8886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        buffer_handle_t* buffer) {
8893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    StreamAdapter *stream =
8903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w));
891bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    ALOGV("%s: Stream %d: Buffer %p captured at %lld ns",
892bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala            __FUNCTION__, stream->mId, buffer, timestamp);
893bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    int state = stream->mState;
8946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (state != ACTIVE) {
8956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state);
8966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return INVALID_OPERATION;
8976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
8986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindow *a = toANW(w);
8996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t err;
9006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    err = native_window_set_buffers_timestamp(a, timestamp);
901bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    if (err != OK) {
902bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        ALOGE("%s: Error setting timestamp on native window: %s (%d)",
903bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala                __FUNCTION__, strerror(-err), err);
904bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        return err;
905bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    }
906bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    err = a->queueBuffer(a,
9076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            container_of(buffer, ANativeWindowBuffer, handle));
908bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    if (err != OK) {
909bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        ALOGE("%s: Error queueing buffer to native window: %s (%d)",
910bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala                __FUNCTION__, strerror(-err), err);
911bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    }
9123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    stream->mActiveBuffers--;
9133297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    stream->mFrameCount++;
9143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    stream->mLastTimestamp = timestamp;
915bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    return err;
9166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
9176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::cancel_buffer(const camera2_stream_ops_t* w,
9196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        buffer_handle_t* buffer) {
9203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    StreamAdapter *stream =
9213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w));
9223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (stream->mState != ACTIVE) {
9233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState);
9246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return INVALID_OPERATION;
9256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
9263297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    stream->mActiveBuffers--;
9276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindow *a = toANW(w);
9286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return a->cancelBuffer(a,
9296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            container_of(buffer, ANativeWindowBuffer, handle));
9306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
9316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::set_crop(const camera2_stream_ops_t* w,
9336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        int left, int top, int right, int bottom) {
9346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    int state = static_cast<const StreamAdapter*>(w)->mState;
9356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (state != ACTIVE) {
9366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state);
9376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return INVALID_OPERATION;
9386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
9396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindow *a = toANW(w);
9406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    android_native_rect_t crop = { left, top, right, bottom };
9416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return native_window_set_crop(a, &crop);
9426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
9436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
94461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
94561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}; // namespace android
946