Camera2Device.cpp revision 8ce89d9e2b132bf58a030acec88acf0a998926a1
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
192c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala//#define LOG_NNDEBUG 0  // Per-frame verbose logging
202c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala
212c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#ifdef LOG_NNDEBUG
222c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#define ALOGVV(...) ALOGV(__VA_ARGS__)
232c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#else
242c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#define ALOGVV(...) ((void)0)
252c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#endif
2661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <utils/Log.h>
2861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "Camera2Device.h"
2961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android {
3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
32f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::Camera2Device(int id):
33f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mId(id),
3461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        mDevice(NULL)
3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{
366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Device::~Camera2Device()
4061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{
416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    if (mDevice) {
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        status_t res;
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        res = mDevice->common.close(&mDevice->common);
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        if (res != OK) {
46f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            ALOGE("%s: Could not close camera %d: %s (%d)",
47f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    __FUNCTION__,
48f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    mId, strerror(-res), res);
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        }
50f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mDevice = NULL;
5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    }
5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
5361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
54f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::initialize(camera_module_t *module)
5561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{
566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    status_t res;
59f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    char name[10];
60f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    snprintf(name, sizeof(name), "%d", mId);
61f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
62f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = module->common.methods->open(&module->common, name,
6361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            reinterpret_cast<hw_device_t**>(&mDevice));
6461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
6561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    if (res != OK) {
66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Could not open camera %d: %s (%d)", __FUNCTION__,
67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                mId, strerror(-res), res);
6861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        return res;
6961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    }
7061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
7161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    if (mDevice->common.version != CAMERA_DEVICE_API_VERSION_2_0) {
72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Could not open camera %d: "
73f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "Camera device is not version %x, reports %x instead",
74f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mId, CAMERA_DEVICE_API_VERSION_2_0,
75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                mDevice->common.version);
7661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        return BAD_VALUE;
7761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    }
7861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_info info;
80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = module->get_camera_info(mId, &info);
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK ) return res;
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (info.device_version != mDevice->common.version) {
84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: HAL reporting mismatched camera_info version (%x)"
85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                " and device version (%x).", __FUNCTION__,
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                mDevice->common.version, info.device_version);
87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return BAD_VALUE;
88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDeviceInfo = info.static_camera_characteristics;
91f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mRequestQueue.setConsumerDevice(mDevice);
936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to connect request queue to device: %s (%d)",
956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, strerror(-res), res);
966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mFrameQueue.setProducerDevice(mDevice);
996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
1006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to connect frame queue to 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    res = mDevice->ops->get_metadata_vendor_tag_ops(mDevice, &mVendorTagOps);
1066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK ) {
1076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to retrieve tag ops from device: %s (%d)",
1086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, strerror(-res), res);
1096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
1106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
111f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
112160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    setNotifyCallback(NULL);
113160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
114f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
115f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
116f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1173297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::dump(int fd, const Vector<String16>& args) {
1183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    String8 result;
12097197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    int detailLevel = 0;
12197197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    int n = args.size();
12297197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    String16 detailOption("-d");
12397197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    for (int i = 0; i + 1 < n; i++) {
12497197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        if (args[i] == detailOption) {
12597197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala            String8 levelStr(args[i+1]);
12697197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala            detailLevel = atoi(levelStr.string());
12797197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        }
12897197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    }
1293297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
130603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    result.appendFormat("  Camera2Device[%d] dump (detail level %d):\n",
131603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala            mId, detailLevel);
1323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
13397197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    if (detailLevel > 0) {
13497197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        result = "    Request queue contents:\n";
13597197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        write(fd, result.string(), result.size());
13697197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        mRequestQueue.dump(fd, args);
1373297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
13897197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        result = "    Frame queue contents:\n";
13997197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        write(fd, result.string(), result.size());
14097197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        mFrameQueue.dump(fd, args);
14197197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    }
1423297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1433297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "    Active streams:\n";
1443297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    write(fd, result.string(), result.size());
1453297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    for (StreamList::iterator s = mStreams.begin(); s != mStreams.end(); s++) {
1463297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        (*s)->dump(fd, args);
1473297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
1483297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1493297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "    HAL device dump:\n";
1503297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    write(fd, result.string(), result.size());
1513297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1523297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t res;
1533297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    res = mDevice->ops->dump(mDevice, fd);
1543297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1553297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    return res;
1563297daae9681004775012faba9181d65e097e00cEino-Ville Talvala}
1573297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalacamera_metadata_t *Camera2Device::info() {
1599e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGVV("%s: E", __FUNCTION__);
1606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return mDeviceInfo;
1626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
1636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
164d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::capture(camera_metadata_t* request) {
165d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
166d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
167d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    mRequestQueue.enqueue(request);
168d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
169d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
170d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
171d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
172d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::setStreamingRequest(camera_metadata_t* request) {
1736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
1746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
175f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mRequestQueue.setStreamSlot(request);
176f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
177f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
178f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::createStream(sp<ANativeWindow> consumer,
180d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t width, uint32_t height, int format, size_t size, int *id) {
1816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
1826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
1836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<StreamAdapter> stream = new StreamAdapter(mDevice);
1856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
186d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = stream->connectToDevice(consumer, width, height, format, size);
1876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
1886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to create stream (%d x %d, format %x):"
1896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                "%s (%d)",
1906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, width, height, format, strerror(-res), res);
1916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
1926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    *id = stream->getId();
1956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mStreams.push_back(stream);
1976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
1986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
1996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
200d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::getStreamInfo(int id,
201d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t *width, uint32_t *height, uint32_t *format) {
202d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
203d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    bool found = false;
204d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    StreamList::iterator streamI;
205d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    for (streamI = mStreams.begin();
206d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         streamI != mStreams.end(); streamI++) {
207d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if ((*streamI)->getId() == id) {
208d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            found = true;
209d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
210d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
211d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
212d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (!found) {
213d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Stream %d does not exist",
214d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mId, id);
215d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return BAD_VALUE;
216d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
217d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
218d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (width) *width = (*streamI)->getWidth();
219d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (height) *height = (*streamI)->getHeight();
220d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (format) *format = (*streamI)->getFormat();
221d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
222d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
223d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
224d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
225c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalastatus_t Camera2Device::setStreamTransform(int id,
226c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        int transform) {
227c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
228c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    bool found = false;
229c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    StreamList::iterator streamI;
230c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    for (streamI = mStreams.begin();
231c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala         streamI != mStreams.end(); streamI++) {
232c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        if ((*streamI)->getId() == id) {
233c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            found = true;
234c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            break;
235c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        }
236c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
237c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (!found) {
238c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Camera %d: Stream %d does not exist",
239c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                __FUNCTION__, mId, id);
240c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return BAD_VALUE;
241c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
242c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
243c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    return (*streamI)->setTransform(transform);
244c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala}
245c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
2466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::deleteStream(int id) {
2476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
2486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    bool found = false;
2496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    for (StreamList::iterator streamI = mStreams.begin();
2506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         streamI != mStreams.end(); streamI++) {
2516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if ((*streamI)->getId() == id) {
2529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            status_t res = (*streamI)->release();
2534ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            if (res != OK) {
2549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Unable to release stream %d from HAL device: "
2554ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                        "%s (%d)", __FUNCTION__, id, strerror(-res), res);
2564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                return res;
2574ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            }
2586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            mStreams.erase(streamI);
2596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            found = true;
2606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            break;
2616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
2626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (!found) {
2646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to find stream %d to delete",
2656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, id);
2666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return BAD_VALUE;
2676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
2696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
2706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::createDefaultRequest(int templateId,
2726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        camera_metadata_t **request) {
2736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
274d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return mDevice->ops->construct_default_request(
275d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mDevice, templateId, request);
276d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
277d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
278d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::waitUntilDrained() {
279d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    static const uint32_t kSleepTime = 50000; // 50 ms
280d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    static const uint32_t kMaxSleepTime = 10000000; // 10 s
2819e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
282d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mRequestQueue.getBufferCount() ==
283d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS) return INVALID_OPERATION;
284d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
285d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // TODO: Set up notifications from HAL, instead of sleeping here
286d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    uint32_t totalTime = 0;
287d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    while (mDevice->ops->get_in_progress_count(mDevice) > 0) {
288d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        usleep(kSleepTime);
289d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        totalTime += kSleepTime;
290d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (totalTime > kMaxSleepTime) {
291d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Waited %d us, requests still in flight", __FUNCTION__,
292d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    totalTime);
293d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return TIMED_OUT;
294d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
295d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
296d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
2976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
2986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
299160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalastatus_t Camera2Device::setNotifyCallback(NotificationListener *listener) {
300160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    status_t res;
301160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    res = mDevice->ops->set_notify_callback(mDevice, notificationCallback,
302160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            reinterpret_cast<void*>(listener) );
303160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    if (res != OK) {
304160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        ALOGE("%s: Unable to set notification callback!", __FUNCTION__);
305160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    }
306160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    return res;
307160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
308160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
309160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Device::notificationCallback(int32_t msg_type,
310160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        int32_t ext1,
311160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        int32_t ext2,
312160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        int32_t ext3,
313160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        void *user) {
314160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    NotificationListener *listener = reinterpret_cast<NotificationListener*>(user);
315160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Notification %d, arguments %d, %d, %d", __FUNCTION__, msg_type,
316160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            ext1, ext2, ext3);
317160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    if (listener != NULL) {
318160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        switch (msg_type) {
319160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            case CAMERA2_MSG_ERROR:
320160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                listener->notifyError(ext1, ext2, ext3);
321160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                break;
322160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            case CAMERA2_MSG_SHUTTER: {
323160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                nsecs_t timestamp = (nsecs_t)ext2 | ((nsecs_t)(ext3) << 32 );
324160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                listener->notifyShutter(ext1, timestamp);
325160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                break;
326160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            }
327160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            case CAMERA2_MSG_AUTOFOCUS:
328160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                listener->notifyAutoFocus(ext1, ext2);
329160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                break;
330160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            case CAMERA2_MSG_AUTOEXPOSURE:
331160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                listener->notifyAutoExposure(ext1, ext2);
332160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                break;
333160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            case CAMERA2_MSG_AUTOWB:
334160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                listener->notifyAutoWhitebalance(ext1, ext2);
335160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                break;
336160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            default:
337160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                ALOGE("%s: Unknown notification %d (arguments %d, %d, %d)!",
338160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                        __FUNCTION__, msg_type, ext1, ext2, ext3);
339160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        }
340160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    }
341160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
342160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
3438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalastatus_t Camera2Device::setFrameListener(FrameListener *listener) {
3448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return mFrameQueue.setListener(listener);
3458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
3468ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
3478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalastatus_t Camera2Device::getNextFrame(camera_metadata_t **frame) {
3488ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return mFrameQueue.dequeue(frame);
3498ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
3508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
351174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerAutofocus(uint32_t id) {
352174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t res;
353174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id);
354174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    res = mDevice->ops->trigger_action(mDevice,
355174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            CAMERA2_TRIGGER_AUTOFOCUS, id, 0);
356174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (res != OK) {
357174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        ALOGE("%s: Error triggering autofocus (id %d)",
358174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                __FUNCTION__, id);
359174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
360174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    return res;
361174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala}
362174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
363174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerCancelAutofocus(uint32_t id) {
364174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t res;
365174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    ALOGV("%s: Canceling autofocus, id %d", __FUNCTION__, id);
366174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    res = mDevice->ops->trigger_action(mDevice,
367174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            CAMERA2_TRIGGER_CANCEL_AUTOFOCUS, id, 0);
368174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (res != OK) {
369174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        ALOGE("%s: Error canceling autofocus (id %d)",
370174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                __FUNCTION__, id);
371174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
372174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    return res;
373174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala}
374174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
375174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerPrecaptureMetering(uint32_t id) {
376174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t res;
377174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id);
378174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    res = mDevice->ops->trigger_action(mDevice,
379174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            CAMERA2_TRIGGER_PRECAPTURE_METERING, id, 0);
380174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (res != OK) {
381174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        ALOGE("%s: Error triggering precapture metering (id %d)",
382174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                __FUNCTION__, id);
383174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
384174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    return res;
385174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala}
386174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
387160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala/**
388160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala * Camera2Device::NotificationListener
389160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala */
390160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
391160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville TalvalaCamera2Device::NotificationListener::~NotificationListener() {
392160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
393160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
394f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala/**
3958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala * Camera2Device::FrameListener
3968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala */
3978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
3988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville TalvalaCamera2Device::FrameListener::~FrameListener() {
3998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
4008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
4018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala/**
402f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala * Camera2Device::MetadataQueue
403f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala */
404f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
405f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue::MetadataQueue():
406f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mDevice(NULL),
407f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mFrameCount(0),
408f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mCount(0),
409f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mStreamSlotCount(0),
4108ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            mSignalConsumer(true),
4118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            mListener(NULL)
412f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
413f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_request_queue_src_ops::dequeue_request = consumer_dequeue;
414f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_request_queue_src_ops::request_count = consumer_buffer_count;
415f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_request_queue_src_ops::free_request = consumer_free;
416f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
417f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_frame_queue_dst_ops::dequeue_frame = producer_dequeue;
418f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_frame_queue_dst_ops::cancel_frame = producer_cancel;
419f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_frame_queue_dst_ops::enqueue_frame = producer_enqueue;
420f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
421f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
422f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue::~MetadataQueue() {
423f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
424f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    freeBuffers(mEntries.begin(), mEntries.end());
425f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    freeBuffers(mStreamSlot.begin(), mStreamSlot.end());
426f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
427f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
4286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala// Connect to camera2 HAL as consumer (input requests/reprocessing)
4296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setConsumerDevice(camera2_device_t *d) {
4306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
4316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = d->ops->set_request_queue_src_ops(d,
4326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            this);
4336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) return res;
434f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = d;
4356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
436f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
437f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
4386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setProducerDevice(camera2_device_t *d) {
4396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
4406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = d->ops->set_frame_queue_dst_ops(d,
4416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            this);
4426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return res;
443f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
444f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
445f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala// Real interfaces
446f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::enqueue(camera_metadata_t *buf) {
4472c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala    ALOGVV("%s: E", __FUNCTION__);
448f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
449f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
450f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mCount++;
451f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mEntries.push_back(buf);
452f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
4536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return signalConsumerLocked();
454f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
455f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
456f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::getBufferCount() {
457f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
458f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mStreamSlotCount > 0) {
459f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS;
460f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
461f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return mCount;
462f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
463f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
464f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::dequeue(camera_metadata_t **buf,
465f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool incrementCount)
466f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
4672c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala    ALOGVV("%s: E", __FUNCTION__);
4686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
469f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
470f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
471f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mCount == 0) {
472f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (mStreamSlotCount == 0) {
4732c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala            ALOGVV("%s: Empty", __FUNCTION__);
474f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            *buf = NULL;
475f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mSignalConsumer = true;
476f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            return OK;
477f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
4782c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala        ALOGVV("%s: Streaming %d frames to queue", __FUNCTION__,
479f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mStreamSlotCount);
480f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
481f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (List<camera_metadata_t*>::iterator slotEntry = mStreamSlot.begin();
482f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                slotEntry != mStreamSlot.end();
483f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                slotEntry++ ) {
484f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            size_t entries = get_camera_metadata_entry_count(*slotEntry);
485f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            size_t dataBytes = get_camera_metadata_data_count(*slotEntry);
486f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
487f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            camera_metadata_t *copy =
488f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    allocate_camera_metadata(entries, dataBytes);
489f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            append_camera_metadata(copy, *slotEntry);
490f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mEntries.push_back(copy);
491f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
492f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mCount = mStreamSlotCount;
493f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
4942c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala    ALOGVV("MetadataQueue: deque (%d buffers)", mCount);
495f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_t *b = *(mEntries.begin());
496f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mEntries.erase(mEntries.begin());
497f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
498f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (incrementCount) {
4996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        camera_metadata_entry_t frameCount;
5006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = find_camera_metadata_entry(b,
501f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ANDROID_REQUEST_FRAME_COUNT,
5026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &frameCount);
5036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
5046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Unable to add frame count: %s (%d)",
5056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
5066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        } else {
5076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            *frameCount.data.i32 = mFrameCount;
5086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
509f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mFrameCount++;
510f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
511f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
512f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    *buf = b;
513f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mCount--;
514f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
51561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return OK;
51661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
51761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
518f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::waitForBuffer(nsecs_t timeout)
519f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
520f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
521f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
522f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    while (mCount == 0) {
523f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        res = notEmpty.waitRelative(mMutex,timeout);
524f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (res != OK) return res;
525f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
526f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
527f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
528f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
5298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setListener(FrameListener *listener) {
5308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    Mutex::Autolock l(mMutex);
5318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    mListener = listener;
5328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return OK;
5338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
5348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
535f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setStreamSlot(camera_metadata_t *buf)
536f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
5376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
538f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
539f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (buf == NULL) {
540f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        freeBuffers(mStreamSlot.begin(), mStreamSlot.end());
541f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mStreamSlotCount = 0;
542f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return OK;
543f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
5446ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    camera_metadata_t *buf2 = clone_camera_metadata(buf);
5456ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    if (!buf2) {
5466ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        ALOGE("%s: Unable to clone metadata buffer!", __FUNCTION__);
5476ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        return NO_MEMORY;
5486ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    }
5496ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala
550f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mStreamSlotCount > 1) {
551f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*>::iterator deleter = ++mStreamSlot.begin();
552f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        freeBuffers(++mStreamSlot.begin(), mStreamSlot.end());
553f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mStreamSlotCount = 1;
554f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
555f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mStreamSlotCount == 1) {
556f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        free_camera_metadata( *(mStreamSlot.begin()) );
5576ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        *(mStreamSlot.begin()) = buf2;
558f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
5596ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        mStreamSlot.push_front(buf2);
560f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mStreamSlotCount = 1;
561f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
5626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return signalConsumerLocked();
563f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
564f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
565f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setStreamSlot(
566f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const List<camera_metadata_t*> &bufs)
567f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
5686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
569f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
5706ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    status_t res;
5716ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala
572f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mStreamSlotCount > 0) {
573f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        freeBuffers(mStreamSlot.begin(), mStreamSlot.end());
574f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
5756ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    mStreamSlotCount = 0;
5766ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    for (List<camera_metadata_t*>::const_iterator r = bufs.begin();
5776ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala         r != bufs.end(); r++) {
5786ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        camera_metadata_t *r2 = clone_camera_metadata(*r);
5796ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        if (!r2) {
5806ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala            ALOGE("%s: Unable to clone metadata buffer!", __FUNCTION__);
5816ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala            return NO_MEMORY;
5826ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        }
5836ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        mStreamSlot.push_back(r2);
5846ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        mStreamSlotCount++;
5856ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    }
5866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return signalConsumerLocked();
5876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
588f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
5893297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::dump(int fd,
5903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        const Vector<String16>& args) {
5913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    String8 result;
5923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t notLocked;
5933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    notLocked = mMutex.tryLock();
5943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (notLocked) {
5953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    (Unable to lock queue mutex)\n");
5963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
5973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("      Current frame number: %d\n", mFrameCount);
5983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mStreamSlotCount == 0) {
5993297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("      Stream slot: Empty\n");
6003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
6013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
6023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.appendFormat("      Stream slot: %d entries\n",
6033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                mStreamSlot.size());
6043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        int i = 0;
6053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        for (List<camera_metadata_t*>::iterator r = mStreamSlot.begin();
6063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala             r != mStreamSlot.end(); r++) {
6073297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            result = String8::format("       Stream slot buffer %d:\n", i);
6083297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            write(fd, result.string(), result.size());
609428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala            dump_indented_camera_metadata(*r, fd, 2, 10);
6103297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            i++;
6113297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        }
6123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
6133297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mEntries.size() == 0) {
6143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "      Main queue is empty\n";
6153297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
6163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
6173297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = String8::format("      Main queue has %d entries:\n",
6183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                mEntries.size());
6193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        int i = 0;
6203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        for (List<camera_metadata_t*>::iterator r = mEntries.begin();
6213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala             r != mEntries.end(); r++) {
6223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            result = String8::format("       Queue entry %d:\n", i);
6233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            write(fd, result.string(), result.size());
624428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala            dump_indented_camera_metadata(*r, fd, 2, 10);
6253297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            i++;
6263297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        }
6273297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
6283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
6293297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (notLocked == 0) {
6303297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mMutex.unlock();
6313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
6323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
6333297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    return OK;
6343297daae9681004775012faba9181d65e097e00cEino-Ville Talvala}
6353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
6366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::signalConsumerLocked() {
6376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res = OK;
6386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    notEmpty.signal();
6396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mSignalConsumer && mDevice != NULL) {
6406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mSignalConsumer = false;
6416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mMutex.unlock();
6436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGV("%s: Signaling consumer", __FUNCTION__);
6446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->ops->notify_request_queue_not_empty(mDevice);
6456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mMutex.lock();
6466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (mListener != NULL) {
6488ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        FrameListener *listener = mListener;
6498ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        mMutex.unlock();
6508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGVV("%s: Signaling listener", __FUNCTION__);
6518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        listener->onNewFrameAvailable();
6528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        mMutex.lock();
6538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
6546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return res;
655f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
656f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
657f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::freeBuffers(
658f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*>::iterator start,
659f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*>::iterator end)
660f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
661f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    while (start != end) {
662f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        free_camera_metadata(*start);
663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        start = mStreamSlot.erase(start);
664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
665f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
666f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
667f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
668f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance(
669f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t *q)
670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
671f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q);
672f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return const_cast<MetadataQueue*>(cmq);
673f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
674f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
675f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance(
676f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t *q)
677f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
678f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q);
679f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return const_cast<MetadataQueue*>(cmq);
680f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
681f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
682f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_buffer_count(
683f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t *q)
684f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
685f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue *queue = getInstance(q);
686f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return queue->getBufferCount();
687f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
688f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
689f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_dequeue(
690f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t *q,
691f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t **buffer)
692f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
693f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue *queue = getInstance(q);
694f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return queue->dequeue(buffer, true);
695f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
696f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
697f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_free(
698f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t *q,
699f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t *old_buffer)
700f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
701f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue *queue = getInstance(q);
702f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    free_camera_metadata(old_buffer);
703f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
704f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
705f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
706f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_dequeue(
707f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t *q,
708f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        size_t entries, size_t bytes,
709f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t **buffer)
710f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
711f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_t *new_buffer =
712f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            allocate_camera_metadata(entries, bytes);
713f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (new_buffer == NULL) return NO_MEMORY;
714f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    *buffer = new_buffer;
715f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return OK;
716f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
717f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
718f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_cancel(
719f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t *q,
720f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t *old_buffer)
721f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
722f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    free_camera_metadata(old_buffer);
723f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
724f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
725f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
726f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_enqueue(
727f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t *q,
728f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t *filled_buffer)
729f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
730f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue *queue = getInstance(q);
731f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return queue->enqueue(filled_buffer);
732f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
733f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
7346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala/**
7356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala * Camera2Device::StreamAdapter
7366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala */
7376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#ifndef container_of
7396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#define container_of(ptr, type, member) \
7406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    (type *)((char*)(ptr) - offsetof(type, member))
7416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#endif
7426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaCamera2Device::StreamAdapter::StreamAdapter(camera2_device_t *d):
7449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mState(RELEASED),
7456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice(d),
7466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mId(-1),
7473297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mWidth(0), mHeight(0), mFormat(0), mSize(0), mUsage(0),
7483297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mMaxProducerBuffers(0), mMaxConsumerBuffers(0),
7493297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mTotalBuffers(0),
7503297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mFormatRequested(0),
7513297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mActiveBuffers(0),
7523297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mFrameCount(0),
7533297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mLastTimestamp(0)
7546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala{
7556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera2_stream_ops::dequeue_buffer = dequeue_buffer;
7566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera2_stream_ops::enqueue_buffer = enqueue_buffer;
7576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera2_stream_ops::cancel_buffer = cancel_buffer;
7586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera2_stream_ops::set_crop = set_crop;
7596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
7606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaCamera2Device::StreamAdapter::~StreamAdapter() {
7629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mState != RELEASED) {
7639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        release();
7649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
7656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
7666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
767d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::StreamAdapter::connectToDevice(
768d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        sp<ANativeWindow> consumer,
769d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t width, uint32_t height, int format, size_t size) {
7706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
7719e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
7726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mState != RELEASED) return INVALID_OPERATION;
7746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (consumer == NULL) {
7756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Null consumer passed to stream adapter", __FUNCTION__);
7766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return BAD_VALUE;
7776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
7786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: New stream parameters %d x %d, format 0x%x, size %d",
7809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, width, height, format, size);
7819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mConsumerInterface = consumer;
7836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mWidth = width;
7846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mHeight = height;
785d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    mSize = (format == HAL_PIXEL_FORMAT_BLOB) ? size : 0;
7866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mFormatRequested = format;
7876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    // Allocate device-side stream interface
7896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint32_t id;
7916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint32_t formatActual;
7926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint32_t usage;
7936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint32_t maxBuffers = 2;
7946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->ops->allocate_stream(mDevice,
7956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            mWidth, mHeight, mFormatRequested, getStreamOps(),
7966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            &id, &formatActual, &usage, &maxBuffers);
7976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
7986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Device stream allocation failed: %s (%d)",
7996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, strerror(-res), res);
8006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
8016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
8026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Allocated stream id %d, actual format 0x%x, "
8049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            "usage 0x%x, producer wants %d buffers", __FUNCTION__,
8059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            id, formatActual, usage, maxBuffers);
8069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mId = id;
8086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mFormat = formatActual;
8096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mUsage = usage;
8106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mMaxProducerBuffers = maxBuffers;
8116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = ALLOCATED;
8136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    // Configure consumer-side ANativeWindow interface
8156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = native_window_api_connect(mConsumerInterface.get(),
8166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            NATIVE_WINDOW_API_CAMERA);
8176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
8186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to connect to native window for stream %d",
8196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId);
8206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
8226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
8236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = CONNECTED;
8256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = native_window_set_usage(mConsumerInterface.get(), mUsage);
8276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
8286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to configure usage %08x for stream %d",
8296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mUsage, mId);
8306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
8316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
8326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
833bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    res = native_window_set_scaling_mode(mConsumerInterface.get(),
834bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala            NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
835bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    if (res != OK) {
836bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        ALOGE("%s: Unable to configure stream scaling: %s (%d)",
837bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala                __FUNCTION__, strerror(-res), res);
838bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        return res;
839bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    }
840bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala
841c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = setTransform(0);
842bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    if (res != OK) {
843bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        return res;
844bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    }
845bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala
846d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mFormat == HAL_PIXEL_FORMAT_BLOB) {
847d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = native_window_set_buffers_geometry(mConsumerInterface.get(),
848d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mSize, 1, mFormat);
849d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
850d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Unable to configure compressed stream buffer geometry"
851d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %d x %d, size %d for stream %d",
852d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mWidth, mHeight, mSize, mId);
853d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
854d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
855d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    } else {
856d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = native_window_set_buffers_geometry(mConsumerInterface.get(),
857d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mWidth, mHeight, mFormat);
858d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
859d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Unable to configure stream buffer geometry"
860d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %d x %d, format 0x%x for stream %d",
861d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mWidth, mHeight, mFormat, mId);
862d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
863d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
8646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
8656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    int maxConsumerBuffers;
8676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mConsumerInterface->query(mConsumerInterface.get(),
8686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &maxConsumerBuffers);
8696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
8706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to query consumer undequeued"
8716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                " buffer count for stream %d", __FUNCTION__, mId);
8726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
8736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
8746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mMaxConsumerBuffers = maxConsumerBuffers;
8756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Consumer wants %d buffers", __FUNCTION__,
8779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mMaxConsumerBuffers);
8786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8793297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mTotalBuffers = mMaxConsumerBuffers + mMaxProducerBuffers;
8803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mActiveBuffers = 0;
8813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mFrameCount = 0;
8823297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mLastTimestamp = 0;
8836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = native_window_set_buffer_count(mConsumerInterface.get(),
8853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mTotalBuffers);
8866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
8876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to set buffer count for stream %d",
8886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId);
8896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
8906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
8916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    // Register allocated buffers with HAL device
8933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    buffer_handle_t *buffers = new buffer_handle_t[mTotalBuffers];
8943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    ANativeWindowBuffer **anwBuffers = new ANativeWindowBuffer*[mTotalBuffers];
8953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    uint32_t bufferIdx = 0;
8963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    for (; bufferIdx < mTotalBuffers; bufferIdx++) {
8971e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis        res = native_window_dequeue_buffer_and_wait(mConsumerInterface.get(),
8986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &anwBuffers[bufferIdx]);
8996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
9009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Unable to dequeue buffer %d for initial registration for "
9016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "stream %d", __FUNCTION__, bufferIdx, mId);
9026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            goto cleanUpBuffers;
9036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
9046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        buffers[bufferIdx] = anwBuffers[bufferIdx]->handle;
906750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala        ALOGV("%s: Buffer %p allocated", __FUNCTION__, (void*)(buffers[bufferIdx]));
9076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
9086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
909750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    ALOGV("%s: Registering %d buffers with camera HAL", __FUNCTION__, mTotalBuffers);
9106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->ops->register_stream_buffers(mDevice,
9116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            mId,
9123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mTotalBuffers,
9136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            buffers);
9146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
9156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to register buffers with HAL device for stream %d",
9166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId);
9176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    } else {
9186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = ACTIVE;
9196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
9206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalacleanUpBuffers:
922750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    ALOGV("%s: Cleaning up %d buffers", __FUNCTION__, bufferIdx);
9233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    for (uint32_t i = 0; i < bufferIdx; i++) {
9246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mConsumerInterface->cancelBuffer(mConsumerInterface.get(),
9251e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis                anwBuffers[i], -1);
9266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
9276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Unable to cancel buffer %d after registration",
9286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    __FUNCTION__, i);
9296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
9306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
9313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    delete[] anwBuffers;
9323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    delete[] buffers;
9336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return res;
9356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
9366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalastatus_t Camera2Device::StreamAdapter::release() {
9386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
9399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Releasing stream %d", __FUNCTION__, mId);
9406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState >= ALLOCATED) {
9416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->ops->release_stream(mDevice, mId);
9426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
9436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Unable to release stream %d",
9446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    __FUNCTION__, mId);
9456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
9466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
9476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
9486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState >= CONNECTED) {
9496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = native_window_api_disconnect(mConsumerInterface.get(),
9506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                NATIVE_WINDOW_API_CAMERA);
9516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
9526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Unable to disconnect stream %d from native window",
9536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    __FUNCTION__, mId);
9546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
9556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
9566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
9576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mId = -1;
9589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mState = RELEASED;
9596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
9606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
9616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
962c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalastatus_t Camera2Device::StreamAdapter::setTransform(int transform) {
963c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    status_t res;
964c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (mState < CONNECTED) {
965c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Cannot set transform on unconnected stream", __FUNCTION__);
966c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return INVALID_OPERATION;
967c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
968c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = native_window_set_buffers_transform(mConsumerInterface.get(),
969c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                                              transform);
970c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (res != OK) {
971c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Unable to configure stream transform to %x: %s (%d)",
972c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                __FUNCTION__, transform, strerror(-res), res);
973c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
974c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    return res;
975c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala}
976c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
9773297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::StreamAdapter::dump(int fd,
9783297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        const Vector<String16>& args) {
9793297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    String8 result = String8::format("      Stream %d: %d x %d, format 0x%x\n",
9803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mId, mWidth, mHeight, mFormat);
9813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("        size %d, usage 0x%x, requested format 0x%x\n",
9823297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mSize, mUsage, mFormatRequested);
9833297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("        total buffers: %d, dequeued buffers: %d\n",
9843297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mTotalBuffers, mActiveBuffers);
9853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("        frame count: %d, last timestamp %lld\n",
9863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mFrameCount, mLastTimestamp);
9873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    write(fd, result.string(), result.size());
9883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    return OK;
9893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala}
9903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
9916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaconst camera2_stream_ops *Camera2Device::StreamAdapter::getStreamOps() {
9926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return static_cast<camera2_stream_ops *>(this);
9936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
9946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaANativeWindow* Camera2Device::StreamAdapter::toANW(
9966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const camera2_stream_ops_t *w) {
9976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return static_cast<const StreamAdapter*>(w)->mConsumerInterface.get();
9986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
9996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::dequeue_buffer(const camera2_stream_ops_t *w,
10016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        buffer_handle_t** buffer) {
10026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    int res;
10033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    StreamAdapter* stream =
10043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w));
10053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (stream->mState != ACTIVE) {
10063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState);
10076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return INVALID_OPERATION;
10086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindow *a = toANW(w);
10116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindowBuffer* anb;
10121e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis    res = native_window_dequeue_buffer_and_wait(a, &anb);
1013750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    if (res != OK) {
1014750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala        ALOGE("Stream %d dequeue: Error from native_window: %s (%d)", stream->mId,
1015750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala                strerror(-res), res);
1016750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala        return res;
1017750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    }
10186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    *buffer = &(anb->handle);
10203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    stream->mActiveBuffers++;
10213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1022750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    ALOGVV("Stream %d dequeue: Buffer %p dequeued", stream->mId, (void*)(**buffer));
10236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return res;
10246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
10256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::enqueue_buffer(const camera2_stream_ops_t* w,
10276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        int64_t timestamp,
10286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        buffer_handle_t* buffer) {
10293297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    StreamAdapter *stream =
10303297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w));
1031750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    ALOGVV("Stream %d enqueue: Buffer %p captured at %lld ns",
1032750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala            stream->mId, (void*)(*buffer), timestamp);
1033bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    int state = stream->mState;
10346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (state != ACTIVE) {
10356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state);
10366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return INVALID_OPERATION;
10376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindow *a = toANW(w);
10396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t err;
10406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    err = native_window_set_buffers_timestamp(a, timestamp);
1041bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    if (err != OK) {
1042bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        ALOGE("%s: Error setting timestamp on native window: %s (%d)",
1043bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala                __FUNCTION__, strerror(-err), err);
1044bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        return err;
1045bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    }
1046bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    err = a->queueBuffer(a,
10471e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis            container_of(buffer, ANativeWindowBuffer, handle), -1);
1048bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    if (err != OK) {
1049bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        ALOGE("%s: Error queueing buffer to native window: %s (%d)",
1050bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala                __FUNCTION__, strerror(-err), err);
105131d377b7622279034326fbd8b9803a738a39fb30James Dong        return err;
1052bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    }
105331d377b7622279034326fbd8b9803a738a39fb30James Dong
10543297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    stream->mActiveBuffers--;
10553297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    stream->mFrameCount++;
10563297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    stream->mLastTimestamp = timestamp;
105731d377b7622279034326fbd8b9803a738a39fb30James Dong    return OK;
10586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
10596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::cancel_buffer(const camera2_stream_ops_t* w,
10616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        buffer_handle_t* buffer) {
10623297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    StreamAdapter *stream =
10633297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w));
1064750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    ALOGVV("Stream %d cancel: Buffer %p",
1065750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala            stream->mId, (void*)(*buffer));
10663297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (stream->mState != ACTIVE) {
10673297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState);
10686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return INVALID_OPERATION;
10696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
107031d377b7622279034326fbd8b9803a738a39fb30James Dong
10716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindow *a = toANW(w);
107231d377b7622279034326fbd8b9803a738a39fb30James Dong    int err = a->cancelBuffer(a,
10731e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis            container_of(buffer, ANativeWindowBuffer, handle), -1);
107431d377b7622279034326fbd8b9803a738a39fb30James Dong    if (err != OK) {
107531d377b7622279034326fbd8b9803a738a39fb30James Dong        ALOGE("%s: Error canceling buffer to native window: %s (%d)",
107631d377b7622279034326fbd8b9803a738a39fb30James Dong                __FUNCTION__, strerror(-err), err);
107731d377b7622279034326fbd8b9803a738a39fb30James Dong        return err;
107831d377b7622279034326fbd8b9803a738a39fb30James Dong    }
107931d377b7622279034326fbd8b9803a738a39fb30James Dong
108031d377b7622279034326fbd8b9803a738a39fb30James Dong    stream->mActiveBuffers--;
108131d377b7622279034326fbd8b9803a738a39fb30James Dong    return OK;
10826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
10836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::set_crop(const camera2_stream_ops_t* w,
10856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        int left, int top, int right, int bottom) {
10866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    int state = static_cast<const StreamAdapter*>(w)->mState;
10876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (state != ACTIVE) {
10886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state);
10896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return INVALID_OPERATION;
10906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindow *a = toANW(w);
10926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    android_native_rect_t crop = { left, top, right, bottom };
10936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return native_window_set_crop(a, &crop);
10946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
10956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
109661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
109761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}; // namespace android
1098