Camera2Device.cpp revision f0eeb53e4763fe5063d3ce880f72d52f136fc3c5
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 448160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Device::notificationCallback(int32_t msg_type, 449160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala int32_t ext1, 450160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala int32_t ext2, 451160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala int32_t ext3, 452160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala void *user) { 453852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 454160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala NotificationListener *listener = reinterpret_cast<NotificationListener*>(user); 455160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGV("%s: Notification %d, arguments %d, %d, %d", __FUNCTION__, msg_type, 456160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ext1, ext2, ext3); 457160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala if (listener != NULL) { 458160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala switch (msg_type) { 459160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala case CAMERA2_MSG_ERROR: 460160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala listener->notifyError(ext1, ext2, ext3); 461160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala break; 462160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala case CAMERA2_MSG_SHUTTER: { 463160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala nsecs_t timestamp = (nsecs_t)ext2 | ((nsecs_t)(ext3) << 32 ); 464160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala listener->notifyShutter(ext1, timestamp); 465160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala break; 466160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala } 467160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala case CAMERA2_MSG_AUTOFOCUS: 468160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala listener->notifyAutoFocus(ext1, ext2); 469160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala break; 470160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala case CAMERA2_MSG_AUTOEXPOSURE: 471160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala listener->notifyAutoExposure(ext1, ext2); 472160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala break; 473160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala case CAMERA2_MSG_AUTOWB: 474160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala listener->notifyAutoWhitebalance(ext1, ext2); 475160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala break; 476160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala default: 477160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala ALOGE("%s: Unknown notification %d (arguments %d, %d, %d)!", 478160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala __FUNCTION__, msg_type, ext1, ext2, ext3); 479160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala } 480160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala } 481160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala} 482160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 483c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvalastatus_t Camera2Device::waitForNextFrame(nsecs_t timeout) { 484c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala return mFrameQueue.waitForBuffer(timeout); 4858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 4868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 487cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t Camera2Device::getNextFrame(CameraMetadata *frame) { 488852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 489cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala status_t res; 490cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala camera_metadata_t *rawFrame; 491cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala res = mFrameQueue.dequeue(&rawFrame); 492cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala if (rawFrame == NULL) { 493cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return NOT_ENOUGH_DATA; 494cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } else if (res == OK) { 495cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala frame->acquire(rawFrame); 496cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala } 497cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala return res; 4988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala} 4998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 500174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerAutofocus(uint32_t id) { 501852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 502174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala status_t res; 503174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id); 5047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->trigger_action(mHal2Device, 505174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala CAMERA2_TRIGGER_AUTOFOCUS, id, 0); 506174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (res != OK) { 507174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Error triggering autofocus (id %d)", 508174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, id); 509174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 510174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala return res; 511174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala} 512174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 513174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerCancelAutofocus(uint32_t id) { 514852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 515174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala status_t res; 516174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGV("%s: Canceling autofocus, id %d", __FUNCTION__, id); 5177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->trigger_action(mHal2Device, 518174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala CAMERA2_TRIGGER_CANCEL_AUTOFOCUS, id, 0); 519174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (res != OK) { 520174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Error canceling autofocus (id %d)", 521174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, id); 522174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 523174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala return res; 524174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala} 525174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 526174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvalastatus_t Camera2Device::triggerPrecaptureMetering(uint32_t id) { 527852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 528174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala status_t res; 529174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id); 5307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->trigger_action(mHal2Device, 531174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala CAMERA2_TRIGGER_PRECAPTURE_METERING, id, 0); 532174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala if (res != OK) { 533174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala ALOGE("%s: Error triggering precapture metering (id %d)", 534174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala __FUNCTION__, id); 535174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 536174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala return res; 537174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala} 538174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 53969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::pushReprocessBuffer(int reprocessStreamId, 54069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala buffer_handle_t *buffer, wp<BufferReleasedListener> listener) { 541852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 54269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 54369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala bool found = false; 54469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res = OK; 54569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala for (ReprocessStreamList::iterator streamI = mReprocessStreams.begin(); 54669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala streamI != mReprocessStreams.end(); streamI++) { 54769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if ((*streamI)->getId() == reprocessStreamId) { 54869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = (*streamI)->pushIntoStream(buffer, listener); 54969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 55069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Unable to push buffer to reprocess stream %d: %s (%d)", 55169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, reprocessStreamId, strerror(-res), res); 55269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 55369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 55469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala found = true; 55569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 55669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 55769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 55869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!found) { 55969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to find reprocess stream %d", 56069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, mId, reprocessStreamId); 56169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = BAD_VALUE; 56269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 56369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 56469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 56569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 566160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala/** 567f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala * Camera2Device::MetadataQueue 568f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala */ 569f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 570f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue::MetadataQueue(): 5717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal2Device(NULL), 572f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mFrameCount(0), 5734c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mLatestRequestId(0), 574f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCount(0), 575f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount(0), 576c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala mSignalConsumer(true) 577f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 578852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 579f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_request_queue_src_ops::dequeue_request = consumer_dequeue; 580f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_request_queue_src_ops::request_count = consumer_buffer_count; 581f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_request_queue_src_ops::free_request = consumer_free; 582f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 583f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_frame_queue_dst_ops::dequeue_frame = producer_dequeue; 584f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_frame_queue_dst_ops::cancel_frame = producer_cancel; 585f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera2_frame_queue_dst_ops::enqueue_frame = producer_enqueue; 586f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 587f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 588f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue::~MetadataQueue() { 589852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 590f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 591f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(mEntries.begin(), mEntries.end()); 592f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 593f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 594f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 5956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala// Connect to camera2 HAL as consumer (input requests/reprocessing) 5966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setConsumerDevice(camera2_device_t *d) { 597852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 5986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 5996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = d->ops->set_request_queue_src_ops(d, 6006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala this); 6016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) return res; 6027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal2Device = d; 6036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 604f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 605f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 6066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setProducerDevice(camera2_device_t *d) { 607852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 6086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 6096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = d->ops->set_frame_queue_dst_ops(d, 6106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala this); 6116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 612f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 613f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 614f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala// Real interfaces 615f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::enqueue(camera_metadata_t *buf) { 616852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 6172c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("%s: E", __FUNCTION__); 618f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 619f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 620f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCount++; 621f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mEntries.push_back(buf); 622f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 6236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return signalConsumerLocked(); 624f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 625f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 626f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::getBufferCount() { 627852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 628f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 629f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount > 0) { 630f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS; 631f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 632f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return mCount; 633f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 634f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 635f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::dequeue(camera_metadata_t **buf, 636f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala bool incrementCount) 637f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 638852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 6392c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("%s: E", __FUNCTION__); 6406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 641f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 642f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 643f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mCount == 0) { 644f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount == 0) { 6452c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("%s: Empty", __FUNCTION__); 646f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala *buf = NULL; 647f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mSignalConsumer = true; 648f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 649f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 6502c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("%s: Streaming %d frames to queue", __FUNCTION__, 651f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount); 652f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 653f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala for (List<camera_metadata_t*>::iterator slotEntry = mStreamSlot.begin(); 654f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala slotEntry != mStreamSlot.end(); 655f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala slotEntry++ ) { 656f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala size_t entries = get_camera_metadata_entry_count(*slotEntry); 657f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala size_t dataBytes = get_camera_metadata_data_count(*slotEntry); 658f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 659f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *copy = 660f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala allocate_camera_metadata(entries, dataBytes); 661f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala append_camera_metadata(copy, *slotEntry); 662f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mEntries.push_back(copy); 663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCount = mStreamSlotCount; 665f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 6662c08dc66c2980a50e90befe84f836b7ebf17fe94Eino-Ville Talvala ALOGVV("MetadataQueue: deque (%d buffers)", mCount); 667f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *b = *(mEntries.begin()); 668f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mEntries.erase(mEntries.begin()); 669f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (incrementCount) { 671852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_INT("cam2_request", mFrameCount); 6726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera_metadata_entry_t frameCount; 6736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = find_camera_metadata_entry(b, 674f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala ANDROID_REQUEST_FRAME_COUNT, 6756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &frameCount); 6766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 6776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to add frame count: %s (%d)", 6786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, strerror(-res), res); 6796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } else { 6806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala *frameCount.data.i32 = mFrameCount; 6816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 682f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mFrameCount++; 683f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 684f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 6854c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala // Check for request ID, and if present, signal waiters. 6864c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala camera_metadata_entry_t requestId; 6874c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala res = find_camera_metadata_entry(b, 6884c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ANDROID_REQUEST_ID, 6894c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala &requestId); 6904c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (res == OK) { 6914c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mLatestRequestId = requestId.data.i32[0]; 6924c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mNewRequestId.signal(); 6934c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 6944c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 695f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala *buf = b; 696f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mCount--; 697f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 69861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala return OK; 69961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} 70061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 701f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::waitForBuffer(nsecs_t timeout) 702f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 703f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 704f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala status_t res; 705f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala while (mCount == 0) { 706f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala res = notEmpty.waitRelative(mMutex,timeout); 707f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (res != OK) return res; 708f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 709f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 710f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 711f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 7124c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::waitForDequeue(int32_t id, 7134c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala nsecs_t timeout) { 7144c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala Mutex::Autolock l(mMutex); 7154c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala status_t res; 7164c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala while (mLatestRequestId != id) { 7174c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala nsecs_t startTime = systemTime(); 7184c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 7194c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala res = mNewRequestId.waitRelative(mMutex, timeout); 7204c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (res != OK) return res; 7214c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 7224c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala timeout -= (systemTime() - startTime); 7234c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 7244c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 7254c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return OK; 7264c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala} 7274c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 728f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setStreamSlot(camera_metadata_t *buf) 729f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 730852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 7316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 732f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 733f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (buf == NULL) { 734f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 735f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount = 0; 736f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 737f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 7386ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala camera_metadata_t *buf2 = clone_camera_metadata(buf); 7396ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala if (!buf2) { 7406ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala ALOGE("%s: Unable to clone metadata buffer!", __FUNCTION__); 7416ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala return NO_MEMORY; 7426ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala } 7436ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala 744f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount > 1) { 745f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala List<camera_metadata_t*>::iterator deleter = ++mStreamSlot.begin(); 746f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(++mStreamSlot.begin(), mStreamSlot.end()); 747f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount = 1; 748f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 749f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount == 1) { 750f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala free_camera_metadata( *(mStreamSlot.begin()) ); 7516ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala *(mStreamSlot.begin()) = buf2; 752f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } else { 7536ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala mStreamSlot.push_front(buf2); 754f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala mStreamSlotCount = 1; 755f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 7566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return signalConsumerLocked(); 757f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 758f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 759f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::setStreamSlot( 760f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const List<camera_metadata_t*> &bufs) 761f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 762852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 7636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 764f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala Mutex::Autolock l(mMutex); 7656ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala 766f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (mStreamSlotCount > 0) { 767f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala freeBuffers(mStreamSlot.begin(), mStreamSlot.end()); 768f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 7696ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala mStreamSlotCount = 0; 7706ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala for (List<camera_metadata_t*>::const_iterator r = bufs.begin(); 7716ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala r != bufs.end(); r++) { 7726ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala camera_metadata_t *r2 = clone_camera_metadata(*r); 7736ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala if (!r2) { 7746ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala ALOGE("%s: Unable to clone metadata buffer!", __FUNCTION__); 7756ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala return NO_MEMORY; 7766ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala } 7776ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala mStreamSlot.push_back(r2); 7786ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala mStreamSlotCount++; 7796ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala } 7806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return signalConsumerLocked(); 7816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 782f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 7833297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::dump(int fd, 784ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin const Vector<String16>& /*args*/) { 785852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 7863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala String8 result; 7873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala status_t notLocked; 7883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala notLocked = mMutex.tryLock(); 7893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (notLocked) { 7903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" (Unable to lock queue mutex)\n"); 7913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 7923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Current frame number: %d\n", mFrameCount); 7933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (mStreamSlotCount == 0) { 7943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.append(" Stream slot: Empty\n"); 7953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 7963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 7973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" Stream slot: %d entries\n", 7983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mStreamSlot.size()); 7993297daae9681004775012faba9181d65e097e00cEino-Ville Talvala int i = 0; 8003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (List<camera_metadata_t*>::iterator r = mStreamSlot.begin(); 8013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala r != mStreamSlot.end(); r++) { 8023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Stream slot buffer %d:\n", i); 8033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 804428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala dump_indented_camera_metadata(*r, fd, 2, 10); 8053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala i++; 8063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 8073297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 8083297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (mEntries.size() == 0) { 8093297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = " Main queue is empty\n"; 8103297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 8113297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } else { 8123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Main queue has %d entries:\n", 8133297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mEntries.size()); 8143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala int i = 0; 8153297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (List<camera_metadata_t*>::iterator r = mEntries.begin(); 8163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala r != mEntries.end(); r++) { 8173297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result = String8::format(" Queue entry %d:\n", i); 8183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 819428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala dump_indented_camera_metadata(*r, fd, 2, 10); 8203297daae9681004775012faba9181d65e097e00cEino-Ville Talvala i++; 8213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 8223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 8233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 8243297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (notLocked == 0) { 8253297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mMutex.unlock(); 8263297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 8273297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 8283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala return OK; 8293297daae9681004775012faba9181d65e097e00cEino-Ville Talvala} 8303297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 8316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Device::MetadataQueue::signalConsumerLocked() { 832852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 8336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res = OK; 8346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala notEmpty.signal(); 8357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala if (mSignalConsumer && mHal2Device != NULL) { 8366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mSignalConsumer = false; 8376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mMutex.unlock(); 8396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGV("%s: Signaling consumer", __FUNCTION__); 8407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->notify_request_queue_not_empty(mHal2Device); 8416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mMutex.lock(); 8426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 8436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 844f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 845f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 846f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Device::MetadataQueue::freeBuffers( 847f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala List<camera_metadata_t*>::iterator start, 848f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala List<camera_metadata_t*>::iterator end) 849f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 850852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 851f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala while (start != end) { 852f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala free_camera_metadata(*start); 853f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala start = mStreamSlot.erase(start); 854f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala } 855f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 856f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 857f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 858f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance( 859f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_request_queue_src_ops_t *q) 860f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 861f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q); 862f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return const_cast<MetadataQueue*>(cmq); 863f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 864f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 865f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville TalvalaCamera2Device::MetadataQueue* Camera2Device::MetadataQueue::getInstance( 866f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_frame_queue_dst_ops_t *q) 867f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 868f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const MetadataQueue* cmq = static_cast<const MetadataQueue*>(q); 869f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return const_cast<MetadataQueue*>(cmq); 870f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 871f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 872f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_buffer_count( 873f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_request_queue_src_ops_t *q) 874f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 875f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala MetadataQueue *queue = getInstance(q); 876f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return queue->getBufferCount(); 877f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 878f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 879f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_dequeue( 880f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_request_queue_src_ops_t *q, 881f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t **buffer) 882f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 883f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala MetadataQueue *queue = getInstance(q); 884f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return queue->dequeue(buffer, true); 885f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 886f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 887f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::consumer_free( 888f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_request_queue_src_ops_t *q, 889f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *old_buffer) 890f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 891852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 892f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala MetadataQueue *queue = getInstance(q); 893ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin (void)queue; 894f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala free_camera_metadata(old_buffer); 895f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 896f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 897f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 898f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_dequeue( 899ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin const camera2_frame_queue_dst_ops_t * /*q*/, 900f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala size_t entries, size_t bytes, 901f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t **buffer) 902f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 903852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 904f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *new_buffer = 905f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala allocate_camera_metadata(entries, bytes); 906f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala if (new_buffer == NULL) return NO_MEMORY; 907f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala *buffer = new_buffer; 908f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 909f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 910f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 911f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_cancel( 912ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin const camera2_frame_queue_dst_ops_t * /*q*/, 913f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *old_buffer) 914f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 915852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 916f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala free_camera_metadata(old_buffer); 917f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return OK; 918f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 919f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 920f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaint Camera2Device::MetadataQueue::producer_enqueue( 921f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala const camera2_frame_queue_dst_ops_t *q, 922f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala camera_metadata_t *filled_buffer) 923f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 924f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala MetadataQueue *queue = getInstance(q); 925f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala return queue->enqueue(filled_buffer); 926f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala} 927f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 9286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala/** 9296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala * Camera2Device::StreamAdapter 9306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala */ 9316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#ifndef container_of 9336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#define container_of(ptr, type, member) \ 9346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala (type *)((char*)(ptr) - offsetof(type, member)) 9356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala#endif 9366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaCamera2Device::StreamAdapter::StreamAdapter(camera2_device_t *d): 9389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState(RELEASED), 9397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal2Device(d), 9406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mId(-1), 9413297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mWidth(0), mHeight(0), mFormat(0), mSize(0), mUsage(0), 9423297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mMaxProducerBuffers(0), mMaxConsumerBuffers(0), 9433297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers(0), 9443297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFormatRequested(0), 9453297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mActiveBuffers(0), 9463297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFrameCount(0), 9473297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mLastTimestamp(0) 9486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala{ 9496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera2_stream_ops::dequeue_buffer = dequeue_buffer; 9506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera2_stream_ops::enqueue_buffer = enqueue_buffer; 9516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera2_stream_ops::cancel_buffer = cancel_buffer; 9526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala camera2_stream_ops::set_crop = set_crop; 9536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 9546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaCamera2Device::StreamAdapter::~StreamAdapter() { 956852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 9579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mState != RELEASED) { 9589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala release(); 9599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala } 9606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 9616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 962d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Device::StreamAdapter::connectToDevice( 963d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala sp<ANativeWindow> consumer, 964d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t width, uint32_t height, int format, size_t size) { 965852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 9666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 9679e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 9686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala if (mState != RELEASED) return INVALID_OPERATION; 9706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (consumer == NULL) { 9716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Null consumer passed to stream adapter", __FUNCTION__); 9726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return BAD_VALUE; 9736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 9746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: New stream parameters %d x %d, format 0x%x, size %d", 9769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala __FUNCTION__, width, height, format, size); 9779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 9786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mConsumerInterface = consumer; 9796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mWidth = width; 9806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mHeight = height; 981d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mSize = (format == HAL_PIXEL_FORMAT_BLOB) ? size : 0; 9826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mFormatRequested = format; 9836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala // Allocate device-side stream interface 9856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala uint32_t id; 9876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala uint32_t formatActual; 9886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala uint32_t usage; 9896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala uint32_t maxBuffers = 2; 9907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->allocate_stream(mHal2Device, 9916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mWidth, mHeight, mFormatRequested, getStreamOps(), 9926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &id, &formatActual, &usage, &maxBuffers); 9936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 9946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Device stream allocation failed: %s (%d)", 9956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, strerror(-res), res); 9966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 9976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 9986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 9999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Allocated stream id %d, actual format 0x%x, " 10009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala "usage 0x%x, producer wants %d buffers", __FUNCTION__, 10019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala id, formatActual, usage, maxBuffers); 10029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 10036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mId = id; 10046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mFormat = formatActual; 10056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mUsage = usage; 10066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mMaxProducerBuffers = maxBuffers; 10076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = ALLOCATED; 10096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala // Configure consumer-side ANativeWindow interface 10116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = native_window_api_connect(mConsumerInterface.get(), 10126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala NATIVE_WINDOW_API_CAMERA); 10136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 10146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to connect to native window for stream %d", 10156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 10166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 10186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 10196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = CONNECTED; 10216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = native_window_set_usage(mConsumerInterface.get(), mUsage); 10236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 10246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to configure usage %08x for stream %d", 10256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mUsage, mId); 10266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 10276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 10286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 1029bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala res = native_window_set_scaling_mode(mConsumerInterface.get(), 1030bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 1031bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala if (res != OK) { 1032bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala ALOGE("%s: Unable to configure stream scaling: %s (%d)", 1033bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 1034bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala return res; 1035bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala } 1036bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala 1037c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala res = setTransform(0); 1038bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala if (res != OK) { 1039bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala return res; 1040bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala } 1041bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala 1042d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (mFormat == HAL_PIXEL_FORMAT_BLOB) { 1043d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = native_window_set_buffers_geometry(mConsumerInterface.get(), 1044d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mSize, 1, mFormat); 1045d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 1046d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Unable to configure compressed stream buffer geometry" 1047d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala " %d x %d, size %d for stream %d", 1048d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mWidth, mHeight, mSize, mId); 1049d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 1050d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 1051d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } else { 1052d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala res = native_window_set_buffers_geometry(mConsumerInterface.get(), 1053d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala mWidth, mHeight, mFormat); 1054d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala if (res != OK) { 1055d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala ALOGE("%s: Unable to configure stream buffer geometry" 1056d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala " %d x %d, format 0x%x for stream %d", 1057d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala __FUNCTION__, mWidth, mHeight, mFormat, mId); 1058d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala return res; 1059d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala } 10606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 10616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int maxConsumerBuffers; 10636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mConsumerInterface->query(mConsumerInterface.get(), 10646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &maxConsumerBuffers); 10656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 10666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to query consumer undequeued" 10676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala " buffer count for stream %d", __FUNCTION__, mId); 10686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 10696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 10706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mMaxConsumerBuffers = maxConsumerBuffers; 10716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Consumer wants %d buffers", __FUNCTION__, 10739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mMaxConsumerBuffers); 10746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10753297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers = mMaxConsumerBuffers + mMaxProducerBuffers; 10763297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mActiveBuffers = 0; 10773297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFrameCount = 0; 10783297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mLastTimestamp = 0; 10796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = native_window_set_buffer_count(mConsumerInterface.get(), 10813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers); 10826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 10836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to set buffer count for stream %d", 10846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 10856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 10866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 10876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 10886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala // Register allocated buffers with HAL device 10893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala buffer_handle_t *buffers = new buffer_handle_t[mTotalBuffers]; 10903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala ANativeWindowBuffer **anwBuffers = new ANativeWindowBuffer*[mTotalBuffers]; 10913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala uint32_t bufferIdx = 0; 10923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (; bufferIdx < mTotalBuffers; bufferIdx++) { 10931e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis res = native_window_dequeue_buffer_and_wait(mConsumerInterface.get(), 10946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala &anwBuffers[bufferIdx]); 10956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 10969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGE("%s: Unable to dequeue buffer %d for initial registration for " 10976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala "stream %d", __FUNCTION__, bufferIdx, mId); 10986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala goto cleanUpBuffers; 10996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 11006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 11016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffers[bufferIdx] = anwBuffers[bufferIdx]->handle; 110269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Buffer %p allocated", __FUNCTION__, (void*)buffers[bufferIdx]); 11036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 11046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 1105750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGV("%s: Registering %d buffers with camera HAL", __FUNCTION__, mTotalBuffers); 11067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->register_stream_buffers(mHal2Device, 11076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mId, 11083297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers, 11096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffers); 11106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 11116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to register buffers with HAL device for stream %d", 11126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 11136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } else { 11146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mState = ACTIVE; 11156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 11166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 11176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalacleanUpBuffers: 1118750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGV("%s: Cleaning up %d buffers", __FUNCTION__, bufferIdx); 11193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala for (uint32_t i = 0; i < bufferIdx; i++) { 11206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = mConsumerInterface->cancelBuffer(mConsumerInterface.get(), 11211e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis anwBuffers[i], -1); 11226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 11236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to cancel buffer %d after registration", 11246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, i); 11256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 11266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 11273297daae9681004775012faba9181d65e097e00cEino-Ville Talvala delete[] anwBuffers; 11283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala delete[] buffers; 11296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 11306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 11316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 11326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 11339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalastatus_t Camera2Device::StreamAdapter::release() { 1134852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 11356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t res; 11369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala ALOGV("%s: Releasing stream %d", __FUNCTION__, mId); 11376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mState >= ALLOCATED) { 11387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->release_stream(mHal2Device, mId); 11396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (res != OK) { 11406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Unable to release stream %d", 11416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala __FUNCTION__, mId); 11426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 11436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 11446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 11456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (mState >= CONNECTED) { 11466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala res = native_window_api_disconnect(mConsumerInterface.get(), 11476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala NATIVE_WINDOW_API_CAMERA); 1148a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin 1149a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin /* this is not an error. if client calling process dies, 1150a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin the window will also die and all calls to it will return 1151a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin DEAD_OBJECT, thus it's already "disconnected" */ 1152a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin if (res == DEAD_OBJECT) { 1153a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin ALOGW("%s: While disconnecting stream %d from native window, the" 1154a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin " native window died from under us", __FUNCTION__, mId); 1155a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin } 1156a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin else if (res != OK) { 1157a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin ALOGE("%s: Unable to disconnect stream %d from native window (error %d %s)", 1158a1e5dccf73c0b734204b0094241e4a6a0752a67eIgor Murashkin __FUNCTION__, mId, res, strerror(-res)); 11596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 11606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 11616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 11626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala mId = -1; 11639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mState = RELEASED; 11646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return OK; 11656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 11666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 1167c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalastatus_t Camera2Device::StreamAdapter::setTransform(int transform) { 1168852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 1169c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala status_t res; 1170c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (mState < CONNECTED) { 1171c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Cannot set transform on unconnected stream", __FUNCTION__); 1172c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return INVALID_OPERATION; 1173c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1174c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala res = native_window_set_buffers_transform(mConsumerInterface.get(), 1175c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala transform); 1176c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala if (res != OK) { 1177c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala ALOGE("%s: Unable to configure stream transform to %x: %s (%d)", 1178c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala __FUNCTION__, transform, strerror(-res), res); 1179c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala } 1180c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala return res; 1181c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala} 1182c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 11833297daae9681004775012faba9181d65e097e00cEino-Ville Talvalastatus_t Camera2Device::StreamAdapter::dump(int fd, 1184ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin const Vector<String16>& /*args*/) { 1185852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 11863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala String8 result = String8::format(" Stream %d: %d x %d, format 0x%x\n", 11873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mId, mWidth, mHeight, mFormat); 11883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" size %d, usage 0x%x, requested format 0x%x\n", 11893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mSize, mUsage, mFormatRequested); 11903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" total buffers: %d, dequeued buffers: %d\n", 11913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mTotalBuffers, mActiveBuffers); 11923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala result.appendFormat(" frame count: %d, last timestamp %lld\n", 11933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala mFrameCount, mLastTimestamp); 11943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala write(fd, result.string(), result.size()); 11953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala return OK; 11963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala} 11973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 11986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaconst camera2_stream_ops *Camera2Device::StreamAdapter::getStreamOps() { 11996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return static_cast<camera2_stream_ops *>(this); 12006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 12016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 12026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville TalvalaANativeWindow* Camera2Device::StreamAdapter::toANW( 12036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala const camera2_stream_ops_t *w) { 12046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return static_cast<const StreamAdapter*>(w)->mConsumerInterface.get(); 12056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 12066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 12076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::dequeue_buffer(const camera2_stream_ops_t *w, 12086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffer_handle_t** buffer) { 1209852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 12106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int res; 12113297daae9681004775012faba9181d65e097e00cEino-Ville Talvala StreamAdapter* stream = 12123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w)); 12133297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (stream->mState != ACTIVE) { 12143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState); 12156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return INVALID_OPERATION; 12166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 12176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 12186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindow *a = toANW(w); 12196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindowBuffer* anb; 12201e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis res = native_window_dequeue_buffer_and_wait(a, &anb); 1221750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala if (res != OK) { 1222750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGE("Stream %d dequeue: Error from native_window: %s (%d)", stream->mId, 1223750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala strerror(-res), res); 1224750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala return res; 1225750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala } 12266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 12276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala *buffer = &(anb->handle); 12283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala stream->mActiveBuffers++; 12293297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 1230750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGVV("Stream %d dequeue: Buffer %p dequeued", stream->mId, (void*)(**buffer)); 12316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return res; 12326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 12336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 12346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::enqueue_buffer(const camera2_stream_ops_t* w, 12356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int64_t timestamp, 12366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffer_handle_t* buffer) { 1237852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 12383297daae9681004775012faba9181d65e097e00cEino-Ville Talvala StreamAdapter *stream = 12393297daae9681004775012faba9181d65e097e00cEino-Ville Talvala const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w)); 1240228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala stream->mFrameCount++; 1241228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ALOGVV("Stream %d enqueue: Frame %d (%p) captured at %lld ns", 1242a289bf696e4b49e0a726fd07914f9dc178653efcJames Dong stream->mId, stream->mFrameCount, (void*)(*buffer), timestamp); 1243bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala int state = stream->mState; 12446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (state != ACTIVE) { 12456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 12466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return INVALID_OPERATION; 12476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 12486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindow *a = toANW(w); 12496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t err; 1250228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 12516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala err = native_window_set_buffers_timestamp(a, timestamp); 1252bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala if (err != OK) { 1253bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala ALOGE("%s: Error setting timestamp on native window: %s (%d)", 1254bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala __FUNCTION__, strerror(-err), err); 1255bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala return err; 1256bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala } 1257bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala err = a->queueBuffer(a, 12581e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis container_of(buffer, ANativeWindowBuffer, handle), -1); 1259bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala if (err != OK) { 1260bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala ALOGE("%s: Error queueing buffer to native window: %s (%d)", 1261bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala __FUNCTION__, strerror(-err), err); 126231d377b7622279034326fbd8b9803a738a39fb30James Dong return err; 1263bd4976a1651d5973836454f8a56871226ec000b5Eino-Ville Talvala } 126431d377b7622279034326fbd8b9803a738a39fb30James Dong 12653297daae9681004775012faba9181d65e097e00cEino-Ville Talvala stream->mActiveBuffers--; 12663297daae9681004775012faba9181d65e097e00cEino-Ville Talvala stream->mLastTimestamp = timestamp; 126731d377b7622279034326fbd8b9803a738a39fb30James Dong return OK; 12686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 12696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 12706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::cancel_buffer(const camera2_stream_ops_t* w, 12716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala buffer_handle_t* buffer) { 1272852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 12733297daae9681004775012faba9181d65e097e00cEino-Ville Talvala StreamAdapter *stream = 12743297daae9681004775012faba9181d65e097e00cEino-Ville Talvala const_cast<StreamAdapter*>(static_cast<const StreamAdapter*>(w)); 1275750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala ALOGVV("Stream %d cancel: Buffer %p", 1276750d74b0b64470dccdb7310bf33e0d0e582f2059Eino-Ville Talvala stream->mId, (void*)(*buffer)); 12773297daae9681004775012faba9181d65e097e00cEino-Ville Talvala if (stream->mState != ACTIVE) { 12783297daae9681004775012faba9181d65e097e00cEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState); 12796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return INVALID_OPERATION; 12806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 128131d377b7622279034326fbd8b9803a738a39fb30James Dong 12826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindow *a = toANW(w); 128331d377b7622279034326fbd8b9803a738a39fb30James Dong int err = a->cancelBuffer(a, 12841e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis container_of(buffer, ANativeWindowBuffer, handle), -1); 128531d377b7622279034326fbd8b9803a738a39fb30James Dong if (err != OK) { 128631d377b7622279034326fbd8b9803a738a39fb30James Dong ALOGE("%s: Error canceling buffer to native window: %s (%d)", 128731d377b7622279034326fbd8b9803a738a39fb30James Dong __FUNCTION__, strerror(-err), err); 128831d377b7622279034326fbd8b9803a738a39fb30James Dong return err; 128931d377b7622279034326fbd8b9803a738a39fb30James Dong } 129031d377b7622279034326fbd8b9803a738a39fb30James Dong 129131d377b7622279034326fbd8b9803a738a39fb30James Dong stream->mActiveBuffers--; 129231d377b7622279034326fbd8b9803a738a39fb30James Dong return OK; 12936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 12946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 12956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalaint Camera2Device::StreamAdapter::set_crop(const camera2_stream_ops_t* w, 12966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int left, int top, int right, int bottom) { 1297852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 12986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int state = static_cast<const StreamAdapter*>(w)->mState; 12996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala if (state != ACTIVE) { 13006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 13016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return INVALID_OPERATION; 13026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala } 13036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala ANativeWindow *a = toANW(w); 13046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala android_native_rect_t crop = { left, top, right, bottom }; 13056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala return native_window_set_crop(a, &crop); 13066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala} 13076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 130869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** 130969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Camera2Device::ReprocessStreamAdapter 131069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala */ 131169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 131269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#ifndef container_of 131369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#define container_of(ptr, type, member) \ 131469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala (type *)((char*)(ptr) - offsetof(type, member)) 131569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#endif 131669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 131769230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCamera2Device::ReprocessStreamAdapter::ReprocessStreamAdapter(camera2_device_t *d): 131869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mState(RELEASED), 13197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala mHal2Device(d), 132069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mId(-1), 132169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mWidth(0), mHeight(0), mFormat(0), 132269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mActiveBuffers(0), 132369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mFrameCount(0) 132469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala{ 1325852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 132669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala camera2_stream_in_ops::acquire_buffer = acquire_buffer; 132769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala camera2_stream_in_ops::release_buffer = release_buffer; 132869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 132969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 133069230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCamera2Device::ReprocessStreamAdapter::~ReprocessStreamAdapter() { 1331852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 133269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mState != RELEASED) { 133369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala release(); 133469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 133569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 133669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 133769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::ReprocessStreamAdapter::connectToDevice( 133869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala const sp<StreamAdapter> &outputStream) { 1339852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 134069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 134169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: E", __FUNCTION__); 134269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 134369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mState != RELEASED) return INVALID_OPERATION; 134469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (outputStream == NULL) { 134569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Null base stream passed to reprocess stream adapter", 134669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__); 134769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return BAD_VALUE; 134869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 134969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 135069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mBaseStream = outputStream; 135169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mWidth = outputStream->getWidth(); 135269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mHeight = outputStream->getHeight(); 135369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mFormat = outputStream->getFormat(); 135469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 135569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: New reprocess stream parameters %d x %d, format 0x%x", 135669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, mWidth, mHeight, mFormat); 135769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 135869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // Allocate device-side stream interface 135969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 136069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala uint32_t id; 13617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->allocate_reprocess_stream_from_stream(mHal2Device, 136269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStream->getId(), getStreamOps(), 136369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &id); 136469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 136569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Device reprocess stream allocation failed: %s (%d)", 136669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 136769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 136869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 136969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 137069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Allocated reprocess stream id %d based on stream %d", 137169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, id, outputStream->getId()); 137269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 137369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mId = id; 137469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 137569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mState = ACTIVE; 137669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 137769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 137869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 137969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 138069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::ReprocessStreamAdapter::release() { 1381852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 138269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 138369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Releasing stream %d", __FUNCTION__, mId); 138469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mState >= ACTIVE) { 13857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala res = mHal2Device->ops->release_reprocess_stream(mHal2Device, mId); 138669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 138769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Unable to release stream %d", 138869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, mId); 138969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 139069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 139169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 139269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 139369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala List<QueueEntry>::iterator s; 139469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala for (s = mQueue.begin(); s != mQueue.end(); s++) { 139569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<BufferReleasedListener> listener = s->releaseListener.promote(); 139669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (listener != 0) listener->onBufferReleased(s->handle); 139769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 139869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala for (s = mInFlightQueue.begin(); s != mInFlightQueue.end(); s++) { 139969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<BufferReleasedListener> listener = s->releaseListener.promote(); 140069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (listener != 0) listener->onBufferReleased(s->handle); 140169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 140269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mQueue.clear(); 140369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mInFlightQueue.clear(); 140469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 140569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mState = RELEASED; 140669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 140769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 140869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 140969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::ReprocessStreamAdapter::pushIntoStream( 141069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala buffer_handle_t *handle, const wp<BufferReleasedListener> &releaseListener) { 1411852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 141269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // TODO: Some error checking here would be nice 141369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Pushing buffer %p to stream", __FUNCTION__, (void*)(*handle)); 141469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 141569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala QueueEntry entry; 141669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala entry.handle = handle; 141769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala entry.releaseListener = releaseListener; 141869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mQueue.push_back(entry); 141969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 142069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 142169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 142269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Camera2Device::ReprocessStreamAdapter::dump(int fd, 1423ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin const Vector<String16>& /*args*/) { 1424852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 142569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala String8 result = 142669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala String8::format(" Reprocess stream %d: %d x %d, fmt 0x%x\n", 142769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mId, mWidth, mHeight, mFormat); 142869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result.appendFormat(" acquired buffers: %d\n", 142969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mActiveBuffers); 143069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result.appendFormat(" frame count: %d\n", 143169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mFrameCount); 143269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 143369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 143469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 143569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 143669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst camera2_stream_in_ops *Camera2Device::ReprocessStreamAdapter::getStreamOps() { 143769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return static_cast<camera2_stream_in_ops *>(this); 143869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 143969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 144069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Device::ReprocessStreamAdapter::acquire_buffer( 144169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala const camera2_stream_in_ops_t *w, 144269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala buffer_handle_t** buffer) { 1443852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 1444ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin 144569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ReprocessStreamAdapter* stream = 144669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala const_cast<ReprocessStreamAdapter*>( 144769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala static_cast<const ReprocessStreamAdapter*>(w)); 144869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (stream->mState != ACTIVE) { 144969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, stream->mState); 145069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return INVALID_OPERATION; 145169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 145269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 145369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (stream->mQueue.empty()) { 145469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala *buffer = NULL; 145569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 145669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 145769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 145869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala QueueEntry &entry = *(stream->mQueue.begin()); 145969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 146069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala *buffer = entry.handle; 146169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 146269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala stream->mInFlightQueue.push_back(entry); 146369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala stream->mQueue.erase(stream->mQueue.begin()); 146469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 146569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala stream->mActiveBuffers++; 146669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 146769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("Stream %d acquire: Buffer %p acquired", stream->mId, 146869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala (void*)(**buffer)); 146969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 147069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 147169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 147269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Device::ReprocessStreamAdapter::release_buffer( 147369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala const camera2_stream_in_ops_t* w, 147469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala buffer_handle_t* buffer) { 1475852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala ATRACE_CALL(); 147669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ReprocessStreamAdapter *stream = 147769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala const_cast<ReprocessStreamAdapter*>( 147869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala static_cast<const ReprocessStreamAdapter*>(w) ); 147969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala stream->mFrameCount++; 148069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("Reprocess stream %d release: Frame %d (%p)", 148169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala stream->mId, stream->mFrameCount, (void*)*buffer); 148269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala int state = stream->mState; 148369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (state != ACTIVE) { 148469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Called when in bad state: %d", __FUNCTION__, state); 148569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return INVALID_OPERATION; 148669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 148769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala stream->mActiveBuffers--; 148869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 148969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala List<QueueEntry>::iterator s; 149069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala for (s = stream->mInFlightQueue.begin(); s != stream->mInFlightQueue.end(); s++) { 149169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if ( s->handle == buffer ) break; 149269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 149369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (s == stream->mInFlightQueue.end()) { 149469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Can't find buffer %p in in-flight list!", __FUNCTION__, 149569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala buffer); 149669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return INVALID_OPERATION; 149769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 149869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 149969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<BufferReleasedListener> listener = s->releaseListener.promote(); 150069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (listener != 0) { 150169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala listener->onBufferReleased(s->handle); 150269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 150369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Can't free buffer - missing listener", __FUNCTION__); 150469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 150569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala stream->mInFlightQueue.erase(s); 150669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 150769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 150869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 150961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 151061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}; // namespace android 1511