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
174bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala#define LOG_TAG "Camera2-Device"
184bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA
1961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala//#define LOG_NDEBUG 0
202c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala//#define LOG_NNDEBUG 0  // Per-frame verbose logging
212c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala
222c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#ifdef LOG_NNDEBUG
232c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#define ALOGVV(...) ALOGV(__VA_ARGS__)
242c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#else
252c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#define ALOGVV(...) ((void)0)
262c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala#endif
2761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <utils/Log.h>
294bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala#include <utils/Trace.h>
304865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala#include <utils/Timers.h>
3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "Camera2Device.h"
3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android {
3461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
35f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::Camera2Device(int id):
36f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mId(id),
3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        mDevice(NULL)
3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{
394bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
40c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Created device for camera %d", __FUNCTION__, id);
4161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Device::~Camera2Device()
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{
454bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
46ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin    ALOGV("%s: Tearing down for camera id %d", __FUNCTION__, mId);
4798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    disconnect();
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
50f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::initialize(camera_module_t *module)
5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala{
524bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
53c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Initializing device for camera %d", __FUNCTION__, mId);
5498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    if (mDevice != NULL) {
5598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        ALOGE("%s: Already initialized!", __FUNCTION__);
5698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        return INVALID_OPERATION;
5798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    }
586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    status_t res;
60f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    char name[10];
61f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    snprintf(name, sizeof(name), "%d", mId);
62f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
6398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    camera2_device_t *device;
6498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
65f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = module->common.methods->open(&module->common, name,
6698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala            reinterpret_cast<hw_device_t**>(&device));
6761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
6861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    if (res != OK) {
69f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Could not open camera %d: %s (%d)", __FUNCTION__,
70f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                mId, strerror(-res), res);
7161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        return res;
7261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    }
7361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
7498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    if (device->common.version != CAMERA_DEVICE_API_VERSION_2_0) {
75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Could not open camera %d: "
76f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                "Camera device is not version %x, reports %x instead",
77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mId, CAMERA_DEVICE_API_VERSION_2_0,
7898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala                device->common.version);
7998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        device->common.close(&device->common);
8061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        return BAD_VALUE;
8161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    }
8261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_info info;
84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = module->get_camera_info(mId, &info);
85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK ) return res;
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
8798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    if (info.device_version != device->common.version) {
88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: HAL reporting mismatched camera_info version (%x)"
89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                " and device version (%x).", __FUNCTION__,
9098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala                device->common.version, info.device_version);
9198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        device->common.close(&device->common);
92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return BAD_VALUE;
93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    res = mRequestQueue.setConsumerDevice(device);
966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to connect request queue to device: %s (%d)",
986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, strerror(-res), res);
9998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        device->common.close(&device->common);
1006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
1016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    res = mFrameQueue.setProducerDevice(device);
1036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
1046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to connect frame queue to device: %s (%d)",
1056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, strerror(-res), res);
10698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        device->common.close(&device->common);
1076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
1086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
109f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
11098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    res = device->ops->get_metadata_vendor_tag_ops(device, &mVendorTagOps);
1116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK ) {
1126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to retrieve tag ops from device: %s (%d)",
1136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, strerror(-res), res);
11498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        device->common.close(&device->common);
1156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
1166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
117092fe44abd787fcb4377d90c63f2aa7120a4d267Shuzhen Wang    res = set_camera_metadata_vendor_tag_ops(mVendorTagOps);
118092fe44abd787fcb4377d90c63f2aa7120a4d267Shuzhen Wang    if (res != OK) {
119092fe44abd787fcb4377d90c63f2aa7120a4d267Shuzhen Wang        ALOGE("%s: Camera %d: Unable to set tag ops: %s (%d)",
120092fe44abd787fcb4377d90c63f2aa7120a4d267Shuzhen Wang            __FUNCTION__, mId, strerror(-res), res);
12198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        device->common.close(&device->common);
12298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        return res;
12398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    }
12498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    res = device->ops->set_notify_callback(device, notificationCallback,
12598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala            NULL);
12698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    if (res != OK) {
12798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to initialize notification callback!",
12898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala                __FUNCTION__, mId);
12998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        device->common.close(&device->common);
130092fe44abd787fcb4377d90c63f2aa7120a4d267Shuzhen Wang        return res;
131092fe44abd787fcb4377d90c63f2aa7120a4d267Shuzhen Wang    }
13298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
13398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mDeviceInfo = info.static_camera_characteristics;
13498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mDevice = device;
135160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
136f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
137f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
138f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
13998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvalastatus_t Camera2Device::disconnect() {
1404bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
14198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    status_t res = OK;
14298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    if (mDevice) {
14398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        ALOGV("%s: Closing device for camera %d", __FUNCTION__, mId);
14498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
14598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        int inProgressCount = mDevice->ops->get_in_progress_count(mDevice);
14698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        if (inProgressCount > 0) {
14798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala            ALOGW("%s: Closing camera device %d with %d requests in flight!",
14898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala                    __FUNCTION__, mId, inProgressCount);
14998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        }
150c7d9afdc7d2181aef7688638fff52859bcdabd65Eino-Ville Talvala        mReprocessStreams.clear();
15198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        mStreams.clear();
15298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        res = mDevice->common.close(&mDevice->common);
15398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        if (res != OK) {
15498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala            ALOGE("%s: Could not close camera %d: %s (%d)",
15598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala                    __FUNCTION__,
15698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala                    mId, strerror(-res), res);
15798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        }
15898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        mDevice = NULL;
15998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        ALOGV("%s: Shutdown complete", __FUNCTION__);
16098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    }
16198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    return res;
16298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala}
16398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
1643297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::dump(int fd, const Vector<String16>& args) {
1654bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
1663297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    String8 result;
16797197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    int detailLevel = 0;
16897197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    int n = args.size();
16997197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    String16 detailOption("-d");
17097197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    for (int i = 0; i + 1 < n; i++) {
17197197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        if (args[i] == detailOption) {
17297197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala            String8 levelStr(args[i+1]);
17397197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala            detailLevel = atoi(levelStr.string());
17497197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        }
17597197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    }
1763297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
177603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    result.appendFormat("  Camera2Device[%d] dump (detail level %d):\n",
178603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala            mId, detailLevel);
1793297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
18097197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    if (detailLevel > 0) {
18197197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        result = "    Request queue contents:\n";
18297197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        write(fd, result.string(), result.size());
18397197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        mRequestQueue.dump(fd, args);
1843297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
18597197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        result = "    Frame queue contents:\n";
18697197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        write(fd, result.string(), result.size());
18797197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala        mFrameQueue.dump(fd, args);
18897197157cf619fb716710eb67915fdfa93502750Eino-Ville Talvala    }
1893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "    Active streams:\n";
1913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    write(fd, result.string(), result.size());
1923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    for (StreamList::iterator s = mStreams.begin(); s != mStreams.end(); s++) {
1933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        (*s)->dump(fd, args);
1943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
1953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "    HAL device dump:\n";
1973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    write(fd, result.string(), result.size());
1983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1993297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t res;
2003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    res = mDevice->ops->dump(mDevice, fd);
2013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    return res;
2033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala}
2043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst camera2::CameraMetadata& Camera2Device::info() const {
2069e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGVV("%s: E", __FUNCTION__);
2076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return mDeviceInfo;
2096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
2106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
211cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t Camera2Device::capture(CameraMetadata &request) {
2124bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
213d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
214d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
215cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    mRequestQueue.enqueue(request.release());
216d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
217d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
218d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
219d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
220cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t Camera2Device::setStreamingRequest(const CameraMetadata &request) {
2214bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
2226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
223cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    CameraMetadata streamRequest(request);
224cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return mRequestQueue.setStreamSlot(streamRequest.release());
225cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala}
2266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
227cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t Camera2Device::clearStreamingRequest() {
2284bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
229cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return mRequestQueue.setStreamSlot(NULL);
230f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
231f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2324865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Device::waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) {
2334865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    ATRACE_CALL();
2344865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return mRequestQueue.waitForDequeue(requestId, timeout);
2354865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala}
2364865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
2376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::createStream(sp<ANativeWindow> consumer,
238d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t width, uint32_t height, int format, size_t size, int *id) {
2394bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
2406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
2416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
2426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<StreamAdapter> stream = new StreamAdapter(mDevice);
2446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
245d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = stream->connectToDevice(consumer, width, height, format, size);
2466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
2476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to create stream (%d x %d, format %x):"
2486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                "%s (%d)",
2496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, width, height, format, strerror(-res), res);
2506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
2516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    *id = stream->getId();
2546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mStreams.push_back(stream);
2566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
2576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
2586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
259da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Camera2Device::createReprocessStreamFromStream(int outputId, int *id) {
2604bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
261da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
262da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
263da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
264da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool found = false;
265da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    StreamList::iterator streamI;
266da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    for (streamI = mStreams.begin();
267da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala         streamI != mStreams.end(); streamI++) {
268da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if ((*streamI)->getId() == outputId) {
269da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            found = true;
270da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
271da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
272da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
273da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (!found) {
274da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Output stream %d doesn't exist; can't create "
275da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                "reprocess stream from it!", __FUNCTION__, mId, outputId);
276da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return BAD_VALUE;
277da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
278da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
279da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    sp<ReprocessStreamAdapter> stream = new ReprocessStreamAdapter(mDevice);
280da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
281da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = stream->connectToDevice((*streamI));
282da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) {
283da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to create reprocessing stream from "\
284da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                "stream %d: %s (%d)", __FUNCTION__, mId, outputId,
285da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                strerror(-res), res);
286da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return res;
287da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
288da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
289da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    *id = stream->getId();
290da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
291da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mReprocessStreams.push_back(stream);
292da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return OK;
293da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
294da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
295da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
296d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::getStreamInfo(int id,
297d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t *width, uint32_t *height, uint32_t *format) {
2984bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
299d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
300d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    bool found = false;
301d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    StreamList::iterator streamI;
302d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    for (streamI = mStreams.begin();
303d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         streamI != mStreams.end(); streamI++) {
304d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if ((*streamI)->getId() == id) {
305d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            found = true;
306d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
307d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
308d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
309d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (!found) {
310d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Stream %d does not exist",
311d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mId, id);
312d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return BAD_VALUE;
313d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
314d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
315d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (width) *width = (*streamI)->getWidth();
316d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (height) *height = (*streamI)->getHeight();
317d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (format) *format = (*streamI)->getFormat();
318d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
319d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
320d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
321d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
322c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalastatus_t Camera2Device::setStreamTransform(int id,
323c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        int transform) {
3244bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
325c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
326c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    bool found = false;
327c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    StreamList::iterator streamI;
328c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    for (streamI = mStreams.begin();
329c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala         streamI != mStreams.end(); streamI++) {
330c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        if ((*streamI)->getId() == id) {
331c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            found = true;
332c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            break;
333c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        }
334c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
335c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (!found) {
336c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Camera %d: Stream %d does not exist",
337c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                __FUNCTION__, mId, id);
338c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return BAD_VALUE;
339c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
340c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
341c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    return (*streamI)->setTransform(transform);
342c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala}
343c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
3446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::deleteStream(int id) {
3454bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
3466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
3476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    bool found = false;
3486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    for (StreamList::iterator streamI = mStreams.begin();
3496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         streamI != mStreams.end(); streamI++) {
3506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if ((*streamI)->getId() == id) {
3519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            status_t res = (*streamI)->release();
3524ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            if (res != OK) {
3539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Unable to release stream %d from HAL device: "
3544ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                        "%s (%d)", __FUNCTION__, id, strerror(-res), res);
3554ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                return res;
3564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            }
3576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            mStreams.erase(streamI);
3586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            found = true;
3596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            break;
3606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
3616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
3626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (!found) {
3636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to find stream %d to delete",
3646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId, id);
3656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return BAD_VALUE;
3666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
3676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
3686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
3696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
370da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Camera2Device::deleteReprocessStream(int id) {
3714bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
372da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
373da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool found = false;
374da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    for (ReprocessStreamList::iterator streamI = mReprocessStreams.begin();
375da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala         streamI != mReprocessStreams.end(); streamI++) {
376da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if ((*streamI)->getId() == id) {
377da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            status_t res = (*streamI)->release();
378da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            if (res != OK) {
379da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                ALOGE("%s: Unable to release reprocess stream %d from "
380da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                        "HAL device: %s (%d)", __FUNCTION__, id,
381da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                        strerror(-res), res);
382da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                return res;
383da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            }
384da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mReprocessStreams.erase(streamI);
385da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            found = true;
386da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
387da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
388da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
389da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (!found) {
390da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to find stream %d to delete",
391da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                __FUNCTION__, mId, id);
392da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return BAD_VALUE;
393da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
394da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return OK;
395da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
396da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
397da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
3986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::createDefaultRequest(int templateId,
399cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        CameraMetadata *request) {
4004bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
401cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t err;
4026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
403cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_t *rawRequest;
404cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    err = mDevice->ops->construct_default_request(
405cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mDevice, templateId, &rawRequest);
406cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    request->acquire(rawRequest);
407cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return err;
408d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
409d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
410d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::waitUntilDrained() {
4114bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
412d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    static const uint32_t kSleepTime = 50000; // 50 ms
413d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    static const uint32_t kMaxSleepTime = 10000000; // 10 s
41498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting wait", __FUNCTION__, mId);
415d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mRequestQueue.getBufferCount() ==
416d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS) return INVALID_OPERATION;
417d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
418d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // TODO: Set up notifications from HAL, instead of sleeping here
419d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    uint32_t totalTime = 0;
420d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    while (mDevice->ops->get_in_progress_count(mDevice) > 0) {
421d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        usleep(kSleepTime);
422d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        totalTime += kSleepTime;
423d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (totalTime > kMaxSleepTime) {
42498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala            ALOGE("%s: Waited %d us, %d requests still in flight", __FUNCTION__,
42598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala                    mDevice->ops->get_in_progress_count(mDevice), totalTime);
426d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return TIMED_OUT;
427d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
428d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
42998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("%s: Camera %d: HAL is idle", __FUNCTION__, mId);
430d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
4316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
4326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
433160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalastatus_t Camera2Device::setNotifyCallback(NotificationListener *listener) {
4344bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
435160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    status_t res;
436160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    res = mDevice->ops->set_notify_callback(mDevice, notificationCallback,
437160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            reinterpret_cast<void*>(listener) );
438160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    if (res != OK) {
439160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        ALOGE("%s: Unable to set notification callback!", __FUNCTION__);
440160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    }
441160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    return res;
442160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
443160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
444160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Device::notificationCallback(int32_t msg_type,
445160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        int32_t ext1,
446160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        int32_t ext2,
447160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        int32_t ext3,
448160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        void *user) {
4494bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
450160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    NotificationListener *listener = reinterpret_cast<NotificationListener*>(user);
451160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Notification %d, arguments %d, %d, %d", __FUNCTION__, msg_type,
452160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            ext1, ext2, ext3);
453160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    if (listener != NULL) {
454160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        switch (msg_type) {
455160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            case CAMERA2_MSG_ERROR:
456160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                listener->notifyError(ext1, ext2, ext3);
457160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                break;
458160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            case CAMERA2_MSG_SHUTTER: {
459160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                nsecs_t timestamp = (nsecs_t)ext2 | ((nsecs_t)(ext3) << 32 );
460160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                listener->notifyShutter(ext1, timestamp);
461160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                break;
462160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            }
463160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            case CAMERA2_MSG_AUTOFOCUS:
464160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                listener->notifyAutoFocus(ext1, ext2);
465160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                break;
466160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            case CAMERA2_MSG_AUTOEXPOSURE:
467160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                listener->notifyAutoExposure(ext1, ext2);
468160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                break;
469160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            case CAMERA2_MSG_AUTOWB:
470160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                listener->notifyAutoWhitebalance(ext1, ext2);
471160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                break;
472160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            default:
473160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                ALOGE("%s: Unknown notification %d (arguments %d, %d, %d)!",
474160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala                        __FUNCTION__, msg_type, ext1, ext2, ext3);
475160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        }
476160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    }
477160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
478160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
479c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvalastatus_t Camera2Device::waitForNextFrame(nsecs_t timeout) {
480c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    return mFrameQueue.waitForBuffer(timeout);
4818ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
4828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
483cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t Camera2Device::getNextFrame(CameraMetadata *frame) {
4844bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
485cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t res;
486cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_t *rawFrame;
487cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mFrameQueue.dequeue(&rawFrame);
488cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (rawFrame  == NULL) {
489cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return NOT_ENOUGH_DATA;
490cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    } else if (res == OK) {
491cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        frame->acquire(rawFrame);
492cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
493cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    return res;
4948ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
4958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
496174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerAutofocus(uint32_t id) {
4974bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
498174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t res;
499174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id);
500174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    res = mDevice->ops->trigger_action(mDevice,
501174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            CAMERA2_TRIGGER_AUTOFOCUS, id, 0);
502174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (res != OK) {
503174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        ALOGE("%s: Error triggering autofocus (id %d)",
504174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                __FUNCTION__, id);
505174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
506174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    return res;
507174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala}
508174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
509174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerCancelAutofocus(uint32_t id) {
5104bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
511174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t res;
512174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    ALOGV("%s: Canceling autofocus, id %d", __FUNCTION__, id);
513174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    res = mDevice->ops->trigger_action(mDevice,
514174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            CAMERA2_TRIGGER_CANCEL_AUTOFOCUS, id, 0);
515174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (res != OK) {
516174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        ALOGE("%s: Error canceling autofocus (id %d)",
517174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                __FUNCTION__, id);
518174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
519174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    return res;
520174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala}
521174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
522174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerPrecaptureMetering(uint32_t id) {
5234bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
524174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t res;
525174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id);
526174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    res = mDevice->ops->trigger_action(mDevice,
527174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            CAMERA2_TRIGGER_PRECAPTURE_METERING, id, 0);
528174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (res != OK) {
529174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        ALOGE("%s: Error triggering precapture metering (id %d)",
530174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                __FUNCTION__, id);
531174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
532174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    return res;
533174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala}
534174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
535da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Camera2Device::pushReprocessBuffer(int reprocessStreamId,
536da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        buffer_handle_t *buffer, wp<BufferReleasedListener> listener) {
5374bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
538da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
539da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    bool found = false;
540da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res = OK;
541da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    for (ReprocessStreamList::iterator streamI = mReprocessStreams.begin();
542da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala         streamI != mReprocessStreams.end(); streamI++) {
543da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if ((*streamI)->getId() == reprocessStreamId) {
544da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            res = (*streamI)->pushIntoStream(buffer, listener);
545da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            if (res != OK) {
546da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                ALOGE("%s: Unable to push buffer to reprocess stream %d: %s (%d)",
547da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                        __FUNCTION__, reprocessStreamId, strerror(-res), res);
548da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                return res;
549da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            }
550da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            found = true;
551da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
552da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
553da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
554da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (!found) {
555da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to find reprocess stream %d",
556da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                __FUNCTION__, mId, reprocessStreamId);
557da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = BAD_VALUE;
558da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
559da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return res;
560da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
561da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
562160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala/**
563160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala * Camera2Device::NotificationListener
564160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala */
565160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
566160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville TalvalaCamera2Device::NotificationListener::~NotificationListener() {
567160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
568160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
569f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala/**
570f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala * Camera2Device::MetadataQueue
571f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala */
572f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
573f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue::MetadataQueue():
574f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mDevice(NULL),
575f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mFrameCount(0),
5764865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            mLatestRequestId(0),
577f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mCount(0),
578f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mStreamSlotCount(0),
579c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala            mSignalConsumer(true)
580f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
5814bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
582f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_request_queue_src_ops::dequeue_request = consumer_dequeue;
583f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_request_queue_src_ops::request_count = consumer_buffer_count;
584f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_request_queue_src_ops::free_request = consumer_free;
585f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
586f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_frame_queue_dst_ops::dequeue_frame = producer_dequeue;
587f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_frame_queue_dst_ops::cancel_frame = producer_cancel;
588f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera2_frame_queue_dst_ops::enqueue_frame = producer_enqueue;
589f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
590f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
591f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue::~MetadataQueue() {
5924bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
593f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
594f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    freeBuffers(mEntries.begin(), mEntries.end());
595f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    freeBuffers(mStreamSlot.begin(), mStreamSlot.end());
596f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
597f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
5986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala// Connect to camera2 HAL as consumer (input requests/reprocessing)
5996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setConsumerDevice(camera2_device_t *d) {
6004bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
6016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
6026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = d->ops->set_request_queue_src_ops(d,
6036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            this);
6046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) return res;
605f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = d;
6066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
607f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
608f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
6096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setProducerDevice(camera2_device_t *d) {
6104bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
6116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
6126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = d->ops->set_frame_queue_dst_ops(d,
6136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            this);
6146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return res;
615f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
616f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
617f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala// Real interfaces
618f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::enqueue(camera_metadata_t *buf) {
6194bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
6202c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala    ALOGVV("%s: E", __FUNCTION__);
621f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
622f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
623f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mCount++;
624f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mEntries.push_back(buf);
625f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
6266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return signalConsumerLocked();
627f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
628f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
629f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::getBufferCount() {
6304bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
631f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
632f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mStreamSlotCount > 0) {
633f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS;
634f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
635f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return mCount;
636f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
637f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
638f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::dequeue(camera_metadata_t **buf,
639f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool incrementCount)
640f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
6414bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
6422c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala    ALOGVV("%s: E", __FUNCTION__);
6436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
644f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
645f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
646f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mCount == 0) {
647f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (mStreamSlotCount == 0) {
6482c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala            ALOGVV("%s: Empty", __FUNCTION__);
649f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            *buf = NULL;
650f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mSignalConsumer = true;
651f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            return OK;
652f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
6532c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala        ALOGVV("%s: Streaming %d frames to queue", __FUNCTION__,
654f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mStreamSlotCount);
655f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
656f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (List<camera_metadata_t*>::iterator slotEntry = mStreamSlot.begin();
657f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                slotEntry != mStreamSlot.end();
658f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                slotEntry++ ) {
659f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            size_t entries = get_camera_metadata_entry_count(*slotEntry);
660f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            size_t dataBytes = get_camera_metadata_data_count(*slotEntry);
661f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
662f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            camera_metadata_t *copy =
663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    allocate_camera_metadata(entries, dataBytes);
664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            append_camera_metadata(copy, *slotEntry);
665f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            mEntries.push_back(copy);
666f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
667f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mCount = mStreamSlotCount;
668f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
6692c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala    ALOGVV("MetadataQueue: deque (%d buffers)", mCount);
670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_t *b = *(mEntries.begin());
671f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mEntries.erase(mEntries.begin());
672f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
673f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (incrementCount) {
6744bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala        ATRACE_INT("cam2_request", mFrameCount);
6756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        camera_metadata_entry_t frameCount;
6766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = find_camera_metadata_entry(b,
677f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ANDROID_REQUEST_FRAME_COUNT,
6786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &frameCount);
6796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
6806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Unable to add frame count: %s (%d)",
6816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
6826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        } else {
6836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            *frameCount.data.i32 = mFrameCount;
6846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
685f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mFrameCount++;
686f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
687f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
6884865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    // Check for request ID, and if present, signal waiters.
6894865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    camera_metadata_entry_t requestId;
6904865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    res = find_camera_metadata_entry(b,
6914865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            ANDROID_REQUEST_ID,
6924865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            &requestId);
6934865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (res == OK) {
6944865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        mLatestRequestId = requestId.data.i32[0];
6954865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        mNewRequestId.signal();
6964865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    }
6974865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
698f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    *buf = b;
699f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mCount--;
700f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
70161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return OK;
70261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
70361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
704f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::waitForBuffer(nsecs_t timeout)
705f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
706f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
707f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
708f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    while (mCount == 0) {
709f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        res = notEmpty.waitRelative(mMutex,timeout);
710f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (res != OK) return res;
711f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
712f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
713f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
714f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
7154865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::waitForDequeue(int32_t id,
7164865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        nsecs_t timeout) {
7174865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    Mutex::Autolock l(mMutex);
7184865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    status_t res;
7194865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    while (mLatestRequestId != id) {
7204865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        nsecs_t startTime = systemTime();
7214865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
7224865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        res = mNewRequestId.waitRelative(mMutex, timeout);
7234865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        if (res != OK) return res;
7244865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
7254865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        timeout -= (systemTime() - startTime);
7264865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    }
7274865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
7284865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return OK;
7294865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala}
7304865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
731f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setStreamSlot(camera_metadata_t *buf)
732f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
7334bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
7346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
735f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
736f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (buf == NULL) {
737f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        freeBuffers(mStreamSlot.begin(), mStreamSlot.end());
738f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mStreamSlotCount = 0;
739f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return OK;
740f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
7416ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    camera_metadata_t *buf2 = clone_camera_metadata(buf);
7426ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    if (!buf2) {
7436ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        ALOGE("%s: Unable to clone metadata buffer!", __FUNCTION__);
7446ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        return NO_MEMORY;
7456ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    }
7466ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala
747f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mStreamSlotCount > 1) {
748f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*>::iterator deleter = ++mStreamSlot.begin();
749f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        freeBuffers(++mStreamSlot.begin(), mStreamSlot.end());
750f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mStreamSlotCount = 1;
751f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
752f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mStreamSlotCount == 1) {
753f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        free_camera_metadata( *(mStreamSlot.begin()) );
7546ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        *(mStreamSlot.begin()) = buf2;
755f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
7566ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        mStreamSlot.push_front(buf2);
757f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        mStreamSlotCount = 1;
758f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
7596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return signalConsumerLocked();
760f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
761f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
762f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setStreamSlot(
763f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const List<camera_metadata_t*> &bufs)
764f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
7654bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
7666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
767f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Mutex::Autolock l(mMutex);
7686ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    status_t res;
7696ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala
770f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mStreamSlotCount > 0) {
771f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        freeBuffers(mStreamSlot.begin(), mStreamSlot.end());
772f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
7736ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    mStreamSlotCount = 0;
7746ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    for (List<camera_metadata_t*>::const_iterator r = bufs.begin();
7756ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala         r != bufs.end(); r++) {
7766ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        camera_metadata_t *r2 = clone_camera_metadata(*r);
7776ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        if (!r2) {
7786ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala            ALOGE("%s: Unable to clone metadata buffer!", __FUNCTION__);
7796ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala            return NO_MEMORY;
7806ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        }
7816ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        mStreamSlot.push_back(r2);
7826ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        mStreamSlotCount++;
7836ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala    }
7846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return signalConsumerLocked();
7856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
786f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
7873297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::dump(int fd,
7883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        const Vector<String16>& args) {
7894bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
7903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    String8 result;
7913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t notLocked;
7923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    notLocked = mMutex.tryLock();
7933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (notLocked) {
7943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    (Unable to lock queue mutex)\n");
7953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
7963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("      Current frame number: %d\n", mFrameCount);
7973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mStreamSlotCount == 0) {
7983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("      Stream slot: Empty\n");
7993297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
8003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
8013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.appendFormat("      Stream slot: %d entries\n",
8023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                mStreamSlot.size());
8033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        int i = 0;
8043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        for (List<camera_metadata_t*>::iterator r = mStreamSlot.begin();
8053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala             r != mStreamSlot.end(); r++) {
8063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            result = String8::format("       Stream slot buffer %d:\n", i);
8073297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            write(fd, result.string(), result.size());
808428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala            dump_indented_camera_metadata(*r, fd, 2, 10);
8093297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            i++;
8103297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        }
8113297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
8123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mEntries.size() == 0) {
8133297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "      Main queue is empty\n";
8143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
8153297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
8163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = String8::format("      Main queue has %d entries:\n",
8173297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                mEntries.size());
8183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        int i = 0;
8193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        for (List<camera_metadata_t*>::iterator r = mEntries.begin();
8203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala             r != mEntries.end(); r++) {
8213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            result = String8::format("       Queue entry %d:\n", i);
8223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            write(fd, result.string(), result.size());
823428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala            dump_indented_camera_metadata(*r, fd, 2, 10);
8243297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            i++;
8253297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        }
8263297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
8273297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
8283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (notLocked == 0) {
8293297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mMutex.unlock();
8303297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
8313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
8323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    return OK;
8333297daae9681004775012faba9181d65e097e00cEino-Ville Talvala}
8343297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
8356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::signalConsumerLocked() {
8364bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
8376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res = OK;
8386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    notEmpty.signal();
8396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mSignalConsumer && mDevice != NULL) {
8406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mSignalConsumer = false;
8416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mMutex.unlock();
8436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGV("%s: Signaling consumer", __FUNCTION__);
8446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->ops->notify_request_queue_not_empty(mDevice);
8456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mMutex.lock();
8466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
8476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return res;
848f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
849f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
850f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::freeBuffers(
851f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*>::iterator start,
852f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*>::iterator end)
853f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
8544bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
855f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    while (start != end) {
856f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        free_camera_metadata(*start);
857f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        start = mStreamSlot.erase(start);
858f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
859f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
860f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
861f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
862f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance(
863f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t *q)
864f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
865f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q);
866f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return const_cast<MetadataQueue*>(cmq);
867f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
868f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
869f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance(
870f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t *q)
871f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
872f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q);
873f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return const_cast<MetadataQueue*>(cmq);
874f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
875f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
876f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_buffer_count(
877f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t *q)
878f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
879f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue *queue = getInstance(q);
880f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return queue->getBufferCount();
881f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
882f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
883f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_dequeue(
884f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t *q,
885f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t **buffer)
886f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
887f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue *queue = getInstance(q);
888f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return queue->dequeue(buffer, true);
889f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
890f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
891f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_free(
892f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t *q,
893f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t *old_buffer)
894f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
8954bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
896f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue *queue = getInstance(q);
897f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    free_camera_metadata(old_buffer);
898f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
899f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
900f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
901f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_dequeue(
902f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t *q,
903f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        size_t entries, size_t bytes,
904f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t **buffer)
905f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
9064bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
907f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    camera_metadata_t *new_buffer =
908f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            allocate_camera_metadata(entries, bytes);
909f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (new_buffer == NULL) return NO_MEMORY;
910f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    *buffer = new_buffer;
911f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return OK;
912f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
913f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
914f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_cancel(
915f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t *q,
916f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t *old_buffer)
917f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
9184bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
919f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    free_camera_metadata(old_buffer);
920f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
921f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
922f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
923f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_enqueue(
924f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t *q,
925f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera_metadata_t *filled_buffer)
926f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
927f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue *queue = getInstance(q);
928f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return queue->enqueue(filled_buffer);
929f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
930f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
9316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala/**
9326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala * Camera2Device::StreamAdapter
9336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala */
9346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#ifndef container_of
9366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#define container_of(ptr, type, member) \
9376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    (type *)((char*)(ptr) - offsetof(type, member))
9386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#endif
9396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaCamera2Device::StreamAdapter::StreamAdapter(camera2_device_t *d):
9419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mState(RELEASED),
9426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice(d),
9436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mId(-1),
9443297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mWidth(0), mHeight(0), mFormat(0), mSize(0), mUsage(0),
9453297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mMaxProducerBuffers(0), mMaxConsumerBuffers(0),
9463297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mTotalBuffers(0),
9473297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mFormatRequested(0),
9483297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mActiveBuffers(0),
9493297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mFrameCount(0),
9503297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        mLastTimestamp(0)
9516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala{
9526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera2_stream_ops::dequeue_buffer = dequeue_buffer;
9536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera2_stream_ops::enqueue_buffer = enqueue_buffer;
9546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera2_stream_ops::cancel_buffer = cancel_buffer;
9556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera2_stream_ops::set_crop = set_crop;
9566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
9576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaCamera2Device::StreamAdapter::~StreamAdapter() {
9594bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
9609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mState != RELEASED) {
9619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        release();
9629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
9636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
9646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
965d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::StreamAdapter::connectToDevice(
966d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        sp<ANativeWindow> consumer,
967d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t width, uint32_t height, int format, size_t size) {
9684bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
9696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
9709e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
9716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mState != RELEASED) return INVALID_OPERATION;
9736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (consumer == NULL) {
9746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Null consumer passed to stream adapter", __FUNCTION__);
9756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return BAD_VALUE;
9766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
9776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: New stream parameters %d x %d, format 0x%x, size %d",
9799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, width, height, format, size);
9809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
9816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mConsumerInterface = consumer;
9826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mWidth = width;
9836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mHeight = height;
984d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    mSize = (format == HAL_PIXEL_FORMAT_BLOB) ? size : 0;
9856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mFormatRequested = format;
9866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    // Allocate device-side stream interface
9886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
9896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint32_t id;
9906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint32_t formatActual;
9916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint32_t usage;
9926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint32_t maxBuffers = 2;
9936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->ops->allocate_stream(mDevice,
9946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            mWidth, mHeight, mFormatRequested, getStreamOps(),
9956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            &id, &formatActual, &usage, &maxBuffers);
9966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
9976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Device stream allocation failed: %s (%d)",
9986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, strerror(-res), res);
9996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
10006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Allocated stream id %d, actual format 0x%x, "
10039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            "usage 0x%x, producer wants %d buffers", __FUNCTION__,
10049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            id, formatActual, usage, maxBuffers);
10059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
10066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mId = id;
10076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mFormat = formatActual;
10086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mUsage = usage;
10096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mMaxProducerBuffers = maxBuffers;
10106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = ALLOCATED;
10126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    // Configure consumer-side ANativeWindow interface
10146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = native_window_api_connect(mConsumerInterface.get(),
10156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            NATIVE_WINDOW_API_CAMERA);
10166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
10176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to connect to native window for stream %d",
10186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId);
10196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
10216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = CONNECTED;
10246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = native_window_set_usage(mConsumerInterface.get(), mUsage);
10266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
10276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to configure usage %08x for stream %d",
10286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mUsage, mId);
10296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
10306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1032bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    res = native_window_set_scaling_mode(mConsumerInterface.get(),
1033bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala            NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
1034bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    if (res != OK) {
1035bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        ALOGE("%s: Unable to configure stream scaling: %s (%d)",
1036bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala                __FUNCTION__, strerror(-res), res);
1037bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        return res;
1038bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    }
1039bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala
1040c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = setTransform(0);
1041bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    if (res != OK) {
1042bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        return res;
1043bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    }
1044bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala
1045d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mFormat == HAL_PIXEL_FORMAT_BLOB) {
1046d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = native_window_set_buffers_geometry(mConsumerInterface.get(),
1047d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mSize, 1, mFormat);
1048d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
1049d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Unable to configure compressed stream buffer geometry"
1050d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %d x %d, size %d for stream %d",
1051d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mWidth, mHeight, mSize, mId);
1052d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
1053d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1054d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    } else {
1055d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = native_window_set_buffers_geometry(mConsumerInterface.get(),
1056d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mWidth, mHeight, mFormat);
1057d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
1058d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Unable to configure stream buffer geometry"
1059d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %d x %d, format 0x%x for stream %d",
1060d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mWidth, mHeight, mFormat, mId);
1061d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
1062d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
10636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    int maxConsumerBuffers;
10666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mConsumerInterface->query(mConsumerInterface.get(),
10676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &maxConsumerBuffers);
10686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
10696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to query consumer undequeued"
10706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                " buffer count for stream %d", __FUNCTION__, mId);
10716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
10726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mMaxConsumerBuffers = maxConsumerBuffers;
10746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Consumer wants %d buffers", __FUNCTION__,
10769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mMaxConsumerBuffers);
10776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10783297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mTotalBuffers = mMaxConsumerBuffers + mMaxProducerBuffers;
10793297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mActiveBuffers = 0;
10803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mFrameCount = 0;
10813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    mLastTimestamp = 0;
10826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = native_window_set_buffer_count(mConsumerInterface.get(),
10843297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mTotalBuffers);
10856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
10866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to set buffer count for stream %d",
10876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId);
10886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
10896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
10906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
10916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    // Register allocated buffers with HAL device
10923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    buffer_handle_t *buffers = new buffer_handle_t[mTotalBuffers];
10933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    ANativeWindowBuffer **anwBuffers = new ANativeWindowBuffer*[mTotalBuffers];
10943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    uint32_t bufferIdx = 0;
10953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    for (; bufferIdx < mTotalBuffers; bufferIdx++) {
10961e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis        res = native_window_dequeue_buffer_and_wait(mConsumerInterface.get(),
10976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &anwBuffers[bufferIdx]);
10986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
10999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Unable to dequeue buffer %d for initial registration for "
11006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "stream %d", __FUNCTION__, bufferIdx, mId);
11016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            goto cleanUpBuffers;
11026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
11036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
11046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        buffers[bufferIdx] = anwBuffers[bufferIdx]->handle;
1105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGV("%s: Buffer %p allocated", __FUNCTION__, (void*)buffers[bufferIdx]);
11066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
11076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1108750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    ALOGV("%s: Registering %d buffers with camera HAL", __FUNCTION__, mTotalBuffers);
11096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->ops->register_stream_buffers(mDevice,
11106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            mId,
11113297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mTotalBuffers,
11126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            buffers);
11136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
11146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Unable to register buffers with HAL device for stream %d",
11156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mId);
11166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    } else {
11176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = ACTIVE;
11186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
11196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
11206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalacleanUpBuffers:
1121750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    ALOGV("%s: Cleaning up %d buffers", __FUNCTION__, bufferIdx);
11223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    for (uint32_t i = 0; i < bufferIdx; i++) {
11236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mConsumerInterface->cancelBuffer(mConsumerInterface.get(),
11241e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis                anwBuffers[i], -1);
11256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
11266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Unable to cancel buffer %d after registration",
11276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    __FUNCTION__, i);
11286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
11296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
11303297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    delete[] anwBuffers;
11313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    delete[] buffers;
11326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
11336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return res;
11346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
11356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
11369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalastatus_t Camera2Device::StreamAdapter::release() {
11374bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
11386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
11399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Releasing stream %d", __FUNCTION__, mId);
11406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState >= ALLOCATED) {
11416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->ops->release_stream(mDevice, mId);
11426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
11436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Unable to release stream %d",
11446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    __FUNCTION__, mId);
11456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
11466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
11476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
11486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState >= CONNECTED) {
11496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = native_window_api_disconnect(mConsumerInterface.get(),
11506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                NATIVE_WINDOW_API_CAMERA);
1151b3e97b347dceb882983427ac872b772e25f3f166Igor Murashkin
1152b3e97b347dceb882983427ac872b772e25f3f166Igor Murashkin        /* this is not an error. if client calling process dies,
1153b3e97b347dceb882983427ac872b772e25f3f166Igor Murashkin           the window will also die and all calls to it will return
1154b3e97b347dceb882983427ac872b772e25f3f166Igor Murashkin           DEAD_OBJECT, thus it's already "disconnected" */
1155b3e97b347dceb882983427ac872b772e25f3f166Igor Murashkin        if (res == DEAD_OBJECT) {
1156b3e97b347dceb882983427ac872b772e25f3f166Igor Murashkin            ALOGW("%s: While disconnecting stream %d from native window, the"
1157b3e97b347dceb882983427ac872b772e25f3f166Igor Murashkin                  " native window died from under us", __FUNCTION__, mId);
1158b3e97b347dceb882983427ac872b772e25f3f166Igor Murashkin        }
1159b3e97b347dceb882983427ac872b772e25f3f166Igor Murashkin        else if (res != OK) {
1160b3e97b347dceb882983427ac872b772e25f3f166Igor Murashkin            ALOGE("%s: Unable to disconnect stream %d from native window (error %d %s)",
1161b3e97b347dceb882983427ac872b772e25f3f166Igor Murashkin                    __FUNCTION__, mId, res, strerror(-res));
11626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
11636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
11646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
11656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mId = -1;
11669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mState = RELEASED;
11676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
11686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
11696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1170c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalastatus_t Camera2Device::StreamAdapter::setTransform(int transform) {
11714bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
1172c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    status_t res;
1173c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (mState < CONNECTED) {
1174c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Cannot set transform on unconnected stream", __FUNCTION__);
1175c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return INVALID_OPERATION;
1176c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1177c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = native_window_set_buffers_transform(mConsumerInterface.get(),
1178c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                                              transform);
1179c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (res != OK) {
1180c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Unable to configure stream transform to %x: %s (%d)",
1181c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                __FUNCTION__, transform, strerror(-res), res);
1182c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1183c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    return res;
1184c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala}
1185c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
11863297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::StreamAdapter::dump(int fd,
11873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        const Vector<String16>& args) {
11884bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
11893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    String8 result = String8::format("      Stream %d: %d x %d, format 0x%x\n",
11903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mId, mWidth, mHeight, mFormat);
11913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("        size %d, usage 0x%x, requested format 0x%x\n",
11923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mSize, mUsage, mFormatRequested);
11933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("        total buffers: %d, dequeued buffers: %d\n",
11943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mTotalBuffers, mActiveBuffers);
11953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("        frame count: %d, last timestamp %lld\n",
11963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            mFrameCount, mLastTimestamp);
11973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    write(fd, result.string(), result.size());
11983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    return OK;
11993297daae9681004775012faba9181d65e097e00cEino-Ville Talvala}
12003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
12016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaconst camera2_stream_ops *Camera2Device::StreamAdapter::getStreamOps() {
12026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return static_cast<camera2_stream_ops *>(this);
12036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
12046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
12056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaANativeWindow* Camera2Device::StreamAdapter::toANW(
12066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const camera2_stream_ops_t *w) {
12076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return static_cast<const StreamAdapter*>(w)->mConsumerInterface.get();
12086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
12096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
12106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::dequeue_buffer(const camera2_stream_ops_t *w,
12116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        buffer_handle_t** buffer) {
12124bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
12136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    int res;
12143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    StreamAdapter* stream =
12153297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w));
12163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (stream->mState != ACTIVE) {
12173297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState);
12186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return INVALID_OPERATION;
12196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
12206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
12216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindow *a = toANW(w);
12226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindowBuffer* anb;
12231e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis    res = native_window_dequeue_buffer_and_wait(a, &anb);
1224750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    if (res != OK) {
1225750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala        ALOGE("Stream %d dequeue: Error from native_window: %s (%d)", stream->mId,
1226750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala                strerror(-res), res);
1227750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala        return res;
1228750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    }
12296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
12306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    *buffer = &(anb->handle);
12313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    stream->mActiveBuffers++;
12323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
1233750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    ALOGVV("Stream %d dequeue: Buffer %p dequeued", stream->mId, (void*)(**buffer));
12346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return res;
12356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
12366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
12376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::enqueue_buffer(const camera2_stream_ops_t* w,
12386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        int64_t timestamp,
12396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        buffer_handle_t* buffer) {
12404bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
12413297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    StreamAdapter *stream =
12423297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w));
1243228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    stream->mFrameCount++;
1244228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGVV("Stream %d enqueue: Frame %d (%p) captured at %lld ns",
12456638f3bd61df1e5d012bc600b7af4c1b4dd4a06bJames Dong            stream->mId, stream->mFrameCount, (void*)(*buffer), timestamp);
1246bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    int state = stream->mState;
12476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (state != ACTIVE) {
12486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state);
12496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return INVALID_OPERATION;
12506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
12516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindow *a = toANW(w);
12526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t err;
1253228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
12546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    err = native_window_set_buffers_timestamp(a, timestamp);
1255bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    if (err != OK) {
1256bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        ALOGE("%s: Error setting timestamp on native window: %s (%d)",
1257bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala                __FUNCTION__, strerror(-err), err);
1258bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        return err;
1259bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    }
1260bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    err = a->queueBuffer(a,
12611e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis            container_of(buffer, ANativeWindowBuffer, handle), -1);
1262bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    if (err != OK) {
1263bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala        ALOGE("%s: Error queueing buffer to native window: %s (%d)",
1264bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala                __FUNCTION__, strerror(-err), err);
126531d377b7622279034326fbd8b9803a738a39fb30James Dong        return err;
1266bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala    }
126731d377b7622279034326fbd8b9803a738a39fb30James Dong
12683297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    stream->mActiveBuffers--;
12693297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    stream->mLastTimestamp = timestamp;
127031d377b7622279034326fbd8b9803a738a39fb30James Dong    return OK;
12716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
12726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
12736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::cancel_buffer(const camera2_stream_ops_t* w,
12746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        buffer_handle_t* buffer) {
12754bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
12763297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    StreamAdapter *stream =
12773297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w));
1278750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala    ALOGVV("Stream %d cancel: Buffer %p",
1279750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala            stream->mId, (void*)(*buffer));
12803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (stream->mState != ACTIVE) {
12813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState);
12826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return INVALID_OPERATION;
12836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
128431d377b7622279034326fbd8b9803a738a39fb30James Dong
12856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindow *a = toANW(w);
128631d377b7622279034326fbd8b9803a738a39fb30James Dong    int err = a->cancelBuffer(a,
12871e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis            container_of(buffer, ANativeWindowBuffer, handle), -1);
128831d377b7622279034326fbd8b9803a738a39fb30James Dong    if (err != OK) {
128931d377b7622279034326fbd8b9803a738a39fb30James Dong        ALOGE("%s: Error canceling buffer to native window: %s (%d)",
129031d377b7622279034326fbd8b9803a738a39fb30James Dong                __FUNCTION__, strerror(-err), err);
129131d377b7622279034326fbd8b9803a738a39fb30James Dong        return err;
129231d377b7622279034326fbd8b9803a738a39fb30James Dong    }
129331d377b7622279034326fbd8b9803a738a39fb30James Dong
129431d377b7622279034326fbd8b9803a738a39fb30James Dong    stream->mActiveBuffers--;
129531d377b7622279034326fbd8b9803a738a39fb30James Dong    return OK;
12966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
12976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
12986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::set_crop(const camera2_stream_ops_t* w,
12996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        int left, int top, int right, int bottom) {
13004bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
13016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    int state = static_cast<const StreamAdapter*>(w)->mState;
13026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (state != ACTIVE) {
13036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state);
13046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return INVALID_OPERATION;
13056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
13066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    ANativeWindow *a = toANW(w);
13076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    android_native_rect_t crop = { left, top, right, bottom };
13086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return native_window_set_crop(a, &crop);
13096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
13106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1311da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/**
1312da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Camera2Device::ReprocessStreamAdapter
1313da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */
1314da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1315da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#ifndef container_of
1316da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#define container_of(ptr, type, member) \
1317da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    (type *)((char*)(ptr) - offsetof(type, member))
1318da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#endif
1319da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1320da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCamera2Device::ReprocessStreamAdapter::ReprocessStreamAdapter(camera2_device_t *d):
1321da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mState(RELEASED),
1322da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mDevice(d),
1323da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mId(-1),
1324da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mWidth(0), mHeight(0), mFormat(0),
1325da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mActiveBuffers(0),
1326da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mFrameCount(0)
1327da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala{
13284bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
1329da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    camera2_stream_in_ops::acquire_buffer = acquire_buffer;
1330da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    camera2_stream_in_ops::release_buffer = release_buffer;
1331da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1332da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1333da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCamera2Device::ReprocessStreamAdapter::~ReprocessStreamAdapter() {
13344bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
1335da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mState != RELEASED) {
1336da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        release();
1337da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
1338da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1339da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1340da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Camera2Device::ReprocessStreamAdapter::connectToDevice(
1341da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        const sp<StreamAdapter> &outputStream) {
13424bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
1343da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
1344da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
1345da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1346da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mState != RELEASED) return INVALID_OPERATION;
1347da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (outputStream == NULL) {
1348da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Null base stream passed to reprocess stream adapter",
1349da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                __FUNCTION__);
1350da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return BAD_VALUE;
1351da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
1352da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1353da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mBaseStream = outputStream;
1354da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mWidth = outputStream->getWidth();
1355da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mHeight = outputStream->getHeight();
1356da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mFormat = outputStream->getFormat();
1357da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1358da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGV("%s: New reprocess stream parameters %d x %d, format 0x%x",
1359da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            __FUNCTION__, mWidth, mHeight, mFormat);
1360da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1361da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // Allocate device-side stream interface
1362da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1363da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    uint32_t id;
1364da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mDevice->ops->allocate_reprocess_stream_from_stream(mDevice,
1365da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            outputStream->getId(), getStreamOps(),
1366da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &id);
1367da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) {
1368da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Device reprocess stream allocation failed: %s (%d)",
1369da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                __FUNCTION__, strerror(-res), res);
1370da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return res;
1371da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
1372da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1373da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGV("%s: Allocated reprocess stream id %d based on stream %d",
1374da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            __FUNCTION__, id, outputStream->getId());
1375da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1376da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mId = id;
1377da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1378da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mState = ACTIVE;
1379da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1380da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return OK;
1381da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1382da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1383da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Camera2Device::ReprocessStreamAdapter::release() {
13844bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
1385da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
1386da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGV("%s: Releasing stream %d", __FUNCTION__, mId);
1387da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mState >= ACTIVE) {
1388da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mDevice->ops->release_reprocess_stream(mDevice, mId);
1389da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) {
1390da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("%s: Unable to release stream %d",
1391da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    __FUNCTION__, mId);
1392da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            return res;
1393da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
1394da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
1395da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1396da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    List<QueueEntry>::iterator s;
1397da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    for (s = mQueue.begin(); s != mQueue.end(); s++) {
1398da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<BufferReleasedListener> listener = s->releaseListener.promote();
1399da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (listener != 0) listener->onBufferReleased(s->handle);
1400da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
1401da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    for (s = mInFlightQueue.begin(); s != mInFlightQueue.end(); s++) {
1402da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<BufferReleasedListener> listener = s->releaseListener.promote();
1403da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (listener != 0) listener->onBufferReleased(s->handle);
1404da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
1405da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mQueue.clear();
1406da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mInFlightQueue.clear();
1407da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1408da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mState = RELEASED;
1409da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return OK;
1410da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1411da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1412da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Camera2Device::ReprocessStreamAdapter::pushIntoStream(
1413da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    buffer_handle_t *handle, const wp<BufferReleasedListener> &releaseListener) {
14144bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
1415da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // TODO: Some error checking here would be nice
1416da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGV("%s: Pushing buffer %p to stream", __FUNCTION__, (void*)(*handle));
1417da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1418da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    QueueEntry entry;
1419da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    entry.handle = handle;
1420da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    entry.releaseListener = releaseListener;
1421da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mQueue.push_back(entry);
1422da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return OK;
1423da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1424da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1425da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Camera2Device::ReprocessStreamAdapter::dump(int fd,
1426da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        const Vector<String16>& args) {
14274bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
1428da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    String8 result =
1429da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            String8::format("      Reprocess stream %d: %d x %d, fmt 0x%x\n",
1430da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    mId, mWidth, mHeight, mFormat);
1431da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("        acquired buffers: %d\n",
1432da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mActiveBuffers);
1433da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("        frame count: %d\n",
1434da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mFrameCount);
1435da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    write(fd, result.string(), result.size());
1436da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return OK;
1437da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1438da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1439da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaconst camera2_stream_in_ops *Camera2Device::ReprocessStreamAdapter::getStreamOps() {
1440da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return static_cast<camera2_stream_in_ops *>(this);
1441da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1442da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1443da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Device::ReprocessStreamAdapter::acquire_buffer(
1444da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    const camera2_stream_in_ops_t *w,
1445da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        buffer_handle_t** buffer) {
14464bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
1447da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int res;
1448da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ReprocessStreamAdapter* stream =
1449da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            const_cast<ReprocessStreamAdapter*>(
1450da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                static_cast<const ReprocessStreamAdapter*>(w));
1451da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (stream->mState != ACTIVE) {
1452da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState);
1453da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return INVALID_OPERATION;
1454da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
1455da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1456da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (stream->mQueue.empty()) {
1457da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        *buffer = NULL;
1458da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return OK;
1459da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
1460da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1461da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    QueueEntry &entry = *(stream->mQueue.begin());
1462da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1463da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    *buffer = entry.handle;
1464da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1465da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    stream->mInFlightQueue.push_back(entry);
1466da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    stream->mQueue.erase(stream->mQueue.begin());
1467da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1468da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    stream->mActiveBuffers++;
1469da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1470da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGV("Stream %d acquire: Buffer %p acquired", stream->mId,
1471da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            (void*)(**buffer));
1472da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return OK;
1473da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1474da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1475da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Device::ReprocessStreamAdapter::release_buffer(
1476da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    const camera2_stream_in_ops_t* w,
1477da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    buffer_handle_t* buffer) {
14784bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    ATRACE_CALL();
1479da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ReprocessStreamAdapter *stream =
1480da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            const_cast<ReprocessStreamAdapter*>(
1481da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                static_cast<const ReprocessStreamAdapter*>(w) );
1482da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    stream->mFrameCount++;
1483da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGV("Reprocess stream %d release: Frame %d (%p)",
1484da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            stream->mId, stream->mFrameCount, (void*)*buffer);
1485da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int state = stream->mState;
1486da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (state != ACTIVE) {
1487da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state);
1488da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return INVALID_OPERATION;
1489da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
1490da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    stream->mActiveBuffers--;
1491da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1492da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    List<QueueEntry>::iterator s;
1493da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    for (s = stream->mInFlightQueue.begin(); s != stream->mInFlightQueue.end(); s++) {
1494da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if ( s->handle == buffer ) break;
1495da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
1496da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (s == stream->mInFlightQueue.end()) {
1497da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Can't find buffer %p in in-flight list!", __FUNCTION__,
1498da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                buffer);
1499da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return INVALID_OPERATION;
1500da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
1501da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1502da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    sp<BufferReleasedListener> listener = s->releaseListener.promote();
1503da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (listener != 0) {
1504da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        listener->onBufferReleased(s->handle);
1505da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    } else {
1506da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Can't free buffer - missing listener", __FUNCTION__);
1507da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
1508da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    stream->mInFlightQueue.erase(s);
1509da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1510da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return OK;
1511da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
151261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
151361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}; // namespace android
1514