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