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